北京澳佳腐植酸肥价格:【原创】openmax调用时序(翻译)

来源:百度文库 编辑:中财网 时间:2024/04/30 06:58:44

【原创】openmax调用时序(翻译)  

2010-05-29 16:54:20|  分类: OpenMAX |  标签: |字号大中小 订阅

英语原文参见/external/opencore/doc/openmax_call_sequences.pdf

版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处 、作者信息和本声明。否则将追究法律责任。http://jianhuazhang2008.blog.163.com/

目录

1引言... 3

2 总的调用时序图... 3

3 OpenCoreOMX core/组件交互... 3

3.1 OMX核心初始化... 3

3.2 OMX组件实例、功能及端口索引... 4

3.3 OMX组件输入输出缓冲协商... 7

3.4 OMX状态变换 Loaded->Idle. 8

3.5转换到“Executing”状态与数据交换... 9

3.6 暂停... 10

3.7端口刷新(如果可用)... 11

3.8停止/变换到“IDLE”状态... 12

3.9 OMX组件从IDLE->Loaded State转换并De-initialization. 13

3.10 OMX Core 卸载... 14

1引言

有多种方法将编解码器整合到PV OpenCore多媒体框架中,包括压缩的媒体I/O组件作为一个节点或OpenMAX组件被整合为OpenMAX编解码节点等作为框架的一部分。特别是那些包含硬件加速器的编解码器,直接使用OpenMAX IL接口,使得OpenMAX IL接口在整合时更简单明了。

该文档描述了细节和时序,以便帮助在PV框架和第三方之间符合OpenMAX IL1.1组件(编码器和解码器)。时序图覆盖了PV OpenCore框架与第三方OMX core之间的交互以及OpenCoreOMX组件之间的通信。这包含枚举OMX组件、OMX组件的实例化、设定各种参数、配置组件的输入输出端口、销毁OMX组件等。

整篇文章中,交互使用PV框架和OpenCore

2 总的调用时序图

为了简洁明了,本文中的调用时序图使用一个简单的调用名字,而不再提供整个OMX调用参数列表。对于整个OMX调用参数列表,请参照OpenMAX IL 1.1说明书。

3 OpenCoreOMX core/组件交互

该交互被分成一下几个部分介绍。按照用例中调用的API次序为顺序进行说明。

3.1 OMX核心初始化

当初始化OMX core时依次执行一下步骤:

调用OMX_Init函数

PV框架通过查询他们的名字列举所有OMX组件,直到OMX core返回OMX_ErrorNoMore。对每个组件名,PV框架查询OMX组件支持的格式并对可用组件进行注册,说明它支持的格式。

他们之间的交互如下图1

1: OMX Core 初始化

3.2 OMX组件实例、功能及端口索引

OMX core初始化后,下一步为通常是具体组件实例化并列举组件的功能和端口。PV框架进行:

●调用OMX_GetHandle实例化所需的OMX组件信息(基于先前所需的组件名和角色)。

●用OMX_GetParameter调用带有PV私有索引indexPV_OMX_CAPABILITY_TYPE_INDEX”去获取OMX组件的功能。万一组件不是OpenMax全兼容或者OpenMax的特性不明确,以上获取的功能决定了OMX是否支持输入/输出端口调用“UseBufeer”和“AllocateBuffer”,以及OMX组件是否支持部分帧等等。

注意:如果OMX组件返回“OMX_ErrorUnsupportedIndex”index(或其他比如“OMX_ErrorNone”),PV框架将为组件功能赋默认值。

●调用OMX_GetParameter,针对视频组件再调用“OMX_IndexVideoInit”,针对音频组件则调用“OMX_IndexAudioIni”以获取OMX组件可用的端口号。

●循环查找可用的端口号以便找到输入端口索引(基于组件提供的端口方向)。

●循环查找可用的端口号以便找到输出端口索引(基于组件提供的端口方向)。

该交互如图2(针对video OMX 组件)。

说明:
Index “PV_OMX_CAPABILITY_TYPE_INDEX” is defined as:
#define PV_OMX_COMPONENT_CAPABILITY_TYPE_INDEX 0xFF7A347
The OMX_GetParameter call expects the following structure to be filled for this index:
typedef struct PV_OMXComponentCapabilityFlagsType
{
////////////////// OMX COMPONENT CAPABILITY RELATED MEMBERS
OMX_BOOL iIsOMXComponentMultiThreaded;
OMX_BOOL iOMXComponentSupportsExternalOutputBufferAlloc;
OMX_BOOL iOMXComponentSupportsExternalInputBufferAlloc;
OMX_BOOL iOMXComponentSupportsMovableInputBuffers;
OMX_BOOL iOMXComponentSupportsPartialFrames;
OMX_BOOL iOMXComponentUsesNALStartCode;
OMX_BOOL iOMXComponentCanHandleIncompleteFrames;
OMX_BOOL iOMXComponentUsesFullAVCFrames;
} PV_OMXComponentCapabilityFlagsType;

功能参数的默认值:

iIsOMXComponentMultiThreaded ——默认值OMX_TRUEOMX组件一般运行于独立的线程(与PV框架线程不同),有可能将OMX组件运行在PV框架线程(e.g.,通过同步调用)。

 

iOMXComponentSupportsExternalOutputBufferAlloc ——默认值OMX_TRUE
OMX规范要求OMX组件支持外部分配输出缓冲(就是输出bufferOMX_UseBuffer调用)。如果组件不支持,必须通知PV框架,以便其调用“OMX_AllocateBuffer”代替。

 

iOMXComponentSupportsExternalInputBufferAlloc ——默认值OMX_TRUE
OMX规范要求OMX组件支持外部分配输入缓冲(就是输入缓冲的OMX_UseBuffer调用)。如果组件不支持,必须通知PV框架,以便其调用“OMX_AllocateBuffer”代替。

 

iOMXComponentSupportsMovableInputBuffers ——默认值OMX_TRUE
如果OMX缓冲是外部分配的,为了提高稳定性和优化性能,可以分离OMX缓冲头部信息(OMX_BUFFERHEADERTYPE)与数据区(“pBuffer”)。换句话说,使OMX缓冲更有移动性,当向OMX组件传递一个输入缓冲时,OMX_BUFFERHEADERTYPE “pBuffer”字段和头部信息不一定指向相同的缓冲区。因此,可以在框架中分配更多的数据缓冲进行循环工作,只有在需要把缓冲传递到OMX组件时才附加到头部信息去。如果OMX组件要求头部和数据一直指向相同的缓冲,则iOMXComponentSupportsMovableInputBuffers应该被置为OMX_FALSE

 

iOMXComponentSupportsPartialFrames ——默认值OMX_TRUE
OMX规范要求OMX组件支持将任意数据打包进OMX缓冲,包括单个帧、NAL和被拆分到多个缓冲区的解码单元。PV框架支持“OMX_BUFFERFLAG_ENDOFFRAME”标记,更方便组装部分帧。然而,如果OMX组件不支持组装部分帧,也就是OMX组件要求PV框架来组装部分帧并提供给OMX组件完整的输入帧或NAL,此时需要将标志iOMXComponentSupportsPartialFrames设置为OMX_FALSE
注意:将给标志设置为OMX_FALSE可能会影响性能。

 

iOMXComponentUsesNALStartCode ——默认值OMX_FALSE
这个标志位将影响H264解码。PV框架需要提供所有信息来重建H264 NALs(通过OMX缓冲的大小及OMX_BUFFERFLAG_ENDOFFRAME标志位)。因此没有必要由OMX组件解码输出流来获取0x0001NAL起始代码。如果OMX H264组件及基本的H264解码器仍需要输入流来获取0x0001NAL起始代码,那么可将标志位iOMXComponentUsesNALStartCode置为OMX_TRUE

 

iOMXComponentCanHandleIncompleteFrames ——默认值OMX_TRUE
有可能丢失部分数据流(比如数据包丢失)。假定OMX组件及编解码单元可以解决这个问题。如果OMX组件/编解码不能处理不完整帧时,则需要将标志iOMXComponentCanHandleIncompleteFrames 设置为OMX_FALSE。当“iOMXComponentSupportsPartialFrames”也被设置为OMX_FALSE时,这点相当重要,因为OMX组件不提供组装部分帧,也就是说PV框架必须提供组装好的frame/NALs,因此需要通知OMX组件不完整的帧是否可以传递进来。

 

iOMXComponentUsesFullAVCFrames ——默认值OMX_FALSE
这个标志位决定AVC解码中使用NAL模式还是frame模式。根据能力标志位“iOMXComponentUsesFullAVCFrames”的设定,可以通过上面两种不同模式将AVC数据供给OMX组件。默认为NAL模式(该标志设置为OMX_FALSE),此模式下OpenCore框架可以为OMX输入缓冲同时提供完整或者部分AVC NALFrame模式下(该标志设为OMX_TRUE),OpenCore框架积累AVC NAL,并向OMX组件的输入缓冲提供给一帧完整的数据。
通过使用结构OMX_OTHER_EXTRADATA NAL边界与OMX组件连接。如果标志位iOMXComponentUsesFullAVCFramesiOMXComponentUsesNALStartCodes都被设定为OMX_TRUE,那么通过分析NAL起始码可以推断帧中的NAL边界。此情况下不使用结构OMX_OTHER_EXTRADATA。针对AVC帧模式的详细使用方法及结构OMX_OTHER_EXTRADATA可以参见文档“OMX Core Integration Guide”5.9章节。

2 通过OMX_GetHandle初始化OMX组件

 

3.3 OMX组件输入输出缓冲协商

在交换任何数据之前,需要协商输入输出缓冲参数。为此,PV框架需要做以下工作:

●调用OMX_GetParameter获取输入端口缓冲参数(最小/实际缓冲数,缓冲区大小等)。

●检查有效的输入缓冲参数(修改一些参数,比如帧的宽度/高度,以及缓冲区的数目等)。

●调用OMX_SetParameter函数设置输入缓冲参数。

●调用OMX_GetParameter获取输出端口缓冲参数(最小/实际缓冲数,缓冲区大小等)。

●检查有效的输出缓冲参数(修改一些参数,比如帧的宽度/高度,以及缓冲区的数目等)。

●调用OMX_SetParameter函数设置输出缓冲参数。

交互过程如图3

假设:

1)  缓冲区尺寸的设想:

对于编码器组件,出于内存消耗考虑,最终分配的输出缓冲区尺寸可能小于profile/level/target比特率等所要求的最大帧尺寸。这种情况下,OMX编码器组件应当能够将输出frame/NAL的比特流划分到多个输出缓冲区去,并frame/NAL的最后一个部分使用“OMX_BUFFERFLAG_ENDOFFRAME”标记结尾。

对于解码器组件,出于内存消耗考虑,最终分配的输入缓冲区尺寸可能小于profile/level/target比特率等所要求的最大帧尺寸。在适当的时候,PV提供的输入缓冲区使用“OMX_BUFFERFLAG_ENDOFFRAME”来标记结尾。如果输入缓冲包含一个完整帧(H264NAL单元 )或多个完整帧,“OMX_BUFFERFLAG_ENDOFFRAME”将会用来标记一帧的结尾。如果完整的frame/NAL不能放入一个输入缓冲区,则会被拆分放入多个缓冲区。包含部分信息的缓冲区的“OMX_BUFFERFLAG_ENDOFFRAME”标记位将会被置为0。携带帧/NAL的最后部分的bufffer中的标志“OMX_BUFFERFLAG_ENDOFFRAME”才会被置为1。通过这种方法,组件可以方便的重构一帧/NAL数据,而不需要分析比特流数据。

如果OMX解码器组件不兼容组合部分帧/NALPV框架执行部分帧/NAL的组合。

3OMX组件参数协商

2)输入/输出缓冲区数量

框架或许希望分配比OMX要求更多的的输入/输出缓冲区以便提供更优的性能(比如解码器输出缓冲或编码器输入缓冲——缓冲更多的数据可以提高性能)。尽管性能提升了,但他们不能发送给OMX组件去。

3.4 OMX状态变换 Loaded->Idle

如果部分已分配的缓冲区进入空闲状态,缓冲区分配将挂起。变化过程期间,PV框架将:

●通过“OMX_SendCommand”调用向OMX组件发送命令,将状态由OMX_StateLoaded改变为OMX_StateIdle

●调用一系列“OMX_UseBuffer 或者“OMX_AllocateBuffer”通知OMX组件。调用过程中,输入端口使用NumInputBuffer记录调用次数,输出端口使用NumOutputBuffer记录调用次数。

●等待OMX组件返回callback事件EventHandler,通知框架完成状态转换(OMX_EventCmdComplete)

交互过程参见图4

假定与参数选择:

根据OMX规范,兼容的OMX组件必须同时支持调用OMX_UseBuffer OMX_AllocateBuffer。然而,由于组件内部限制,完全实现是不可能的,组件应当通知PV框架其所具有的功能。

推荐将INPUT缓冲分配在OMX组件外部,这样可以减少额外的内存拷贝(如,对输入缓冲调用OMX_UseBuffer)。

4 OMX组件状态转换OMX_StateLoaded- >OMX_StateIdle

3.5转换到“Executing”状态与数据交换

变化到执行状态时才开始处理数据。本步骤中,PV框架将:

●通过调用“OMX_SendCommand”向OMX组件发送命令,将其状态由OMX_StateIdle改变为OMX_StateExecuting。

●等待OMX组件返回EventHandler事件的callback,通知框架完成状态变换(OMX_EventCmdComplete)。

●通过调用OMX_EmptyThisBuffer向OMX组件发送输入,调用OMX_FillThisBuffer向OMX组件发送输出缓冲,组件使用合适的回调函数返回缓冲。

交互过程如图5。

说明:

1)如果在任意时刻OMX组件拥有所有输入缓冲(也就是所有的输入缓冲都通过调用EmptyThisBuffer传给了OMX组件),那么将不再传递任何输入缓冲区给OMX组件,直到OMX通过callback EmptyBufferDone至少返回一个缓冲。同样,如果OMX组件拥有所有的输出缓存(NumOutputBuffers),PV框架不能继续处理输出直到组件至少返回一个OMX输出缓存。

2)如果PV框架没有及时将缓冲区发给OMX框架,OMX组件不会多次返回同一个缓冲区(也就是一旦OMX框架返回一个缓冲区,只有PV框架再次通过OMX_FillThisBuffer/ EmptyThisBuffer调用这个缓冲,OMX组件才可使用这个缓存)。这是OMX缓冲交换API所规定的基本规则。

5OMX组件状态转换OMX_StateIdle->OMX_StateExecuting及数据交换

3.6 暂停

通常,用例包括暂停和恢复。在本书中,PV框架将:

●通过“OMX_SendCommand”调用给OMX组件发送命令,将其状态由OMX_StateExecuting改变为OMX_StatePause。

●等待来自OMX组件的EventHandler事件callback到达,通知框架状态变换完成(OMX_EventCmdComplete)。

PV框架向OMX组件发送暂停命令后,立刻停止向组件发送OMX输入/输出缓冲。

为了取消暂停,PV框架将:

●通过“OMX_SendCommand”调用给OMX组件发送命令,将其状态由OMX_StatePause改变为OMX_StateExecuting。

●等待来自OMX组件的EventHandler事件callback到达,通知框架状态变换完成(OMX_EventCmdComplete)。

当PV框架收到来自Executing状态下组件的callback后,将重新开始向组件发送OMX输入/输出缓冲(缓冲可用时)。

动作交互如图6。

6OMX组件从OMX_StateExecuting- >OMX_StatePause状态转换及恢复

3.7端口刷新(如果可用)

在组件复位(位置变换)期间,解码器组件通常调用端口刷新,这样会清空队列中的所有数据。在此情况下,PV框架将:

●通过“OMX_SendCommand”调用向OMX组件发刷新全部端口的命令。

●等待来自OMX组件的输入和输出缓冲的两个EventHandler事件callback到达,通知框架已经完成刷新端口(OMX_EventCmdComplete)。

PV框架发送刷新命令之后,立刻停止向组件发送OMX输入/输出缓冲。当接收到第2个callback后,PV框架可以重新开始向组件发送输入/输出缓冲。

端口刷新顺序和接收到反馈的顺序并不相关。

交互过程如图7。

7OMX组件端口刷新流程

为了防止动态端口被重复配置,可以在OMX IL客户关闭OMX组件端口之前调用端口刷新命令。

3.8停止/变换到“IDLE”状态

为了停止处理过程,PV框架将:

●通过“OMX_SendCommand”调用向OMX组件发送命令,将其状态由OMX_StateExecuting 或OMX_StatePause改变为OMX_StateIdle。

●等待来自OMX组件的EventHandler事件callback到达,通知框架完成状态变换(OMX_EventCmdComplete)。

交互过程如图8。

8OMX组件状态从OMX_StateExecuting/Paused ->OMX_StateIdle转换

设想:

当接收到命令完成“IDEL”态转换的callback后,PV框架认为OMX组件按照OMX规范要求那样已经返回所有的OMX输入输出缓冲。

3.9 OMX组件从IDLE->Loaded State转换并De-initialization

当与OMX组件交互结束后,PV框架将:

●通过“OMX_SendCommand”调用向OMX组件发送命令,将其状态由OMX_StateIdle改变为OMX_StateLoaded。

●向OMX组件发送一系列“OMX_FreeBuffer”调用。根据输入端口数目NumInputBuffer和输出端口数目NumOutputBuffers决定调用次数。

●等待来自OMX组件的EventHandler事件callback到达,通知框架状态变换完成(OMX_EventCmdComplete)。

●向OMX core发行OMX_FreeHandle调用,来释放组件句柄handle。

交互参见图9

 9:组件从OMX_StateIdle->OMX_StateLoaded状态转变

注意:在向OMX组件发送命令使OMX idle->loaded转变之前,PV框架应等待OMX组件返回所有输入/输出缓冲。由于异步处理callback,一些EmptyBufferDone/FillBufferDone callback有可能在OMX组件状态由“executing” 到 “idle”之后才到达。

3.10 OMX Core 卸载

PV框架简单的调用函数OMX_Deinit()。