ट्यूनर फ़्रेमवर्क

Android 11 या इसके बाद के वर्शन वाले डिवाइसों के लिए, ए/वी कॉन्टेंट डिलीवर करने के लिए Android Tuner फ़्रेमवर्क का इस्तेमाल किया जा सकता है. यह फ़्रेमवर्क, वेंडर के हार्डवेयर पाइपलाइन का इस्तेमाल करता है. इसलिए, यह कम और ज़्यादा कीमत वाले SoC, दोनों के लिए सही है. यह फ़्रेमवर्क, ट्रस्टेड एक्ज़ीक्यूशन एनवायरमेंट (टीईई) और सुरक्षित मीडिया पाथ (एसएमपी) से सुरक्षित ए/वी कॉन्टेंट को डिलीवर करने का एक सुरक्षित तरीका उपलब्ध कराता है. इससे इसे कॉन्टेंट को सुरक्षित रखने वाले ऐसे एनवायरमेंट में इस्तेमाल किया जा सकता है जहां कॉन्टेंट को सुरक्षित रखने के लिए बहुत ज़्यादा पाबंदियां होती हैं.

Tuner और Android CAS के बीच स्टैंडर्ड इंटरफ़ेस होने की वजह से, Tuner और CAS वेंडर के बीच इंटिग्रेशन तेज़ी से होता है. Android TV के लिए एक ही प्लैटफ़ॉर्म पर सभी सुविधाएं उपलब्ध कराने के लिए, Tuner इंटरफ़ेस MediaCodec और AudioTrack के साथ काम करता है. ट्यूनर इंटरफ़ेस, ब्रॉडकास्ट के मुख्य मानकों के आधार पर डिजिटल टीवी और ऐनलॉग टीवी, दोनों के साथ काम करता है.

घटक

Android 11 में, खास तौर पर टीवी प्लैटफ़ॉर्म के लिए तीन कॉम्पोनेंट डिज़ाइन किए गए हैं.

  • ट्यूनर एचएएल: यह फ़्रेमवर्क और वेंडर के बीच का इंटरफ़ेस होता है
  • Tuner SDK API: यह फ़्रेमवर्क और ऐप्लिकेशन के बीच इंटरफ़ेस का काम करता है
  • ट्यूनर रिसॉर्स मैनेजर (टीआरएम): यह ट्यूनर एचडब्ल्यू रिसॉर्स को मैनेज करता है

Android 11 के लिए, इन कॉम्पोनेंट को बेहतर बनाया गया है.

  • CAS V2
  • TvInputService या टीवी इनपुट सेवा (टीआईएस)
  • TvInputManagerService या टीवी इनपुट मैनेजर सेवा (टीआईएमएस)
  • MediaCodec या मीडिया कोडेक
  • AudioTrack या ऑडियो ट्रैक
  • MediaResourceManager या मीडिया रिसोर्स मैनेजर (एमआरएम)

ट्यूनर फ़्रेमवर्क के कॉम्पोनेंट का फ़्लो डायग्राम.

पहली इमेज. Android TV के कॉम्पोनेंट के बीच इंटरैक्शन

सुविधाएं

फ़्रंटएंड, नीचे दिए गए डीटीवी स्टैंडर्ड के साथ काम करता है.

  • एटीएससी
  • ATSC3
  • DVB C/S/T
  • ISDB S/S3/T
  • ऐनालॉग

Android 12 में, Tuner HAL 1.1 या इसके बाद के वर्शन वाला फ़्रंटएंड, नीचे दिए गए डीटीवी स्टैंडर्ड के साथ काम करता है.

  • DTMB

Demux, यहां दिए गए स्ट्रीम प्रोटोकॉल के साथ काम करता है.

  • ट्रांसपोर्ट स्ट्रीम (टीएस)
  • MPEG मीडिया ट्रांसपोर्ट प्रोटोकॉल (एमएमटीपी)
  • इंटरनेट प्रोटोकॉल (आईपी)
  • टाइप लेंथ वैल्यू (टीएलवी)
  • एटीएससी लिंक-लेयर प्रोटोकॉल (एएलपी)

डिसक्रैंबलर, कॉन्टेंट को सुरक्षित रखने के लिए यहां दी गई सुविधाओं के साथ काम करता है.

  • सुरक्षित मीडिया पाथ
  • मीडिया पाथ साफ़ करें
  • स्थानीय रिकॉर्ड को सुरक्षित करना
  • स्थानीय तौर पर सुरक्षित तरीके से वीडियो चलाना

ट्यूनर एपीआई, यहां दिए गए इस्तेमाल के उदाहरणों के साथ काम करते हैं.

  • स्कैन करें
  • लाइव
  • वीडियो चलाएं
  • रिकॉर्ड करें

ट्यूनर, MediaCodec, और AudioTrack, डेटा फ़्लो के इन मोड के साथ काम करते हैं.

  • मेमोरी बफ़र को साफ़ करने वाला ES पेलोड
  • सुरक्षित मेमोरी हैंडल के साथ ES पेलोड
  • पास-थ्रू

पूरा डिज़ाइन

Tuner HAL को Android फ़्रेमवर्क और वेंडर के हार्डवेयर के बीच तय किया जाता है.

  • इसमें बताया गया है कि फ़्रेमवर्क, वेंडर से क्या उम्मीद करता है और वेंडर इसे कैसे पूरा कर सकता है.
  • यह IFrontend, IDemux, IDescrambler, IFilter, IDvr, और ILnb इंटरफ़ेस के ज़रिए, फ़्रंटएंड, डेमक्स, और डिसक्रैम्बलर की सुविधाओं को फ़्रेमवर्क में एक्सपोर्ट करता है.
  • इसमें Tuner HAL को अन्य फ़्रेमवर्क कॉम्पोनेंट के साथ इंटिग्रेट करने के फ़ंक्शन शामिल होते हैं. जैसे, MediaCodec और AudioTrack.

एक ट्यूनर Java क्लास और नेटिव क्लास बनाई जाती है.

  • Tuner Java API की मदद से, ऐप्लिकेशन सार्वजनिक एपीआई के ज़रिए Tuner HAL को ऐक्सेस कर सकते हैं.
  • नेटिव क्लास, Tuner HAL के साथ बड़ी मात्रा में रिकॉर्डिंग या प्लेबैक डेटा को मैनेज करने और अनुमतियों को कंट्रोल करने की सुविधा देती है.
  • नेटिव ट्यूनर मॉड्यूल, ट्यूनर Java क्लास और ट्यूनर HAL के बीच एक ब्रिज है.

टीआरएम क्लास बनाई जाती है.

  • यह सीमित ट्यूनर संसाधनों को मैनेज करता है. जैसे, टीवी इनपुट HAL से फ़्रंटएंड, एलएनबी, सीएएस सेशन, और टीवी इनपुट डिवाइस.
  • यह ऐप्लिकेशन से, ज़रूरत से कम इस्तेमाल किए गए संसाधनों को वापस पाने के लिए नियम लागू करता है. डिफ़ॉल्ट नियम के मुताबिक, फ़ोरग्राउंड में मौजूद ऐप्लिकेशन को प्राथमिकता दी जाती है.

मीडिया सीएएस और सीएएस एचएएल को यहां दी गई सुविधाओं के साथ बेहतर बनाया गया है.

  • यह कुकी, अलग-अलग इस्तेमाल और एल्गोरिदम के लिए CAS सेशन खोलती है.
  • डाइनैमिक सीएएस सिस्टम के साथ काम करता है. जैसे, सीआईसीएएम को हटाना और जोड़ना.
  • यह मुख्य टोकन उपलब्ध कराकर, Tuner HAL के साथ इंटिग्रेट होता है.

MediaCodec और AudioTrack को नीचे दी गई सुविधाओं के साथ बेहतर बनाया गया है.

  • यह सुरक्षित ए/वी मेमोरी को कॉन्टेंट इनपुट के तौर पर इस्तेमाल करता है.
  • इसे टनल किए गए प्लेबैक में हार्डवेयर ए/वी सिंक करने के लिए कॉन्फ़िगर किया गया है.
  • ES_payload और पासथ्रू मोड के लिए, कॉन्फ़िगर की गई सहायता.

ट्यूनर HAL का पूरा डिज़ाइन.

दूसरी इमेज. ट्यूनर एचएएल में मौजूद कॉम्पोनेंट का डायग्राम

पूरा वर्कफ़्लो

नीचे दिए गए डायग्राम में, लाइव ब्रॉडकास्ट के प्लेबैक के लिए कॉल सीक्वेंस दिखाए गए हैं.

सेटअप

लाइव ब्रॉडकास्ट के सेटअप और उसे चलाने का क्रम दिखाने वाला डायग्राम.

तीसरी इमेज. लाइव ब्रॉडकास्ट के प्लेबैक के लिए सेटअप का क्रम

ऑडियो/वीडियो को मैनेज करना

लाइव ब्रॉडकास्ट के प्लेबैक डायग्राम के लिए, ऑडियो/वीडियो को मैनेज करना.

चौथी इमेज. लाइव ब्रॉडकास्ट चलाने के लिए, ऑडियो/वीडियो को मैनेज करना

स्क्रैंबल्ड कॉन्टेंट को मैनेज करना

लाइव ब्रॉडकास्ट के दौरान, गड़बड़ी वाले कॉन्टेंट को ठीक करने से जुड़ा डायग्राम.

पांचवीं इमेज. लाइव ब्रॉडकास्ट के प्लेबैक के लिए, गड़बड़ किए गए कॉन्टेंट को मैनेज करना

ऑडियो/वीडियो डेटा को प्रोसेस करना

लाइव ब्रॉडकास्ट के प्लेबैक डायग्राम के लिए, ऑडियो/वीडियो डेटा प्रोसेस करना.

छठी इमेज. लाइव ब्रॉडकास्ट चलाने के लिए, ऑडियो/वीडियो को प्रोसेस किया जा रहा है

Tuner SDK API

Tuner SDK API, Tuner JNI, Tuner HAL, और TunerResourceManager के साथ इंटरैक्शन को मैनेज करता है. TIS ऐप्लिकेशन, Tuner SDK API का इस्तेमाल करके Tuner के संसाधनों और सब-कॉम्पोनेंट को ऐक्सेस करता है. जैसे, फ़िल्टर और डिसक्रैम्बलर. फ़्रंटएंड और डेमक्स, इंटरनल कॉम्पोनेंट हैं.

Tuner SDK API का फ़्लो डायग्राम.

सातवीं इमेज. Tuner SDK API के साथ इंटरैक्शन

वर्शन

Android 12 से, Tuner SDK API, Tuner HAL 1.1 में नई सुविधा के साथ काम करता है. यह Tuner 1.0 का बैकवर्ड-कंपैटिबल वर्शन अपग्रेड है.

चालू HAL वर्शन की जांच करने के लिए, इस एपीआई का इस्तेमाल करें.

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

ज़रूरी HAL वर्शन के बारे में जानकारी, Android 12 के नए एपीआई के दस्तावेज़ में देखी जा सकती है.

पैकेज

Tuner SDK API, यहां दिए गए चार पैकेज उपलब्ध कराता है.

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

ट्यूनर एसडीके एपीआई पैकेज का फ़्लो डायग्राम.

आठवीं इमेज. Tuner SDK API पैकेज

Android.media.tv.tuner

Tuner पैकेज, Tuner फ़्रेमवर्क का इस्तेमाल करने के लिए एक एंट्री पॉइंट है. टीआईएस ऐप्लिकेशन, पैकेज का इस्तेमाल करके संसाधन इंस्टेंस को शुरू करता है और उन्हें हासिल करता है. इसके लिए, वह शुरुआती सेटिंग और कॉलबैक तय करता है.

  • tuner(): useCase और sessionId पैरामीटर तय करके, Tuner इंस्टेंस को शुरू करता है.
  • 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

Android 12 और Tuner HAL 1.1 या इसके बाद के वर्शन पर, यह डीटीवी स्टैंडर्ड काम करता है.

  • DtmbFrontendSettings

FrontendCapabilities को नीचे दी गई क्लास के हिसाब से, अलग-अलग डीटीवी स्टैंडर्ड के लिए बनाया गया है.

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

Android 12 और Tuner HAL 1.1 या इसके बाद के वर्शन पर, यह डीटीवी स्टैंडर्ड काम करता है.

  • DtmbFrontendCapabilities

FrontendInfo फ़्रंटएंड की जानकारी वापस पाता है. FrontendStatus फ़्रंटएंड की मौजूदा स्थिति को फिर से हासिल करता है. OnTuneEventListener फ़्रंटएंड पर होने वाले इवेंट को सुनता है. टीआईएस ऐप्लिकेशन, फ़्रंटएंड से स्कैन किए गए मैसेज को प्रोसेस करने के लिए ScanCallback का इस्तेमाल करता है.

चैनल स्कैन करें

टीवी सेट अप करने के लिए, ऐप्लिकेशन संभावित फ़्रीक्वेंसी स्कैन करता है. इसके बाद, उपयोगकर्ताओं के लिए चैनल लाइनअप बनाता है, ताकि वे उसे ऐक्सेस कर सकें. चैनल की स्कैनिंग पूरी करने के लिए, TIS Tuner.tune, Tuner.scan(BLIND_SCAN) या Tuner.scan(AUTO_SCAN) का इस्तेमाल कर सकता है.

अगर टीआईएस के पास सिग्नल की डिलीवरी से जुड़ी सही जानकारी है, जैसे कि फ़्रीक्वेंसी, स्टैंडर्ड (उदाहरण के लिए, T/T2, S/S2), और ज़रूरी अतिरिक्त जानकारी (उदाहरण के लिए, PLD आईडी), तो Tuner.tune को तेज़ विकल्प के तौर पर इस्तेमाल करने का सुझाव दिया जाता है.

जब उपयोगकर्ता Tuner.tune को कॉल करता है, तो ये कार्रवाइयां होती हैं:

  • टीआईएस, Tuner.tune का इस्तेमाल करके FrontendSettings में ज़रूरी जानकारी भरता है.
  • अगर सिग्नल लॉक है, तो HAL LOCKED मैसेज की जानकारी देता है.
  • ज़रूरी जानकारी इकट्ठा करने के लिए, टीआईएस 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) को कॉल करता है, तो ये कार्रवाइयां होती हैं:

  • टीआईएस, Tuner.scan(AUTO_SCAN) का इस्तेमाल करता है. इसमें FrontendSettings को फ़्रीक्वेंसी के हिसाब से भरा जाता है.

  • अगर सिग्नल लॉक है, तो HAL, स्कैन LOCKED मैसेज की रिपोर्ट करता है. सिग्नल के बारे में ज़्यादा जानकारी देने के लिए, HAL स्कैन से जुड़े अन्य मैसेज भी भेज सकता है.

  • ज़रूरी जानकारी इकट्ठा करने के लिए, TIS Frontend.getStatus का इस्तेमाल करता है.

  • TIS, HAL के लिए Tuner.scan कॉल करता है, ताकि वह उसी फ़्रीक्वेंसी पर अगली सेटिंग जारी रख सके. अगर FrontendSettings स्ट्रक्चर खाली है, तो HAL अगली उपलब्ध सेटिंग का इस्तेमाल करता है. इसके अलावा, HAL एक बार स्कैन करने के लिए FrontendSettings का इस्तेमाल करता है और END भेजकर यह बताता है कि स्कैनिंग की प्रोसेस पूरी हो गई है.

  • टीआईएस, ऊपर दी गई कार्रवाइयों को तब तक दोहराता है, जब तक कि फ़्रीक्वेंसी की सभी सेटिंग पूरी नहीं हो जातीं.

  • स्कैनिंग की प्रोसेस पूरी होने पर, HAL END भेजता है.

  • TIS, फ़्रीक्वेंसी की सूची में अगली उपलब्ध फ़्रीक्वेंसी पर चला जाता है.

TIS, Tuner.scan(AUTO_SCAN) को तब तक कॉल करता है, जब तक सभी फ़्रीक्वेंसी खत्म नहीं हो जातीं.

स्कैनिंग के दौरान, स्कैन को रोकने या खत्म करने के लिए stopScan() या close() पर कॉल किया जा सकता है.

Tuner.scan(BLIND_SCAN)

अगर टीआईएस के पास फ़्रीक्वेंसी की सूची नहीं है और वेंडर एचएएल, उपयोगकर्ता के तय किए गए फ़्रंटएंड की फ़्रीक्वेंसी खोज सकता है, ताकि फ़्रंटएंड रिसॉर्स मिल सके, तो Tuner.scan(BLIND_SCAN) का सुझाव दिया जाता है.

  • TIS, Tuner.scan(BLIND_SCAN) का इस्तेमाल करता है. शुरुआती फ़्रीक्वेंसी के लिए, FrontendSettings में फ़्रीक्वेंसी तय की जा सकती है. हालांकि, टीआईएस FrontendSettings में मौजूद अन्य सेटिंग को अनदेखा करता है.
  • अगर सिग्नल लॉक है, तो HAL स्कैन LOCKED मैसेज की रिपोर्ट करता है.
  • ज़रूरी जानकारी इकट्ठा करने के लिए, TIS Frontend.getStatus का इस्तेमाल करता है.
  • TIS, स्कैनिंग जारी रखने के लिए Tuner.scan को फिर से कॉल करता है. (FrontendSettings को अनदेखा किया जाता है.)
  • टीआईएस, ऊपर दी गई कार्रवाइयों को तब तक दोहराता है, जब तक कि फ़्रीक्वेंसी की सभी सेटिंग पूरी नहीं हो जातीं. HAL, टीआईएस की किसी कार्रवाई के बिना ही फ़्रीक्वेंसी बढ़ा देता है. HAL रिपोर्ट PROGRESS.

TIS, Tuner.scan(AUTO_SCAN) को तब तक कॉल करता है, जब तक सभी फ़्रीक्वेंसी खत्म नहीं हो जातीं. HAL, END रिपोर्ट करता है. इससे पता चलता है कि स्कैन करने की प्रोसेस पूरी हो गई है.

स्कैनिंग के दौरान, स्कैन को रोकने या खत्म करने के लिए, stopScan() या close() पर कॉल किया जा सकता है.

टीआईएस स्कैन करने की प्रोसेस का फ़्लो डायग्राम.

नौवीं इमेज. टीआईएस स्कैन का फ़्लो डायग्राम

Android.media.tv.tuner.filter

फ़िल्टर पैकेज, फ़िल्टर ऑपरेशन का एक कलेक्शन होता है. इसमें कॉन्फ़िगरेशन, सेटिंग, कॉलबैक, और इवेंट भी शामिल होते हैं. इस पैकेज में नीचे दिए गए ऑपरेशन शामिल हैं. ऑपरेशन की पूरी सूची देखने के लिए, Android का सोर्स कोड देखें.

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

पूरी सूची देखने के लिए, Android का सोर्स कोड देखें.

FilterConfiguration का हिसाब यहां दी गई क्लास के आधार पर लगाया जाता है. कॉन्फ़िगरेशन, मुख्य फ़िल्टर टाइप के लिए होते हैं. इनसे यह पता चलता है कि फ़िल्टर, डेटा निकालने के लिए किस प्रोटोकॉल का इस्तेमाल करता है.

  • AlpFilterConfiguration
  • IpFilterConfiguration
  • MmtpFilterConfiguration
  • TlvFilterConfiguration
  • TsFilterConfiguration

ये सेटिंग, नीचे दी गई क्लास से ली गई हैं. ये सेटिंग, फ़िल्टर के सबटाइप के लिए होती हैं. इनसे यह तय होता है कि फ़िल्टर किस तरह के डेटा को बाहर रख सकता है.

  • SectionSettings
  • AvSettings
  • PesSettings
  • RecordSettings
  • DownloadSettings

FilterEvent को नीचे दी गई क्लास से लिया गया है, ताकि अलग-अलग तरह के डेटा के लिए इवेंट रिपोर्ट किए जा सकें.

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

Android 12 और Tuner HAL 1.1 या इसके बाद के वर्शन पर, ये इवेंट काम करते हैं.

  • IpCidChangeEvent
  • RestartEvent
  • ScramblingStatusEvent
फ़िल्टर से इवेंट और डेटा फ़ॉर्मैट
फ़िल्टर के टाइप झंडे इवेंट डेटा ऑपरेशन डेटा फ़ॉर्मैट
TS.SECTION
MMTP.SECTION
IP.SECTION
TLV.SECTION
ALP.SECTION
isRaw:
true
ज़रूरी है:
DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW

सुझाया गया:
DemuxFilterStatus::LOW_WATER
DemuxFilterStatus::HIGH_WATER
इवेंट और इंटरनल शेड्यूल के हिसाब से, एक या उससे ज़्यादा बार
Filter.read(buffer, offset, adjustedSize) चलाएं.

डेटा को HAL के MQ से क्लाइंट बफ़र में कॉपी किया जाता है.
असेंबल किए गए एक सेशन पैकेज को दूसरे सेशन पैकेज से FMQ में भरा जाता है.
isRaw:
false
ज़रूरी है:
DemuxFilterEvent::DemuxFilterSectionEvent[n]
DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW

ज़रूरी नहीं है:
DemuxFilterStatus::LOW_WATER
DemuxFilterStatus::HIGH_WATER
for i=0; i<n; i++
Filter.read(buffer, offset, DemuxFilterSectionEven[i].size)


डेटा को HAL के MQ से क्लाइंट बफ़र में कॉपी किया जाता है.
TS.PES isRaw:
true
ज़रूरी है:
DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW

सुझाया गया:
DemuxFilterStatus::LOW_WATER
DemuxFilterStatus::HIGH_WATER
इवेंट और इंटरनल शेड्यूल के हिसाब से, एक या उससे ज़्यादा बार
Filter.read(buffer, offset, adjustedSize) चलाएं.

डेटा को HAL के MQ से क्लाइंट बफ़र में कॉपी किया जाता है.
असेंबल किए गए एक पीईएस पैकेज को दूसरे पीईएस पैकेज से एफएमक्यू में भरा जाता है.
isRaw:
false
ज़रूरी है:
DemuxFilterEvent::DemuxFilterPesEvent[n]
DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW

ज़रूरी नहीं है:
DemuxFilterStatus::LOW_WATER
DemuxFilterStatus::HIGH_WATER
for i=0; i<n; i++
Filter.read(buffer, offset, DemuxFilterPesEven[i].size)


डेटा को HAL के MQ से क्लाइंट बफ़र में कॉपी किया जाता है.
MMTP.PES isRaw:
true
ज़रूरी है:
DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW

सुझाया गया:
DemuxFilterStatus::LOW_WATER
DemuxFilterStatus::HIGH_WATER
इवेंट और इंटरनल शेड्यूल के हिसाब से, एक या उससे ज़्यादा बार
Filter.read(buffer, offset, adjustedSize) चलाएं.

डेटा को HAL के MQ से क्लाइंट बफ़र में कॉपी किया जाता है.
असेंबल किए गए एक एमएफ़यू पैकेज को दूसरे एमएफ़यू पैकेज से एफएमक्यू में भरा जाता है.
isRaw:
false
ज़रूरी है:
DemuxFilterEvent::DemuxFilterPesEvent[n]
DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW

ज़रूरी नहीं है:
DemuxFilterStatus::LOW_WATER
DemuxFilterStatus::HIGH_WATER
for i=0; i<n; i++
Filter.read(buffer, offset, DemuxFilterPesEven[i].size)


डेटा को HAL के MQ से क्लाइंट बफ़र में कॉपी किया जाता है.
TS.TS
लागू नहीं ज़रूरी है:
DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW

सुझाया गया:
DemuxFilterStatus::LOW_WATER
DemuxFilterStatus::HIGH_WATER
इवेंट और इंटरनल शेड्यूल के हिसाब से, एक या उससे ज़्यादा बार
Filter.read(buffer, offset, adjustedSize) चलाएं.

डेटा को HAL के MQ से क्लाइंट बफ़र में कॉपी किया जाता है.
ts हेडर
में मौजूद ts को फ़िल्टर किया गया है और 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 को कॉल किया जा सकता है.
लागू नहीं
isPassthrough:
false
ज़रूरी है:
DemuxFilterEvent::DemuxFilterMediaEvent[n]
DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW

ज़रूरी नहीं है:
DemuxFilterStatus::LOW_WATER
DemuxFilterStatus::HIGH_WATER
MediaCodec का इस्तेमाल करने के लिए:
for i=0; i<n; i++
linearblock = MediaEvent[i].getLinearBlock();
codec.startQueueLinearBlock(linearblock)
linearblock.recycle()


AudioTrack के डायरेक्ट ऑडियो का इस्तेमाल करने के लिए:
for i=0; i<n; i++
audioHandle = MediaEvent[i].getAudioHandle();
audiotrack.write(encapsulated(audiohandle))
ION मेमोरी में ES या आंशिक ES डेटा.
TS.PCR
IP.NTP
ALP.PTP
लागू नहीं ज़रूरी है: लागू नहीं है
ज़रूरी नहीं है: लागू नहीं है
लागू नहीं लागू नहीं
TS.RECORD लागू नहीं ज़रूरी है:
DemuxFilterEvent::DemuxFilterTsRecordEvent[n]
RecordStatus::DATA_READY
RecordStatus::DATA_OVERFLOW
RecordStatus::LOW_WATER
RecordStatus::HIGH_WATER

ज़रूरी नहीं है:
DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW
DemuxFilterStatus::LOW_WATER
DemuxFilterStatus::HIGH_WATER
इंडेक्स डेटा के लिए:
for i=0; i<n; i++
DemuxFilterTsRecordEvent[i];


रिकॉर्ड किए गए कॉन्टेंट के लिए, RecordStatus::* और इंटरनल शेड्यूल के मुताबिक, इनमें से कोई एक काम करें:
  • स्टोरेज के लिए, DvrRecord.write(adustedSize) को एक या उससे ज़्यादा बार चलाएं.
    डेटा को HAL के MQ से स्टोरेज में ट्रांसफ़र किया जाता है.
  • बफ़र करने के लिए, DvrRecord.write(buffer, adustedSize) को एक या उससे ज़्यादा बार दबाएं.
    डेटा को HAL के MQ से क्लाइंट बफ़र में कॉपी किया जाता है.
इंडेक्स डेटा के लिए: इवेंट पेलोड में शामिल होता है.

रिकॉर्ड किए गए कॉन्टेंट के लिए: FMQ में भरा गया मक्स किया गया टीएस स्ट्रीम.
TS.TEMI लागू नहीं ज़रूरी है:
DemuxFilterEvent::DemuxFilterTemiEvent[n]

ज़रूरी नहीं है:
DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW
DemuxFilterStatus::LOW_WATER
DemuxFilterStatus::HIGH_WATER
for i=0; i<n; i++
DemuxFilterTemiEvent[i];
लागू नहीं
MMTP.MMTP लागू नहीं ज़रूरी है:
DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW

सुझाया गया:
DemuxFilterStatus::LOW_WATER
DemuxFilterStatus::HIGH_WATER
इवेंट और इंटरनल शेड्यूल के हिसाब से, एक या उससे ज़्यादा बार
Filter.read(buffer, offset, adjustedSize) चलाएं.

डेटा को HAL के MQ से क्लाइंट बफ़र में कॉपी किया जाता है.
mmtp हेडर
में मौजूद mmtp को फ़िल्टर किया गया है और FMQ में भरा गया है.
MMTP.RECORD लागू नहीं ज़रूरी है:
DemuxFilterEvent::DemuxFilterMmtpRecordEvent[n]
RecordStatus::DATA_READY
RecordStatus::DATA_OVERFLOW
RecordStatus::LOW_WATER
RecordStatus::HIGH_WATER

ज़रूरी नहीं है:
DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW
DemuxFilterStatus::LOW_WATER
DemuxFilterStatus::HIGH_WATER
इंडेक्स डेटा के लिए: for i=0; i<n; i++
DemuxFilterMmtpRecordEvent[i];


रिकॉर्ड किए गए कॉन्टेंट के लिए, RecordStatus::* और इंटरनल शेड्यूल के मुताबिक, इनमें से कोई एक काम करें:
  • स्टोरेज के लिए, DvrRecord.write(adjustedSize) एक या उससे ज़्यादा बार चलाएं.
    डेटा को HAL के MQ से स्टोरेज में ट्रांसफ़र किया जाता है.
  • बफ़र करने के लिए, DvrRecord.write(buffer, adjustedSize)एक या उससे ज़्यादा बार चलाएं.
    डेटा को HAL के MQ से क्लाइंट बफ़र में कॉपी किया जाता है.
इंडेक्स डेटा के लिए: इवेंट पेलोड में शामिल होता है.

रिकॉर्ड किए गए कॉन्टेंट के लिए: रिकॉर्ड की गई स्ट्रीम को FMQ में मक्स किया गया.

अगर रिकॉर्डिंग के लिए फ़िल्टर सोर्स, पासथ्रू के साथ TLV.TLV से IP.IP पर सेट है, तो रिकॉर्ड की गई स्ट्रीम में टीएलवी और आईपी हेडर होता है.
MMTP.DOWNLOAD लागू नहीं ज़रूरी है:
DemuxFilterEvent::DemuxFilterDownloadEvent[n]
DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW

ज़रूरी नहीं है:
DemuxFilterStatus::LOW_WATER
DemuxFilterStatus::HIGH_WATER
for i=0; i<n; i++ Filter.read(buffer, offset, DemuxFilterDownloadEvent[i].size)

डेटा को HAL के MQ से क्लाइंट बफ़र में कॉपी किया जाता है.
डाउनलोड पैकेज को FMQ में, आईपी डाउनलोड पैकेज के ज़रिए भरा जाता है.
IP.IP_PAYLOAD लागू नहीं ज़रूरी है:
DemuxFilterEvent::DemuxFilterIpPayloadEvent[n]
DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW

ज़रूरी नहीं है:
DemuxFilterStatus::LOW_WATER
DemuxFilterStatus::HIGH_WATER
for i=0; i<n; i++ Filter.read(buffer, offset, DemuxFilterIpPayloadEvent[i].size)

डेटा को HAL के MQ से क्लाइंट बफ़र में कॉपी किया जाता है.
आईपी पेलोड पैकेज को किसी दूसरे आईपी पेलोड पैकेज से FMQ में भरा जाता है.
IP.IP
TLV.TLV
ALP.ALP
isPassthrough:
true
ज़रूरी नहीं:
DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW
फ़िल्टर किए गए प्रोटोकॉल की सब-स्ट्रीम, फ़िल्टर की चेन में मौजूद अगले फ़िल्टर को फ़ीड करती है. लागू नहीं
isPassthrough:
false
ज़रूरी है:
DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW

सुझाया गया:
DemuxFilterStatus::LOW_WATER
DemuxFilterStatus::HIGH_WATER
इवेंट और इंटरनल शेड्यूल के हिसाब से, एक या उससे ज़्यादा बार
Filter.read(buffer, offset, adjustedSize) चलाएं.

डेटा को HAL के MQ से क्लाइंट बफ़र में कॉपी किया जाता है.
प्रोटोकॉल हेडर वाली प्रोटोकॉल सब-स्ट्रीम को फ़िल्टर किया गया है. इसमें FMQ की जानकारी भरी गई है.
IP.PAYLOAD_THROUGH
TLV.PAYLOAD_THROUGH
ALP.PAYLOAD_THROUGH
लागू नहीं ज़रूरी नहीं:
DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW
फ़िल्टर किए गए प्रोटोकॉल पेलोड, फ़िल्टर चेन में अगले फ़िल्टर को फ़ीड करता है. लागू नहीं
पीएसआई/एसआई बनाने के लिए फ़िल्टर का इस्तेमाल करने का उदाहरण

पीएसआई/एसआई बनाने के लिए, फ़िल्टर का इस्तेमाल करने का उदाहरण.

दसवीं इमेज. पीएसआई/एसआई बनाने का फ़्लो

  1. कोई फ़िल्टर खोलें.

    Filter filter = tuner.openFilter(
      Filter.TYPE_TS,
      Filter.SUBTYPE_SECTION,
      /* bufferSize */1000,
      executor,
      filterCallback
    );
    
  2. फ़िल्टर को कॉन्फ़िगर करें और शुरू करें.

    Settings settings = SectionSettingsWithTableInfo
        .builder(Filter.TYPE_TS)
        .setTableId(2)
        .setVersion(1)
        .setCrcEnabled(true)
        .setRaw(false)
        .setRepeat(false)
        .build();
      FilterConfiguration config = TsFilterConfiguration
        .builder()
        .setTpid(10)
        .setSettings(settings)
        .build();
      filter.configure(config);
      filter.start();
    
  3. SectionEvent को प्रोसेस करें.

    FilterCallback filterCallback = new FilterCallback() {
      @Override
      public void onFilterEvent(Filter filter, FilterEvent[] events) {
        for (FilterEvent event : events) {
          if (event instanceof SectionEvent) {
            SectionEvent sectionEvent = (SectionEvent) event;
            int tableId = sectionEvent.getTableId();
            int version = sectionEvent.getVersion();
            int dataLength = sectionEvent.getDataLength();
            int sectionNumber = sectionEvent.getSectionNumber();
            filter.read(buffer, 0, dataLength); }
          }
        }
    };
    
फ़िल्टर से MediaEvent का इस्तेमाल करने के लिए फ़्लो का उदाहरण

फ़िल्टर से MediaEvent का इस्तेमाल करने का उदाहरण.

ग्यारहवीं इमेज. फ़िल्टर से MediaEvent का इस्तेमाल करने के लिए फ़्लो

  1. ऑडियो/वीडियो फ़िल्टर खोलें, कॉन्फ़िगर करें, और शुरू करें.
  2. MediaEvent को प्रोसेस करें.
  3. MediaEvent पाएं.
  4. लीनियर ब्लॉक को codec की सूची में जोड़ें.
  5. डेटा का इस्तेमाल हो जाने के बाद, 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 का इस्तेमाल, डीवीआर इंस्टेंस की स्थिति की जानकारी देने के लिए किया जाता है.

रिकॉर्ड शुरू करने के लिए फ़्लो का उदाहरण

रिकॉर्ड शुरू करने के लिए फ़्लो का उदाहरण.

बारहवीं इमेज. रिकॉर्ड शुरू करने का फ़्लो

  1. DvrRecorder को खोलें, कॉन्फ़िगर करें, और शुरू करें.

    DvrRecorder recorder = openDvrRecorder(/* bufferSize */ 1000, executor, listener);
    DvrSettings dvrSettings = DvrSettings
    .builder()
    .setDataFormat(DvrSettings.DATA_FORMAT_TS)
    .setLowThreshold(100)
    .setHighThreshold(900)
    .setPacketSize(188)
    .build();
    recorder.configure(dvrSettings);
    recorder.attachFilter(filter);
    recorder.setFileDescriptor(fd);
    recorder.start();
    
  2. RecordEvent पाएं और इंडेक्स की जानकारी वापस पाएं.

    FilterCallback filterCallback = new FilterCallback() {
      @Override
      public void onFilterEvent(Filter filter, FilterEvent[] events) {
        for (FilterEvent event : events) {
          if (event instanceof TsRecordEvent) {
            TsRecordEvent recordEvent = (TsRecordEvent) event;
            int tsMask = recordEvent.getTsIndexMask();
            int scMask = recordEvent.getScIndexMask();
            int packetId = recordEvent.getPacketId();
            long dataLength = recordEvent.getDataLength();
            // handle the masks etc. }
          }
        }
    };
    
  3. OnRecordStatusChangedListener को शुरू करें और रिकॉर्ड किए गए डेटा को सेव करें.

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

ट्यूनर एचएएल

ट्यूनर एचएएल, एचआईडीएल के मुताबिक काम करता है. यह फ़्रेमवर्क और वेंडर के हार्डवेयर के बीच इंटरफ़ेस तय करता है. वेंडर, Tuner HAL को लागू करने के लिए इस इंटरफ़ेस का इस्तेमाल करते हैं. साथ ही, फ़्रेमवर्क इसका इस्तेमाल, Tuner HAL को लागू करने के साथ कम्यूनिकेट करने के लिए करता है.

मॉड्यूल

Tuner HAL 1.0

मॉड्यूल सामान्य कंट्रोल मॉड्यूल के हिसाब से कंट्रोल एचएएल फ़ाइलें
ITuner लागू नहीं frontend(open, getIds, getInfo), openDemux, openDescrambler, openLnb, getDemuxCaps ITuner.hal
IFrontend setCallback, getStatus, close tune, stopTune, scan, stopScan, setLnb IFrontend.hal
IFrontendCallback.hal
IDemux close setFrontendDataSource, openFilter, openDvr, getAvSyncHwId, getAvSyncTime, connect / disconnectCiCam IDemux.hal
IDvr close, start, stop, configure attach/detachFilters, flush, getQueueDesc IDvr.hal
IDvrCallback.hal
IFilter close, start, stop, configure, getId flush, getQueueDesc, releaseAvHandle, setDataSource IFilter.hal
IFilterCallback.hal
ILnb close, setCallback setVoltage, setTone, setSatellitePosition, sendDiseqcMessage ILnb.hal
ILnbCallback.hal
IDescrambler close setDemuxSource, setKeyToken, addPid, removePid IDescrambler.hal

ट्यूनर HAL 1.1 (ट्यूनर HAL 1.0 से लिया गया)

मॉड्यूल सामान्य कंट्रोल मॉड्यूल के हिसाब से कंट्रोल एचएएल फ़ाइलें
ITuner लागू नहीं getFrontendDtmbCapabilities @1.1::ITuner.hal
IFrontend tune_1_1, scan_1_1, getStatusExt1_1 link/unlinkCiCam @1.1::IFrontend.hal
@1.1::IFrontendCallback.hal
IFilter getStatusExt1_1 configureIpCid, configureAvStreamType, getAvSharedHandle, configureMonitorEvent @1.1::IFilter.hal
@1.1::IFilterCallback.hal

ट्यूनर एचएएल के मॉड्यूल के बीच इंटरैक्शन का फ़्लो डायग्राम.

तेरहवीं इमेज. ट्यूनर एचएएल मॉड्यूल के बीच इंटरैक्शन का डायग्राम

फ़िल्टर लिंकेज

Tuner HAL, फ़िल्टर लिंक करने की सुविधा देता है. इससे फ़िल्टर को कई लेयर के लिए, अन्य फ़िल्टर से लिंक किया जा सकता है. फ़िल्टर इन नियमों के मुताबिक काम करते हैं.

  • फ़िल्टर को ट्री के तौर पर लिंक किया जाता है. क्लोज़ पाथ की अनुमति नहीं है.
  • रूट नोड, डेमक्स है.
  • फ़िल्टर अलग-अलग काम करते हैं.
  • सभी फ़िल्टर को डेटा मिलना शुरू हो जाता है.
  • फ़िल्टर लिंकेज, आखिरी फ़िल्टर पर फ़्लश हो जाता है.

नीचे दिए गए कोड ब्लॉक और इमेज 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>)
}

फ़िल्टर लिंक करने के उदाहरण का डायग्राम.

चौदहवीं इमेज. कई लेयर के लिए फ़िल्टर लिंक करने का फ़्लो डायग्राम

ट्यूनर रिसोर्स मैनेजर

Tuner Resource Manager (टीआरएम) से पहले, दो ऐप्लिकेशन के बीच स्विच करने के लिए, एक ही ट्यूनर हार्डवेयर की ज़रूरत होती थी. टीवी इनपुट फ़्रेमवर्क (टीआईएफ़) में "पहले आओ, पहले पाओ" सिद्धांत का इस्तेमाल किया जाता है. इसका मतलब है कि जिस ऐप्लिकेशन को संसाधन पहले मिलता है वह उसे अपने पास रखता है. हालांकि, कुछ मुश्किल मामलों में यह तरीका सही नहीं हो सकता.

टीआरएम, सिस्टम सेवा के तौर पर काम करता है. यह ऐप्लिकेशन के लिए, ट्यूनर, TVInput, और CAS हार्डवेयर संसाधनों को मैनेज करता है. टीआरएम, "फ़ोरग्राउंड विन" मेकेनिज़्म का इस्तेमाल करता है. यह ऐप्लिकेशन के फ़ोरग्राउंड या बैकग्राउंड स्टेटस और इस्तेमाल के उदाहरण के टाइप के आधार पर, ऐप्लिकेशन की प्राथमिकता का हिसाब लगाता है. टीआरएम, प्राथमिकता के आधार पर संसाधन को अनुमति देता है या उसे रद्द करता है. टीआरएम, ब्रॉडकास्ट, ओटीटी, और डीवीआर के लिए एटीवी के संसाधन मैनेजमेंट को एक जगह पर मैनेज करता है.

टीआरएम इंटरफ़ेस

TRM, ITunerResourceManager.aidl में AIDL इंटरफ़ेस दिखाता है. इससे Tuner फ़्रेमवर्क, 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वीं इमेज. ट्यूनर संसाधनों के बीच टकराव होने पर, उन्हें वापस पाने के तरीके का डायग्राम