মাল্টিমিডিয়া টানেলিং

সেভ করা পৃষ্ঠা গুছিয়ে রাখতে 'সংগ্রহ' ব্যবহার করুন আপনার পছন্দ অনুযায়ী কন্টেন্ট সেভ করুন ও সঠিক বিভাগে রাখুন।

মাল্টিমিডিয়া টানেলিং অ্যাপ্লিকেশান কোড বা অ্যান্ড্রয়েড ফ্রেমওয়ার্ক কোড দ্বারা প্রক্রিয়া করা ছাড়াই একটি হার্ডওয়্যার ভিডিও ডিকোডারের মাধ্যমে সরাসরি একটি ডিসপ্লেতে টানেল করতে সংকুচিত ভিডিও ডেটাকে সক্ষম করে৷ অ্যান্ড্রয়েড স্ট্যাকের নীচের ডিভাইস-নির্দিষ্ট কোডটি নিম্নলিখিত ধরনের অভ্যন্তরীণ ঘড়িগুলির মধ্যে একটির সাথে ভিডিও ফ্রেম উপস্থাপনা টাইমস্ট্যাম্পের তুলনা করে ডিসপ্লেতে কোন ভিডিও ফ্রেম পাঠাতে হবে এবং কখন সেগুলি পাঠাতে হবে তা নির্ধারণ করে:

  • Android 5 বা উচ্চতর সংস্করণে অন-ডিমান্ড ভিডিও প্লেব্যাকের জন্য, অ্যাপ দ্বারা পাস করা অডিও উপস্থাপনা টাইমস্ট্যাম্পের সাথে সিঙ্ক্রোনাইজ করা একটি AudioTrack ঘড়ি

  • অ্যান্ড্রয়েড 11 বা উচ্চতর সংস্করণে লাইভ ব্রডকাস্ট প্লেব্যাকের জন্য, একটি টিউনার দ্বারা চালিত একটি প্রোগ্রাম রেফারেন্স ক্লক (PCR) বা সিস্টেম টাইম ক্লক (STC)

পটভূমি

একটি সংকুচিত ভিডিও ফ্রেম ডিকোড করা হলে অ্যান্ড্রয়েডে প্রচলিত ভিডিও প্লেব্যাক অ্যাপটিকে অবহিত করে। অ্যাপটি তারপর ডিকোড করা ভিডিও ফ্রেমটিকে ডিকোড করা ভিডিও ফ্রেমটিকে সংশ্লিষ্ট অডিও ফ্রেমের মতো একই সিস্টেম ঘড়ির সময়ে রেন্ডার করার জন্য প্রকাশ করে, সঠিক সময় গণনা করার জন্য ঐতিহাসিক অডিও AudioTimestamps দৃষ্টান্ত পুনরুদ্ধার করে।

যেহেতু টানেল করা ভিডিও প্লেব্যাক অ্যাপ কোডকে বাইপাস করে এবং ভিডিওতে কাজ করে এমন প্রসেসের সংখ্যা কমায়, এটি OEM বাস্তবায়নের উপর নির্ভর করে আরও দক্ষ ভিডিও রেন্ডারিং প্রদান করতে পারে। এটি ভিডিও রেন্ডার করার জন্য Android অনুরোধের সময় এবং সত্যিকারের হার্ডওয়্যার vsyncs-এর সময়গুলির মধ্যে সম্ভাব্য তির্যক দ্বারা প্রবর্তিত সময়ের সমস্যাগুলি এড়িয়ে নির্বাচিত ঘড়িতে (PRC, STC, বা অডিও) আরও সঠিক ভিডিও ক্যাডেন্স এবং সিঙ্ক্রোনাইজেশন প্রদান করতে পারে। যাইহোক, টানেলিং জিপিইউ প্রভাবগুলির জন্য সমর্থন কমাতে পারে যেমন পিকচার-ইন-পিকচার (পিআইপি) উইন্ডোতে ঝাপসা বা গোলাকার কোণ, কারণ বাফারগুলি অ্যান্ড্রয়েড গ্রাফিক্স স্ট্যাককে বাইপাস করে।

নিচের চিত্রটি দেখায় কিভাবে টানেলিং ভিডিও প্লেব্যাক প্রক্রিয়াকে সহজ করে।

ঐতিহ্য এবং টানেল মোড তুলনা

চিত্র 1. ঐতিহ্যগত এবং টানেলযুক্ত ভিডিও প্লেব্যাক প্রক্রিয়ার তুলনা

অ্যাপ ডেভেলপারদের জন্য

যেহেতু বেশিরভাগ অ্যাপ বিকাশকারী প্লেব্যাক বাস্তবায়নের জন্য একটি লাইব্রেরির সাথে একীভূত হয়, বেশিরভাগ ক্ষেত্রে বাস্তবায়নের জন্য শুধুমাত্র টানেল প্লেব্যাকের জন্য সেই লাইব্রেরিটি পুনরায় কনফিগার করা প্রয়োজন। একটি টানেল করা ভিডিও প্লেয়ারের নিম্ন-স্তরের বাস্তবায়নের জন্য, নিম্নলিখিত নির্দেশাবলী ব্যবহার করুন।

Android 5 বা উচ্চতর সংস্করণে অন-ডিমান্ড ভিডিও প্লেব্যাকের জন্য:

  1. একটি SurfaceView উদাহরণ তৈরি করুন।

  2. একটি audioSessionId উদাহরণ তৈরি করুন।

  3. ২য় ধাপে তৈরি audioSessionId উদাহরণ দিয়ে AudioTrack এবং MediaCodec দৃষ্টান্ত তৈরি করুন।

  4. অডিও ডেটাতে প্রথম অডিও ফ্রেমের জন্য উপস্থাপনা টাইমস্ট্যাম্প সহ অডিও AudioTrack অডিও ডেটা সারিবদ্ধ করুন৷

Android 11 বা উচ্চতর সংস্করণে লাইভ সম্প্রচার প্লেব্যাকের জন্য:

  1. একটি SurfaceView উদাহরণ তৈরি করুন।

  2. Tuner থেকে একটি avSyncHwId উদাহরণ পান।

  3. ধাপ 2 এ তৈরি MediaCodec দৃষ্টান্ত সহ AudioTrack এবং avSyncHwId দৃষ্টান্ত তৈরি করুন।

API কল ফ্লো নিম্নলিখিত কোড স্নিপেটগুলিতে দেখানো হয়েছে:

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 এ সেট করুন। যখন সংকুচিত ভিডিও ফ্রেমগুলি সারিতে পুনরায় সাজানো হয় (যেমন যখন B-ফ্রেম উপস্থিত থাকে), এর অর্থ হল প্রথম প্রদর্শিত ভিডিও ফ্রেমটি সর্বদা একটি আই-ফ্রেম হওয়া উচিত।

    • আপনি যদি অডিও প্লেব্যাক শুরু না হওয়া পর্যন্ত প্রথম সারিবদ্ধ ভিডিও ফ্রেমটি রেন্ডার করতে না চান তবে এই প্যারামিটারটি 0 এ সেট করুন।

    • এই প্যারামিটার সেট না থাকলে, OEM ডিভাইসের আচরণ নির্ধারণ করে।

  • যখন অডিও ট্র্যাকে অডিও ডেটা সরবরাহ করা হয় না এবং AudioTrack খালি থাকে (অডিও আন্ডাররান), তখন আরও অডিও ডেটা লেখা না হওয়া পর্যন্ত ভিডিও প্লেব্যাক স্টল থাকে কারণ অডিও ঘড়ি আর অগ্রসর হয় না।

  • প্লেব্যাকের সময়, অডিও উপস্থাপনা টাইমস্ট্যাম্পে দেখা যেতে পারে যেগুলির জন্য অ্যাপটি সংশোধন করতে পারে না। যখন এটি ঘটে, 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 আইডি একই অডিও সেশন আইডি সহ আউটপুট স্ট্রীমে পাস করা হয়। যদি এটি এখনও তৈরি না হয়ে থাকে, তাহলে AudioTrack তৈরির সময় HW_AV_SYNC আইডি আউটপুট স্ট্রীমে পাস করা হয়। এটি প্লেব্যাক থ্রেড দ্বারা করা হয়:

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

HW_AV_SYNC আইডি, এটি একটি অডিও আউটপুট স্ট্রীম বা একটি Tuner কনফিগারেশনের সাথে সম্পর্কিত হোক না কেন, OMX বা Codec2 উপাদানে পাস করা হয় যাতে OEM কোড কোডেকটিকে সংশ্লিষ্ট অডিও আউটপুট স্ট্রীম বা টিউনার স্ট্রিমের সাথে সংযুক্ত করতে পারে৷

কম্পোনেন্ট কনফিগারেশনের সময়, OMX বা Codec2 কম্পোনেন্ট একটি সাইডব্যান্ড হ্যান্ডেল ফেরত দেবে যা কোডেককে হার্ডওয়্যার কম্পোজার (HWC) লেয়ারের সাথে সংযুক্ত করতে ব্যবহার করা যেতে পারে। যখন অ্যাপটি MediaCodec এর সাথে একটি পৃষ্ঠকে সংযুক্ত করে, তখন এই সাইডব্যান্ড হ্যান্ডেলটি SurfaceFlinger এর মাধ্যমে HWC-তে পাঠানো হয়, যা স্তরটিকে সাইডব্যান্ড স্তর হিসাবে কনফিগার করে৷

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;
}

HWC উপযুক্ত সময়ে কোডেক আউটপুট থেকে নতুন ইমেজ বাফার প্রাপ্তির জন্য দায়ী, হয় সংশ্লিষ্ট অডিও আউটপুট স্ট্রীম বা টিউনার প্রোগ্রাম রেফারেন্স ক্লকের সাথে সিঙ্ক্রোনাইজ করা, অন্যান্য স্তরের বর্তমান বিষয়বস্তুর সাথে বাফারগুলিকে সংমিশ্রণ করা, এবং ফলস্বরূপ চিত্র প্রদর্শন করা। এটি স্বাভাবিক প্রস্তুতি এবং সেট চক্রের স্বাধীনভাবে ঘটে। প্রস্তুত এবং সেট কলগুলি তখনই ঘটে যখন অন্যান্য স্তরগুলি পরিবর্তিত হয়, বা যখন সাইডব্যান্ড স্তরের বৈশিষ্ট্যগুলি (যেমন অবস্থান বা আকার) পরিবর্তিত হয়৷

OMX

একটি টানেল ডিকোডার উপাদান নিম্নলিখিত সমর্থন করা উচিত:

  • OMX.google.android.index.configureVideoTunnelMode এক্সটেন্ডেড প্যারামিটার সেট করা, যা অডিও আউটপুট ডিভাইসের সাথে যুক্ত HW_AV_SYNC আইডি পাস করতে ConfigureVideoTunnelModeParams কাঠামো ব্যবহার করে।

  • OMX_IndexConfigAndroidTunnelPeek প্যারামিটার কনফিগার করা যা কোডেককে প্রথম ডিকোড করা ভিডিও ফ্রেম রেন্ডার করতে বা না করতে বলে, অডিও প্লেব্যাক শুরু হয়েছে কিনা তা নির্বিশেষে।

  • OMX_EventOnFirstTunnelFrameReady ইভেন্ট পাঠানো হচ্ছে যখন প্রথম টানেল করা ভিডিও ফ্রেমটি ডিকোড করা হয়েছে এবং রেন্ডার করার জন্য প্রস্তুত।

AOSP বাস্তবায়ন নিম্নলিখিত কোড স্নিপেটে দেখানো হিসাবে 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 সদস্যের মাধ্যমে ফেরত দেবে যাতে HWC সংশ্লিষ্ট কোডেক সনাক্ত করতে পারে। যদি উপাদানটি এই কনফিগারেশনটিকে সমর্থন না করে, তাহলে এটি bTunneledOMX_FALSE সেট করা উচিত।

কোডেক2

Android 11 বা উচ্চতর সংস্করণে, Codec2 টানেল প্লেব্যাক সমর্থন করে। ডিকোডার উপাদান নিম্নলিখিত সমর্থন করা উচিত:

  • C2PortTunneledModeTuning কনফিগার করা, যা টানেল মোড কনফিগার করে এবং অডিও আউটপুট ডিভাইস বা টিউনার কনফিগারেশন থেকে পুনরুদ্ধার করা HW_AV_SYNC পাস করে।

  • C2_PARAMKEY_OUTPUT_TUNNEL_HANDLE এর জন্য সাইডব্যান্ড হ্যান্ডেল বরাদ্দ এবং পুনরুদ্ধার করতে C2_PARAMKEY_OUTPUT_TUNNEL_HANDLE কে জিজ্ঞাসা করা হচ্ছে।

  • C2_PARAMKEY_TUNNEL_HOLD_RENDER হ্যান্ডলিং যখন একটি C2Work এর সাথে সংযুক্ত থাকে, যা কোডেককে ডিকোড করার নির্দেশ দেয় এবং কাজ সমাপ্তির সংকেত দেয়, কিন্তু আউটপুট বাফার রেন্ডার না করা পর্যন্ত 1) কোডেককে পরে এটি রেন্ডার করার নির্দেশ দেওয়া হয় বা 2) অডিও প্লেব্যাক শুরু হয়।

  • C2_PARAMKEY_TUNNEL_START_RENDER হ্যান্ডলিং, যা অডিও প্লেব্যাক শুরু না হলেও, C2_PARAMKEY_TUNNEL_HOLD_RENDER দিয়ে চিহ্নিত ফ্রেমটিকে অবিলম্বে রেন্ডার করার জন্য কোডেককে নির্দেশ দেয়৷

  • debug.stagefright.ccodec_delayed_params করে রাখুন (প্রস্তাবিত)। আপনি যদি এটি কনফিগার করেন, তাহলে false সেট করুন।

AOSP বাস্তবায়ন 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 এর মাধ্যমে এটিকে ফেরত দেবে যাতে HWC সংশ্লিষ্ট কোডেক সনাক্ত করতে পারে।

অডিও HAL

অন-ডিমান্ড ভিডিও প্লেব্যাকের জন্য, অডিও HAL অডিও ডেটার সাথে বড়-এন্ডিয়ান ফরম্যাটে অডিও ডেটার সাথে ইনলাইনে অডিও প্রেজেন্টেশন টাইমস্ট্যাম্প পায় যা অ্যাপটি লিখেছে অডিও ডেটার প্রতিটি ব্লকের শুরুতে পাওয়া একটি হেডারের মধ্যে:

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;
}

HWC-এর জন্য ভিডিও ফ্রেমগুলিকে সংশ্লিষ্ট অডিও ফ্রেমের সাথে সিঙ্কে রেন্ডার করার জন্য, অডিও HAL-এর উচিত সিঙ্ক হেডার পার্স করা এবং অডিও রেন্ডারিংয়ের সাথে প্লেব্যাক ঘড়ি পুনরায় সিঙ্ক্রোনাইজ করতে উপস্থাপনা টাইমস্ট্যাম্প ব্যবহার করা উচিত। সংকুচিত অডিও চালানোর সময় পুনরায় সিঙ্ক্রোনাইজ করতে, অডিও HAL এর প্লেব্যাকের সময়কাল নির্ধারণ করতে সংকুচিত অডিও ডেটার ভিতরে মেটাডেটা পার্স করতে হতে পারে।

সমর্থন বিরতি

অ্যান্ড্রয়েড 5 বা তার নিচের সংস্করণে বিরতি সমর্থন অন্তর্ভুক্ত নেই। আপনি শুধুমাত্র A/V অনাহারে টানেল করা প্লেব্যাককে বিরতি দিতে পারেন, কিন্তু যদি ভিডিওর জন্য অভ্যন্তরীণ বাফার বড় হয় (উদাহরণস্বরূপ, OMX কম্পোনেন্টে এক সেকেন্ড ডেটা থাকে), তাহলে এটি পজকে অপ্রতিক্রিয়াশীল দেখায়।

অ্যান্ড্রয়েড 5.1 বা উচ্চতর সংস্করণে, AudioFlinger সরাসরি (টানেলযুক্ত) অডিও আউটপুটগুলির জন্য বিরতি এবং পুনরায় শুরু সমর্থন করে। এইচএএল যদি বিরতি এবং পুনঃসূচনা প্রয়োগ করে, ট্র্যাক পজ এবং সারসংকলন এইচএএল-এ ফরোয়ার্ড করা হয়।

প্লেব্যাক থ্রেডে (অফলোডের মতো) HAL কলগুলি সম্পাদন করে বিরতি, ফ্লাশ, রিজুমে কল সিকোয়েন্সকে সম্মান করা হয়।

বাস্তবায়নের পরামর্শ

অডিও HAL

Android 11-এর জন্য, PCR বা STC থেকে HW সিঙ্ক আইডি A/V সিঙ্কের জন্য ব্যবহার করা যেতে পারে, তাই শুধুমাত্র ভিডিও স্ট্রিম সমর্থিত।

অ্যান্ড্রয়েড 10 বা তার নিচের জন্য, টানেল করা ভিডিও প্লেব্যাক সমর্থনকারী ডিভাইসগুলির audio_policy.conf ফাইলে FLAG_HW_AV_SYNC এবং AUDIO_OUTPUT_FLAG_DIRECT ফ্ল্যাগ সহ অন্তত একটি অডিও আউটপুট স্ট্রিম প্রোফাইল থাকা উচিত। এই পতাকাগুলি অডিও ঘড়ি থেকে সিস্টেম ঘড়ি সেট করতে ব্যবহৃত হয়।

OMX

ডিভাইস নির্মাতাদের টানেল করা ভিডিও প্লেব্যাকের জন্য একটি পৃথক OMX উপাদান থাকা উচিত (নির্মাতারা অন্যান্য ধরনের অডিও এবং ভিডিও প্লেব্যাকের জন্য অতিরিক্ত 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)

যখন একটি ডিসপ্লেতে একটি টানেল লেয়ার ( HWC_SIDEBAND compositionType সহ একটি স্তর) থাকে, তখন লেয়ারটির sidebandStream হল OMX ভিডিও কম্পোনেন্ট দ্বারা বরাদ্দ করা সাইডব্যান্ড হ্যান্ডেল।

HWC ডিকোড করা ভিডিও ফ্রেমগুলিকে (টানেল করা OMX উপাদান থেকে) সংশ্লিষ্ট অডিও ট্র্যাকে ( audio-hw-sync আইডি সহ) সিঙ্ক্রোনাইজ করে। যখন একটি নতুন ভিডিও ফ্রেম বর্তমান হয়ে যায়, HWC এটিকে শেষ প্রস্তুত বা সেট কলের সময় প্রাপ্ত সমস্ত স্তরের বর্তমান বিষয়বস্তুর সাথে সংমিশ্রণ করে এবং ফলস্বরূপ চিত্রটি প্রদর্শন করে। প্রস্তুত বা সেট কলগুলি তখনই ঘটে যখন অন্যান্য স্তরগুলি পরিবর্তিত হয়, বা যখন সাইডব্যান্ড স্তরের বৈশিষ্ট্যগুলি (যেমন অবস্থান বা আকার) পরিবর্তিত হয়৷

নিম্নলিখিত চিত্রটি অডিও (7c) এর উপর ভিত্তি করে সঠিক সময়ে প্রদর্শনের জন্য ভিডিও ফ্রেম (7b) এর সাথে সর্বশেষ রচনা (7a) একত্রিত করতে হার্ডওয়্যার (বা কার্নেল বা ড্রাইভার) সিঙ্ক্রোনাইজারের সাথে কাজ করা HWC-কে উপস্থাপন করে।

HWC অডিওর উপর ভিত্তি করে ভিডিও ফ্রেমের সমন্বয়

চিত্র 2. HWC হার্ডওয়্যার (বা কার্নেল বা ড্রাইভার) সিঙ্ক্রোনাইজার