मीडिया कंडीशनल ऐक्सेस सिस्टम (मीडिया सीएएस) फ़्रेमवर्क, स्टैंडर्ड एपीआई उपलब्ध कराता है. इनकी मदद से, डिजिटल केबल, सैटलाइट, टेरेस्ट्रियल सिस्टम, और आईपीटीवी सिस्टम जैसे कई डिजिटल टीवी हार्डवेयर पर कंडीशनल ऐक्सेस (सीए) सेवाएं चालू की जा सकती हैं. यह फ़्रेमवर्क, Android TV इनपुट फ़्रेमवर्क और Android TV ट्यूनर फ़्रेमवर्क के साथ काम करता है. साथ ही, यह टीवी इनपुट सेवा (TIS) ऐप्लिकेशन से शुरू किए गए Java API उपलब्ध कराता है.
मीडिया सीएएस के मुख्य लक्ष्य ये हैं.
- सार्वजनिक Java API और नेटिव प्लग इन फ़्रेमवर्क उपलब्ध कराएं. इसका इस्तेमाल, तीसरे पक्ष के डेवलपर और OEM, Android में ब्रॉडकास्ट टीवी के लिए सीएएस (कंट्रोल ऐक्सेस सिस्टम) की सुविधा देने के लिए कर सकते हैं.
- Android में सीएएस फ़्रेमवर्क उपलब्ध कराएं, ताकि ATV OEM, अलग-अलग सीएएस वेंडर के साथ एक जैसी सुविधाएं दे सकें.
- नेटिव प्लग इन का इस्तेमाल करके, तीसरे पक्ष के कई सीएएस वेंडर के साथ काम करता है. सीएएस प्लग इन, वेंडर के हिसाब से नेटवर्क प्रोटोकॉल, एनटाइटलमेंट मैनेजमेंट मैसेज (ईएमएम)/एनटाइटलमेंट कंट्रोल मैसेज (ईसीएम) फ़ॉर्मैट, और डिस्क्रैम्बलर का इस्तेमाल कर सकते हैं.
- हार्डवेयर सुरक्षा के साथ काम करना, जैसे कि कुंजी के लेडर.
- TrustZone जैसे ट्रस्टेड एक्ज़ीक्यूशन एनवायरमेंट (टीईई) के साथ काम करना.
इस्तेमाल किए जा सकने वाले कॉन्फ़िगरेशन
हार्डवेयर ट्यूनर का कॉन्फ़िगरेशन
अगर हार्डवेयर, एमपीईजी ट्रांसपोर्ट स्ट्रीम को अलग-अलग हिस्सों में बांटने और डिक्रैम्बल करने के लिए ज़िम्मेदार है, तो ट्यूनर फ़्रेमवर्क, टीआईएस ऐप्लिकेशन को कंडीशनल ऐक्सेस प्रोग्राम से जुड़ी जानकारी (पीएसआई) का डेटा उपलब्ध कराता है. इससे, हार्डवेयर पर आधारित टीवी ट्यूनर के साथ इंटरफ़ेस किया जा सकता है.
शर्तों के साथ ऐक्सेस वाले पीएसआई डेटा में, सीए डिस्क्रिप्टर, ईसीएम, और ईएमएम शामिल होते हैं. इन स्ट्रक्चर की मदद से, सीएएस प्लग इन को कॉन्टेंट स्ट्रीम को डिक्रिप्ट करने के लिए ज़रूरी कुंजियां मिलती हैं.
पहली इमेज. हार्डवेयर ट्यूनर का कॉन्फ़िगरेशन
हार्डवेयर कॉन्फ़िगरेशन में, TEE लेयर हो सकती है. जैसे, TrustZone, जो पहली इमेज में दिखाया गया है. अगर टीईई लेयर नहीं है, तो सीएएस क्लाइंट प्लग इन, प्लैटफ़ॉर्म की ओर से दी गई हार्डवेयर कुंजी के लेडर सेवाओं के साथ कम्यूनिकेट कर सकता है. इन इंटरफ़ेस में वेंडर के हिसाब से बदलाव होते हैं. इसलिए, Media CAS इन इंटरफ़ेस को स्टैंडर्ड नहीं बनाता.
सॉफ़्टवेयर कॉन्फ़िगरेशन
Android 11 से पहले, Media CAS फ़्रेमवर्क का इस्तेमाल, सॉफ़्टवेयर पर आधारित कॉन्टेंट को प्रोसेस करने के लिए किया जा सकता था. जैसे, आईपी मल्टीकास्ट/यूनीकास्ट से आईपीटीवी. TIS ऐप्लिकेशन, Media CAS Java ऑब्जेक्ट को तुरंत बनाने और उसे सही तरीके से उपलब्ध कराने के लिए ज़िम्मेदार है.
ऐप्लिकेशन, सीए से जुड़े पीएसआई डेटा को निकालने के लिए, MediaExtractor या अन्य MPEG2-TS पार्सर का इस्तेमाल कर सकता है. जैसे, सीए डिस्क्रिप्टर, ईसीएम, और ईएमएम. अगर ऐप्लिकेशन, MediaExtractor फ़्रेमवर्क का इस्तेमाल करता है, तो वह CAS सेशन मैनेजमेंट का काम, MediaExtractor फ़्रेमवर्क को सौंप सकता है. जैसे, सेशन खोलना और ईएमएम/ईसीएम को प्रोसेस करना. इसके बाद, MediaExtractor सीधे नेटिव एपीआई का इस्तेमाल करके सीएएस सेशन को कॉन्फ़िगर करता है.
अगर ऐसा नहीं है, तो सीए से जुड़े पीएसआई डेटा को निकालने और Media CAS Java API का इस्तेमाल करके सीएएस सेशन को कॉन्फ़िगर करने की ज़िम्मेदारी ऐप्लिकेशन की होती है. उदाहरण के लिए, जब ऐप्लिकेशन अपने MPEG2-TS पार्स करने वाले टूल का इस्तेमाल करता है.
दूसरी इमेज. MediaExtractor फ़्रेमवर्क का इस्तेमाल करके, आईपीटीवी इनपुट, सीएएस, और डिस्क्रैम्बलर कॉन्फ़िगरेशन
सॉफ़्टवेयर एक्सट्रैक्टर के मामले में, एक्सट्रैक्टर को हर स्क्रैम्बल किए गए ट्रैक के लिए, सॉफ़्टवेयर या हार्डवेयर पर आधारित डिस्क्रैम्बलर ऑब्जेक्ट की ज़रूरत होती है. भले ही, ट्रैक में सुरक्षित डिकोडर की ज़रूरत हो या नहीं. ऐसा इन वजहों से होता है.
- अगर ट्रैक को सुरक्षित तरीके से डिकोड करने की ज़रूरत नहीं है, तो एक्सट्रैक्टर, बफ़र को खाली करने के लिए ऐक्सेस यूनिट को डिक्रिप्ट करता है. साथ ही, साफ़ स्ट्रीम से सैंपल निकालता है. इस तरह,
MediaCodec
को डिक्रैम्बल करने की ज़रूरत नहीं होती. अगर ट्रैक को सुरक्षित तरीके से डिकोड करना है, तो हो सकता है कि एक्सट्रैक्टर को डिस्क्रैम्बलर की ज़रूरत पड़े. ऐसा तब होता है, जब ट्रांसपोर्ट स्ट्रीम को ट्रांसपोर्ट पैकेट लेवल पर स्क्रैम्बल किया जाता है. यहां पैकेट में बांटी गई एलिमेंटरी स्ट्रीम (पीईएस) का हेडर स्क्रैम्बल किया जाता है. एक्सट्रैक्टर को कुछ जानकारी (उदाहरण के लिए, प्रज़ेंटेशन का टाइमस्टैंप) को डाउनस्ट्रीम करने के लिए, PES हेडर को ऐक्सेस करना होगा.
अगर ट्रांसपोर्ट स्ट्रीम को PES पैकेट लेवल पर डिक्रिप्ट किया जाता है, तो एक्सट्रैक्टर डिक्रिप्टर का इस्तेमाल नहीं करता. ऐसा तब होता है, जब PES हेडर को साफ़ छोड़ दिया जाता है. हालांकि, जब तक स्क्रैम्बल किया गया पैकेट नहीं आता, तब तक यह पुष्टि नहीं की जा सकती कि स्क्रैम्बल कब हुआ. आसानी के लिए, मान लें कि अगर प्रोग्राम मैपिंग टेबल (पीएमटी) के आधार पर, ट्रैक को स्क्रैम्बल किया गया है, तो डिस्क्रैम्बलर का इस्तेमाल किया जाता है.
सॉफ़्टवेयर कॉन्फ़िगरेशन की सीमाएं
जब ट्रैक को सुरक्षित तरीके से डिकोड करना ज़रूरी होता है, तो डिक्रैम्बलर को साफ़ बफ़र में डिक्रैम्बल करने की प्रोसेस को अनुमति देते समय सावधानी बरतनी चाहिए. ऑडियो को डिकोड करने के लिए, सुरक्षित डिकोडर की ज़रूरत नहीं होती. अगर वीडियो को डिकोड करने के लिए, सुरक्षित डिकोडर की ज़रूरत होती है, तो उसे ऑडियो से अलग सेशन में स्क्रैम्बल किया जाना चाहिए. सेशन के लिए ईसीएम को प्लग इन को सिग्नल देना होगा कि सुरक्षित डिकोडर की ज़रूरत है.
इसके अलावा, प्लग इन को अपनी सुरक्षा नीति से किसी कुंजी को भरोसेमंद तरीके से जोड़ना चाहिए. ऐसा न करने पर, ऐप्लिकेशन आसानी से ऑडियो डिस्क्रैम्बलर की मदद से वीडियो फ़्रेम हासिल कर सकता है.
भले ही, सेशन के लिए सुरक्षित डिकोडर की ज़रूरत हो, फिर भी एक्सट्रैक्टर से बफ़र खाली करने के लिए, थोड़ा डेटा आउटपुट करने के लिए कहा जा सकता है, ताकि PES हेडर को प्रोसेस किया जा सके. किसी नुकसान पहुंचाने वाले ऐप्लिकेशन को प्लग इन से पूरी ऐक्सेस यूनिट वापस पाने से रोकने के लिए, प्लग इन को ट्रांसपोर्ट पेलोड को पार्स करना होगा. इससे यह पक्का किया जा सकेगा कि पेलोड, सही स्ट्रीम टाइप के PES हेडर से शुरू होता है. ऐसा न करने पर, प्लग इन को अनुरोध अस्वीकार करना चाहिए.
सीए ट्यूनिंग का क्रम
किसी नए चैनल पर ट्यून करते समय, टीआईएस मॉड्यूल, पीएसआई ट्यूनर फ़्रेमवर्क से सीए डिस्क्रिप्टर, ईसीएम, और ईएमएम पाने के लिए रजिस्टर करता है. सीए डिस्क्रिप्टर में सीए सिस्टम आईडी होता है. इससे किसी सीए वेंडर और वेंडर से जुड़े अन्य डेटा की खास पहचान की जा सकती है. TIS, Media CAS से यह पता लगाने के लिए क्वेरी करता है कि क्या कोई ऐसा CAS प्लग इन मौजूद है जो CA डिस्क्रिप्टर को मैनेज कर सकता है.
तीसरी इमेज. सीएएस कॉन्टेंट को ट्यून करना
अगर CA सिस्टम आईडी काम करता है, तो मीडिया सीएएस का एक इंस्टेंस बनाया जाता है और CA डिस्क्रिप्टर से वेंडर का निजी डेटा प्लग इन को दिया जाता है. इसके बाद, ऑडियो और वीडियो स्ट्रीम को मैनेज करने के लिए, मीडिया सीएएस में नए सेशन खोले जाते हैं. नए सेशन में, प्लग इन के लिए ईसीएम और ईएमएम मिलते हैं.
सीएएस प्लग इन के फ़्लो का सैंपल
TIS, Media CAS APIs का इस्तेमाल करके, सीएएस प्लग इन को ईसीएम डिलीवर करता है. ईसीएम में एन्क्रिप्ट (सुरक्षित) किया गया कंट्रोल वर्ड होता है. इसे ईएमएम की जानकारी का इस्तेमाल करके डिक्रिप्ट (सुरक्षित) करना होता है. सीएएस प्लग इन यह तय करता है कि एसेट के लिए EMM कैसे हासिल किया जाए. यह तय करने के लिए, वह setPrivateData()
तरीके से मिले सीए डिस्क्रिप्टर में वेंडर से जुड़ी जानकारी का इस्तेमाल करता है.
ईएमएम, कॉन्टेंट स्ट्रीम में बैंड में या सीए प्लग इन से शुरू किए गए नेटवर्क अनुरोध का इस्तेमाल करके, बैंड के बाहर डिलीवर किए जा सकते हैं. TIS, CA प्लग इन में किसी भी इन-बैंड ईएमएम को डिलीवर करने के लिए, processEMM()
तरीके का इस्तेमाल करता है.
अगर ईएमएम पाने के लिए नेटवर्क अनुरोध ज़रूरी है, तो लाइसेंस सर्वर के साथ नेटवर्क लेन-देन करने की ज़िम्मेदारी सीए प्लग इन की होती है.
चौथी इमेज. EMM और ECM प्रोसेसिंग के लिए सीएएस प्लग इन का उदाहरण
EMM मिलने पर, सीए प्लग इन उसे पार्स करता है, ताकि कंट्रोल वर्ड को डिक्रिप्ट करने के लिए एन्क्रिप्ट की गई कुंजी हासिल की जा सके. एन्क्रिप्ट (सुरक्षित) की गई EMM कुंजी और एन्क्रिप्ट (सुरक्षित) किए गए कंट्रोल वर्ड को, कुंजी के लेडर या भरोसेमंद एनवायरमेंट में लोड किया जा सकता है. इससे कंट्रोल वर्ड को डिक्रिप्ट (सुरक्षित) करने और कॉन्टेंट स्ट्रीम को डिक्रिप्ट (सुरक्षित) करने के बाद, उसे डिक्रिप्ट (सुरक्षित) किया जा सकता है.
Media CAS Java API
Media CAS Java API में ये तरीके शामिल हैं.
डिवाइस पर उपलब्ध सभी सीए प्लग इन की सूची बनाएं.
class MediaCas.PluginDescriptor { public String getName(); public int getSystemId(); } static PluginDescriptor[] enumeratePlugins();
बताए गए सीए सिस्टम के लिए, मीडिया सीएएस इंस्टेंस बनाएं. इसका मतलब है कि Media 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);
EMM पैकेट को प्रोसेस करना.
void processEmm(@NonNull byte[] data, int offset, int length);
सीए सिस्टम को इवेंट भेजता है. इवेंट का फ़ॉर्मैट, स्कीम के हिसाब से होता है और फ़्रेमवर्क के लिए साफ़ तौर पर नहीं दिखता.
void sendEvent(int event, int arg, @Nullable byte[] data);
किसी सीए सिस्टम के लिए, बताए गए टाइप का प्रोविज़निंग ऑपरेशन शुरू करें. जब कोई डिवाइस पहली बार पैसे चुकाकर ली जाने वाली टीवी सेवा के लिए साइन अप करता है, तो उसे सबसे पहले सीएएस सर्वर के लिए प्रावधान करना होता है. डिवाइस को प्रावधान करने के लिए, उससे जुड़े पैरामीटर का एक सेट दें.
void provision(String provisionString);
एनटाइटलमेंट को रीफ़्रेश करने की प्रोसेस शुरू करें. जब कोई उपयोगकर्ता किसी नए चैनल की सदस्यता लेता है, तो ऐप्लिकेशन को एनटाइटलमेंट पासकोड रीफ़्रेश करने के लिए सीए क्लाइंट को निर्देश देना चाहिए. उदाहरण के लिए, किसी विज्ञापन का जवाब देकर या इलेक्ट्रॉनिक प्रोग्राम गाइड (ईपीजी) पर चैनल जोड़कर.
void refreshEntitlements(int refreshType);
Media CAS ऑब्जेक्ट बंद करें.
void close();
कोई सेशन खोलें.
Session openSession(); Session openSession(@SessionUsage int sessionUsage, @ScramblingMode int scramblingMode);
पहले से खोले गए सेशन को बंद करें.
void Session#close();
PMT में CA डिस्क्रिप्टर से CA का निजी डेटा दें. यह डेटा, प्रोग्राम की जानकारी या ES की जानकारी वाले सेक्शन से CAS सेशन में भेजा जा सकता है.
void Session#setPrivateData(@NonNull byte[] sessionId, @NonNull byte[] data);
किसी सेशन के लिए ECM पैकेट को प्रोसेस करना.
void Session#processEcm(@NonNull byte[] data, int offset, int length);
सेशन आईडी पाएं.
byte[] Session#getSessionId();
सीए सिस्टम को सेशन इवेंट भेजना. इवेंट का फ़ॉर्मैट, स्कीम के हिसाब से होता है और फ़्रेमवर्क के लिए साफ़ तौर पर नहीं दिखता.
void Session#sendSessionEvent(int event, int arg, @Nullable byte[] data);