本文系微信公众号和知乎专栏《MediaStack》原创文章,欢迎大家关注,随时进行交流。

    学习Codec2框架之前,首先来看一下相关目录结构,Codec2作为Android新一代多媒体框架,目的就是要取代OMX框架,所以其目录也是在framework/av/media/ 目录下,目前Android12源码中有1.0, 1.1, 1.2三个版本了。
Codec2目录下文件夹做一下简要说明:
PS:
gsm,ETSI Special Mobile Group推出的音频编解码格式,可以参考https://wiki.multimedia.cx/index.php/GSM_06.10
libgav1 -- an AV1 decoder,属于AV1编解码器的实现,之前没注意Google已经有AV1相关实现了,并且进行了开源,不过对于AV1编解码器还在积累中0。相关介绍感兴趣的同学可以参考:
https://chromium.googlesource.com/codecs/libgav1/
这两部分代码暂时没有review过,后续有时间完成阅读再更新解读文章,在此跳过。
media Codec启动
通过抓取系统log,可以看到codec2的启动是通过media.swcodec完成服务启动,并被调用的:
RC文件
RC文件作为Linux系统的重要脚本,而在Android系统中也经常被用作程序之启动脚本的文件名,所以我们要了解和学习MediaCodec服务,mediaswcodec.rc目录和文件如下:
frameworks/av/apex/mediaswcodec.rc
mediaswcodec属于main类,用户角色隶属于mediacodec,划分组别是camera, drmrpc,medaidrm,
正好手边有一台Android12的设备,所以进入系统后台,查看vendor目录下bin文件,可以看到hw相关的service,标注部分就是本次学习的重点内容codec2的服务
看相关内容,顺手进入codec2目录,查看codec2的服务启动也依赖codec2 RC文件,其相关目录和文件如下:
Android-hardware-media-c2-hal-1-2属于hal层类;用户角色同样隶属mediacodec,划分组别是camera, drmrpc,medaidrm,
这样服务在设备和代码上就对应起来了,只不过设备用的是1.1版本,而我们看的代码是codec2 1.2版本,这个差异比较可控,暂时忽略,代码仍然以1.2最新的为准。
由于mediaswcodec属于main函数,因此会有对应的service文件,也有main函数入口,如下图所示:
在CodecServcieRegistrant.cpp中完成API版本判断,以及Service的构建。
GetCodec2PlatformComponentStore完成C2compnentStore的构建,并返回;
小技巧:在设备上通过killall mediaswcodec,就会触发相关服务的重启,同时将log等级设置到最高,就可以看到相关服务启动日志了,如下:
启动过程就是上面提到的 CodecServcieRegistrant注册过程。
BP文件
知道service如何之后,也需要了解编译脚本。
而Android7开始引入的bp文件进一步提升了并行编译的速度,所以我们看代码也是从bp开始,查阅当前目录的编译依赖关系。
BP文件首先表明了apex default内容,extractor相关内容是不是看的很熟悉?不过该部分是转码相关,了解即可。
接下来是mediaswcodec相关定义,会链接libs包括libcodec2的不同版本,以及stagefright_foundation的库。
在编译之前也需要依赖其他一些脚本,配置文件,policy执行。
注意:需要说明的是bp文件很多语法描述是Android10之后引入了APEX文件的规则,APEX类型文件属于Android系统特有的内容,不作为重点,有需要了解的童鞋可以参看官网说明:
https://source.android.com/devices/tech/ota/apex?hl=zh-cn
紧接着查看codec2的BP文件,该BP文件指明Codec2的源文件,
至此Codec已经暴露到我们面前了,但是Codec2是如何和MediaCodec进行关联的呢?通过如下类图关系,应该可以比较明确了,CodecBase作为父类是上层Media Codec 服务端的类成员,用于管理具体通过ACodec还是Codec2进行框架切换。这就是接口类的好处,对于上层应用来说可以不用关心底层实现,接口不变情况下,实现无缝切换。必要时候学习一下设计模式,不要毕业一股脑还给老师了,毕竟在实际工作中有了解工厂模式的童鞋看懂别人实现有非常大的帮助,review代码都是困难事儿。
本文完成Codec2服务的启动,以及Media Codec如何进行ACodec和Codec2的框架切换,之后我们再进行Codec2框架的进一步学习。

我是一枚爱跑步的程序猿,很多内容属于自学内容,文中难免会出现一些错误或者不准确的地方,恳请大家批评指正。
继续阅读
阅读原文