android P MediaCodec编解码流程分析

article/2025/10/6 19:03:53

1.MediaCodec初始化流程分析

 通过上面流程分析可知,MediaCodecList初始化是通过调用它的getLocalInstance函数,然后在里面new的MediaCodecList对象。在MediaCodec的CreateByType函数中new了MediaCodec对象。

allocateNode调用流程是在ACodec.cpp中的onAllocateComponent中,然后调用到IOMX.cpp中的allocateNode,再调用到WOmx.cpp的allocateNode中,再调用到Omx.cpp(IOmx.hal)中的allocateNode:

 

 所以ACodec中的omxNode是LWOmxNode,其中的mBase是Omx.cpp,LWOmxNode中的mBase是TWOmxNode,TWOmxNode中的mBase是OMXNodeInstance。

2. makeComponentInstance流程分析

在OMX得allocateNode中调用了makeComponentInstance函数,

 <1>. 获取了&handle,这个handle就是调用MtkOmxBase.h中得GetComponentHandle得到的:

mCompHandle的初始化,最后framework层调用handle的函数都在这里面对应: 

 <2>. 回调函数分析:

OMX_ERRORTYPE err = mMaster->makeComponentInstance(name.c_str(), &OMXNodeInstance::kCallbacks,instance.get(), &handle);

主要是三个回调:

OMX_ERRORTYPE (*EventHandler)(OMX_IN OMX_HANDLETYPE hComponent,OMX_IN OMX_PTR pAppData,OMX_IN OMX_EVENTTYPE eEvent,OMX_IN OMX_U32 nData1,OMX_IN OMX_U32 nData2,OMX_IN OMX_PTR pEventData);OMX_ERRORTYPE (*EmptyBufferDone)(OMX_IN OMX_HANDLETYPE hComponent,OMX_IN OMX_PTR pAppData,OMX_IN OMX_BUFFERHEADERTYPE* pBuffer);OMX_ERRORTYPE (*FillBufferDone)(OMX_OUT OMX_HANDLETYPE hComponent,OMX_OUT OMX_PTR pAppData,OMX_OUT OMX_BUFFERHEADERTYPE* pBuffer);

回调处理:

 <3>.设置回调:

        在调用Mtk_OMX_GetHandle的时候调用了SetCallbacks函数最后对应到MtkOmxVdecEx.cpp类里面的MtkVdec_SetCallbacks,里面调用到了它的SetCallbacks:

 <4>. mObserver->onMessages最后调用到了ACodec中,回调的处理重点看ACodec中:

3.MediaCodecList流程分析

main_codecservice.cpp服务创建了OmxStore对象,OmxStore主要是初始化MediaCodecsXmlParser解析 media_codecs.xml和media_codecs_performance.xml两个xml文件,这两个文件主要是编解码配置参数配置文件。

在Omx初始化的时候也初始化了MediaCodecsXmlParser对象。

4.加载OMX插件

/hardware/google/av/codec2/hidl/services/C2SoftwareCodecServiceRegistrant.cpp中的RegisterCodecServices函数调用是在 /frameworks/av/services/mediacodec/main_codecservice.cpp中,

 

  

 addVendorPlugin是加载硬编解码插件,SoftOMXPlugin是加载软编解码插件

5. 硬编解码MtkOMXPlugin初始化

 (1). MTK_OMXCORE_CFG_FILE定义:

            #define MTK_OMXCORE_CFG_FILE "/vendor/etc/mtk_omx_core.cfg"

           实际文件路径:

           /device/mediatek/mt6771/mtk_omx_core.cfg

           内容如下:

           

OMX.MTK.VIDEO.DECODER.HEVC  video_decoder.hevc  libMtkOmxVdecEx.so  16
OMX.MTK.VIDEO.DECODER.MPEG2 video_decoder.mpeg2 libMtkOmxVdecEx.so  16
OMX.MTK.VIDEO.DECODER.H263  video_decoder.h263  libMtkOmxVdecEx.so  16
OMX.MTK.VIDEO.DECODER.MPEG4 video_decoder.mpeg4 libMtkOmxVdecEx.so  16
OMX.MTK.VIDEO.DECODER.AVC   video_decoder.avc   libMtkOmxVdecEx.so  16
OMX.MTK.VIDEO.DECODER.VPX   video_decoder.vp8   libMtkOmxVdecEx.so  16
OMX.MTK.VIDEO.DECODER.VP9   video_decoder.vp9   libMtkOmxVdecEx.so  16
OMX.MTK.VIDEO.DECODER.DIVX  video_decoder.divx  libMtkOmxVdecEx.so  16
OMX.MTK.VIDEO.DECODER.DIVX3  video_decoder.divx3 libMtkOmxVdecEx.so 16
OMX.MTK.VIDEO.DECODER.XVID  video_decoder.xvid  libMtkOmxVdecEx.so  16
OMX.MTK.VIDEO.DECODER.VC1   video_decoder.vc1   libMtkOmxVdecEx.so  16
OMX.MTK.AUDIO.DECODER.MP3   audio_decoder.mp3   libMtkOmxMp3Dec.so  32
OMX.MTK.AUDIO.DECODER.WMA   audio_decoder.wma   libMtkOmxWmaDec.so  32
OMX.MTK.VIDEO.ENCODER.AVC   video_encoder.avc   libMtkOmxVenc.so    16
OMX.MTK.VIDEO.ENCODER.HEVC  video_encoder.hevc  libMtkOmxVenc.so    16
OMX.MTK.VIDEO.ENCODER.H263  video_encoder.h263  libMtkOmxVenc.so    16
OMX.MTK.VIDEO.ENCODER.MPEG4 video_encoder.mpeg4 libMtkOmxVenc.so    16
OMX.MTK.AUDIO.DECODER.APE audio_decoder.ape libMtkOmxApeDec.so  32
OMX.MTK.AUDIO.DECODER.ADPCM.MS  audio_decoder.adpcm libMtkOmxAdpcmDec.so    32
OMX.MTK.AUDIO.DECODER.ADPCM.DVI audio_decoder.adpcm libMtkOmxAdpcmDec.so    32
OMX.MTK.AUDIO.DECODER.GSM audio_decoder.gsm libMtkOmxGsmDec.so  32
OMX.MTK.AUDIO.DECODER.ALAC audio_decoder.alac libMtkOmxAlacDec.so   32
OMX.MTK.AUDIO.DECODER.MP2   audio_decoder.mp2   libMtkOmxMp3Dec.so  32

         (2). ParseMtkCoreConfig主要是解析mtk_omx_core.cfg
                   <1>. 第一个解析为name,第二个解析为role,第三个参数解析为lib_path(库的名称),第四个解析为max_inst。也就是主要是读取文件然后把内容存在gCoreComponents(mtk_omx_comp_type)这个结构体中。lib_path就是libomx的so库,

         libomx路径:vendor/mediatek/proprietary/hardware/libomx

                 <2>. Modecodec.cpp初始化的时候调用initiateAllocateComponent,这个函数最后调用到了MtkOMXPlugin.cpp的makeComponentInstance函数,该函数调用的就是mGetHandle,也就是调用到了MtkOmxCore.cpp的Mtk_OMX_GetHandle函数,这个函数最后就是调用libomx对应得so库得MtkOmxComponentCreate函数。

6. MediaCodec设置回调

7. MediaCodec配置参数 

MtkOmxVdecEx.cpp是vendor下面的代码。

8. 设置setInputSurface流程分析 

最后调用ACodec.cpp的setupInputSurface,初始化GraphicBufferSource,部分代码如下:

 9.开始编解码

以音频为例子,往编码器输入数据和解码后输出数据,在MtkOmxAudioDecBase.cpp可知,HandleEmptyThisBuffer这个是输入数据,HandleFillThisBuffer这个是解码后输出数据,在MtkOmxAudioCommandThread线程中,是通过管道来传递数据得。

在framework层会区分是哪个得数据输入进去编码得OMXNodeInstance.cpp:

10. 解码数据流程分析

OMX_FillThisBufferOMX_EmptyThisBuffer共同完成了OMX的buffer运转。OMX_FillThisBuffer是操作解码完后数据(PCM/YUV)的,OMX_EmptyThisBuffer是操作解码前(es)数据的。

OMX_FillThisBuffer介绍:

通过ACodec.cpp的 onOutputBufferDrained函数可知,最后的数据是填充到ANativeWindow中:

 

 

OMX_EmptyThisBuffer 数据流介绍:

 

在MediaCodec.cpp的init函数中初始化BufferChannel,并且设置回调

11.数据填充

 在ACodec.cpp的allocateBuffers可以看到有输入和输出数据的填充和获取

来看下mCodec->allocateBuffersOnPort(kPortIndexOutput)数据的填充,用的是ashmem来实现匿名内存共享:

 

注:kernel的位置是kernel-4.4/drivers/misc/mediatek/videocodec/mt6771/videocodec_kernel_driver.c 

参考:

1. Android MediaPlayer整体架构源码分析 -【MediaCodec编解码器插件模块化注册和创建处理流程】【Part 1】_小白兔LHao的博客-CSDN博客_findcodecbytype

2. 【Android 10 源码】深入理解 MediaCodec configure_TYYJ-洪伟的博客-CSDN博客_native_configure

3. https://blog.csdn.net/u012430727/category_10894882.html (1中内容也在里面)

4. 编解码抽象层OpenMax简介_runafterhit的博客-CSDN博客_openmax 

5. Android MediaCodec的数据处理方式分析_Luckie stone的博客-CSDN博客

6. MediaCodec原理及使用_音视频开发老舅的博客-CSDN博客_mediacodec使用 

7. Android 音视频开发打怪升级:音视频硬解码篇(1)音视频基础知识 - 知乎 

8. OMX标准接口OMX_EmptyThisBuffer机制详解_丽萨的托马斯的博客-CSDN博客

9. OMX标准接口OMX_FillThisBuffer机制详解_丽萨的托马斯的博客-CSDN博客


http://chatgpt.dhexx.cn/article/FgDOwpVI.shtml

相关文章

MediaCodec_Analyze-3-start

MediaCodec Analyse – start Refrence: https://source.android.google.cn/devices/media 一 APK调用的核心API Android APK使用 MediaCodec API 播放音视频的简易流程&#xff1a; MediaCodec codec MediaCodec.createDecoderByType("video/avc"); MediaFormat …

mediacodec api

mediacodec api 官网&#xff1a; https://developer.android.com/reference/android/media/MediaCodec 中文&#xff1a; https://www.apiref.com/android-zh/android/media/MediaCodec.html 学习mediacodec api的使用说明&#xff0c;在android源码查看&#xff1a; andro…

MediaCodec硬解流程

一 MediaCodec概述 MediaCodec 是Android 4.1(api 16)版本引入的低层编解码接口&#xff0c;同时支持音视频的编码和解码。通常与MediaExtractor、MediaMuxer、AudioTrack结合使用&#xff0c;能够编解码诸如H.264、H.265、AAC、3gp等常见的音视频格式。MediaCodec在编解码的过…

MediaCodec_Analyze-1-create

MediaCodec Analyse – create Refrence: https://source.android.google.cn/devices/media 一 APK调用的核心API Android APK使用 MediaCodec API 播放音视频的简易流程&#xff1a; MediaCodec codec MediaCodec.createDecoderByType("video/avc"); MediaFormat…

mediacodec

MedaiCodec简介 MediaCodec是Android中提供的音视频编/解码工具。它主要是完成上层接口的封装&#xff0c;供给开发者使用&#xff0c;编解码功能实际是在native底层服务中完成的 MediaCodec工作流程 包括两个缓冲区队列 一个输入缓冲区队列&#xff0c;包含一组输入缓冲区(格…

Android MediaCodec 完全解析

MediaCodec是什么&#xff1f; MediaCodec类为开发者提供了能访问到Android底层媒体Codec&#xff08;Encoder/Decoder&#xff09;的能力&#xff0c;它是Android底层多媒体基础架构的一部分&#xff08;通常和MediaExtractor、MediaSync、MediaMuxer、MediaCrypto、MediaDrm…

Android MediaCodec解析

Android MediaCodec解析 1 引言 MediaCodec是Android平台提供的一个底层的音视频编解码框架&#xff0c;它是安卓底层多媒体基础框架的重要组成部分。它经常和 MediaExtractor, MediaSync, MediaMuxer, MediaCrypto, MediaDrm, Image, Surface, AudioTrack一起使用。解码的作…

Android原生编解码接口MediaCodec详解

作者&#xff1a;躬行之 了解了音视频的相关知识&#xff0c;可以先阅读同系列文章&#xff1a; 音视频开发基础知识音频帧、视频帧及其同步Camera2、MediaCodec录制mp4 MediaCodec 是 Android 中的编解码器组件&#xff0c;用来访问底层提供的编解码器&#xff0c;通常与 Me…

MediaCodec视频解码流程详解及参考demo

一、MediaCodec简介 MediaCodec是Android自带的底层多媒体支持架构的一部分&#xff08;通常与 MediaExtractor&#xff0c;MediaSync&#xff0c;MediaMuxer&#xff0c;MediaCrypto&#xff0c;MediaDrm&#xff0c;Image&#xff0c;Surface 和 AudioTrack 一起使用&#xf…

Android MediaCodec简单总结

#.MedaiCodec简介 MediaCodec是Android中提供的音视频编码、解码工具。它主要是完成上层接口的封装&#xff0c;提供给开发者使用&#xff0c;编解码功能实际是在native底层服务中完成的。 #.MediaCodec工作的宏观流程&#xff1a; ##.包换两个缓冲区队列 一个输入缓冲区队列&a…

软件测试面试指导之自我介绍

面试自我介绍虽然人人都准备&#xff0c;但是做到让人印象深刻可不容易啊。 本篇就具体来聊聊人人都要经历的面试&#xff0c;怎么做自我介绍&#xff0c;才能让你在面试官的眼睛里像金子一样闪闪发光&#xff1f; 面试是什么&#xff1f; 它是个机会&#xff0c;让面试官更…

软件测试面试要注意的细节以及处理(自我介绍篇)

面试问题第一问&#xff0c;95%都会是&#xff1a; 请简单的做个自我介绍吧~ 分以下几点说明。 一、个人的基本信息&#xff0c;扬长避短 1、年纪太大与太小&#xff0c;都不需要主动去说明。 比如我年纪只有21岁 例子&#xff1a;面试官您好&#xff0c;我叫***&#xff…

【软件测试】企业测试面试题9道,从自我介绍到项目考察+回答......

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、自我介绍 您好…

软件测试面试怎样介绍自己的项目?会问到什么程度?

最近收到很多粉丝的私信说找不到工作&#xff0c;简历投了百十来份&#xff0c;邀约都没几个&#xff0c;更别说offer了&#xff0c;是不是软件测试要黄了&#xff1f; 说句实话&#xff0c;现在大环境确实不好&#xff0c;互联网大厂裁员这是摆在明面上的原因。时代的一粒沙&…

软件测试面试怎样介绍自己的测试项目?会问到什么程度?

想知道面试时该怎样介绍测试项目&#xff1f;会问到什么程度&#xff1f;那就需要换位思考&#xff0c;思考HR在这个环节想知道什么。 HR在该环节普遍想获得的情报主要是下面这2个方面&#xff1a; 1&#xff09;应聘者的具体经验和技术能力&#xff0c; 2&#xff09;应聘者的…

【软件测试】面试中介绍项目你该这么说!

黑马程序员视频库 播妞微信号&#xff1a;heiniu526 传智播客旗下互联网资讯、学习资源免费分享平台 测试人员在找工作的过程中&#xff0c;通常有一个问题是很难绕开的。就是要如何向别人介绍自己之前做过的项目。下面我们就这个问题简单的做一些分析。 大体上可以分为如下几个…

软件测试面试自我介绍/项目介绍居然还有模板?我要是早点发现就好了

目录 1、自我介绍 2、项目介绍 2.1、最全电商项目介绍 2.2、电商项目介绍 2.3、在线教育项目介绍 2.4、互联网金融项目介绍 总结 1、自我介绍 以XXX简历来举例&#xff08;参照下面的案例&#xff0c;编写你的自我介绍&#xff0c;框架就是&#xff1a;我是谁&#xff0…

软件测试面试,如何自我介绍?如何介绍项目?如何介绍个人技术?(提供面试话术)

前准备不足而导致面试失败那可就亏大了&#xff01;为了提高面试成功率&#xff0c;帮助大家尽快拿到高薪offer&#xff0c;我们盘点了面试环节必问的三类问题&#xff0c;希望对即将参加软件测试面试的小伙伴们有所帮助。 01 如何自我介绍 面试过程中一定要放慢语速&#xf…

软件测试面试,如何自我介绍?

01 如何自我介绍 面试过程中一定要放慢语速&#xff0c;做到条理清晰。特别是做自我介绍时&#xff0c;可以适当多介绍自己会什么&#xff0c;有哪些重要经验。 例如&#xff1a; 面试官&#xff0c;上午/下午好。 我是XXX&#xff0c;今天来面试贵公司的软件测试工程师岗位&a…

软件测试工程师面试如何做好自我介绍?

听了很多提问者和我的学生&#xff0c;在做自我自我介绍的时候&#xff0c;一般存在的问题&#xff1a; 1、表述不太流畅。多练习表述&#xff0c;自己录音&#xff0c;听回放&#xff0c;有问题改正。 2、表述太溜&#xff0c;语速太快。不自信表现&#xff0c;隐含紧张的情绪…