1、2MediaCodecList::getInstance通过getLocalInstance构造获取MediaCodecList。
2、14C2SoftAvcEncFactory::createComponentC2SoftAvcEncFactory创建C2SoftAvcEnc,我们这里看软编码。
3、4MediaCodecList构造函数遍历所有builders,调用它的buildMediaCodecList,一般buildMediaCodecList会调用MediaCodecListWriter::findMediaCodecInfo而findMediaCodecInfo则会将MediaCodecInfo信息存储到MediaCodecListWriter最后会调用writer.writeCodecInfos(&mCodecInfos)将所有write里面的信息存储到mCodecInfos变量中所以可以看出来mCodecInfos最终有哪些数据取决于构造函数入参GetBuilders(),我们来看下GetBuilders()的实现,详见?
4、13GoldfishComponentStore::ComponentModule::createComponent调用mComponentFactory的createComponent,这里的mComponentFactory是在ComponentModule的init的时候构建的,ComponentModule的init会传入一个lib库,然后动态加载lib库,搜索CreateCodec2Factory方法来进行Factory构造,所以如果想要实现一个编解码算法,只需要按照一个固定的写法,然后编译成一个lib库,在这里添加支持即可。
5、1MediaCodecList::findMatchingCodecs
6、12GoldfishComponentStore::createComponent找到对应的ComponentModule,调用ComponentModule::createComponent
7、1MediaCodec.createDecoderByType调用createDecoderByType创建MediaCodec,调用MediaCodec的构造函数,我们type传入的是Htype就是name。
8、11Codec2Client::CreateComponentByName遍历所有IComponentStoreservice,通过组件名称创建组件。
9、2MediaCodec构造函数构造函数调用一个重载构造函数,主要是构造了一个EventHandler,然后调用native_setup初始化native的MediaCodec。
10、4JMediaCodec构造函数这里会构造一个ALooper,这个的功能类似于Looper。通过MediaCodec::CreateByType创建一个Native层的MediaCodec。
11、9CCodec::onMessageReceived调用allocate处理消息。
12、3MediaCodecList::getLocalInstance构造MediaCodecList,参数通过GetBuilders获取。
13、5MediaCodec::CreateByType调用一个重载CreateByType。CreateByType会通过findMatchingCodecs根据名字查找对应的Codec的名字,返回的列表存储在了matchingCodecs。遍历matchingCodecs,创建MediaCodec,然后初始化MediaCodec,初始化成功后就返回。
14、10CCodec::allocateCodec2框架有一个Codec2Client,而Codec2Client会访问hal层,这里Codec2Client组件会有多个service,例如V4L2ComponentStore里面会对应V4L2驱动,提供硬编解码组件,而GoldfishComponentStore提供软编解码组件。同时会更新CCodec的状态到ALLOCATING。创建组件后,会通过config->initialize初始化编解码配置,例如编解码的宽高。
15、7MediaCodec::onMessageReceived这里是一个中间层,将init消息转发到CodecBase去。我们这里来跟踪CCodec,调用CCodec到initiateAllocateComponent方法。
16、8CCodec::initiateAllocateComponent发出kWhatAllocate消息。
17、5GetBuilders构建OMXbuild和Codec2InfoBuilder。每个builder会支持一系列的编码类型。Codec2是AndroidQ引入的,而之前使用的是OMX。Codec2相比于OMX,状态更加简化。
18、6MediaCodec::init除了初始化ResourceManager,通过mGetCodecInfo查找CodecInfo,然后根据CodecInfo和name,使用mGetCodecBase创建实际的Codec,比如CCodec活着ACodec。后续发送kWhatInit给ALooper来进行初始化。
19、3native_setup通过jni调用native_setup。构造了一个JMediaCodec,每个java层的MediaCodec在native侧会对应一个JMediaCodec,后续还会创建一个native层的MediaCodec。注册了消息监听。setMediaCodec回调java层记录JMediaCodec的地址。
20、1MediaCodec::GetCodecBase可以看出来,这里只会返回两种Codec,一种是ACodec,一种是CCodec。CCodec配合Codec2使用,而ACodec配置OMX使用,我们来看新一些的架构CCOdec。