¿Cómo MediaCodec encuentra el códec dentro del framework en Android?

Estoy tratando de entender cómo MediaCodec se utiliza para la decodificación de hardware.

Mi conocimiento en android interno es muy limitado.

Aquí están mis conclusiones:

Hay un archivo xml que representa los detalles del códec en el sistema android.

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

Lo que significa que si creamos un códec desde la aplicación Java con Media Codec

 MediaCodec codec = MediaCodec.createDecoderByType(type); 

Debería encontrar el codificador respectivo con la ayuda del archivo xml.

¿Qué estoy haciendo?

Estoy tratando de calcular nuestra parte del código que está leyendo xml y encontrar el códec basado en el 'tipo' dado.

1) Capa de aplicación:

  MediaCodec codec = MediaCodec.createDecoderByType(type); 

2) MediaCodec.java -> [ frameworks / base / media / java / android / media / 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) Implementación de JNI -> [ frameworks / 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 } 

Desde frameworks / 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 } 

Estoy impresionado con este flujo. Si alguien señala cómo llevarlo adelante ayudaría mucho.

Gracias.

Tomemos el flujo paso a paso.

  1. MediaCodec::CreateByType creará un nuevo objeto MediaCodec

  2. MediaCodec constructor de MediaCodec crearía un nuevo objeto ACodec y lo almacenaría como mCodec

  3. Cuando se invoca a MediaCodec::init , instruye internamente que el ACodec subyacente asigne el componente OMX través de mCodec->initiateAllocateComponent .

  4. ACodec::initiateAllocateComponent invocará onAllocateComponent

  5. ACodec::UninitializedState::onAllocateComponent invocará OMXCodec::findMatchingCodecs para encontrar los códecs que coincidan con el tipo MIME pasado de la persona que llama.

  6. En OMXCodec::findMatchingCodecs , hay una llamada para recuperar una instancia de MediaCodecList como MediaCodecList::getInstance() .

  7. En MediaCodecList::getInstance , hay una comprobación si hay una MediaCodecList existente o bien se crea un nuevo objeto de MediaCodecList .

  8. En el constructor de MediaCodecList , hay una llamada a parseXMLFile con el nombre de archivo como /etc/media_codecs.xml .

  9. parseXMLFile lee el contenido y almacena los diferentes nombres de componentes, etc en MediaCodecList que se puede utilizar para cualquier otra instancia de codec también. La función auxiliar empleada para el análisis es startElementHandler . Una función de interés podría ser addMediaCodec .

A través de estos pasos, el contenido del archivo XML se convierte en una lista que puede ser utilizada por cualquier otro módulo. MediaCodecList se expone en la capa de Java también como puede ser referido desde aquí .

He omitido algunos saltos en los que MediaCodec y ACodec emplean mensajes para comunicar e invocar realmente métodos, pero el flujo presentado debería dar una buena idea sobre el mecanismo subyacente.

  • Creación de codificador OMXCodec en modo HW
  • ¿Cómo usar la decodificación acelerada por hardware en Android?
  • Decodificación de vídeo acelerado por hardware para H.264 en android antes de Jelly Bean
  • Compatibilidad con FFmpeg para descodificación de hardware libstagefright
  • Cómo crear el archivo .s (asm) en el archivo Android.mk
  • Integración personalizada de Codecs Wrapper en Android
  • Decodificación y reproducción de vídeo en Android
  • Proxy streaming en Stagefright no funciona en algunos dispositivos
  • Cómo utilizar MediaCodec sin MediaExtractor para H264
  • Cómo crear un plugin stagefright
  • Android MediaCodec no puede descifrar archivos wma
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.