मल्टीमीडिया टनलिंग

मल्टीमीडिया टनलिंग की मदद से, कंप्रेस किए गए वीडियो डेटा को हार्डवेयर के ज़रिए टनल किया जा सकता है वीडियो डिकोडर को सीधे डिसप्ले पर प्रोसेस करता है. ऐसा करने के लिए, ऐप्लिकेशन कोड या Android फ़्रेमवर्क कोड. Android स्टैक के नीचे, डिवाइस के लिए खास कोड यह तय करता है कि डिसप्ले पर कौनसे वीडियो फ़्रेम भेजने हैं और उन्हें कब भेजना है वीडियो फ़्रेम के प्रज़ेंटेशन टाइमस्टैंप की तुलना, इनमें से किसी एक से करना आंतरिक घड़ी के प्रकार:

  • Android 5 या इसके बाद के वर्शन में मांग पर वीडियो चलाने के लिए, AudioTrack ऑडियो प्रज़ेंटेशन के टाइमस्टैंप के साथ सिंक की गई घड़ी पास हो गया ऐप्लिकेशन के अंदर

  • Android 11 या उसके बाद के वर्शन में लाइव ब्रॉडकास्ट प्लेबैक के लिए, प्रोग्राम रेफ़रंस घड़ी (पीसीआर) या सिस्टम टाइम क्लॉक (एसटीसी), जो ट्यूनर

बैकग्राउंड

Android पर पारंपरिक वीडियो चलाने की सूचनाएं कंप्रेस किए गए वीडियो फ़्रेम को डिकोड करने पर, ऐप्लिकेशन. इसके बाद, ऐप्लिकेशन रिलीज़ डिसप्ले में डिकोड किया गया वीडियो फ़्रेम, जिसे एक ही सिस्टम घड़ी पर रेंडर किया जाएगा मिलते-जुलते ऑडियो फ़्रेम के तौर पर समय, पुराने डेटा को वापस लाया जा रहा है AudioTimestamps इंस्टेंस का इस्तेमाल करें.

ऐसा इसलिए होता है, क्योंकि टनल किया गया वीडियो प्लेबैक ऐप्लिकेशन कोड को बायपास कर देता है. साथ ही, वीडियो पर काम करते हैं, तो यह ज़्यादा बेहतर वीडियो रेंडरिंग दे सकता है. को लागू किया जाता है. इसकी मदद से, आपको ज़्यादा सटीक वीडियो भी मिल सकते हैं वीडियो के कॉन्टेंट को समय के साथ सिंक करें और चुनी गई घड़ी (PRC, STC या ऑडियो) के बीच तालमेल बिठाएं. Android के समय के बीच के संभावित अंतर की वजह से समय से जुड़ी समस्याएं वीडियो रेंडर करने के अनुरोधों और सही हार्डवेयर vsync के समय के बारे में बताता है. हालांकि, टनलिंग से भी जीपीयू इफ़ेक्ट के लिए सहायता कम हो सकती है, जैसे कि धुंधला करना या पिक्चर में पिक्चर (पीआईपी) विंडो में गोल कोने, क्योंकि बफ़र Android ग्राफ़िक्स स्टैक को बायपास कर सकते हैं.

नीचे दिया गया डायग्राम दिखाता है कि टनलिंग, वीडियो चलाने की प्रोसेस को कैसे आसान बनाती है.

परंपरागत और टनल मोड की तुलना

पहला डायग्राम. परंपरागत और टनल की गई वीडियो प्लेबैक प्रक्रियाओं की तुलना

ऐप्लिकेशन डेवलपर के लिए जानकारी

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

Android 5 या इसके बाद के वर्शन में मांग पर वीडियो चलाने के लिए:

  1. SurfaceView इंस्टेंस बनाएं.

  2. audioSessionId इंस्टेंस बनाएं.

  3. audioSessionId का इस्तेमाल करके, AudioTrack और MediaCodec इंस्टेंस बनाएं दूसरे चरण में बनाया गया.

  4. इस ऑडियो डेटा को AudioTrack में, प्रज़ेंटेशन के टाइमस्टैंप के साथ सूची में जोड़ें ऑडियो डेटा में पहला ऑडियो फ़्रेम शामिल करेगा.

Android 11 या इसके बाद के वर्शन में लाइव ब्रॉडकास्ट चलाने के लिए:

  1. SurfaceView इंस्टेंस बनाएं.

  2. Tuner से avSyncHwId इंस्टेंस पाएं.

  3. avSyncHwId इंस्टेंस के साथ AudioTrack और MediaCodec इंस्टेंस बनाएं में बनाया गया है.

एपीआई कॉल फ़्लो, इन कोड स्निपेट में दिखाया जाता है:

aab.setContentType(AudioAttributes.CONTENT_TYPE_MOVIE);

// configure for audio clock sync
aab.setFlag(AudioAttributes.FLAG_HW_AV_SYNC);
// or, for tuner clock sync (Android 11 or higher)
new tunerConfig = TunerConfiguration(0, avSyncId);
aab.setTunerConfiguration(tunerConfig);
if (codecName == null) {
  return FAILURE;
}

// configure for audio clock sync
mf.setInteger(MediaFormat.KEY_AUDIO_SESSION_ID, audioSessionId);
// or, for tuner clock sync (Android 11 or higher)
mf.setInteger(MediaFormat.KEY_HARDWARE_AV_SYNC_ID, avSyncId);

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

ऐसा इसलिए हुआ, क्योंकि मांग पर टनल किए गए वीडियो का प्लेबैक, AudioTrack से सीधे तौर पर जुड़ा होता है टनल किए गए वीडियो प्लेबैक का व्यवहार ऑडियो प्लेबैक के.

  • डिफ़ॉल्ट रूप से, ज़्यादातर डिवाइसों पर वीडियो फ़्रेम तब तक रेंडर नहीं होता, जब तक ऑडियो न हो प्लेबैक शुरू हो जाता है. हालांकि, हो सकता है कि पहले ऐप्लिकेशन को वीडियो फ़्रेम रेंडर करने की ज़रूरत पड़े ऑडियो चलाना शुरू करना. उदाहरण के लिए, उपयोगकर्ता को मौजूदा वीडियो दिखाना वीडियो को आगे-पीछे करें.

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

    • अगर आपको ऑडियो से पहले सूची का पहला वीडियो फ़्रेम रेंडर नहीं करना है, तो प्लेबैक शुरू होता है, तो इस पैरामीटर को 0 पर सेट करें.

    • अगर यह पैरामीटर सेट नहीं है, तो ओईएम, डिवाइस के लिए व्यवहार तय करता है.

  • जब AudioTrack को ऑडियो डेटा नहीं दिया जाता है और बफ़र खाली होते हैं (ऑडियो अंडररन), तब तक वीडियो चलना बंद हो जाता है, जब तक ज़्यादा ऑडियो डेटा तैयार नहीं हो जाता क्योंकि ऑडियो घड़ी अब बेहतर नहीं हो रही है.

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

डिवाइस बनाने वाली कंपनियों के लिए

कॉन्फ़िगरेशन

टनल किए गए वीडियो को चलाने के लिए, OEM को एक अलग वीडियो डिकोडर बनाना चाहिए. इस डिकोडर को विज्ञापन दिखाना चाहिए कि यह media_codecs.xml फ़ाइल:

<Feature name="tunneled-playback" required="true"/>

जब टनल किए गए MediaCodec इंस्टेंस को ऑडियो सेशन आईडी के साथ कॉन्फ़िगर किया जाता है, तो यह इस HW_AV_SYNC आईडी के लिए AudioFlinger क्वेरी:

if (entry.getKey().equals(MediaFormat.KEY_AUDIO_SESSION_ID)) {
    int sessionId = 0;
    try {
        sessionId = (Integer)entry.getValue();
    }
    catch (Exception e) {
        throw new IllegalArgumentException("Wrong Session ID Parameter!");
    }
    keys[i] = "audio-hw-sync";
    values[i] = AudioSystem.getAudioHwSyncForSession(sessionId);
}

इस क्वेरी के दौरान, AudioFlinger, HW_AV_SYNC आईडी को वापस लाता है प्राइमरी ऑडियो डिवाइस से लिया जाता है और इसे ऑडियो से जोड़ा जाता है सेशन आईडी:

audio_hw_device_t *dev = mPrimaryHardwareDev->hwDevice();
char *reply = dev->get_parameters(dev, AUDIO_PARAMETER_HW_AV_SYNC);
AudioParameter param = AudioParameter(String8(reply));
int hwAVSyncId;
param.getInt(String8(AUDIO_PARAMETER_HW_AV_SYNC), hwAVSyncId);

अगर AudioTrack इंस्टेंस पहले ही बना दिया गया है, तो HW_AV_SYNC आईडी यह होगा को उसी ऑडियो सेशन आईडी के साथ आउटपुट स्ट्रीम में भेजा जाता है. अगर ऐसा नहीं किया गया है अभी तक बनाया है, तो HW_AV_SYNC आईडी के दौरान आउटपुट स्ट्रीम को पास किया जाता है AudioTrack की मदद से बनाया गया. ऐसा प्लेबैक थ्रेड:

mOutput->stream->common.set_parameters(&mOutput->stream->common, AUDIO_PARAMETER_STREAM_HW_AV_SYNC, hwAVSyncId);

HW_AV_SYNC आईडी, चाहे वह किसी ऑडियो आउटपुट स्ट्रीम से जुड़ा हो या किसी Tuner कॉन्फ़िगरेशन को OMX या कोडेक 2 कॉम्पोनेंट में पास किया जाता है, ताकि OEM कोड, कोडेक को उससे जुड़े ऑडियो आउटपुट स्ट्रीम से जोड़ सकता है या ट्यूनर स्ट्रीम पर जा सकता है.

कॉम्पोनेंट कॉन्फ़िगरेशन के दौरान, OMX या कोडेक 2 कॉम्पोनेंट को साइडबैंड हैंडल, जिसका इस्तेमाल कोडेक को हार्डवेयर कंपोज़र के साथ जोड़ने के लिए किया जा सकता है (एचडब्ल्यूसी) लेयर. जब ऐप्लिकेशन किसी प्लैटफ़ॉर्म को MediaCodec से जोड़ता है, तो यह साइडबैंड हैंडल को SurfaceFlinger के ज़रिए एचडब्ल्यूसी को पास किया जाता है, जो लेयर के तौर पर साइडबैंड लेयर.

err = native_window_set_sideband_stream(nativeWindow.get(), sidebandHandle);
if (err != OK) {
  ALOGE("native_window_set_sideband_stream(%p) failed! (err %d).", sidebandHandle, err);
  return err;
}

HWT, इस सही समय पर, ऑडियो आउटपुट स्ट्रीम से सिंक हो जाता है या ट्यूनर प्रोग्राम रेफ़रंस क्लॉक से मिलता-जुलता है, जिसमें मौजूदा बफ़र सिस्टम का इस्तेमाल किया गया है और इससे बनने वाली इमेज को दिखाने के लिए किया जा सकता है. ऐसा होता है सामान्य तैयारी और सेट साइकल से अलग. कॉल तैयार करना और उन्हें सेट करना ऐसा सिर्फ़ तब होता है, जब अन्य लेयर में बदलाव होता है या जब साइडबैंड लेयर की प्रॉपर्टी में बदलाव होता है (जैसे कि पोज़िशन या साइज़) बदल जाता है.

ओएमएक्स

टनल किए गए डिकोडर कॉम्पोनेंट को इनके साथ काम करना चाहिए:

  • OMX.google.android.index.configureVideoTunnelMode को ज़्यादा समय तक सेट करने की सुविधा पैरामीटर, जो पास करने के लिए ConfigureVideoTunnelModeParams स्ट्रक्चर का इस्तेमाल करता है ऑडियो आउटपुट डिवाइस से जुड़े HW_AV_SYNC आईडी में.

  • OMX_IndexConfigAndroidTunnelPeek पैरामीटर को कॉन्फ़िगर करना, जो डिकोड किए गए पहले वीडियो फ़्रेम को रेंडर करने या न करने के लिए, भले ही क्या ऑडियो प्लेबैक शुरू हो गया है.

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

एओएसपी को लागू करने पर, टनल मोड को इसमें कॉन्फ़िगर किया जाता है ACodec के ज़रिए OMXNodeInstance जैसा कि नीचे दिए गए कोड स्निपेट में दिखाया गया है:

OMX_INDEXTYPE index;
OMX_STRING name = const_cast<OMX_STRING>(
        "OMX.google.android.index.configureVideoTunnelMode");

OMX_ERRORTYPE err = OMX_GetExtensionIndex(mHandle, name, &index);

ConfigureVideoTunnelModeParams tunnelParams;
InitOMXParams(&tunnelParams);
tunnelParams.nPortIndex = portIndex;
tunnelParams.bTunneled = tunneled;
tunnelParams.nAudioHwSync = audioHwSync;
err = OMX_SetParameter(mHandle, index, &tunnelParams);
err = OMX_GetParameter(mHandle, index, &tunnelParams);
sidebandHandle = (native_handle_t*)tunnelParams.pSidebandWindow;

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

कोडेक2

Android 11 या उसके बाद के वर्शन में, Codec2 में टनल किए गए वीडियो चलाने की सुविधा काम करती है. डिकोडर कॉम्पोनेंट में ये सुविधाएं काम करनी चाहिए:

  • C2PortTunneledModeTuning को कॉन्फ़िगर किया जा रहा है, जो टनल मोड को कॉन्फ़िगर करता है और ऑडियो आउटपुट डिवाइस से मिले HW_AV_SYNC के पास या ट्यूनर का कॉन्फ़िगरेशन ठीक करना होगा.

  • वैल्यू असाइन करने और वापस पाने के लिए, C2_PARAMKEY_OUTPUT_TUNNEL_HANDLE पर क्वेरी की जा रही है एचडब्ल्यूसी के लिए साइडबैंड हैंडल.

  • C2Work के साथ अटैच होने पर, C2_PARAMKEY_TUNNEL_HOLD_RENDER को हैंडल किया जा रहा है, जो कोडेक को काम पूरा होने के तरीके को डिकोड करने और सिग्नल देने के निर्देश देता है, लेकिन रेंडर करने के लिए नहीं आउटपुट बफ़र, 1) तक कोडेक को रेंडर करने का निर्देश दिया जाता है या 2) ऑडियो चलाना शुरू हो जाता है.

  • C2_PARAMKEY_TUNNEL_START_RENDER को हैंडल किया जा रहा है, जो कोडेक को यह निर्देश देता है इससे मार्क किया गया फ़्रेम तुरंत रेंडर होने में मदद मिलती है C2_PARAMKEY_TUNNEL_HOLD_RENDER, भले ही ऑडियो प्लेबैक शुरू न हुआ हो.

  • debug.stagefright.ccodec_delayed_params को कॉन्फ़िगर नहीं किया गया रहने दें (सुझाया गया). अगर आपने कॉन्फ़िगर करें और false पर सेट करें.

एओएसपी को लागू करने पर, टनल मोड को इसमें कॉन्फ़िगर किया जाता है CCodec से लेकर C2PortTunnelModeTuning तक, जैसा कि नीचे दिए गए कोड स्निपेट में दिखाया गया है:

if (msg->findInt32("audio-hw-sync", &tunneledPlayback->m.syncId[0])) {
    tunneledPlayback->m.syncType =
            C2PortTunneledModeTuning::Struct::sync_type_t::AUDIO_HW_SYNC;
} else if (msg->findInt32("hw-av-sync-id", &tunneledPlayback->m.syncId[0])) {
    tunneledPlayback->m.syncType =
            C2PortTunneledModeTuning::Struct::sync_type_t::HW_AV_SYNC;
} else {
    tunneledPlayback->m.syncType =
            C2PortTunneledModeTuning::Struct::sync_type_t::REALTIME;
    tunneledPlayback->setFlexCount(0);
}
c2_status_t c2err = comp->config({ tunneledPlayback.get() }, C2_MAY_BLOCK,
        failures);
std::vector<std::unique_ptr<C2Param>> params;
c2err = comp->query({}, {C2PortTunnelHandleTuning::output::PARAM_TYPE},
        C2_DONT_BLOCK, &params);
if (c2err == C2_OK && params.size() == 1u) {
    C2PortTunnelHandleTuning::output *videoTunnelSideband =
            C2PortTunnelHandleTuning::output::From(params[0].get());
    return OK;
}

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

ऑडियो एचएएल

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

struct TunnelModeSyncHeader {
  // The 32-bit data to identify the sync header (0x55550002)
  int32 syncWord;
  // The size of the audio data following the sync header before the next sync
  // header might be found.
  int32 sizeInBytes;
  // The presentation timestamp of the first audio sample following the sync
  // header.
  int64 presentationTimestamp;
  // The number of bytes to skip after the beginning of the sync header to find the
  // first audio sample (20 bytes for compressed audio, or larger for PCM, aligned
  // to the channel count and sample size).
  int32 offset;
}

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

सहायता रोकें

Android 5 या उससे पहले वाले वर्शन में, गेम को कुछ समय के लिए रोकने की सुविधा उपलब्ध नहीं है. टनल करने की सुविधा को रोका जा सकता है सिर्फ़ ऑडियो/वीडियो क्वालिटी में रुकावट आने पर, लेकिन अगर वीडियो का अंदरूनी बफ़र बड़ा है उदाहरण के लिए, OMX कॉम्पोनेंट में एक सेकंड का डेटा होता है. इसलिए, यह रुक जाता है कोई जवाब नहीं देता.

Android 5.1 या इसके बाद वाले वर्शन में, AudioFlinger सीधे तौर पर प्रोसेस करने के लिए रोकने और फिर से शुरू करने की सुविधा देता है (ट्यून किया गया) ऑडियो आउटपुट. अगर एचएएल, 'रोकें' सुविधा को लागू करता है और फिर से शुरू करता है, तो इवेंट को रोकने की अवधि को ट्रैक करें और रेज़्यूमे को एचएएल को भेज दिया जाता है.

कॉल को रोकने, फ़्लश करने, और फिर से शुरू करने के क्रम को एचएएल कॉल लागू करके लागू किया जाता है का इस्तेमाल करें.

लागू करने के सुझाव

ऑडियो एचएएल

Android 11 के लिए, पीसीआर या एसटीसी के HW सिंक आईडी का इस्तेमाल ऑडियो/वीडियो सिंक करने के लिए किया जा सकता है. इसलिए सिर्फ़ वीडियो स्ट्रीम की जा सकती है.

Android 10 या इससे पहले के वर्शन के लिए, टनल किए गए वीडियो चलाने की सुविधा देने वाले डिवाइसों में FLAG_HW_AV_SYNC और AUDIO_OUTPUT_FLAG_DIRECT अपनी audio_policy.conf फ़ाइल में फ़्लैग करता है. ये फ़्लैग का इस्तेमाल ऑडियो घड़ी से सिस्टम घड़ी सेट करने के लिए किया जाता है.

ओएमएक्स

टनल किए गए वीडियो के लिए डिवाइस मैन्युफ़ैक्चरर के पास एक अलग OMX कॉम्पोनेंट होना चाहिए प्लेबैक (मैन्युफ़ैक्चरर, दूसरी तरह के ऑडियो और वीडियो प्लेबैक, जैसे कि सुरक्षित प्लेबैक). टनल किया गया कॉम्पोनेंट होना चाहिए:

  • उसके आउटपुट पर 0 बफ़र (nBufferCountMin, nBufferCountActual) तय करें पोर्ट.

  • OMX.google.android.index.prepareForAdaptivePlayback setParameter एक्सटेंशन लागू करें.

  • media_codecs.xml फ़ाइल में इसकी क्षमताओं के बारे में बताएं और एलान करें टनल की गई प्लेबैक सुविधा है. साथ ही, फ़्रेम से जुड़ी सीमाओं की जानकारी दी जानी चाहिए साइज़, अलाइनमेंट या बिटरेट. इसका एक उदाहरण नीचे दिया गया है:

    <MediaCodec name="OMX.OEM_NAME.VIDEO.DECODER.AVC.tunneled"
    type="video/avc" >
        <Feature name="adaptive-playback" />
        <Feature name="tunneled-playback" required=”true” />
        <Limit name="size" min="32x32" max="3840x2160" />
        <Limit name="alignment" value="2x2" />
        <Limit name="bitrate" range="1-20000000" />
            ...
    </MediaCodec>
    

अगर टनल और बिना ट्यून किए गए डिकोडिंग को सपोर्ट करने के लिए, एक ही OMX कॉम्पोनेंट का इस्तेमाल किया जाता है, टनल की गई प्लेबैक सुविधा को 'ज़रूरत नहीं है' के तौर पर छोड़ देना चाहिए. सुरंगों से गुज़रने और तो नॉन टनल किए हुए डिकोडर की क्षमता में कोई अंतर नहीं होता है. इसका एक उदाहरण है नीचे दी गई जानकारी देखें:

<MediaCodec name="OMX._OEM\_NAME_.VIDEO.DECODER.AVC" type="video/avc" >
    <Feature name="adaptive-playback" />
    <Feature name="tunneled-playback" />
    <Limit name="size" min="32x32" max="3840x2160" />
    <Limit name="alignment" value="2x2" />
    <Limit name="bitrate" range="1-20000000" />
        ...
</MediaCodec>

हार्डवेयर कंपोज़र (एचडब्ल्यूसी)

जब सुरंग वाली लेयर (HWC_SIDEBAND compositionType वाली लेयर) होती है, तो डिसप्ले, लेयर का sidebandStream, साइडबैंड हैंडल है ओएमएक्स वीडियो कॉम्पोनेंट.

एचडब्ल्यूसी डिकोड किए गए वीडियो फ़्रेम (टनल किए गए ओएमएक्स कॉम्पोनेंट से) को इस तरह सिंक करता है: संबंधित ऑडियो ट्रैक (audio-hw-sync आईडी के साथ). जब नया वीडियो फ़्रेम नया हो जाता है, तो HWT उसे सभी लेयर की वर्तमान सामग्री के साथ संयोजित कर देता है जो पिछली कॉल तैयार या सेट किए जाने के दौरान मिली हो. साथ ही, उस कॉल की इमेज दिखाता हो. तैयारी या सेट कॉल सिर्फ़ तब होते हैं, जब अन्य लेयर में बदलाव होता है या जब साइडबैंड लेयर की प्रॉपर्टी (जैसे कि पोज़िशन या साइज़) बदल जाती है.

नीचे दिए गए डायग्राम में, हार्डवेयर (या कर्नेल या ड्राइवर) सिंकर, नए कंपोज़िशन के साथ वीडियो फ़्रेम (7b) को जोड़ने के लिए (7a) ऑडियो (7c) के आधार पर सही समय पर दिखाने के लिए.

ऑडियो के आधार पर वीडियो फ़्रेम को मिलाने वाला एचडब्ल्यूसी

दूसरा डायग्राम. HWT हार्डवेयर (या कर्नेल या ड्राइवर) सिंकर