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

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

मीडिया सीएएस के मुख्य मकसद ये हैं.

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

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

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

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

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

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

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

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

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

Android 11 से पहले, Media CAS फ़्रेमवर्क का इस्तेमाल सॉफ़्टवेयर पर आधारित कॉन्टेंट को प्रोसेस करने के लिए किया जा सकता था. जैसे, आईपी मल्टीकास्ट/यूनिकास्ट से आईपीटीवी. TIS ऐप्लिकेशन, 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 ट्यूनिंग का क्रम

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

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

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

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

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

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

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

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

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

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

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

Media CAS Java API

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

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

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

    void refreshEntitlements(int refreshType);
    
  • मीडिया CAS ऑब्जेक्ट बंद करें.

    void close();
    
  • कोई सेशन खोलें.

    Session openSession();
    Session openSession(@SessionUsage int sessionUsage, @ScramblingMode int scramblingMode);
    
  • पहले से खुले हुए सेशन को बंद करें.

    void Session#close();
    
  • PMT में मौजूद CA डिस्क्रिप्टर से, CA के निजी डेटा को CAS सेशन में भेजें. यह डेटा, प्रोग्राम की जानकारी या ES की जानकारी वाले सेक्शन से लिया जा सकता है.

    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);