2014-04-04 70 views
7

我想了解MediaCodec如何用於硬件解碼。MediaCodec如何在Android框架內找到編解碼器?

我在android內部的知識非常有限。

這裏是我的發現:

有代表在Android系統的編解碼器詳細信息的XML文件。

device/ti/omap3evm/media_codecs.xml for an example. 

這意味着,如果我們創建Java應用程序的編解碼器與媒體編解碼器

MediaCodec codec = MediaCodec.createDecoderByType(type); 

應該找出與xml文件的幫助下各自的編碼器。

我在做什麼?

我試圖找出我們的這部分代碼正在讀取XML和查找基於給定的「類型」的編解碼器。

1)應用層:

MediaCodec codec = MediaCodec.createDecoderByType(type); 

2)MediaCodec.java - > [框架/鹼/媒體/ JAVA /機器人/媒體/ MediaCodec.java]

 public static MediaCodec createDecoderByType(String type) { 

    return new MediaCodec(type, true /* nameIsType */, false /* encoder */); 
} 

3 )

private MediaCodec(
     String name, boolean nameIsType, boolean encoder) { 
    native_setup(name, nameIsType, encoder); --> JNI Call. 
} 

4) JNI實現 - > [框架/基/媒體/ JNI/android_media_MediaCodec.cpp]

static void android_media_MediaCodec_native_setup (..) { 
     ....... 
    const char *tmp = env->GetStringUTFChars(name, NULL); 
    sp<JMediaCodec> codec = new JMediaCodec(env, thiz, tmp, nameIsType, encoder);  ---> Here 
} 

從框架/基/媒體/ JNI/android_media_MediaCodec.cpp

JMediaCodec::JMediaCodec(..) { 
     .... 
      mCodec = MediaCodec::CreateByType(mLooper, name, encoder); //Call goes to libstagefright 
      .... } 


    sp<MediaCodec> MediaCodec::CreateByType(
      const sp<ALooper> &looper, const char *mime, bool encoder) { 
     sp<MediaCodec> codec = new MediaCodec(looper); 
     if (codec->init(mime, true /* nameIsType */, encoder) != OK) { --> HERE. 
      return NULL; 
     }  
    return codec; 
    } 



    status_t MediaCodec::init(const char *name, bool nameIsType, bool encoder) { 
      // MediaCodec 
    } 

我觸動了這個流程。如果有人指出如何採取這種做法會有很大幫助。

謝謝。

回答

9

讓我們一步一步來看流程。

  1. MediaCodec::CreateByType將創建一個新MediaCodec對象

  2. MediaCodec構造將創建一個新ACodec對象並將其存儲爲mCodec

  3. 當調用MediaCodec::init,它在內部指示底層ACodec分配OMX組件通過mCodec->initiateAllocateComponent

  4. ACodec::initiateAllocateComponent將調用onAllocateComponent

  5. ACodec::UninitializedState::onAllocateComponent將調用OMXCodec::findMatchingCodecs找到匹配MIME類型從調用者傳遞的編解碼器。

  6. OMXCodec::findMatchingCodecs中,有一個調用來檢索MediaCodecList的實例爲MediaCodecList::getInstance()

  7. MediaCodecList::getInstance中,檢查是否存在MediaCodecLista new object of MediaCodecList is created

  8. MediaCodecList的構造函數中,有一個parseXMLFile的調用,文件名爲/etc/media_codecs.xml

  9. parseXMLFile讀取內容並將不同的組件名稱等存儲到MediaCodecList中,它們也可用於任何其他編解碼器實例。用於解析的幫助函數是startElementHandler。感興趣的功能可以是addMediaCodec

通過這些步驟,在XML文件內容被轉換成可通過任何其它模塊中採用的列表。 MediaCodecList也暴露於Java層,因爲可以從here中引用。

我已經跳過了幾步,其中MediaCodecACodec使用消息來實際傳達和調用方法,但是所呈現的流程應該提供有關底層機制的好主意。

+1

令人印象深刻的Ganesh !!。感謝幫助。 – Whoami

相關問題