首页 > 其他分享 >Android Media Framework(二)OpenMAX 类型阅读与分析

Android Media Framework(二)OpenMAX 类型阅读与分析

时间:2024-06-06 23:56:34浏览次数:14  
标签:typedef Media 端口 Framework API IL 组件 OMX OpenMAX

OMX IL Spec将API划分为Control API、Data API、Extension API,所谓Control API指的是IL Client用于控制组件的接口,包含调用OMX Core和OMX Component要用的接口与相关结构体,这一篇我们将重点阅读与Control API相关的宏、结构体与枚举。

1、OMX IL目录结构

OMX IL API由一组头文件定义,包含以下内容:

  • OMX_Types.h:OMX使用的数据类型;
  • OMX_Core.h:OMX Core API以及相关结构体类型;
  • OMX_Component.h:OMX Component API以及相关结构体类型;
  • OMX_Audio.h:audio domain(域)相关的结构体,domain表示范围的意思,这里表示audio范围内的,后续将audio domain简称为audio;
  • OMX_IVCommon.h:audio、image和video公用的结构体;
  • OMX_Video.h:video相关的结构体;
  • OMX_Image.h:image相关的结构体;
  • OMX_Other.h:其他域用到的结构体;
  • OMX_Index.h:所有OMX定义的数据结构的索引,上面所说的所有结构体都有一个索引与之相对应;

在Android中,OMX IL API放在 frameworks/native/headers/media_plugin/media/openmax 目录下,进入目录可以看到包含所有上述提到的文件,除此之外还多了几个Ext结尾的文件,比如OMX_AudioExt.hOMX_VideoExt.h,与之相对应的要添加索引文件OMX_IndexExt.h,Ext表示扩展,意为这是Android在OMX IL基础上扩展的内容。

2、OMX_Types.h

OMX IL使用的基本数据类型存放在OMX_Types.h中,里面有一些宏定义,枚举和结构体,这里我们挑一些比较常见的来阅读。

OMX IL API在函数声明中使用宏参数功能进行描述:

  • OMX_IN:指定参数是一个输入参数,由调用者设定,由函数体读取;
  • OMX_OUT:指定参数是一个输出参数,参数值由函数体设定并回传给调用者,函数返回时调用者可以从参数中读到新的值,属于引用传递;
  • OMX_INOUT:指定函数调用者可以设置的参数类型为输入/输出参数,函数体可以读到参数值,也可以将

还有另外一个宏OMX_ALL,用于选择相同类型下的所有内容,在端口选择中会用到这个宏,表示选择所有端口。

接下来是一组typedef定义的数据类型:

typedef unsigned char       OMX_U8;
typedef signed char         OMX_S8;
typedef unsigned short      OMX_U16;
typedef signed short        OMX_S16;
typedef uint32_t            OMX_U32;
typedef int32_t             OMX_S32;
typedef unsigned long long  OMX_U64;
typedef signed long long    OMX_S64;

typedef void*               OMX_PTR;
typedef char*               OMX_STRING;
typedef unsigned char*      OMX_BYTE;

typedef OMX_PTR             OMX_HANDLETYPE;

上篇文章中提到组件句柄,它使用的类型是OMX_HANDLETYPE,在这我们可以知道组件句柄就是一个void*指针。

最后是一些枚举类型:

typedef enum OMX_DIRTYPE
{
    OMX_DirInput,              /**< Port is an input port */
    OMX_DirOutput,             /**< Port is an output port */
    OMX_DirMax = 0x7FFFFFFF
} OMX_DIRTYPE;

Dir是Direction的缩写,表示方向,用于表示端口数据的流向。如果数据向组件流入,端口用OMX_DirInput描述,表示输入端口;相对的如果数据从组件流出,用OMX_DirOutput表示输出端口。

为了跨平台OMX IL用枚举定义了布尔类型:

typedef enum OMX_BOOL {
    OMX_FALSE = 0,
    OMX_TRUE = !OMX_FALSE,
    OMX_BOOL_MAX = 0x7FFFFFFF
} OMX_BOOL;

3、OMX_Core.h

OMX Core API主要用于动态加载卸载组件,调用组件方法,所有调用组件用到的参数枚举、结构体类型,加载卸载函数,组件调用函数都存放在OMX_Core.h。

OMX_COMMANDTYPE包含了OMX IL可能发送给OMX组件的所有命令:

typedef enum OMX_COMMANDTYPE
{
    OMX_CommandStateSet,
    OMX_CommandFlush,
    OMX_CommandPortDisable,
    OMX_CommandPortEnable,
    OMX_CommandMarkBuffer,
    OMX_CommandKhronosExtensions = 0x6F000000,
    OMX_CommandVendorStartUnused = 0x7F000000,
    OMX_CommandMax = 0X7FFFFFFF
} OMX_COMMANDTYPE;

Android中常用的有:

  • OMX_CommandStateSet:用于改变组件的状态;
  • OMX_CommandFlush:刷新组件端口上的缓冲区队列;
  • OMX_CommandPortDisable:禁用组件的一个端口;
  • OMX_CommandPortEnable:启用组件的一个端口;
  • OMX_CommandVendorStartUnused:除了OMX IL定义的这些命令外,厂商也可以自定义命令,命令值从0x7F000001开始;
typedef enum OMX_STATETYPE
{
    OMX_StateInvalid,
    OMX_StateLoaded,
    OMX_StateIdle,
    OMX_StateExecuting,
    OMX_StatePause,
    OMX_StateWaitForResources,
    OMX_StateVendorStartUnused = 0x7F000000,
    OMX_StateMax = 0X7FFFFFFF
} OMX_STATETYPE;

OMX_STATETYPE定义了OMX组件的状态类型,Android中只用到了前四个:

  • OMX_StateInvalid:组件已损坏或遇到无法恢复的错误进入到该状态;
  • OMX_StateLoaded:组件加载/创建完成,但是资源还未分配,资源指的是端口中的buffer;
  • OMX_StateIdle:组件拥有所有的资源,但尚未传输任何缓冲区或开始处理数据;
  • OMX_StateExecuting:组件正在传输缓冲区并正在处理数据;

由于Android用到的状态只有四种,所以我把组件状态转换图做了简化:

image

图中的四个红色的状态并不是OMX IL的标准内容,所以在头文件中是找不到的,但是它们在spec中有所描述。组件做状态切换时可能要处理一些事务,事务处理完成后才能完成状态切换,红色状态描述的是处理事务的中间过程。

  • OMX_StateLoadedToIdle:当IL Client请求让组件从OMX_StateLoaded状态进入OMX_StateIdle状态时,组件在完成状态转换前需要获取到所有的资源(buffers),等待获取资源的过程用OMX_StateLoadedToIdle来描述。

组件连接IL Client的端口,端口中的buffer可由IL Client分配,通过调用OMX_UseBuffer将buffer传递给组件,也可由IL Client调用OMX_AllocateBuffer方法让组件来分配。

image

以上图为例,IL Client调用OMX_UseBuffer将buffer传递给OMX组件,OMX组件in port共享IL Client的buffer,in port获取到需要的资源;OMX组件out port由自己分配buffer,IL Client调用OMX_AllocateBuffer让组件分配出所要用的buffer,out port获取到需要的资源;当所有端口buffer获取完成,OMX组件即可进入Idle状态。

如果端口用于隧道模式,supplier port中的buffer可由自己分配,也可以复用其他buffer,简单来说我们并不在意供应端口的buffer是怎么来的;供应端口组件调用OMX_UseBuffer把buffer传递给非供应端口。

关注公众号《青山渺渺》阅读全文:
Android Media Framework(二)OpenMAX 类型阅读与分析

image

标签:typedef,Media,端口,Framework,API,IL,组件,OMX,OpenMAX
From: https://www.cnblogs.com/rongmiao/p/18236333

相关文章

  • NeMo训练llama2_7b(不用NeMo-Framework-Launcher)
    @TOC本文介绍了NeMo如何训练llama2_7b模型1.参考链接支持的模型列表功能特性LLAMA2端到端流程(基于NeMo-Framework-Launcher)2.创建容器dockerrun--gpusall--shm-size=32g-ti-eNVIDIA_VISIBLE_DEVICES=all\--privileged--net=host-v$PWD:/home\......
  • Master ABP Framework(熟练掌握 ABP 框架)
    前言ABP框架是一个完整的基础框架,用于通过遵循软件开发的最佳实践和惯例来创建现代Web应用程序。ABP提供了一个高级框架和生态系统,以帮助您实施“不要重复自己”(DRY)原则并专注于您的业务代码。本书由ABP框架的创建者撰写,将帮助您从头开始全面了解ABP框架和现代Web应用程序开发......
  • Android视频开发入门: VideoView、MediaPlayer、 FFmpeg、exoplayer...
    现在,视频功能是越来越普遍的需求。本文将提供一个关于Android视频开发的入门指南,帮助读者快速掌握视频播放、录制和处理等基本功能。1、概述在Android平台上,视频开发主要涉及以下几个方面:视频播放与控制视频录制与处理视频编解码与格式转换视频流媒体与直播接下来,我......
  • 【DRF-13】rest-framework之视图三部曲
    一.mixin类编写视图1.视图classAuthorModelSerializer(serializers.ModelSerializer):classMeta:model=models.Authorfields='__all__'fromrest_frameworkimportmixins,genericsclassAuthors(mixins.ListModelMixin,mixins.CreateMod......
  • 【DRF-12】rest-framework之路由
    路由控制介绍:我们之前一直接触的路由是最基本的形式,就是我们下面介绍的第一种方式的自定义路由,无论是FBV还是CBV,都可以使用这用方式来设置路由来设定请求来的时候对应响应视图的函数或者视图类当我们使用封装了的视图类处理代码的时候,我们就可以使用对应的半自动路由......
  • Android Audio模块 音量增益 framework到HAL 层加载流程
    目录背景概念AndroidAudio调用流程(app-framework-HAL)标记0libaudioclient标记1libaudioclient:aps变量赋值标记1.1binder变量赋值标记2audiopolicy标记4audiopolicy:mAudioPolicyManager变量赋值标记5audiopolicy标记6audiopolicy:mpClientInterface变量赋值标......
  • Gitlab Runner在Windows如何自动发布基于.NET Framework 4.8的传统ASP.NET Web应用程
    摘要软件流水线能把程序员从繁琐的发布工作中解脱出来,但是跑在WindowsIIS里的传统Web应用程序,用Docker的方式不是最方便的。本文详细描述如何用Windows的OpenSSHServer来上传网站后,用PowerShell创建和修改IIS的虚拟目录应用程序。一、自动打包传统ASP.NETWeb应用程序1、Gitl......
  • Vue 前端页面利用MediaRecorder实现音频录制
    Don'tTalk,codeishere:重点是startRecord方法<template><div><el-tooltipclass="item"effect="dark"content="再次点击【开始录音】即为重新录制,之前录制的将被作废"placement="top"><el-button:disabled=......
  • 【DRF-11】rest-framework之分页
    前言:总共有三种分页方式1.根据页码进行分页,看第n页,每页显示n条数据;fromrest_framework.paginationimportPageNumberPaginationclassPageGroupSerializer(serializers.ModelSerializer):classMeta:model=models.UserGroupfields='__all__'......
  • 【DRF-10】rest-framework之序列化(数据校验)
    1.自定义classTitleValidator(object):def__init__(self,start):self.start=startdef__call__(self,value):ifnotvalue.startswith(self.start):message='标题必须以%s为开头。'%self.startraiseseria......