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
- ডিভিবি সি/এস/টি
- আইএসডিবি 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
এবং পাসথ্রু মোডের জন্য কনফিগার করা সমর্থন।
চিত্র 2. টিউনার HAL-এর মধ্যে উপাদানগুলির চিত্র
সামগ্রিক কর্মপ্রবাহ
নীচের চিত্রগুলি সরাসরি সম্প্রচার প্লেব্যাকের জন্য কল ক্রমগুলিকে চিত্রিত করে৷
সেটআপ
চিত্র 3. লাইভ সম্প্রচার প্লেব্যাকের জন্য সেটআপ ক্রম
A/V হ্যান্ডলিং
চিত্র 4. সরাসরি সম্প্রচার প্লেব্যাকের জন্য A/V হ্যান্ডলিং
স্ক্র্যাম্বল কন্টেন্ট হ্যান্ডলিং
চিত্র 5. লাইভ সম্প্রচার প্লেব্যাকের জন্য স্ক্র্যাম্বল করা বিষয়বস্তু পরিচালনা করা
A/V ডেটা প্রসেস করা হচ্ছে
চিত্র 6. লাইভ সম্প্রচার প্লেব্যাকের জন্য A/V প্রক্রিয়াকরণ
টিউনার SDK API
Tuner SDK API টিউনার JNI, Tuner HAL, এবং TunerResourceManager
এর সাথে মিথস্ক্রিয়া পরিচালনা করে। টিআইএস অ্যাপ টিউনার রিসোর্স এবং ফিল্টার এবং ডেসক্র্যাম্বলারের মতো সাবকম্পোনেন্ট অ্যাক্সেস করতে Tuner 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
চিত্র 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
এ একটি ফ্রিকোয়েন্সি নির্দিষ্ট করা যেতে পারে, কিন্তু TISFrontendSettings
এ অন্যান্য সেটিংস উপেক্ষা করে। - সিগন্যাল লক করা থাকলে 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: | বাধ্যতামূলক:DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW প্রস্তাবিত: DemuxFilterStatus::LOW_WATER DemuxFilterStatus::HIGH_WATER | ঘটনা এবং অভ্যন্তরীণ সময়সূচী অনুযায়ী, রানFilter.read(buffer, offset, adjustedSize) এক বা একাধিক বার।HAL এর MQ থেকে ক্লায়েন্ট বাফারে ডেটা কপি করা হয়। | একটি একত্রিত সেশন প্যাকেজ অন্য সেশন প্যাকেজ দ্বারা FMQ তে পূরণ করা হয়। |
isRaw: | বাধ্যতামূলক:DemuxFilterEvent::DemuxFilterSectionEvent[n] DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW ঐচ্ছিক: DemuxFilterStatus::LOW_WATER DemuxFilterStatus::HIGH_WATER | for i=0; i<n; i++ HAL এর MQ থেকে ক্লায়েন্ট বাফারে ডেটা কপি করা হয়। | ||
TS.PES | isRaw: | বাধ্যতামূলক:DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW প্রস্তাবিত: DemuxFilterStatus::LOW_WATER DemuxFilterStatus::HIGH_WATER | ঘটনা এবং অভ্যন্তরীণ সময়সূচী অনুযায়ী, রানFilter.read(buffer, offset, adjustedSize) এক বা একাধিক বার।HAL এর MQ থেকে ক্লায়েন্ট বাফারে ডেটা কপি করা হয়। | একটি একত্রিত PES প্যাকেজ FMQ-এ অন্য PES প্যাকেজ দ্বারা পূরণ করা হয়। |
isRaw: | বাধ্যতামূলক:DemuxFilterEvent::DemuxFilterPesEvent[n] DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW ঐচ্ছিক: DemuxFilterStatus::LOW_WATER DemuxFilterStatus::HIGH_WATER | for i=0; i<n; i++ HAL এর MQ থেকে ক্লায়েন্ট বাফারে ডেটা কপি করা হয়। | ||
MMTP.PES | isRaw: | বাধ্যতামূলক:DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW প্রস্তাবিত: DemuxFilterStatus::LOW_WATER DemuxFilterStatus::HIGH_WATER | ঘটনা এবং অভ্যন্তরীণ সময়সূচী অনুযায়ী, রানFilter.read(buffer, offset, adjustedSize) এক বা একাধিক বার।HAL এর MQ থেকে ক্লায়েন্ট বাফারে ডেটা কপি করা হয়। | একটি একত্রিত MFU প্যাকেজ FMQ-তে অন্য MFU প্যাকেজ দ্বারা পূরণ করা হয়। |
isRaw: | বাধ্যতামূলক:DemuxFilterEvent::DemuxFilterPesEvent[n] DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW ঐচ্ছিক: DemuxFilterStatus::LOW_WATER DemuxFilterStatus::HIGH_WATER | for i=0; i<n; i++ 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: | ঐচ্ছিক:DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW | DemuxFilterStatus::DATA_READY পাওয়ার পর ক্লায়েন্ট MediaCodec শুরু করতে পারে।DemuxFilterStatus::DATA_OVERFLOW পাওয়ার পর ক্লায়েন্ট Filter.flush কল করতে পারে। | N/A |
isPassthrough: | বাধ্যতামূলক:DemuxFilterEvent::DemuxFilterMediaEvent[n] DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW ঐচ্ছিক: DemuxFilterStatus::LOW_WATER DemuxFilterStatus::HIGH_WATER | MediaCodec ব্যবহার করতে:for i=0; i<n; i++ AudioTrack সরাসরি অডিও ব্যবহার করতে:for i=0; i<n; i++ | 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++ রেকর্ড করা বিষয়বস্তুর জন্য , RecordStatus::* এবং অভ্যন্তরীণ সময়সূচী অনুসারে, নিম্নলিখিতগুলির মধ্যে একটি করুন:
| সূচক ডেটার জন্য: ইভেন্ট পেলোডে বহন করা হয়। রেকর্ড করা বিষয়বস্তুর জন্য: মিক্সড টিএস স্ট্রিম এফএমকিউ-তে ভরা। |
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++ | 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++ রেকর্ড করা বিষয়বস্তুর জন্য , RecordStatus::* এবং অভ্যন্তরীণ সময়সূচী অনুসারে, নিম্নলিখিতগুলির মধ্যে একটি করুন:
| সূচক ডেটার জন্য: ইভেন্ট পেলোডে বহন করা হয়। রেকর্ড করা বিষয়বস্তুর জন্য: মিক্সড রেকর্ড করা স্ট্রীম 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: | ঐচ্ছিক:DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW | ফিল্টার করা প্রোটোকল সাব স্ট্রীম ফিল্টার চেইনের পরবর্তী ফিল্টারকে ফিড করে। | N/A |
isPassthrough: | বাধ্যতামূলক: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 তৈরি করতে ফিল্টার ব্যবহার করার উদাহরণ প্রবাহ
চিত্র 10. PSI/SI নির্মাণের জন্য প্রবাহ
একটি ফিল্টার খুলুন।
Filter filter = tuner.openFilter( Filter.TYPE_TS, Filter.SUBTYPE_SECTION, /* bufferSize */1000, executor, filterCallback );
কনফিগার করুন এবং ফিল্টার শুরু করুন।
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();
প্রক্রিয়া
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 ব্যবহার করার উদাহরণ প্রবাহ
চিত্র 11. ফিল্টার থেকে মিডিয়া ইভেন্ট ব্যবহার করার জন্য প্রবাহ
- A/V ফিল্টার খুলুন, কনফিগার করুন এবং শুরু করুন।
-
MediaEvent
প্রক্রিয়া করুন। -
MediaEvent
গ্রহণ করুন। - রৈখিক ব্লককে
codec
সারিবদ্ধ করুন। - ডেটা খরচ হয়ে গেলে 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. একটি রেকর্ড শুরু করার জন্য প্রবাহ
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();
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. } } } };
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 |
চিত্র 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. টিউনার সংস্থানগুলির মধ্যে দ্বন্দ্বের জন্য পুনরুদ্ধার প্রক্রিয়ার চিত্র
,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
- ডিভিবি সি/এস/টি
- আইএসডিবি 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
এবং পাসথ্রু মোডের জন্য কনফিগার করা সমর্থন।
চিত্র 2. টিউনার HAL-এর মধ্যে উপাদানগুলির চিত্র
সামগ্রিক কর্মপ্রবাহ
নীচের চিত্রগুলি সরাসরি সম্প্রচার প্লেব্যাকের জন্য কল ক্রমগুলিকে চিত্রিত করে৷
সেটআপ
চিত্র 3. লাইভ সম্প্রচার প্লেব্যাকের জন্য সেটআপ ক্রম
A/V হ্যান্ডলিং
চিত্র 4. সরাসরি সম্প্রচার প্লেব্যাকের জন্য A/V হ্যান্ডলিং
স্ক্র্যাম্বল কন্টেন্ট হ্যান্ডলিং
চিত্র 5. লাইভ সম্প্রচার প্লেব্যাকের জন্য স্ক্র্যাম্বল করা বিষয়বস্তু পরিচালনা করা
A/V ডেটা প্রসেস করা হচ্ছে
চিত্র 6. লাইভ সম্প্রচার প্লেব্যাকের জন্য A/V প্রক্রিয়াকরণ
টিউনার SDK API
Tuner SDK API টিউনার JNI, Tuner HAL, এবং TunerResourceManager
এর সাথে মিথস্ক্রিয়া পরিচালনা করে। টিআইএস অ্যাপ টিউনার রিসোর্স এবং ফিল্টার এবং ডেসক্র্যাম্বলারের মতো সাবকম্পোনেন্ট অ্যাক্সেস করতে Tuner 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
চিত্র 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
এ একটি ফ্রিকোয়েন্সি নির্দিষ্ট করা যেতে পারে, কিন্তু TISFrontendSettings
এ অন্যান্য সেটিংস উপেক্ষা করে। - সিগন্যাল লক করা থাকলে 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
অ্যান্ড্রয়েড 12 থেকে টিউনার এইচএল 1.1 বা উচ্চতর সহ, নিম্নলিখিত ইভেন্টগুলি সমর্থিত।
-
IpCidChangeEvent
-
RestartEvent
-
ScramblingStatusEvent
ফিল্টার থেকে ইভেন্ট এবং ডেটা ফর্ম্যাট
ফিল্টার প্রকার | পতাকা | ঘটনা | ডেটা অপারেশন | উপাত্ত বিন্যাস |
---|---|---|---|---|
TS.SECTION MMTP.SECTION IP.SECTION TLV.SECTION ALP.SECTION | isRaw: | বাধ্যতামূলক:DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW প্রস্তাবিত: DemuxFilterStatus::LOW_WATER DemuxFilterStatus::HIGH_WATER | ইভেন্ট এবং অভ্যন্তরীণ সময়সূচি অনুসারে, রানFilter.read(buffer, offset, adjustedSize) এক বা একাধিকবার পড়ুন।এইচএল এর এমকিউ থেকে ক্লায়েন্ট বাফারে ডেটা অনুলিপি করা হয়। | একটি একত্রিত সেশন প্যাকেজ অন্য সেশন প্যাকেজ দ্বারা এফএমকিউতে পূরণ করা হয়। |
isRaw: | বাধ্যতামূলক:DemuxFilterEvent::DemuxFilterSectionEvent[n] DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW ঐচ্ছিক: DemuxFilterStatus::LOW_WATER DemuxFilterStatus::HIGH_WATER | for i=0; i<n; i++ এইচএল এর এমকিউ থেকে ক্লায়েন্ট বাফারে ডেটা অনুলিপি করা হয়। | ||
TS.PES | isRaw: | বাধ্যতামূলক:DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW প্রস্তাবিত: DemuxFilterStatus::LOW_WATER DemuxFilterStatus::HIGH_WATER | ইভেন্ট এবং অভ্যন্তরীণ সময়সূচি অনুসারে, রানFilter.read(buffer, offset, adjustedSize) এক বা একাধিকবার পড়ুন।এইচএল এর এমকিউ থেকে ক্লায়েন্ট বাফারে ডেটা অনুলিপি করা হয়। | একটি একত্রিত পিইএস প্যাকেজটি অন্য পিইএস প্যাকেজ দ্বারা এফএমকিউতে পূরণ করা হয়। |
isRaw: | বাধ্যতামূলক:DemuxFilterEvent::DemuxFilterPesEvent[n] DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW ঐচ্ছিক: DemuxFilterStatus::LOW_WATER DemuxFilterStatus::HIGH_WATER | for i=0; i<n; i++ এইচএল এর এমকিউ থেকে ক্লায়েন্ট বাফারে ডেটা অনুলিপি করা হয়। | ||
MMTP.PES | isRaw: | বাধ্যতামূলক:DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW প্রস্তাবিত: DemuxFilterStatus::LOW_WATER DemuxFilterStatus::HIGH_WATER | ইভেন্ট এবং অভ্যন্তরীণ সময়সূচি অনুসারে, রানFilter.read(buffer, offset, adjustedSize) এক বা একাধিকবার পড়ুন।এইচএল এর এমকিউ থেকে ক্লায়েন্ট বাফারে ডেটা অনুলিপি করা হয়। | একটি একত্রিত এমএফইউ প্যাকেজটি অন্য এমএফইউ প্যাকেজ দ্বারা এফএমকিউতে পূরণ করা হয়। |
isRaw: | বাধ্যতামূলক:DemuxFilterEvent::DemuxFilterPesEvent[n] DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW ঐচ্ছিক: DemuxFilterStatus::LOW_WATER DemuxFilterStatus::HIGH_WATER | for i=0; i<n; i++ এইচএল এর এমকিউ থেকে ক্লায়েন্ট বাফারে ডেটা অনুলিপি করা হয়। | ||
TS.TS | N/A | বাধ্যতামূলক:DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW প্রস্তাবিত: DemuxFilterStatus::LOW_WATER DemuxFilterStatus::HIGH_WATER | ইভেন্ট এবং অভ্যন্তরীণ সময়সূচি অনুসারে, রানFilter.read(buffer, offset, adjustedSize) এক বা একাধিকবার পড়ুন।এইচএল এর এমকিউ থেকে ক্লায়েন্ট বাফারে ডেটা অনুলিপি করা হয়। | ts শিরোনাম সহ ts ফিল্টার করাএফএমকিউতে পূর্ণ হয়। |
TS.Audio TS.Video MMTP.Audio MMTP.Video | isPassthrough: | ঐচ্ছিক:DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW | ক্লায়েন্ট DemuxFilterStatus::DATA_READY প্রাপ্তির পরে MediaCodec শুরু করতে পারে।ক্লায়েন্ট DemuxFilterStatus::DATA_OVERFLOW পাওয়ার পরে Filter.flush কল করতে পারে। | N/A |
isPassthrough: | বাধ্যতামূলক:DemuxFilterEvent::DemuxFilterMediaEvent[n] DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW ঐচ্ছিক: DemuxFilterStatus::LOW_WATER DemuxFilterStatus::HIGH_WATER | MediaCodec ব্যবহার করতে:for i=0; i<n; i++ AudioTrack সরাসরি অডিও ব্যবহার করতে:for i=0; i<n; i++ | আয়ন মেমরিতে ES বা আংশিক ES ডেটা। | |
TS.PCR IP.NTP ALP.PTP | N/A | বাধ্যতামূলক: এন/এ Al চ্ছিক: এন/এ | 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++ RecordStatus::* এবং অভ্যন্তরীণ সময়সূচী অনুসারে রেকর্ড করা সামগ্রীর জন্য নিম্নলিখিতগুলির মধ্যে একটি করুন:
| সূচক ডেটার জন্য: ইভেন্ট পে -লোডে বহন করা। রেকর্ড করা সামগ্রীর জন্য: FMQ এ ভরাট মক্সড টিএস স্ট্রিম। |
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++ | N/A |
MMTP.MMTP | N/A | বাধ্যতামূলক:DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW প্রস্তাবিত: DemuxFilterStatus::LOW_WATER DemuxFilterStatus::HIGH_WATER | ইভেন্ট এবং অভ্যন্তরীণ সময়সূচি অনুসারে, রানFilter.read(buffer, offset, adjustedSize) এক বা একাধিকবার পড়ুন।এইচএল এর এমকিউ থেকে ক্লায়েন্ট বাফারে ডেটা অনুলিপি করা হয়। | mmtp শিরোনাম সহ mmtp ফিল্টার করাএফএমকিউতে পূর্ণ হয়। |
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++ RecordStatus::* এবং অভ্যন্তরীণ সময়সূচী অনুসারে রেকর্ড করা সামগ্রীর জন্য নিম্নলিখিতগুলির মধ্যে একটি করুন:
| সূচক ডেটার জন্য: ইভেন্ট পে -লোডে বহন করা। রেকর্ড করা সামগ্রীর জন্য: FMQ এ ভরাট রেকর্ড করা স্ট্রিম। যদি রেকর্ডিংয়ের জন্য ফিল্টার উত্সটি পাসথ্রু সহ IP.IP TLV.TLV হয় তবে রেকর্ড করা স্ট্রিমটিতে একটি টিএলভি এবং আইপি শিরোনাম রয়েছে। |
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) এইচএল এর এমকিউ থেকে ক্লায়েন্ট বাফারে ডেটা অনুলিপি করা হয়। | ডাউনলোড প্যাকেজটি অন্য আইপি ডাউনলোড প্যাকেজ দ্বারা এফএমকিউতে পূরণ করা হয়। |
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) এইচএল এর এমকিউ থেকে ক্লায়েন্ট বাফারে ডেটা অনুলিপি করা হয়। | আইপি পে -লোড প্যাকেজটি অন্য আইপি পে -লোড প্যাকেজ দ্বারা এফএমকিউতে পূরণ করা হয়। |
IP.IP TLV.TLV ALP.ALP | isPassthrough: | ঐচ্ছিক:DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW | ফিল্টার আউট প্রোটোকল সাব স্ট্রিম ফিল্টার চেইনে পরবর্তী ফিল্টার ফিড করে। | N/A |
isPassthrough: | বাধ্যতামূলক:DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW প্রস্তাবিত: DemuxFilterStatus::LOW_WATER DemuxFilterStatus::HIGH_WATER | ইভেন্ট এবং অভ্যন্তরীণ সময়সূচি অনুসারে, রানFilter.read(buffer, offset, adjustedSize) এক বা একাধিকবার পড়ুন।এইচএল এর এমকিউ থেকে ক্লায়েন্ট বাফারে ডেটা অনুলিপি করা হয়। | প্রোটোকল শিরোনাম সহ ফিল্টার আউট প্রোটোকল সাব স্ট্রিমটি এফএমকিউতে পূরণ করা হয়। | |
IP.PAYLOAD_THROUGH TLV.PAYLOAD_THROUGH ALP.PAYLOAD_THROUGH | N/A | ঐচ্ছিক:DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW | ফিল্টার আউট প্রোটোকল পে -লোড ফিল্টার চেইনে পরবর্তী ফিল্টারকে ফিড করে। | N/A |
পিএসআই/এসআই তৈরি করতে ফিল্টার ব্যবহার করতে উদাহরণ প্রবাহ
চিত্র 10. পিএসআই/এসআই নির্মাণে প্রবাহ
একটি ফিল্টার খুলুন।
Filter filter = tuner.openFilter( Filter.TYPE_TS, Filter.SUBTYPE_SECTION, /* bufferSize */1000, executor, filterCallback );
কনফিগার করুন এবং ফিল্টার শুরু করুন।
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();
প্রক্রিয়া
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); } } } };
ফিল্টার থেকে মধ্যযুগীয় ব্যবহার করতে উদাহরণ প্রবাহ
চিত্র 11. ফিল্টার থেকে মধ্যযুগীয় ব্যবহার করতে প্রবাহ
- খুলুন, কনফিগার করুন এবং এ/ভি ফিল্টারগুলি শুরু করুন।
- প্রক্রিয়া
MediaEvent
। -
MediaEvent
গ্রহণ করুন। -
codec
থেকে লিনিয়ার ব্লক সারি করুন। - ডেটা গ্রাস করা হলে এ/ভি হ্যান্ডেলটি ছেড়ে দিন।
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
একটি ডিভিআর উদাহরণের স্থিতি প্রতিবেদন করতে ব্যবহৃত হয়।
একটি রেকর্ড শুরু করতে উদাহরণ প্রবাহ
চিত্র 12. একটি রেকর্ড শুরু করতে প্রবাহ
খুলুন, কনফিগার করুন এবং
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();
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. } } } };
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); } } };
টিউনার হাল
টিউনার হাল এইচআইডিএল অনুসরণ করে এবং ফ্রেমওয়ার্ক এবং বিক্রেতার হার্ডওয়্যারগুলির মধ্যে ইন্টারফেসটি সংজ্ঞায়িত করে। বিক্রেতারা টিউনার এইচএল বাস্তবায়নের জন্য ইন্টারফেসটি ব্যবহার করে এবং ফ্রেমওয়ার্কটি টিউনার এইচএল বাস্তবায়নের সাথে যোগাযোগের জন্য এটি ব্যবহার করে।
মডিউল
টিউনার হাল 1.0
মডিউল | মৌলিক নিয়ন্ত্রণ | মডিউল-নির্দিষ্ট নিয়ন্ত্রণ | হাল ফাইল |
---|---|---|---|
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 |
টিউনার এইচএল 1.1 (টিউনার এইচএল 1.0 থেকে প্রাপ্ত)
মডিউল | মৌলিক নিয়ন্ত্রণ | মডিউল-নির্দিষ্ট নিয়ন্ত্রণ | হাল ফাইল |
---|---|---|---|
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 |
চিত্র 13. টিউনার এইচএল মডিউলগুলির মধ্যে মিথস্ক্রিয়াটির চিত্র
ফিল্টার লিঙ্কেজ
টিউনার এইচএল ফিল্টার সংযোগকে সমর্থন করে যেমন ফিল্টারগুলি একাধিক স্তরগুলির জন্য অন্যান্য ফিল্টারগুলির সাথে লিঙ্ক করা যায়। ফিল্টারগুলি নীচের নিয়মগুলি অনুসরণ করে।
- ফিল্টারগুলি গাছ হিসাবে যুক্ত, ঘনিষ্ঠ পথ অনুমোদিত নয়।
- মূল নোডটি ডেমাক্স।
- ফিল্টারগুলি স্বাধীনভাবে কাজ করে।
- সমস্ত ফিল্টার ডেটা পেতে শুরু করে।
- ফিল্টার লিঙ্কেজটি শেষ ফিল্টারটিতে ফ্লাশ করে।
নীচের কোড ব্লক এবং চিত্র 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. একাধিক স্তরগুলির জন্য একটি ফিল্টার লিঙ্কেজের ফ্লো ডায়াগ্রাম
টিউনার রিসোর্স ম্যানেজার
টিউনার রিসোর্স ম্যানেজার (টিআরএম) এর আগে, দুটি অ্যাপের মধ্যে স্যুইচিংয়ের জন্য একই টিউনার হার্ডওয়্যার প্রয়োজন। টিভি ইনপুট ফ্রেমওয়ার্ক (টিআইএফ) একটি "প্রথম থেকে আক্রোয়ার উইন" প্রক্রিয়া ব্যবহার করেছে, যার অর্থ যে কোনও অ্যাপ্লিকেশনটি সম্পদটি প্রথমে সম্পদটি প্রথমে রিসোর্স রাখে। তবে এই প্রক্রিয়াটি কিছু জটিল ব্যবহারের ক্ষেত্রে আদর্শ নাও হতে পারে।
টিআরএম অ্যাপ্লিকেশনগুলির জন্য টিউনার, TVInput
এবং সিএএস হার্ডওয়্যার সংস্থানগুলি পরিচালনা করতে সিস্টেম পরিষেবা হিসাবে চলে। টিআরএম একটি "ফোরগ্রাউন্ড উইন" প্রক্রিয়া ব্যবহার করে, যা অ্যাপের অগ্রভাগ বা পটভূমির স্থিতির উপর ভিত্তি করে অ্যাপ্লিকেশনটির অগ্রাধিকার গণনা করে এবং কেস টাইপ ব্যবহার করে। টিআরএম অগ্রাধিকারের ভিত্তিতে সংস্থানকে অনুদান দেয় বা প্রত্যাহার করে। টিআরএম সম্প্রচার, ওটিটি এবং ডিভিআর এর জন্য এটিভি রিসোর্স ম্যানেজমেন্টকে কেন্দ্রিয় করে তোলে।
টিআরএম ইন্টারফেস
টিআরএম ITunerResourceManager.aidl
ফ্রেমওয়ার্ক, MediaCas
এবং টিভি ইনপথার্ডওয়ারম্যানেজারের জন্য রেজিস্ট্রেশন, অনুরোধ বা প্রকাশের জন্য টিউনার ফ্রেমওয়ার্ক, মিডিয়াকাস এবং TvInputHardwareManager
ম্যানেজারের জন্য আইডল ইন্টারফেসগুলি প্রকাশ করে।
ক্লায়েন্ট পরিচালনার জন্য ইন্টারফেসগুলি নীচে তালিকাভুক্ত করা হয়েছে।
-
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
ক্লায়েন্ট অগ্রাধিকার
টিআরএম ক্লায়েন্টের প্রোফাইল থেকে পরামিতি এবং কনফিগারেশন ফাইল থেকে অগ্রাধিকার মান ব্যবহার করে ক্লায়েন্টের অগ্রাধিকার গণনা করে। অগ্রাধিকারটি ক্লায়েন্টের কাছ থেকে একটি স্বেচ্ছাসেবী অগ্রাধিকার মান দ্বারা আপডেট করা যেতে পারে।
ক্লায়েন্টের প্রোফাইলে পরামিতি
টিআরএম কোনও অ্যাপ্লিকেশনটি অগ্রভাগ বা পটভূমি অ্যাপ্লিকেশন কিনা তা সিদ্ধান্ত নিতে mTvInputSessionId
থেকে প্রক্রিয়া আইডি পুনরুদ্ধার করে। mTvInputSessionId
তৈরি করতে, TvInputService.onCreateSession
, বা TvInputService.onCreateRecordingSession
একটি টিআইএস সেশন শুরু করে।
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
অনুসরণ করা উচিত।
স্বেচ্ছাসেবী অগ্রাধিকার মান এবং সুন্দর মান
টিআরএম ক্লায়েন্টকে স্বেচ্ছাসেবী অগ্রাধিকারের মান এবং সুন্দর মান আপডেট করার জন্য updateClientPriority
সরবরাহ করে। স্বেচ্ছাসেবী অগ্রাধিকারের মান ব্যবহারের কেস টাইপ এবং সেশন আইডি থেকে গণনা করা অগ্রাধিকার মানকে ওভাররাইট করে।
সুন্দর মানটি নির্দেশ করে যে ক্লায়েন্টের আচরণটি অন্য ক্লায়েন্টের সাথে বিরোধের সময় কতটা হালকা হয়। চ্যালেঞ্জিং ক্লায়েন্টের সাথে তুলনা করার আগে তার অগ্রাধিকারের মানটির আগে ক্লায়েন্টের অগ্রাধিকার মান হ্রাস করে।
পুনরায় দাবি ব্যবস্থা
নীচের চিত্রটি দেখায় যে কোনও সংস্থান সংঘাত ঘটে তখন কীভাবে সংস্থানগুলি পুনরুদ্ধার করা হয় এবং নির্ধারিত হয়।
চিত্র 15. টিউনার রিসোর্সের মধ্যে একটি বিরোধের জন্য পুনরায় দাবি ব্যবস্থার ডায়াগ্রাম
,অ্যান্ড্রয়েড 11 বা উচ্চতর জন্য, আপনি একটি/ভি সামগ্রী সরবরাহ করতে অ্যান্ড্রয়েড টিউনার ফ্রেমওয়ার্কটি ব্যবহার করতে পারেন। ফ্রেমওয়ার্কটি বিক্রেতাদের কাছ থেকে হার্ডওয়্যার পাইপলাইন ব্যবহার করে, এটি নিম্ন-শেষ এবং উচ্চ-শেষ উভয় এসওসি উভয়ের জন্য উপযুক্ত করে তোলে। কাঠামোটি একটি বিশ্বস্ত এক্সিকিউশন এনভায়রনমেন্ট (টিইই) এবং সুরক্ষিত মিডিয়া পাথ (এসএমপি) দ্বারা সুরক্ষিত এ/ভি সামগ্রী সরবরাহ করার একটি সুরক্ষিত উপায় সরবরাহ করে, এটি একটি অত্যন্ত সীমাবদ্ধ, সামগ্রী সুরক্ষা পরিবেশে ব্যবহার করার অনুমতি দেয়।
টিউনার এবং অ্যান্ড্রয়েড সিএএসের মধ্যে স্ট্যান্ডার্ডাইজড ইন্টারফেসের ফলে টিউনার বিক্রেতাদের এবং সিএএস বিক্রেতাদের মধ্যে দ্রুত সংহতকরণ হয়। টিউনার ইন্টারফেসটি অ্যান্ড্রয়েড টিভির জন্য একটি বিশ্ব সমাধান তৈরি করতে MediaCodec
এবং AudioTrack
সাথে কাজ করে। টিউনার ইন্টারফেসটি বড় সম্প্রচারের মানগুলির ভিত্তিতে ডিজিটাল টিভি এবং অ্যানালগ টিভি উভয়কেই সমর্থন করে।
উপাদান
অ্যান্ড্রয়েড 11 এর জন্য, তিনটি উপাদান বিশেষত টিভি প্ল্যাটফর্মের জন্য ডিজাইন করা হয়েছে।
- টিউনার এইচএল: কাঠামো এবং বিক্রেতাদের মধ্যে একটি ইন্টারফেস
- টিউনার এসডিকে এপিআই: ফ্রেমওয়ার্ক এবং অ্যাপ্লিকেশনগুলির মধ্যে একটি ইন্টারফেস
- টিউনার রিসোর্স ম্যানেজার (টিআরএম): টিউনার এইচডাব্লু রিসোর্সগুলির সমন্বয় করে
অ্যান্ড্রয়েড 11 এর জন্য, নিম্নলিখিত উপাদানগুলি বাড়ানো হয়েছে।
- ক্যাস ভি 2
-
TvInputService
বা টিভি ইনপুট পরিষেবা (টিআইএস) -
TvInputManagerService
বা টিভি ইনপুট ম্যানেজার পরিষেবা (টিআইএমএস) -
MediaCodec
বা মিডিয়া কোডেক -
AudioTrack
বা অডিও ট্র্যাক -
MediaResourceManager
বা মিডিয়া রিসোর্স ম্যানেজার (এমআরএম)
চিত্র 1. অ্যান্ড্রয়েড টিভি উপাদানগুলির মধ্যে মিথস্ক্রিয়া
বৈশিষ্ট্য
ফ্রন্টেন্ড নীচে ডিটিভি মান সমর্থন করে।
- ATSC
- এটিএসসি 3
- ডিভিবি সি/এস/টি
- আইএসডিবি এস/এস 3/টি
- এনালগ
টিউনার এইচএল 1.1 বা উচ্চতর সহ অ্যান্ড্রয়েড 12 এর ফ্রন্টেন্ডটি নীচে ডিটিভি স্ট্যান্ডার্ডকে সমর্থন করে।
- ডিটিএমবি
ডেমাক্স নীচে স্ট্রিম প্রোটোকল সমর্থন করে।
- পরিবহন স্ট্রিম (টিএস)
- এমপিইজি মিডিয়া ট্রান্সপোর্ট প্রোটোকল (এমএমটিপি)
- ইন্টারনেট প্রোটোকল (আইপি)
- দৈর্ঘ্যের মান টাইপ করুন (টিএলভি)
- এটিএসসি লিংক-স্তর প্রোটোকল (এএলপি)
ডেসক্র্যামব্লার নীচের সামগ্রী সুরক্ষা সমর্থন করে।
- সুরক্ষিত মিডিয়া পাথ
- মিডিয়া পথ সাফ করুন
- স্থানীয় রেকর্ড সুরক্ষিত
- স্থানীয় প্লেব্যাক সুরক্ষিত করুন
টিউনার এপিআইগুলি নীচের ব্যবহারের ক্ষেত্রে সমর্থন করে।
- স্ক্যান
- লাইভ দেখান
- প্লেব্যাক
- রেকর্ড
টিউনার, MediaCodec
এবং AudioTrack
নীচের ডেটা ফ্লো মোডগুলিকে সমর্থন করে।
- ক্লিয়ার মেমরি বাফার সহ ES পে -লোড
- সুরক্ষিত মেমরি হ্যান্ডেল সহ ES পে -লোড
- পাসথ্রু
সামগ্রিক নকশা
টিউনার এইচএলটি অ্যান্ড্রয়েড ফ্রেমওয়ার্ক এবং বিক্রেতার হার্ডওয়্যারগুলির মধ্যে সংজ্ঞায়িত করা হয়েছে।
- ফ্রেমওয়ার্কটি বিক্রেতার কাছ থেকে কী প্রত্যাশা করে এবং কীভাবে বিক্রেতা এটি করতে পারে তা বর্ণনা করে।
-
IFrontend
,IDemux
, আইডেসক্র্যামব্লার,IDescrambler
,IFilter
এবংILnb
ইন্টারফেসের মাধ্যমে ফ্রন্টেন্ড,IDvr
এবং ডেসক্র্যামবেলারের কার্যকারিতা ফ্রন্টেন্ডে রফতানি করে। -
MediaCodec
এবংAudioTrack
মতো অন্যান্য ফ্রেমওয়ার্ক উপাদানগুলির সাথে টিউনার এইচএএলকে সংহত করার জন্য ফাংশনগুলি অন্তর্ভুক্ত করে।
একটি টিউনার জাভা ক্লাস এবং স্থানীয় শ্রেণি তৈরি করা হয়।
- টিউনার জাভা এপিআই অ্যাপ্লিকেশনগুলিকে পাবলিক এপিআইয়ের মাধ্যমে টিউনার এইচএল অ্যাক্সেস করার অনুমতি দেয়।
- নেটিভ ক্লাস টিউনার এইচএল এর সাথে প্রচুর পরিমাণে রেকর্ডিং বা প্লেব্যাক ডেটা হ্যান্ডলিংয়ের অনুমতি নিয়ন্ত্রণ এবং পরিচালনা করার অনুমতি দেয়।
- নেটিভ টিউনার মডিউলটি টিউনার জাভা ক্লাস এবং টিউনার হালের মধ্যে একটি সেতু।
একটি টিআরএম ক্লাস তৈরি করা হয়।
- টিভি ইনপুট হাল থেকে ফ্রন্টেন্ড, এলএনবি, ক্যাস সেশন এবং একটি টিভি ইনপুট ডিভাইস হিসাবে সীমিত টিউনার সংস্থান পরিচালনা করে।
- অ্যাপ্লিকেশনগুলি থেকে অপর্যাপ্ত সংস্থানগুলি পুনরায় দাবি করার জন্য নিয়ম প্রয়োগ করে। ডিফল্ট নিয়মটি অগ্রভাগের জয়।
মিডিয়া সিএএস এবং সিএএস এইচএল নীচের বৈশিষ্ট্যগুলির সাথে বাড়ানো হয়েছে।
- বিভিন্ন ব্যবহার এবং অ্যালগরিদমের জন্য ক্যাস সেশনগুলি খোলে।
- গতিশীল ক্যাস সিস্টেমগুলিকে সমর্থন করে, যেমন সিক্যাম অপসারণ এবং সন্নিবেশ।
- কী টোকেন সরবরাহ করে টিউনার এইচএএল এর সাথে সংহত করে।
MediaCodec
এবং AudioTrack
নীচের বৈশিষ্ট্যগুলির সাথে বাড়ানো হয়েছে।
- সামগ্রী ইনপুট হিসাবে সুরক্ষিত এ/ভি মেমরি নেয়।
- টানেলযুক্ত প্লেব্যাকটিতে হার্ডওয়্যার এ/ভি সিঙ্ক করতে কনফিগার করা।
-
ES_payload
এবং পাসথ্রু মোডের জন্য কনফিগার করা সমর্থন।
চিত্র 2. টিউনার এইচএএল এর মধ্যে উপাদানগুলির ডায়াগ্রাম
সামগ্রিক কর্মপ্রবাহ
নীচের চিত্রগুলি লাইভ সম্প্রচার প্লেব্যাকের জন্য কল সিকোয়েন্সগুলি চিত্রিত করে।
সেটআপ
চিত্র 3. লাইভ সম্প্রচার প্লেব্যাকের জন্য সেটআপ সিকোয়েন্স
হ্যান্ডলিং এ/ভি
চিত্র 4. লাইভ সম্প্রচার প্লেব্যাকের জন্য এ/ভি পরিচালনা করা
স্ক্র্যাম্বলড সামগ্রী হ্যান্ডলিং
চিত্র 5. লাইভ সম্প্রচার প্লেব্যাকের জন্য স্ক্র্যাম্বলড সামগ্রী হ্যান্ডলিং
একটি/ভি ডেটা প্রক্রিয়াকরণ
চিত্র 6. লাইভ সম্প্রচার প্লেব্যাকের জন্য এ/ভি প্রক্রিয়াজাতকরণ
টিউনার এসডিকে এপিআই
টিউনার এসডিকে এপিআই টিউনার জেএনআই, টিউনার এইচএল এবং TunerResourceManager
সাথে ইন্টারঅ্যাকশনগুলি পরিচালনা করে। টিআইএস অ্যাপটি টিউনার এসডিকে এপিআই ব্যবহার করে টিউনার সংস্থান এবং ফিল্টার এবং ডেসক্র্যামব্লারের মতো উপ -উপাদানগুলি অ্যাক্সেস করতে। ফ্রন্টেন্ড এবং ডেমাক্স অভ্যন্তরীণ উপাদান।
চিত্র 7. টিউনার এসডিকে এপিআইয়ের সাথে মিথস্ক্রিয়া
সংস্করণ
অ্যান্ড্রয়েড 12 থেকে, টিউনার এসডিকে এপিআই টিউনার এইচএল 1.1 এ নতুন বৈশিষ্ট্য সমর্থন করে, যা টিউনার 1.0 এর একটি পশ্চাদপদ-সামঞ্জস্যপূর্ণ সংস্করণ আপগ্রেড।
চলমান হাল সংস্করণটি পরীক্ষা করতে নিম্নলিখিত এপিআই ব্যবহার করুন।
-
android.media.tv.tuner.TunerVersionChecker.getTunerVersion()
ন্যূনতম প্রয়োজনীয় এইচএল সংস্করণটি নতুন অ্যান্ড্রয়েড 12 এপিআইয়ের ডকুমেন্টেশনে পাওয়া যাবে।
প্যাকেজ
টিউনার এসডিকে এপিআই নীচের চারটি প্যাকেজ সরবরাহ করে।
-
android.media.tv.tuner
-
android.media.tv.tuner.frontend
-
android.media.tv.tuner.filter
-
android.media.tv.tuner.dvr
চিত্র 8. টিউনার এসডিকে এপিআই প্যাকেজগুলি
Android.media.tv.tuner
টিউনার প্যাকেজটি টিউনার ফ্রেমওয়ার্কটি ব্যবহার করার জন্য একটি এন্ট্রি পয়েন্ট। টিআইএস অ্যাপ্লিকেশনটি প্রাথমিক সেটিং এবং কলব্যাক নির্দিষ্ট করে রিসোর্স দৃষ্টান্তগুলি সূচনা করতে এবং অর্জন করতে প্যাকেজটি ব্যবহার করে।
-
tuner()
:useCase
এবংsessionId
প্যারামিটারগুলি নির্দিষ্ট করে একটি টিউনার উদাহরণ আরম্ভ করে। -
tune()
:FrontendSetting
প্যারামিটারটি নির্দিষ্ট করে একটি ফ্রন্টেন্ড রিসোর্স এবং টিউন অর্জন করে। -
openFilter()
: ফিল্টার প্রকারটি নির্দিষ্ট করে একটি ফিল্টার উদাহরণ অর্জন করে। -
openDvrRecorder()
: বাফার আকার নির্দিষ্ট করে একটি রেকর্ডিং উদাহরণ অর্জন করে। -
openDvrPlayback()
: বাফার আকার নির্দিষ্ট করে একটি প্লেব্যাক উদাহরণ অর্জন করে। -
openDescrambler()
: একটি ডেসক্র্যাম্বলার উদাহরণ অর্জন করে। -
openLnb()
: একটি অভ্যন্তরীণ এলএনবি উদাহরণ অর্জন করে। -
openLnbByName()
: একটি বাহ্যিক এলএনবি উদাহরণ অর্জন করে। -
openTimeFilter()
: একটি সময় ফিল্টার উদাহরণ অর্জন করে।
টিউনার প্যাকেজটি এমন কার্যকারিতা সরবরাহ করে যা ফিল্টার, ডিভিআর এবং ফ্রন্টএন্ড প্যাকেজগুলির আওতায় আসে না। কার্যকারিতা নীচে তালিকাভুক্ত করা হয়।
-
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
অ্যান্ড্রয়েড 12 থেকে টিউনার এইচএল 1.1 বা উচ্চতর সহ, নিম্নলিখিত ডিটিভি স্ট্যান্ডার্ডটি সমর্থিত।
-
DtmbFrontendSettings
FrontendCapabilities
নীচের ক্লাসগুলি দ্বারা বিভিন্ন ডিটিভি মানের জন্য উত্পন্ন হয়।
-
AnalogFrontendCapabilities
-
Atsc3FrontendCapabilities
-
AtscFrontendCapabilities
-
DvbcFrontendCapabilities
-
DvbsFrontendCapabilities
-
DvbtFrontendCapabilities
-
Isdbs3FrontendCapabilities
-
IsdbsFrontendCapabilities
-
IsdbtFrontendCapabilities
অ্যান্ড্রয়েড 12 থেকে টিউনার এইচএল 1.1 বা উচ্চতর সহ, নিম্নলিখিত ডিটিভি স্ট্যান্ডার্ডটি সমর্থিত।
-
DtmbFrontendCapabilities
FrontendInfo
ফ্রন্টেন্ডের তথ্য পুনরুদ্ধার করে। FrontendStatus
ফ্রন্টেন্ডের বর্তমান অবস্থা পুনরুদ্ধার করে। OnTuneEventListener
ফ্রন্টেন্ডের ইভেন্টগুলি শোনেন। টিআইএস অ্যাপ্লিকেশনটি ফ্রন্টেন্ড থেকে স্ক্যান বার্তাগুলি প্রক্রিয়া করতে ScanCallback
ব্যবহার করে।
চ্যানেল স্ক্যান
একটি টিভি সেট আপ করতে, অ্যাপ্লিকেশনটি সম্ভাব্য ফ্রিকোয়েন্সিগুলি স্ক্যান করে এবং ব্যবহারকারীদের অ্যাক্সেসের জন্য একটি চ্যানেল লাইনআপ তৈরি করে। টিআইএস চ্যানেল স্ক্যানিং সম্পূর্ণ করতে Tuner.tune
, Tuner.scan(BLIND_SCAN)
, বা Tuner.scan(AUTO_SCAN)
ব্যবহার করতে পারে।
যদি টিআইএসের সিগন্যালের জন্য সঠিক ডেলিভারি তথ্য থাকে যেমন ফ্রিকোয়েন্সি, স্ট্যান্ডার্ড (উদাহরণস্বরূপ, টি/টি 2, এস/এস 2) এবং অতিরিক্ত প্রয়োজনীয় তথ্য (উদাহরণস্বরূপ, পিএলডি আইডি), তবে Tuner.tune
দ্রুত বিকল্প হিসাবে সুপারিশ করা হয় .
ব্যবহারকারী যখন Tuner.tune
কল করে, তখন নিম্নলিখিত ক্রিয়াগুলি ঘটে:
- টিআইএস
Tuner.tune
ব্যবহার করে প্রয়োজনীয় তথ্যের সাথেFrontendSettings
পপুলেট করে। - সিগন্যালটি লক হয়ে গেলে এইচএল রিপোর্টগুলি
LOCKED
বার্তাগুলি রিপোর্ট করে। - টিআইএস প্রয়োজনীয় তথ্য সংগ্রহ করতে
Frontend.getStatus
ব্যবহার করে। - টিআইএস তার ফ্রিকোয়েন্সি তালিকায় পরবর্তী উপলব্ধ ফ্রিকোয়েন্সিতে চলে যায়।
টিআইএস টিউনারকে কল করে Tuner.tune
আবার সমস্ত ফ্রিকোয়েন্সি শেষ না হওয়া পর্যন্ত।
টিউনিংয়ের সময়, আপনি Tuner.tune
বিরতি দিতে বা শেষ করতে stopTune()
বা close()
কল করতে পারেন।
টিউনার.স্ক্যান (অটো_স্ক্যান)
টিআইএসের যদি Tuner.tune
ব্যবহার করার জন্য পর্যাপ্ত তথ্য না থাকে তবে তবে একটি ফ্রিকোয়েন্সি তালিকা এবং স্ট্যান্ডার্ড টাইপ রয়েছে (উদাহরণস্বরূপ, ডিভিবি টি/সি/গুলি), তবে Tuner.scan(AUTO_SCAN)
সুপারিশ করা হয়।
যখন ব্যবহারকারী Tuner.scan(AUTO_SCAN)
কল করে, নিম্নলিখিত ক্রিয়াগুলি ঘটে:
টিআইএস ফ্রিকোয়েন্সি দিয়ে ভরা
FrontendSettings
সহTuner.scan(AUTO_SCAN)
ব্যবহার করে।সিগন্যালটি লক হয়ে গেলে এইচএল রিপোর্টগুলি স্ক্যান
LOCKED
বার্তাগুলি। এইচএএল সিগন্যাল সম্পর্কে অতিরিক্ত তথ্য সরবরাহ করতে অন্যান্য স্ক্যান বার্তাগুলিও প্রতিবেদন করতে পারে।টিআইএস প্রয়োজনীয় তথ্য সংগ্রহ করতে
Frontend.getStatus
ব্যবহার করে।টিআইএস একই ফ্রিকোয়েন্সিতে পরবর্তী সেটিংটি চালিয়ে যাওয়ার জন্য এইচএল এর জন্য
Tuner.scan
কল করে। যদিFrontendSettings
কাঠামোটি খালি থাকে তবে এইচএল পরবর্তী উপলব্ধ সেটিংটি ব্যবহার করে। অন্যথায়, এইচএল এক সময়ের স্ক্যানের জন্যFrontendSettings
ব্যবহার করে এবং স্ক্যান অপারেশনটি শেষ হয়েছে তা নির্দেশ করতেEND
প্রেরণ করে।ফ্রিকোয়েন্সি সম্পর্কিত সমস্ত সেটিংস শেষ না হওয়া পর্যন্ত টিআইএস উপরের ক্রিয়াগুলি পুনরাবৃত্তি করে।
স্ক্যান অপারেশন শেষ হয়েছে তা নির্দেশ করতে এইচএল
END
পাঠায়।টিআইএস তার ফ্রিকোয়েন্সি তালিকায় পরবর্তী উপলব্ধ ফ্রিকোয়েন্সিতে চলে যায়।
টিআইএস Tuner.scan(AUTO_SCAN)
আবার কল করে যতক্ষণ না সমস্ত ফ্রিকোয়েন্সি শেষ না হয়।
স্ক্যান করার সময়, আপনি স্ক্যানটি বিরতি দিতে বা শেষ করতে stopScan()
বা close()
কল করতে পারেন।
টিউনার.স্ক্যান (ব্লাইন্ড_স্ক্যান)
যদি টিআইএসের কোনও ফ্রিকোয়েন্সি তালিকা না থাকে এবং বিক্রেতা এইচএল ফ্রন্টএন্ড রিসোর্সটি পেতে ব্যবহারকারী-নির্দিষ্ট ফ্রন্টেন্ডের ফ্রিকোয়েন্সি অনুসন্ধান করতে পারে, তবে Tuner.scan(BLIND_SCAN)
প্রস্তাবিত হয়।
- টিআইএস
Tuner.scan(BLIND_SCAN)
ব্যবহার করে। স্টার্ট ফ্রিকোয়েন্সি জন্যFrontendSettings
একটি ফ্রিকোয়েন্সি নির্দিষ্ট করা যেতে পারে তবে টিআইএসFrontendSettings
অন্যান্য সেটিংস উপেক্ষা করে। - সিগন্যালটি লক করা থাকলে এইচএল একটি স্ক্যান
LOCKED
বার্তার প্রতিবেদন করে। - টিআইএস প্রয়োজনীয় তথ্য সংগ্রহ করতে
Frontend.getStatus
ব্যবহার করে। - টিআইএস স্ক্যানিং চালিয়ে যেতে আবার
Tuner.scan
কল করে। (FrontendSettings
উপেক্ষা করা হয়)) - ফ্রিকোয়েন্সি সম্পর্কিত সমস্ত সেটিংস শেষ না হওয়া পর্যন্ত টিআইএস উপরের ক্রিয়াগুলি পুনরাবৃত্তি করে। টিআইএস থেকে কোনও পদক্ষেপের প্রয়োজন ছাড়াই এইচএল ইনক্রিমেন্ট ফ্রিকোয়েন্সি। এইচএল
PROGRESS
রিপোর্ট।
টিআইএস Tuner.scan(AUTO_SCAN)
আবার কল করে যতক্ষণ না সমস্ত ফ্রিকোয়েন্সি শেষ না হয়। এইচএল রিপোর্টগুলি স্ক্যান অপারেশন শেষ হয়েছে তা নির্দেশ করে END
।
স্ক্যান করার সময়, আপনি স্ক্যানটি বিরতি দিতে বা শেষ করতে stopScan()
বা close()
কল করতে পারেন।
চিত্র 9. একটি টিআইএস স্ক্যানের ফ্লো ডায়াগ্রাম
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
অ্যান্ড্রয়েড 12 থেকে টিউনার এইচএল 1.1 বা উচ্চতর সহ, নিম্নলিখিত ইভেন্টগুলি সমর্থিত।
-
IpCidChangeEvent
-
RestartEvent
-
ScramblingStatusEvent
ফিল্টার থেকে ইভেন্ট এবং ডেটা ফর্ম্যাট
ফিল্টার প্রকার | পতাকা | ঘটনা | ডেটা অপারেশন | উপাত্ত বিন্যাস |
---|---|---|---|---|
TS.SECTION MMTP.SECTION IP.SECTION TLV.SECTION ALP.SECTION | isRaw: | বাধ্যতামূলক:DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW প্রস্তাবিত: DemuxFilterStatus::LOW_WATER DemuxFilterStatus::HIGH_WATER | ইভেন্ট এবং অভ্যন্তরীণ সময়সূচি অনুসারে, রানFilter.read(buffer, offset, adjustedSize) এক বা একাধিকবার পড়ুন।এইচএল এর এমকিউ থেকে ক্লায়েন্ট বাফারে ডেটা অনুলিপি করা হয়। | একটি একত্রিত সেশন প্যাকেজ অন্য সেশন প্যাকেজ দ্বারা এফএমকিউতে পূরণ করা হয়। |
isRaw: | বাধ্যতামূলক:DemuxFilterEvent::DemuxFilterSectionEvent[n] DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW ঐচ্ছিক: DemuxFilterStatus::LOW_WATER DemuxFilterStatus::HIGH_WATER | for i=0; i<n; i++ এইচএল এর এমকিউ থেকে ক্লায়েন্ট বাফারে ডেটা অনুলিপি করা হয়। | ||
TS.PES | isRaw: | বাধ্যতামূলক:DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW প্রস্তাবিত: DemuxFilterStatus::LOW_WATER DemuxFilterStatus::HIGH_WATER | ইভেন্ট এবং অভ্যন্তরীণ সময়সূচি অনুসারে, রানFilter.read(buffer, offset, adjustedSize) এক বা একাধিকবার পড়ুন।এইচএল এর এমকিউ থেকে ক্লায়েন্ট বাফারে ডেটা অনুলিপি করা হয়। | একটি একত্রিত পিইএস প্যাকেজটি অন্য পিইএস প্যাকেজ দ্বারা এফএমকিউতে পূরণ করা হয়। |
isRaw: | বাধ্যতামূলক:DemuxFilterEvent::DemuxFilterPesEvent[n] DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW ঐচ্ছিক: DemuxFilterStatus::LOW_WATER DemuxFilterStatus::HIGH_WATER | for i=0; i<n; i++ এইচএল এর এমকিউ থেকে ক্লায়েন্ট বাফারে ডেটা অনুলিপি করা হয়। | ||
MMTP.PES | isRaw: | বাধ্যতামূলক:DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW প্রস্তাবিত: DemuxFilterStatus::LOW_WATER DemuxFilterStatus::HIGH_WATER | ইভেন্ট এবং অভ্যন্তরীণ সময়সূচি অনুসারে, রানFilter.read(buffer, offset, adjustedSize) এক বা একাধিকবার পড়ুন।এইচএল এর এমকিউ থেকে ক্লায়েন্ট বাফারে ডেটা অনুলিপি করা হয়। | একটি একত্রিত এমএফইউ প্যাকেজটি অন্য এমএফইউ প্যাকেজ দ্বারা এফএমকিউতে পূরণ করা হয়। |
isRaw: | বাধ্যতামূলক:DemuxFilterEvent::DemuxFilterPesEvent[n] DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW ঐচ্ছিক: DemuxFilterStatus::LOW_WATER DemuxFilterStatus::HIGH_WATER | for i=0; i<n; i++ এইচএল এর এমকিউ থেকে ক্লায়েন্ট বাফারে ডেটা অনুলিপি করা হয়। | ||
TS.TS | N/A | বাধ্যতামূলক:DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW প্রস্তাবিত: DemuxFilterStatus::LOW_WATER DemuxFilterStatus::HIGH_WATER | ইভেন্ট এবং অভ্যন্তরীণ সময়সূচি অনুসারে, রানFilter.read(buffer, offset, adjustedSize) এক বা একাধিকবার পড়ুন।এইচএল এর এমকিউ থেকে ক্লায়েন্ট বাফারে ডেটা অনুলিপি করা হয়। | ts শিরোনাম সহ ts ফিল্টার করাএফএমকিউতে পূর্ণ হয়। |
TS.Audio TS.Video MMTP.Audio MMTP.Video | isPassthrough: | ঐচ্ছিক:DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW | ক্লায়েন্ট DemuxFilterStatus::DATA_READY প্রাপ্তির পরে MediaCodec শুরু করতে পারে।ক্লায়েন্ট DemuxFilterStatus::DATA_OVERFLOW পাওয়ার পরে Filter.flush কল করতে পারে। | N/A |
isPassthrough: | বাধ্যতামূলক:DemuxFilterEvent::DemuxFilterMediaEvent[n] DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW ঐচ্ছিক: DemuxFilterStatus::LOW_WATER DemuxFilterStatus::HIGH_WATER | MediaCodec ব্যবহার করতে:for i=0; i<n; i++ AudioTrack সরাসরি অডিও ব্যবহার করতে:for i=0; i<n; i++ | আয়ন মেমরিতে ES বা আংশিক ES ডেটা। | |
TS.PCR IP.NTP ALP.PTP | N/A | বাধ্যতামূলক: এন/এ Al চ্ছিক: এন/এ | 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++ RecordStatus::* এবং অভ্যন্তরীণ সময়সূচী অনুসারে রেকর্ড করা সামগ্রীর জন্য নিম্নলিখিতগুলির মধ্যে একটি করুন:
| সূচক ডেটার জন্য: ইভেন্ট পে -লোডে বহন করা। রেকর্ড করা সামগ্রীর জন্য: FMQ এ ভরাট মক্সড টিএস স্ট্রিম। |
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++ | N/A |
MMTP.MMTP | N/A | বাধ্যতামূলক:DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW প্রস্তাবিত: DemuxFilterStatus::LOW_WATER DemuxFilterStatus::HIGH_WATER | ইভেন্ট এবং অভ্যন্তরীণ সময়সূচি অনুসারে, রানFilter.read(buffer, offset, adjustedSize) এক বা একাধিকবার পড়ুন।এইচএল এর এমকিউ থেকে ক্লায়েন্ট বাফারে ডেটা অনুলিপি করা হয়। | mmtp শিরোনাম সহ mmtp ফিল্টার করাএফএমকিউতে পূর্ণ হয়। |
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++ RecordStatus::* এবং অভ্যন্তরীণ সময়সূচী অনুসারে রেকর্ড করা সামগ্রীর জন্য নিম্নলিখিতগুলির মধ্যে একটি করুন:
| সূচক ডেটার জন্য: ইভেন্ট পে -লোডে বহন করা। রেকর্ড করা সামগ্রীর জন্য: FMQ এ ভরাট রেকর্ড করা স্ট্রিম। যদি রেকর্ডিংয়ের জন্য ফিল্টার উত্সটি পাসথ্রু সহ IP.IP TLV.TLV হয় তবে রেকর্ড করা স্ট্রিমটিতে একটি টিএলভি এবং আইপি শিরোনাম রয়েছে। |
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) এইচএল এর এমকিউ থেকে ক্লায়েন্ট বাফারে ডেটা অনুলিপি করা হয়। | ডাউনলোড প্যাকেজটি অন্য আইপি ডাউনলোড প্যাকেজ দ্বারা এফএমকিউতে পূরণ করা হয়। |
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) এইচএল এর এমকিউ থেকে ক্লায়েন্ট বাফারে ডেটা অনুলিপি করা হয়। | আইপি পে -লোড প্যাকেজটি অন্য আইপি পে -লোড প্যাকেজ দ্বারা এফএমকিউতে পূরণ করা হয়। |
IP.IP TLV.TLV ALP.ALP | isPassthrough: | ঐচ্ছিক:DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW | ফিল্টার আউট প্রোটোকল সাব স্ট্রিম ফিল্টার চেইনে পরবর্তী ফিল্টার ফিড করে। | N/A |
isPassthrough: | বাধ্যতামূলক:DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW প্রস্তাবিত: DemuxFilterStatus::LOW_WATER DemuxFilterStatus::HIGH_WATER | ইভেন্ট এবং অভ্যন্তরীণ সময়সূচি অনুসারে, রানFilter.read(buffer, offset, adjustedSize) এক বা একাধিকবার পড়ুন।এইচএল এর এমকিউ থেকে ক্লায়েন্ট বাফারে ডেটা অনুলিপি করা হয়। | প্রোটোকল শিরোনাম সহ ফিল্টার আউট প্রোটোকল সাব স্ট্রিমটি এফএমকিউতে পূরণ করা হয়। | |
IP.PAYLOAD_THROUGH TLV.PAYLOAD_THROUGH ALP.PAYLOAD_THROUGH | N/A | ঐচ্ছিক:DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW | ফিল্টার আউট প্রোটোকল পে -লোড ফিল্টার চেইনে পরবর্তী ফিল্টারকে ফিড করে। | N/A |
পিএসআই/এসআই তৈরি করতে ফিল্টার ব্যবহার করতে উদাহরণ প্রবাহ
চিত্র 10. পিএসআই/এসআই নির্মাণে প্রবাহ
একটি ফিল্টার খুলুন।
Filter filter = tuner.openFilter( Filter.TYPE_TS, Filter.SUBTYPE_SECTION, /* bufferSize */1000, executor, filterCallback );
কনফিগার করুন এবং ফিল্টার শুরু করুন।
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();
প্রক্রিয়া
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); } } } };
ফিল্টার থেকে মধ্যযুগীয় ব্যবহার করতে উদাহরণ প্রবাহ
চিত্র 11. ফিল্টার থেকে মধ্যযুগীয় ব্যবহার করতে প্রবাহ
- খুলুন, কনফিগার করুন এবং এ/ভি ফিল্টারগুলি শুরু করুন।
- প্রক্রিয়া
MediaEvent
। -
MediaEvent
গ্রহণ করুন। -
codec
থেকে লিনিয়ার ব্লক সারি করুন। - ডেটা গ্রাস করা হলে এ/ভি হ্যান্ডেলটি ছেড়ে দিন।
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
একটি ডিভিআর উদাহরণের স্থিতি প্রতিবেদন করতে ব্যবহৃত হয়।
একটি রেকর্ড শুরু করতে উদাহরণ প্রবাহ
চিত্র 12. একটি রেকর্ড শুরু করতে প্রবাহ
খুলুন, কনফিগার করুন এবং
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();
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. } } } };
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); } } };
টিউনার হাল
টিউনার হাল এইচআইডিএল অনুসরণ করে এবং ফ্রেমওয়ার্ক এবং বিক্রেতার হার্ডওয়্যারগুলির মধ্যে ইন্টারফেসটি সংজ্ঞায়িত করে। বিক্রেতারা টিউনার এইচএল বাস্তবায়নের জন্য ইন্টারফেসটি ব্যবহার করে এবং ফ্রেমওয়ার্কটি টিউনার এইচএল বাস্তবায়নের সাথে যোগাযোগের জন্য এটি ব্যবহার করে।
মডিউল
টিউনার হাল 1.0
মডিউল | মৌলিক নিয়ন্ত্রণ | মডিউল-নির্দিষ্ট নিয়ন্ত্রণ | হাল ফাইল |
---|---|---|---|
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 |
টিউনার এইচএল 1.1 (টিউনার এইচএল 1.0 থেকে প্রাপ্ত)
মডিউল | মৌলিক নিয়ন্ত্রণ | মডিউল-নির্দিষ্ট নিয়ন্ত্রণ | হাল ফাইল |
---|---|---|---|
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 |
চিত্র 13. টিউনার এইচএল মডিউলগুলির মধ্যে মিথস্ক্রিয়াটির চিত্র
ফিল্টার লিঙ্কেজ
টিউনার এইচএল ফিল্টার সংযোগকে সমর্থন করে যেমন ফিল্টারগুলি একাধিক স্তরগুলির জন্য অন্যান্য ফিল্টারগুলির সাথে লিঙ্ক করা যায়। ফিল্টারগুলি নীচের নিয়মগুলি অনুসরণ করে।
- ফিল্টারগুলি গাছ হিসাবে যুক্ত, ঘনিষ্ঠ পথ অনুমোদিত নয়।
- মূল নোডটি ডেমাক্স।
- ফিল্টারগুলি স্বাধীনভাবে কাজ করে।
- সমস্ত ফিল্টার ডেটা পেতে শুরু করে।
- ফিল্টার লিঙ্কেজটি শেষ ফিল্টারটিতে ফ্লাশ করে।
নীচের কোড ব্লক এবং চিত্র 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. একাধিক স্তরগুলির জন্য একটি ফিল্টার লিঙ্কেজের ফ্লো ডায়াগ্রাম
টিউনার রিসোর্স ম্যানেজার
টিউনার রিসোর্স ম্যানেজার (টিআরএম) এর আগে, দুটি অ্যাপের মধ্যে স্যুইচিংয়ের জন্য একই টিউনার হার্ডওয়্যার প্রয়োজন। টিভি ইনপুট ফ্রেমওয়ার্ক (টিআইএফ) একটি "প্রথম থেকে আক্রোয়ার উইন" প্রক্রিয়া ব্যবহার করেছে, যার অর্থ যে কোনও অ্যাপ্লিকেশনটি সম্পদটি প্রথমে সম্পদটি প্রথমে রিসোর্স রাখে। তবে এই প্রক্রিয়াটি কিছু জটিল ব্যবহারের ক্ষেত্রে আদর্শ নাও হতে পারে।
টিআরএম অ্যাপ্লিকেশনগুলির জন্য টিউনার, TVInput
এবং সিএএস হার্ডওয়্যার সংস্থানগুলি পরিচালনা করতে সিস্টেম পরিষেবা হিসাবে চলে। টিআরএম একটি "ফোরগ্রাউন্ড উইন" প্রক্রিয়া ব্যবহার করে, যা অ্যাপের অগ্রভাগ বা পটভূমির স্থিতির উপর ভিত্তি করে অ্যাপ্লিকেশনটির অগ্রাধিকার গণনা করে এবং কেস টাইপ ব্যবহার করে। টিআরএম অগ্রাধিকারের ভিত্তিতে সংস্থানকে অনুদান দেয় বা প্রত্যাহার করে। টিআরএম সম্প্রচার, ওটিটি এবং ডিভিআর এর জন্য এটিভি রিসোর্স ম্যানেজমেন্টকে কেন্দ্রিয় করে তোলে।
টিআরএম ইন্টারফেস
টিআরএম ITunerResourceManager.aidl
ফ্রেমওয়ার্ক, MediaCas
এবং টিভি ইনপথার্ডওয়ারম্যানেজারের জন্য রেজিস্ট্রেশন, অনুরোধ বা প্রকাশের জন্য টিউনার ফ্রেমওয়ার্ক, মিডিয়াকাস এবং TvInputHardwareManager
ম্যানেজারের জন্য আইডল ইন্টারফেসগুলি প্রকাশ করে।
ক্লায়েন্ট পরিচালনার জন্য ইন্টারফেসগুলি নীচে তালিকাভুক্ত করা হয়েছে।
-
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
ক্লায়েন্ট অগ্রাধিকার
টিআরএম ক্লায়েন্টের প্রোফাইল থেকে পরামিতি এবং কনফিগারেশন ফাইল থেকে অগ্রাধিকার মান ব্যবহার করে ক্লায়েন্টের অগ্রাধিকার গণনা করে। অগ্রাধিকারটি ক্লায়েন্টের কাছ থেকে একটি স্বেচ্ছাসেবী অগ্রাধিকার মান দ্বারা আপডেট করা যেতে পারে।
ক্লায়েন্টের প্রোফাইলে পরামিতি
টিআরএম কোনও অ্যাপ্লিকেশনটি অগ্রভাগ বা পটভূমি অ্যাপ্লিকেশন কিনা তা সিদ্ধান্ত নিতে mTvInputSessionId
থেকে প্রক্রিয়া আইডি পুনরুদ্ধার করে। mTvInputSessionId
তৈরি করতে, TvInputService.onCreateSession
, বা TvInputService.onCreateRecordingSession
একটি টিআইএস সেশন শুরু করে।
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
অনুসরণ করা উচিত।
স্বেচ্ছাসেবী অগ্রাধিকার মান এবং সুন্দর মান
টিআরএম ক্লায়েন্টকে স্বেচ্ছাসেবী অগ্রাধিকারের মান এবং সুন্দর মান আপডেট করার জন্য updateClientPriority
সরবরাহ করে। স্বেচ্ছাসেবী অগ্রাধিকারের মান ব্যবহারের কেস টাইপ এবং সেশন আইডি থেকে গণনা করা অগ্রাধিকার মানকে ওভাররাইট করে।
সুন্দর মানটি নির্দেশ করে যে ক্লায়েন্টের আচরণটি অন্য ক্লায়েন্টের সাথে বিরোধের সময় কতটা হালকা হয়। চ্যালেঞ্জিং ক্লায়েন্টের সাথে তুলনা করার আগে তার অগ্রাধিকারের মানটির আগে ক্লায়েন্টের অগ্রাধিকার মান হ্রাস করে।
পুনরায় দাবি ব্যবস্থা
নীচের চিত্রটি দেখায় যে কোনও সংস্থান সংঘাত ঘটে তখন কীভাবে সংস্থানগুলি পুনরুদ্ধার করা হয় এবং নির্ধারিত হয়।
চিত্র 15. টিউনার রিসোর্সের মধ্যে একটি বিরোধের জন্য পুনরায় দাবি ব্যবস্থার ডায়াগ্রাম