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

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

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

Components

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

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

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

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

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

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

सुविधाएं

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

  • एटीएससी
  • ATSC3
  • डीवीबी सी/एस/टी
  • ISDB S/S3/T
  • ऐनालॉग

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

  • डीटीएमबी

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

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

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

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

Tuner API, यहां दिए गए इस्तेमाल के उदाहरणों के साथ काम करते हैं.

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

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

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

पूरा डिज़ाइन

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

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

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

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

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

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

Media CAS और CAS HAL को इन सुविधाओं के साथ बेहतर बनाया गया है.

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

MediaCodec और AudioTrack को बेहतर बनाने के लिए, इन सुविधाओं को जोड़ा गया है.

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

ट्यूनर एचएएल का पूरा डिज़ाइन.

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

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

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

सेटअप

लाइव ब्रॉडकास्ट के वीडियो चलाने के क्रम को सेटअप करने का डायग्राम.

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

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

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

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

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

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

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

ऑडियो/विज़ुअल डेटा प्रोसेस करना

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

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

Tuner SDK API

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

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

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

वर्शन

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

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

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

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

पैकेज

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 पैकेज का फ़्लो डायग्राम.

आठवीं इमेज. Tuner SDK टूल के एपीआई पैकेज

Android.media.tv.tuner

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

  • 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

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

  • DtmbFrontendSettings

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

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

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

  • DtmbFrontendCapabilities

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

चैनल स्कैन करना

टीवी सेट अप करने के लिए, ऐप्लिकेशन संभावित फ़्रीक्वेंसी को स्कैन करता है और उपयोगकर्ताओं के ऐक्सेस के लिए चैनल की सूची बनाता है. चैनल की स्कैनिंग पूरी करने के लिए, टीआईएस 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 का इस्तेमाल करता है.
  • इसके बाद, टीआईएस अपनी फ़्रीक्वेंसी सूची में अगली उपलब्ध फ़्रीक्वेंसी पर स्विच कर देता है.

टीआईएस, Tuner.tune को तब तक फिर से कॉल करता है, जब तक सभी फ़्रीक्वेंसी खत्म नहीं हो जातीं.

ट्यूनिंग के दौरान, Tuner.tune कॉल को रोकने या खत्म करने के लिए, stopTune() या close() को दबाया जा सकता है.

Tuner.scan(AUTO_SCAN)

अगर TIS में Tuner.tune का इस्तेमाल करने के लिए ज़रूरत के मुताबिक जानकारी नहीं है, लेकिन फ़्रीक्वेंसी सूची और स्टैंडर्ड टाइप (उदाहरण के लिए, DVB T/C/S) है, तो हमारा सुझाव है कि Tuner.scan(AUTO_SCAN) का इस्तेमाल करें.

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

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

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

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

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

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

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

  • इसके बाद, टीआईएस अपनी फ़्रीक्वेंसी सूची में अगली उपलब्ध फ़्रीक्वेंसी पर स्विच कर देता है.

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

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

Tuner.scan(BLIND_SCAN)

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

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

टीआईएस, 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

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

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

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

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

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


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

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

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

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


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

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

डेटा को HAL के MQ से क्लाइंट बफ़र में कॉपी किया जाता है.
एक असेंबल किए गए एमएफ़यू पैकेज को, किसी दूसरे एमएफ़यू पैकेज से एफ़एमक्यू में भरा जाता है.
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 के एमक्यू से क्लाइंट बफ़र में कॉपी किया जाता है.
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 से क्लाइंट बफ़र में कॉपी किया जाता है.
इंडेक्स डेटा के लिए: इवेंट पेलोड में भेजा जाता है.

रिकॉर्ड किए गए कॉन्टेंट के लिए: एफ़एमक्यू में भरी गई एमक्स की गई टीएस स्ट्रीम.
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 से क्लाइंट बफ़र में कॉपी किया जाता है.
इंडेक्स डेटा के लिए: इवेंट पेलोड में भेजा जाता है.

रिकॉर्ड किए गए कॉन्टेंट के लिए: एफ़एमक्यू में भरी गई, रिकॉर्ड की गई स्ट्रीम को म्यूक्स किया गया.

अगर रिकॉर्डिंग के लिए फ़िल्टर सोर्स, पासथ्रू के साथ 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 से क्लाइंट बफ़र में कॉपी किया जाता है.
डाउनलोड पैकेज, किसी दूसरे आईपी डाउनलोड पैकेज से एफ़एमक्यू में भरा गया है.
IP.IP_PAYLOAD लागू नहीं ज़रूरी है:
DemuxFilterEvent::DemuxFilterIpPayloadEvent[n]
DemuxFilterStatus::DATA_READY
DemuxFilterStatus::DATA_OVERFLOW

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

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

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

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

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

10वीं इमेज. PSI/SI बनाने का फ़्लो

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

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

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

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

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

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

  1. A/V फ़िल्टर खोलें, कॉन्फ़िगर करें, और चलाएं.
  2. MediaEvent प्रोसेस करें.
  3. MediaEvent पाएं.
  4. लीनियर ब्लॉक को codec पर कतार में लगाएं.
  5. डेटा खर्च होने के बाद, A/V हैंडल को रिलीज़ करें.

Android.media.tv.tuner.dvr

DvrRecorder, रिकॉर्डिंग के लिए ये तरीके उपलब्ध कराता है.

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

DvrPlayback, वीडियो चलाने के लिए ये तरीके उपलब्ध कराता है.

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

DvrSettings का इस्तेमाल, DvrRecorder और DvrPlayback को कॉन्फ़िगर करने के लिए किया जाता है. OnPlaybackStatusChangedListener और OnRecordStatusChangedListener का इस्तेमाल, डीवीआर इंस्टेंस की स्थिति की जानकारी देने के लिए किया जाता है.

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

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

12वीं इमेज. रिकॉर्डिंग शुरू करने का तरीका

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

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

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

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

ट्यूनर एचएएल

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

मॉड्यूल

Tuner HAL 1.0

मॉड्यूल सामान्य कंट्रोल मॉड्यूल के हिसाब से कंट्रोल HAL फ़ाइलें
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

Tuner HAL 1.1 (Tuner HAL 1.0 से लिया गया)

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

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

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

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

Tuner 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वीं इमेज. कई लेयर के लिए फ़िल्टर लिंकेज का फ़्लो डायग्राम

Tuner Resource Manager

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

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

TRM इंटरफ़ेस

TRM, संसाधनों को रजिस्टर करने, अनुरोध करने या रिलीज़ करने के लिए, Tuner फ़्रेमवर्क, MediaCas, और TvInputHardwareManager के लिए ITunerResourceManager.aidl में AIDL इंटरफ़ेस दिखाता है.

क्लाइंट मैनेजमेंट के लिए इंटरफ़ेस यहां दिए गए हैं.

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

संसाधनों का अनुरोध करने और उन्हें रिलीज़ करने के इंटरफ़ेस यहां दिए गए हैं.

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

क्लाइंट और अनुरोध क्लास की सूची यहां दी गई है.

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

क्लाइंट की प्राथमिकता

टीआरएम, क्लाइंट की प्रोफ़ाइल के पैरामीटर और कॉन्फ़िगरेशन फ़ाइल की प्राथमिकता वैल्यू का इस्तेमाल करके, क्लाइंट की प्राथमिकता का हिसाब लगाता है. क्लाइंट की ओर से तय की गई प्राथमिकता की वैल्यू से भी प्राथमिकता अपडेट की जा सकती है.

क्लाइंट की प्रोफ़ाइल में पैरामीटर

यह तय करने के लिए कि कोई ऐप्लिकेशन फ़ोरग्राउंड ऐप्लिकेशन है या बैकग्राउंड ऐप्लिकेशन, TRM 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 के हिसाब से होना चाहिए.

मनमुताबिक प्राथमिकता वाली वैल्यू और अच्छी वैल्यू

टीआरएम, क्लाइंट के लिए updateClientPriority उपलब्ध कराता है, ताकि वह अपनी पसंद के मुताबिक प्राथमिकता की वैल्यू और अच्छी वैल्यू को अपडेट कर सके. मनमुताबिक प्राथमिकता वाली वैल्यू, इस्तेमाल के उदाहरण के टाइप और सेशन आईडी से कैलकुलेट की गई प्राथमिकता वाली वैल्यू को बदल देती है.

nice वैल्यू से पता चलता है कि किसी दूसरे क्लाइंट के साथ टकराव होने पर, क्लाइंट का व्यवहार कितना'निस्संदेह' है. अच्छी वैल्यू, क्लाइंट की प्राथमिकता वाली वैल्यू को कम कर देती है. इसके बाद, इसकी तुलना चुनौती वाले क्लाइंट की प्राथमिकता वाली वैल्यू से की जाती है.

फिर से दावा करने का तरीका

नीचे दिए गए डायग्राम में दिखाया गया है कि रिसॉर्स का कोई विरोध होने पर, रिसॉर्स को फिर से कैसे हासिल किया जाता है और उन्हें कैसे असाइन किया जाता है.

चैनल वापस पाने की प्रोसेस का डायग्राम.

15वीं इमेज. ट्यूनर के संसाधनों के बीच होने वाले संघर्ष के लिए, फिर से दावा करने के तरीके का डायग्राम