2014-04-04 7 views
7

Próbuję zrozumieć, w jaki sposób MediaCodec jest używany do dekodowania sprzętowego.W jaki sposób MediaCodec znajduje kodek wewnątrz struktury w systemie Android?

Moja wiedza na temat Androida jest bardzo ograniczona.

Oto moje wnioski:

znajduje się plik XML, który reprezentuje dane kodeka w systemie Android.

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

Co oznacza, że ​​jeśli stworzymy kodek z aplikacji Java z Media Codec

MediaCodec codec = MediaCodec.createDecoderByType(type); 

Należy dowiedzieć się odpowiedni koder z pomocą pliku xml.

Co ja robię?

Próbuję dowiedzieć się, która część kodu czyta xml i znaleźć kodek na podstawie danego "typu".

1) Zastosowanie warstwy:

MediaCodec codec = MediaCodec.createDecoderByType(type); 

2) MediaCodec.java -> [ramy/zasada/nośnik/Java/Android/nośnik/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 Wykonanie -> [ram/base/media/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 
} 

z ramami/Base/media/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 
    } 

uderza mnie z tego przepływu. Jeśli ktoś wskaże, jak to zrobić, bardzo by pomógł.

dzięki.

Odpowiedz

9

Weźmy przepływ krok po kroku.

  1. MediaCodec::CreateByType stworzy nowy MediaCodec obiektowi

  2. MediaCodec konstruktora stworzy nowy ACodec obiekt i zapisać go jako mCodec

  3. Kiedy MediaCodec::init jest wywoływana, to wewnętrznie instruuje bazowego ACodec przeznaczyć komponent OMX przez mCodec->initiateAllocateComponent.

  4. ACodec::initiateAllocateComponent byłoby powołać onAllocateComponent

  5. ACodec::UninitializedState::onAllocateComponent byłoby powołać OMXCodec::findMatchingCodecs znaleźć kodeki pasujących typ MIME przekazywany z rozmówcą.

  6. W OMXCodec::findMatchingCodecs jest wywołanie pobierania instancji MediaCodecList jako MediaCodecList::getInstance().

  7. W MediaCodecList::getInstance, jest sprawdzenie, czy istnieje istniejąca MediaCodecList albo a new object of MediaCodecList is created.

  8. W konstruktorze MediaCodecList jest wywołanie parseXMLFile o nazwie pliku jako /etc/media_codecs.xml.

  9. odczytuje zawartość i przechowuje różne nazwy składników itp. W MediaCodecList, które mogą być używane również w innych instancjach kodeków. Funkcja pomocnicza użyta do analizowania to startElementHandler. Interesującą funkcją może być addMediaCodec.

Poprzez te kroki, zawartość pliku XML przeliczane są na liście, które mogą być zastosowane przez inny moduł. MediaCodecList jest narażony na działanie warstwy Java, która może być określona od here.

Pominąłem kilka przeskoków, w których MediaCodec i ACodec stosują komunikaty do faktycznego komunikowania się i wywoływania metod, ale przedstawiony przepływ powinien dać dobre pojęcie na temat mechanizmu leżącego u jego podstaw.

+1

Imponująca Ganesh !!. Dzięki za pomoc. – Whoami

Powiązane problemy