एंड्रॉइड 11 या उच्चतर के लिए, आप ए/वी सामग्री वितरित करने के लिए एंड्रॉइड ट्यूनर फ्रेमवर्क का उपयोग कर सकते हैं। फ्रेमवर्क विक्रेताओं से हार्डवेयर पाइपलाइन का उपयोग करता है, जो इसे लो-एंड और हाई-एंड एसओसी दोनों के लिए उपयुक्त बनाता है। फ्रेमवर्क एक विश्वसनीय निष्पादन वातावरण (टीईई) और सुरक्षित मीडिया पथ (एसएमपी) द्वारा संरक्षित ए/वी सामग्री वितरित करने का एक सुरक्षित तरीका प्रदान करता है, जिससे इसे अत्यधिक प्रतिबंधित, सामग्री सुरक्षा वातावरण में उपयोग करने की अनुमति मिलती है।
ट्यूनर और एंड्रॉइड CAS के बीच मानकीकृत इंटरफ़ेस के परिणामस्वरूप ट्यूनर विक्रेताओं और CAS विक्रेताओं के बीच तेजी से एकीकरण होता है। ट्यूनर इंटरफ़ेस एंड्रॉइड टीवी के लिए एक विश्व समाधान बनाने के लिए MediaCodec
और AudioTrack
के साथ काम करता है। ट्यूनर इंटरफ़ेस प्रमुख प्रसारण मानकों के आधार पर डिजिटल टीवी और एनालॉग टीवी दोनों का समर्थन करता है।
अवयव
एंड्रॉइड 11 के लिए, तीन घटक विशेष रूप से टीवी प्लेटफॉर्म के लिए डिज़ाइन किए गए हैं।
- ट्यूनर एचएएल: फ्रेमवर्क और विक्रेताओं के बीच एक इंटरफ़ेस
- ट्यूनर एसडीके एपीआई: फ्रेमवर्क और ऐप्स के बीच एक इंटरफ़ेस
- ट्यूनर संसाधन प्रबंधक (टीआरएम): ट्यूनर एचडब्ल्यू संसाधनों का समन्वय करता है
Android 11 के लिए, निम्नलिखित घटकों को बढ़ाया गया है।
- कैस V2
-
TvInputService
या टीवी इनपुट सेवा (टीआईएस) -
TvInputManagerService
या टीवी इनपुट मैनेजर सेवा (TIMS) -
MediaCodec
या मीडिया कोडेक -
AudioTrack
या ऑडियो ट्रैक -
MediaResourceManager
या मीडिया संसाधन प्रबंधक (MRM)
चित्र 1. एंड्रॉइड टीवी घटकों के बीच इंटरैक्शन
विशेषताएँ
फ़्रंटएंड नीचे दिए गए DTV मानकों का समर्थन करता है।
- एटीएससी
- एटीएससी3
- डीवीबी सी/एस/टी
- आईएसडीबी एस/एस3/टी
- अनुरूप
ट्यूनर एचएएल 1.1 या उच्चतर के साथ एंड्रॉइड 12 में फ्रंटएंड नीचे दिए गए डीटीवी मानक का समर्थन करता है।
- डीटीएमबी
डिमक्स नीचे दिए गए स्ट्रीम प्रोटोकॉल का समर्थन करता है।
- परिवहन धारा (टीएस)
- एमपीईजी मीडिया ट्रांसपोर्ट प्रोटोकॉल (एमएमटीपी)
- इंटरनेट प्रोटोकॉल (आईपी)
- लंबाई मान टाइप करें (टीएलवी)
- एटीएससी लिंक-लेयर प्रोटोकॉल (एएलपी)
डिस्क्रैम्बलर नीचे दी गई सामग्री सुरक्षा का समर्थन करता है।
- सुरक्षित मीडिया पथ
- मीडिया पथ साफ़ करें
- स्थानीय रिकॉर्ड सुरक्षित करें
- सुरक्षित स्थानीय प्लेबैक
ट्यूनर एपीआई नीचे दिए गए उपयोग के मामलों का समर्थन करते हैं।
- स्कैन
- रहना
- प्लेबैक
- अभिलेख
ट्यूनर, MediaCodec
और AudioTrack
नीचे दिए गए डेटा प्रवाह मोड का समर्थन करते हैं।
- स्पष्ट मेमोरी बफ़र के साथ ईएस पेलोड
- सुरक्षित मेमोरी हैंडल के साथ ईएस पेलोड
- निकासी
समग्र डिज़ाइन
ट्यूनर एचएएल को एंड्रॉइड फ्रेमवर्क और विक्रेता के हार्डवेयर के बीच परिभाषित किया गया है।
- वर्णन करता है कि फ़्रेमवर्क विक्रेता से क्या अपेक्षा करता है और विक्रेता इसे कैसे कर सकता है।
-
IFrontend
,IDemux
,IDescrambler
,IFilter
,IDvr
, औरILnb
इंटरफेस के माध्यम से फ्रंटएंड, डिमक्स और डिस्क्रैम्बलर की कार्यक्षमता को फ्रेमवर्क में निर्यात करता है। - ट्यूनर एचएएल को
MediaCodec
औरAudioTrack
जैसे अन्य फ्रेमवर्क घटकों के साथ एकीकृत करने के कार्य शामिल हैं।
एक ट्यूनर जावा क्लास और नेटिव क्लास बनाई जाती है।
- ट्यूनर जावा एपीआई ऐप्स को सार्वजनिक एपीआई के माध्यम से ट्यूनर एचएएल तक पहुंचने की अनुमति देता है।
- नेटिव क्लास ट्यूनर एचएएल के साथ बड़ी मात्रा में रिकॉर्डिंग या प्लेबैक डेटा की अनुमति नियंत्रण और प्रबंधन की अनुमति देता है।
- नेटिव ट्यूनर मॉड्यूल ट्यूनर जावा क्लास और ट्यूनर एचएएल के बीच एक सेतु है।
एक टीआरएम वर्ग बनाया गया है।
- सीमित ट्यूनर संसाधनों, जैसे फ्रंटएंड, एलएनबी, सीएएस सत्र और टीवी इनपुट एचएएल से एक टीवी इनपुट डिवाइस का प्रबंधन करता है।
- ऐप्स से अपर्याप्त संसाधनों को पुनः प्राप्त करने के लिए नियम लागू करता है। डिफ़ॉल्ट नियम अग्रभूमि जीत है।
मीडिया CAS और CAS HAL को नीचे दी गई सुविधाओं के साथ बढ़ाया गया है।
- विभिन्न उपयोगों और एल्गोरिदम के लिए CAS सत्र खोलता है।
- CICAM हटाने और सम्मिलन जैसे गतिशील CAS सिस्टम का समर्थन करता है।
- कुंजी टोकन प्रदान करके ट्यूनर एचएएल के साथ एकीकृत होता है।
MediaCodec
और AudioTrack
नीचे दी गई सुविधाओं के साथ बढ़ाया गया है।
- सामग्री इनपुट के रूप में सुरक्षित ए/वी मेमोरी लेता है।
- टनल प्लेबैक में हार्डवेयर ए/वी सिंक करने के लिए कॉन्फ़िगर किया गया।
-
ES_payload
और पासथ्रू मोड के लिए कॉन्फ़िगर किया गया समर्थन।
चित्र 2. ट्यूनर एचएएल के भीतर घटकों का आरेख
समग्र कार्यप्रवाह
नीचे दिए गए चित्र लाइव प्रसारण प्लेबैक के लिए कॉल अनुक्रमों को दर्शाते हैं।
स्थापित करना
चित्र 3. लाइव प्रसारण प्लेबैक के लिए सेटअप अनुक्रम
ए/वी को संभालना
चित्र 4. लाइव प्रसारण प्लेबैक के लिए ए/वी को संभालना
उलझी हुई सामग्री को संभालना
चित्र 5. लाइव प्रसारण प्लेबैक के लिए क्रमबद्ध सामग्री को संभालना
ए/वी डेटा संसाधित करना
चित्र 6. लाइव प्रसारण प्लेबैक के लिए ए/वी प्रसंस्करण
ट्यूनर एसडीके एपीआई
ट्यूनर एसडीके एपीआई ट्यूनर जेएनआई, ट्यूनर एचएएल और TunerResourceManager
के साथ इंटरैक्शन को संभालता है। टीआईएस ऐप ट्यूनर संसाधनों और फ़िल्टर और डिस्क्रैम्बलर जैसे उप-घटकों तक पहुंचने के लिए ट्यूनर एसडीके एपीआई का उपयोग करता है। फ्रंटएंड और डिमक्स आंतरिक घटक हैं।
चित्र 7. ट्यूनर एसडीके एपीआई के साथ इंटरैक्शन
संस्करणों
एंड्रॉइड 12 से, ट्यूनर एसडीके एपीआई ट्यूनर एचएएल 1.1 में नई सुविधा का समर्थन करता है, जो ट्यूनर 1.0 का बैकवर्ड-संगत संस्करण अपग्रेड है।
चल रहे एचएएल संस्करण की जांच के लिए निम्नलिखित एपीआई का उपयोग करें।
-
android.media.tv.tuner.TunerVersionChecker.getTunerVersion()
न्यूनतम आवश्यक HAL संस्करण नए Android 12 API के दस्तावेज़ में पाया जा सकता है।
संकुल
ट्यूनर एसडीके एपीआई नीचे चार पैकेज प्रदान करता है।
-
android.media.tv.tuner
-
android.media.tv.tuner.frontend
-
android.media.tv.tuner.filter
-
android.media.tv.tuner.dvr
चित्र 8. ट्यूनर एसडीके एपीआई पैकेज
Android.media.tv.tuner
ट्यूनर पैकेज ट्यूनर ढांचे का उपयोग करने के लिए एक प्रवेश बिंदु है। टीआईएस ऐप प्रारंभिक सेटिंग और कॉलबैक को निर्दिष्ट करके संसाधन उदाहरणों को आरंभ करने और प्राप्त करने के लिए पैकेज का उपयोग करता है।
-
tuner()
:useCase
औरsessionId
पैरामीटर निर्दिष्ट करके ट्यूनर इंस्टेंस को प्रारंभ करता है। -
tune()
:FrontendSetting
पैरामीटर निर्दिष्ट करके फ्रंटएंड संसाधन और ट्यून प्राप्त करता है। -
openFilter()
: फ़िल्टर प्रकार निर्दिष्ट करके फ़िल्टर इंस्टेंस प्राप्त करता है। -
openDvrRecorder()
: बफ़र आकार निर्दिष्ट करके एक रिकॉर्डिंग इंस्टेंस प्राप्त करता है। -
openDvrPlayback()
: बफ़र आकार निर्दिष्ट करके प्लेबैक इंस्टेंस प्राप्त करता है। -
openDescrambler()
: एक डिस्क्रैम्बलर इंस्टेंस प्राप्त करता है। -
openLnb()
: एक आंतरिक LNB उदाहरण प्राप्त करता है। -
openLnbByName()
: एक बाहरी LNB उदाहरण प्राप्त करता है। -
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
ट्यूनर एचएएल 1.1 या उच्चतर के साथ एंड्रॉइड 12 से, निम्नलिखित डीटीवी मानक समर्थित है।
-
DtmbFrontendSettings
FrontendCapabilities
नीचे दी गई कक्षाओं द्वारा विभिन्न डीटीवी मानकों के लिए प्राप्त किया गया है।
-
AnalogFrontendCapabilities
-
Atsc3FrontendCapabilities
-
AtscFrontendCapabilities
-
DvbcFrontendCapabilities
-
DvbsFrontendCapabilities
-
DvbtFrontendCapabilities
-
Isdbs3FrontendCapabilities
-
IsdbsFrontendCapabilities
-
IsdbtFrontendCapabilities
ट्यूनर एचएएल 1.1 या उच्चतर के साथ एंड्रॉइड 12 से, निम्नलिखित डीटीवी मानक समर्थित है।
-
DtmbFrontendCapabilities
FrontendInfo
फ्रंटएंड की जानकारी पुनः प्राप्त करता है। FrontendStatus
फ्रंटएंड की वर्तमान स्थिति को पुनः प्राप्त करता है। OnTuneEventListener
फ्रंटएंड पर होने वाली घटनाओं को सुनता है। टीआईएस ऐप फ्रंटएंड से स्कैन संदेशों को संसाधित करने के लिए ScanCallback
उपयोग करता है।
चैनल स्कैन
टीवी सेट करने के लिए, ऐप संभावित आवृत्तियों को स्कैन करता है और उपयोगकर्ताओं की पहुंच के लिए एक चैनल लाइनअप बनाता है। चैनल स्कैनिंग को पूरा करने के लिए TIS Tuner.tune
, Tuner.scan(BLIND_SCAN)
या Tuner.scan(AUTO_SCAN)
उपयोग कर सकता है।
यदि टीआईएस के पास सिग्नल के लिए सटीक डिलीवरी जानकारी है, जैसे आवृत्ति, मानक (उदाहरण के लिए, टी/टी2, एस/एस2), और अतिरिक्त आवश्यक जानकारी (उदाहरण के लिए, पीएलडी आईडी), तो Tuner.tune
तेज़ विकल्प के रूप में अनुशंसित किया जाता है। .
जब उपयोगकर्ता Tuner.tune
कॉल करता है, तो निम्नलिखित क्रियाएं होती हैं:
- TIS
Tuner.tune
उपयोग करकेFrontendSettings
आवश्यक जानकारी से भर देता है। - यदि सिग्नल लॉक है तो एचएएल रिपोर्ट
LOCKED
संदेशों को ट्यून करता है। - टीआईएस आवश्यक जानकारी एकत्र करने के लिए
Frontend.getStatus
का उपयोग करता है। - TIS अपनी आवृत्ति सूची में अगली उपलब्ध आवृत्ति पर चला जाता है।
TIS सभी आवृत्तियों के समाप्त होने तक Tuner.tune
फिर से कॉल करता है।
ट्यूनिंग के दौरान, आप Tuner.tune
कॉल को रोकने या समाप्त करने के लिए stopTune()
या close()
पर कॉल कर सकते हैं।
ट्यूनर.स्कैन(ऑटो_स्कैन)
यदि TIS के पास Tuner.tune
का उपयोग करने के लिए पर्याप्त जानकारी नहीं है, लेकिन उसके पास आवृत्ति सूची और मानक प्रकार (उदाहरण के लिए, DVB T/C/S) है, तो Tuner.scan(AUTO_SCAN)
की अनुशंसा की जाती है।
जब उपयोगकर्ता Tuner.scan(AUTO_SCAN)
कॉल करता है, तो निम्नलिखित क्रियाएं होती हैं:
TIS फ़्रीक्वेंसी से भरी
FrontendSettings
के साथTuner.scan(AUTO_SCAN)
का उपयोग करता है।यदि सिग्नल लॉक है तो एचएएल रिपोर्ट
LOCKED
संदेशों को स्कैन करती है। एचएएल सिग्नल के बारे में अतिरिक्त जानकारी प्रदान करने के लिए अन्य स्कैन संदेशों की भी रिपोर्ट कर सकता है।टीआईएस आवश्यक जानकारी एकत्र करने के लिए
Frontend.getStatus
का उपयोग करता है।TIS उसी आवृत्ति पर अगली सेटिंग जारी रखने के लिए HAL के लिए
Tuner.scan
कॉल करता है। यदिFrontendSettings
संरचना खाली है, तो एचएएल अगली उपलब्ध सेटिंग का उपयोग करता है। अन्यथा, एचएएल एक बार के स्कैन के लिएFrontendSettings
उपयोग करता है और यह इंगित करने के लिएEND
भेजता है कि स्कैन ऑपरेशन समाप्त हो गया है।TIS उपरोक्त क्रियाओं को तब तक दोहराता है जब तक कि आवृत्ति पर सभी सेटिंग्स समाप्त न हो जाएँ।
एचएएल यह इंगित करने के लिए
END
भेजता है कि स्कैन ऑपरेशन समाप्त हो गया है।TIS अपनी आवृत्ति सूची में अगली उपलब्ध आवृत्ति पर चला जाता है।
TIS सभी आवृत्तियों के समाप्त होने तक Tuner.scan(AUTO_SCAN)
फिर से कॉल करता है।
स्कैनिंग के दौरान, आप स्कैन को रोकने या समाप्त करने के लिए stopScan()
या close()
कॉल कर सकते हैं।
ट्यूनर.स्कैन(BLIND_SCAN)
यदि TIS के पास आवृत्ति सूची नहीं है और विक्रेता HAL फ्रंटएंड संसाधन प्राप्त करने के लिए उपयोगकर्ता द्वारा निर्दिष्ट फ्रंटएंड की आवृत्ति की खोज कर सकता है, तो Tuner.scan(BLIND_SCAN)
की अनुशंसा की जाती है।
- TIS
Tuner.scan(BLIND_SCAN)
का उपयोग करता है। प्रारंभ आवृत्ति के लिएFrontendSettings
में एक आवृत्ति निर्दिष्ट की जा सकती है, लेकिन टीआईएसFrontendSettings
में अन्य सेटिंग्स को अनदेखा कर देता है। - यदि सिग्नल लॉक है तो एचएएल स्कैन
LOCKED
संदेश की रिपोर्ट करता है। - टीआईएस आवश्यक जानकारी एकत्र करने के लिए
Frontend.getStatus
का उपयोग करता है। - TIS स्कैनिंग जारी रखने के लिए
Tuner.scan
फिर से कॉल करता है। (FrontendSettings
नजरअंदाज कर दिया गया है।) - TIS उपरोक्त क्रियाओं को तब तक दोहराता है जब तक कि आवृत्ति पर सभी सेटिंग्स समाप्त न हो जाएँ। एचएएल टीआईएस की ओर से किसी भी कार्रवाई की आवश्यकता के बिना आवृत्ति बढ़ाता है। एचएएल
PROGRESS
रिपोर्ट करता है।
TIS सभी आवृत्तियों के समाप्त होने तक Tuner.scan(AUTO_SCAN)
फिर से कॉल करता है। एचएएल यह इंगित करने के लिए END
रिपोर्ट करता है कि स्कैन ऑपरेशन समाप्त हो गया है।
स्कैनिंग के दौरान, आप स्कैन को रोकने या समाप्त करने के लिए stopScan()
या close()
कॉल कर सकते हैं।
चित्र 9. टीआईएस स्कैन का प्रवाह आरेख
Android.media.tv.tuner.filter
फ़िल्टर पैकेज कॉन्फ़िगरेशन, सेटिंग्स, कॉलबैक और ईवेंट के साथ फ़िल्टर संचालन का एक संग्रह है। पैकेज में नीचे दिए गए ऑपरेशन शामिल हैं। संचालन की पूरी सूची के लिए एंड्रॉइड स्रोत कोड देखें।
-
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
एंड्रॉइड 12 से ट्यूनर एचएएल 1.1 या उच्चतर के साथ, निम्नलिखित इवेंट समर्थित हैं।
-
IpCidChangeEvent
-
RestartEvent
-
ScramblingStatusEvent
फ़िल्टर से घटनाएँ और डेटा प्रारूप
फ़िल्टर प्रकार | झंडे | आयोजन | डेटा ऑपरेशन | डेटा स्वरूप |
---|---|---|---|---|
TS.SECTION MMTP.SECTION IP.SECTION TLV.SECTION ALP.SECTION | isRaw: | अनिवार्य:DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW अनुशंसित: DemuxFilterStatus::LOW_WATER DemuxFilterStatus::HIGH_WATER | इवेंट और आंतरिक शेड्यूल के अनुसार चलाएंFilter.read(buffer, offset, adjustedSize) एक या अधिक बार।डेटा को 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 से क्लाइंट बफ़र में कॉपी किया जाता है। | एक असेंबल किया गया PES पैकेज दूसरे PES पैकेज द्वारा FMQ में भरा जाता है। |
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++ डेटा को HAL के MQ से क्लाइंट बफ़र में कॉपी किया जाता है। | ||
TS.TS | एन/ए | अनिवार्य:DemuxFilterStatus::DATA_READY DemuxFilterStatus::DATA_OVERFLOW अनुशंसित: DemuxFilterStatus::LOW_WATER DemuxFilterStatus::HIGH_WATER | इवेंट और आंतरिक शेड्यूल के अनुसार चलाएंFilter.read(buffer, offset, adjustedSize) एक या अधिक बार।डेटा को HAL के MQ से क्लाइंट बफ़र में कॉपी किया जाता है। | ts ts हेडर से फ़िल्टर किया गयाएफएमक्यू में भरा गया है। |
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) एक या अधिक बार।डेटा को HAL के MQ से क्लाइंट बफ़र में कॉपी किया जाता है। | 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::* और आंतरिक शेड्यूल के अनुसार, निम्न में से एक कार्य करें:
| इंडेक्स डेटा के लिए: इवेंट पेलोड में ले जाया गया। रिकॉर्ड की गई सामग्री के लिए: FMQ में भरी हुई मक्स्ड रिकॉर्डेड स्ट्रीम। यदि रिकॉर्डिंग के लिए फ़िल्टर स्रोत पासथ्रू के साथ TLV.TLV से IP.IP है, तो रिकॉर्ड की गई स्ट्रीम में TLV और 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: | वैकल्पिक: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 से क्लाइंट बफ़र में कॉपी किया जाता है। | प्रोटोकॉल हेडर के साथ फ़िल्टर किया गया प्रोटोकॉल सब स्ट्रीम FMQ में भरा जाता है। | |
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
पर पंक्तिबद्ध करें। - जब डेटा का उपभोग हो जाए तो ए/वी हैंडल को छोड़ दें।
Android.media.tv.tuner.dvr
DvrRecorder
रिकॉर्डिंग के लिए ये तरीके प्रदान करता है।
-
configure
-
attachFilter
-
detachFilter
-
start
-
flush
-
stop
-
setFileDescriptor
-
write
DvrPlayback
प्लेबैक के लिए ये विधियाँ प्रदान करता है।
-
configure
-
start
-
flush
-
stop
-
setFileDescriptor
-
read
DvrSettings
का उपयोग DvrRecorder
और DvrPlayback
कॉन्फ़िगर करने के लिए किया जाता है। OnPlaybackStatusChangedListener
और OnRecordStatusChangedListener
का उपयोग DVR इंस्टेंस की स्थिति रिपोर्ट करने के लिए किया जाता है।
रिकॉर्ड प्रारंभ करने के लिए उदाहरण प्रवाह
चित्र 12. रिकॉर्ड शुरू करने के लिए प्रवाह
DvrRecorder
खोलें, कॉन्फ़िगर करें और प्रारंभ करें।DvrRecorder recorder = openDvrRecorder(/* bufferSize */ 1000, executor, listener); DvrSettings dvrSettings = DvrSettings .builder() .setDataFormat(DvrSettings.DATA_FORMAT_TS) .setLowThreshold(100) .setHighThreshold(900) .setPacketSize(188) .build(); recorder.configure(dvrSettings); recorder.attachFilter(filter); recorder.setFileDescriptor(fd); recorder.start();
RecordEvent
प्राप्त करें और सूचकांक जानकारी पुनः प्राप्त करें।FilterCallback filterCallback = new FilterCallback() { @Override public void onFilterEvent(Filter filter, FilterEvent[] events) { for (FilterEvent event : events) { if (event instanceof TsRecordEvent) { TsRecordEvent recordEvent = (TsRecordEvent) event; int tsMask = recordEvent.getTsIndexMask(); int scMask = recordEvent.getScIndexMask(); int packetId = recordEvent.getPacketId(); long dataLength = recordEvent.getDataLength(); // handle the masks etc. } } } };
OnRecordStatusChangedListener
को प्रारंभ करें और रिकॉर्ड डेटा संग्रहीत करें।OnRecordStatusChangedListener listener = new OnRecordStatusChangedListener() { @Override public void onRecordStatusChanged(int status) { // a customized way to consume data efficiently by using status as a hint. if (status == Filter.STATUS_DATA_READY) { recorder.write(size); } } };
ट्यूनर एचएएल
ट्यूनर एचएएल एचआईडीएल का अनुसरण करता है और फ्रेमवर्क और विक्रेता हार्डवेयर के बीच इंटरफेस को परिभाषित करता है। विक्रेता ट्यूनर एचएएल को लागू करने के लिए इंटरफ़ेस का उपयोग करते हैं और फ्रेमवर्क ट्यूनर एचएएल कार्यान्वयन के साथ संचार करने के लिए इसका उपयोग करता है।
मॉड्यूल
ट्यूनर एचएएल 1.0
मॉड्यूल | बुनियादी नियंत्रण | मॉड्यूल-विशिष्ट नियंत्रण | एचएएल फ़ाइलें |
---|---|---|---|
ITuner | एन/ए | frontend(open, getIds, getInfo) , openDemux , openDescrambler , openLnb , getDemuxCaps | ITuner.hal |
IFrontend | setCallback , getStatus , close | tune , stopTune , scan , stopScan , setLnb | IFrontend.hal IFrontendCallback.hal |
IDemux | close | setFrontendDataSource , openFilter , openDvr , getAvSyncHwId , getAvSyncTime , connect / disconnectCiCam | IDemux.hal |
IDvr | close , start , stop , configure | attach/detachFilters , flush , getQueueDesc | IDvr.hal IDvrCallback.hal |
IFilter | close , start , stop , configure , getId | flush , getQueueDesc , releaseAvHandle , setDataSource | IFilter.hal IFilterCallback.hal |
ILnb | close , setCallback | setVoltage , setTone , setSatellitePosition , sendDiseqcMessage | ILnb.hal ILnbCallback.hal |
IDescrambler | close | setDemuxSource , setKeyToken , addPid , removePid | IDescrambler.hal |
ट्यूनर एचएएल 1.1 (ट्यूनर एचएएल 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 |
चित्र 13. ट्यूनर एचएएल मॉड्यूल के बीच इंटरैक्शन का आरेख
फ़िल्टर लिंकेज
ट्यूनर एचएएल फ़िल्टर लिंकेज का समर्थन करता है जैसे कि फ़िल्टर को कई परतों के लिए अन्य फ़िल्टर से जोड़ा जा सकता है। फ़िल्टर नीचे दिए गए नियमों का पालन करते हैं।
- फ़िल्टर एक पेड़ के रूप में जुड़े हुए हैं, करीबी पथ की अनुमति नहीं है।
- रूट नोड डिमक्स है।
- फ़िल्टर स्वतंत्र रूप से कार्य करते हैं.
- सभी फ़िल्टर को डेटा मिलना प्रारंभ हो जाता है.
- फ़िल्टर लिंकेज अंतिम फ़िल्टर पर फ्लश हो जाता है।
नीचे दिया गया कोड ब्लॉक और चित्र 14 कई परतों को फ़िल्टर करने का एक उदाहरण दिखाता है।
demuxCaps = ITuner.getDemuxCap;
If (demuxCaps[IP][MMTP] == true) {
ipFilter = ITuner.openFilter(<IP, ..>)
mmtpFilter1 = ITuner.openFilter(<MMTP ..>)
mmtpFilter2 = ITuner.openFilter(<MMTP ..>)
mmtpFilter1.setDataSource(<ipFilter>)
mmtpFilter2.setDataSource(<ipFilter>)
}
चित्र 14. कई परतों के लिए फ़िल्टर लिंकेज का प्रवाह आरेख
ट्यूनर संसाधन प्रबंधक
ट्यूनर रिसोर्स मैनेजर (टीआरएम) से पहले, दो ऐप्स के बीच स्विच करने के लिए समान ट्यूनर हार्डवेयर की आवश्यकता होती थी। टीवी इनपुट फ्रेमवर्क (टीआईएफ) ने "पहले-से-अधिग्रहण जीत" तंत्र का उपयोग किया, जिसका अर्थ है कि जो भी ऐप पहले संसाधन प्राप्त करता है वह संसाधन रखता है। हालाँकि, यह तंत्र कुछ जटिल उपयोग मामलों के लिए आदर्श नहीं हो सकता है।
टीआरएम ऐप्स के लिए ट्यूनर, TVInput
और सीएएस हार्डवेयर संसाधनों को प्रबंधित करने के लिए एक सिस्टम सेवा के रूप में चलता है। टीआरएम एक "फोरग्राउंड विन" तंत्र का उपयोग करता है, जो ऐप की अग्रभूमि या पृष्ठभूमि स्थिति और उपयोग केस प्रकार के आधार पर ऐप की प्राथमिकता की गणना करता है। टीआरएम प्राथमिकता के आधार पर संसाधन को अनुदान देता है या रद्द करता है। टीआरएम प्रसारण, ओटीटी और डीवीआर के लिए एटीवी संसाधन प्रबंधन को केंद्रीकृत करता है।
टीआरएम इंटरफ़ेस
TRM ट्यूनर फ्रेमवर्क, MediaCas
और TvInputHardwareManager
के लिए ITunerResourceManager.aidl
में AIDL इंटरफेस को संसाधनों को पंजीकृत करने, अनुरोध करने या जारी करने के लिए उजागर करता है।
ग्राहक प्रबंधन के लिए इंटरफ़ेस नीचे सूचीबद्ध हैं।
-
registerClientProfile(in ResourceClientProfile profile, IResourcesReclaimListener listener, out int[] clientId)
-
unregisterClientProfile(in int clientId)
संसाधनों का अनुरोध करने और जारी करने के लिए इंटरफ़ेस नीचे सूचीबद्ध हैं।
-
requestFrontend(TunerFrontendRequest request, int[] frontendHandle)
/releaseFrontend
-
requestDemux(TunerDemuxRequest request, int[] demuxHandle)
/releaseDemux
-
requestDescrambler(TunerDescramblerRequest request, int[] descramblerHandle)
/releaseDescrambler
-
requestCasSession(CasSessionRequest request, int[] casSessionHandle)
/releaseCasSession
-
requestLnb(TunerLnbRequest request, int[] lnbHandle)
/releaseLnb
क्लाइंट और अनुरोध वर्ग नीचे सूचीबद्ध हैं।
-
ResourceClientProfile
-
ResourcesReclaimListener
-
TunerFrontendRequest
-
TunerDemuxRequest
-
TunerDescramblerRequest
-
CasSessionRequest
-
TunerLnbRequest
ग्राहक प्राथमिकता
टीआरएम क्लाइंट की प्रोफ़ाइल से पैरामीटर और कॉन्फ़िगरेशन फ़ाइल से प्राथमिकता मान का उपयोग करके क्लाइंट की प्राथमिकता की गणना करता है। प्राथमिकता को ग्राहक से मनमाने ढंग से प्राथमिकता मूल्य द्वारा भी अद्यतन किया जा सकता है।
ग्राहक की प्रोफ़ाइल में पैरामीटर
टीआरएम यह तय करने के लिए 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. ट्यूनर संसाधनों के बीच संघर्ष के लिए पुनः दावा तंत्र का आरेख