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边界的问起前面讨论过了,此处省略

android+m3+max,Android Opencore OpenMAX学习(3)...相关推荐

  1. android+m3+max,魅族巨屏新机魅蓝Max跑分曝光:联发科P10处理器+3GB运存

    IT之家讯 9月1日消息,魅族将在9月5日14:30举行新品发布会,届时魅族大屏新机魅蓝Max将发布.关于魅蓝Max,此前消息显示该机拥有32GB/64GB两种配置可选,首发联发科Helio P20处 ...

  2. android入门知识,android基础知识学习笔记

    该笔记主要是通过学习<第一行代码>中的各种知识点以及实例,进行的个人学习记录,感谢图书作者郭霖大神 android:label 指定活动中标题栏的内容,标题栏是显示在活动最 顶部的* 标题 ...

  3. 众多Android 开源项目再次推荐,学习不可错过

    FBReaderJ  FBReaderJ用于Android平台的电子书阅读器,它支持多种电子书籍格式包括:oeb.ePub和fb2.此外还支持直接读取zip.tar和gzip等压缩文档. 项目地址:h ...

  4. Android的多媒体框架OpenCore介绍

    网上资料很少, 不过还是找到一个比较详细的说明: 特地在此整理了下: 地址:http://blog.csdn.net/djy1992/article/details/9339787 分为几个阶段: 1 ...

  5. Android之指南针(电子罗盘)学习

    点我下载源码 5月12日更新到V5版:http://download.csdn.net/detail/weidi1989/5364243 今天,在小米的开源项目中下载了一个指南针源码学习了一下,感觉不 ...

  6. Android 《第一行代码》学习笔记

    目录 第一章 准备工作 一.Android 系统架构 二.Android 开发特点 1.四大组件 2.系统控件丰富 3.SQLite数据库 4.多媒体功能强大 5.地理位置定位 三.日志工具的使用 第 ...

  7. android java服务,Android进阶学习必会:Java Binder中的系统服务

    前言 这个知识点是Android进阶学习必须掌握的知识点之一,也是高阶Android架构师经常问到的点.在这里分想给大家,希望对大家的工作和学习有所帮助.喜欢本文的记得点赞关注哦~ 在前面的Andro ...

  8. 42.Android之ListView中ArrayAdapter简单学习

    今天学习下Android中ListView关于ArrayAdapter数据绑定, 废话少说直接上代码. 改下布局文件: 1 <?xml version="1.0" encod ...

  9. android sha1和签名证书的学习

    今天学习了下百度地图,所以顺便把一些相关的知识 sha1怎样生成  app key是怎样生成的复习总结了下: eclispe : 获取sha1 windows -->preferences--- ...

最新文章

  1. ue4蓝图节点手册中文_在UE4中播放视频
  2. linux下vim命令详解
  3. 应用jBPM4解决中国特色的流程需求 (看过之后,强烈推荐)
  4. Learn About Service Console Productivity Tools
  5. kirin710f是什么处理器_如何看待麒麟710F处理器?
  6. SVN打分支及主干合并到分支
  7. 深入理解编译优化之循环展开和粗化锁
  8. linux ps 命令使用
  9. 有哪些越早知道越好的人生经验?
  10. 根据条件返回相应值 decode(条件,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值)...
  11. java 图片线条_JAVA 关于JFrame的问题,我的图片会被线条给覆盖住,怎样让图片在上面呢...
  12. mysql linux查看配置文件my.cnf位置
  13. Qt qtextstream读取文件
  14. mysql数据库实验4
  15. php用户登录界面代码有背景,HTML和CSS实现动态背景登录页面
  16. 泰勒公式的展开细节解析
  17. Win7+IE8页面兼容性问题解决之DOCTYPE声明
  18. 第二周周报:预备队训练-week2(二分查找)
  19. 安卓工具类1——像素PX和dp互相转换的方法(获取手机屏幕尺寸PX)
  20. 如何制作自己的网页html,如何制作自己的网页

热门文章

  1. python字典多重
  2. 信贷逾期预测,LightGBX模型
  3. 【03yy and one】
  4. 关于MySQL,你未必知道的!
  5. android 儿童 汉字 学习 游戏,儿童游戏学汉字升级版
  6. Windows Server2016 安装升级补丁更新
  7. 正达信通ZedaIOT物联网平台设备管理功能浅析
  8. Java实现三人年龄
  9. 蓝桥杯单片机学习过程记录(二十七)超声波模块
  10. wgt文件怎么打开|wgt文件怎么查看内部文件|apk怎么查看内部文件