让我们一起动起来 之 Media SDK用户定制功能执行篇

作者: Yanqing Wang (Intel) (108 篇文章) 日期: 六月 11, 2010 在 5:06 下午

Media SDK用户定制功能提交篇中,用户任务根据I/O有效性将其提交入Media SDK执行队列。本篇文章主要讨论用户任务是如何在Media SDK中执行的。

Media SDK提供了两个函数来处理用户任务的执行:
mfxStatus (*Execute)(mfxHDL pthis, mfxThreadTask task, mfxU32 uid_p, mfxU32 uid_a);
mfxStatus (*FreeResources)(mfxHDL pthis, mfxThreadTask task, mfxStatus sts);

Execute()根据任务标识号执行用户任务,而FreeResources()将会在执行完用户任务后做相关的清理操作。

可能有人会问,如果我在执行前或者执行时调用FreeResources(),那么结果会如何呢?
Media SDK提供了强壮的处理机制,如果在未完成用户任务的时候调用FreeResources()就是等同于一个取消操作。因为用户程序可以根据自己的情况做出相应的动作而无需考虑Media SDK是否能够处理这种操作。

为了提高用户任务的性能,Media SDK尽量将其并行化处理,以便提高任务的性能;但从软件优化角度来看,应用尽量应该通过自己的具体情况,手动将一件事情分成若干个任务,再通过Submit将其加入执行队列。比如说,可以将一个帧分成若干个slice,对每个slice的具体操作可以放入不同用户任务中去处理,以便提高效率。因为对于多个任务,Media SDK能够根据自身有用的线程池进行并行处理(对于线程池支持的线程数取决于系统的核数和plugin支持的最大线程数)。

在执行Execute(),Meida SDK会根据不同的返回值进行相应的处理:
1.如果MFX_TASK_DONE返回,表示用户任务成功被执行。Media SDK会很高兴的通知用户,OK,恭喜你啦!
2.如果MFX_TASK_WORKING或者是MFX_TASK_BUSY。Media SDK是一个固执的执行者,它会在相关资源就绪后再次尝试。呵呵,不错,喜欢这种锲而不舍的精神!
3.其他返回值。Meida SDK会摇摇头,叹口气,“兄弟,我尽力了!”,然后将相关的错误信息返回给用户。对于错误处理中的取舍,完全取决于上层应用的强壮逻辑了。

用户模块的提交一个异步过程,它的执行过程也遵守这种条约。对于何时执行,如何执行取决于:
1.Media SDK当前的资源情况
2.帧数据是否已经准备就绪
3.用户是否强壮同步执行

如果帧之间有前后的依赖性,同步操作是推荐的,这样能够保证在后面编解码所需要的信息能够在处理时候已经就绪。对于日常的应用而言,可以考虑创建Surface池,再耗尽所以Surface单元的时候,再进行一次同步。如果在良好的状态下,这次同步可能是不需要的,因为在若干次提交Surface后,最前面的Surface已经处理完毕,这样就能够保证Surface池不会空,同步操作也就相应消亡了。

【小结】
- 用户任务的执行是Media SDK自动控制的,用户可以通过同步操作确保任务完成。
- 用户任务的取消可以随时进行,Media SDK有足够的机制保证执行的准确性。不过有一个前提,就是用户任务还未完成,否则只有错误代码会返回(结果已经输出了)。

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

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

 评论 (0)

 引用 (5)


 写评论  

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

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

您的 URL (可选)


评论*