2014-04-04 8 views
7

मैं समझने की कोशिश कर रहा हूं कि हार्डवेयर डिकोडिंग के लिए मीडियाकोडैक का उपयोग कैसे किया जाता है।कैसे मीडियाकोडैक एंड्रॉइड में ढांचे के अंदर कोडेक पाता है?

एंड्रॉइड आंतरिक में मेरा ज्ञान बहुत सीमित है।

एक xml फ़ाइल जो एंड्रॉयड प्रणाली में कोडेक विवरण का प्रतिनिधित्व करता है:

यहाँ मेरी निष्कर्ष है।

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

इसका मतलब है कि हम मीडिया कोडेक के साथ जावा आवेदन से एक कोडेक बनाते हैं

MediaCodec codec = MediaCodec.createDecoderByType(type); 

यह xml फ़ाइल की मदद से संबंधित सांकेतिक शब्दों में बदलनेवाला जानने की जानी चाहिए।

मैं क्या कर रहा हूं?

मैं यह समझने की कोशिश कर रहा हूं कि कोड का कौन सा हिस्सा एक्सएमएल पढ़ रहा है और दिए गए 'प्रकार' के आधार पर कोडेक ढूंढ रहा है।

1) आवेदन परत:

MediaCodec codec = MediaCodec.createDecoderByType(type); 

2) MediaCodec.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::onAllocateComponentOMXCodec::findMatchingCodecs आह्वान MIME प्रकार फोन करने वाले से पारित कर दिया मिलान कोडेक को खोजने के लिए होगा।

  6. OMXCodec::findMatchingCodecs में, के उदाहरण को पुनर्प्राप्त करने के लिए एक कॉल है।

  7. MediaCodecList::getInstance में, कोई चेक है यदि कोई मौजूदा MediaCodecList या अन्य a new object of MediaCodecList is created है।

  8. MediaCodecList के निर्माता में, वहाँ /etc/media_codecs.xml के रूप में फ़ाइल नाम के साथ parseXMLFile के लिए एक कॉल है।

  9. parseXMLFile सामग्री को पढ़ता है और विभिन्न घटक नाम आदि को MediaCodecList में संग्रहीत करता है जिसका उपयोग किसी भी अन्य कोडेक उदाहरण के लिए भी किया जा सकता है। पार्सिंग के लिए नियोजित सहायक कार्य startElementHandler है। ब्याज का एक कार्य addMediaCodec हो सकता है।

इन चरणों का के माध्यम से, XML फ़ाइल सामग्री एक सूची है जो किसी भी अन्य मॉड्यूल के द्वारा नियोजित किया जा सकता में अनुवाद कर रहे हैं। MediaCodecListजावा परत पर भी खुलासा किया गया है जिसे here से संदर्भित किया जा सकता है।

मैंने कुछ हॉप छोड़ दिए हैं जिनमें MediaCodec और ACodec वास्तव में संवाद करने और तरीकों का आह्वान करने के लिए संदेशों को नियोजित करते हैं, लेकिन प्रस्तुत प्रवाह को अंतर्निहित तंत्र के बारे में एक अच्छा विचार देना चाहिए।

+1

प्रभावशाली गणेश !! मदद के लिए धन्यवाद। – Whoami

संबंधित मुद्दे