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

মিডিয়া কন্ডিশনাল অ্যাক্সেস সিস্টেমস (মিডিয়া সিএএস) ফ্রেমওয়ার্কটি ডিজিটাল কেবল, স্যাটেলাইট, টেরেস্ট্রিয়াল সিস্টেম এবং আইপিটিভি সিস্টেম সহ বিভিন্ন ডিজিটাল টিভি হার্ডওয়্যারে কন্ডিশনাল অ্যাক্সেস (সিএ) পরিষেবা সক্ষম করার জন্য স্ট্যান্ডার্ড এপিআই সরবরাহ করে। এই ফ্রেমওয়ার্কটি অ্যান্ড্রয়েড টিভি ইনপুট ফ্রেমওয়ার্ক এবং অ্যান্ড্রয়েড টিভি টিউনার ফ্রেমওয়ার্কের সাথে কাজ করে এবং টিভি ইনপুট সার্ভিস (টিআইএস) অ্যাপ থেকে কল করা যায় এমন জাভা এপিআই সরবরাহ করে।

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

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

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

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

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

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

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

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

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

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

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

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

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

টিউনার কনফিগারেশনের ডায়াগ্রাম।

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

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

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

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

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

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

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

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

CA টিউনিং ক্রম

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

CAS বিষয়বস্তু টিউনিং-এর ডায়াগ্রাম।

চিত্র ৩. CAS কন্টেন্ট টিউনিং

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

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

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

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

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

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

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

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

মিডিয়া সিএএস জাভা এপিআই

মিডিয়া সিএএস জাভা এপিআই-তে নিম্নলিখিত মেথডগুলো রয়েছে।

  • ডিভাইসে উপলব্ধ সমস্ত 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 সিস্টেমের জন্য ব্যক্তিগত ডেটা পাঠান। ব্যক্তিগত ডেটা 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);