打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Android Opencore OpenMAX学习(3)

OpenMax 调用顺序(OpenMax Call Sequences)
; S8 S, l3 {6 r# \& E5 M 1 OMX 核心初始化 _OMX_MasterInit
* z& n/ i5 m7 R0 x 1)调用OMX_Init函数
  A9 n2 \8 B/ V' s& M ->OsclInit::Init(error, &select); //init all Oscl layers except Oscl scheduler.( ~; Z4 j+ q$ B, e: A/ I6 L
->_Try_OMX_Create(error, data); //create the OMX singleton
( w% R7 `1 k: P& \2 \. c3 d# v9 H ->OsclSingletonRegistry::registerInstanceAndUnlock(data, OSCL_SINGLETON_ID_OMX, error); //Release the singleton.2 @4 W+ G0 p' @" ]9 {+ n/ p
->_Try_OMX_Init(error, status); //If create succeeded, then init the OMX globals.5 B# N0 t0 v5 x2 h
2)PV框架列举所有OMX
8 n, s+ z1 J% `. S8 k+ @( p  a OMX_ComponentNameEnum //列举所有组件的名称0 q, J* j7 p: R9 l. N) j
->OsclSingletonRegistry::getInstance(OSCL_SINGLETON_ID_OMX, error);. t$ H! X+ _0 K$ j# y6 K
->oscl_strncpy(cComponentName, (data->ipRegTemplateList[Index])->ComponentName, nNameLength);8 F& P+ S6 [& h/ g$ C$ B# ^
OMX_GetRolesOfComponent // 通过组件名称找到组件,返回其角色(role)2 _5 e% I  Y1 W1 Z0 ?
->OsclSingletonRegistry::getInstance(OSCL_SINGLETON_ID_OMX, error);
; A7 B+ |- d5 i7 v# d. T8 }  H2 ]8 h ->data->ipRegTemplateList[ii])->GetRolesOfComponent(RoleString)7 K4 x; k) J1 y: w9 {: D/ R
->oscl_strncpy((OMX_STRING) roles[ii], (OMX_STRING)RoleString[ii], oscl_strlen((OMX_STRING)RoleString[ii]) + 1);
; Z' N. R2 p5 Z9 Q' l1 c/ { 2 OMX组件实例、功能及端口
0 e; k' o# |9 b! U8 J% M OMX核心初始化后,下一步为列举每个组件的功能和端口。3 H/ J! m, h. e! T2 }0 Z& M) V9 {
1)调用OMX_GetHandle获取所需的OMX组件信息。. `$ ?; O" \& ?! E0 t- W
2)调用OMX_GetParameter及“PV_OMX_CAPABILITY_TYPE_INDEX”这个index去获取组件的功能。
  L6 y5 _2 v' Z 万一组件不是OpenMax全兼容或者OpenMax的特性不明确,以上获取的功能决定了OMX是否支持输入/输出端口“UseBufeer”和“AllocateBuffer”调用,以及OMX是否支持部分帧等等。* E* C5 c; I1 l% A
注意:如果OMX组件返回“OMX_ErrorUnsupportedIndex”给index(或其他比如“OMX_ErrorNone”),PV框架将为组件功能赋默认值。1 q  o2 y4 L0 n7 V
3)调用OMX_GetParameter,针对视频组件再调用“OMX_IndexVideoInit”,针对音频组件则调用“OMX_IndexAudioIni”以获取可用的端口号。, M- k( ~& |' I( `
4)循环查找可用的端口号以找到输入端口。) N) T" Q8 d9 d3 ~
5)循环查找可用的端口号以找到输出端口。
# N$ J$ r. U' v9 g( d7 L+ @ 注意:
6 w) m' x. t6 `6 a2 R Index “PV_OMX_CAPABILITY_TYPE_INDEX” is defined as:/ Z# ~  Q4 |( o) H* \
#define PV_OMX_COMPONENT_CAPABILITY_TYPE_INDEX 0xFF7A347
, }9 J) }0 q: _, \ The OMX_GetParameter call expects the following structure to be filled for this index:! Z" g. t9 P& ?3 s
typedef struct PV_OMXComponentCapabilityFlagsType( }. t4 }; Y7 v2 G2 D2 j. k
{
$ N2 \/ D5 o& N: w6 g& a0 h2 B ////////////////// OMX COMPONENT CAPABILITY RELATED MEMBERS
8 E/ O9 t' H: m. R. j OMX_BOOL iIsOMXComponentMultiThreaded;
- N8 E3 D' p+ r6 D. b OMX_BOOL iOMXComponentSupportsExternalOutputBufferAlloc;5 g3 W) i' M# k7 l
OMX_BOOL iOMXComponentSupportsExternalInputBufferAlloc;
! ~7 m3 R. l2 h! [8 x: ~3 j* C8 j9 W OMX_BOOL iOMXComponentSupportsMovableInputBuffers;* `0 v/ t8 m3 j, ?# e, n+ m
OMX_BOOL iOMXComponentSupportsPartialFrames;2 y  f! M0 d+ ?8 S: A
OMX_BOOL iOMXComponentUsesNALStartCode;
6 D0 A. |% v8 P* ~ OMX_BOOL iOMXComponentCanHandleIncompleteFrames;0 B2 q  Y, J8 ?
OMX_BOOL iOMXComponentUsesFullAVCFrames;
8 ^  P4 l/ g# z } PV_OMXComponentCapabilityFlagsType;
/ S8 b+ o( q* X; W 功能参数的默认值:( o9 a+ p. t; N
1)iIsOMXComponentMultiThreaded ——默认值OMX_TRUE。
$ R  o% @. p, X# b8 \. i OMX组件一般运行与独立的线程(与PV框架线程不同),有可能将OMX组件集成进PV框架线程(e.g.,通过同步调用)。
! y# Q  }* z) q$ i" i 2)iOMXComponentSupportsExternalOutputBufferAlloc ——默认值OMX_TRUE。( w5 b0 e- V& E4 R
OMX规范要求OMX组件支持外部分配输出缓冲(就是输出缓冲的OMX_UseBuffer调用)。" x8 q: b+ ^0 P1 p! c8 Z
如果组件不支持,必须通知PV框架,以便其调用“OMX_AllocateBuffer”代替。
5 u$ S# e, M, f 3)iOMXComponentSupportsExternalInputBufferAlloc ——默认值OMX_TRUE。
8 J% h( a! f4 ~3 p  | OMX规范要求OMX组件支持外部分配输入缓冲(就是输入缓冲的OMX_UseBuffer调用)。
4 G0 Q. A! C! _% \1 _, L% H( W 如果组件不支持,必须通知PV框架,以便其调用“OMX_AllocateBuffer”代替。" b! K9 ?8 v/ a4 x, R
4)iOMXComponentSupportsMovableInputBuffers ——默认值OMX_TRUE。8 N9 P8 O' j% X& B) W4 ]; K
如果OMX缓冲是外部分配的,为了提高稳定性和优化性能,可以分离OMX缓冲头部信息(OMX_BUFFERHEADERTYPE)与数据区 (“pBuffer”)。换句话说,使OMX缓冲更有“移动性”,当传递一个输入缓冲到OMX组件时,“pBuffer”区域和头部信息不一定指向相同的缓冲区。因此,可以分配更多的数据缓冲在框架中循环工作,只有在需要把缓冲传递到OMX组件时才附加到头部信息去。如果OMX组件要求头部和数据一直指向相同的缓冲,则iOMXComponentSupportsMovableInputBuffers应该被置为OMX_FALSE。5 Q- l, @) k! i" S% G
5)iOMXComponentSupportsPartialFrames ——默认值OMX_TRUE。) V  n, p( T/ |6 e( Y* y1 c
OMX规范要求OMX组件支持将任意数据打包进OMX缓冲,包括独立单帧、NAL和被拆分到多个缓冲区的解码单元。PV框架支持 “OMX_BUFFERFLAG_ENDOFFRAME”标记去组装部分帧。然而,如果OMX组件不支持组装部分帧,也就是OMX组件要求PV框架来组装部分帧并提供给OMX组件完整单帧或NAL,此时iOMXComponentSupportsPartialFrames需要被设置为 OMX_FALSE。
! W0 J9 d/ u6 N 注意:设置为OMX_FALSE将影响性能。
* F4 D: Y% K: u5 j/ \6 ` 6)iOMXComponentUsesNALStartCode ——默认值OMX_FALSE。
4 W5 t/ `$ ?4 r2 ^ 这个标志位将影响H264解码。PV框架提供所有信息以重建立H264NALs(通过OMX缓冲的大小和OMX_BUFFERFLAG_ENDOFFRAME的大小)。因此没有必要由OMX组件解码输出流来获取0x0001的NAL初始代码。如果OMX的H264组件及解码单元需要NAL起始代码,可将 iOMXComponentUsesNALStartCode置为OMX_TRUE。0 m/ @; p8 N/ c3 u* ?2 L
7)iOMXComponentCanHandleIncompleteFrames ——默认值OMX_TRUE。2 @1 X3 U5 W+ _8 c3 ]
如果丢失部分数据流(比如数据包丢失),假定OMX组件及解码单元可以解决这个问题。如果不可以,则将 iOMXComponentCanHandleIncompleteFrames设置为OMX_FALSE。当 “iOMXComponentSupportsPartialFrames”也被设置为OMX_FALSE时,这点相当重要,因为OMX组件不提供组装部分帧,也就是说PV框架必须提供组装好的frame/NALs,因此需要通知OMX组件不完整的帧数据是否可以传递进来。- N0 p! R0 V  b, T5 W
8)iOMXComponentUsesFullAVCFrames ——默认值OMX_FALSE。
/ Q/ q: X9 L0 z6 s4 O: c# Y: D" c 这个标志位决定AVC解码中使用NAL模式还是frame模式。AVC数据可由以上两种模式提供给OMX组件。默认为NAL模式(设置为OMX_FALSE),此模式下OpenCore框架可以为OMX输入缓冲同时提供完整或者部分AVCNAL。Frame模式下(OMX_TRUE),OpenCore框架积累 NAL,并提供给OMX输入缓冲一帧完整的数据。
4 W( T& I7 n7 @+ b% C3 ]* _ NAL边界的问起前面讨论过了,此处省略

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Android Opencore OpenMAX学习(4)
OpenMAX Call Sequences
OpenMax在Android上的实现
Android-StageFright之OpenMAX的实现
《React-Native系列》10、 RN组件之Text和TextInput以及注意要点
Android的多媒体框架OpenCore介绍 第四部分 文件格式处理和编解码部分简介
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服