提高Media SDK效率之初始化设置篇

作者: Yanqing Wang (Intel) (99 篇文章) 日期: 一月 15, 2010 在 12:48 下午

Media SDK支持VC1,H264和MPEG2格式在Intel显卡平台的硬件加速,并提供相应的软件编解码实现。提供软件实现的意义在于,即使在非Intel显卡支持的平台上,采用Media SDK实现的应用程序也能够正确的实现编解码功能,唯一的差别仅在于速度问题。在日益强大的Intel CPU下,这种差别也变得越来越小。从Clarkdale和Arrandale的测试结果来看,Media SDK的软件实现比市场上主流的编解码软件仅差~20%,如果使用一定的软件高级开发技巧,那么它可以控制在10%左右。本篇文章以此为基础,讨论如何在初始化时,采用适当的软件配置提高软件的效率和可维护性。

在讨论优化之前,首先要了解一下Media SDK是如何初始化编解码器的。
1. 创建和初始化一个编解码Session。Media SDK提供了mfxStatus MFXInit(mfxIMPL impl, mfxVersion *ver, mfxSession *session)函数来完成这个创建和初始化工作。
2. 使用已创建的Session来创建它的解码器。Media SDK提供了mfxStatus MFXVideoDECODE_Init(mfxSession session, mfxVideoParam *par)来完成解码器的创建和初始化工作。
3. 使用已创建的Session来创建它的编码器。Media SDK提供了mfxStatus MFXVideoENCODE_Init(mfxSession session, mfxVideoParam *par)来完成编码器的创建和初始化工作。

在创建和初始化编解码Session时,我们需要制定编解码的实现方式(硬件方式还是软件方式)。最简单的方法是强制使用硬件方式。这会带来一个问题,在非Intel显卡支持平台,应用程序将无法正常工作。当然,如果强制使用软件方式,虽然应用程序能够工作于其他平台,但是在Intel显卡平台,硬件加速特性将荡然无存!可能网友会说,应用程序可以外加代码检测平台显卡来决定如何选择。非常赞同,但是程序的复杂度和效率将受到影响。幸运的是,Media SDK提供了一种自动选择功能,它会根据当前运行系统优化选择方案。在MFXInit函数中,枚举类型mfxIMPL定义AUTO功能:
typedef enum {
MFX_IMPL_AUTO=0, /* Auto Selection/In or Not Supported/Out */
MFX_IMPL_SOFTWARE, /* Pure Software Implementation */
MFX_IMPL_HARDWARE, /* Hardware Accelerated Implementation */
MFX_IMPL_UNSUPPORTED=0 /* One of the MFXQueryIMPL returns */
} mfxIMPL;
相应的简单实用方式如下:
mfxVersion version = {MFX_VERSION_MINOR, MFX_VERSION_MAJOR};
sts = m_mfxSession.Init(MFX_IMPL_AUTO, &version);
仅仅通过MFX_IMPL_AUTO的设置,问题迎刃而解。可能有网友会问,那么如何知道当前的编解码实用方法呢?不急,Media SDK考虑到了这种需求,它提供了mfxStatus MFXQueryIMPL(mfxSession session, mfxIMPL *impl)来查询当前采用的方法。

在优化编码器初始化时,程序必须注意mfxInfoMFX结构中TargetUsage变量的选择,它的定义如下:
typedef struct {
mfxU32 reserved[8];

mfxFrameInfo FrameInfo;
mfxU32 CodecId;
mfxU16 CodecProfile;
mfxU16 CodecLevel;
mfxU16 NumThread;

union {
/* ENCODE */
struct {
mfxU16 TargetUsage;

mfxU16 GopPicSize;
mfxU16 GopRefDist;
mfxU16 GopOptFlag;
mfxU16 IdrInterval;

mfxU16 RateControlMethod;
mfxU16 InitialDelayInKB;
mfxU16 BufferSizeInKB;
mfxU16 TargetKbps;
mfxU16 MaxKbps;

mfxU16 NumSlice;
mfxU16 NumRefFrame;
mfxU16 EncodedOrder;
};
struct { /* DECODE */
mfxU16 DecodedOrder;
mfxU16 reserved2[12];
};
};
} mfxInfoMFX;

/* TargetUsages: 1~7; */
enum {
MFX_TARGETUSAGE_UNKNOWN =0,
MFX_TARGETUSAGE_BEST_QUALITY =1,
MFX_TARGETUSAGE_BALANCED =4,
MFX_TARGETUSAGE_BEST_SPEED =7
};

TargetUsage值的选择决定了编码的性能和图像质量,它的值从0~7,值越高效率也越高,但图像质量会下降。最佳值应该和用户选择要求挂钩,原则上是略比最小用户需求高1级.

【小结】
1. 初始化Session时,要使用MFX_IMPL_AUTO。它有利于跨越硬件平台,并提高编解码效率。
2. TargetUsage的选择应该和用户需求相结合。为了提高性能,选择略高于用户最小需求的值为佳。

分类: 图形和视觉计算, 并行计算, 英特尔® 软件网络 2.0

如需了解英特尔软件产品相关的性能和优化选项,请参阅优化注意事项.

 评论 (8)

2010年01月15日 06:48


pearlboy
使用同一个Session,能否创建一个是硬件编码器,一个是软件解码器?
2010年01月15日 16:56


TvUbby
楼上的,你这么做,有什么实际意义?!
2010年01月16日 18:33


YuanJia
给个API手册下载地址吧!
2010年01月18日 04:15


NewsMap
如果能用硬件加速就应该用硬件,何必要交叉使用呢!
个人感觉没有实用价值。
2010年01月18日 21:49

Yanqing Wang (Intel)
Yanqing Wang (Intel)总分:
10,053
黑带
WOW,你的这个提法比较新颖,我的理解如下:
1)如果要创建一个硬件解码器和一个软件编码器
如果我们使用G45平台,因为它仅仅提供硬件解码加速,所以在使用AUTO或者是HARDWARE选项的时候,它就是创建一个硬件解码器, 一个软件编码器,符合你的要求。否则请参考第二条说明。

2)如果创建一个软件编码器和一个硬件编码器
假设平台支持硬件编解码器,那么在一个Session下,当前的Media SDK版本是无法支持支持的,只能采用两个Seesion来分别创建。它有很多的副作用,比如说效率问题,同步问题等,这些问题讲在我后继 的文章中逐一介绍。

总结:
1. 尽量使用硬件加速选项,除非当前平台不支持。
2. 尽量使用同一个Session创建编解码器(具体原因将在后继文章中介绍,这个卖个关子,请关注:-))。
2010年01月19日 07:18


pearlboy
Cool! 学习学习,博主牛啊!
2010年01月21日 04:55

Yanqing Wang (Intel)
Yanqing Wang (Intel)总分:
10,053
黑带
对于为什么不建议使用硬件decoder,软件encoder的其中一个原因,请参考
http://software.intel.com/zh-cn/blogs/2010/01/21/media-sdk-4/

反之亦然
2011年10月19日 04:46


wei1030
楼主,请问我使用sdk v1.5, 想在sample_decode中用硬件加速,命令行给了-hw,可是每次总是在MFXInit()返回失败,期待您的回答,多谢了,我的 系统是intel HD graphic, i3的集成显卡

 引用 (5)


 写评论  

欲获得技术支持,请访问软件支持页面.
姓名 (必填)*

电子邮件 (必填,不在本页面显示)*

您的 URL (可选)


评论*