เฟรมเวิร์กระบบการเข้าถึงแบบมีเงื่อนไขของสื่อ (Media CAS) มีมาตรฐาน API เพื่อเปิดใช้บริการการเข้าถึงแบบมีเงื่อนไข (CA) ในทีวีดิจิทัลประเภทต่างๆ ฮาร์ดแวร์ ซึ่งรวมถึงเคเบิลดิจิทัล ดาวเทียม ระบบภาคพื้นดิน และ IPTV ระบบต่างๆ เฟรมเวิร์กนี้จะทำงานร่วมกับ เฟรมเวิร์กอินพุตของ Android TV และเฟรมเวิร์ก Android TV Tuner การให้บริการ Java API ที่เรียกจากแอป TV Input Service (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 สามารถสื่อสารกับบริการบันไดฮาร์ดแวร์ที่ให้บริการโดย ที่มีการจัดการครบวงจรได้เลย เนื่องจากอินเทอร์เฟซเหล่านี้ซึ่งแตกต่างกันไปตามผู้ให้บริการ สื่อ CAS ไม่ได้ทำให้เป็นมาตรฐาน
การกำหนดค่าซอฟต์แวร์
ก่อน Android 11 เฟรมเวิร์ก CAS ของ Media อาจยัง ใช้ในการประมวลผลเนื้อหาที่ใช้ซอฟต์แวร์ เช่น 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 ไว้ในปลั๊กอิน จากนั้นระบบจะเปิดเซสชันใหม่ใน 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 ที่เข้ารหัส ระบบอาจโหลดคีย์และคำควบคุมที่เข้ารหัสลงใน ในการดำเนินการถอดรหัสคำควบคุมและ การอธิบายสตรีมเนื้อหา
CAS Java API สื่อ
Media CAS Java API มีเมธอดต่อไปนี้
แสดงรายการปลั๊กอิน CA ทั้งหมดที่มีอยู่ในอุปกรณ์
class MediaCas.PluginDescriptor { public String getName(); public int getSystemId(); } static PluginDescriptor[] enumeratePlugins();
สร้างอินสแตนซ์ Media CAS สำหรับระบบ CA ที่ระบุ ซึ่งหมายความว่า เฟรมเวิร์ก CAS ของสื่อสามารถจัดการระบบ 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);
ปิดออบเจ็กต์ Media CAS
void close();
เปิดเซสชัน
Session openSession(); Session openSession(@SessionUsage int sessionUsage, @ScramblingMode int scramblingMode);
ปิดเซสชันที่เปิดก่อนหน้านี้
void Session#close();
ระบุข้อมูลส่วนตัวของ CA จากข้อบ่งชี้ CA ใน PMT ซึ่งสามารถ จากหัวข้อข้อมูลโปรแกรมหรือส่วนข้อมูลสเปนไปยังเซสชัน 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);