HEVC फ़ॉर्मैट पर काम न करने वाले ऐप्लिकेशन के लिए मीडिया ट्रांसकोडिंग

Android 12 में मीडिया ट्रांसकोडिंग की सुविधा जोड़ी गई थी. इसकी मदद से, डिवाइसों पर वीडियो कैप्चर करने के लिए, ज़्यादा आधुनिक और स्टोरेज बचाने वाले मीडिया फ़ॉर्मैट इस्तेमाल किए जा सकते हैं. जैसे, HEVC. साथ ही, यह सुविधा ऐप्लिकेशन के साथ काम करती है. इस सुविधा की मदद से, डिवाइस बनाने वाली कंपनियां डिफ़ॉल्ट रूप से AVC के बजाय HEVC का इस्तेमाल कर सकती हैं. इससे वीडियो की क्वालिटी बेहतर होती है. साथ ही, स्टोरेज और बैंडविथ की ज़रूरत कम होती है. जिन डिवाइसों पर मीडिया ट्रांसकोडिंग की सुविधा काम करती है उनमें Android, HEVC या HDR जैसे फ़ॉर्मैट में रिकॉर्ड किए गए वीडियो को अपने-आप बदल सकता है. ऐसा तब होता है, जब वीडियो को ऐसे ऐप्लिकेशन से खोला जाता है जो इस फ़ॉर्मैट के साथ काम नहीं करता. हालांकि, यह सुविधा सिर्फ़ एक मिनट तक के वीडियो के लिए उपलब्ध है. इससे ऐप्लिकेशन, डिवाइस पर नए फ़ॉर्मैट में वीडियो कैप्चर किए जाने पर भी काम कर पाते हैं.

HEVC फ़ॉर्मैट पर काम न करने वाले ऐप्लिकेशन के लिए मीडिया ट्रांसकोडिंग की सुविधा डिफ़ॉल्ट रूप से बंद होती है. मीडिया ट्रांसकोडिंग का अनुरोध करने के लिए, ऐप्लिकेशन को अपनी मीडिया क्षमताओं के बारे में बताना होगा. मीडिया की सुविधाओं के बारे में बताने के बारे में ज़्यादा जानने के लिए, Android Developers साइट पर मीडिया ट्रांसकोडिंग की सुविधा के साथ काम करने वाले डिवाइस लेख पढ़ें.

यह कैसे काम करता है

HEVC फ़ॉर्मैट पर काम न करने वाले ऐप्लिकेशन के लिए मीडिया ट्रांसकोडिंग की सुविधा में दो मुख्य चीज़ें शामिल हैं:

  • मीडिया फ़्रेमवर्क में ट्रांसकोडिंग सेवाएं: ये सेवाएं, फ़ाइलों को एक फ़ॉर्मैट से दूसरे फ़ॉर्मैट में बदलती हैं. इसके लिए, हार्डवेयर का इस्तेमाल किया जाता है, ताकि कम समय में और बेहतर क्वालिटी में फ़ाइलें कन्वर्ट की जा सकें. इसमें ट्रांसकोडिंग एपीआई, ट्रांसकोडिंग सेवा, कस्टम फ़िल्टर के लिए ओईएम प्लगिन, और हार्डवेयर शामिल हैं. ज़्यादा जानकारी के लिए, आर्किटेक्चर की खास जानकारी देखें.
  • मीडिया फ़ाइलें उपलब्ध कराने वाली कंपनियों के ऐप्लिकेशन में, मीडिया फ़ाइल को कोड में बदलने की सुविधा: मीडिया फ़ाइलें उपलब्ध कराने वाली कंपनियों के ऐप्लिकेशन में मौजूद यह कॉम्पोनेंट, मीडिया फ़ाइलों को ऐक्सेस करने वाले ऐप्लिकेशन को इंटरसेप्ट करता है. साथ ही, ऐप्लिकेशन की बताई गई क्षमताओं के आधार पर, ओरिजनल फ़ाइल या कोड में बदली गई फ़ाइल उपलब्ध कराता है. अगर कोई ऐप्लिकेशन मीडिया फ़ाइल के फ़ॉर्मैट के साथ काम करता है, तो उसे खास तौर पर हैंडल करने की ज़रूरत नहीं होती. अगर कोई ऐप्लिकेशन इस फ़ॉर्मैट के साथ काम नहीं करता है, तो फ़्रेमवर्क फ़ाइल को पुराने फ़ॉर्मैट में बदल देता है. जैसे, जब ऐप्लिकेशन फ़ाइल को ऐक्सेस करता है, तब उसे एवीसी में बदल देता है.

पहली इमेज में, मीडिया ट्रांसकोडिंग की प्रोसेस के बारे में खास जानकारी दिखाई गई है.

HEVC फ़ॉर्मैट पर काम न करने वाले ऐप्लिकेशन के लिए मीडिया ट्रांसकोडिंग

पहली इमेज. HEVC फ़ॉर्मैट पर काम न करने वाले ऐप्लिकेशन के लिए मीडिया ट्रांसकोडिंग के बारे में खास जानकारी.

इस्तेमाल किए जा सकने वाले फ़ॉर्मैट

HEVC फ़ॉर्मैट पर काम न करने वाले ऐप्लिकेशन के लिए मीडिया ट्रांसकोडिंग की सुविधा, इन फ़ॉर्मैट में कन्वर्ज़न के साथ काम करती है:

  • HEVC (8-बिट) से AVC: कोडेक कन्वर्ज़न, एक mediacodec डिकोडर और एक mediacode एन्कोडर को कनेक्ट करके किए जाते हैं.
  • HDR10+ (10-बिट) से AVC (एसडीआर): एचडीआर से एसडीआर में बदलने की प्रोसेस, mediacodec इंस्टेंस और वेंडर प्लगिन का इस्तेमाल करके की जाती है. यह प्लगिन, डिकोडर इंस्टेंस में हुक करता है. ज़्यादा जानकारी के लिए, एचडीआर से एसडीआर में एन्कोड करना लेख पढ़ें.

इस्तेमाल किए जा सकने वाले कॉन्टेंट सोर्स

मीडिया ट्रांसकोडिंग की सुविधा, डिवाइस पर जनरेट किए गए मीडिया के साथ काम करती है. यह मीडिया, ओईएम के नेटिव कैमरा ऐप्लिकेशन से जनरेट किया जाता है. साथ ही, इसे प्राइमरी बाहरी वॉल्यूम में मौजूद DCIM/Camera/ फ़ोल्डर में सेव किया जाता है. यह सुविधा, सेकंडरी स्टोरेज में मौजूद मीडिया के साथ काम नहीं करती. ईमेल या एसडी कार्ड के ज़रिए डिवाइसों पर भेजे गए कॉन्टेंट को ऐक्सेस नहीं किया जा सकता.

ऐप्लिकेशन, अलग-अलग फ़ाइलपाथ के आधार पर फ़ाइलें ऐक्सेस करते हैं. यहां उन फ़ाइल पाथ के बारे में बताया गया है जहां ट्रांसकोडिंग की सुविधा चालू है या इसे बायपास किया गया है:

  • ट्रांसकोडिंग की सुविधा चालू है:

    • MediaStore API के ज़रिए ऐप्लिकेशन को ऐक्सेस करना
    • Java और नेटिव कोड के साथ-साथ, डायरेक्ट फ़ाइलपाथ एपीआई के ज़रिए ऐप्लिकेशन को ऐक्सेस करना
    • Storage Access Framework (SAF) के ज़रिए ऐप्लिकेशन का ऐक्सेस
    • ओएस की शेयर शीट के इंटेंट के ज़रिए ऐप्लिकेशन को ऐक्सेस करना. (सिर्फ़ MediaStore यूआरआई)
    • फ़ोन से पीसी पर फ़ाइल ट्रांसफ़र करने के लिए MTP/PTP
  • ट्रांसकोडिंग की प्रोसेस पूरी नहीं हुई:

    • एसडी कार्ड निकालकर, डिवाइस से फ़ाइल ट्रांसफ़र करना
    • आस-पास शेयर करने की सुविधा या ब्लूटूथ ट्रांसफ़र जैसे विकल्पों का इस्तेमाल करके, एक डिवाइस से दूसरे डिवाइस में फ़ाइलें ट्रांसफ़र करना.

ट्रांसकोडिंग के लिए, पसंद के मुताबिक बनाए गए फ़ाइलपाथ जोड़ना

डिवाइस बनाने वाली कंपनियां, DCIM/ डायरेक्ट्री में मीडिया ट्रांसकोडिंग के लिए फ़ाइलपाथ जोड़ सकती हैं. हालांकि, ऐसा करना ज़रूरी नहीं है. DCIM/ डायरेक्ट्री के बाहर के किसी भी पाथ को अस्वीकार कर दिया जाता है. कैरियर की ज़रूरी शर्तों या स्थानीय नियमों का पालन करने के लिए, ऐसे फ़ाइलपाथ जोड़ने पड़ सकते हैं.

फ़ाइलपाथ जोड़ने के लिए, ट्रांसकोड पाथ रनटाइम रिसॉर्स ओवरले (आरआरओ), config_supported_transcoding_relative_paths का इस्तेमाल करें. यहां फ़ाइलपाथ जोड़ने का एक उदाहरण दिया गया है:

<string-array name="config_supported_transcoding_relative_paths" translatable="false">
    <item>DCIM/JCF/</item>
</string-array>

कॉन्फ़िगर किए गए फ़ाइलपाथ की पुष्टि करने के लिए, इनका इस्तेमाल करें:

adb shell dumpsys activity provider com.google.android.providers.media.module/com.android.providers.media.MediaProvider | head -n 20

आर्किटेक्चर की खास जानकारी

इस सेक्शन में, मीडिया ट्रांसकोडिंग की सुविधा के आर्किटेक्चर के बारे में बताया गया है.

media-transcoding-architecture

दूसरी इमेज. मीडिया ट्रांसकोडिंग का आर्किटेक्चर.

मीडिया ट्रांसकोडिंग आर्किटेक्चर में ये कॉम्पोनेंट शामिल होते हैं:

  • MediaTranscodingManager सिस्टम एपीआई: यह एक ऐसा इंटरफ़ेस है जिसकी मदद से क्लाइंट, MediaTranscoding सेवा से कम्यूनिकेट कर सकता है. MediaProvider मॉड्यूल, इस एपीआई का इस्तेमाल करता है.
  • MediaTranscodingService: यह एक नेटिव सेवा है. यह क्लाइंट कनेक्शन मैनेज करती है, ट्रांसकोडिंग के अनुरोधों को शेड्यूल करती है, और TranscodingSessions के लिए बुककीपिंग मैनेज करती है.
  • MediaTranscoder: यह एक नेटिव लाइब्रेरी है, जो ट्रांसकोडिंग करती है. यह लाइब्रेरी, मीडिया फ़्रेमवर्क एनडीके पर बनाई गई है, ताकि यह मॉड्यूल के साथ काम कर सके.

HEVC फ़ॉर्मैट पर काम न करने वाले ऐप्लिकेशन के लिए मीडिया ट्रांसकोडिंग की सुविधा, सेवा और मीडिया ट्रांसकोडर, दोनों में ट्रांसकोडिंग मेट्रिक को लॉग करती है. क्लाइंट साइड और सर्विस साइड कोड, MediaProvider मॉड्यूल में होते हैं, ताकि गड़बड़ियों को समय पर ठीक किया जा सके और अपडेट किए जा सकें.

फ़ाइल का ऐक्सेस

मीडिया ट्रांसकोडिंग की सुविधा, Filesystem in Userspace (FUSE) फ़ाइल सिस्टम पर आधारित है. इसका इस्तेमाल स्कोप किए गए स्टोरेज के लिए किया जाता है. FUSE की मदद से MediaProvider मॉड्यूल, उपयोगकर्ता स्पेस में फ़ाइल से जुड़ी कार्रवाइयों की जांच कर सकता है. साथ ही, फ़ाइलों के ऐक्सेस को इस नीति के आधार पर कंट्रोल कर सकता है कि ऐक्सेस की अनुमति देनी है, अस्वीकार करना है या डेटा छिपाना है.

जब कोई ऐप्लिकेशन किसी फ़ाइल को ऐक्सेस करने की कोशिश करता है, तो FUSE डेमॉन, ऐप्लिकेशन से फ़ाइल को पढ़ने के ऐक्सेस को इंटरसेप्ट करता है. अगर ऐप्लिकेशन नए फ़ॉर्मैट (जैसे कि HEVC) के साथ काम करता है, तो ओरिजनल फ़ाइल वापस कर दी जाती है. अगर ऐप्लिकेशन इस फ़ॉर्मैट के साथ काम नहीं करता है, तो फ़ाइल को पुराने फ़ॉर्मैट (जैसे, AVC) में ट्रांसकोड किया जाता है. अगर ट्रांसकोड किया गया वर्शन उपलब्ध है, तो उसे कैश मेमोरी से वापस लाया जाता है.

ट्रांसकोड की गई फ़ाइलों का अनुरोध करना

HEVC फ़ॉर्मैट पर काम न करने वाले ऐप्लिकेशन के लिए मीडिया ट्रांसकोडिंग की सुविधा डिफ़ॉल्ट रूप से बंद होती है. ऐप्लिकेशन, ट्रांसकोड की गई ऐसेट का अनुरोध इन विकल्पों का इस्तेमाल करके कर सकते हैं:

  • मेनिफ़ेस्ट फ़ाइल में, इस्तेमाल न किए जा सकने वाले फ़ॉर्मैट के बारे में बताएं. ज़्यादा जानकारी के लिए, किसी संसाधन में सुविधाओं का एलान करना और कोड में सुविधाओं का एलान करना लेख पढ़ें.
  • ऐप्लिकेशन के साथ काम करने वाले फ़्रेमवर्क की मदद से, रनटाइम में काम करने वाले फ़ॉर्मैट बंद करें. उपयोगकर्ता, सेटिंग में जाकर हर ऐप्लिकेशन के लिए भी इसे बंद कर सकते हैं.
  • openTypedAssetFileDescriptor API का इस्तेमाल करके, ऐसे फ़ॉर्मैट साफ़ तौर पर बताएं जिन्हें MediaStore के साथ इस्तेमाल नहीं किया जा सकता.

यूएसबी ट्रांसफ़र (डिवाइस से पीसी) के लिए, ट्रांसकोडिंग की सुविधा डिफ़ॉल्ट रूप से बंद होती है. हालांकि, उपयोगकर्ता यूएसबी की सेटिंग स्क्रीन में मौजूद वीडियो को एवीसी में बदलें टॉगल का इस्तेमाल करके, ट्रांसकोडिंग की सुविधा चालू कर सकते हैं. इसे तीसरे फ़िगर में दिखाया गया है.

मीडिया ट्रांसकोडिंग की सुविधा चालू करने के लिए टॉगल करें

तीसरी इमेज. यूएसबी की सेटिंग वाली स्क्रीन पर, मीडिया ट्रांसकोडिंग की सुविधा चालू करने के लिए टॉगल करें.

ट्रांसकोड की गई फ़ाइलों का अनुरोध करने से जुड़ी पाबंदियां

ट्रांसकोडिंग के अनुरोधों की वजह से, सिस्टम के संसाधनों को लंबे समय तक लॉक होने से रोकने के लिए, ट्रांसकोडिंग सेशन का अनुरोध करने वाले ऐप्लिकेशन के लिए ये सीमाएं तय की गई हैं:

  • लगातार 10 सेशन
  • कुल तीन मिनट तक चलने वाला

अगर कोई ऐप्लिकेशन इन सभी पाबंदियों का उल्लंघन करता है, तो फ़्रेमवर्क ओरिजनल फ़ाइल डिस्क्रिप्टर दिखाता है.

डिवाइस की ज़रूरी शर्तें

मीडिया ट्रांसकोडिंग की सुविधा के लिए, डिवाइसों को ये ज़रूरी शर्तें पूरी करनी होंगी:

  • डिवाइस के नेटिव कैमरा ऐप्लिकेशन पर, HEVC एन्कोडिंग की सुविधा डिफ़ॉल्ट रूप से चालू हो
  • (एचडीआर से एसडीआर में ट्रांसकोड करने की सुविधा वाले डिवाइस) डिवाइस पर एचडीआर वीडियो रिकॉर्ड करने की सुविधा उपलब्ध हो

मीडिया ट्रांसकोडिंग के लिए डिवाइस की परफ़ॉर्मेंस को बेहतर बनाने के लिए, वीडियो हार्डवेयर और स्टोरेज के रीड/राइट ऐक्सेस की परफ़ॉर्मेंस को ऑप्टिमाइज़ किया जाना चाहिए. अगर मीडिया कोडेक को 1 के बराबर प्राथमिकता के साथ कॉन्फ़िगर किया गया है, तो कोडेक को सबसे ज़्यादा थ्रूपुट पर काम करना चाहिए. हमारा सुझाव है कि ट्रांसकोडिंग की परफ़ॉर्मेंस कम से कम 200 फ़्रेम प्रति सेकंड होनी चाहिए. अपने हार्डवेयर की परफ़ॉर्मेंस की जांच करने के लिए, frameworks/av/media/libmediatranscoding/transcoder/benchmark पर मीडिया ट्रांसकोडर बेंचमार्क चलाएं.

Validation

मीडिया ट्रांसकोडिंग की सुविधा के साथ काम करने वाले डिवाइस की पुष्टि करने के लिए, ये सीटीएस टेस्ट चलाएं:

  • android.media.mediatranscoding.cts
  • android.mediaprovidertranscode.cts

मीडिया ट्रांसकोडिंग की सुविधा को ग्लोबल लेवल पर चालू करना

मीडिया ट्रांसकोडिंग फ़्रेमवर्क या ट्रांसकोडिंग की सुविधा के साथ ऐप्लिकेशन के काम करने के तरीके की जांच करने के लिए, HEVC फ़ॉर्मैट पर काम न करने वाले ऐप्लिकेशन के लिए मीडिया ट्रांसकोडिंग की सुविधा को ग्लोबल लेवल पर चालू या बंद किया जा सकता है. डेवलपर के लिए सेटिंग और टूल वाले पेज पर, सेटिंग > सिस्टम > डेवलपर > मीडिया ट्रांसकोडिंग पर जाएं. इसके बाद, ट्रांसकोडिंग की डिफ़ॉल्ट सेटिंग को बदलें टॉगल को चालू करें पर सेट करें. इसके बाद, ट्रांसकोडिंग की सुविधा चालू करें टॉगल को चालू करें या बंद करें पर सेट करें. अगर यह सेटिंग चालू है, तो मीडिया ट्रांसकोडिंग की सुविधा बैकग्राउंड में काम कर सकती है. ऐसा उन ऐप्लिकेशन के लिए होगा जिन्हें आपने डेवलप नहीं किया है.

ट्रांसकोडिंग की स्थिति देखना

टेस्टिंग के दौरान, ट्रांसकोडिंग की स्थिति देखने के लिए, इस ADB शेल कमांड का इस्तेमाल किया जा सकता है. इसमें मौजूदा और पिछले ट्रांसकोडिंग सेशन शामिल हैं:

adb shell dumpsys media.transcoding

वीडियो की अवधि की सीमा बढ़ाना

जांच के लिए, ट्रांसकोडिंग के लिए एक मिनट की वीडियो अवधि की सीमा को बढ़ाया जा सकता है. इसके लिए, यहां दिया गया निर्देश इस्तेमाल करें. इस कमांड को चलाने के बाद, डिवाइस को रीबूट करना पड़ सकता है.

adb shell device_config put storage_native_boot transcode_max_duration_ms <LARGE_NUMBER_IN_MS>

AOSP का सोर्स और रेफ़रंस

HEVC फ़ॉर्मैट पर काम न करने वाले ऐप्लिकेशन के लिए मीडिया ट्रांसकोडिंग से जुड़ा AOSP सोर्स कोड यहां दिया गया है.

एचडीआर से एसडीआर में बदलने की सुविधा

डिवाइस बनाने वाली कंपनियां, एचडीआर से एसडीआर एन्कोडिंग की सुविधा के लिए, AOSP के सैंपल Codec 2.0 फ़िल्टर प्लगिन का इस्तेमाल कर सकती हैं. यह प्लगिन /platform/frameworks/av/media/codec2/hidl/plugin/ में मौजूद है. इस सेक्शन में, फ़िल्टर प्लगिन के काम करने के तरीके, इसे लागू करने के तरीके, और इसकी जांच करने के तरीके के बारे में बताया गया है.

अगर किसी डिवाइस में ऐसा प्लगिन शामिल नहीं है जो एचडीआर को एसडीआर में कोड में बदलने की सुविधा देता है, तो एचडीआर वीडियो ऐक्सेस करने वाले ऐप्लिकेशन को ओरिजनल फ़ाइल डिसक्रिप्टर मिलता है. भले ही, मेनिफ़ेस्ट में ऐप्लिकेशन की मीडिया क्षमताओं के बारे में बताया गया हो.

यह कैसे काम करता है

इस सेक्शन में, Codec 2.0 फ़िल्टर प्लगिन के सामान्य व्यवहार के बारे में बताया गया है.

बैकग्राउंड

Android, Codec 2.0 इंटरफ़ेस और android.hardware.media.c2 एचएएल इंटरफ़ेस के बीच, अडैप्टेशन लेयर लागू करता है. यह लेयर android::hardware::media::c2 पर होती है. फ़िल्टर प्लगिन के लिए, AOSP में रैपर मैकेनिज़्म शामिल होता है. यह डिकोडर को फ़िल्टर प्लगिन के साथ रैप करता है. MediaCodec इन रैप्ड कॉम्पोनेंट को फ़िल्टर करने की सुविधाओं वाले डिकोडर के तौर पर पहचानता है.

खास जानकारी

FilterWrapper क्लास, वेंडर कोडेक लेता है और रैप किए गए कोडेक को media.c2 अडैप्टेशन लेयर पर वापस भेजता है. FilterWrapper क्लास, FilterWrapper::Plugin एपीआई के ज़रिए libc2filterplugin.so को लोड करती है. साथ ही, प्लगिन से उपलब्ध फ़िल्टर रिकॉर्ड करती है. विजेट बनाने पर, FilterWrapper सभी उपलब्ध फ़िल्टर को इंस्टैंटिएट करता है. सिर्फ़ वे फ़िल्टर शुरू होते हैं जो बफ़र में बदलाव करते हैं.

फ़िल्टर प्लगिन का आर्किटेक्चर

चौथी इमेज. फ़िल्टर प्लगिन का आर्किटेक्चर.

फ़िल्टर प्लगिन इंटरफ़ेस

FilterPlugin.h इंटरफ़ेस, फ़िल्टर दिखाने के लिए इन एपीआई को तय करता है:

  • std::shared_ptr<C2ComponentStore>getComponentStore()

    यह फ़िल्टर वाला C2ComponentStore ऑब्जेक्ट दिखाता है. यह वेंडर के Codec 2.0 के लागू किए गए वर्शन से अलग है. आम तौर पर, इस स्टोर में सिर्फ़ वे फ़िल्टर होते हैं जिनका इस्तेमाल FilterWrapper क्लास करता है.

  • bool describe(C2String name, Descriptor *desc)

    इसमें C2ComponentStore में उपलब्ध जानकारी के अलावा, फ़िल्टर के बारे में भी बताया गया है. यहां दी गई परिभाषाएं तय की गई हैं:

    • controlParam: फ़िल्टर के व्यवहार को कंट्रोल करने वाले पैरामीटर. उदाहरण के लिए, एचडीआर से एसडीआर टोन-मैपर के लिए, कंट्रोल पैरामीटर टारगेट ट्रांसफ़र फ़ंक्शन होता है.
    • affectedParams: ऐसे पैरामीटर जिन पर फ़िल्टर करने की कार्रवाइयों का असर पड़ता है. उदाहरण के लिए, एचडीआर से एसडीआर टोन-मैपर के लिए, रंग से जुड़े पैरामीटर पर असर पड़ता है.
  • bool isFilteringEnabled(const std::shared_ptr<C2ComponentInterface> &intf)

    अगर फ़िल्टर कॉम्पोनेंट बफ़र में बदलाव करता है, तो true दिखाता है. उदाहरण के लिए, अगर टारगेट ट्रांसफ़र फ़ंक्शन SDR है और इनपुट ट्रांसफ़र फ़ंक्शन HDR (HLG या PQ) है, तो टोन-मैपिंग फ़िल्टर true दिखाता है.

FilterWrapper की जानकारी

इस सेक्शन में, FilterWrapper क्लास के बारे में जानकारी दी गई है.

कॉन्टेंट बनाने के

रैप किए गए कॉम्पोनेंट में, डिकोडर और तय किए गए सभी फ़िल्टर, कॉम्पोनेंट बनाए जाने के समय ही इंस्टैंटिएट हो जाते हैं.

क्वेरी और कॉन्फ़िगरेशन

रैप किया गया कॉम्पोनेंट, फ़िल्टर के ब्यौरे के हिसाब से, क्वेरी या कॉन्फ़िगरेशन के अनुरोधों से आने वाले पैरामीटर को अलग करता है. उदाहरण के लिए, फ़िल्टर कंट्रोल पैरामीटर का कॉन्फ़िगरेशन, उससे जुड़े फ़िल्टर पर भेज दिया जाता है. साथ ही, फ़िल्टर से जुड़े पैरामीटर, क्वेरी में मौजूद होते हैं. ऐसा इसलिए होता है, ताकि उन डिकोडर से न पढ़ा जाए जिनमें पैरामीटर पर असर नहीं पड़ा है.

क्वेरी और कॉन्फ़िगरेशन

पांचवीं इमेज. क्वेरी और कॉन्फ़िगरेशन.

शुरू करें

शुरुआत में, रैप किया गया कॉम्पोनेंट, डिकोडर और बफ़र में बदलाव करने वाले सभी फ़िल्टर शुरू करता है. अगर कोई फ़िल्टर चालू नहीं है, तो रैप किया गया कॉम्पोनेंट, डिकोडर और पास-थ्रू बफ़र शुरू करता है. साथ ही, डिकोडर को ही कमांड भेजता है.

बफ़र मैनेज करना

बफ़र मैनेज करना

छठी इमेज. बफ़र को मैनेज करना.

रैप किए गए डिकोडर में कतार में लगे बफ़र, ओरिजनल डिकोडर में चले जाते हैं. रैप्ड कॉम्पोनेंट, onWorkDone_nb() कॉलबैक के ज़रिए डिकोडर से आउटपुट बफ़र लेता है. इसके बाद, उसे फ़िल्टर के लिए कतार में लगाता है. आखिरी फ़िल्टर से मिला फ़ाइनल आउटपुट बफ़र, क्लाइंट को भेजा जाता है.

बफ़र हैंडलिंग की इस सुविधा के काम करने के लिए, रैप किए गए कॉम्पोनेंट को आखिरी फ़िल्टर के लिए C2PortBlockPoolsTuning कॉन्फ़िगर करना होगा, ताकि फ़्रेमवर्क, बफ़र को अनुमानित ब्लॉक पूल से आउटपुट कर सके.

बंद करें, रीसेट करें, और छोड़ें

स्टॉप पर, रैप किया गया कॉम्पोनेंट, डिकोडर और चालू किए गए सभी फ़िल्टर को बंद कर देता है. रीसेट और रिलीज़ करने पर, सभी कॉम्पोनेंट रीसेट या रिलीज़ हो जाते हैं. इससे कोई फ़र्क़ नहीं पड़ता कि वे चालू हैं या नहीं.

फ़िल्टर प्लगिन का सैंपल लागू करना

प्लगिन चालू करने के लिए, यह तरीका अपनाएं:

  1. लाइब्रेरी में FilterPlugin इंटरफ़ेस लागू करें और इसे /vendor/lib[64]/libc2filterplugin.so. पर छोड़ें
  2. अगर ज़रूरी हो, तो mediacodec.te को अतिरिक्त अनुमतियां दें.
  3. ऐडैप्टेशन लेयर को Android 12 पर अपडेट करें और media.c2 सेवा को फिर से बनाएं.

प्लगिन की जांच करना

सैंपल प्लगिन को आज़माने के लिए, यह तरीका अपनाएं:

  1. डिवाइस को फिर से बनाएं और फ़्लैश करें.
  2. इस कमांड का इस्तेमाल करके, सैंपल प्लगिन बनाएं:

    m sample-codec2-filter-plugin
    
  3. डिवाइस को फिर से माउंट करें और वेंडर प्लगिन का नाम बदलें, ताकि कोडेक सेवा उसे पहचान सके.

    adb root
    adb remount
    adb reboot
    adb wait-for-device
    adb root
    adb remount
    adb
    push /out/target/<...>/lib64/sample-codec2-filter-plugin.so \
    
    /vendor/lib64/libc2filterplugin.so
    adb push
    /out/target/<...>/lib/sample-codec2-filter-plugin.so \
    
    /vendor/lib/libc2filterplugin.so
    adb reboot