মাল্টিমিডিয়া টানেলিং অ্যাপ্লিকেশান কোড বা অ্যান্ড্রয়েড ফ্রেমওয়ার্ক কোড দ্বারা প্রক্রিয়া করা ছাড়াই একটি হার্ডওয়্যার ভিডিও ডিকোডারের মাধ্যমে সরাসরি একটি ডিসপ্লেতে টানেল করতে সংকুচিত ভিডিও ডেটাকে সক্ষম করে৷ অ্যান্ড্রয়েড স্ট্যাকের নীচের ডিভাইস-নির্দিষ্ট কোডটি নিম্নলিখিত ধরনের অভ্যন্তরীণ ঘড়িগুলির মধ্যে একটির সাথে ভিডিও ফ্রেম উপস্থাপনা টাইমস্ট্যাম্পের তুলনা করে ডিসপ্লেতে কোন ভিডিও ফ্রেম পাঠাতে হবে এবং কখন সেগুলি পাঠাতে হবে তা নির্ধারণ করে:
Android 5 বা উচ্চতর সংস্করণে অন-ডিমান্ড ভিডিও প্লেব্যাকের জন্য, অ্যাপ দ্বারা পাস করা অডিও উপস্থাপনা টাইমস্ট্যাম্পের সাথে সিঙ্ক্রোনাইজ করা একটি
AudioTrack
ঘড়িঅ্যান্ড্রয়েড 11 বা উচ্চতর সংস্করণে লাইভ ব্রডকাস্ট প্লেব্যাকের জন্য, একটি টিউনার দ্বারা চালিত একটি প্রোগ্রাম রেফারেন্স ক্লক (PCR) বা সিস্টেম টাইম ক্লক (STC)
পটভূমি
একটি সংকুচিত ভিডিও ফ্রেম ডিকোড করা হলে অ্যান্ড্রয়েডে প্রচলিত ভিডিও প্লেব্যাক অ্যাপটিকে অবহিত করে । অ্যাপটি তারপর ডিকোড করা ভিডিও ফ্রেমটিকে ডিকোড করা ভিডিও ফ্রেমটিকে সংশ্লিষ্ট অডিও ফ্রেমের মতো একই সিস্টেম ঘড়ির সময়ে রেন্ডার করার জন্য প্রকাশ করে , সঠিক সময় গণনা করার জন্য ঐতিহাসিক AudioTimestamps
দৃষ্টান্ত পুনরুদ্ধার করে ।
যেহেতু টানেল করা ভিডিও প্লেব্যাক অ্যাপ কোডকে বাইপাস করে এবং ভিডিওতে কাজ করে এমন প্রসেসের সংখ্যা কমায়, এটি OEM বাস্তবায়নের উপর নির্ভর করে আরও দক্ষ ভিডিও রেন্ডারিং প্রদান করতে পারে। এটি ভিডিও রেন্ডার করার জন্য অ্যান্ড্রয়েড অনুরোধের সময় এবং সত্যিকারের হার্ডওয়্যার vsyncs-এর সময়ের মধ্যে সম্ভাব্য তির্যক দ্বারা প্রবর্তিত সময়ের সমস্যাগুলি এড়িয়ে নির্বাচিত ঘড়িতে (PRC, STC, বা অডিও) আরও সঠিক ভিডিও ক্যাডেন্স এবং সিঙ্ক্রোনাইজেশন প্রদান করতে পারে। যাইহোক, টানেলিং জিপিইউ প্রভাবগুলির জন্য সমর্থন কমাতে পারে যেমন পিকচার-ইন-পিকচার (পিআইপি) উইন্ডোতে ঝাপসা বা গোলাকার কোণ, কারণ বাফারগুলি অ্যান্ড্রয়েড গ্রাফিক্স স্ট্যাককে বাইপাস করে।
নিচের চিত্রটি দেখায় কিভাবে টানেলিং ভিডিও প্লেব্যাক প্রক্রিয়াকে সহজ করে।
চিত্র 1. ঐতিহ্যগত এবং টানেলযুক্ত ভিডিও প্লেব্যাক প্রক্রিয়ার তুলনা
অ্যাপ ডেভেলপারদের জন্য
যেহেতু বেশিরভাগ অ্যাপ বিকাশকারী প্লেব্যাক বাস্তবায়নের জন্য একটি লাইব্রেরির সাথে একীভূত হয়, বেশিরভাগ ক্ষেত্রে বাস্তবায়নের জন্য শুধুমাত্র টানেল প্লেব্যাকের জন্য সেই লাইব্রেরিটি পুনরায় কনফিগার করা প্রয়োজন। একটি টানেল করা ভিডিও প্লেয়ারের নিম্ন-স্তরের বাস্তবায়নের জন্য, নিম্নলিখিত নির্দেশাবলী ব্যবহার করুন।
Android 5 বা উচ্চতর সংস্করণে অন-ডিমান্ড ভিডিও প্লেব্যাকের জন্য:
একটি
SurfaceView
উদাহরণ তৈরি করুন।একটি
audioSessionId
উদাহরণ তৈরি করুন।২য় ধাপে তৈরি
audioSessionId
উদাহরণ দিয়েAudioTrack
এবংMediaCodec
দৃষ্টান্ত তৈরি করুন।অডিও ডেটাতে প্রথম অডিও ফ্রেমের জন্য উপস্থাপনা টাইমস্ট্যাম্প সহ
AudioTrack
ট্র্যাকে অডিও ডেটা সারিবদ্ধ করুন৷
Android 11 বা উচ্চতর সংস্করণে লাইভ সম্প্রচার প্লেব্যাকের জন্য:
একটি
SurfaceView
উদাহরণ তৈরি করুন।Tuner
থেকে একটিavSyncHwId
উদাহরণ পান।ধাপ 2 এ তৈরি
avSyncHwId
দৃষ্টান্ত সহAudioTrack
এবংMediaCodec
দৃষ্টান্ত তৈরি করুন।
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 বাস্তবায়ন নিম্নলিখিত কোড স্নিপেটে দেখানো হিসাবে OMXNodeInstance
মাধ্যমে ACodec
এ টানেল মোড কনফিগার করে:
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 সংশ্লিষ্ট কোডেক সনাক্ত করতে পারে। যদি উপাদানটি এই কনফিগারেশনটিকে সমর্থন না করে, তাহলে এটি bTunneled
এ OMX_FALSE
সেট করা উচিত।
কোডেক2
Android 11 বা উচ্চতর সংস্করণে, Codec2
টানেল প্লেব্যাক সমর্থন করে। ডিকোডার উপাদান নিম্নলিখিত সমর্থন করা উচিত:
C2PortTunneledModeTuning
কনফিগার করা, যা টানেল মোড কনফিগার করে এবং অডিও আউটপুট ডিভাইস বা টিউনার কনফিগারেশন থেকে পুনরুদ্ধার করাHW_AV_SYNC
তে পাস করে।HWC-এর জন্য সাইডব্যান্ড হ্যান্ডেল বরাদ্দ এবং পুনরুদ্ধার করতে
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 বাস্তবায়ন C2PortTunnelModeTuning
এর মাধ্যমে CCodec
এ টানেল মোড কনফিগার করে, যেমনটি নিম্নলিখিত কোড স্নিপেটে দেখানো হয়েছে:
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, ¶ms);
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-কে উপস্থাপন করে।
চিত্র 2. HWC হার্ডওয়্যার (বা কার্নেল বা ড্রাইভার) সিঙ্ক্রোনাইজার