টিউনার ফ্রেমওয়ার্ক

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

Tuner এবং Android CAS-এর মধ্যেকার প্রমিত ইন্টারফেসের ফলে Tuner ও CAS বিক্রেতাদের মধ্যে দ্রুততর সমন্বয় সাধিত হয়। Android TV-এর জন্য একটি বিশ্বব্যাপী সমাধান তৈরি করতে Tuner ইন্টারফেসটি MediaCodec এবং AudioTrack সাথে কাজ করে। Tuner ইন্টারফেসটি প্রধান সম্প্রচার মানগুলির উপর ভিত্তি করে ডিজিটাল টিভি এবং অ্যানালগ টিভি উভয়কেই সমর্থন করে।

উপাদান

অ্যান্ড্রয়েড ১১-এর জন্য তিনটি উপাদান বিশেষভাবে টিভি প্ল্যাটফর্মের জন্য ডিজাইন করা হয়েছে।

  • টিউনার এইচএএল: ফ্রেমওয়ার্ক এবং ভেন্ডরদের মধ্যে একটি ইন্টারফেস
  • টিউনার এসডিকে এপিআই: ফ্রেমওয়ার্ক এবং অ্যাপগুলির মধ্যে একটি ইন্টারফেস
  • টিউনার রিসোর্স ম্যানেজার (TRM): টিউনার হার্ডওয়্যার রিসোর্সসমূহের সমন্বয় সাধন করে।

অ্যান্ড্রয়েড ১১-এর জন্য নিম্নলিখিত উপাদানগুলো উন্নত করা হয়েছে।

  • CAS V2
  • TvInputService বা টিভি ইনপুট সার্ভিস (TIS)
  • TvInputManagerService বা টিভি ইনপুট ম্যানেজার সার্ভিস (TIMS)
  • MediaCodec বা মিডিয়া কোডেক
  • AudioTrack বা অডিও ট্র্যাক
  • MediaResourceManager রিসোর্স ম্যানেজার (MRM)

টিউনার ফ্রেমওয়ার্কের উপাদানগুলোর ফ্লো ডায়াগ্রাম।

চিত্র ১. অ্যান্ড্রয়েড টিভির উপাদানগুলোর মধ্যে পারস্পরিক ক্রিয়া

বৈশিষ্ট্য

ফ্রন্টএন্ড নিচের ডিটিভি স্ট্যান্ডার্ডগুলো সমর্থন করে।

  • ATSC
  • ATSC3
  • ডিভিবি সি/এস/টি
  • আইএসডিবি এস/এস৩/টি
  • অ্যানালগ

Tuner HAL 1.1 বা তার উচ্চতর সংস্করণসহ Android 12-এর ফ্রন্টএন্ড নিম্নোক্ত DTV স্ট্যান্ডার্ড সমর্থন করে।

  • ডিটিএমবি

ডিমাক্স নিচের স্ট্রিম প্রোটোকলগুলো সমর্থন করে।

  • পরিবহন প্রবাহ (TS)
  • MPEG মিডিয়া পরিবহন প্রোটোকল (MMTP)
  • ইন্টারনেট প্রোটোকল (আইপি)
  • টাইপ দৈর্ঘ্য মান (TLV)
  • ATSC লিঙ্ক-স্তর প্রোটোকল (ALP)

Descrambler নিম্নোক্ত বিষয়বস্তু সুরক্ষাগুলো সমর্থন করে।

  • সুরক্ষিত মিডিয়া পথ
  • পরিষ্কার মিডিয়া পথ
  • স্থানীয় রেকর্ড সুরক্ষিত করুন
  • নিরাপদ স্থানীয় প্লেব্যাক

টিউনার এপিআইগুলো নিম্নোক্ত ব্যবহারের ক্ষেত্রগুলো সমর্থন করে।

  • স্ক্যান
  • সরাসরি
  • প্লেব্যাক
  • রেকর্ড

Tuner, MediaCodec , এবং AudioTrack নিচের ডেটা ফ্লো মোডগুলো সমর্থন করে।

  • পরিষ্কার মেমরি বাফার সহ ES পেলোড
  • নিরাপদ মেমরি হ্যান্ডেল সহ ES পেলোড
  • পাসথ্রু

সামগ্রিক নকশা

অ্যান্ড্রয়েড ফ্রেমওয়ার্ক এবং বিক্রেতার হার্ডওয়্যারের মধ্যে টিউনার এইচএএল (Tuner HAL) সংজ্ঞায়িত করা হয়।

  • ফ্রেমওয়ার্কটি ভেন্ডরের কাছ থেকে কী প্রত্যাশা করে এবং ভেন্ডর কীভাবে তা করতে পারে, তা বর্ণনা করে।
  • IFrontend , IDemux , IDescrambler , IFilter , IDvr , এবং ILnb ইন্টারফেসগুলোর মাধ্যমে ফ্রন্টএন্ড, ডিমাক্স এবং ডিসক্র্যাম্বলারের কার্যকারিতাগুলো ফ্রেমওয়ার্কে রপ্তানি করে।
  • এতে Tuner HAL-কে MediaCodec এবং AudioTrack এর মতো অন্যান্য ফ্রেমওয়ার্ক কম্পোনেন্টের সাথে ইন্টিগ্রেট করার ফাংশন অন্তর্ভুক্ত রয়েছে।

একটি Tuner জাভা ক্লাস এবং একটি নেটিভ ক্লাস তৈরি করা হয়েছে।

  • Tuner Java API অ্যাপগুলিকে পাবলিক API-এর মাধ্যমে Tuner HAL অ্যাক্সেস করার সুযোগ দেয়।
  • নেটিভ ক্লাসটি টিউনার এইচএএল (Tuner HAL)-এর মাধ্যমে অনুমতি নিয়ন্ত্রণ এবং বিপুল পরিমাণ রেকর্ডিং বা প্লেব্যাক ডেটা পরিচালনা করার সুযোগ দেয়।
  • নেটিভ টিউনার মডিউল হলো টিউনার জাভা ক্লাস এবং টিউনার এইচএএল-এর মধ্যে একটি সেতুবন্ধন।

একটি TRM ক্লাস তৈরি করা হয়েছে।

  • টিভি ইনপুট HAL থেকে ফ্রন্টএন্ড, LNB, CAS সেশন এবং একটি টিভি ইনপুট ডিভাইসের মতো সীমিত টিউনার রিসোর্স পরিচালনা করে।
  • অ্যাপ থেকে অপর্যাপ্ত রিসোর্স পুনরুদ্ধার করার জন্য নিয়ম প্রয়োগ করে। ডিফল্ট নিয়মটি হলো ফোরগ্রাউন্ড উইন।

মিডিয়া সিএএস এবং সিএএস এইচএএল নিম্নোক্ত বৈশিষ্ট্যগুলো দ্বারা উন্নত করা হয়েছে।

  • বিভিন্ন ব্যবহার ও অ্যালগরিদমের জন্য CAS সেশন খোলে।
  • ডায়নামিক সিএএস সিস্টেম সমর্থন করে, যেমন সিআইসিএএম অপসারণ এবং সংযোজন।
  • কী টোকেন প্রদানের মাধ্যমে টিউনার এইচএএল-এর সাথে সংযুক্ত হয়।

MediaCodec এবং AudioTrack নিম্নোক্ত বৈশিষ্ট্যগুলো দ্বারা উন্নত করা হয়েছে।

  • কন্টেন্ট ইনপুট হিসেবে সুরক্ষিত অডিও-ভিডিও মেমরি গ্রহণ করে।
  • টানেলড প্লেব্যাকে হার্ডওয়্যার এ/ভি সিঙ্ক করার জন্য কনফিগার করা হয়েছে।
  • ES_payload এবং passthrough মোডের জন্য সমর্থন কনফিগার করা হয়েছে।

Tuner HAL-এর সামগ্রিক নকশা।

চিত্র ২. টিউনার এইচএএল-এর অভ্যন্তরীণ উপাদানগুলোর ডায়াগ্রাম।

সামগ্রিক কর্মপ্রবাহ

নিচের ডায়াগ্রামগুলোতে লাইভ ব্রডকাস্ট প্লেব্যাকের জন্য কল সিকোয়েন্সগুলো দেখানো হয়েছে।

সেটআপ

লাইভ সম্প্রচার প্লেব্যাক ডায়াগ্রামের সেটআপ ক্রম।

চিত্র ৩. সরাসরি সম্প্রচার প্লেব্যাকের জন্য সেটআপ ক্রম

অডিও/ভিডিও পরিচালনা

সরাসরি সম্প্রচার প্লেব্যাকের জন্য অডিও-ভিডিও পরিচালনার ডায়াগ্রাম।

চিত্র ৪. সরাসরি সম্প্রচার প্লেব্যাকের জন্য অডিও-ভিডিও পরিচালনা।

এলোমেলো বিষয়বস্তু পরিচালনা করা

লাইভ সম্প্রচার প্লেব্যাকের জন্য স্ক্র্যাম্বল করা কন্টেন্ট পরিচালনার ডায়াগ্রাম।

চিত্র ৫. সরাসরি সম্প্রচারের জন্য স্ক্র্যাম্বল করা বিষয়বস্তু পরিচালনা

অডিও/ভিডিও ডেটা প্রক্রিয়াকরণ

সরাসরি সম্প্রচার প্লেব্যাক ডায়াগ্রামের জন্য অডিও/ভিডিও ডেটা প্রসেস করুন।

চিত্র ৬. সরাসরি সম্প্রচার প্লেব্যাকের জন্য অডিও-ভিডিও প্রক্রিয়াকরণ

টিউনার এসডিকে এপিআই

Tuner SDK API, Tuner JNI, Tuner HAL এবং TunerResourceManager সাথে মিথস্ক্রিয়া পরিচালনা করে। TIS অ্যাপটি Tuner রিসোর্স এবং ফিল্টার ও ডেসক্র্যাম্বলারের মতো সাবকম্পোনেন্টগুলো অ্যাক্সেস করার জন্য Tuner SDK API ব্যবহার করে। ফ্রন্টএন্ড এবং ডিমাক্স হলো অভ্যন্তরীণ কম্পোনেন্ট।

Tuner SDK API-এর ফ্লো ডায়াগ্রাম।

চিত্র ৭. টিউনার এসডিকে এপিআই-এর সাথে মিথস্ক্রিয়া

সংস্করণ

অ্যান্ড্রয়েড ১২ থেকে, Tuner SDK API, Tuner HAL 1.1-এ একটি নতুন ফিচার সমর্থন করে, যা Tuner 1.0-এর একটি ব্যাকওয়ার্ড-কম্প্যাটিবল ভার্সন আপগ্রেড।

চলমান HAL সংস্করণটি পরীক্ষা করতে নিম্নলিখিত API ব্যবহার করুন।

  • android.media.tv.tuner.TunerVersionChecker.getTunerVersion()

নতুন অ্যান্ড্রয়েড ১২ এপিআই-এর ডকুমেন্টেশনে ন্যূনতম প্রয়োজনীয় এইচএএল সংস্করণটি পাওয়া যাবে।

প্যাকেজ

Tuner SDK API নিম্নোক্ত চারটি প্যাকেজ প্রদান করে।

  • android.media.tv.tuner
  • android.media.tv.tuner.frontend
  • android.media.tv.tuner.filter
  • android.media.tv.tuner.dvr

Tuner SDK API প্যাকেজগুলোর ফ্লো ডায়াগ্রাম।

চিত্র ৮. টিউনার এসডিকে এপিআই প্যাকেজসমূহ

Android.media.tv.tuner

Tuner প্যাকেজটি হলো Tuner ফ্রেমওয়ার্ক ব্যবহারের একটি প্রবেশপথ। TIS অ্যাপটি প্রাথমিক সেটিং এবং কলব্যাক নির্দিষ্ট করার মাধ্যমে রিসোর্স ইনস্ট্যান্সসমূহকে ইনিশিয়ালাইজ ও অ্যাকোয়ার করতে এই প্যাকেজটি ব্যবহার করে।

  • tuner() : useCase এবং sessionId প্যারামিটার উল্লেখ করে একটি Tuner ইনস্ট্যান্স শুরু করে।
  • tune() : FrontendSetting প্যারামিটারটি উল্লেখ করে একটি ফ্রন্টএন্ড রিসোর্স অধিগ্রহণ করে এবং টিউন করে।
  • openFilter() : ফিল্টারের ধরন নির্দিষ্ট করে একটি ফিল্টার ইনস্ট্যান্স গ্রহণ করে।
  • openDvrRecorder() : বাফার সাইজ নির্দিষ্ট করে একটি রেকর্ডিং ইনস্ট্যান্স গ্রহণ করে।
  • openDvrPlayback() : বাফার সাইজ নির্দিষ্ট করে একটি প্লেব্যাক ইনস্ট্যান্স গ্রহণ করে।
  • openDescrambler() : একটি ডেসক্র্যাম্বলার ইনস্ট্যান্স গ্রহণ করে।
  • openLnb() : একটি অভ্যন্তরীণ LNB ইনস্ট্যান্স গ্রহণ করে।
  • openLnbByName() : একটি বাহ্যিক LNB ইনস্ট্যান্স অধিগ্রহণ করে।
  • openTimeFilter() : একটি টাইম ফিল্টার ইনস্ট্যান্স গ্রহণ করে।

Tuner প্যাকেজটি এমন কিছু কার্যকারিতা প্রদান করে যা filter, DVR, এবং frontend প্যাকেজগুলোর আওতাভুক্ত নয়। কার্যকারিতাগুলো নিচে তালিকাভুক্ত করা হলো।

  • cancelTuning
  • scan / cancelScanning
  • getAvSyncHwId
  • getAvSyncTime
  • connectCiCam1 / disconnectCiCam
  • shareFrontendFromTuner
  • updateResourcePriority
  • setOnTuneEventListener
  • setResourceLostListener

Android.media.tv.tuner.frontend

ফ্রন্টএন্ড প্যাকেজটিতে ফ্রন্টএন্ড-সম্পর্কিত সেটিংস, তথ্য, স্ট্যাটাস, ইভেন্ট এবং ক্যাপাবিলিটিগুলোর সংগ্রহ অন্তর্ভুক্ত রয়েছে।

ক্লাস

নিচের ক্লাসগুলোর মাধ্যমে বিভিন্ন ডিটিভি স্ট্যান্ডার্ডের জন্য FrontendSettings নির্ধারণ করা হয়।

  • AnalogFrontendSettings
  • Atsc3FrontendSettings
  • AtscFrontendSettings
  • DvbcFrontendSettings
  • DvbsFrontendSettings
  • DvbtFrontendSettings
  • Isdbs3FrontendSettings
  • IsdbsFrontendSettings
  • IsdbtFrontendSettings

অ্যান্ড্রয়েড ১২ এবং টিউনার এইচএএল ১.১ বা তার উচ্চতর সংস্করণ থেকে নিম্নলিখিত ডিটিভি স্ট্যান্ডার্ডটি সমর্থিত।

  • DtmbFrontendSettings

বিভিন্ন ডিটিভি স্ট্যান্ডার্ডের জন্য FrontendCapabilities নিচের ক্লাসগুলোর মাধ্যমে নির্ধারণ করা হয়।

  • AnalogFrontendCapabilities
  • Atsc3FrontendCapabilities
  • AtscFrontendCapabilities
  • DvbcFrontendCapabilities
  • DvbsFrontendCapabilities
  • DvbtFrontendCapabilities
  • Isdbs3FrontendCapabilities
  • IsdbsFrontendCapabilities
  • IsdbtFrontendCapabilities

অ্যান্ড্রয়েড ১২ এবং টিউনার এইচএএল ১.১ বা তার উচ্চতর সংস্করণ থেকে নিম্নলিখিত ডিটিভি স্ট্যান্ডার্ডটি সমর্থিত।

  • DtmbFrontendCapabilities

FrontendInfo ফ্রন্টএন্ডের তথ্য সংগ্রহ করে। FrontendStatus ফ্রন্টএন্ডের বর্তমান অবস্থা সংগ্রহ করে। OnTuneEventListener ফ্রন্টএন্ডের ইভেন্টগুলো শোনে। TIS অ্যাপটি ফ্রন্টএন্ড থেকে আসা স্ক্যান বার্তাগুলো প্রসেস করার জন্য ScanCallback ব্যবহার করে।

চ্যানেল স্ক্যান

একটি টিভি সেট আপ করার জন্য, অ্যাপটি সম্ভাব্য ফ্রিকোয়েন্সিগুলো স্ক্যান করে এবং ব্যবহারকারীদের ব্যবহারের জন্য একটি চ্যানেল লাইনআপ তৈরি করে। চ্যানেল স্ক্যানিং সম্পন্ন করতে TIS, Tuner.tune , Tuner.scan(BLIND_SCAN) , অথবা Tuner.scan(AUTO_SCAN) ব্যবহার করতে পারে।

যদি TIS-এর কাছে সিগন্যালটির সঠিক ডেলিভারি তথ্য, যেমন ফ্রিকোয়েন্সি, স্ট্যান্ডার্ড (উদাহরণস্বরূপ, T/T2, S/S2), এবং অতিরিক্ত প্রয়োজনীয় তথ্য (উদাহরণস্বরূপ, PLD ID) থাকে, তাহলে দ্রুততর বিকল্প হিসেবে Tuner.tune ব্যবহার করার পরামর্শ দেওয়া হয়।

যখন ব্যবহারকারী Tuner.tune কল করেন, তখন নিম্নলিখিত কাজগুলো ঘটে:

  • TIS, Tuner.tune ব্যবহার করে FrontendSettings প্রয়োজনীয় তথ্য পূরণ করে।
  • সিগন্যাল লক করা থাকলে HAL 'tune LOCKED বার্তা রিপোর্ট করে।
  • TIS প্রয়োজনীয় তথ্য সংগ্রহ করতে Frontend.getStatus ব্যবহার করে।
  • TIS তার ফ্রিকোয়েন্সি তালিকায় পরবর্তী উপলব্ধ ফ্রিকোয়েন্সিতে চলে যায়।

সমস্ত ফ্রিকোয়েন্সি নিঃশেষ না হওয়া পর্যন্ত TIS, Tuner.tune পুনরায় কল করতে থাকে।

টিউনিং করার সময়, Tuner.tune কলটি থামাতে বা শেষ করতে আপনি stopTune() বা close() কল করতে পারেন।

Tuner.scan(AUTO_SCAN)

যদি TIS-এর কাছে Tuner.tune ব্যবহার করার জন্য পর্যাপ্ত তথ্য না থাকে, কিন্তু একটি ফ্রিকোয়েন্সি তালিকা এবং স্ট্যান্ডার্ড টাইপ (উদাহরণস্বরূপ, DVB T/C/S) থাকে, তাহলে Tuner.scan(AUTO_SCAN) ব্যবহার করার পরামর্শ দেওয়া হয়।

যখন ব্যবহারকারী Tuner.scan(AUTO_SCAN) কল করেন, তখন নিম্নলিখিত কাজগুলো ঘটে:

  • TIS, ফ্রিকোয়েন্সি দ্বারা পূরণ করা FrontendSettings সহ Tuner.scan(AUTO_SCAN) ব্যবহার করে।

  • সিগন্যালটি লক করা থাকলে HAL স্ক্যান LOCKED বার্তা রিপোর্ট করে। সিগন্যালটি সম্পর্কে অতিরিক্ত তথ্য প্রদানের জন্য HAL অন্যান্য স্ক্যান বার্তাও রিপোর্ট করতে পারে।

  • TIS প্রয়োজনীয় তথ্য সংগ্রহ করতে Frontend.getStatus ব্যবহার করে।

  • একই ফ্রিকোয়েন্সিতে পরবর্তী সেটিং-এ যাওয়ার জন্য TIS, HAL-এর পক্ষ থেকে Tuner.scan কল করে। যদি FrontendSettings স্ট্রাকচারটি খালি থাকে, তাহলে HAL পরবর্তী উপলব্ধ সেটিংটি ব্যবহার করে। অন্যথায়, HAL এককালীন স্ক্যানের জন্য FrontendSettings ব্যবহার করে এবং স্ক্যান অপারেশনটি শেষ হয়েছে তা বোঝাতে END পাঠায়।

  • ফ্রিকোয়েন্সির সমস্ত সেটিংস শেষ না হওয়া পর্যন্ত TIS উপরোক্ত পদক্ষেপগুলো পুনরাবৃত্তি করে।

  • স্ক্যান অপারেশন শেষ হয়েছে তা বোঝাতে HAL END পাঠায়।

  • TIS তার ফ্রিকোয়েন্সি তালিকায় পরবর্তী উপলব্ধ ফ্রিকোয়েন্সিতে চলে যায়।

সমস্ত ফ্রিকোয়েন্সি শেষ না হওয়া পর্যন্ত TIS, Tuner.scan(AUTO_SCAN) বারবার কল করতে থাকে।

স্ক্যান চলাকালীন, স্ক্যানটি থামাতে বা শেষ করতে আপনি stopScan() বা close() কল করতে পারেন।

Tuner.scan(BLIND_SCAN)

যদি TIS-এর কোনো ফ্রিকোয়েন্সি তালিকা না থাকে এবং ভেন্ডর HAL ব্যবহারকারী-নির্দিষ্ট ফ্রন্টএন্ডের ফ্রিকোয়েন্সি অনুসন্ধান করে ফ্রন্টএন্ড রিসোর্সটি পেতে পারে, তাহলে Tuner.scan(BLIND_SCAN) ব্যবহার করার পরামর্শ দেওয়া হয়।

  • TIS Tuner.scan(BLIND_SCAN) ব্যবহার করে। শুরুর ফ্রিকোয়েন্সির জন্য FrontendSettings এ একটি ফ্রিকোয়েন্সি নির্দিষ্ট করা যেতে পারে, কিন্তু TIS, FrontendSettings এর অন্যান্য সেটিংস উপেক্ষা করে।
  • সিগন্যাল লক করা থাকলে HAL একটি 'স্ক্যান LOCKED বার্তা রিপোর্ট করে।
  • TIS প্রয়োজনীয় তথ্য সংগ্রহ করতে Frontend.getStatus ব্যবহার করে।
  • স্ক্যানিং চালিয়ে যাওয়ার জন্য TIS আবার Tuner.scan কল করে। ( FrontendSettings উপেক্ষা করা হয়।)
  • ফ্রিকোয়েন্সির সমস্ত সেটিংস শেষ না হওয়া পর্যন্ত TIS উপরের কাজগুলো পুনরাবৃত্তি করে। TIS-এর কোনো পদক্ষেপ ছাড়াই HAL ফ্রিকোয়েন্সি বাড়িয়ে দেয়। HAL ' PROGRESS রিপোর্ট করে।

সমস্ত ফ্রিকোয়েন্সি শেষ না হওয়া পর্যন্ত TIS, Tuner.scan(AUTO_SCAN) পুনরায় কল করতে থাকে। স্ক্যান অপারেশনটি শেষ হয়েছে বোঝাতে HAL, END বার্তাটি রিপোর্ট করে।

স্ক্যান চলাকালীন, স্ক্যানটি থামাতে বা শেষ করতে আপনি stopScan() বা close() কল করতে পারেন।

টিআইএস স্ক্যান প্রক্রিয়ার প্রবাহ চিত্র।

চিত্র ৯. টিআইএস স্ক্যানের প্রবাহ চিত্র।

Android.media.tv.tuner.filter

ফিল্টার প্যাকেজটি হলো কনফিগারেশন, সেটিংস, কলব্যাক এবং ইভেন্টসহ ফিল্টার অপারেশনগুলোর একটি সংগ্রহ। প্যাকেজটিতে নিচের অপারেশনগুলো অন্তর্ভুক্ত রয়েছে। অপারেশনগুলোর সম্পূর্ণ তালিকার জন্য অ্যান্ড্রয়েড সোর্স কোড দেখুন।

  • configure()
  • start()
  • stop()
  • flush()
  • read()

সম্পূর্ণ তালিকার জন্য অ্যান্ড্রয়েড সোর্স কোড দেখুন।

FilterConfiguration নিচের ক্লাসগুলো থেকে উদ্ভূত। এই কনফিগারেশনগুলো প্রধান ফিল্টার টাইপের জন্য এবং এগুলো নির্দিষ্ট করে যে ডেটা নিষ্কাশনের জন্য ফিল্টারটি কোন প্রোটোকল ব্যবহার করবে।

  • AlpFilterConfiguration
  • IpFilterConfiguration
  • MmtpFilterConfiguration
  • TlvFilterConfiguration
  • TsFilterConfiguration

এই সেটিংসগুলো নিচের ক্লাসগুলো থেকে নেওয়া হয়েছে। এই সেটিংসগুলো ফিল্টার সাবটাইপের জন্য এবং এগুলো নির্দিষ্ট করে দেয় যে ফিল্টারটি কোন ধরনের ডেটা বাদ দিতে পারবে।

  • SectionSettings
  • AvSettings
  • PesSettings
  • RecordSettings
  • DownloadSettings

বিভিন্ন ধরণের ডেটার জন্য ইভেন্ট রিপোর্ট করতে FilterEvent নিচের ক্লাসগুলো থেকে উদ্ভূত হয়েছে।

  • SectionEvent
  • MediaEvent
  • PesEvent
  • TsRecordEvent
  • MmtpRecordEvent
  • TemiEvent
  • DownloadEvent
  • IpPayloadEvent

Tuner HAL 1.1 বা তার উচ্চতর সংস্করণের সাথে Android 12 থেকে নিম্নলিখিত ইভেন্টগুলি সমর্থিত।

  • IpCidChangeEvent
  • RestartEvent
  • ScramblingStatusEvent
ফিল্টার থেকে ইভেন্ট এবং ডেটা ফরম্যাট
ফিল্টারের ধরন পতাকা ইভেন্টগুলি ডেটা অপারেশন ডেটা ফরম্যাট
TS.SECTION
MMTP.SECTION
IP.SECTION
TLV.SECTION
ALP.SECTION
isRaw:
true
বাধ্যতামূলক:
DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW

সুপারিশকৃত:
DemuxFilterStatus::LOW_WATER
DemuxFilterStatus::HIGH_WATER
অনুষ্ঠান ও অভ্যন্তরীণ সময়সূচী অনুযায়ী, চালান
Filter.read(buffer, offset, adjustedSize) এক বা একাধিকবার।

HAL-এর MQ থেকে ক্লায়েন্ট বাফারে ডেটা কপি করা হয়।
একটি একত্রিত সেশন প্যাকেজ অন্য একটি সেশন প্যাকেজ দ্বারা FMQ-তে পূরণ করা হয়।
isRaw:
false
বাধ্যতামূলক:
DemuxFilterEvent::DemuxFilterSectionEvent[n]
DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW

ঐচ্ছিক:
DemuxFilterStatus::LOW_WATER
DemuxFilterStatus::HIGH_WATER
for i=0; i<n; i++
Filter.read(buffer, offset, DemuxFilterSectionEven[i].size)


HAL-এর MQ থেকে ক্লায়েন্ট বাফারে ডেটা কপি করা হয়।
TS.PES isRaw:
true
বাধ্যতামূলক:
DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW

সুপারিশকৃত:
DemuxFilterStatus::LOW_WATER
DemuxFilterStatus::HIGH_WATER
অনুষ্ঠান ও অভ্যন্তরীণ সময়সূচী অনুযায়ী, চালান
Filter.read(buffer, offset, adjustedSize) এক বা একাধিকবার।

HAL-এর MQ থেকে ক্লায়েন্ট বাফারে ডেটা কপি করা হয়।
একটি অ্যাসেম্বল করা পিইএস প্যাকেজ থেকে অন্য একটি পিইএস প্যাকেজ দ্বারা এফএমকিউ পূরণ করা হয়।
isRaw:
false
বাধ্যতামূলক:
DemuxFilterEvent::DemuxFilterPesEvent[n]
DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW

ঐচ্ছিক:
DemuxFilterStatus::LOW_WATER
DemuxFilterStatus::HIGH_WATER
for i=0; i<n; i++
Filter.read(buffer, offset, DemuxFilterPesEven[i].size)


HAL-এর MQ থেকে ক্লায়েন্ট বাফারে ডেটা কপি করা হয়।
MMTP.PES isRaw:
true
বাধ্যতামূলক:
DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW

সুপারিশকৃত:
DemuxFilterStatus::LOW_WATER
DemuxFilterStatus::HIGH_WATER
অনুষ্ঠান ও অভ্যন্তরীণ সময়সূচী অনুযায়ী, চালান
Filter.read(buffer, offset, adjustedSize) এক বা একাধিকবার।

HAL-এর MQ থেকে ক্লায়েন্ট বাফারে ডেটা কপি করা হয়।
একটি অ্যাসেম্বলড MFU প্যাকেজ দ্বারা অন্য একটি MFU প্যাকেজ FMQ-তে পূর্ণ করা হয়।
isRaw:
false
বাধ্যতামূলক:
DemuxFilterEvent::DemuxFilterPesEvent[n]
DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW

ঐচ্ছিক:
DemuxFilterStatus::LOW_WATER
DemuxFilterStatus::HIGH_WATER
for i=0; i<n; i++
Filter.read(buffer, offset, DemuxFilterPesEven[i].size)


HAL-এর MQ থেকে ক্লায়েন্ট বাফারে ডেটা কপি করা হয়।
TS.TS
প্রযোজ্য নয় বাধ্যতামূলক:
DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW

সুপারিশকৃত:
DemuxFilterStatus::LOW_WATER
DemuxFilterStatus::HIGH_WATER
অনুষ্ঠান ও অভ্যন্তরীণ সময়সূচী অনুযায়ী, চালান
Filter.read(buffer, offset, adjustedSize) এক বা একাধিকবার।

HAL-এর MQ থেকে ক্লায়েন্ট বাফারে ডেটা কপি করা হয়।
ts হেডার দিয়ে ts ফিল্টার করে বাদ দেওয়া হয়েছে
এফএমকিউ-তে পূরণ করা হয়েছে।
TS.Audio
TS.Video
MMTP.Audio
MMTP.Video
isPassthrough:
true
ঐচ্ছিক:
DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW
DemuxFilterStatus::DATA_READY . প্রাপ্তির পর ক্লায়েন্ট MediaCodec চালু করতে পারে।
DemuxFilterStatus::DATA_OVERFLOW পাওয়ার পর ক্লায়েন্ট Filter.flush কল করতে পারে।
প্রযোজ্য নয়
isPassthrough:
false
বাধ্যতামূলক:
DemuxFilterEvent::DemuxFilterMediaEvent[n]
DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW

ঐচ্ছিক:
DemuxFilterStatus::LOW_WATER
DemuxFilterStatus::HIGH_WATER
MediaCodec ব্যবহার করতে:
for i=0; i<n; i++
linearblock = MediaEvent[i].getLinearBlock();
codec.startQueueLinearBlock(linearblock)
linearblock.recycle()


AudioTrack এর ডাইরেক্ট অডিও ব্যবহার করতে:
for i=0; i<n; i++
audioHandle = MediaEvent[i].getAudioHandle();
audiotrack.write(encapsulated(audiohandle))
ION মেমরিতে ES বা আংশিক ES ডেটা।
TS.PCR
IP.NTP
ALP.PTP
প্রযোজ্য নয় বাধ্যতামূলক: প্রযোজ্য নয়
ঐচ্ছিক: প্রযোজ্য নয়
প্রযোজ্য নয় প্রযোজ্য নয়
TS.RECORD প্রযোজ্য নয় বাধ্যতামূলক:
DemuxFilterEvent::DemuxFilterTsRecordEvent[n]
RecordStatus::DATA_READY
RecordStatus::DATA_OVERFLOW
RecordStatus::LOW_WATER
RecordStatus::HIGH_WATER

ঐচ্ছিক:
DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW
DemuxFilterStatus::LOW_WATER
DemuxFilterStatus::HIGH_WATER
সূচক ডেটার জন্য:
for i=0; i<n; i++
DemuxFilterTsRecordEvent[i];


রেকর্ড করা কন্টেন্টের জন্য , RecordStatus::* এবং অভ্যন্তরীণ সময়সূচী অনুযায়ী, নিম্নলিখিতগুলির মধ্যে একটি করুন:
  • স্টোরেজে এক বা একাধিকবার DvrRecord.write(adustedSize) চালান।
    ডেটা HAL-এর MQ থেকে স্টোরেজে স্থানান্তরিত হয়।
  • বাফার করার জন্য DvrRecord.write(buffer, adustedSize) এক বা একাধিকবার চালান।
    ডেটা HAL-এর MQ থেকে ক্লায়েন্ট বাফারে কপি করা হয়।
সূচক তথ্যের জন্য: ইভেন্ট পেলোডে অন্তর্ভুক্ত।

রেকর্ডকৃত কন্টেন্টের জন্য: Muxed TS স্ট্রিম FMQ-তে পূরণ করা হয়।
TS.TEMI প্রযোজ্য নয় বাধ্যতামূলক:
DemuxFilterEvent::DemuxFilterTemiEvent[n]

ঐচ্ছিক:
DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW
DemuxFilterStatus::LOW_WATER
DemuxFilterStatus::HIGH_WATER
for i=0; i<n; i++
DemuxFilterTemiEvent[i];
প্রযোজ্য নয়
MMTP.MMTP প্রযোজ্য নয় বাধ্যতামূলক:
DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW

সুপারিশকৃত:
DemuxFilterStatus::LOW_WATER
DemuxFilterStatus::HIGH_WATER
অনুষ্ঠান ও অভ্যন্তরীণ সময়সূচী অনুযায়ী, চালান
Filter.read(buffer, offset, adjustedSize) এক বা একাধিকবার।

HAL-এর MQ থেকে ক্লায়েন্ট বাফারে ডেটা কপি করা হয়।
mmtp হেডার দিয়ে mmtp ফিল্টার করা হয়েছে
এফএমকিউ-তে পূরণ করা হয়েছে।
MMTP.RECORD প্রযোজ্য নয় বাধ্যতামূলক:
DemuxFilterEvent::DemuxFilterMmtpRecordEvent[n]
RecordStatus::DATA_READY
RecordStatus::DATA_OVERFLOW
RecordStatus::LOW_WATER
RecordStatus::HIGH_WATER

ঐচ্ছিক:
DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW
DemuxFilterStatus::LOW_WATER
DemuxFilterStatus::HIGH_WATER
সূচক ডেটার জন্য: for i=0; i<n; i++
DemuxFilterMmtpRecordEvent[i];


রেকর্ড করা কন্টেন্টের জন্য , RecordStatus::* এবং অভ্যন্তরীণ সময়সূচী অনুযায়ী, নিম্নলিখিতগুলির মধ্যে একটি করুন:
  • স্টোরেজে এক বা একাধিকবার DvrRecord.write(adjustedSize) চালান।
    ডেটা HAL-এর MQ থেকে স্টোরেজে স্থানান্তরিত হয়।
  • বাফার করার জন্য DvrRecord.write(buffer, adjustedSize) এক বা একাধিকবার চালান।
    ডেটা HAL-এর MQ থেকে ক্লায়েন্ট বাফারে কপি করা হয়।
সূচক তথ্যের জন্য: ইভেন্ট পেলোডে অন্তর্ভুক্ত।

রেকর্ড করা কন্টেন্টের জন্য: FMQ-তে পূরণ করা মাক্সড রেকর্ডেড স্ট্রিম।

রেকর্ডিংয়ের জন্য ফিল্টার সোর্স যদি পাসথ্রু সহ TLV.TLV থেকে IP.IP হয়, তাহলে রেকর্ড করা স্ট্রিমে একটি TLV এবং একটি IP হেডার থাকে।
MMTP.DOWNLOAD প্রযোজ্য নয় বাধ্যতামূলক:
DemuxFilterEvent::DemuxFilterDownloadEvent[n]
DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW

ঐচ্ছিক:
DemuxFilterStatus::LOW_WATER
DemuxFilterStatus::HIGH_WATER
for i=0; i<n; i++ Filter.read(buffer, offset, DemuxFilterDownloadEvent[i].size)

HAL-এর MQ থেকে ক্লায়েন্ট বাফারে ডেটা কপি করা হয়।
অন্য একটি আইপি ডাউনলোড প্যাকেজের মাধ্যমে এফএমকিউ-তে ডাউনলোড প্যাকেজটি পূরণ করা হয়।
IP.IP_PAYLOAD প্রযোজ্য নয় বাধ্যতামূলক:
DemuxFilterEvent::DemuxFilterIpPayloadEvent[n]
DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW

ঐচ্ছিক:
DemuxFilterStatus::LOW_WATER
DemuxFilterStatus::HIGH_WATER
for i=0; i<n; i++ Filter.read(buffer, offset, DemuxFilterIpPayloadEvent[i].size)

HAL-এর MQ থেকে ক্লায়েন্ট বাফারে ডেটা কপি করা হয়।
এফএমকিউ-তে একটি আইপি পেলোড প্যাকেজ দ্বারা আরেকটি আইপি পেলোড প্যাকেজ পূরণ করা হয়।
IP.IP
TLV.TLV
ALP.ALP
isPassthrough:
true
ঐচ্ছিক:
DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW
ফিল্টার করে বাদ দেওয়া প্রোটোকল সাব-স্ট্রিমটি ফিল্টার চেইনের পরবর্তী ফিল্টারে পাঠানো হয়। প্রযোজ্য নয়
isPassthrough:
false
বাধ্যতামূলক:
DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW

সুপারিশকৃত:
DemuxFilterStatus::LOW_WATER
DemuxFilterStatus::HIGH_WATER
অনুষ্ঠান ও অভ্যন্তরীণ সময়সূচী অনুযায়ী, চালান
Filter.read(buffer, offset, adjustedSize) এক বা একাধিকবার।

HAL-এর MQ থেকে ক্লায়েন্ট বাফারে ডেটা কপি করা হয়।
প্রোটোকল হেডার সহ ফিল্টার করা প্রোটোকল সাব-স্ট্রিমটি FMQ-তে পূরণ করা হয়।
IP.PAYLOAD_THROUGH
TLV.PAYLOAD_THROUGH
ALP.PAYLOAD_THROUGH
প্রযোজ্য নয় ঐচ্ছিক:
DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW
ফিল্টার করে বাদ দেওয়া প্রোটোকল পেলোড ফিল্টার চেইনের পরবর্তী ফিল্টারে পাঠানো হয়। প্রযোজ্য নয়
PSI/SI তৈরি করতে ফিল্টার ব্যবহারের উদাহরণ প্রবাহ

ফিল্টার ব্যবহার করে PSI/SI তৈরির কার্যপ্রবাহের উদাহরণ।

চিত্র ১০। পিএসআই/এসআই গঠনের প্রবাহ

  1. একটি ফিল্টার খুলুন।

    Filter filter = tuner.openFilter(
      Filter.TYPE_TS,
      Filter.SUBTYPE_SECTION,
      /* bufferSize */1000,
      executor,
      filterCallback
    );
    
  2. ফিল্টারটি কনফিগার করুন এবং চালু করুন।

    Settings settings = SectionSettingsWithTableInfo
        .builder(Filter.TYPE_TS)
        .setTableId(2)
        .setVersion(1)
        .setCrcEnabled(true)
        .setRaw(false)
        .setRepeat(false)
        .build();
      FilterConfiguration config = TsFilterConfiguration
        .builder()
        .setTpid(10)
        .setSettings(settings)
        .build();
      filter.configure(config);
      filter.start();
    
  3. SectionEvent প্রক্রিয়া করুন।

    FilterCallback filterCallback = new FilterCallback() {
      @Override
      public void onFilterEvent(Filter filter, FilterEvent[] events) {
        for (FilterEvent event : events) {
          if (event instanceof SectionEvent) {
            SectionEvent sectionEvent = (SectionEvent) event;
            int tableId = sectionEvent.getTableId();
            int version = sectionEvent.getVersion();
            int dataLength = sectionEvent.getDataLength();
            int sectionNumber = sectionEvent.getSectionNumber();
            filter.read(buffer, 0, dataLength); }
          }
        }
    };
    
ফিল্টার থেকে MediaEvent ব্যবহার করার উদাহরণ প্রবাহ

ফিল্টার থেকে MediaEvent ব্যবহারের উদাহরণ প্রবাহ।

চিত্র ১১. ফিল্টার থেকে MediaEvent ব্যবহারের কার্যপ্রবাহ

  1. এ/ভি ফিল্টারগুলো খুলুন, কনফিগার করুন এবং চালু করুন।
  2. MediaEvent প্রক্রিয়া করুন।
  3. MediaEvent গ্রহণ করুন।
  4. লিনিয়ার ব্লকটিকে codec সারিবদ্ধ করুন।
  5. ডেটা ব্যবহৃত হয়ে গেলে এ/ভি হ্যান্ডেলটি ছেড়ে দিন।

Android.media.tv.tuner.dvr

DvrRecorder রেকর্ডিংয়ের জন্য এই পদ্ধতিগুলো প্রদান করে।

  • configure
  • attachFilter
  • detachFilter
  • start
  • flush
  • stop
  • setFileDescriptor
  • write

DvrPlayback প্লেব্যাকের জন্য এই পদ্ধতিগুলো প্রদান করে।

  • configure
  • start
  • flush
  • stop
  • setFileDescriptor
  • read

DvrSettings ব্যবহার করা হয় DvrRecorder এবং DvrPlayback কনফিগার করার জন্য। OnPlaybackStatusChangedListener এবং OnRecordStatusChangedListener ব্যবহার করা হয় একটি DVR ইনস্ট্যান্সের অবস্থা জানানোর জন্য।

একটি রেকর্ড শুরু করার উদাহরণ প্রবাহ

একটি রেকর্ড শুরু করার কার্যপ্রবাহের উদাহরণ।

চিত্র ১২। রেকর্ড শুরু করার প্রক্রিয়া।

  1. DvrRecorder খুলুন, কনফিগার করুন এবং চালু করুন।

    DvrRecorder recorder = openDvrRecorder(/* bufferSize */ 1000, executor, listener);
    DvrSettings dvrSettings = DvrSettings
    .builder()
    .setDataFormat(DvrSettings.DATA_FORMAT_TS)
    .setLowThreshold(100)
    .setHighThreshold(900)
    .setPacketSize(188)
    .build();
    recorder.configure(dvrSettings);
    recorder.attachFilter(filter);
    recorder.setFileDescriptor(fd);
    recorder.start();
    
  2. RecordEvent গ্রহণ করুন এবং সূচকের তথ্য পুনরুদ্ধার করুন।

    FilterCallback filterCallback = new FilterCallback() {
      @Override
      public void onFilterEvent(Filter filter, FilterEvent[] events) {
        for (FilterEvent event : events) {
          if (event instanceof TsRecordEvent) {
            TsRecordEvent recordEvent = (TsRecordEvent) event;
            int tsMask = recordEvent.getTsIndexMask();
            int scMask = recordEvent.getScIndexMask();
            int packetId = recordEvent.getPacketId();
            long dataLength = recordEvent.getDataLength();
            // handle the masks etc. }
          }
        }
    };
    
  3. OnRecordStatusChangedListener ইনিশিয়ালাইজ করুন এবং রেকর্ডের ডেটা সংরক্ষণ করুন।

      OnRecordStatusChangedListener listener = new OnRecordStatusChangedListener() {
        @Override
        public void onRecordStatusChanged(int status) {
          // a customized way to consume data efficiently by using status as a hint.
          if (status == Filter.STATUS_DATA_READY) {
            recorder.write(size);
          }
        }
      };
    

টিউনার এইচএএল

টিউনার এইচএএল (Tuner HAL) এইচআইডিএল (HIDL) অনুসরণ করে এবং ফ্রেমওয়ার্ক ও ভেন্ডর হার্ডওয়্যারের মধ্যেকার ইন্টারফেসটি সংজ্ঞায়িত করে। ভেন্ডররা টিউনার এইচএএল বাস্তবায়নের জন্য এই ইন্টারফেসটি ব্যবহার করে এবং ফ্রেমওয়ার্কটি টিউনার এইচএএল বাস্তবায়নের সাথে যোগাযোগের জন্য এটি ব্যবহার করে।

মডিউল

টিউনার এইচএএল ১.০

মডিউল মৌলিক নিয়ন্ত্রণ মডিউল-নির্দিষ্ট নিয়ন্ত্রণ এইচএএল ফাইল
ITuner প্রযোজ্য নয় frontend(open, getIds, getInfo) , openDemux , openDescrambler , openLnb , getDemuxCaps ITuner.hal
IFrontend setCallback , getStatus , close tune , stopTune , scan , stopScan , setLnb IFrontend.hal
IFrontendCallback.hal
IDemux close setFrontendDataSource , openFilter , openDvr , getAvSyncHwId , getAvSyncTime , connect / disconnectCiCam IDemux.hal
IDvr close , start , stop , configure attach/detachFilters , flush , getQueueDesc IDvr.hal
IDvrCallback.hal
IFilter close , start , stop , configure , getId flush , getQueueDesc , releaseAvHandle , setDataSource IFilter.hal
IFilterCallback.hal
ILnb close , setCallback setVoltage , setTone , setSatellitePosition , sendDiseqcMessage ILnb.hal
ILnbCallback.hal
IDescrambler close setDemuxSource , setKeyToken , addPid , removePid IDescrambler.hal

টিউনার এইচএএল ১.১ (টিউনার এইচএএল ১.০ থেকে উদ্ভূত)

মডিউল মৌলিক নিয়ন্ত্রণ মডিউল-নির্দিষ্ট নিয়ন্ত্রণ এইচএএল ফাইল
ITuner প্রযোজ্য নয় getFrontendDtmbCapabilities @1.1::ITuner.hal
IFrontend tune_1_1 , scan_1_1 , getStatusExt1_1 link/unlinkCiCam @1.1::IFrontend.hal
@1.1::IFrontendCallback.hal
IFilter getStatusExt1_1 configureIpCid , configureAvStreamType , getAvSharedHandle , configureMonitorEvent @1.1::IFilter.hal
@1.1::IFilterCallback.hal

Tuner HAL-এর মডিউলগুলোর মধ্যকার পারস্পরিক ক্রিয়ার প্রবাহ চিত্র।

চিত্র ১৩। টিউনার এইচএএল মডিউলগুলোর মধ্যকার পারস্পরিক ক্রিয়ার ডায়াগ্রাম।

ফিল্টার সংযোগ

Tuner HAL ফিল্টার লিঙ্কেজ সমর্থন করে, যার ফলে একাধিক লেয়ারের জন্য ফিল্টারগুলোকে একে অপরের সাথে লিঙ্ক করা যায়। ফিল্টারগুলো নিচের নিয়মগুলো অনুসরণ করে।

  • ফিল্টারগুলো একটি গাছের মতো সংযুক্ত, পথ বন্ধ করার অনুমতি নেই।
  • রুট নোডটি হলো ডিমাক্স।
  • ফিল্টারগুলো স্বাধীনভাবে কাজ করে।
  • সব ফিল্টার ডেটা পেতে শুরু করে।
  • ফিল্টার লিঙ্কেজটি শেষ ফিল্টারটিতে ফ্লাশ হয়।

নিচের কোড ব্লক এবং চিত্র ১৪-তে একাধিক লেয়ার ফিল্টার করার একটি উদাহরণ দেখানো হয়েছে।

demuxCaps = ITuner.getDemuxCap;
If (demuxCaps[IP][MMTP] == true) {
        ipFilter = ITuner.openFilter(<IP, ..>)
        mmtpFilter1 = ITuner.openFilter(<MMTP ..>)
        mmtpFilter2 = ITuner.openFilter(<MMTP ..>)
        mmtpFilter1.setDataSource(<ipFilter>)
        mmtpFilter2.setDataSource(<ipFilter>)
}

ফিল্টার লিঙ্কেজ উদাহরণের চিত্র।

চিত্র ১৪। একাধিক স্তরের ফিল্টার লিঙ্কেজের প্রবাহ চিত্র।

টিউনার রিসোর্স ম্যানেজার

টিউনার রিসোর্স ম্যানেজার (TRM) আসার আগে, দুটি অ্যাপের মধ্যে স্যুইচ করার জন্য একই টিউনার হার্ডওয়্যারের প্রয়োজন হতো। টিভি ইনপুট ফ্রেমওয়ার্ক (TIF) একটি "যে আগে রিসোর্সটি পাবে, সে-ই জিতবে" (first-to-acquire win) পদ্ধতি ব্যবহার করত, যার অর্থ হলো যে অ্যাপটি প্রথমে রিসোর্সটি পায়, সেটিই তার কাছে থেকে যায়। তবে, কিছু জটিল ব্যবহারের ক্ষেত্রে এই পদ্ধতিটি আদর্শ নাও হতে পারে।

TRM একটি সিস্টেম সার্ভিস হিসেবে কাজ করে যা অ্যাপগুলোর জন্য Tuner, TVInput , এবং CAS হার্ডওয়্যার রিসোর্সগুলো পরিচালনা করে। TRM একটি "ফোরগ্রাউন্ড উইন" পদ্ধতি ব্যবহার করে, যা অ্যাপটির ফোরগ্রাউন্ড বা ব্যাকগ্রাউন্ড স্ট্যাটাস এবং ব্যবহারের ধরনের ওপর ভিত্তি করে তার অগ্রাধিকার নির্ধারণ করে। TRM এই অগ্রাধিকারের ওপর ভিত্তি করে রিসোর্সটি মঞ্জুর বা প্রত্যাহার করে। TRM ব্রডকাস্ট, OTT, এবং DVR-এর জন্য ATV রিসোর্স ব্যবস্থাপনাকে কেন্দ্রীভূত করে।

টিআরএম ইন্টারফেস

TRM, Tuner ফ্রেমওয়ার্ক, MediaCas এবং TvInputHardwareManager এর রিসোর্স নিবন্ধন, অনুরোধ বা মুক্ত করার জন্য ITunerResourceManager.aidl এ AIDL ইন্টারফেসগুলো উন্মুক্ত করে।

ক্লায়েন্ট ব্যবস্থাপনার ইন্টারফেসগুলো নিচে তালিকাভুক্ত করা হলো।

  • registerClientProfile(in ResourceClientProfile profile, IResourcesReclaimListener listener, out int[] clientId)
  • unregisterClientProfile(in int clientId)

রিসোর্স অনুরোধ ও মুক্ত করার ইন্টারফেসগুলো নিচে তালিকাভুক্ত করা হলো।

  • requestFrontend(TunerFrontendRequest request, int[] frontendHandle) / releaseFrontend
  • requestDemux(TunerDemuxRequest request, int[] demuxHandle) / releaseDemux
  • requestDescrambler(TunerDescramblerRequest request, int[] descramblerHandle) / releaseDescrambler
  • requestCasSession(CasSessionRequest request, int[] casSessionHandle) / releaseCasSession
  • requestLnb(TunerLnbRequest request, int[] lnbHandle) / releaseLnb

ক্লায়েন্ট এবং অনুরোধের শ্রেণীগুলো নিচে তালিকাভুক্ত করা হলো।

  • ResourceClientProfile
  • ResourcesReclaimListener
  • TunerFrontendRequest
  • TunerDemuxRequest
  • TunerDescramblerRequest
  • CasSessionRequest
  • TunerLnbRequest

ক্লায়েন্টের অগ্রাধিকার

TRM ক্লায়েন্টের প্রোফাইলের প্যারামিটার এবং কনফিগারেশন ফাইলের প্রায়োরিটি ভ্যালু ব্যবহার করে ক্লায়েন্টের প্রায়োরিটি গণনা করে। ক্লায়েন্টের দেওয়া যেকোনো প্রায়োরিটি ভ্যালু দ্বারাও এই প্রায়োরিটি আপডেট করা যেতে পারে।

ক্লায়েন্টের প্রোফাইলের প্যারামিটারগুলি

কোনো অ্যাপ ফোরগ্রাউন্ড নাকি ব্যাকগ্রাউন্ড অ্যাপ, তা নির্ধারণ করার জন্য TRM, mTvInputSessionId থেকে প্রসেস আইডি সংগ্রহ করে। mTvInputSessionId তৈরি করতে, TvInputService.onCreateSession অথবা TvInputService.onCreateRecordingSession একটি TIS সেশন শুরু করে।

mUseCase সেশনের ইউজ কেস নির্দেশ করে। পূর্বনির্ধারিত ইউজ কেসগুলো নিচে তালিকাভুক্ত করা হলো।

TvInputService.PriorityHintUseCaseType  {
  PRIORITY_HINT_USE_CASE_TYPE_PLAYBACK
  PRIORITY_HINT_USE_CASE_TYPE_LIVE
  PRIORITY_HINT_USE_CASE_TYPE_RECORD,
  PRIORITY_HINT_USE_CASE_TYPE_SCAN,
  PRIORITY_HINT_USE_CASE_TYPE_BACKGROUND
}

কনফিগারেশন ফাইল

ডিফল্ট কনফিগারেশন ফাইল

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

ব্যবহারের ক্ষেত্র সম্মুখভাগ পটভূমি
LIVE ৪৯০ ৪০০
PLAYBACK ৪৮০ ৩০০
RECORD ৬০০ ৫০০
SCAN ৪৫০ ২০০
BACKGROUND ১৮০ ১০০
কাস্টমাইজড কনফিগারেশন ফাইল

ভেন্ডররা /vendor/etc/tunerResourceManagerUseCaseConfig.xml কনফিগারেশন ফাইলটি কাস্টমাইজ করতে পারেন। এই ফাইলটি ইউজ কেস টাইপ এবং ইউজ কেস প্রায়োরিটি ভ্যালু যোগ, অপসারণ বা আপডেট করার জন্য ব্যবহৃত হয়। কাস্টমাইজ করা ফাইলটি টেমপ্লেট হিসেবে platform/hardware/interfaces/tv/tuner/1.0/config/tunerResourceManagerUseCaseConfigSample.xml ফাইলটি ব্যবহার করতে পারে।

উদাহরণস্বরূপ, একটি নতুন ভেন্ডর ইউজ কেস হলো VENDOR_USE_CASE__[A-Z0-9]+, [0 - 1000] । ফরম্যাটটি platform/hardware/interfaces/tv/tuner/1.0/config/tunerResourceManagerUseCaseConfig.xsd অনুসরণ করবে।

যথেচ্ছ অগ্রাধিকার মান এবং সুন্দর মান

TRM ক্লায়েন্টকে যথেচ্ছ প্রায়োরিটি ভ্যালু এবং নাইস ভ্যালু আপডেট করার জন্য updateClientPriority প্রদান করে। এই যথেচ্ছ প্রায়োরিটি ভ্যালুটি, ইউজ কেস টাইপ এবং সেশন আইডি থেকে গণনা করা প্রায়োরিটি ভ্যালুকে ওভাররাইট করে দেয়।

নাইস ভ্যালু নির্দেশ করে যে, অন্য কোনো ক্লায়েন্টের সাথে বিরোধের ক্ষেত্রে ক্লায়েন্টের আচরণ কতটা নমনীয়। প্রতিদ্বন্দ্বী ক্লায়েন্টের সাথে নিজের প্রায়োরিটি ভ্যালু তুলনা করার আগে, নাইস ভ্যালু ক্লায়েন্টটির প্রায়োরিটি ভ্যালু কমিয়ে দেয়।

পুনরুদ্ধার প্রক্রিয়া

নিচের ডায়াগ্রামটিতে দেখানো হয়েছে, রিসোর্স সংঘাত ঘটলে কীভাবে রিসোর্স পুনরুদ্ধার ও বরাদ্দ করা হয়।

পুনরুদ্ধার প্রক্রিয়ার কার্যপ্রণালীর চিত্র।

চিত্র ১৫। টিউনার রিসোর্সসমূহের মধ্যে দ্বন্দ্বের ক্ষেত্রে পুনরুদ্ধার পদ্ধতির ডায়াগ্রাম।