เฟรมเวิร์กระบบการเข้าถึงแบบมีเงื่อนไขของ Media (Media CAS) มี API มาตรฐานเพื่อเปิดใช้บริการการเข้าถึงแบบมีเงื่อนไข (CA) ในฮาร์ดแวร์ทีวีดิจิทัลที่หลากหลาย ซึ่งรวมถึงเคเบิลดิจิทัล ดาวเทียม ระบบภาคพื้นดิน และระบบ IPTV เฟรมเวิร์กนี้ทำงานร่วมกับเฟรมเวิร์กอินพุต Android TV และเฟรมเวิร์กตัวรับสัญญาณ Android TV โดยให้บริการ Java API ที่เรียกใช้จากแอปบริการอินพุตทีวี (TIS)
วัตถุประสงค์หลักของ CAS สื่อมีดังต่อไปนี้
- จัดเตรียม Java API สาธารณะและเฟรมเวิร์กปลั๊กอินแบบเนทีฟที่นักพัฒนาซอฟต์แวร์บุคคลที่สามและ OEM สามารถใช้เพื่อรองรับ CAS สำหรับการออกอากาศทีวีใน Android
- ให้บริการเฟรมเวิร์ก CAS ภายใน Android ซึ่งช่วยให้ OEM ของ ATV ทำงานร่วมกันกับผู้ให้บริการ CAS หลายรายได้อย่างสอดคล้องกัน
- รองรับผู้ให้บริการ CAS บุคคลที่สามหลายรายที่ใช้ปลั๊กอินที่มาพร้อมเครื่อง ปลั๊กอิน CAS อาจใช้โปรโตคอลเครือข่ายเฉพาะของผู้ให้บริการ รูปแบบข้อความการจัดการการให้สิทธิ์ (EMM)/ข้อความควบคุมการให้สิทธิ์ (ECM) และโปรแกรมถอดรหัส
- รองรับการรักษาความปลอดภัยด้วยฮาร์ดแวร์ เช่น บันไดลิง
- รองรับสภาพแวดล้อมการดำเนินการที่เชื่อถือได้ (TEE) เช่น TrustZone
การกำหนดค่าที่รองรับ
การกำหนดค่าตัวรับสัญญาณฮาร์ดแวร์
หากฮาร์ดแวร์มีหน้าที่ในการถอดรหัสและถอดรหัสสตรีมการส่งแบบ MPEG ใน เฟรมเวิร์กของ Tuner จะให้ข้อมูลเฉพาะโปรแกรมการเข้าถึงแบบมีเงื่อนไข (PSI) ไปยังแอป TIS เพื่อติดต่อกับตัวรับสัญญาณทีวีที่ใช้ฮาร์ดแวร์
ข้อมูล PSI ของการเข้าถึงแบบมีเงื่อนไขประกอบด้วยข้อบ่งชี้ CA, ECM และ EMM โครงสร้างเหล่านี้ช่วยให้ปลั๊กอิน CAS รับคีย์ที่จำเป็นในการถอดรหัสสตรีมเนื้อหาได้
รูปที่ 1 การกำหนดค่าตัวรับสัญญาณฮาร์ดแวร์
การกำหนดค่าฮาร์ดแวร์อาจมีเลเยอร์ TEE เช่น TrustZone ดังที่แสดงในรูปที่ 1 หากไม่มีเลเยอร์ TEE ปลั๊กอินไคลเอ็นต์ CAS จะสื่อสารกับบริการบันไดคีย์ฮาร์ดแวร์ที่แพลตฟอร์มมีให้ เนื่องจากอินเทอร์เฟซเหล่านี้ในรูปแบบเฉพาะผู้ให้บริการ ทำให้ Media CAS ไม่ได้ทำให้อินเทอร์เฟซเหล่านี้เป็นไปตามมาตรฐาน
การกำหนดค่าซอฟต์แวร์
ก่อน Android 11 เฟรมเวิร์ก Media CAS ยังคงใช้ประมวลผลเนื้อหาที่ทำงานด้วยซอฟต์แวร์ได้ เช่น IPTV จาก IP multicast/unicast แอป TIS มีหน้าที่ในการสร้างอินสแตนซ์และจัดสรรออบเจ็กต์ Media CAS Java อย่างถูกต้อง
แอปอาจใช้ MediaExtractor หรือโปรแกรมแยกวิเคราะห์ MPEG2-TS อื่นๆ เพื่อดึงข้อมูล PSI ที่เกี่ยวข้องกับ CA เช่น ตัวบ่งชี้ CA, ECM และ EMM หากแอปใช้เฟรมเวิร์ก MediaExtractor แอปอาจมอบสิทธิ์การจัดการเซสชัน CAS เช่น การเปิดเซสชันและการประมวลผล EMM/ECM ให้กับเฟรมเวิร์ก MediaExtractor ได้ จากนั้น MediaExtractor จะกําหนดค่าเซสชัน CAS โดยใช้ API เดิมโดยตรง
ไม่เช่นนั้น แอปจะต้องรับผิดชอบในการดึงข้อมูล PSI ที่เกี่ยวข้องกับ CA และการกำหนดค่าเซสชัน CAS โดยใช้ Media CAS Java API (เช่น เมื่อแอปใช้โปรแกรมแยกวิเคราะห์ MPEG2-TS ของตัวเอง)
รูปที่ 2 การกำหนดค่าอินพุต IPTV, CAS และโปรแกรมถอดรหัสโดยใช้เฟรมเวิร์ก MediaExtractor
ในสถานการณ์เครื่องมือแยกซอฟต์แวร์ เครื่องมือแยกข้อมูลต้องใช้ซอฟต์แวร์หรือออบเจ็กต์เดสแครมเบลอร์ที่ใช้ฮาร์ดแวร์สำหรับแต่ละแทร็กที่มีสัญญาณรบกวน ไม่ว่าแทร็กจะเรียกใช้ตัวถอดรหัสที่ปลอดภัยหรือไม่ก็ตาม เนื่องจากสาเหตุต่อไปนี้
- หากแทร็กไม่จำเป็นต้องมีการถอดรหัสที่ปลอดภัย เครื่องมือแยกข้อมูลจะถอดรหัสหน่วยการเข้าถึงเพื่อล้างบัฟเฟอร์และแยกตัวอย่างราวกับว่ามาจากสตรีมที่ชัดเจน วิธีนี้ช่วยให้
MediaCodec
ไม่ต้องมีส่วนร่วมในการถอดรหัส หากแทร็กต้องมีการถอดรหัสที่ปลอดภัย เครื่องมือแยกไฟล์อาจยังคงต้องใช้โปรแกรมถอดรหัส ซึ่งจะเกิดขึ้นเมื่อสตรีมการรับส่งข้อมูลมีสัญญาณรบกวนที่ระดับแพ็กเก็ตการขนส่ง ซึ่งมีสัญญาณรบกวนส่วนหัวสตรีมพื้นฐาน (PES) ที่มีแพ็กเก็ต เครื่องมือแยกข้อมูลจำเป็นต้องเข้าถึงส่วนหัวของ PES เพื่อรวบรวมข้อมูลบางอย่างที่ดาวน์สตรีม (เช่น การประทับเวลาของงานนำเสนอ)
เครื่องมือแยกข้อมูลจะไม่ใช้เครื่องมือถอดรหัสหากสตรีมการนำส่งมีสัญญาณรบกวนที่ระดับแพ็กเก็ต PES ที่ส่วนหัว PES ไม่ชัดเจน อย่างไรก็ตาม คุณจะยืนยันไม่ได้ว่าการสับสนเกิดขึ้นเมื่อใดจนกว่าแพ็กเก็ตที่มีการสับสนจริงจะมาถึง เพื่อให้เข้าใจได้ง่าย ให้สมมติว่ามีการใช้เดสแครมเบลอ หากมีการพิจารณาแล้วว่าแทร็กมีสัญญาณรบกวนตามตารางการแมปโปรแกรม (PMT)
ข้อจำกัดในการกำหนดค่าซอฟต์แวร์
เมื่อแทร็กต้องการการถอดรหัสแบบปลอดภัย เครื่องมือถอดรหัสต้องใช้ความระมัดระวังเมื่อให้การดำเนินการถอดรหัสเป็นบัฟเฟอร์ที่ชัดเจน เนื่องจากต้องมีการถอดรหัสเสียงที่ไม่ปลอดภัย หากการถอดรหัสวิดีโอต้องใช้โปรแกรมถอดรหัสที่ไม่ปลอดภัย ก็ควรมีการสับเปลี่ยนรหัสในเซสชันอื่นจากเสียง ECM สำหรับเซสชันต้องส่งสัญญาณให้ปลั๊กอินทราบว่าจำเป็นต้องใช้ตัวถอดรหัสที่ปลอดภัย
หรือปลั๊กอินต้องสามารถเชื่อมโยงคีย์กับนโยบายความปลอดภัยได้อย่างน่าเชื่อถือ ไม่เช่นนั้น แอปจะดึงเฟรมวิดีโอได้อย่างง่ายดายด้วยโปรแกรมถอดรหัสเสียง
แม้ว่าเซสชันจะต้องใช้โปรแกรมถอดรหัสที่ปลอดภัย แต่ตัวแยกข้อมูลอาจขอให้ส่งออกข้อมูลเพียงเล็กน้อยเพื่อล้างบัฟเฟอร์เพื่อประมวลผลส่วนหัว PES เพื่อป้องกันไม่ให้แอปที่เป็นอันตรายสร้างปลั๊กอินคืนหน่วยการเข้าถึงทั้งหมด ปลั๊กอินจะต้องแยกวิเคราะห์เพย์โหลดการรับส่งข้อมูลเพื่อให้มั่นใจว่าเพย์โหลดเริ่มต้นด้วยส่วนหัว PES ของประเภทสตรีมที่เหมาะสม ไม่เช่นนั้น ปลั๊กอินควรปฏิเสธคำขอ
ลำดับการปรับ CA
เมื่อปรับช่องใหม่ โมดูล TIS จะลงทะเบียนเพื่อรับข้อบ่งชี้ CA, ECM และ EMM จากเฟรมเวิร์ก PSI Tuner ข้อบ่งชี้ CA มีรหัสระบบ CA ซึ่งระบุผู้ให้บริการ CA ที่เฉพาะเจาะจงและข้อมูลเฉพาะผู้ให้บริการอื่นๆ TIS จะค้นหา Media CAS เพื่อดูว่ามีปลั๊กอิน CAS ที่จัดการข้อบ่งชี้ CA ได้หรือไม่
รูปที่ 3 การปรับแต่งเนื้อหา CAS
หากระบบรองรับรหัส CA ระบบจะสร้างอินสแตนซ์ของ Media CAS และส่งข้อมูลส่วนตัวของผู้ให้บริการจากข้อบ่งชี้ CA ไปยังปลั๊กอิน จากนั้นระบบจะเปิดเซสชันใหม่ใน Media CAS เพื่อจัดการสตรีมเสียงและวิดีโอ เซสชันที่เปิดใหม่จะได้รับ ECM และ EMM สำหรับปลั๊กอิน
ตัวอย่างโฟลว์ปลั๊กอิน CAS
TIS จะส่ง ECM ไปยังปลั๊กอิน CAS โดยใช้ Media CAS API ECM มีคำควบคุมที่เข้ารหัส ซึ่งต้องถอดรหัสโดยใช้ข้อมูลจาก EMM ปลั๊กอิน CAS จะกำหนดวิธีรับ EMM สำหรับเนื้อหาโดยอิงตามข้อมูลเฉพาะของผู้ให้บริการในข้อบ่งชี้ CA ซึ่งได้จากเมธอด setPrivateData()
EMM อาจส่งในแบนด์ของสตรีมเนื้อหาหรือนอกแบนด์โดยใช้คำขอเครือข่ายที่เริ่มต้นโดยปลั๊กอิน CA TIS จะใช้เมธอด processEMM()
เพื่อส่ง EMM ในย่านความถี่ไปยังปลั๊กอิน CA
หากต้องใช้คําขอเครือข่ายเพื่อรับ EMM ปลั๊กอิน CA จะมีหน้าที่รับผิดชอบในธุรกรรมเครือข่ายกับเซิร์ฟเวอร์ใบอนุญาต
รูปที่ 4 ตัวอย่างปลั๊กอิน CAS สำหรับการดำเนินการ EMM และ ECM
เมื่อได้รับ EMM แล้ว ปลั๊กอิน CA จะแยกวิเคราะห์เพื่อรับคีย์ที่เข้ารหัสไว้เพื่อถอดรหัสคำควบคุม ระบบอาจโหลดคีย์ EMM ที่เข้ารหัสและคำควบคุมที่เข้ารหัสลงในบันไดคีย์หรือสภาพแวดล้อมที่เชื่อถือได้เพื่อถอดรหัสคำควบคุมและการถอดรหัสสตรีมเนื้อหาที่ตามมา
Media CAS Java API
Media CAS Java API มีเมธอดต่อไปนี้
แสดงรายการปลั๊กอิน CA ทั้งหมดที่ใช้ได้บนอุปกรณ์
class MediaCas.PluginDescriptor { public String getName(); public int getSystemId(); } static PluginDescriptor[] enumeratePlugins();
สร้างอินสแตนซ์ Media CAS สำหรับระบบ CA ที่ระบุ ซึ่งหมายความว่าเฟรมเวิร์ก CAS ของ Media สามารถจัดการระบบ CAS หลายระบบพร้อมกันได้
MediaCas(int CA_system_id); MediaCas(@NonNull Context context, int casSystemId, @Nullable String tvInputServiceSessionId, @PriorityHintUseCaseType int priorityHint);
ลงทะเบียน Listener เหตุการณ์และอนุญาตให้แอประบุเครื่องจัดการที่ใช้ลูป
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();
ระบุข้อมูลส่วนตัวของ CA จากข้อบ่งชี้ CA ใน PMT ซึ่งสามารถส่งจากส่วนข้อมูลโปรแกรมหรือข้อมูล 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);