[RK3288][Android6.0] MediaCodec初始化过程小结

Platform: Rockchip
OS: Android 6.0
Kernel: 3.10.92

MediaCodec.createEncoderByType ->    //根据mime type创建,开头以video/打头,比如h264是"video/avc"
  new MediaCodec -> MediaCodec.java
    native_setup ->
      android_media_MediaCodec_native_setup -> android_media_MediaCodec.cpp
        new JMediaCodec ->
          JMediaCodec::JMediaCodec ->
            MediaCodec::CreateByType -> MeidaCodec.cpp
               new MediaCodec
               codec->init ->
                 MediaCodec::init ->
                   new ACodec    //用mime创建的方式都会去创建一个ACodec,OMX和StageFright异步工作。
                     mCodec->setNotificationMessage(new AMessage(kWhatCodecNotify, this));
                     new AMessage(kWhatInit, this);
                     PostAndAwaitResponse ->
                       MediaCodec::onMessageReceived ->    //cmd是kWhatInit
                         setState(INITIALIZING);
                         mCodec->initiateAllocateComponent ->
                            msg->setWhat(kWhatAllocateComponent) ->
                              ACodec::UninitializedState::onMessageReceived -> Acodec.cpp
                                onAllocateComponent ->
                                  client.connect() -> OMXClient.cpp
                                    sm->getService(String16("media.player"));
                                    service->getOMX ->  //跨进程从MediaPlayer service获得omx
                                      MediaPlayerService::getOMX -> MediaPlayerService.cpp
                                        new OMX -> OMX.cpp
                                          new OMXMaster ->
                                            OMXMaster::OMXMaster -> OMXMaster.cpp
                                              addVendorPlugin ->
                                                addPlugin("libstagefrighthw.so") ->
                                                  OMXMaster::addPlugin ->
                                                    //对应函数在hardware/rockchip/librkvpu下
                                                    dlsym(mVendorLibHandle, "createOMXPlugin")
                                                      addPlugin((*createOMXPlugin)())
                                                      createOMXPlugin -> RKOMXPlugin.cpp
                                                        new RKOMXPlugin ->
                                                          RKOMXPlugin::RKOMXPlugin ->
                                                            AddCore("libOMX_Core.so"); //rk的omx库,不开源了...
                                                 addPlugin(new SoftOMXPlugin);
                                  omx = client.interface()    //客户端获得omx
                                  OMXCodec::findMatchingCodecs -> OMXCodec.cpp    //这里可以把支持的codec打印出来
                                    MediaCodecList::getInstance ->
                                      service->getCodecList ->
                                        MediaPlayerService::getCodecList -> MediaPlayerService.cpp
                                          MediaCodecList::getLocalInstance -> MediaCodecList.cpp
                                            new MediaCodecList ->
                                              //文件在vendor/rockchip/common/vpu下,用哪个文件见vpu.mk
                                              //这里对应的是vendor/rockchip/common/vpu/etc/media_codecs.xml
                                              parseTopLevelXMLFile("/etc/media_codecs.xml"); ->
                                                parseXMLFile ->
                                                  StartElementHandlerWrapper ->    //通过回调函数解析xml
                                                    static_cast(me)->startElementHandler ->
                                                      MediaCodecList::startElementHandler
                                              //对应的是vendor/rockchip/common/vpu/etc/media_codecs_performance_mpp.xml
                                              parseTopLevelXMLFile("/etc/media_codecs_performance.xml", true);
                            mCodec->changeState(mCodec->mLoadedState)    //进入mLoadedState状态
                            

总的来说就是 java层api通过jni调用stagefright的acodec,去加载rk的omx库(此部分不开源),接着去解析omx支持的编码放在了xml文件中供解析。 


参考:

MediaCodec Java API 与 StageFright


你可能感兴趣的:(子类__Codec)