मीडिया कंडिशनल ऐक्सेस सिस्टम (मीडिया सीएएस) फ़्रेमवर्क, स्टैंडर्ड एपीआई की सुविधा देता है. इनकी मदद से डिजिटल टीवी हार्डवेयर, जैसे कि डिजिटल केबल, सैटलाइट, टेरेस्ट्रीयल सिस्टम, और IPTV सिस्टम पर कंडिशनल ऐक्सेस (CA) की सेवाएं चालू की जा सकती हैं. यह फ़्रेमवर्क, Android TV इनपुट फ़्रेमवर्क और Android TV ट्यूनर फ़्रेमवर्क के साथ काम करता है. साथ ही, यह टीवी इनपुट सर्विस (टीआईएस) ऐप्लिकेशन से शुरू किए गए Java API उपलब्ध कराता है.
मीडिया सीएएस के मुख्य मकसद ये हैं.
- सार्वजनिक Java API और नेटिव प्लगिन फ़्रेमवर्क उपलब्ध कराएं. तीसरे पक्ष के डेवलपर और OEM, Android में ब्रॉडकास्ट टीवी के लिए सीएएस के साथ काम करने के लिए, इस फ़्रेमवर्क का इस्तेमाल कर सकें.
- Android में ऐसा सीएएस फ़्रेमवर्क उपलब्ध कराएं जिससे एटीवी ओईएम, कई तरह के सीएएस वेंडर के साथ लगातार काम कर सकें.
- नेटिव प्लग इन का इस्तेमाल करके, तीसरे पक्ष के कई सीएएस वेंडर के साथ काम करता है. सीएएस प्लग इन, वेंडर के हिसाब से नेटवर्क प्रोटोकॉल, एनटाइटलमेंट मैनेजमेंट मैसेज (ईएमएम)/एनटाइटलमेंट कंट्रोल मैसेज (ईसीएम) फ़ॉर्मैट, और डिस्क्रैम्बलर का इस्तेमाल कर सकते हैं.
- कुंजी की सीढ़ी जैसी हार्डवेयर सुरक्षा के लिए सहायता.
- TrustZone जैसे भरोसेमंद एक्ज़ीक्यूशन एनवायरमेंट (टीईई) के साथ काम करें.
इस्तेमाल किए जा सकने वाले कॉन्फ़िगरेशन
हार्डवेयर ट्यूनर का कॉन्फ़िगरेशन
अगर एमपीईजी ट्रांसपोर्ट स्ट्रीम के डीमल्टीप्लेक्सिंग और डिस्क्रैंबिंग की ज़िम्मेदारी हार्डवेयर की है, तो ट्यूनर फ़्रेमवर्क टीआईएस ऐप्लिकेशन को कंडिशनल ऐक्सेस प्रोग्राम की खास जानकारी (पीएसआई) का डेटा देता है, ताकि हार्डवेयर-आधारित टीवी ट्यूनर के साथ इंटरफ़ेस किया जा सके.
कंडिशनल ऐक्सेस पीएसआई डेटा में सीए डिस्क्रिप्टर, ईसीएम, और ईएमएम शामिल होते हैं. ये स्ट्रक्चर, सीएएस प्लगिन को चालू करते हैं, ताकि कॉन्टेंट स्ट्रीम को डिक्रिप्ट करने के लिए ज़रूरी कुंजियां इकट्ठा की जा सकें.
पहली इमेज. हार्डवेयर ट्यूनर का कॉन्फ़िगरेशन
हार्डवेयर कॉन्फ़िगरेशन में, TEE लेयर हो सकती है. जैसे, TrustZone, जो पहली इमेज में दिखाया गया है. अगर कोई टीईई लेयर नहीं है, तो सीएएस क्लाइंट प्लगिन, प्लैटफ़ॉर्म से मिलने वाली हार्डवेयर कुंजी लैडर सेवाओं के साथ कम्यूनिकेट कर सकता है. अलग-अलग वेंडर के लिए ये इंटरफ़ेस अलग-अलग होते हैं. इसलिए, मीडिया सीएएस इनके लिए स्टैंडर्ड तय नहीं करता.
सॉफ़्टवेयर कॉन्फ़िगरेशन
Android 11 से पहले, Media CAS फ़्रेमवर्क का इस्तेमाल, सॉफ़्टवेयर पर आधारित कॉन्टेंट को प्रोसेस करने के लिए किया जा सकता था. जैसे, आईपी मल्टीकास्ट/यूनीकास्ट से आईपीटीवी. TIS ऐप्लिकेशन, Media CAS Java ऑब्जेक्ट को इंस्टैंशिएट करने और सही तरीके से प्रावधान करने के लिए ज़िम्मेदार है.
यह ऐप्लिकेशन, CA से जुड़ा PSI डेटा एक्सट्रैक्ट करने के लिए MediaExtractor या अन्य MPEG2-टीएस पार्सर का इस्तेमाल कर सकता है. जैसे, सीए डिस्क्रिप्टर, ईसीएम, और ईएमएम. अगर ऐप्लिकेशन, MediaExtractor फ़्रेमवर्क का इस्तेमाल करता है, तो वह CAS सेशन मैनेजमेंट को MediaExtractor फ़्रेमवर्क को सौंप सकता है. जैसे, सेशन खोलना और ईएमएम/ईसीएम को प्रोसेस करना. इसके बाद, MediaExtractor नेटिव एपीआई का इस्तेमाल करके, सीएएस सेशन को सीधे कॉन्फ़िगर करता है.
ऐसा न होने पर, सीए से जुड़े पीएसआई डेटा को निकालने और मीडिया सीएएस जावा एपीआई का इस्तेमाल करके सीएएस सेशन को कॉन्फ़िगर करने की ज़िम्मेदारी ऐप्लिकेशन की होती है. उदाहरण के लिए, जब ऐप्लिकेशन अपने MPEG2-टीएस पार्सर का इस्तेमाल करता है, तो ऐसा होता है.
दूसरी इमेज. MediaExtractor फ़्रेमवर्क का इस्तेमाल करके, आईपीटीवी इनपुट, सीएएस, और डिस्क्रैम्बलर कॉन्फ़िगरेशन
सॉफ़्टवेयर एक्सट्रैक्टर की स्थिति में, एक्सट्रैक्ट करने वाले टूल को हर स्क्रैंबल किए गए ट्रैक के लिए सॉफ़्टवेयर या हार्डवेयर-आधारित डीस्क्रैंबलर ऑब्जेक्ट की ज़रूरत होती है. भले ही, ट्रैक में सुरक्षित डिकोडर का इस्तेमाल किया गया हो या नहीं. ऐसा इन वजहों से होता है.
- अगर ट्रैक को सुरक्षित तरीके से डिकोड करने की ज़रूरत नहीं है, तो एक्सट्रैक्टर बफ़र को हटाने के लिए ऐक्सेस यूनिट को डिकोड करता है. साथ ही, सैंपल एक्सट्रैक्ट करता है, जैसे कि साफ़ स्ट्रीम से किया गया हो. ऐसा करने पर, डिस्क्रैम्बिंग में
MediaCodec
का शामिल होना ज़रूरी नहीं है. अगर ट्रैक को सुरक्षित तरीके से डिकोड करना है, तो हो सकता है कि एक्सट्रैक्टर को डिस्क्रैम्बलर की ज़रूरत पड़े. ऐसा तब होता है, जब ट्रांसपोर्ट स्ट्रीम को ट्रांसपोर्ट पैकेट लेवल पर स्क्रैम्बल किया जाता है. यहां पैकेट में बांटी गई एलिमेंटरी स्ट्रीम (पीईएस) का हेडर स्क्रैम्बल किया जाता है. एक्सट्रैक्टर को कुछ जानकारी (उदाहरण के लिए, प्रज़ेंटेशन का टाइमस्टैंप) को डाउनस्ट्रीम करने के लिए, PES हेडर को ऐक्सेस करना होगा.
अगर पीईएस पैकेट के लेवल पर ट्रांसपोर्ट स्ट्रीम को स्क्रैंबल किया गया है, जहां पीईएस हेडर को साफ़ रखा गया है, तो एक्सट्रैक्टर में डिस्क्रैंबलर का इस्तेमाल नहीं किया जाता. हालांकि, यह पता नहीं चल सकता कि स्क्रैम्बलिंग कब होती है, जब तक कि असल स्क्रैंबलेड पैकेट नहीं आ जाता. आसानी के लिए, मान लें कि अगर प्रोग्राम मैपिंग टेबल (पीएमटी) के आधार पर, ट्रैक को स्क्रैम्बल किया गया है, तो डिस्क्रैम्बलर का इस्तेमाल किया जाता है.
सॉफ़्टवेयर कॉन्फ़िगरेशन की सीमाएं
जब ट्रैक को सुरक्षित तरीके से डिकोड करना ज़रूरी होता है, तो डिक्रैम्बलर को साफ़ बफ़र में डिक्रैम्बल करने की प्रोसेस को अनुमति देते समय सावधानी बरतनी चाहिए. ऑडियो को डिकोड करने के लिए, सुरक्षित डिकोडर की ज़रूरत नहीं होती. अगर वीडियो को डिकोड करने के लिए, सुरक्षित डिकोडर की ज़रूरत होती है, तो उसे ऑडियो से अलग सेशन में स्क्रैम्बल किया जाना चाहिए. सेशन के लिए ईसीएम को प्लग इन को यह सिग्नल देना होगा कि सुरक्षित डिकोडर की ज़रूरत है.
इसके अलावा, यह भी ज़रूरी है कि प्लगिन अपनी सुरक्षा नीति से भरोसेमंद तरीके से लिंक कर सके. ऐसा न करने पर, ऐप्लिकेशन आसानी से ऑडियो डिस्क्रैम्बलर की मदद से वीडियो फ़्रेम हासिल कर सकता है.
भले ही, सेशन के लिए एक सुरक्षित डिकोडर की ज़रूरत हो, लेकिन पीईएस हेडर को प्रोसेस करने के लिए, एक्सट्रैक्टर की मदद से बफ़र को साफ़ करने के लिए थोड़ा डेटा मांगा जा सकता है. नुकसान पहुंचाने वाले ऐप्लिकेशन को प्लग इन की पूरी ऐक्सेस यूनिट लौटाने से रोकने के लिए, प्लगिन को ट्रांसपोर्ट पेलोड पार्स करना होगा. इससे यह पक्का किया जा सकेगा कि पेलोड सही स्ट्रीम टाइप के पीईएस हेडर से शुरू हो. अगर ऐसा नहीं है, तो प्लगिन को यह अनुरोध अस्वीकार कर देना चाहिए.
सीए ट्यूनिंग का क्रम
किसी नए चैनल पर ट्यून करते समय, टीआईएस मॉड्यूल, पीएसआई ट्यूनर फ़्रेमवर्क से सीए डिस्क्रिप्टर, ईसीएम, और ईएमएम पाने के लिए रजिस्टर करता है. सीए डिस्क्रिप्टर में सीए सिस्टम आईडी होता है. इससे किसी खास सीए वेंडर और वेंडर से जुड़े अन्य डेटा की पहचान की जाती है. TIS, Media CAS से यह पता लगाने के लिए क्वेरी करता है कि क्या कोई ऐसा CAS प्लग इन मौजूद है जो CA डिस्क्रिप्टर को मैनेज कर सकता है.
तीसरी इमेज. सीएएस कॉन्टेंट को ट्यून करना
अगर सीए सिस्टम आईडी काम करता है, तो मीडिया सीएएस का एक इंस्टेंस बनाया जाता है. साथ ही, सीए डिस्क्रिप्टर से मिला वेंडर का निजी डेटा, प्लगिन को दिया जाता है. इसके बाद, ऑडियो और वीडियो स्ट्रीम को मैनेज करने के लिए, मीडिया सीएएस में नए सेशन खुलते हैं. नए सेशन में, प्लग-इन के लिए ईसीएम और ईएमएम मिलते हैं.
सीएएस प्लगिन के फ़्लो का सैंपल
TIS, Media CAS APIs का इस्तेमाल करके, सीएएस प्लग इन को ईसीएम डिलीवर करता है. ईसीएम में एन्क्रिप्ट (सुरक्षित) किया गया कंट्रोल वर्ड होता है. इसे ईएमएम की जानकारी का इस्तेमाल करके डिक्रिप्ट (सुरक्षित) करना होता है. सीएएस प्लग इन यह तय करता है कि एसेट के लिए EMM कैसे हासिल किया जाए. यह तय करने के लिए, वह setPrivateData()
तरीके से मिले सीए डिस्क्रिप्टर में वेंडर से जुड़ी जानकारी का इस्तेमाल करता है.
ईएमएम, कॉन्टेंट स्ट्रीम में बैंड में या सीए प्लग इन से शुरू किए गए नेटवर्क अनुरोध का इस्तेमाल करके, बैंड के बाहर डिलीवर किए जा सकते हैं. TIS, बैंड के किसी भी ईएमएम को सीए प्लगिन में डिलीवर करने के लिए, processEMM()
तरीके का इस्तेमाल करती है.
अगर ईएमएम पाने के लिए नेटवर्क अनुरोध की ज़रूरत होती है, तो सीए प्लगिन, लाइसेंस सर्वर की मदद से नेटवर्क लेन-देन करने की ज़िम्मेदारी लेता है.
चौथी इमेज. EMM और ECM प्रोसेसिंग के लिए सीएएस प्लग इन का उदाहरण
EMM मिलने पर, सीए प्लग इन उसे पार्स करता है, ताकि एन्क्रिप्ट की गई कुंजी को पाकर कंट्रोल वर्ड को डिक्रिप्ट किया जा सके. एन्क्रिप्ट (सुरक्षित) की गई ईएमएम कुंजी और एन्क्रिप्ट (सुरक्षित) किए गए कंट्रोल शब्द को कुंजी की सीढ़ी या भरोसेमंद एनवायरमेंट में लोड किया जा सकता है. ऐसा इसलिए किया जाता है, ताकि कॉन्टेंट स्ट्रीम को कंट्रोल करने के लिए शब्द को डिक्रिप्ट किया जा सके.
मीडिया सीएएस जावा एपीआई
Media CAS Java API में ये तरीके शामिल हैं.
डिवाइस पर उपलब्ध सभी सीए प्लग इन की सूची बनाएं.
class MediaCas.PluginDescriptor { public String getName(); public int getSystemId(); } static PluginDescriptor[] enumeratePlugins();
बताए गए CA सिस्टम के लिए एक मीडिया CAS इंस्टेंस बनाएं. इसका मतलब है कि मीडिया सीएएस फ़्रेमवर्क एक साथ कई सीएएस सिस्टम को मैनेज कर सकता है.
MediaCas(int CA_system_id); MediaCas(@NonNull Context context, int casSystemId, @Nullable String tvInputServiceSessionId, @PriorityHintUseCaseType int priorityHint);
इवेंट लिसनर रजिस्टर करें और ऐप्लिकेशन को उस हैंडलर की जानकारी देने की अनुमति दें जिसका लूप इस्तेमाल किया जाता है.
interface MediaCas.EventListener { void onEvent(MediaCas, int event, int arg, byte[] data); void onSessionEvent(@NonNull MediaCas mediaCas, @NonNull Session session, int event, int arg, @Nullable byte[] data); void onPluginStatusUpdate(@NonNull MediaCas mediaCas, @PluginStatus int status, int arg); void onResourceLost(@NonNull MediaCas mediaCas); } void setEventListener(MediaCas.EventListener listener, Handler handler);
सीए सिस्टम के लिए निजी डेटा भेजें. निजी डेटा, सीए डिस्क्रिप्टर, कंडीशनल ऐक्सेस टेबल या ऑउट ऑफ़ बैंड सोर्स से मिल सकता है. यह किसी खास सेशन से नहीं जुड़ा है.
void setPrivateData(@NonNull byte[] data);
ईएमएम पैकेट प्रोसेस करें.
void processEmm(@NonNull byte[] data, int offset, int length);
सीए सिस्टम में इवेंट भेजें. इवेंट का फ़ॉर्मैट, स्कीम के हिसाब से होता है और फ़्रेमवर्क के लिए अस्पष्ट होता है.
void sendEvent(int event, int arg, @Nullable byte[] data);
सीए सिस्टम के लिए, इस तरह के प्रावधान की कार्रवाई शुरू करें. जब कोई डिवाइस पहली बार पैसे चुकाकर ली जाने वाली टीवी सेवा के लिए साइन अप करता है, तो उसे सबसे पहले सीएएस सर्वर के लिए प्रावधान करना होता है. डिवाइस के सेटअप के लिए, मिलते-जुलते पैरामीटर का एक सेट उपलब्ध कराएं.
void provision(String provisionString);
एनटाइटलमेंट को रीफ़्रेश करने के लिए ट्रिगर करें. जब कोई उपयोगकर्ता किसी नए चैनल की सदस्यता लेता है. उदाहरण के लिए, किसी विज्ञापन का जवाब देकर या इलेक्ट्रॉनिक प्रोग्राम गाइड (ईपीजी) पर कोई चैनल जोड़कर, तो ऐप्लिकेशन के पास CA क्लाइंट को एनटाइटलमेंट कुंजियां रीफ़्रेश करने के बारे में बताने की सुविधा होनी चाहिए.
void refreshEntitlements(int refreshType);
Media CAS ऑब्जेक्ट बंद करें.
void close();
कोई सेशन खोलें.
Session openSession(); Session openSession(@SessionUsage int sessionUsage, @ScramblingMode int scramblingMode);
पहले से खोले गए सेशन को बंद करें.
void Session#close();
पीएमटी में, सीए के डिस्क्रिप्टर से मिला सीए का निजी डेटा दें. यह प्रोग्राम की जानकारी या ईएस की जानकारी वाले सेक्शन से लेकर, सीएएस सेशन का हो सकता है.
void Session#setPrivateData(@NonNull byte[] sessionId, @NonNull byte[] data);
किसी सेशन के लिए, ईसीएम पैकेट प्रोसेस करना.
void Session#processEcm(@NonNull byte[] data, int offset, int length);
सेशन आईडी पाएं.
byte[] Session#getSessionId();
सीए सिस्टम पर सेशन इवेंट भेजें. इवेंट का फ़ॉर्मैट खास तौर पर स्कीम के लिए होता है और यह फ़्रेमवर्क के बारे में नहीं है.
void Session#sendSessionEvent(int event, int arg, @Nullable byte[] data);