本文介绍: 上一节学习media.codec 服务中的部分内容,这一节我们将一起了解 OMX IL 层的 API 以及相关的结构体等内容

一节学习media.codec 服务中的部分内容,这一节我们将一起了解 OMX IL 层的 API 以及相关的结构体等内容

1、相关路径

以下是 Media 相关的头文件路径
frameworks/native/headers/media_plugin/media/
cas 和 drm用于加密解密使用editor 里面有个 OMX_COLOR_FormatYUV420Planar 颜色空间转换工具,这三个目录这里不做了解(不会),我们要重点关注的是 openmaxhardware 目录

1.1 hardware

frameworks/native/headers/media_plugin/media/hardware/
hardware 目录下放的是和硬件相关的一些头文件,CryptoAPI.h 大概是用于解密的,HDCPAPI.h用于HDMI加密的,这两个暂时不做了解;

OMXPluginBase.h 在前一节中已经做过了解了,libstagefrighthw.so 中的方法创建一个 OMXPluginBase 对象

VideoAPI.h 中声明media image (frame),以及 Aspects of color 等相关的结构体,这里不做过多描述

1.1.1 HardwareAPI.h

以下内容部分翻译自 HardwareAPI.h 中的注释

以上就是 HardwareAPI.h 中的部分内容,ACodec 并不会直接使用这些结构体,ACodec 回调用 IOmxNode 的接口,再由 OMXNodeInstance 解析参数封装参数最后传给 OMX component。

1.1.2 MetadataBufferType.h

这个文件中只定义了一个 enum MetadataBufferType这里只对注释做一下翻译

MetadataBufferType 定义可以传递给 encoder 的 metadata buffer 的类型,这些类型主要是用于 libstagefright record框架使用的,这里的 record 可能指的是录屏或者是摄像头。Stagefright 框架是不需要知道关于 meta buffer的细节的,只要创建 meta buffer 和 video encoder 能够保持一致就行。

1.2 openmax

1.2.1 OMX_Core.h

这个文件应该算是 OMX 的入口了,文件一开始的注释:OMX_Core 头文件定了applicationcomponent 公用的内容,我的理解就是 OpenMax AL 和 IL 层之间的接口

我们直接拉到文件末尾,可以看到一组函数声明,有心的小伙伴发现我们在上一节的 QComOMXPlugin 中见过它们,这些方法会被封装libOmxCore.so 中,具体的内容需要 vendor 来实现,这里对这几个方法描述进行翻译

函数参数里的OMX_OUTOMX_IN 用于记录当前参数返回参数还是输入参数

再往上看,又有一组函数声明,这组函数的命名struct OMX_COMPONENTTYPE定义的函数指针是一一对应的,我们之前有提到创建 OMX 组件后,我们并不是直接使用组件,而是将其封装到 OMXNode 当中,最终由 OMXNode 调用组件的方法,以下这组函数声明就是对调用组件方法的封装,第一个参数 hComponent 指的就是 handle component(组件句柄/指针):

  • OMX_GetComponentVersion获取组件的信息,这是一个阻塞调用,耗时需要小于 5ms;
  • OMX_SendCommand:向组件发送一条命令,该调用是非阻塞的,组件需要检查参数是否正确然后才能将命令加入到组件线程去执行,组件可能会调用 EventHandler callback返回结果,该函数的调用耗时需要小于 5ms;
  • OMX_GetParameter获取当前组件的参数设置,它是阻塞调用,在 OMX_StateInvalid 状态下不能被调用,其他状态都能调用;它的第二个参数 nParamIndex 表示需要获取的参数类型,该方法执行时间应该小于 20ms;
  • OMX_SetParameter:类似 GetParameter;
  • OMX_GetConfig:从组件获取一个配置的结构体,这是一个阻塞调用,需要在 5ms 内完成;
  • OMX_SetConfig:给组件传递配置,需要与 GetConfig 搭配使用;
  • OMX_GetExtensionIndex:用于将 特定的vendor 配置或者参数翻译成为 OMX 结构体索引
  • OMX_GetState
  • OMX_UseBuffer请求组件使用一个已经分配的buffer(来自于另一个组件 或者 来自于上层),并且分配出组件自己的 buffer header,该调用应该在 5ms 内完成;
  • OMX_AllocateBuffer:请求组件分配一个新的buffer 和一个 buffer header,并且将 buffer header 的指针返回,该调用应该在 5ms 内完成;
  • OMX_FreeBuffer:组件将会释放调用创建的 buffer header,如果 buffer 也是组件创建的,那么也会释放掉该 buffer;
  • OMX_EmptyThisBuffer:将一块填有数据的 buffer 送给组件的 input 端口,这块 buffer 被清空时将会调用 EmptyBufferDone 回调,将 buffer 返回给应用层,这是一个非阻塞调用
  • OMX_FillThisBuffer:将一块空的 buffer 送到组件的 output 端口,组件将会填充该 buffer 并且调用 FillBufferDone 回传给应用层,同样的该函数也是非阻塞的
  • OMX_UseEGLImage

解下来再看看其他结构体:

typedef enum OMX_COMMANDTYPE
{
    OMX_CommandStateSet,    /**< Change the component state */
    OMX_CommandFlush,       /**< Flush the data queue(s) of a component */
    OMX_CommandPortDisable, /**< Disable a port on a component. */
    OMX_CommandPortEnable,  /**< Enable a port on a component. */
    OMX_CommandMarkBuffer,  /**< Mark a component/buffer for observation */
    OMX_CommandKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
    OMX_CommandVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
    OMX_CommandMax = 0X7FFFFFFF
} OMX_COMMANDTYPE;

command type 就是可以设置命令类型,一般有状态设置,flush,端口的开启和关闭,vendor也可以自定义命令类型

typedef enum OMX_STATETYPE

OMX_STATETYPE 指的是组件的状态,比较常见的有如下几种:

一些常见的flag

  • OMX_BUFFERFLAG_EOS:EOS 表示输出端口将不会有数据再出来,所以在最后一块buffer上应该附上 EOS,上层给 decoder 写数据带上 eos 表示当前流结束;
  • OMX_BUFFERFLAG_STARTTIME:这个 flag 标记了起播时或者seek后第一帧应该从哪一帧开始显示渲染;比如说 seek 之后要从某个 pts 开始播放,但是刚好这一帧不是关键帧,那么需要从关键帧开始解码,从目标帧开始渲染。如果组件接收到 starttime,它应该调用 SetConfig设置 OMX_ConfigTimeClientStartTime
  • OMX_BUFFERFLAG_DECODEONLY:组件只解码不渲染;
  • OMX_BUFFERFLAG_DATACORRUPT:表示当前buffer中的数据存在错误
  • OMX_BUFFERFLAG_ENDOFFRAME:表示当前buffer标志着一帧数据的结束,默认情况下Android每次写入都是一帧数据,所以每次数据写给 component 都会带这个flag
  • OMX_BUFFERFLAG_EXTRADATA:额外的数据需要加在数据流之前,某些格式需要加一些数据头;
  • OMX_BUFFERFLAG_CODECCONFIG:codec specific data (csd),例如播放 h264需要的 SPS/PPS,播放AAC需要的AudioSpecificConfig,没有这些配置信息将无法解码播放。

原文地址:https://blog.csdn.net/qq_41828351/article/details/134502855

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。

如若转载,请注明出处:http://www.7code.cn/show_5265.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注