सीएएस फ़्रेमवर्क

मीडिया कंडीशनल ऐक्सेस सिस्टम (मीडिया सीएएस) फ़्रेमवर्क, स्टैंडर्ड एपीआई उपलब्ध कराता है. इससे डिजिटल टीवी के अलग-अलग हार्डवेयर पर कंडीशनल ऐक्सेस (सीए) सेवाएं चालू की जा सकती हैं. इनमें डिजिटल केबल, सैटलाइट, टेरेस्ट्रियल सिस्टम, और आईपीटीवी सिस्टम शामिल हैं. यह फ़्रेमवर्क, Android TV Input framework और Android TV Tuner framework के साथ काम करता है. यह TV Input Service (TIS) ऐप्लिकेशन से शुरू किए गए Java API उपलब्ध कराता है.

Media CAS के मुख्य मकसद ये हैं.

  • एक सार्वजनिक Java API और नेटिव प्लगिन फ़्रेमवर्क उपलब्ध कराएं, जिसका इस्तेमाल तीसरे पक्ष के डेवलपर और ओईएम कर सकें. इससे Android पर ब्रॉडकास्ट टीवी के लिए CAS की सुविधा उपलब्ध कराई जा सकेगी.
  • Android में एक ऐसा CAS फ़्रेमवर्क उपलब्ध कराना जो ATV OEM को, अलग-अलग CAS वेंडर के साथ एक जैसा इंटरऑपरेट करने की सुविधा दे.
  • नेटिव प्लगिन का इस्तेमाल करके, तीसरे पक्ष के कई सीएएस वेंडर के साथ काम करता है. CAS प्लगिन, वेंडर के हिसाब से नेटवर्क प्रोटोकॉल, एनटाइटलमेंट मैनेजमेंट मैसेज (ईएमएम)/एनटाइटलमेंट कंट्रोल मैसेज (ईसीएम) फ़ॉर्मैट, और डिक्रैम्बलर का इस्तेमाल कर सकते हैं.
  • हार्डवेयर सुरक्षा की सुविधा काम करती है, जैसे कि की लैडर.
  • TrustZone जैसे ट्रस्टेड एक्ज़ीक्यूशन एनवायरमेंट (टीईई) के साथ काम करता हो.

इन कॉन्फ़िगरेशन के साथ काम करता है

हार्डवेयर ट्यूनर कॉन्फ़िगरेशन

अगर हार्डवेयर, MPEG ट्रांसपोर्ट स्ट्रीम को डीमल्टीप्लेक्स करने और डिक्रैम्बल करने के लिए ज़िम्मेदार है, तो ट्यूनर फ़्रेमवर्क, टीआईएस ऐप्लिकेशन को प्रोग्राम के हिसाब से खास जानकारी (पीएसआई) वाला डेटा उपलब्ध कराता है. इससे हार्डवेयर पर आधारित टीवी ट्यूनर के साथ इंटरफ़ेस किया जा सकता है.

पीएसआई के शर्त के साथ ऐक्सेस किए जाने वाले डेटा में, सीए डिस्क्रिप्टर, ईसीएम, और ईएमएम शामिल होते हैं. इन स्ट्रक्चर की मदद से, CAS प्लगिन को कॉन्टेंट स्ट्रीम को डिक्रिप्ट करने के लिए ज़रूरी कुंजियां मिलती हैं.

हार्डवेयर ट्यूनर के कॉन्फ़िगरेशन का डायग्राम.

पहली इमेज. हार्डवेयर ट्यूनर कॉन्फ़िगरेशन

हार्डवेयर कॉन्फ़िगरेशन में टीईई लेयर हो सकती है. जैसे, TrustZone. इसे पहली इमेज में दिखाया गया है. अगर टीईई लेयर नहीं है, तो CAS क्लाइंट प्लगिन, प्लैटफ़ॉर्म की ओर से उपलब्ध कराई गई हार्डवेयर कुंजी की लेडर सेवाओं से कम्यूनिकेट कर सकता है. इन इंटरफ़ेस के वेंडर के हिसाब से अलग-अलग वर्शन होने की वजह से, Media CAS इन्हें स्टैंडर्ड नहीं करता.

सॉफ़्टवेयर कॉन्फ़िगरेशन

Android 11 से पहले, Media CAS फ़्रेमवर्क का इस्तेमाल सॉफ़्टवेयर पर आधारित कॉन्टेंट को प्रोसेस करने के लिए किया जा सकता था. जैसे, आईपी मल्टीकास्ट/यूनिकास्ट से आईपीटीवी. टीआईएस ऐप्लिकेशन, Media CAS Java ऑब्जेक्ट को इंस्टैंटिएट करने और उसे ठीक से उपलब्ध कराने के लिए ज़िम्मेदार होता है.

यह ऐप्लिकेशन, CA से जुड़े पीएसआई डेटा को निकालने के लिए MediaExtractor या अन्य MPEG2-TS पार्सर का इस्तेमाल कर सकता है. जैसे, CA डिस्क्रिप्टर, ईसीएम, और ईएमएम. अगर ऐप्लिकेशन, MediaExtractor फ़्रेमवर्क का इस्तेमाल करता है, तो वह CAS सेशन के मैनेजमेंट को MediaExtractor फ़्रेमवर्क को सौंप सकता है. जैसे, सेशन खोलना और ईएमएम/ईसीएम को प्रोसेस करना. इसके बाद, MediaExtractor सीधे तौर पर नेटिव एपीआई का इस्तेमाल करके, CAS सेशन को कॉन्फ़िगर करता है.

इसके अलावा, CA से जुड़े पीएसआई डेटा को निकालने और Media CAS Java API का इस्तेमाल करके CAS सेशन को कॉन्फ़िगर करने की ज़िम्मेदारी ऐप्लिकेशन की होती है. उदाहरण के लिए, जब ऐप्लिकेशन अपने MPEG2-TS पार्सर का इस्तेमाल करता है.

ट्यूनर कॉन्फ़िगरेशन का डायग्राम.

दूसरी इमेज. IPTV इनपुट, CAS, और डिसक्रैंबलर कॉन्फ़िगरेशन के लिए, MediaExtractor फ़्रेमवर्क का इस्तेमाल करना

सॉफ़्टवेयर एक्सट्रैक्टर के मामले में, एक्सट्रैक्टर को हर स्क्रैंबल्ड ट्रैक के लिए सॉफ़्टवेयर या हार्डवेयर आधारित डिसक्रैंबलर ऑब्जेक्ट की ज़रूरत होती है. भले ही, ट्रैक के लिए सुरक्षित डिकोडर की ज़रूरत हो या न हो. ऐसा इन वजहों से होता है.

  • अगर ट्रैक के लिए सुरक्षित डिकोडिंग की ज़रूरत नहीं है, तो एक्सट्रैक्टर, ऐक्सेस यूनिट को डिसक्रैंबल करता है, ताकि बफ़र को साफ़ किया जा सके. साथ ही, सैंपल को इस तरह से निकालता है जैसे कि वे साफ़ स्ट्रीम से निकाले गए हों. इस तरह, MediaCodec को डिक्रिप्ट करने की प्रोसेस में शामिल होने की ज़रूरत नहीं होती.
  • अगर ट्रैक को सुरक्षित तरीके से डिकोड करने की ज़रूरत है, तो एक्सट्रैक्टर को अब भी डिसक्रैम्बलर की ज़रूरत पड़ सकती है. ऐसा तब होता है, जब ट्रांसपोर्ट स्ट्रीम को ट्रांसपोर्ट पैकेट लेवल पर स्क्रैंबल किया जाता है. इसमें पैकेट में बंधी एलिमेंट्री स्ट्रीम (पीईएस) हेडर को स्क्रैंबल किया जाता है. एक्सट्रैक्टर को पीईएस हेडर को ऐक्सेस करने की ज़रूरत होती है, ताकि वह कुछ जानकारी (उदाहरण के लिए, प्रज़ेंटेशन टाइमस्टैंप) को डाउनस्ट्रीम कर सके.

    अगर ट्रांसपोर्ट स्ट्रीम को पीईएस पैकेट लेवल पर स्क्रैम्बल किया जाता है, तो एक्सट्रैक्टर, डिसक्रैम्बलर का इस्तेमाल नहीं करता है. इसमें पीईएस हेडर को साफ़ छोड़ दिया जाता है. हालांकि, जब तक स्क्रैंबल किया गया असली पैकेट नहीं आ जाता, तब तक यह पुष्टि नहीं की जा सकती कि स्क्रैंबलिंग कब होती है. आसानी के लिए, मान लें कि अगर प्रोग्राम मैपिंग टेबल (पीएमटी) के आधार पर ट्रैक को स्क्रैंबल्ड माना जाता है, तो डिसक्रैंबलर का इस्तेमाल किया जाता है.

सॉफ़्टवेयर कॉन्फ़िगरेशन की सीमाएं

जब ट्रैक को सुरक्षित डिकोडिंग की ज़रूरत होती है, तो डिसक्रैम्बलर को इस बात का ध्यान रखना होता है कि डिसक्रैम्बल ऑपरेशन को साफ़ बफ़र में जाने की अनुमति देते समय, वह सावधानी बरते. ऑडियो डिकोड करने के लिए, असुरक्षित डिकोडिंग की ज़रूरत होती है. अगर वीडियो डिकोड करने के लिए सुरक्षित डिकोडर की ज़रूरत होती है, तो उसे ऑडियो से अलग सेशन में स्क्रैंबल किया जाना चाहिए. सेशन के लिए ईसीएम को प्लगिन को यह सिग्नल देना होगा कि सुरक्षित डिकोडर की ज़रूरत है.

इसके अलावा, प्लगिन को अपनी सुरक्षा नीति के साथ किसी कुंजी को भरोसेमंद तरीके से जोड़ने में सक्षम होना चाहिए. इसके अलावा, ऐप्लिकेशन ऑडियो डिसक्रैम्बलर की मदद से वीडियो फ़्रेम आसानी से पा सकता है.

अगर सेशन के लिए सुरक्षित डिकोडर की ज़रूरत होती है, तब भी एक्सट्रैक्टर को कुछ डेटा आउटपुट करने के लिए कहा जा सकता है, ताकि वह बफ़र को साफ़ कर सके. ऐसा पीईएस हेडर को प्रोसेस करने के लिए किया जाता है. किसी नुकसान पहुंचाने वाले ऐप्लिकेशन को पूरे ऐक्सेस यूनिट को वापस करने से रोकने के लिए, प्लगिन को ट्रांसपोर्ट पेलोड को पार्स करने की ज़रूरत होती है. इससे यह पक्का किया जा सकता है कि पेलोड, सही स्ट्रीम टाइप के पीईएस हेडर से शुरू हो. अगर ऐसा नहीं है, तो प्लगिन को अनुरोध अस्वीकार कर देना चाहिए.

CA ट्यूनिंग का क्रम

किसी नए चैनल पर ट्यून करने के दौरान, टीआईएस मॉड्यूल रजिस्टर करता है, ताकि वह PSI ट्यूनर फ़्रेमवर्क से CA डिसक्रिप्टर, ईसीएम, और ईएमएम पा सके. सीए डिस्क्रिप्टर में सीए सिस्टम आईडी होता है. यह किसी सीए वेंडर और वेंडर के हिसाब से अन्य डेटा की खास पहचान करता है. TIS, Media CAS से यह क्वेरी करता है कि क्या कोई ऐसा CAS प्लगिन मौजूद है जो CA डिस्क्रिप्टर को हैंडल कर सकता है.

CAS कॉन्टेंट को ट्यून करने का डायग्राम.

तीसरी इमेज. CAS कॉन्टेंट को ट्यून करना

अगर CA सिस्टम आईडी काम करता है, तो Media CAS का एक इंस्टेंस बनाया जाता है. साथ ही, CA डिस्क्रिप्टर से वेंडर का निजी डेटा, प्लगिन को दिया जाता है. इसके बाद, ऑडियो और वीडियो स्ट्रीम को मैनेज करने के लिए, Media CAS में नए सेशन खोले जाते हैं. नए सेशन में, प्लगिन के लिए ईसीएम और ईएमएम मिलते हैं.

CAS प्लगिन के फ़्लो का सैंपल

TIS, Media CAS API का इस्तेमाल करके CAS प्लगिन को ECM डिलीवर करता है. ईसीएम में एन्क्रिप्ट (सुरक्षित) किया गया कंट्रोल वर्ड होता है. इसे डिक्रिप्ट (सुरक्षित) करने के लिए, ईएमएम से मिली जानकारी का इस्तेमाल करना होता है. CAS प्लगिन यह तय करता है कि ऐसेट के लिए EMM कैसे हासिल किया जाए. यह CA डिस्क्रिप्टर में मौजूद, वेंडर के हिसाब से दी गई जानकारी के आधार पर तय किया जाता है. यह जानकारी setPrivateData() तरीके से दी जाती है.

ईएमएम को कॉन्टेंट स्ट्रीम में बैंड में या सीए प्लगिन की ओर से शुरू किए गए नेटवर्क अनुरोध का इस्तेमाल करके, बैंड से बाहर डिलीवर किया जा सकता है. टीआईएस, सीए प्लगिन को किसी भी इन बैंड ईएमएम को डिलीवर करने के लिए, processEMM() तरीके का इस्तेमाल करता है.

अगर किसी ईएमएम को पाने के लिए नेटवर्क अनुरोध की ज़रूरत होती है, तो सीए प्लगिन, लाइसेंस सर्वर के साथ नेटवर्क ट्रांज़ैक्शन करने के लिए ज़िम्मेदार होता है.

उदाहरण के तौर पर CAS का डायग्राम.

चौथी इमेज. EMM और ECM प्रोसेसिंग के लिए CAS प्लगिन का उदाहरण

ईएमएम मिलने पर, सीए प्लगिन इसे पार्स करता है, ताकि कंट्रोल वर्ड को डिक्रिप्ट करने के लिए एन्क्रिप्ट (सुरक्षित) किया गया कुंजी मिल सके. एन्क्रिप्ट (सुरक्षित) किए गए ईएमएम कुंजी और एन्क्रिप्ट (सुरक्षित) किए गए कंट्रोल वर्ड को, कुंजी लैडर या भरोसेमंद एनवायरमेंट में लोड किया जा सकता है. इससे कंट्रोल वर्ड को डिक्रिप्ट किया जा सकता है. साथ ही, कॉन्टेंट स्ट्रीम को बाद में डिक्रिप्ट किया जा सकता है.

Media CAS Java API

Media CAS Java API में ये तरीके शामिल हैं.

  • डिवाइस पर उपलब्ध सभी CA प्लगिन की सूची बनाएं.

    class MediaCas.PluginDescriptor {
      public String getName();
      public int getSystemId();
    }
    static PluginDescriptor[] enumeratePlugins();
    
  • बताए गए CA सिस्टम के लिए, Media CAS इंस्टेंस बनाएं. इसका मतलब है कि Media CAS फ़्रेमवर्क, एक साथ कई 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);
    
  • सीए सिस्टम के लिए निजी डेटा भेजें. निजी डेटा, CA डिस्क्रिप्टर, शर्तों के साथ ऐक्सेस करने की सुविधा वाली टेबल या आउट ऑफ़ बैंड सोर्स से मिल सकता है. यह किसी सेशन से नहीं जुड़ी होती है.

    void setPrivateData(@NonNull byte[] data);
    
  • ईएमएम पैकेट को प्रोसेस करें.

    void processEmm(@NonNull byte[] data, int offset, int length);
    
  • CA सिस्टम को इवेंट भेजता है. इवेंट का फ़ॉर्मैट, स्कीम के हिसाब से होता है और फ़्रेमवर्क के लिए अपारदर्शी होता है.

    void sendEvent(int event, int arg, @Nullable byte[] data);
    
  • किसी CA सिस्टम के लिए, बताए गए टाइप की प्रोविज़निंग प्रोसेस शुरू करें. जब कोई डिवाइस पहली बार पे टीवी सेवा के लिए साइन अप करता है, तो उसे सबसे पहले CAS सर्वर के लिए उपलब्ध कराया जाना चाहिए. डिवाइस को प्रोविज़निंग के लिए, उससे जुड़े पैरामीटर का एक सेट उपलब्ध कराएं.

    void provision(String provisionString);
    
  • एनटाइटलमेंट को रीफ़्रेश करने की प्रोसेस शुरू करें. जब कोई उपयोगकर्ता किसी नए चैनल की सदस्यता लेता है (उदाहरण के लिए, किसी विज्ञापन का जवाब देकर या इलेक्ट्रॉनिक प्रोग्राम गाइड (ईपीजी) पर कोई चैनल जोड़कर), तो ऐप्लिकेशन को सीए क्लाइंट को यह सूचना देनी चाहिए कि एनटाइटलमेंट कुंजियों को रीफ़्रेश करें.

    void refreshEntitlements(int refreshType);
    
  • मीडिया 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();
    
  • CA सिस्टम को सेशन इवेंट भेजता है. इवेंट का फ़ॉर्मैट, स्कीम के हिसाब से होता है. साथ ही, यह फ़्रेमवर्क के लिए अपारदर्शी होता है.

    void Session#sendSessionEvent(int event, int arg, @Nullable byte[] data);