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
या टीवी इनपुट सेवा (टीआईएस)TvInputManagerService
या टीवी इनपुट मैनेजर सेवा (TIMS)MediaCodec
या मीडिया कोडेकAudioTrack
या ऑडियो ट्रैकMediaResourceManager
या मीडिया रिसॉर्स मैनेजर (एमआरएम)
पहला डायग्राम. Android TV के कॉम्पोनेंट के बीच इंटरैक्शन
सुविधाएं
Frontend, नीचे दिए गए DTV मानकों के साथ काम करता है.
- एटीएससी
- ATSC3
- डीवीबी सी/एस/टी
- आईएसडीबी एस/एस3/टी
- ऐनालॉग
Android 12 में, ट्यूनर एचएएल 1.1 या इसके बाद के वर्शन वाला फ़्रंटएंड, नीचे दिए गए डीटीवी स्टैंडर्ड के साथ काम करता है.
- डीटीएमबी
डिम्यूक्स, यहां दिए गए स्ट्रीम प्रोटोकॉल के साथ काम करता है.
- ट्रांसपोर्ट स्ट्रीम (टीएस)
- एमपीईजी मीडिया ट्रांसपोर्ट प्रोटोकॉल (एमएमटीपी)
- इंटरनेट प्रोटोकॉल (आईपी)
- टाइप की लंबाई की वैल्यू (TLV)
- एटीएससी लिंक-लेयर प्रोटोकॉल (एएलपी)
डिस्क्रैंबलर, कॉन्टेंट की सुरक्षा के लिए नीचे दी गई सुविधाएं देता है.
- सुरक्षित मीडिया पाथ
- मीडिया पाथ मिटाएं
- स्थानीय रिकॉर्ड को सुरक्षित करना
- डिवाइस में वीडियो सुरक्षित तरीके से चलाना
ट्यूनर एपीआई नीचे दिए गए इस्तेमाल के उदाहरण के साथ काम करते हैं.
- स्कैन करें
- लाइव
- वीडियो चलाएं
- रिकॉर्ड करें
ट्यूनर, MediaCodec
, और AudioTrack
, नीचे दिए गए डेटा फ़्लो मोड के साथ काम करते हैं.
- क्लियर मेमोरी बफ़र वाला ईएस पेलोड
- सुरक्षित मेमोरी हैंडल वाला ES पेलोड
- पास-थ्रू
ओवरऑल डिज़ाइन
Tuner HAL, Android फ़्रेमवर्क और वेंडर के हार्डवेयर के बीच तय किया जाता है.
- यह बताता है कि फ़्रेमवर्क, वेंडर से क्या उम्मीद करता है और वेंडर ऐसा कैसे कर सकता है.
- यह
IFrontend
,IDemux
,IDescrambler
,IFilter
,IDvr
, औरILnb
इंटरफ़ेस के ज़रिए, फ़्रंटएंड, डिम्यूक्स, और डिस्क्रैम्बलर की सुविधाओं को फ़्रेमवर्क में एक्सपोर्ट करता है. - इसमें ट्यूनर एचएएल को
MediaCodec
औरAudioTrack
जैसे अन्य फ़्रेमवर्क कॉम्पोनेंट के साथ इंटिग्रेट करने वाले फ़ंक्शन शामिल हैं.
Tuner Java क्लास और नेटिव क्लास बनाई जाती है.
- Tuner Java API की मदद से, ऐप्लिकेशन सार्वजनिक एपीआई के ज़रिए Tuner HAL को ऐक्सेस कर सकते हैं.
- नेटिव क्लास की मदद से, Tuner HAL की मदद से रिकॉर्डिंग या प्लेबैक के बड़े डेटा को मैनेज किया जा सकता है. साथ ही, अनुमतियों को कंट्रोल भी किया जा सकता है.
- नेटिव ट्यूनर मॉड्यूल, ट्यूनर Java क्लास और ट्यूनर एचएएल के बीच एक ब्रिज है.
एक टीआरएम क्लास बनाई गई है.
- यह सीमित ट्यूनर संसाधनों, जैसे कि फ़्रंटएंड, एलएनबी, सीएएस सेशन, और टीवी इनपुट एचएएल से टीवी इनपुट डिवाइस को मैनेज करता है.
- ऐप्लिकेशन से, कम संसाधनों को वापस पाने के लिए नियम लागू करता है. डिफ़ॉल्ट नियम के तहत, फ़ोरग्राउंड विंडो को प्राथमिकता दी जाती है.
मीडिया सीएएस और सीएएस एचएएल को इन सुविधाओं के साथ बेहतर बनाया गया है.
- अलग-अलग इस्तेमाल और एल्गोरिदम के लिए सीएएस सेशन खोलता है.
- यह डाइनैमिक सीएएस सिस्टम के साथ काम करता है. जैसे, सीआईसीएएम को हटाना और डालना.
- मुख्य टोकन देकर, Tuner HAL के साथ इंटिग्रेट करता है.
MediaCodec
और AudioTrack
में नीचे दी गई सुविधाएं जोड़ी गई हैं.
- कॉन्टेंट इनपुट के तौर पर सुरक्षित A/V मेमोरी का इस्तेमाल करता है.
- टनल किए गए प्लेबैक में हार्डवेयर ए/वी सिंक करने के लिए कॉन्फ़िगर किया गया है.
ES_payload
और पासथ्रू मोड के लिए, कॉन्फ़िगर की गई सहायता.
दूसरी इमेज. ट्यूनर एचएएल के कॉम्पोनेंट का डायग्राम
पूरा वर्कफ़्लो
यहां दिए गए डायग्राम में, लाइव ब्रॉडकास्ट चलाने के लिए कॉल के क्रम के बारे में बताया गया है.
सेटअप
तीसरी इमेज. लाइव ब्रॉडकास्ट के प्लेबैक के लिए सेटअप का क्रम
ऑडियो/वीडियो को हैंडल करना
चौथी इमेज. लाइव ब्रॉडकास्ट को चलाने के लिए ऑडियो/वीडियो हैंडल करना
स्क्रैम्बल किए गए कॉन्टेंट को मैनेज करना
पांचवीं इमेज. लाइव ब्रॉडकास्ट को चलाने के लिए, स्क्रैंबल किए गए कॉन्टेंट को मैनेज करना
ऑडियो/विज़ुअल डेटा प्रोसेस करना
छठी इमेज. लाइव ब्रॉडकास्ट चलाने के लिए ऑडियो/वीडियो को प्रोसेस करना
ट्यूनर SDK API
Tuner SDK API, Tuner JNI, Tuner HAL, और TunerResourceManager
के साथ इंटरैक्शन को मैनेज करता है. TIS ऐप्लिकेशन, ट्यूनर के संसाधनों और सबकॉम्पोनेंट, जैसे कि फ़िल्टर और डीस्क्रैंबलर को ऐक्सेस करने के लिए, Tuner SDK API का इस्तेमाल करता है. फ़्रंटएंड और डीमक्स अंदरूनी कॉम्पोनेंट हैं.
सातवीं इमेज. Tuner SDK API के साथ इंटरैक्शन
वर्शन
Android 12 से, Tuner SDK API की सुविधा को Tuner HAL 1.1 में इस्तेमाल किया जा सकता है. यह Tunery 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 टूल के एपीआई पैकेज
Android.media.tv.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
को नीचे दी गई क्लास की मदद से, अलग-अलग DTV मानकों के हिसाब से तय किया गया है.
AnalogFrontendCapabilities
Atsc3FrontendCapabilities
AtscFrontendCapabilities
DvbcFrontendCapabilities
DvbsFrontendCapabilities
DvbtFrontendCapabilities
Isdbs3FrontendCapabilities
IsdbsFrontendCapabilities
IsdbtFrontendCapabilities
Android 12 वाले ट्यूनर HAL 1.1 या उसके बाद के वर्शन पर, ये DTV स्टैंडर्ड काम करते हैं.
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
में ज़रूरी जानकारी भरता है. - सिग्नल लॉक होने पर, एचएएल रिपोर्ट
LOCKED
मैसेज को ट्यून करती है. - TIS ज़रूरी जानकारी इकट्ठा करने के लिए,
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)
को कॉल करता है, तो ये कार्रवाइयां होती हैं:
TIS,
Tuner.scan(AUTO_SCAN)
का इस्तेमाल करता है. इसमेंFrontendSettings
फ़्रीक्वेंसी होती है.अगर सिग्नल लॉक है, तो HAL रिपोर्ट में
LOCKED
मैसेज स्कैन किए जाते हैं. सिग्नल के बारे में ज़्यादा जानकारी देने के लिए, एचएएल अन्य स्कैन मैसेज की भी रिपोर्ट कर सकता है.TIS ज़रूरी जानकारी इकट्ठा करने के लिए,
Frontend.getStatus
का इस्तेमाल करता है.TIS, HAL को उसी फ़्रीक्वेंसी पर अगली सेटिंग पर जाने के लिए
Tuner.scan
कॉल करता है. अगरFrontendSettings
स्ट्रक्चर खाली है, तो एचएएल अगली उपलब्ध सेटिंग का इस्तेमाल करता है. इसके अलावा, HAL एक बार स्कैन करने के लिएFrontendSettings
का इस्तेमाल करता है और स्कैन की प्रोसेस पूरी होने का पता देने के लिएEND
भेजता है.टीआईएस, ऊपर दी गई कार्रवाइयों को तब तक दोहराता है, जब तक फ़्रीक्वेंसी की सभी सेटिंग इस्तेमाल नहीं हो जातीं.
स्कैन की प्रोसेस पूरी होने का पता चलने पर, HAL
END
भेजता है.इसके बाद, टीआईएस अपनी फ़्रीक्वेंसी सूची में अगली उपलब्ध फ़्रीक्वेंसी पर स्विच कर देता है.
जब तक सभी फ़्रीक्वेंसी पूरी नहीं हो जाती, तब तक टीआईएस Tuner.scan(AUTO_SCAN)
को फिर से कॉल करेगा.
स्कैन करने के दौरान, स्कैन को रोकने या खत्म करने के लिए, stopScan()
या close()
को कॉल किया जा सकता है.
Tuner.scan(BLIND_SCAN)
अगर टीआईएस के पास फ़्रीक्वेंसी सूची नहीं है और वेंडर एचएएल फ़्रंटएंड रिसॉर्स पाने के लिए, उपयोगकर्ता के तय किए गए फ़्रंटएंड की फ़्रीक्वेंसी खोज सकता है, तो Tuner.scan(BLIND_SCAN)
का सुझाव दिया जाता है.
- TIS,
Tuner.scan(BLIND_SCAN)
का इस्तेमाल करता है. शुरू करने की फ़्रीक्वेंसी के लिए, फ़्रीक्वेंसी कोFrontendSettings
में तय किया जा सकता है, लेकिन TISFrontendSettings
में अन्य सेटिंग को अनदेखा कर देता है. - सिग्नल लॉक होने पर, एचएएल
LOCKED
मैसेज स्कैन करता है. - TIS ज़रूरी जानकारी इकट्ठा करने के लिए,
Frontend.getStatus
का इस्तेमाल करता है. - स्कैन करना जारी रखने के लिए, टीआईएस
Tuner.scan
को फिर से कॉल करता है. (FrontendSettings
को अनदेखा किया गया है.) - टीआईएस, ऊपर दी गई कार्रवाइयों को तब तक दोहराता है, जब तक फ़्रीक्वेंसी की सभी सेटिंग इस्तेमाल नहीं हो जातीं. एचएएल, 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
Android 12 वाले, Tuner HAL 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) को एक या उससे ज़्यादा
बार चलाएं.डेटा को HAL के MQ से क्लाइंट बफ़र में कॉपी किया जाता है. |
एक सेट किए गए सेशन पैकेज को, एफ़एमक्यू में किसी दूसरे सेशन पैकेज से भरा जाता है. |
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 से क्लाइंट बफ़र में कॉपी किया जाता है. |
असेंबल किए गए एक पीईएस पैकेज को, दूसरे पीईएस पैकेज के ज़रिए एफ़एमक्यू से भरा गया है. |
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 से क्लाइंट बफ़र में कॉपी किया जाता है. |
असेंबल किया गया एक एमएफ़यू पैकेज, दूसरे एमएफ़यू पैकेज से एफ़एमक्यू में भरा जाता है. |
isRaw: |
ज़रूरी है:DemuxFilterEvent::DemuxFilterPesEvent[n] DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW ज़रूरी नहीं है: DemuxFilterStatus::LOW_WATER DemuxFilterStatus::HIGH_WATER |
for i=0; i<n; i++ डेटा को एचएएल के एमक्यू से क्लाइंट बफ़र में कॉपी किया जाता है. |
||
TS.TS |
लागू नहीं | ज़रूरी: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 को कॉल कर सकता है. |
लागू नहीं |
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 |
लागू नहीं | ज़रूरी है: लागू नहीं
ज़रूरी नहीं है: लागू नहीं |
लागू नहीं | लागू नहीं |
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++ RecordStatus::* और इंटरनल शेड्यूल के मुताबिक,
रिकॉर्ड किए गए कॉन्टेंट के लिए, इनमें से कोई एक काम करें:
|
इंडेक्स डेटा के लिए: इवेंट पेलोड में भेजा जाता है. रिकॉर्ड किए गए कॉन्टेंट के लिए: एफ़एमक्यू से भरी, म्यूट की गई टीएस स्ट्रीम. |
TS.TEMI |
लागू नहीं | ज़रूरी है:DemuxFilterEvent::DemuxFilterTemiEvent[n] ज़रूरी नहीं है: DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW DemuxFilterStatus::LOW_WATER DemuxFilterStatus::HIGH_WATER |
for i=0; i<n; i++ |
लागू नहीं |
MMTP.MMTP |
लागू नहीं | ज़रूरी:DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW सुझाया गया: DemuxFilterStatus::LOW_WATER DemuxFilterStatus::HIGH_WATER |
इवेंट और इंटरनल शेड्यूल के हिसाब से,Filter.read(buffer, offset, adjustedSize) को एक या उससे ज़्यादा बार चलाएं.
डेटा को एचएएल के एमक्यू से क्लाइंट बफ़र में कॉपी किया जाता है. |
mmtp हेडर के साथ फ़िल्टर किया गया mmtp एफ़एमक्यू से भरा हुआ है. |
MMTP.RECORD |
लागू नहीं | ज़रूरी है:DemuxFilterEvent::DemuxFilterMmtpRecordEvent[n] RecordStatus::DATA_READY RecordStatus::DATA_OVERFLOW RecordStatus::LOW_WATER RecordStatus::HIGH_WATER ज़रूरी नहीं: DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW DemuxFilterStatus::LOW_WATER DemuxFilterStatus::HIGH_WATER |
इंडेक्स डेटा के लिए: for i=0; i<n; i++ रिकॉर्ड किए गए कॉन्टेंट के लिए, RecordStatus::* और इंटरनल शेड्यूल के हिसाब से, इनमें से कोई एक काम करें:
|
इंडेक्स डेटा के लिए: इवेंट पेलोड में रखा जाता है. रिकॉर्ड किए गए कॉन्टेंट के लिए: रिकॉर्ड की गई स्ट्रीम को एम्युक्स करके, एफ़एमक्यू में भरें. अगर रिकॉर्डिंग के लिए फ़िल्टर सोर्स, पासथ्रू के साथ 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 से क्लाइंट बफ़र में कॉपी किया जाता है. |
किसी दूसरे आईपी पेलोड पैकेज से, एफएमक्यू में आईपी पेलोड पैकेज भरा जाता है. |
IP.IP TLV.TLV ALP.ALP |
isPassthrough: |
ज़रूरी नहीं:DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW |
फ़िल्टर की गई प्रोटोकॉल सब स्ट्रीम, फ़िल्टर की चेन में अगले फ़िल्टर को फ़ीड करती है. | लागू नहीं |
isPassthrough: |
ज़रूरी:DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW सुझाया गया: DemuxFilterStatus::LOW_WATER DemuxFilterStatus::HIGH_WATER |
इवेंट और इंटरनल शेड्यूल के हिसाब से, Filter.read(buffer, offset, adjustedSize) को एक या उससे ज़्यादा
बार चलाएं.डेटा को HAL के MQ से क्लाइंट बफ़र में कॉपी किया जाता है. |
फ़िल्टर की गई प्रोटोकॉल सब-स्ट्रीम में प्रोटोकॉल हेडर, एफ़एमक्यू से भरा हुआ है. | |
IP.PAYLOAD_THROUGH TLV.PAYLOAD_THROUGH ALP.PAYLOAD_THROUGH |
लागू नहीं | ज़रूरी नहीं:DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW |
फ़िल्टर किया गया प्रोटोकॉल पेलोड, फ़िल्टर की चेन में अगले फ़िल्टर को फ़ीड करता है. | लागू नहीं |
पीएसआई/एसआई बनाने के लिए फ़िल्टर का इस्तेमाल करने के फ़्लो का उदाहरण
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); } } } };
फ़िल्टर से MediaEvent इस्तेमाल करने के फ़्लो का उदाहरण
11वीं इमेज. फ़िल्टर से MediaEvent का इस्तेमाल करने के लिए फ़्लो
- 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
का इस्तेमाल, डीवीआर इंस्टेंस की स्थिति की रिपोर्ट करने के लिए किया जाता है.
रिकॉर्ड शुरू करने के फ़्लो का उदाहरण
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); } } };
ट्यूनर एचएएल
ट्यूनर एचएएल, एचआईडीएल का पालन करता है और फ़्रेमवर्क और वेंडर हार्डवेयर के बीच इंटरफ़ेस तय करता है. वेंडर एचएएल लागू करने के लिए इंटरफ़ेस का इस्तेमाल करते हैं. फ़्रेमवर्क, ट्यूनर एचएएल लागू करने से जुड़ी जानकारी देने के लिए इसका इस्तेमाल करता है.
मॉड्यूल
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 |
13वीं इमेज. ट्यूनर एचएएल मॉड्यूल के बीच के इंटरैक्शन का डायग्राम
फ़िल्टर लिंकेज
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>)
}
14वीं इमेज. एक से ज़्यादा लेयर के लिए, फ़िल्टर लिंकेज का फ़्लो डायग्राम
ट्यूनर संसाधन मैनेजर
Tuner Resource Manager (TRM) से पहले, दो ऐप्लिकेशन के बीच स्विच करने के लिए, एक ही ट्यूनर हार्डवेयर की ज़रूरत होती थी. टीवी इनपुट फ़्रेमवर्क (TIF) में, "पहले हासिल करने वाले को मिलता है" मशीन का इस्तेमाल किया जाता है. इसका मतलब है कि जो ऐप्लिकेशन पहले रिसॉर्स हासिल करता है वह उसे अपने पास रखता है. हालांकि, हो सकता है कि यह तरीका, कुछ जटिल इस्तेमाल के उदाहरणों के लिए सही न हो.
TRM, सिस्टम सेवा के तौर पर काम करता है. इससे ऐप्लिकेशन के लिए ट्यूनर, TVInput
, और सीएएस हार्डवेयर के संसाधनों को मैनेज किया जाता है. टीआरएम, "फ़ोरग्राउंड में होने पर ऐप्लिकेशन को प्राथमिकता" वाले तरीके का इस्तेमाल करता है. यह तरीका, ऐप्लिकेशन के फ़ोरग्राउंड या बैकग्राउंड में होने की स्थिति और इस्तेमाल के उदाहरण के टाइप के आधार पर, ऐप्लिकेशन की प्राथमिकता का हिसाब लगाता है. TRM प्राथमिकता के आधार पर संसाधन को अनुमति देता है या
रद्द करता है. टीआरएम, ब्रॉडकास्ट, ओटीटी, और डीवीआर के लिए, एटीवी के रिसॉर्स मैनेजमेंट को एक ही जगह पर उपलब्ध कराता है.
TRM इंटरफ़ेस
TRM, ट्यूनर फ़्रेमवर्क, MediaCas
, और TvInputHardwareManager
के लिए ITunerResourceManager.aidl
में एआईडीएल इंटरफ़ेस दिखाता है, ताकि संसाधनों को रजिस्टर किया जा सके, उनका अनुरोध किया जा सके या उन्हें रिलीज़ किया जा सके.
क्लाइंट मैनेजमेंट के लिए इंटरफ़ेस यहां दिए गए हैं.
registerClientProfile(in ResourceClientProfile profile, IResourcesReclaimListener listener, out int[] clientId)
unregisterClientProfile(in int clientId)
संसाधनों का अनुरोध करने और उन्हें रिलीज़ करने के इंटरफ़ेस यहां दिए गए हैं.
requestFrontend(TunerFrontendRequest request, int[] frontendHandle)
/releaseFrontend
requestDemux(TunerDemuxRequest request, int[] demuxHandle)
/releaseDemux
requestDescrambler(TunerDescramblerRequest request, int[] descramblerHandle)
/releaseDescrambler
requestCasSession(CasSessionRequest request, int[] casSessionHandle)
/releaseCasSession
requestLnb(TunerLnbRequest request, int[] lnbHandle)
/releaseLnb
क्लाइंट और अनुरोध क्लास की सूची यहां दी गई है.
ResourceClientProfile
ResourcesReclaimListener
TunerFrontendRequest
TunerDemuxRequest
TunerDescramblerRequest
CasSessionRequest
TunerLnbRequest
क्लाइंट की प्राथमिकता
TRM, क्लाइंट की प्रोफ़ाइल के पैरामीटर और कॉन्फ़िगरेशन फ़ाइल में मौजूद प्राथमिकता की वैल्यू का इस्तेमाल करके, क्लाइंट की प्राथमिकता का हिसाब लगाता है. क्लाइंट की ओर से तय की गई प्राथमिकता की वैल्यू से भी प्राथमिकता अपडेट की जा सकती है.
क्लाइंट की प्रोफ़ाइल में पैरामीटर
यह तय करने के लिए कि कोई ऐप्लिकेशन फ़ोरग्राउंड ऐप्लिकेशन है या बैकग्राउंड ऐप्लिकेशन, TRM mTvInputSessionId
से प्रोसेस आईडी हासिल करता है. mTvInputSessionId
, TvInputService.onCreateSession
या TvInputService.onCreateRecordingSession
बनाने के लिए, TIS सेशन शुरू किया जाता है.
mUseCase
से सेशन के इस्तेमाल के उदाहरण के बारे में पता चलता है. पहले से तय इस्तेमाल के उदाहरण नीचे
दिए गए हैं.
TvInputService.PriorityHintUseCaseType {
PRIORITY_HINT_USE_CASE_TYPE_PLAYBACK
PRIORITY_HINT_USE_CASE_TYPE_LIVE
PRIORITY_HINT_USE_CASE_TYPE_RECORD,
PRIORITY_HINT_USE_CASE_TYPE_SCAN,
PRIORITY_HINT_USE_CASE_TYPE_BACKGROUND
}
कॉन्फ़िगरेशन फ़ाइल
डिफ़ॉल्ट कॉन्फ़िगरेशन फ़ाइल
यहां दी गई डिफ़ॉल्ट कॉन्फ़िगरेशन फ़ाइल में, पहले से तय किए गए इस्तेमाल के उदाहरणों के लिए प्राथमिकता वाली वैल्यू दी गई हैं. उपयोगकर्ता, पसंद के मुताबिक बनाई गई कॉन्फ़िगरेशन फ़ाइल का इस्तेमाल करके वैल्यू बदल सकते हैं.
इस्तेमाल का उदाहरण | फ़ोरग्राउंड | बैकग्राउंड |
---|---|---|
LIVE |
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वीं इमेज. ट्यूनर के संसाधनों के बीच टकराव के बारे में, फिर से दावा करने के तरीके का डायग्राम