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

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

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

উপাদান

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

  • টিউনার HAL: ফ্রেমওয়ার্ক এবং বিক্রেতাদের মধ্যে একটি ইন্টারফেস
  • টিউনার SDK API: ফ্রেমওয়ার্ক এবং অ্যাপের মধ্যে একটি ইন্টারফেস
  • টিউনার রিসোর্স ম্যানেজার (টিআরএম): টিউনার এইচডব্লিউ রিসোর্স সমন্বয় করে

Android 11-এর জন্য, নিম্নলিখিত উপাদানগুলিকে উন্নত করা হয়েছে।

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

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

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

বৈশিষ্ট্য

Frontend নীচের DTV মান সমর্থন করে।

  • ATSC
  • ATSC3
  • ডিভিবি সি/এস/টি
  • ISDB S/S3/T
  • এনালগ

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

  • ডিটিএমবি

Demux নীচের স্ট্রিম প্রোটোকল সমর্থন করে।

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

Descrambler নীচের বিষয়বস্তু সুরক্ষা সমর্থন করে।

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

টিউনার APIগুলি নীচের ব্যবহারের ক্ষেত্রে সমর্থন করে।

  • স্ক্যান করুন
  • লাইভ
  • প্লেব্যাক
  • রেকর্ড

টিউনার, MediaCodec এবং AudioTrack নীচের ডেটা প্রবাহ মোডগুলিকে সমর্থন করে৷

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

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

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

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

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

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

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

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

মিডিয়া CAS এবং CAS HAL নীচের বৈশিষ্ট্যগুলির সাথে উন্নত করা হয়েছে৷

  • বিভিন্ন ব্যবহার এবং অ্যালগরিদমের জন্য CAS সেশন খোলে।
  • গতিশীল CAS সিস্টেম সমর্থন করে, যেমন CICAM অপসারণ এবং সন্নিবেশ।
  • কী টোকেন প্রদান করে টিউনার HAL-এর সাথে একীভূত হয়।

MediaCodec এবং AudioTrack নীচের বৈশিষ্ট্যগুলির সাথে উন্নত করা হয়েছে৷

  • কন্টেন্ট ইনপুট হিসাবে নিরাপদ A/V মেমরি নেয়।
  • টানেল প্লেব্যাকে হার্ডওয়্যার A/V সিঙ্ক করতে কনফিগার করা হয়েছে।
  • ES_payload এবং পাসথ্রু মোডের জন্য কনফিগার করা সমর্থন।

টিউনার HAL এর সামগ্রিক নকশা।

চিত্র 2. টিউনার HAL-এর মধ্যে উপাদানগুলির চিত্র

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

নীচের চিত্রগুলি সরাসরি সম্প্রচার প্লেব্যাকের জন্য কল ক্রমগুলিকে চিত্রিত করে৷

সেটআপ

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

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

A/V হ্যান্ডলিং

লাইভ ব্রডকাস্ট প্লেব্যাক ডায়াগ্রামের জন্য A/V হ্যান্ডলিং।

চিত্র 4. সরাসরি সম্প্রচার প্লেব্যাকের জন্য A/V হ্যান্ডলিং

স্ক্র্যাম্বল কন্টেন্ট হ্যান্ডলিং

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

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

A/V ডেটা প্রসেস করা হচ্ছে

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

চিত্র 6. লাইভ সম্প্রচার প্লেব্যাকের জন্য A/V প্রক্রিয়াকরণ

টিউনার SDK API

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

টিউনার SDK API-এর ফ্লো ডায়াগ্রাম।

চিত্র 7. টিউনার SDK API-এর সাথে মিথস্ক্রিয়া

সংস্করণ

অ্যান্ড্রয়েড 12 থেকে, টিউনার SDK API টিউনার HAL 1.1-এ নতুন বৈশিষ্ট্য সমর্থন করে, যা টিউনার 1.0-এর একটি পশ্চাদগামী-সামঞ্জস্যপূর্ণ সংস্করণ আপগ্রেড।

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

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

ন্যূনতম প্রয়োজনীয় HAL সংস্করণটি নতুন Android 12 API-এর ডকুমেন্টেশনে পাওয়া যাবে।

প্যাকেজ

টিউনার SDK API নিচের চারটি প্যাকেজ প্রদান করে।

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

টিউনার SDK API প্যাকেজের ফ্লো ডায়াগ্রাম।

চিত্র 8. টিউনার SDK API প্যাকেজ

Android.media.tv.tuner

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

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

টিউনার প্যাকেজ এমন কার্যকারিতা প্রদান করে যা ফিল্টার, ডিভিআর এবং ফ্রন্টএন্ড প্যাকেজের অধীনে নেই। কার্যকারিতা নীচে তালিকাভুক্ত করা হয়.

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

Android.media.tv.tuner.frontend

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

ক্লাস

FrontendSettings নিচের শ্রেণী দ্বারা বিভিন্ন DTV মানগুলির জন্য উদ্ভূত হয়েছে।

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

Android 12 থেকে Tuner HAL 1.1 বা উচ্চতর, নিম্নলিখিত DTV মান সমর্থিত।

  • DtmbFrontendSettings

FrontendCapabilities নীচের শ্রেণীগুলির দ্বারা বিভিন্ন DTV মানগুলির জন্য উদ্ভূত হয়েছে৷

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

Android 12 থেকে Tuner HAL 1.1 বা উচ্চতর, নিম্নলিখিত DTV মান সমর্থিত।

  • 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 কল করলে, নিম্নলিখিত ক্রিয়াগুলি ঘটবে:

  • টিআইএস Tuner.tune ব্যবহার করে প্রয়োজনীয় তথ্য দিয়ে FrontendSettings পপুলেট করে।
  • সংকেত লক করা থাকলে HAL টিউন LOCKED মেসেজ রিপোর্ট করে।
  • TIS প্রয়োজনীয় তথ্য সংগ্রহ করতে Frontend.getStatus ব্যবহার করে।
  • TIS তার ফ্রিকোয়েন্সি তালিকার পরবর্তী উপলব্ধ ফ্রিকোয়েন্সিতে চলে যায়।

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

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

Tuner.scan(AUTO_SCAN)

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

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

  • TIS Tuner.scan(AUTO_SCAN) ব্যবহার করে FrontendSettings ফ্রিকোয়েন্সিতে ভরা।

  • 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 ফ্রিকোয়েন্সি বৃদ্ধি করে। এইচএএল PROGRESS প্রতিবেদন করেছে।

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

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

টিআইএস স্ক্যান প্রক্রিয়ার ফ্লো ডায়াগ্রাম।

চিত্র 9. একটি TIS স্ক্যানের ফ্লো ডায়াগ্রাম

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

টিউনার 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 থেকে ক্লায়েন্ট বাফারে ডেটা কপি করা হয়।
একটি একত্রিত PES প্যাকেজ FMQ-এ অন্য PES প্যাকেজ দ্বারা পূরণ করা হয়।
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 প্যাকেজ FMQ-তে অন্য MFU প্যাকেজ দ্বারা পূরণ করা হয়।
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
N/A বাধ্যতামূলক:
DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW

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

HAL এর MQ থেকে ক্লায়েন্ট বাফারে ডেটা কপি করা হয়।
ts হেডার দিয়ে ts ফিল্টার করা হয়েছে
FMQ তে ভরা হয়।
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 কল করতে পারে।
N/A
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
N/A বাধ্যতামূলক: N/A
ঐচ্ছিক: N/A
N/A N/A
TS.RECORD N/A বাধ্যতামূলক:
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 থেকে ক্লায়েন্ট বাফারে ডেটা কপি করা হয়।
সূচক ডেটার জন্য: ইভেন্ট পেলোডে বহন করা হয়।

রেকর্ড করা বিষয়বস্তুর জন্য: মিক্সড টিএস স্ট্রিম এফএমকিউ-তে ভরা।
TS.TEMI N/A বাধ্যতামূলক:
DemuxFilterEvent::DemuxFilterTemiEvent[n]

ঐচ্ছিক:
DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW
DemuxFilterStatus::LOW_WATER
DemuxFilterStatus::HIGH_WATER
for i=0; i<n; i++
DemuxFilterTemiEvent[i];
N/A
MMTP.MMTP N/A বাধ্যতামূলক:
DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW

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

HAL এর MQ থেকে ক্লায়েন্ট বাফারে ডেটা কপি করা হয়।
mmtp হেডার সহ mmtp ফিল্টার করা হয়েছে
FMQ তে ভরা হয়।
MMTP.RECORD N/A বাধ্যতামূলক:
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 N/A বাধ্যতামূলক:
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 N/A বাধ্যতামূলক:
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 পেলোড প্যাকেজ FMQ-তে অন্য IP পেলোড প্যাকেজ দ্বারা পূরণ করা হয়।
IP.IP
TLV.TLV
ALP.ALP
isPassthrough:
true
ঐচ্ছিক:
DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW
ফিল্টার করা প্রোটোকল সাব স্ট্রীম ফিল্টার চেইনের পরবর্তী ফিল্টারকে ফিড করে। N/A
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
N/A ঐচ্ছিক:
DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW
ফিল্টার করা প্রোটোকল পেলোড ফিল্টার চেইনের পরবর্তী ফিল্টারকে ফিড করে। N/A
PSI/SI তৈরি করতে ফিল্টার ব্যবহার করার উদাহরণ প্রবাহ

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

চিত্র 10. 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 ব্যবহার করার উদাহরণ প্রবাহ।

চিত্র 11. ফিল্টার থেকে মিডিয়া ইভেন্ট ব্যবহার করার জন্য প্রবাহ

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

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 উদাহরণের অবস্থা রিপোর্ট করতে ব্যবহার করা হয়।

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

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

চিত্র 12. একটি রেকর্ড শুরু করার জন্য প্রবাহ

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

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

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

মডিউল

টিউনার HAL 1.0

মডিউল মৌলিক নিয়ন্ত্রণ মডিউল-নির্দিষ্ট নিয়ন্ত্রণ HAL ফাইল
ITuner N/A 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

টিউনার HAL 1.1 (টিউনার HAL 1.0 থেকে প্রাপ্ত)

মডিউল মৌলিক নিয়ন্ত্রণ মডিউল-নির্দিষ্ট নিয়ন্ত্রণ HAL ফাইল
ITuner N/A 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

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

চিত্র 13. টিউনার HAL মডিউলগুলির মধ্যে মিথস্ক্রিয়াগুলির চিত্র

ফিল্টার লিঙ্কেজ

টিউনার এইচএএল ফিল্টার লিঙ্কেজকে সমর্থন করে যাতে ফিল্টারগুলি একাধিক স্তরের জন্য অন্যান্য ফিল্টারের সাথে লিঙ্ক করা যায়। ফিল্টার নীচের নিয়ম অনুসরণ করে.

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

নীচের কোড ব্লক এবং চিত্র 14 একাধিক স্তর ফিল্টার করার একটি উদাহরণ চিত্রিত করে।

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

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

চিত্র 14. একাধিক স্তরের জন্য একটি ফিল্টার সংযোগের ফ্লো ডায়াগ্রাম

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

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

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

TRM ইন্টারফেস

TRM টিউনার ফ্রেমওয়ার্ক, 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 ক্লায়েন্টের প্রোফাইল থেকে প্যারামিটার এবং কনফিগারেশন ফাইল থেকে অগ্রাধিকার মান ব্যবহার করে ক্লায়েন্টের অগ্রাধিকার গণনা করে। অগ্রাধিকারটি ক্লায়েন্টের কাছ থেকে একটি নির্বিচারে অগ্রাধিকার মান দ্বারা আপডেট করা যেতে পারে।

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

টিআরএম 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 490 400
PLAYBACK 480 300
RECORD 600 500
SCAN 450 200
BACKGROUND 180 100
কাস্টমাইজড কনফিগারেশন ফাইল

বিক্রেতারা কনফিগারেশন ফাইল /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 প্রদান করে। স্বেচ্ছাচারী অগ্রাধিকার মানটি ব্যবহারের ক্ষেত্রের ধরন এবং সেশন আইডি থেকে গণনা করা অগ্রাধিকার মানটিকে ওভাররাইট করে।

চমৎকার মান নির্দেশ করে যে ক্লায়েন্টের আচরণ অন্য ক্লায়েন্টের সাথে সংঘর্ষে কতটা নম্র হয়। চ্যালেঞ্জিং ক্লায়েন্টের সাথে তার অগ্রাধিকার মান তুলনা করার আগে চমৎকার মানটি ক্লায়েন্টের অগ্রাধিকার মানকে হ্রাস করে।

মেকানিজম পুনরুদ্ধার করুন

নীচের চিত্রটি দেখায় যে কীভাবে সম্পদ পুনরুদ্ধার করা হয় এবং বরাদ্দ করা হয় যখন একটি সম্পদ দ্বন্দ্ব ঘটে।

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

চিত্র 15. টিউনার সংস্থানগুলির মধ্যে দ্বন্দ্বের জন্য পুনরুদ্ধার প্রক্রিয়ার চিত্র