概述
OMX Codec是stagefrightplayer中负责解码的模块。由于遵循openmax接口规范,因此结构稍微有点负责,这里就依照awesomeplayer中的调用顺序来介绍。
主要分如下几步:
- 1 mClient->connect
- 2 InitAudioDecoder & InitVideoDecoder
- 3 消息通信机制模型的介绍
- 4 解码过程介绍
先看下类图
这里OMX Codec是以service的方式提供服务的。Awesomeplayer中通过mOmx(IOMX) 作为客户端通过binder方式与OMX 通信完成解码的工作。
源码分析主要结构
与Android其他API类似,MediaCodec主要分为API、JNI、Native、Server四个部分。
本文主要分析其API、JNI、Native三部分的结构,也就是在客户进程中运行的代码。
MediaCodec源码的主要结构如下:
应用代码编写时使用的是java层MediaCodec的接口。这里主要是通过JNI调用Native代码。
进入JNI代码后,主要与JMediaCodec打交道,JMediaCodec负责调用MediaCodec(c++)的方法。
在MediaCodec(c++)和ACodec中包含了解码器(客户端)的主要逻辑。最后ACodec作为MediaCodec与OMX的桥梁,负责调用OMX服务端的功能。
接下来分别看下JMediaCodec,MediaCodec,ACodec和OMXClient的主要结构。
JMediaCodec
JMediaCodec的定义中主要的两个字段:
struct JMediaCodec : public AHandler {
//……
private:
sp<ALooper> mLooper; //mLooper->setName("MediaCodec_looper");
sp<MediaCodec> mCodec;//MediaCodec::CreateByType/CreateByComponentName
//……
};
sp是Android源码中的智能指针的概念,通过引用计数自动回收内存
mCodec是MediaCodec(c++)的实例。mLooper用于MediaCodec(c++,下文如无特别说明MediaCodec均指c++中的MediaCodec类)的事件循环。这两个字段在构造函数中初始化.
MediaCodec
MediaCodec定义中,主要看3个字段:
struct MediaCodec : public AHandler {//AHandler::onMessageReceived
//……
private:
State mState;
sp<ALooper> mLooper;
sp<CodecBase> mCodec;
//……
}
这里的mLooper就是上面JMediaCodec的mLooper,mCodec是ACodec(ACodec继承CodecBase)
看下初始化过程(有简化):
//CreateByType与CreateByComponentName类似
sp<MediaCodec> MediaCodec::CreateByComponentName(
const sp<ALooper> &looper, const char *name, status_t *err) {
sp<MediaCodec> codec = new MediaCodec(looper);
const status_t ret = codec->init(name, false /* nameIsType */, false /* encoder */);
if (err != NULL) {
*err