Android 13 - Media框架(14)- OpenMax(四)

2023-11-29 07:45
文章标签 android 框架 14 media 13 openmax

本文主要是介绍Android 13 - Media框架(14)- OpenMax(四),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这一节继续了解 openmax 目录下的内容。

1、OMX_Core.h

1.1、OMX_BUFFERHEADERTYPE

这是一个比较关键的结构体,上层ACodec/MediaCodec用到的 buffer id、OMXNode 与 OMX component 进行 buffer 传递都是通过该结构体完成,这里将会初步了解结构体中的部分成员意义:

  • OMX_U32 nSize:结构体的大小,用的不多;
  • OMX_U8* pBuffer:指向真正存储数据的 buffer;
  • OMX_U32 nAllocLen:分配的 buffer 的字节数;
  • OMX_U32 nFilledLen:buffer中填充的数据的字节数;
  • OMX_U32 nOffset:buffer 有效数据的偏移量;
  • OMX_PTR pAppPrivate:指向应用层与之关联的 buffer;
  • OMX_PTR pPlatformPrivate:指向平台与之关联的 buffer;
  • OMX_PTR pInputPortPrivate:指向 input 端口与之关联的 buffer;
  • OMX_PTR pOutputPortPrivate:指向 output 端口与之关联的 buffer;
  • OMX_TICKS nTimeStamp:buffer 对应的 pts;
  • OMX_U32 nFlags:buffer 所携带的标志位;
  • OMX_U32 nOutputPortIndex:输出端口上的索引;
  • OMX_U32 nInputPortIndex:输入端口上的索引;

结构体中 pBuffer、pAppPrivate、pPlatformPrivate 指向的内容这里暂时不做了解,后面了解 OMXNode 时再做研究。

1.2、OMX_EVENTTYPE

这个枚举类型定义了 OMX 组件的 callback 事件:

  • OMX_EventCmdComplete:组件执行完成一个命令;
  • OMX_EventError:组件发生错误;
  • OMX_EventMark:组件检测到 buffer 标识,用的较少;
  • OMX_EventPortSettingsChanged:组件的端口设置发生变化;
  • OMX_EventBufferFlag:组件收到 EOS;
  • OMX_EventComponentResumed:组件恢复工作;
  • OMX_EventOutputRendered :用作 tunnel mode 下 pts 上传给上层
  • OMX_EventDataSpaceChanged:数据空间发生变化;
  • OMX_EventOnFirstTunnelFrameReady:tunnel mode下第一帧被解出并且准备好渲染;

1.3、OMX_CALLBACKTYPE

这个结构体定义了 OMX 组件的 callback 类型,总共包含三个函数指针:

  • EventHandler:这个方法用于通知应用层OMX组件有事件发生;
  • EmptyBufferDone:这个方法用于将 input 端口的使用完的(空的) buffer 返回给应用层;这个方法是阻塞调用的,所以应用层不应该再其他线程中填充这块buffer;
  • FillBufferDone:这个方法用于将 output 端口的填充完的(满的)buffer 返回给应用层,同样的这个方法也是阻塞调用的;

1.4 OMX_BUFFERSUPPLIERTYPE

tunnel mode 相关,暂不了解。


2、OMX_Component.h

OMX_Component 头文件下定义了一个OMX组件所必要的公有接口,这个头文件将会被组件层和应用层共同使用。

2.1、struct OMX_PARAM_PORTDEFINITIONTYPE

每个组件都会有input 和 output 两个端口,每个端口都会有一个详细的信息描述,比如端口有几个buffer、端口当前的状态等等,这些信息就用 OMX_PARAM_PORTDEFINITIONTYPE来描述,结构体中有如下内容:

  • nPortIndex:端口的索引,使用较少;
  • eDir:表示当前 port 是 input 还是 output;
  • nBufferCountActual:当前端口上实际分配的buffer的数量;
  • nBufferCountMin:当前端口最少应该分配的buffer的数量;
  • nBufferSize:端口上每个buffer的大小;
  • bEnabled:当前端口是否被使能,默认是 enabled;
  • bPopulated:当前端口的数量是否已经被充满(数量等于nBufferCountActual),disable状态下端口将不会被认为是充满的;
  • eDomain:当前端口中buffer存储的数据的类型,video数据还是audio数据,用于决定端口的format类型;
  • format:表示端口中buffer的格式,不同数据类型对应于不同的格式,这将在后续了解;
  • bBuffersContiguous:buffer是否连续;
  • nBufferAlignment:buffer的对齐方式;

ACodec 中分配buffer时会先获取 port 定义,读取端口对应的 buffer 数量,后续也可能修改端口的buffer数量,另外读取输入输出格式时就是从端口定义的format中读取的。

2.2 struct OMX_COMPONENTTYPE

我们在OMX中见到的OMX_HANDLETYPE指代的就是这里的OMX_COMPONENTTYPE,它表示一个组件的句柄,通过这个句柄我们可以调用到组件的公有方法,也可以获取到组件的私有数据块(每个组件实现的方式与细节)。组件句柄由OMX Core创建,组件加载完成后,应用层可以安全的调用组件的方法。

接下来了解这个结构体中的部分内容:

  • pComponentPrivate:指向组件的私有数据块(内部实现);
  • pApplicationPrivate:指向OMX组件的调用者(client),也就是OMXNode;
  • 公有函数指针:由OMX组件实现,给client调用。

调用一个 OMX 方法后,组件的处理流程应该是这样:

  • 调用 OMX_COMPONENTTYPE 的标准方法,传入参数为 OMX_COMPONENTTYPE 自身;
  • 标准方法实现中对内部实现 pComponentPrivate 进行处理和调用,比如说 SetCallbacks 应该会把回调函数注册给 pComponentPrivate 的一个成员。

OMX Core 创建的是一个基类对象,实际调用的是我们的子类实现,大致就是这个意思。

这篇关于Android 13 - Media框架(14)- OpenMax(四)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

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影

业务中14个需要进行A/B测试的时刻[信息图]

在本指南中,我们将全面了解有关 A/B测试 的所有内容。 我们将介绍不同类型的A/B测试,如何有效地规划和启动测试,如何评估测试是否成功,您应该关注哪些指标,多年来我们发现的常见错误等等。 什么是A/B测试? A/B测试(有时称为“分割测试”)是一种实验类型,其中您创建两种或多种内容变体——如登录页面、电子邮件或广告——并将它们显示给不同的受众群体,以查看哪一种效果最好。 本质上,A/B测

cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个?

跨平台系列 cross-plateform 跨平台应用程序-01-概览 cross-plateform 跨平台应用程序-02-有哪些主流技术栈? cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个? cross-plateform 跨平台应用程序-04-React Native 介绍 cross-plateform 跨平台应用程序-05-Flutte

Spring框架5 - 容器的扩展功能 (ApplicationContext)

private static ApplicationContext applicationContext;static {applicationContext = new ClassPathXmlApplicationContext("bean.xml");} BeanFactory的功能扩展类ApplicationContext进行深度的分析。ApplicationConext与 BeanF

android-opencv-jni

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

从状态管理到性能优化:全面解析 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中的列表和滚动

数据治理框架-ISO数据治理标准

引言 "数据治理"并不是一个新的概念,国内外有很多组织专注于数据治理理论和实践的研究。目前国际上,主要的数据治理框架有ISO数据治理标准、GDI数据治理框架、DAMA数据治理管理框架等。 ISO数据治理标准 改标准阐述了数据治理的标准、基本原则和数据治理模型,是一套完整的数据治理方法论。 ISO/IEC 38505标准的数据治理方法论的核心内容如下: 数据治理的目标:促进组织高效、合理地

Android 10.0 mtk平板camera2横屏预览旋转90度横屏拍照图片旋转90度功能实现

1.前言 在10.0的系统rom定制化开发中,在进行一些平板等默认横屏的设备开发的过程中,需要在进入camera2的 时候,默认预览图像也是需要横屏显示的,在上一篇已经实现了横屏预览功能,然后发现横屏预览后,拍照保存的图片 依然是竖屏的,所以说同样需要将图片也保存为横屏图标了,所以就需要看下mtk的camera2的相关横屏保存图片功能, 如何实现实现横屏保存图片功能 如图所示: 2.mtk