Android Media Framework(三)OpenMAX API阅读与分析

2024-06-09 08:28

本文主要是介绍Android Media Framework(三)OpenMAX API阅读与分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这篇文章我们将聚焦Control API的功能与用法,为实现OMX Core、Component打下坚实的基础。

1、OMX_Core.h

OMX Core在OpenMAX IL架构中的位置位于IL Client与实际的OMX组件之间,OMX Core提供了两组API给IL Client使用,一组API用于管理OMX组件,另一组API用于操作/使用创建的OMX组件。

1.1

OMX_API OMX_ERRORTYPE OMX_APIENTRY OMX_Init(void);
  • OMX_Init:OMX_Init用来初始化OMX Core,在第一次使用OMX组件前它需要先被调用,并且只被调用一次;初始化可能包含以下几个步骤:
    • 分配并初始化使用OMX组件所需的内存和资源;
    • 扫描系统中的所有可用OXM组件,并将它们加载到OMX Core中;
OMX_API OMX_ERRORTYPE OMX_APIENTRY OMX_Deinit(void);
  • OMX_Deinit:与OMX_Init功能相反,它用作于卸载OMX_Init加载的资源;
OMX_API OMX_ERRORTYPE OMX_APIENTRY OMX_ComponentNameEnum(OMX_OUT OMX_STRING cComponentName,OMX_IN  OMX_U32 nNameLength,OMX_IN  OMX_U32 nIndex);
  • OMX_ComponentNameEnum:用于枚举OMX Core中可用的所有组件,该API包含三个参数,第一个参数cComponentName用于返回找到的组件名称(输出参数),第二个参数是字符串的长度(输入参数),第三个参数是遍历OMX Core组件列表的索引,通过递增索引并反复调用这个函数,就可以枚举出OMX Core中所有的组件名称,该API有两个作用:
    • 当需要查看 OMX Core 中有哪些可用的组件时,可以使用这个函数来获取所有组件的名称;
    • 当需要通过名称来查找特定的组件时,可以使用这个函数来对所有组件进行遍历,直到找到与给定名称匹配的组件;
OMX_API OMX_ERRORTYPE OMX_APIENTRY OMX_GetHandle(OMX_OUT OMX_HANDLETYPE* pHandle,OMX_IN  OMX_STRING cComponentName,OMX_IN  OMX_PTR pAppData,OMX_IN  OMX_CALLBACKTYPE* pCallBacks);
  • OMX_GetHandle:用于创建一个OMX组件,返回的句柄就是我们前面学过的OMX_COMPONENTTYPE,该函数需要传递四个参数:
    • OMX_HANDLETYPE* pHandle:这是一个二级指针void**,用于接收创建的OMX_COMPONENTTYPE指针;
    • OMX_STRING cComponentName:组件名称,根据该名称创建对应的组件;
    • OMX_PTR pAppData:调用者(Application/IL Client)的指针;
    • OMX_CALLBACKTYPE* pCallBacks:给OMX_COMPONENTTYPE注册的回调函数,用于回传消息;
OMX_API OMX_ERRORTYPE OMX_APIENTRY OMX_FreeHandle(OMX_IN  OMX_HANDLETYPE hComponent);
  • OMX_FreeHandle:销毁创建的OMX组件,传入参数为OMX_HANDLETYPE hComponent
OMX_API OMX_ERRORTYPE OMX_APIENTRY OMX_SetupTunnel(OMX_IN  OMX_HANDLETYPE hOutput,OMX_IN  OMX_U32 nPortOutput,OMX_IN  OMX_HANDLETYPE hInput,OMX_IN  OMX_U32 nPortInput);OMX_API OMX_ERRORTYPE   OMX_GetContentPipe(OMX_OUT OMX_HANDLETYPE *hPipe,OMX_IN OMX_STRING szURI);

这两个API Android中没有用到,暂不了解。

OMX_API OMX_ERRORTYPE OMX_GetComponentsOfRole (OMX_IN      OMX_STRING role,OMX_INOUT   OMX_U32 *pNumComps,OMX_INOUT   OMX_U8  **compNames);
  • OMX_GetComponentsOfRole:用于获取在给定role(角色)下可以使用的所有OMX组件的列表,包含三个参数:
    • OMX_STRING role:Role是用来描述OMX组件功能的字符串,每个OMX组件都拥有一个或多个角色,需要用role去指定OMX组件执行什么任务,role的名字规律"video_decoder.avc"、“audio_encoder.aac”,第一个字段表示音频/视频,下划线后表示编码/解码,后缀表示具体的编解码类型;
    • OMX_U32 *pNumComps:输出参数,返回role对应的组件的数量;
    • OMX_U8 **compNames:输出参数,返回role对应的所有组件的名称
OMX_API OMX_ERRORTYPE OMX_GetRolesOfComponent (OMX_IN      OMX_STRING compName,OMX_INOUT   OMX_U32 *pNumRoles,OMX_OUT     OMX_U8 **roles);
  • OMX_GetRolesOfComponent:获取一个组件名对应的所有的Role,功能和OMX_GetComponentsOfRole类似;

根据OMX_Init和OMX_ComponentNameEnum等API中的描述,我们大致可以猜到,OMX Core中需要维护一个列表(map),列表中的内容是一组一组的Role和Component Name。

1.2

在OpenMAX IL框架设计中,IL Client不能直接访问OMX组件的函数,它需要调用OMX Core提供的宏来间接操作OMX组件。要注意的是,OMX Core没有为OMX组件的所有函数都提供宏,换言之有些OMX组件函数不是给IL Client使用的。

首先来看定义的宏:

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

OMX_SendCommand用于发送控制命令到组件,可用命令参考上文的枚举,该方法是非阻塞的,命令执行完成后需要发送callback通知IL Client。包含有四个参数:

  • hComponent:组件句柄;
  • Cmd:要发送的命令类型;
  • nParam:int类型的命令参数;
  • pCmdData:无法使用int表示的命令参数;
#define OMX_GetParameter(                                   \hComponent,                                         \nParamIndex,                                        \pComponentParameterStructure)                       \((OMX_COMPONENTTYPE*)(hComponent))->GetParameter(       \hComponent,                                         \nParamIndex,                                        \pComponentParameterStructure)

OMX_GetParameter用于从组件获取参数设置,该方法为阻塞调用:

  • nParamIndex:参数索引,用来指定获取什么参数;
  • pComponentParameterStructure:指针,用于装载获取到的参数;
#define OMX_SetParameter(                                   \hComponent,                                         \nParamIndex,                                        \pComponentParameterStructure)                       \((OMX_COMPONENTTYPE*)(hComponent))->SetParameter(       \hComponent,                                         \nParamIndex,                                        \pComponentParameterStructure)

OMX_SetParameter用于给组件设定参数,该方法为阻塞调用,参数功能与OMX_GetParameter类似。

#define OMX_GetConfig(                                      \hComponent,                                         \nConfigIndex,                                       \pComponentConfigStructure)                          \((OMX_COMPONENTTYPE*)(hComponent))->GetConfig(          \hComponent,                                         \nConfigIndex,                                       \pComponentConfigStructure)#define OMX_SetConfig(                                      \hComponent,                                         \nConfigIndex,                                       \pComponentConfigStructure)                          \((OMX_COMPONENTTYPE*)(hComponent))->SetConfig(          \hComponent,                                         \nConfigIndex,                                       \pComponentConfigStructure)

OMX_GetConfig和OMX_SetConfig分别用于从组件获取配置、给组件设定配置,组件加载完成后可以
随时调用这两个方法,都是阻塞调用。不同于OMX_SetParameter设置的是组件的静态参数值,SetConfig设置的是运行时可更改的配置信息,例如视频的播放速度、音频的音量、视频的亮度等。

#define OMX_GetExtensionIndex(                              \hComponent,                                         \cParameterName,                                     \pIndexType)                                         \((OMX_COMPONENTTYPE*)(hComponent))->GetExtensionIndex(  \hComponent,                                         \cParameterName,                                     \pIndexType)

OMX_GetExtensionIndex用于将OMX IL或厂商定义的扩展字符串转换为相应的结构体索引,该方法是阻塞的。许多音频和视频处理硬件具有特定的特性和特性,这些在OpenMAX IL标准中并未明确定义,为了使这些功能可以被利用,硬件厂商会提供特定的扩展;当应用程序需要访问这些特定的扩展功能时,就需要使用OMX_GetExtensionIndex来获取相关扩展的索引,然后使用这个索引去访问或者操作这些特定的扩展功能。

#define OMX_GetState(                                       \hComponent,                                         \pState)                                             \((OMX_COMPONENTTYPE*)(hComponent))->GetState(           \hComponent,                                         \pState)

OMX_GetState用于获取组件的当前状态。

#define OMX_UseBuffer(                                      \hComponent,                                      \ppBufferHdr,                                     \nPortIndex,                                      \pAppPrivate,                                     \nSizeBytes,                                      \pBuffer)                                         \((OMX_COMPONENTTYPE*)(hComponent))->UseBuffer(          \hComponent,                                      \ppBufferHdr,                                     \nPortIndex,                                      \pAppPrivate,                                     \nSizeBytes,                                      \pBuffer)

OMX_UseBuffer用于让组件使用由IL Client已经分配的buffer,或者使用tunneled组件已经提供的buffer。OMX_UseBuffer的实现应该分配出buffer header,并用参数填充它,最后通过ppBufferHdr返回。该方法是阻塞调用的,可以在LoadedToIdle状态下使用,也可在OMX_StateExecuting、OMX_StateIdle且端口被禁用的情况下使用。


全文阅读:Android Media Framework(三)OpenMAX API阅读与分析

请添加图片描述

这篇关于Android Media Framework(三)OpenMAX API阅读与分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1044665

相关文章

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟 开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚 第一站:海量资源,应有尽有 走进“智听

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯优化、Fortran源代码分析、气候数据降尺度与变化影响分析

查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程,使其能够精确的模拟土壤中水分的运动,而且耦合了WOFOST作物模型使作物的生长描述更为科学。 本文让更多的科研人员和农业工作者

MOLE 2.5 分析分子通道和孔隙

软件介绍 生物大分子通道和孔隙在生物学中发挥着重要作用,例如在分子识别和酶底物特异性方面。 我们介绍了一种名为 MOLE 2.5 的高级软件工具,该工具旨在分析分子通道和孔隙。 与其他可用软件工具的基准测试表明,MOLE 2.5 相比更快、更强大、功能更丰富。作为一项新功能,MOLE 2.5 可以估算已识别通道的物理化学性质。 软件下载 https://pan.quark.cn/s/57

android-opencv-jni

//------------------start opencv--------------------@Override public void onResume(){ super.onResume(); //通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是 //OpenCV_2.4.3.2_Manager_2.4_*.apk程序包,存

衡石分析平台使用手册-单机安装及启动

单机安装及启动​ 本文讲述如何在单机环境下进行 HENGSHI SENSE 安装的操作过程。 在安装前请确认网络环境,如果是隔离环境,无法连接互联网时,请先按照 离线环境安装依赖的指导进行依赖包的安装,然后按照本文的指导继续操作。如果网络环境可以连接互联网,请直接按照本文的指导进行安装。 准备工作​ 请参考安装环境文档准备安装环境。 配置用户与安装目录。 在操作前请检查您是否有 sud

线性因子模型 - 独立分量分析(ICA)篇

序言 线性因子模型是数据分析与机器学习中的一类重要模型,它们通过引入潜变量( latent variables \text{latent variables} latent variables)来更好地表征数据。其中,独立分量分析( ICA \text{ICA} ICA)作为线性因子模型的一种,以其独特的视角和广泛的应用领域而备受关注。 ICA \text{ICA} ICA旨在将观察到的复杂信号

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动