共 1,304 篇文章
共 6,317 篇文章及评论
- Association for Computing Machinery TechNews (ACM)
- Go Parallel! (Dr. Dobbs)
- HPCwire (Tabor Communications, Inc.)
- insideHPC (John West)
- Joe Duffy's Weblog (Microsoft)
- Microsoft Parallel Programming Development Center (Microsoft Germany)
- MultiCoreInfo.com
- scalability.org (Scalable Informatics)
- Software Dev Blog (Intel Germany)
- Soft Talk Blog (Intel United Kingdom)
- The Moth (Microsoft)
提高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日 16:56
TvUbby |
楼上的,你这么做,有什么实际意义?! |
| 2010年01月16日 18:33
YuanJia |
给个API手册下载地址吧! |
| 2010年01月18日 04:15
NewsMap |
如果能用硬件加速就应该用硬件,何必要交叉使用呢! 个人感觉没有实用价值。 |
| 2010年01月18日 21:49
Yanqing Wang (Intel)
|
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)
|
对于为什么不建议使用硬件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)
- 英特尔® 软件网络博客 - 中文 » 提高Media SDK效率之内存选择篇
2010年01月21日 04:52 - 英特尔® 软件网络博客 - 中文 » 提高Media SDK效率之多线程篇
2010年01月28日 00:16 - Media SDK硬件编解码器共享之说 – 英特尔® 软件网络博客 - 中文
2010年07月08日 20:31 - Media SDK2.0揭秘 之 计算Video Surface – 英特尔® 软件网络博客 - 中文
2010年08月16日 01:34 - Media SDK2.0 Beta揭秘 之 计算Video Surface篇 – 英特尔® 软件网络博客 - 中文
2010年08月17日 02:45



pearlboy