CAS ফ্রেমওয়ার্ক

মিডিয়া কন্ডিশনাল অ্যাক্সেস সিস্টেম (মিডিয়া CAS) ফ্রেমওয়ার্ক ডিজিটাল কেবল, স্যাটেলাইট, টেরেস্ট্রিয়াল সিস্টেম এবং আইপিটিভি সিস্টেম সহ ডিজিটাল টিভি হার্ডওয়্যারের একটি পরিসরে শর্তসাপেক্ষ অ্যাক্সেস (CA) পরিষেবাগুলি সক্ষম করার জন্য স্ট্যান্ডার্ড API প্রদান করে। ফ্রেমওয়ার্কটি Android TV ইনপুট ফ্রেমওয়ার্ক এবং Android TV টিউনার ফ্রেমওয়ার্কের সাথে কাজ করে, TV ইনপুট সার্ভিস (TIS) অ্যাপ থেকে জাভা API গুলি প্রদান করে।

মিডিয়া CAS এর প্রধান উদ্দেশ্যগুলি নিম্নরূপ।

  • একটি সর্বজনীন Java API এবং নেটিভ প্লাগইন ফ্রেমওয়ার্ক প্রদান করুন যা তৃতীয় পক্ষের বিকাশকারী এবং OEMs দ্বারা Android-এ সম্প্রচার টিভির জন্য CAS সমর্থন করতে ব্যবহার করা যেতে পারে৷
  • Android-এর মধ্যে একটি CAS ফ্রেমওয়ার্ক প্রদান করুন যা ATV OEM-কে বিভিন্ন CAS বিক্রেতাদের সাথে সামঞ্জস্যপূর্ণভাবে আন্তঃঅপারেটিং করতে দেয়।
  • স্থানীয় প্লাগইন ব্যবহার করে একাধিক তৃতীয় পক্ষের CAS বিক্রেতাদের সমর্থন করুন। CAS প্লাগইন বিক্রেতা-নির্দিষ্ট নেটওয়ার্ক প্রোটোকল, এনটাইটেলমেন্ট ম্যানেজমেন্ট মেসেজ (EMM)/এনটাইটেলমেন্ট কন্ট্রোল মেসেজ (ECM) ফরম্যাট এবং ডেসক্র্যাম্বলার ব্যবহার করতে পারে।
  • সমর্থন হার্ডওয়্যার নিরাপত্তা যেমন কী মই.
  • বিশ্বস্ত এক্সিকিউশন এনভায়রনমেন্ট (TEEs) যেমন TrustZone সমর্থন করুন।

সমর্থিত কনফিগারেশন

হার্ডওয়্যার টিউনার কনফিগারেশন

যদি হার্ডওয়্যারটি MPEG ট্রান্সপোর্ট স্ট্রীম ডিমাল্টিপ্লেক্সিং এবং ডিসক্র্যাম্বলিং এর জন্য দায়ী হয়, টিউনার ফ্রেমওয়ার্ক হার্ডওয়্যার-ভিত্তিক টিভি টিউনারগুলির সাথে ইন্টারফেস করার জন্য TIS অ্যাপে শর্তসাপেক্ষ অ্যাক্সেস প্রোগ্রাম-নির্দিষ্ট তথ্য (PSI) ডেটা সরবরাহ করে।

শর্তাধীন অ্যাক্সেস PSI ডেটাতে CA বর্ণনাকারী, ECM, এবং EMM অন্তর্ভুক্ত থাকে। এই কাঠামোগুলি কন্টেন্ট স্ট্রিমগুলি ডিক্রিপ্ট করার জন্য প্রয়োজনীয় কীগুলি পেতে CAS প্লাগইনকে সক্ষম করে৷

হার্ডওয়্যার টিউনার কনফিগারেশনের চিত্র।

চিত্র 1. হার্ডওয়্যার টিউনার কনফিগারেশন

হার্ডওয়্যার কনফিগারেশনে একটি TEE স্তর থাকতে পারে, যেমন TrustZone, যা চিত্র 1-এ দেখানো হয়েছে। যদি একটি TEE স্তর না থাকে, তাহলে একটি CAS ক্লায়েন্ট প্লাগইন প্ল্যাটফর্ম দ্বারা প্রদত্ত হার্ডওয়্যার কী মই পরিষেবাগুলির সাথে যোগাযোগ করতে পারে। এই ইন্টারফেসের বিক্রেতা-নির্দিষ্ট বৈচিত্রের কারণে, মিডিয়া CAS সেগুলিকে মানসম্মত করে না।

সফটওয়্যার কনফিগারেশন

অ্যান্ড্রয়েড 11-এর আগে, মিডিয়া সিএএস ফ্রেমওয়ার্ক এখনও আইপি মাল্টিকাস্ট/ইউনিকাস্ট থেকে আইপিটিভির মতো সফ্টওয়্যার-ভিত্তিক সামগ্রী প্রক্রিয়া করতে ব্যবহার করা যেতে পারে। TIS অ্যাপটি মিডিয়া CAS Java অবজেক্টকে তাৎক্ষণিক এবং সঠিকভাবে প্রভিশন করার জন্য দায়ী।

অ্যাপটি CA-সম্পর্কিত PSI ডেটা, যেমন CA বর্ণনাকারী, ECM, এবং EMMs বের করতে MediaExtractor বা অন্যান্য MPEG2-TS পার্সার ব্যবহার করতে পারে। অ্যাপটি ফ্রেমওয়ার্ক MediaExtractor ব্যবহার করলে, এটি CAS সেশন ম্যানেজমেন্টকে অর্পণ করতে পারে, যেমন একটি সেশন খোলা এবং EMM/ECM প্রক্রিয়াকরণ, ফ্রেমওয়ার্ক MediaExtractor-এ। MediaExtractor তারপর সরাসরি নেটিভ API ব্যবহার করে CAS সেশন কনফিগার করে।

অন্যথায়, অ্যাপটি CA-সম্পর্কিত PSI ডেটা বের করার জন্য এবং মিডিয়া CAS Java API ব্যবহার করে CAS সেশন কনফিগার করার জন্য দায়ী (উদাহরণস্বরূপ, যখন অ্যাপটি তার নিজস্ব MPEG2-TS পার্সার ব্যবহার করে)।

টিউনার কনফিগারেশনের চিত্র।

চিত্র 2. ফ্রেমওয়ার্ক মিডিয়া এক্সট্র্যাক্টর ব্যবহার করে আইপিটিভি ইনপুট, সিএএস এবং ডেসক্র্যাম্বলার কনফিগারেশন

সফ্টওয়্যার এক্সট্র্যাক্টর পরিস্থিতিতে, এক্সট্র্যাক্টরের প্রতিটি স্ক্র্যাম্বলড ট্র্যাকের জন্য একটি সফ্টওয়্যার বা হার্ডওয়্যার-ভিত্তিক ডিসক্র্যাম্বলার অবজেক্টের প্রয়োজন হয়, ট্র্যাকটি সুরক্ষিত ডিকোডারের জন্য কল করুক না কেন। এটি নিম্নলিখিত কারণে হয়।

  • যদি ট্র্যাকের নিরাপদ ডিকোডিংয়ের প্রয়োজন না হয়, এক্সট্র্যাক্টর বাফারগুলি পরিষ্কার করার জন্য অ্যাক্সেস ইউনিটকে ডিসক্র্যাম্বল করে এবং একটি পরিষ্কার প্রবাহ থেকে নমুনাগুলি বের করে। এইভাবে MediaCodec ডিসক্র্যাম্বলিংয়ে জড়িত হওয়ার দরকার নেই।
  • ট্র্যাকের নিরাপদ ডিকোডিং প্রয়োজন হলে, এক্সট্র্যাক্টরটির এখনও একটি ডিসক্র্যাম্বলারের প্রয়োজন হতে পারে। এটি ঘটে যখন ট্রান্সপোর্ট স্ট্রিম ট্রান্সপোর্ট প্যাকেট লেভেলে স্ক্র্যাম্বল করা হয়, যেখানে প্যাকেটাইজড এলিমেন্টারি স্ট্রীম (PES) হেডার স্ক্র্যাম্বল করা হয়। এক্সট্র্যাক্টরকে নির্দিষ্ট কিছু তথ্য (উদাহরণস্বরূপ, উপস্থাপনা টাইমস্ট্যাম্প) ডাউনস্ট্রিম করতে PES হেডার অ্যাক্সেস করতে হবে।

    ডিসক্র্যাম্বলার এক্সট্রাক্টর দ্বারা ব্যবহার করা হয় না যদি পরিবহন স্ট্রীম PES প্যাকেট স্তরে স্ক্র্যাম্বল করা হয়, যেখানে PES হেডারটি পরিষ্কার থাকে। যাইহোক, প্রকৃত স্ক্র্যাম্বল করা প্যাকেট না আসা পর্যন্ত স্ক্র্যাম্বলিং কখন ঘটবে তা নিশ্চিত করা সম্ভব নয়। সরলতার জন্য, অনুমান করুন যে প্রোগ্রাম ম্যাপিং টেবিল (PMT) এর উপর ভিত্তি করে ট্র্যাকটি স্ক্র্যাম্বল করার জন্য নির্ধারিত হলে একটি ডেসক্র্যাম্বলার ব্যবহার করা হয়।

সফ্টওয়্যার কনফিগারেশনের সীমাবদ্ধতা

যখন ট্র্যাকের সুরক্ষিত ডিকোডিংয়ের প্রয়োজন হয়, তখন ডিসক্র্যাম্বলকে পরিষ্কার বাফারে ডিসক্র্যাম্বল অপারেশন করতে দেওয়ার সময় সতর্ক হতে হবে। যেহেতু অনিরাপদ অডিও ডিকোডিং প্রয়োজন, যদি ভিডিও ডিকোডিংয়ের জন্য সুরক্ষিত ডিকোডারের প্রয়োজন হয়, তাহলে এটি অডিও থেকে আলাদা সেশনে স্ক্র্যাম্বল করা উচিত। সেশনের জন্য ECM অবশ্যই প্লাগইনকে সংকেত দেবে যে একটি সুরক্ষিত ডিকোডার প্রয়োজন।

বিকল্পভাবে, প্লাগইনটিকে তার নিরাপত্তা নীতির সাথে একটি চাবি নির্ভরযোগ্যভাবে বাঁধতে সক্ষম হতে হবে। অন্যথায়, অ্যাপটি সহজেই অডিও ডিসক্র্যাম্বলার দিয়ে ভিডিও ফ্রেম পেতে পারে।

এমনকি যখন সেশনের জন্য একটি সুরক্ষিত ডিকোডারের প্রয়োজন হয়, তখন PES হেডার প্রক্রিয়া করার জন্য এক্সট্র্যাক্টর দ্বারা বাফারগুলি পরিষ্কার করার জন্য এটিকে অল্প পরিমাণ ডেটা আউটপুট করতে বলা হতে পারে। একটি ক্ষতিকারক অ্যাপ যাতে প্লাগইনটিকে সম্পূর্ণ অ্যাক্সেস ইউনিট ফিরিয়ে দিতে না পারে তার জন্য, প্লাগইনটিকে ট্রান্সপোর্ট পেলোড পার্স করতে হবে যাতে পেলোডটি উপযুক্ত স্ট্রিম ধরনের একটি PES হেডার দিয়ে শুরু হয়। অন্যথায়, প্লাগইন অনুরোধ অস্বীকার করা উচিত.

CA টিউনিং সিকোয়েন্স

একটি নতুন চ্যানেলে টিউন করার সময়, TIS মডিউল PSI টিউনার ফ্রেমওয়ার্ক থেকে CA বর্ণনাকারী, ECM এবং EMM পেতে নিবন্ধন করে। একটি CA বর্ণনাকারীতে CA সিস্টেম আইডি থাকে, যা একটি নির্দিষ্ট CA বিক্রেতা এবং অন্যান্য বিক্রেতা-নির্দিষ্ট ডেটাকে স্বতন্ত্রভাবে সনাক্ত করে। TIS একটি CAS প্লাগইন আছে কিনা তা নির্ধারণ করতে মিডিয়া CAS কে জিজ্ঞাসা করে যা CA বর্ণনাকারীকে পরিচালনা করতে পারে।

CAS বিষয়বস্তু টিউন করার চিত্র।

চিত্র 3. টিউনিং CAS বিষয়বস্তু

CA সিস্টেম আইডি সমর্থিত হলে, মিডিয়া CAS-এর একটি উদাহরণ তৈরি করা হয় এবং CA বর্ণনাকারী থেকে বিক্রেতার ব্যক্তিগত ডেটা প্লাগইনে সরবরাহ করা হয়। তারপর, অডিও এবং ভিডিও স্ট্রিমগুলি পরিচালনা করার জন্য মিডিয়া CAS-এ নতুন সেশন খোলা হয়। নতুন খোলা সেশনগুলি প্লাগইনের জন্য ECM এবং EMM গুলি পায়৷

নমুনা CAS প্লাগইন প্রবাহ

TIS মিডিয়া CAS API ব্যবহার করে CAS প্লাগইনে ECM সরবরাহ করে। একটি ECM-এ এনক্রিপ্ট করা কন্ট্রোল শব্দ থাকে, যা একটি EMM থেকে তথ্য ব্যবহার করে ডিক্রিপ্ট করা প্রয়োজন। CAS প্লাগইন নির্ধারণ করে কিভাবে CA বর্ণনাকারীতে বিক্রেতা-নির্দিষ্ট তথ্যের উপর ভিত্তি করে সম্পদের জন্য একটি EMM অর্জন করতে হয়, যা setPrivateData() পদ্ধতি দ্বারা সরবরাহ করা হয়।

ইএমএমগুলি CA প্লাগইন দ্বারা শুরু করা একটি নেটওয়ার্ক অনুরোধ ব্যবহার করে বিষয়বস্তু স্ট্রিমে ব্যান্ডে বা ব্যান্ডের বাইরে বিতরণ করা যেতে পারে। CA প্লাগইনে যেকোনও ব্যান্ড EMM সরবরাহ করতে TIS processEMM() পদ্ধতি ব্যবহার করে।

যদি একটি EMM পাওয়ার জন্য একটি নেটওয়ার্ক অনুরোধের প্রয়োজন হয়, CA প্লাগইন একটি লাইসেন্স সার্ভারের সাথে নেটওয়ার্ক লেনদেন সম্পাদনের জন্য দায়ী৷

একটি উদাহরণ CAS এর চিত্র।

চিত্র 4. EMM এবং ECM প্রক্রিয়াকরণের জন্য উদাহরণ CAS প্লাগইন

যখন EMM প্রাপ্ত হয়, তখন CA প্লাগইন এটিকে পার্স করে কন্ট্রোল শব্দ ডিক্রিপ্ট করার জন্য এনক্রিপ্ট করা কী পেতে। এনক্রিপ্ট করা EMM কী এবং এনক্রিপ্ট করা কন্ট্রোল শব্দ নিয়ন্ত্রণ শব্দ ডিক্রিপশন এবং পরবর্তী বিষয়বস্তু স্ট্রীম ডিসক্র্যাম্বলিং সঞ্চালনের জন্য একটি কী মই বা বিশ্বস্ত পরিবেশে লোড করা হতে পারে।

মিডিয়া CAS Java API

Media CAS Java API-তে নিম্নলিখিত পদ্ধতি রয়েছে।

  • ডিভাইসে উপলব্ধ সমস্ত CA প্লাগইনগুলির তালিকা করুন৷

    class MediaCas.PluginDescriptor {
      public String getName();
      public int getSystemId();
    }
    static PluginDescriptor[] enumeratePlugins();
    
  • নির্দিষ্ট CA সিস্টেমের জন্য একটি মিডিয়া CAS দৃষ্টান্ত তৈরি করুন। এর মানে হল মিডিয়া 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 সিস্টেমের জন্য ব্যক্তিগত তথ্য পাঠান। ব্যক্তিগত তথ্য CA বর্ণনাকারী, শর্তাধীন অ্যাক্সেস টেবিল, বা ব্যান্ড উত্সের বাইরে থেকে আসতে পারে। এটি একটি নির্দিষ্ট সেশনের সাথে যুক্ত নয়৷

    void setPrivateData(@NonNull byte[] data);
    
  • একটি EMM প্যাকেট প্রক্রিয়া করুন।

    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);
    
  • এনটাইটেলমেন্টের রিফ্রেশ ট্রিগার করুন। যখন একজন ব্যবহারকারী একটি নতুন চ্যানেলে সাবস্ক্রাইব করেন (উদাহরণস্বরূপ, একটি বিজ্ঞাপনে প্রতিক্রিয়া জানিয়ে বা ইলেকট্রনিক প্রোগ্রাম গাইড (EPG) এ একটি চ্যানেল যোগ করে), অ্যাপটি CA ক্লায়েন্টদের এনটাইটেলমেন্ট কী রিফ্রেশ করতে বলতে সক্ষম হবে।

    void refreshEntitlements(int refreshType);
    
  • মিডিয়া 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();
    
  • একটি CA সিস্টেমে একটি সেশন ইভেন্ট পাঠান। ইভেন্টের বিন্যাসটি স্কিমের জন্য নির্দিষ্ট এবং কাঠামোর জন্য অস্বচ্ছ।

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