Android 11 या इसके बाद के वर्शन वाले डिवाइसों पर, A/V कॉन्टेंट डिलीवर करने के लिए, Android Tuner फ़्रेमवर्क का इस्तेमाल किया जा सकता है. यह फ़्रेमवर्क, वेंडर के हार्डवेयर पाइपलाइन का इस्तेमाल करता है. इसलिए, यह कम और ज़्यादा कीमत वाले SoC, दोनों के लिए सही है. यह फ़्रेमवर्क, भरोसेमंद एक्ज़ीक्यूशन एनवायरमेंट (टीईई) और सुरक्षित मीडिया पाथ (एसएमपी) से सुरक्षित किए गए ए/वी कॉन्टेंट को डिलीवर करने का सुरक्षित तरीका उपलब्ध कराता है. इससे इसे कॉन्टेंट को सुरक्षित रखने वाले ऐसे एनवायरमेंट में इस्तेमाल किया जा सकता है जहां बहुत ज़्यादा पाबंदियां होती हैं.
Tuner और Android CAS के बीच स्टैंडर्ड इंटरफ़ेस होने की वजह से, Tuner वेंडर और CAS वेंडर के बीच इंटिग्रेशन तेज़ी से होता है. Android TV के लिए एक ही प्लैटफ़ॉर्म पर सभी सुविधाएं उपलब्ध कराने के लिए, Tuner इंटरफ़ेस MediaCodec और AudioTrack के साथ काम करता है.
ट्यूनर इंटरफ़ेस, ब्रॉडकास्ट के मुख्य स्टैंडर्ड के आधार पर डिजिटल टीवी और ऐनलॉग टीवी, दोनों के साथ काम करता है.
Components
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 या इसके बाद के वर्शन वाला फ़्रंटएंड, नीचे दिए गए डीटीवी स्टैंडर्ड के साथ काम करता है.
- डीटीएमबी
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 के साथ बड़ी मात्रा में रिकॉर्डिंग या प्लेबैक डेटा को मैनेज करने और अनुमतियों को कंट्रोल करने की सुविधा देती है.
- नेटिव ट्यूनर मॉड्यूल, Tuner Java क्लास और Tuner HAL के बीच एक ब्रिज है.
टीआरएम क्लास बनाई जाती है.
- यह सीमित ट्यूनर संसाधनों को मैनेज करता है. जैसे, टीवी इनपुट HAL से फ़्रंटएंड, एलएनबी, सीएएस सेशन, और टीवी इनपुट डिवाइस.
- यह ऐप्लिकेशन से, ज़रूरत से कम इस्तेमाल किए गए संसाधनों को वापस पाने के लिए नियम लागू करता है. डिफ़ॉल्ट नियम के मुताबिक, फ़ोरग्राउंड में चल रहा ऐप्लिकेशन जीत जाता है.
मीडिया CAS और CAS HAL को यहां दी गई सुविधाओं के साथ बेहतर बनाया गया है.
- यह अलग-अलग इस्तेमाल और एल्गोरिदम के लिए CAS सेशन खोलता है.
- डाइनैमिक सीएएस सिस्टम के साथ काम करता है. जैसे, सीआईसीएएम को हटाना और जोड़ना.
- यह मुख्य टोकन देकर, Tuner HAL के साथ इंटिग्रेट करता है.
MediaCodec और AudioTrack को नीचे दी गई सुविधाओं के साथ बेहतर बनाया गया है.
- यह सुरक्षित A/V मेमोरी को कॉन्टेंट इनपुट के तौर पर इस्तेमाल करता है.
- इसे टनल किए गए प्लेबैक में हार्डवेयर ए/वी सिंक करने के लिए कॉन्फ़िगर किया गया है.
ES_payloadऔर पासथ्रू मोड के लिए, कॉन्फ़िगर की गई सहायता.
दूसरी इमेज. ट्यूनर HAL में मौजूद कॉम्पोनेंट का डायग्राम
पूरा वर्कफ़्लो
नीचे दिए गए डायग्राम में, लाइव ब्रॉडकास्ट के प्लेबैक के लिए कॉल सीक्वेंस दिखाए गए हैं.
सेटअप
तीसरी इमेज. लाइव ब्रॉडकास्ट के प्लेबैक के लिए सेटअप का क्रम
ऑडियो/वीडियो को मैनेज करना
चौथी इमेज. लाइव ब्रॉडकास्ट चलाने के लिए, ऑडियो/वीडियो को मैनेज करना
स्क्रैंबल्ड कॉन्टेंट को मैनेज करना
पांचवीं इमेज. लाइव ब्रॉडकास्ट चलाने के लिए, गड़बड़ किए गए कॉन्टेंट को मैनेज करना
ऑडियो/वीडियो डेटा प्रोसेस करना
छठी इमेज. लाइव ब्रॉडकास्ट चलाने के लिए, ऑडियो/वीडियो को प्रोसेस किया जा रहा है
Tuner SDK API
Tuner SDK API, Tuner JNI, Tuner HAL, और TunerResourceManager के साथ इंटरैक्शन को मैनेज करता है. टीआईएस ऐप्लिकेशन, Tuner SDK API का इस्तेमाल करके, Tuner के संसाधनों और सब-कॉम्पोनेंट को ऐक्सेस करता है. जैसे, फ़िल्टर और डिसक्रैंबलर. फ़्रंटएंड और डेमक्स, इंटरनल कॉम्पोनेंट हैं.
सातवीं इमेज. 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.tunerandroid.media.tv.tuner.frontendandroid.media.tv.tuner.filterandroid.media.tv.tuner.dvr
आठवीं इमेज. Tuner SDK API पैकेज
Android.media.tv.tuner
ट्यूनर पैकेज, ट्यूनर फ़्रेमवर्क का इस्तेमाल करने के लिए एक एंट्री पॉइंट है. TIS ऐप्लिकेशन, पैकेज का इस्तेमाल करके संसाधन इंस्टेंस को शुरू करता है और उन्हें हासिल करता है. इसके लिए, वह शुरुआती सेटिंग और कॉलबैक तय करता है.
tuner():useCaseऔरsessionIdपैरामीटर तय करके, Tuner इंस्टेंस को शुरू करता है.tune(): यह फ़्रंटएंड रिसॉर्स को ऐक्सेस करता है औरFrontendSettingपैरामीटर की वैल्यू सेट करके, उसे ट्यून करता है.openFilter(): फ़िल्टर का टाइप तय करके, फ़िल्टर इंस्टेंस हासिल करता है.openDvrRecorder(): बफ़र का साइज़ तय करके, रिकॉर्डिंग का इंस्टेंस हासिल करता है.openDvrPlayback(): बफ़र का साइज़ तय करके, वीडियो चलाने का इंस्टेंस हासिल करता है.openDescrambler(): यह डिसक्रैंबलर इंस्टेंस को ऐक्सेस करता है.openLnb(): यह इंटरनल एलएनबी इंस्टेंस को ऐक्सेस करता है.openLnbByName(): यह फ़ंक्शन, बाहरी एलएनबी इंस्टेंस को ऐक्सेस करता है.openTimeFilter(): यह टाइम फ़िल्टर इंस्टेंस को ऐक्सेस करता है.
ट्यूनर पैकेज में ऐसी सुविधाएं मिलती हैं जो फ़िल्टर, डीवीआर, और फ़्रंटएंड पैकेज में शामिल नहीं हैं. इन सुविधाओं की सूची यहां दी गई है.
cancelTuningscan/cancelScanninggetAvSyncHwIdgetAvSyncTimeconnectCiCam1/disconnectCiCamshareFrontendFromTunerupdateResourcePrioritysetOnTuneEventListenersetResourceLostListener
Android.media.tv.tuner.frontend
फ़्रंटएंड पैकेज में, फ़्रंटएंड से जुड़ी सेटिंग, जानकारी, स्टेटस, इवेंट, और सुविधाएं शामिल होती हैं.
कक्षाएं
FrontendSettings को नीचे दी गई क्लास के हिसाब से, अलग-अलग डीटीवी स्टैंडर्ड के लिए बनाया गया है.
AnalogFrontendSettingsAtsc3FrontendSettingsAtscFrontendSettingsDvbcFrontendSettingsDvbsFrontendSettingsDvbtFrontendSettingsIsdbs3FrontendSettingsIsdbsFrontendSettingsIsdbtFrontendSettings
Android 12 और Tuner HAL 1.1 या इसके बाद के वर्शन पर, यह डीटीवी स्टैंडर्ड काम करता है.
DtmbFrontendSettings
FrontendCapabilities को नीचे दी गई क्लास के हिसाब से, अलग-अलग डीटीवी स्टैंडर्ड के लिए बनाया गया है.
AnalogFrontendCapabilitiesAtsc3FrontendCapabilitiesAtscFrontendCapabilitiesDvbcFrontendCapabilitiesDvbsFrontendCapabilitiesDvbtFrontendCapabilitiesIsdbs3FrontendCapabilitiesIsdbsFrontendCapabilitiesIsdbtFrontendCapabilities
Android 12 और Tuner HAL 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मैसेज की जानकारी देता है. - ज़रूरी जानकारी इकट्ठा करने के लिए, TIS
Frontend.getStatusका इस्तेमाल करता है. - 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 एक बार स्कैन करने के लिएFrontendSettingsका इस्तेमाल करता है औरENDभेजकर यह बताता है कि स्कैनिंग की प्रोसेस पूरी हो गई है.टीआईएस, ऊपर दी गई कार्रवाइयों को तब तक दोहराता है, जब तक फ़्रीक्वेंसी की सभी सेटिंग पूरी नहीं हो जातीं.
स्कैनिंग की प्रोसेस पूरी होने पर, HAL
ENDभेजता है.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.
जब तक सभी फ़्रीक्वेंसी खत्म नहीं हो जातीं, तब तक टीआईएस Tuner.scan(AUTO_SCAN) को फिर से कॉल करता है.
स्कैनिंग की प्रोसेस पूरी होने पर, HAL END रिपोर्ट करता है.
स्कैनिंग के दौरान, स्कैन को रोकने या खत्म करने के लिए, stopScan() या close() पर कॉल किया जा सकता है.
नौवीं इमेज. टीआईएस स्कैन का फ़्लो डायग्राम
Android.media.tv.tuner.filter
फ़िल्टर पैकेज, फ़िल्टर ऑपरेशन का कलेक्शन होता है. इसमें कॉन्फ़िगरेशन, सेटिंग, कॉलबैक, और इवेंट भी शामिल होते हैं. इस पैकेज में नीचे दिए गए ऑपरेशन शामिल हैं. ऑपरेशन की पूरी सूची देखने के लिए, Android का सोर्स कोड देखें.
configure()start()stop()flush()read()
पूरी सूची देखने के लिए, Android का सोर्स कोड देखें.
FilterConfiguration का हिसाब यहां दी गई क्लास के आधार पर लगाया जाता है. कॉन्फ़िगरेशन, मुख्य फ़िल्टर टाइप के लिए होते हैं. इनसे यह पता चलता है कि फ़िल्टर, डेटा निकालने के लिए किस प्रोटोकॉल का इस्तेमाल करता है.
AlpFilterConfigurationIpFilterConfigurationMmtpFilterConfigurationTlvFilterConfigurationTsFilterConfiguration
ये सेटिंग, नीचे दी गई क्लास से ली गई हैं. ये सेटिंग, फ़िल्टर के सबटाइप के लिए होती हैं. इनसे यह तय होता है कि फ़िल्टर किस तरह के डेटा को बाहर रख सकता है.
SectionSettingsAvSettingsPesSettingsRecordSettingsDownloadSettings
FilterEvent को नीचे दी गई क्लास से लिया गया है, ताकि अलग-अलग तरह के डेटा के लिए इवेंट रिपोर्ट किए जा सकें.
SectionEventMediaEventPesEventTsRecordEventMmtpRecordEventTemiEventDownloadEventIpPayloadEvent
Android 12 और Tuner HAL 1.1 या इसके बाद के वर्शन पर, ये इवेंट काम करते हैं.
IpCidChangeEventRestartEventScramblingStatusEvent
फ़िल्टर से इवेंट और डेटा फ़ॉर्मैट
| फ़िल्टर प्रकार | झंडे | इवेंट | डेटा ऑपरेशन | डेटा फ़ॉर्मैट |
|---|---|---|---|---|
TS.SECTIONMMTP.SECTIONIP.SECTIONTLV.SECTIONALP.SECTION |
isRaw: |
ज़रूरी है:DemuxFilterStatus::DATA_READYDemuxFilterStatus::DATA_OVERFLOWसुझाया गया: DemuxFilterStatus::LOW_WATERDemuxFilterStatus::HIGH_WATER |
इवेंट और इंटरनल शेड्यूल के हिसाब से, runFilter.read(buffer, offset, adjustedSize) एक या उससे ज़्यादा
बार.डेटा को HAL के MQ से क्लाइंट बफ़र में कॉपी किया जाता है. |
असेंबल किए गए एक सेशन पैकेज को दूसरे सेशन पैकेज से FMQ में भरा जाता है. |
isRaw: |
ज़रूरी है:DemuxFilterEvent::DemuxFilterSectionEvent[n]DemuxFilterStatus::DATA_READYDemuxFilterStatus::DATA_OVERFLOWज़रूरी नहीं है: DemuxFilterStatus::LOW_WATERDemuxFilterStatus::HIGH_WATER |
for i=0; i<n; i++डेटा को HAL के MQ से क्लाइंट बफ़र में कॉपी किया जाता है. |
||
TS.PES |
isRaw: |
ज़रूरी है:DemuxFilterStatus::DATA_READYDemuxFilterStatus::DATA_OVERFLOWसुझाया गया: DemuxFilterStatus::LOW_WATERDemuxFilterStatus::HIGH_WATER |
इवेंट और इंटरनल शेड्यूल के हिसाब से, runFilter.read(buffer, offset, adjustedSize) एक या उससे ज़्यादा
बार.डेटा को HAL के MQ से क्लाइंट बफ़र में कॉपी किया जाता है. |
असेंबल किए गए एक PES पैकेज को दूसरे PES पैकेज से FMQ में भरा जाता है. |
isRaw: |
ज़रूरी है:DemuxFilterEvent::DemuxFilterPesEvent[n]DemuxFilterStatus::DATA_READYDemuxFilterStatus::DATA_OVERFLOWज़रूरी नहीं है: DemuxFilterStatus::LOW_WATERDemuxFilterStatus::HIGH_WATER |
for i=0; i<n; i++डेटा को HAL के MQ से क्लाइंट बफ़र में कॉपी किया जाता है. |
||
MMTP.PES |
isRaw: |
ज़रूरी है:DemuxFilterStatus::DATA_READYDemuxFilterStatus::DATA_OVERFLOWसुझाया गया: DemuxFilterStatus::LOW_WATERDemuxFilterStatus::HIGH_WATER |
इवेंट और इंटरनल शेड्यूल के हिसाब से, runFilter.read(buffer, offset, adjustedSize) एक या उससे ज़्यादा
बार.डेटा को HAL के MQ से क्लाइंट बफ़र में कॉपी किया जाता है. |
असेंबल किए गए एक एमएफ़यू पैकेज को दूसरे एमएफ़यू पैकेज से एफएमक्यू में भरा जाता है. |
isRaw: |
ज़रूरी है:DemuxFilterEvent::DemuxFilterPesEvent[n]DemuxFilterStatus::DATA_READYDemuxFilterStatus::DATA_OVERFLOWज़रूरी नहीं है: DemuxFilterStatus::LOW_WATERDemuxFilterStatus::HIGH_WATER |
for i=0; i<n; i++डेटा को HAL के MQ से क्लाइंट बफ़र में कॉपी किया जाता है. |
||
TS.TS |
लागू नहीं | ज़रूरी है:DemuxFilterStatus::DATA_READYDemuxFilterStatus::DATA_OVERFLOWसुझाया गया: DemuxFilterStatus::LOW_WATERDemuxFilterStatus::HIGH_WATER |
इवेंट और इंटरनल शेड्यूल के हिसाब से, runFilter.read(buffer, offset, adjustedSize) एक या उससे ज़्यादा
बार.डेटा को HAL के MQ से क्लाइंट बफ़र में कॉपी किया जाता है. |
ts हेडरमें मौजूद ts को फ़िल्टर किया गया है
और FMQ में भरा गया है. |
TS.AudioTS.VideoMMTP.AudioMMTP.Video |
isPassthrough: |
ज़रूरी नहीं:DemuxFilterStatus::DATA_READYDemuxFilterStatus::DATA_OVERFLOW |
क्लाइंट को DemuxFilterStatus::DATA_READY मिलने के बाद, MediaCodec शुरू किया जा सकता है.क्लाइंट को DemuxFilterStatus::DATA_OVERFLOW मिलने के बाद, Filter.flush को कॉल करना होगा. |
लागू नहीं |
isPassthrough: |
ज़रूरी है:DemuxFilterEvent::DemuxFilterMediaEvent[n]DemuxFilterStatus::DATA_READYDemuxFilterStatus::DATA_OVERFLOWज़रूरी नहीं है: DemuxFilterStatus::LOW_WATERDemuxFilterStatus::HIGH_WATER |
MediaCodec का इस्तेमाल करने के लिए:for i=0; i<n; i++AudioTrack के डायरेक्ट ऑडियो का इस्तेमाल करने के लिए:for i=0; i<n; i++ |
ION मेमोरी में ES या आंशिक ES डेटा. | |
TS.PCRIP.NTPALP.PTP |
लागू नहीं | ज़रूरी है: लागू नहीं है
ज़रूरी नहीं है: लागू नहीं है |
लागू नहीं | लागू नहीं |
TS.RECORD |
लागू नहीं | ज़रूरी है: DemuxFilterEvent::DemuxFilterTsRecordEvent[n]RecordStatus::DATA_READYRecordStatus::DATA_OVERFLOWRecordStatus::LOW_WATERRecordStatus::HIGH_WATERज़रूरी नहीं है: DemuxFilterStatus::DATA_READYDemuxFilterStatus::DATA_OVERFLOWDemuxFilterStatus::LOW_WATERDemuxFilterStatus::HIGH_WATER |
इंडेक्स डेटा के लिए:for i=0; i<n; i++रिकॉर्ड किए गए कॉन्टेंट के लिए, RecordStatus::* और इंटरनल शेड्यूल के मुताबिक, इनमें से कोई एक काम करें:
|
इंडेक्स डेटा के लिए: इवेंट पेलोड में शामिल होता है. रिकॉर्ड किए गए कॉन्टेंट के लिए: FMQ में मक्स की गई टीएस स्ट्रीम. |
TS.TEMI |
लागू नहीं | ज़रूरी है:DemuxFilterEvent::DemuxFilterTemiEvent[n]ज़रूरी नहीं है: DemuxFilterStatus::DATA_READYDemuxFilterStatus::DATA_OVERFLOWDemuxFilterStatus::LOW_WATERDemuxFilterStatus::HIGH_WATER |
for i=0; i<n; i++ |
लागू नहीं |
MMTP.MMTP |
लागू नहीं | ज़रूरी है:DemuxFilterStatus::DATA_READYDemuxFilterStatus::DATA_OVERFLOWसुझाया गया: DemuxFilterStatus::LOW_WATERDemuxFilterStatus::HIGH_WATER |
इवेंट और इंटरनल शेड्यूल के हिसाब से, runFilter.read(buffer, offset, adjustedSize) एक या उससे ज़्यादा
बार.डेटा को HAL के MQ से क्लाइंट बफ़र में कॉपी किया जाता है. |
mmtp हेडरमें मौजूद mmtp को फ़िल्टर किया गया है
और FMQ में भरा गया है. |
MMTP.RECORD |
लागू नहीं | ज़रूरी है:DemuxFilterEvent::DemuxFilterMmtpRecordEvent[n]RecordStatus::DATA_READYRecordStatus::DATA_OVERFLOWRecordStatus::LOW_WATERRecordStatus::HIGH_WATERज़रूरी नहीं है: DemuxFilterStatus::DATA_READYDemuxFilterStatus::DATA_OVERFLOWDemuxFilterStatus::LOW_WATERDemuxFilterStatus::HIGH_WATER |
इंडेक्स डेटा के लिए: for i=0; i<n; i++रिकॉर्ड किए गए कॉन्टेंट के लिए, RecordStatus::* और इंटरनल शेड्यूल के मुताबिक, इनमें से कोई एक काम करें:
|
इंडेक्स डेटा के लिए: इवेंट पेलोड में शामिल होता है. रिकॉर्ड किए गए कॉन्टेंट के लिए: रिकॉर्ड की गई स्ट्रीम को FMQ में मक्स किया गया. अगर रिकॉर्डिंग के लिए फ़िल्टर सोर्स, पासथ्रू के साथ TLV.TLV से
IP.IP पर सेट है, तो रिकॉर्ड की गई स्ट्रीम में टीएलवी और आईपी हेडर होता है. |
MMTP.DOWNLOAD |
लागू नहीं | ज़रूरी है:DemuxFilterEvent::DemuxFilterDownloadEvent[n]DemuxFilterStatus::DATA_READYDemuxFilterStatus::DATA_OVERFLOWज़रूरी नहीं है: DemuxFilterStatus::LOW_WATERDemuxFilterStatus::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_READYDemuxFilterStatus::DATA_OVERFLOWज़रूरी नहीं है: DemuxFilterStatus::LOW_WATERDemuxFilterStatus::HIGH_WATER |
for i=0; i<n; i++
Filter.read(buffer, offset, DemuxFilterIpPayloadEvent[i].size)डेटा को HAL के MQ से क्लाइंट बफ़र में कॉपी किया जाता है. |
आईपी पेलोड पैकेज को दूसरे आईपी पेलोड पैकेज से FMQ में भरा जाता है. |
IP.IPTLV.TLVALP.ALP |
isPassthrough: |
ज़रूरी नहीं:DemuxFilterStatus::DATA_READYDemuxFilterStatus::DATA_OVERFLOW |
फ़िल्टर किए गए प्रोटोकॉल की सब-स्ट्रीम, फ़िल्टर चेन में अगले फ़िल्टर को फ़ीड करती है. | लागू नहीं |
isPassthrough: |
ज़रूरी है:DemuxFilterStatus::DATA_READYDemuxFilterStatus::DATA_OVERFLOWसुझाया गया: DemuxFilterStatus::LOW_WATERDemuxFilterStatus::HIGH_WATER |
इवेंट और इंटरनल शेड्यूल के हिसाब से, runFilter.read(buffer, offset, adjustedSize) एक या उससे ज़्यादा
बार.डेटा को HAL के MQ से क्लाइंट बफ़र में कॉपी किया जाता है. |
प्रोटोकॉल हेडर के साथ फ़िल्टर की गई प्रोटोकॉल सब स्ट्रीम में, FMQ की जानकारी भरी जाती है. | |
IP.PAYLOAD_THROUGHTLV.PAYLOAD_THROUGHALP.PAYLOAD_THROUGH |
लागू नहीं | ज़रूरी नहीं:DemuxFilterStatus::DATA_READYDemuxFilterStatus::DATA_OVERFLOW |
फ़िल्टर किए गए प्रोटोकॉल पेलोड, फ़िल्टर चेन में मौजूद अगले फ़िल्टर को फ़ीड करता है. | लागू नहीं |
पीएसआई/एसआई बनाने के लिए फ़िल्टर का इस्तेमाल करने का उदाहरण
दसवीं इमेज. पीएसआई/एसआई बनाने का फ़्लो
कोई फ़िल्टर खोलें.
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 का इस्तेमाल करने का उदाहरण
ग्यारहवीं इमेज. फ़िल्टर से MediaEvent का इस्तेमाल करने के लिए फ़्लो
- ऑडियो/वीडियो फ़िल्टर खोलें, उन्हें कॉन्फ़िगर करें, और उनका इस्तेमाल शुरू करें.
MediaEventको प्रोसेस करें.MediaEventपाएं.- लीनियर ब्लॉक को
codecपर कतार में लगाएं. - डेटा का इस्तेमाल हो जाने के बाद, A/V हैंडल को रिलीज़ करें.
Android.media.tv.tuner.dvr
DvrRecorder, रिकॉर्डिंग के लिए ये तरीके उपलब्ध कराता है.
configureattachFilterdetachFilterstartflushstopsetFileDescriptorwrite
DvrPlayback, मीडिया चलाने के लिए ये तरीके उपलब्ध कराता है.
configurestartflushstopsetFileDescriptorread
DvrSettings का इस्तेमाल DvrRecorder और DvrPlayback को कॉन्फ़िगर करने के लिए किया जाता है.
OnPlaybackStatusChangedListener और OnRecordStatusChangedListener का इस्तेमाल, डीवीआर इंस्टेंस की स्थिति की जानकारी देने के लिए किया जाता है.
रिकॉर्ड शुरू करने के फ़्लो का उदाहरण
बारहवीं इमेज. रिकॉर्ड शुरू करने का फ़्लो
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 को लागू करने के लिए इस इंटरफ़ेस का इस्तेमाल करते हैं. साथ ही, फ़्रेमवर्क इसका इस्तेमाल, 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.halIFrontendCallback.hal |
IDemux |
close |
setFrontendDataSource, openFilter, openDvr, getAvSyncHwId,
getAvSyncTime, connect / disconnectCiCam |
IDemux.hal |
IDvr |
close, start, stop, configure |
attach/detachFilters, flush, getQueueDesc |
IDvr.halIDvrCallback.hal |
IFilter |
close, start, stop, configure, getId |
flush, getQueueDesc, releaseAvHandle, setDataSource |
IFilter.halIFilterCallback.hal |
ILnb |
close, setCallback |
setVoltage, setTone, setSatellitePosition, sendDiseqcMessage |
ILnb.halILnbCallback.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
Tuner Resource Manager (टीआरएम) से पहले, दो ऐप्लिकेशन के बीच स्विच करने के लिए, एक ही ट्यूनर हार्डवेयर की ज़रूरत होती थी. टीवी इनपुट फ़्रेमवर्क (टीआईएफ़) में "पहले आओ, पहले पाओ" सिद्धांत का इस्तेमाल किया जाता है. इसका मतलब है कि जिस ऐप्लिकेशन को संसाधन पहले मिलता है वह उसे अपने पास रखता है. हालांकि, कुछ मुश्किल मामलों में यह तरीका सही नहीं हो सकता.
टीआरएम, सिस्टम सेवा के तौर पर काम करता है. यह ऐप्लिकेशन के लिए, ट्यूनर, TVInput, और सीएएस हार्डवेयर संसाधनों को मैनेज करता है. टीआरएम, "फ़ोरग्राउंड विन" मेकेनिज़्म का इस्तेमाल करता है. यह ऐप्लिकेशन के फ़ोरग्राउंड या बैकग्राउंड स्टेटस और इस्तेमाल के उदाहरण के टाइप के आधार पर, ऐप्लिकेशन की प्राथमिकता का हिसाब लगाता है. टीआरएम, प्राथमिकता के आधार पर संसाधन को अनुमति देता है या उसे रद्द करता है. टीआरएम, ब्रॉडकास्ट, ओटीटी, और डीवीआर के लिए एटीवी रिसॉर्स मैनेजमेंट को एक जगह पर मैनेज करता है.
टीआरएम इंटरफ़ेस
TRM, ITunerResourceManager.aidl में AIDL इंटरफ़ेस दिखाता है, ताकि Tuner
framework, MediaCas, और TvInputHardwareManager संसाधनों को रजिस्टर, अनुरोध, या रिलीज़ कर सकें.
क्लाइंट मैनेजमेंट के लिए इंटरफ़ेस यहां दिए गए हैं.
registerClientProfile(in ResourceClientProfile profile, IResourcesReclaimListener listener, out int[] clientId)unregisterClientProfile(in int clientId)
संसाधनों का अनुरोध करने और उन्हें रिलीज़ करने के लिए, यहां इंटरफ़ेस दिए गए हैं.
requestFrontend(TunerFrontendRequest request, int[] frontendHandle)/releaseFrontendrequestDemux(TunerDemuxRequest request, int[] demuxHandle)/releaseDemuxrequestDescrambler(TunerDescramblerRequest request, int[] descramblerHandle)/releaseDescramblerrequestCasSession(CasSessionRequest request, int[] casSessionHandle)/releaseCasSessionrequestLnb(TunerLnbRequest request, int[] lnbHandle)/releaseLnb
क्लाइंट और अनुरोध क्लास की जानकारी यहां दी गई है.
ResourceClientProfileResourcesReclaimListenerTunerFrontendRequestTunerDemuxRequestTunerDescramblerRequestCasSessionRequestTunerLnbRequest
क्लाइंट की प्राथमिकता
टीआरएम, क्लाइंट की प्राथमिकता का हिसाब लगाता है. इसके लिए, वह क्लाइंट की प्रोफ़ाइल से मिले पैरामीटर और कॉन्फ़िगरेशन फ़ाइल से मिली प्राथमिकता की वैल्यू का इस्तेमाल करता है. प्राथमिकता को क्लाइंट से मिली किसी भी प्राथमिकता वैल्यू के हिसाब से भी अपडेट किया जा सकता है.
क्लाइंट की प्रोफ़ाइल में मौजूद पैरामीटर
टीआरएम, 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वीं इमेज. ट्यूनर संसाधनों के बीच टकराव होने पर, उन्हें वापस पाने के तरीके का डायग्राम