首页 > 其他分享 >Android Media Framework(四)Non-Tunneled组件的状态转换与buffer分配过程分析

Android Media Framework(四)Non-Tunneled组件的状态转换与buffer分配过程分析

时间:2024-06-08 10:14:16浏览次数:14  
标签:Tunneled Non 调用 buffer Client IL 组件 OMX

本篇将继续深入OpenMAX IL Spec,详细解析Non-tunneled(非隧道)组件的初始化、数据传递以及组件销毁过程。通过阅读本篇内容,我们应能对Non-tunneled组件的buffer分配与状态转换过程有一个清晰的了解。

1、组件初始化

以下是IL Spec给的Non-tunneled组件初始化时序图:

IL Client首先调用OMX IL Core的接口创建OMX组件,接着调用IL Core定义的宏函数操作OMX组件,详细调用过程如下:

  1. IL Client调用 OMX_GetHandle 方法创建组件,组件所有的配置与资源都被初始化,进入StateLoaded状态。IL Core调用组件的SetCallbacks方法将回调函数注册到OMX组件当中。组件创建成功,OMX_GetHandle将组件句柄返回给IL Client。
  2. 组件处于StateLoaded状态下,IL Client通过调用OMX_SetParameter函数将所需的参数设定给OMX组件。
  3. 参数设定完成后,IL Client调用OMX_SendCommand向OMX组件发送CommandStateSet命令,请求组件将状态转换为OMX_StateIdle,只有在发出此请求后,IL Client才能为OMX组件配置端口所用的buffer。
  4. 如果某个端口的buffer是由组件自己分配,那么IL Client要调用OMX_AllocateBuffer请求组件为该端口分配具有指定大小的buffer,同时还要分配出对应的buffer header。
  5. 如果某个端口需要共享IL Client的buffer,那么IL Client需要分配出buffer,再调用OMX_UseBuffer将buffer传递给OMX组件,组件接收buffer后需要分配出buffer header回传给IL Client。
  6. 组件检测到所有端口都拿到了所需的buffer,它就正式进入到StateIdle状态,并发送Callback通知IL Client状态转换请求已经完成。

阅读以上流程我们会发现,无论是用OMX_AllocateBuffer还是用OMX_UseBuffer,buffer header都是由组件分配再回传给IL Client。

2、数据传输

以下是IL Spec中的Non-tunneled组件数据传输时序图:

收到组件StateIdle状态设定完成发送的callback后,IL Client会调用OMX_SendCommand再向OMX组件发送CommandStateSet命令,请求组件将状态转换为OMX_StateExecuting,组件收到此请求不需要执行一些复杂动作(时序图没有标出这个流程),状态设置完成后组件同样会发送callback给IL Client。

组件的OMX_StateExecuting状态设定完成后,IL Client启动数据传输流程:

  1. IL Client调用OMX_FillThisBuffer将一个空的output buffer传递给OMX组件的output port;
  2. IL Client调用OMX_EmptyThisBuffer将一个写有数据的input buffer传输给OMX组件的input port;

全文阅读:Android Media Framework(四)Non-Tunneled组件的状态转换与buffer分配过程分析

image

标签:Tunneled,Non,调用,buffer,Client,IL,组件,OMX
From: https://www.cnblogs.com/rongmiao/p/18238342

相关文章

  • Java基础——数组应用之StringBuilder类和StringBuffer类
    系列文章目录文章目录系列文章目录前言一、StringBuffer类二、StringBuffer概述三、StringBuffer方法四、StringBuilder类五、String、StringBuffer、StringBuilder的区别前言前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点......
  • String、StringBuilder和StringBuffer是处理字符串的三个不同的类
    在Java中,String、StringBuilder和StringBuffer是处理字符串的三个不同的类,它们各自具有不同的特点和使用场景。下面将具体分析这三个类的异同点:不可变性与可变性String:String是一个不可变的字符串,这意味着一旦一个String对象被创建,其值就不能改变。这种设计提供了值的恒定性,使......
  • Uncaught TypeError: Invalid attempt to spread non-iterable instance.
    1、报错信息:报错UncaughtTypeError:Invalidattempttospreadnon-iterableinstance.Inordertobeiterable,non-arrayobjectsmusthavea[Symbol.iterator]()method.at_nonIterableSpread(OgPanel.js:20:39)at_toConsumableArray(OgPanel.js:18:131)......
  • 控制台警告:[Violation] Added non-passive event listener to a scroll-blocking 'mou
    控制台警告:[Violation]Addednon-passiveeventlistenertoascroll-blocking'mousewheel'event.Considermarkingeventhandleras'passive'tomakethepagemoreresponsive.Seehttps://www.chromestatus.com/feature/5745543795965952[Viola......
  • mysql中InnoDB存储引擎的Buffer Pool
    大家好。众所周知,对于使用InnoDB作为存储引擎的表来说,不管是用于存储用户数据的索引(包括聚簇索引和二级索引),还是各种系统数据,都是存储在磁盘上的。在处理客户端的请求时,当需要访问某个页的数据时,就会把完整的页的数据全部加载到内存中。将整个页加载到内存中后就可以进行读......
  • Docker---java.sql.SQLNonTransientConnectionException: Could not create connectio
    文章目录一、问题场景二、问题分析及解决2.1问题分析2.2问题解决2.2.1有改动未重启容器2.2.2数据库配置不对三、结束一、问题场景使用docker容器控制数据库时,启动服务报错:java.sql.SQLNonTransientConnectionException:Couldnotcreateconnectiontodat......
  • 【OpenCV函数详解之cv2.calcOpticalFlowPyrLK(old_gray, frame_gray, p0, None, **lk_
    文章目录cv2.calcOpticalFlowPyrLK()函数介绍:函数定义:参数说明:返回值示例代码执行结果:**总结:**p1,st,err=cv2.calcOpticalFlowPyrLK(old_gray,frame_gray,p0,None,**lk_params)解释:函数:参数:返回值:使用:cv2.calcOpticalFlowPyrLK()函数介绍:cv2.calcOpti......
  • error:connot bind non-const lvalue reference of type ‘std::__cxx11::string& {ak
    实习记录犯错日志:std::stringutf8_str=gbk_to_utf8((char*)struCIDAlarmInfo.sCIDCode);代码这样写则报如题所示的错误,error:connotbindnon-constlvaluereferenceoftype'std::__cxx11::string&{akastd::cxx11::basic_string<char>&}toanrvalueoftype'......
  • PostgreSQL启动报错“could not map anonymous shared memory: Cannot allocate memor
    PostgreSQL启动报错“couldnotmapanonymoussharedmemory:Cannotallocatememory”基础信息OS版本:RedHatEnterpriseLinuxServerrelease7.9(Maipo)DB版本:16.2pg软件目录:/home/pg16/softpg数据目录:/home/pg16/data端口:5777报错[pg16@test~]$pg_ctlst......
  • Nginx:a client request body is buffered to a temporary file
    https://www.cnblogs.com/iAmSoScArEd/p/18225191Nginxwarn:2024/05/3119:28:37[warn]8467#0:*9505669aclientrequestbodyisbufferedtoatemporaryfile/usr/local/openresty/nginx/client_body_temp/0002098837,client:10.xx.xx.xx,server:xxx.xx.com,r......