OMXCodec与OMX事件处理流程

原创 2012年03月27日 11:12:13

      学习了解Mutilmedia Framework有一段时间了,今天闲下来稍微整理整理。OMXCodec.cpp类属于libstagefright,在整个MM PF 相当OMX的适配层,供awesomeplayer调用,而OMX.cpp,OMXNoteInstance.cpp等相当于OpenMax中的OpenMax IL,首先讲下OMXCodec与OMX callback事件的处理流程。先看整个流程的时序图吧:

 

 

 

       从时序图看,首先我们要建立个OMXCodecObserver,该类是OMXCodec的内部类,在create函数中被创建,并把对应的OMXCodec加入都自己的观察范围内,具体代码如下:

framework/base/media/libstagefright/OMXCodec.cpp

sp<MediaSource> OMXCodec::Create(
        const sp<IOMX> &omx,
        const sp<MetaData> &meta, bool createEncoder,
        const sp<MediaSource> &source,
        const char *matchComponentName,
        uint32_t flags) {

.....

 sp<OMXCodecObserver> observer = new OMXCodecObserver;

............... 

observer->setCodec(codec);

...................

}

      其次初始化它的callback事件和事件的派发处理函数

      OMX主要的callback事件有哪些呢?在framework/base/media/libstagefright/omx/OMXNodeInstance.cpp中的kCallbacks函数有如下定义:

// static
OMX_CALLBACKTYPE OMXNodeInstance::kCallbacks = {
   
&OnEvent, &OnEmptyBufferDone, &OnFillBufferDone
};

     callback在哪定义呢?看framework/base/media/libstagefright/omx/OMX.cpp中的

status_t OMX::allocateNode(

.......................       

    OMXNodeInstance *instance = new OMXNodeInstance(this, observer);

    OMX_COMPONENTTYPE *handle;
    OMX_ERRORTYPE err = mMaster->makeComponentInstance(
            name, &OMXNodeInstance::kCallbacks,
            instance, &handle);

..............

mDispatchers.add(*node, new CallbackDispatcher(instance));

...................

}

      即每个component对应一组callback事件。

      这些callback由哪些函数返回呢?具体的定义在framework/base/media/libstagefright/openmax/OMX_Core.h

callback EventHandler()

#define OMX_SendCommand(                                    \
         hComponent,                                        \
         Cmd,                                               \
         nParam,                                            \
         pCmdData)                                          \
     ((OMX_COMPONENTTYPE*)hComponent)->SendCommand(         \
         hComponent,                                        \
         Cmd,                                               \
         nParam,                                            \
         pCmdData)

EmptyBufferDone call back.

#define OMX_EmptyThisBuffer(                                \
        hComponent,                                         \
        pBuffer)                                            \
    ((OMX_COMPONENTTYPE*)hComponent)->EmptyThisBuffer(      \
        hComponent,                                         \
        pBuffer)                        /* Macro End */

 

FillBufferDone call back

#define OMX_FillThisBuffer(                                 \
        hComponent,                                         \
        pBuffer)                                            \
    ((OMX_COMPONENTTYPE*)hComponent)->FillThisBuffer(       \
        hComponent,                                         \
        pBuffer)                        /* Macro End */

 

      有了callback事件,如何dispatch呢?其实我们在allocateNote函数已经定义好了我们的dispatch函数

mDispatchers.add(*node, new CallbackDispatcher(instance));

 

      有了oberser, callback event , callbackdispatcher,那么一个callback event 如何从OMX传到OMXCodec呢?下面我们以emptybuffer流程来具体看下,时序图如下:

是不是有点像Handle :)

Android Multimedia框架总结(十二)CodeC部分之OMXCodec与OMX事件回调流程

前言:上篇文中分析到AwesomePlayer到OMX服务,曾介绍到,OMX服务主要完成三个任务: NodeInstance列表的管理,NodeInstance的操作, 事件的处理。最后这个事件处理就...
  • hejjunlin
  • hejjunlin
  • 2016年09月23日 00:18
  • 3519

OMXCodec执行流程细节

.创建实例(AwesomePlayer调用SetDataSource())         .调用OMXCodec:Create()                 .findMatchingCo...
  • zhubin215130
  • zhubin215130
  • 2013年07月17日 16:01
  • 11034

Android OMX介绍(总括)

一、OpenMax简介(缩写为:OMX)     OpenMAX是一个多媒体应用程序的标准。由NVIDIA公司和Khronos™在2006年推出。     它是无授权费的、跨平台的C语言程序接口序...
  • u010164190
  • u010164190
  • 2016年09月29日 19:17
  • 2676

android之媒体硬解OMX的实现

分类: 多媒体 android c++2012-05-17 22:33 8748人阅读 评论(20) 收藏 举报 androidcodecnull数据结构bufferoutput an...
  • mirkerson
  • mirkerson
  • 2014年10月17日 13:08
  • 13730

OMX Codec详细解析

http://www.cnblogs.com/shakin/p/4741242.html 概述 OMX Codec是stagefrightplayer中负责解码的 OMX Codec详细...
  • zds05
  • zds05
  • 2016年09月23日 11:35
  • 1069

stagefright + omx小结

分类: gstreamer2011-05-21 10:12 2734人阅读 评论(0) 收藏 举报 bufferoutputinput框架audioandroid st...
  • mirkerson
  • mirkerson
  • 2014年10月17日 13:09
  • 1677

Android OMX介绍(总括)

一、OpenMax简介(缩写为:OMX)     OpenMAX是一个多媒体应用程序的标准。由NVIDIA公司和Khronos™在2006年推出。     它是无授权费的、跨平台的C语言程序接口序...
  • datamining2005
  • datamining2005
  • 2017年09月08日 15:47
  • 202

Stagefright,omx与Component的交互

Stagefright中的Extractor/Writer分别对应多媒体播放流程中的Demux/Remux,而Component对应的是Encoder/Decoder。本文以解码为例介绍Extract...
  • fallgold
  • fallgold
  • 2013年09月30日 23:28
  • 1478

Android多媒体:OMX

OMXCodec是一个codec框架,实现者可以在这个框架中实现各种解码方式,包括硬件解码。OMXMaster 负责OMX中编解码器插件管理,软件解码和硬件解码都是使用OMX标准,挂载plugins的...
  • ffmpeg4976
  • ffmpeg4976
  • 2015年07月18日 11:23
  • 712

OpenMAX/IL: OMX IL 学习笔记【1】- 结构框架

OpenMAX IL 层 API 旨在为媒体组件提供跨平台的可移植能力。这些接口将系统的软硬件结构进行抽象化。每个组件及其相关的转换都被封装在组件接口的内部。OpenMAX IL API 允许用户去加...
  • Blue_XX
  • Blue_XX
  • 2015年06月23日 16:52
  • 2232
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:OMXCodec与OMX事件处理流程
举报原因:
原因补充:

(最多只允许输入30个字)