6

के माध्यम से काम करने के लिए क्वालकॉम एन्कोडर्स प्राप्त करना मैं एंड्रॉइड मीडियाकोडेक एपीआई का उपयोग कर एनवी 12 स्ट्रीम के हार्डवेयर एन्कोडिंग (एवीसी) करने की कोशिश कर रहा हूं।मीडियाकोडेसी एपीआई

OMX.qcom.video.encoder.avc, संकल्प 1280x720 और 640x480 काम ठीक उपयोग करते हुए, जबकि दूसरों को (अर्थात 640x360, 320x240, 800x480) उत्पादन जहां क्रोमा घटक स्थानांतरित कर दिया लगता है उत्पादन (कृपया snapshot देखें)।

मैंने दोबारा जांच की है कि इनपुट छवि इसे जेपीईजी फ़ाइल में सहेजकर सही है। यह समस्या केवल क्वालकॉम डिवाइस (यानी सैमसंग गैलेक्सी एस 4) पर होती है।

कोई भी यह ठीक से काम कर रहा है? कोई अतिरिक्त सेटअप/quirks आवश्यक है?

+1

एंड्रॉइड 4.3 ने कुछ उपयोगी नई विशेषताएं जोड़ दीं, और सीटीएस परीक्षण भी जोड़े जो यूयूवी डेटा को 'मीडियाकोडसी' में खिलाते हैं। Http://bigflake.com/mediacodec/#EncodeDecodeTest में बफर-टू-बफर और बफर-टू-सतह परीक्षण जानकारीपूर्ण हो सकते हैं। – fadden

+1

बीटीडब्ल्यू, एंड्रॉइड-प्लेटफ़ॉर्म Google समूह में चर्चा है जो क्वालकॉम एन्कोडर्स का उल्लेख करती है: https://groups.google.com/d/msg/android-platform/awaNwgb6EbY/a-YiIOwaL0QJ टिप्पणीकर्ताओं में से एक का कहना है कि क्रोमा विमान को गठबंधन किया जाना चाहिए 2048 बाइट सीमा से, लेकिन यह केवल मेरे लिए आंशिक रूप से काम करता है। कुछ संकल्प अभी भी छोटी हैं, 176x144, उदाहरण के लिए। –

उत्तर

3

डिकोडर (मीडियाकोडेक) में इसका मीडियाफॉर्मैट है, इसे getOutputFormat का उपयोग करके प्राप्त किया जा सकता है। लौटाया गया उदाहरण लॉग करने के लिए मुद्रित किया जा सकता है। और वहां आप कुछ उपयोगी जानकारी देख सकते हैं। उदाहरण के लिए आपके केस वैल्यू जैसे "स्लाइस-ऊंचाई" उपयोगी हो सकता है। मुझे संदेह है कि यह 1280x720 और 640x480 के लिए ऊंचाई के बराबर है और अन्य संकल्पों के लिए अलग है। शायद आपको क्रोमो ऑफसेट प्राप्त करने के लिए इस मान का उपयोग करना चाहिए।

+0

एक त्वरित फिक्स के रूप में, मैंने डीकोडर के 'स्लाइस-ऊंचाई' और 'स्ट्रइड' में जो देखा, उसके अनुसार मैंने संकल्पों को बदल दिया। उदाहरण के लिए, 320x200 के बजाय 640x360 और 384x256 के बजाय 640x384। फिर यह ठीक काम किया :) धन्यवाद! – badbadboy

+0

@badbadboy क्या आपको गतिशील रूप से घुमावदार और स्लाइस की गणना करने का कोई तरीका मिला है हाइट ने क्वालकॉम एन्कोडर के लिए एक निश्चित समाधान दिया है? – dmarcato

+0

@dmarcato अभी तक उसमें नहीं देखा है .. – badbadboy

3

हाँ, OMX.qcom.video.encoder.avc ऐसा करता है लेकिन सभी डिवाइस/एंड्रॉइड संस्करण पर नहीं। Android 4.3 मेरी Nexus 4 पर एनकोडर ठीक काम करता है, लेकिन मेरी S3 (4.1 चल रहा है)

एक S3 OMX.qcom.video.encoder.avc (साथ 4.1 चलाने के लिए समाधान पर नहीं ऐसा लगता है कि कुछ S3 एक और एन्कोडर) क्रोमो फलक से ठीक पहले 1024 बाइट्स जोड़ना है।

// The encoder may need some padding before the Chroma pane 
int padding = 1024;      
if ((mWidth==640 && mHeight==480) || mWidth==1280 && mHeight==720) padding = 0; 

// Interleave the U and V channel 
System.arraycopy(buffer, 0, tmp, 0, mYSize); // Y 
for (i = 0; i < mUVSize; i++) { 
    tmp[mYSize + i*2 + padding] = buffer[mYSize + i + mUVSize]; // Cb (U) 
    tmp[mYSize + i*2+1 + padding] = buffer[mYSize + i]; // Cr (V) 
} 
return tmp; 

कैमरा YV12 और एनकोडर COLOR_FormatYUV420SemiPlanar का उपयोग कर रहा है।

आपका स्नैपशॉट दिखाती कलाकृतियों मैं था उसी तरह, आप एक ऐसी ही हैक कुछ प्रस्तावों के लिए, हो सकता है एक और गद्दी लंबाई के साथ की आवश्यकता हो सकती

तुम भी संकल्प है कि 16 की एक बहु नहीं हैं से बचना चाहिए, यहां तक ​​कि 4.3 पर स्पष्ट रूप से (http://code.google.com/p/android/issues/detail?id=37769)!

+0

मैं mYSize और mUVSize कैसे निर्धारित करूं? –