打开APP
userphoto
未登录

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

开通VIP
Android Opencore OpenMAX学习(2)

Android Opencore OpenMAX学习(2)

文章分类:移动开发

数据格式及OMX输入缓冲细节
* O. M1 n9 c9 a* w 1.1 帧起始代码2 y9 ?* ?6 d* d" N
一般不用,H.264可能使用。
0 e/ `2 G$ @) g1 ~2 I- n1 C5 s 1.2 OMX缓冲区8 M3 r; I4 \% ^: f$ G# \
三个值得信赖的关键参数
7 p# R6 z- d* c8 i& W& t nFilledLen 缓冲区长度
3 [1 u! F0 Q2 N6 m$ w6 Y! l nTimestamp 缓冲区时间戳1 P& v( w3 A% q9 M' {
OMX_BUFFERLAG_ENDOFFRAME 缓冲区结束标志位+ |4 l2 @$ C( X: m! B: p
1.3多帧合并输入缓冲
, i$ \7 C2 R& r5 F5 b1 } 一些音频信息,单帧过小(eg ARM),将其合并作为一个缓冲区处理。( Q$ k0 ^% `9 x  P. Q
nFilledLen为所有帧总长度,nTimestamp指向缓冲区第一帧时间。
5 t0 {: y% Z1 ^1 h/ D 1.4部分帧/ @' x  |- B& R
视频解码单帧过大情况下,可能将单帧拆分后传递给缓冲区。4 |8 p& A3 }( K2 V& @: j
部分帧情况下,只有最后一帧的缓冲区才拥有OMX_BUFFERLAG_ENDOFFRAME。
' G4 }% N: ?: e 部分帧缓冲区不会包含两帧信息。) x' M" S0 Q. B8 \/ R: @. b4 ]
流媒体可能包含多帧。
; q) z/ v4 L6 z/ X 部分帧的nTimestamp应当相同。6 n9 {( |' e- T
总结:OMX输出缓冲区可能包含
7 S7 M" h1 U* X- I/ K" U7 d ——完整多帧% ~! F9 r% t; _# o+ Z
——完整单帧
7 E( `% X/ Z8 i% J4 W) M ——部分帧9 c" ~0 k/ Z# @/ y, |$ J0 `7 a
1.5 错误的数据封装
; l, y( E$ J2 k) A1 |/ y 多帧的部分帧封装 eg wrong(Frame1+Frame2 part)
) `- r' [6 e2 @- ^ 1.6 Codec配置数据
, f; x/ V; B) i3 m: R$ b Codec配置缓冲区使用OMX_BUFFERLAG_ENDOFFRAME 和OMX_BUFFERFLAG_CODECCONFIG标志位。
; O% H0 G0 k; K; M- _! b5 ] H.264的SPS和PPS使用独立的OMX输入缓冲区。" Y7 L: u2 v9 g( \
2 H264/AVC 解码器格式
9 W3 k3 ?% S. l+ c& I$ s0 c8 z- K Codec配置头部:, t! Z+ f* H# u) [
SPS和PPS NAL单元位于起始的OMX输入缓冲区。
6 [$ L0 y5 ~+ E; p, A' A SPS和PPS NALs使用独立的OMX输入缓冲区,并使用OMX_BUFFERLAG_ENDOFFRAME 和OMX_BUFFERFLAG_CODECCONFIG标记。% P  ~) q  X6 |7 n0 M6 O
2.1 AVC NAL模式与AVC Frame模式5 ?+ _+ H8 t7 [* L
通过设置iOMXComponentUsesFullAVCFrame标志位,可以决定AVC数据使用哪种模式解码。
( [6 I5 p3 q$ K% P+ b 默认使用NAL模式,此种模式下OpenCORE框架同时提供完整单帧和部分帧输入缓冲区。
/ f* i# J  m: S' L% p1 B  T' W 在Frame模式下,OpenCORE框架积累NALs并提供完整单帧给输入缓冲区。
0 a/ H# I, Z# s OMX_OTHER_EXTRADATA结构体用来区分NAL边界。3 b2 Q+ ?/ H8 `3 X& T
如果iOMXComponentUsesFullAVCFrame和iOMXComponentUsesNALStratCodes都被置为OMX_TRUE,
0 M5 k# b2 G: V+ Z) i  s  c NAL边界可被start codes区分,此时OMX_OTHER_EXTRADATA无用。7 t/ {' ]+ x4 F. [2 o' _1 k% J% O
数据结构——NAL模式:
) B. r+ Y0 f7 f: S0 {$ P* R" J 输入缓冲区包含一个或多个NAL,但只包含同一帧的NAL,一帧最后一个NAL才含有OMX_BUFFERLAG_ENDOFFRAME标志位。/ C8 L, u* H- p4 c
数据结构——Frame模式:
; a, E3 @) n+ Q' k$ \0 W4 [ 每个输入缓冲区包含完整帧。9 g; v5 C! g1 i# V' V7 X
如果使用NAL start codes,可通过读取NAL start codes区分NAL边界。
0 j0 g+ \+ f; ?0 o! U 否则使用OMX_OTHER_EXTRADATA结构体区分NAL边界。% V, o5 B: j% h$ T, y( ?
在Frame模式中,每个缓冲区都含有OMX_BUFFERLAG_ENDOFFRAME标志位。# W& ?/ r) S& R* x' Z
在Frame模式中,每个缓冲区都含有位于OMX_BUFFERLAGHEADERTYPE结构体nFlags区域的OMX_BUFFERLAG_EXTRADATA标志位。* W2 e& ]6 \7 z7 B1 g( [& n
缓冲区最后包含AVC frame,追加以下数据:
* k( n4 m% q" r9 F( C! d OMX_OTHER_EXTRADATATYPE extra;! D3 N. [0 Y  |' y! s% c* o
OMX_OTHER_EXTRADATATYPE terminator;  n3 F( M0 V  z; d3 c! }
extra.eType = OMX_ExtraDataNALSizeArray;
& E2 D" j: S/ [0 v, ?5 G extra.nSize = 20+4*(number of NALs in the frame); // 20 is the size of. @5 W. P/ Z: b6 c
OMX_OTHER_EXTRADATATYPE structure + 4 bytes per NAL size
7 N# q) Z/ l% W* X extra.nDataSize = 4 * (number of NALs in the frame)% V+ Q/ T8 D0 v$ Q/ |) T0 i
extra.data[4*i] = size of the i-th NAL (data is declared as byte array – so offset is 4*i, since 4 bytes( g" ?, e) K, e! v* k
is assigned to signal the size of each NAL unit)& h4 S" |! \& g3 L! K4 Q6 \3 M2 V0 R
terminator.eType = OMX_ExtraDataNone;
/ w! ]) @- ?6 c+ d" \, `/ { terminator.nSize = 20;5 x2 ^: O9 h. ^
terminator.nDataSize = 0;& e" e! a. }- c/ s: U2 H) W
#define OMX_ExtraDataNALSizeArray 0x7F123321
1 X. H5 O2 X& ?# c* v1 ~ 通过获取OMX_OTHER_EXTRADATA结构体信息,可以得知每一帧包含NAL单元的数目并确定NAL边界。
$ N; U- y  K$ K 一个例子:AVC Frame模式,包含2个NAL,包含extra数据结构' n0 N' W# ^+ x! {! |" a3 o
总结:
* L- f% N% n. D8 v; O0 V 1)每个缓冲区都含有位于OMX_BUFFERLAGHEADERTYPE结构体nFlags区域的OMX_BUFFERLAG_EXTRADATA标志位8 R" B/ p5 N2 _1 x
2)每个NAL的长度应当使用独立的4byte无符号整型数表示(eg OMX_U32)" S- R. O7 Y0 D3 B9 z9 j
3)所有NAL的长度被编码成OMX_U32的数组存放在buffer最后。
6 [; a5 j6 |0 p 4)包含完整帧的缓冲区必须含有位于OMX_BUFFERLAGHEADERTYPE结构体nFlags区域的OMX_BUFFERLAG_ENDOFFRAME标志位。! C: x% O8 V0 R/ d& g
5)一个独立的缓冲区不包含多帧数据。' Y/ F4 f" Q" s2 n% I: _( C
3 YUV和RGB数据格式
% K% E7 i7 c; O OMX编码组件中,生肉提供YUV或者RGB格式,OpenCORE框架将提供一帧完成的YUR或RGB数据给OMX组件。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Android Opencore OpenMAX学习(2)
Android的多媒体框架OpenCore介绍 第四部分 文件格式处理和编解码部分简介
opencore and stagefright
H264帧格式解析
OpenCores框架
侯氏黑散治疗脑缺血性中风后遗症20例临床观察_邓明华
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服