Google se compromete a impulsar la igualdad racial para las comunidades afrodescendientes. Obtén información al respecto.

Marco CAS

El marco de los sistemas de acceso condicional de medios (Media CAS) proporciona API estándar para habilitar servicios de acceso condicional (CA) en una variedad de hardware de televisión digital, incluidos sistemas de cable digital, satélite, terrestres y sistemas de IPTV. Las obras marco con el marco de entrada de TV Android y marco Android sintonizador de TV , que proporciona Java API invocan desde la aplicación de servicio de entrada de TV (TIS).

Los principales objetivos de Media CAS son los siguientes.

  • Proporcione una API de Java pública y un marco de complemento nativo que puedan usar los desarrolladores de terceros y los OEM para admitir CAS para la transmisión de TV en Android.
  • Proporcione un marco de CAS dentro de Android que permita a los OEM de ATV interactuar con una variedad de proveedores de CAS de manera coherente.
  • Admite varios proveedores de CAS de terceros mediante complementos nativos. Los complementos CAS pueden utilizar protocolos de red específicos del proveedor, formatos de mensajes de gestión de derechos (EMM) / mensajes de control de derechos (ECM) y decodificadores.
  • Apoye la seguridad del hardware, como escaleras con llave.
  • Admite entornos de ejecución de confianza (TEE) como TrustZone.

Configuraciones admitidas

Configuración del sintonizador de hardware

Si el hardware es responsable del transporte MPEG demultiplexación arroyo y descifrado, marco sintonizador ofrece acceso condicional de información de programas específicos (PSI) de datos para la aplicación de TIS con el fin de interactuar con sintonizadores de televisión basadas en hardware.

Los datos de PSI de acceso condicional incluyen descriptores de CA, ECM y EMM. Estas estructuras permiten que el complemento CAS obtenga las claves necesarias para descifrar los flujos de contenido.

Diagrama de la configuración del sintonizador de hardware.

Figura configuración del sintonizador 1. Hardware

La configuración de hardware puede tener una capa TEE, como TrustZone, que se ilustra en la Figura 1. Si no hay una capa TEE, un complemento de cliente CAS puede comunicarse con los servicios de escalera de claves de hardware proporcionados por la plataforma. Debido a las variaciones específicas del proveedor de estas interfaces, Media CAS no las estandariza.

Configuración de software

Antes de Android 11, el marco Media CAS todavía podía usarse para procesar contenido basado en software, como IPTV desde IP multidifusión / unidifusión. La aplicación TIS es responsable de crear instancias y aprovisionar correctamente el objeto Java de Media CAS.

La aplicación puede usar MediaExtractor u otros analizadores MPEG2-TS para extraer datos de PSI relacionados con CA, como descriptores de CA, ECM y EMM. Si la aplicación utiliza el marco MediaExtractor, puede delegar la gestión de la sesión CAS, como abrir una sesión y procesar EMM / ECM, al marco MediaExtractor. MediaExtractor luego configura la sesión CAS usando la API nativa directamente.

De lo contrario, la aplicación es responsable de extraer los datos de PSI relacionados con CA y de configurar la sesión CAS utilizando las API de Media CAS Java (por ejemplo, cuando la aplicación utiliza su propio analizador MPEG2-TS).

Diagrama de la configuración del sintonizador.

Entrada Figura 2. IPTV, CAS, y la configuración desaleatorizador usando el MediaExtractor marco

En el escenario del extractor de software, el extractor requiere un objeto decodificador basado en software o hardware para cada pista codificada, independientemente de si la pista requiere decodificadores seguros. Esto se debe a lo siguiente.

  • Si la pista no requiere una decodificación segura, el extractor decodifica la unidad de acceso para borrar los búferes y extrae muestras como si fueran de una secuencia clara. De esta manera MediaCodec no necesita estar involucrado en la descodificación.
  • Si la pista requiere una decodificación segura, es posible que el extractor aún necesite un decodificador. Esto sucede cuando el flujo de transporte se codifica en el nivel del paquete de transporte, donde se codifica el encabezado del flujo elemental en paquetes (PES). El extractor necesita acceder al encabezado PES para transmitir cierta información (por ejemplo, la marca de tiempo de la presentación).

    El extractor no utiliza el desaleatorizador si el flujo de transporte se codifica en el nivel del paquete PES, donde el encabezado PES se deja en blanco. Sin embargo, no es posible confirmar cuándo ocurre la codificación hasta que llega el paquete codificado real. Para simplificar, suponga que se utiliza un desaleatorizador si se determina que la pista está codificada según la tabla de mapeo del programa (PMT).

Limitaciones de la configuración del software

Cuando la pista requiere una decodificación segura, el decodificador debe tener cuidado al permitir una operación de decodificación en búferes limpios. Debido a que se requiere una decodificación de audio insegura, si la decodificación de video requiere decodificadores seguros, debe codificarse en una sesión diferente a la del audio. El ECM de la sesión debe indicar al complemento que se requiere un decodificador seguro.

Alternativamente, el complemento debe poder vincular de manera confiable una clave a su política de seguridad. De lo contrario, la aplicación puede obtener fácilmente fotogramas de video con el decodificador de audio.

Incluso cuando la sesión requiere un decodificador seguro, el extractor puede pedirle que genere una pequeña cantidad de datos para borrar los búferes para procesar el encabezado PES. Para evitar que una aplicación maliciosa haga que el complemento devuelva la unidad de acceso completa, el complemento debe analizar la carga útil de transporte para asegurarse de que la carga útil comience con un encabezado PES del tipo de flujo adecuado. De lo contrario, el complemento debería rechazar la solicitud.

Secuencia de sintonización de CA

Al sintonizar un nuevo canal, el módulo TIS se registra para recibir descriptores de CA, ECM y EMM del marco de sintonizador PSI. Un descriptor de CA contiene el ID del sistema de CA, que identifica de forma única a un proveedor de CA específico y otros datos específicos del proveedor. TIS consulta Media CAS para determinar si existe un complemento CAS que pueda manejar el descriptor de CA.

Diagrama de ajuste de contenido CAS.

Contenido Figura 3. Sintonización CAS

Si se admite el ID del sistema de CA, se crea una instancia de Media CAS y se proporcionan al complemento los datos privados del proveedor del descriptor de CA. Luego, se abren nuevas sesiones en Media CAS para manejar las transmisiones de audio y video. Las sesiones recién abiertas reciben ECM y EMM para el complemento.

Flujo de complemento CAS de muestra

TIS entrega ECM al complemento CAS mediante las API de Media CAS. Un ECM contiene la palabra de control cifrada, que debe descifrarse utilizando información de un EMM. El plugin CAS determina cómo adquirir un EMM para el activo basándose en la información específica del proveedor en el descriptor de CA, que es proporcionada por la setPrivateData() método.

Los EMM pueden entregarse en banda en el flujo de contenido o fuera de banda mediante una solicitud de red iniciada por el complemento de CA. TIS utiliza el processEMM() método para entregar cualquier EMM en banda al plugin CA.

Si se requiere una solicitud de red para obtener un EMM, el complemento CA es responsable de realizar la transacción de red con un servidor de licencias.

Diagrama de un CAS de ejemplo.

Plugin Figura 4. Ejemplo CAS para EMM y el procesamiento de ECM

Cuando se recibe el EMM, el complemento de CA lo analiza para obtener la clave cifrada para descifrar la palabra de control. La clave EMM cifrada y la palabra de control cifrada pueden cargarse en una escalera de claves o en un entorno de confianza para realizar el descifrado de la palabra de control y el posterior descifrado del flujo de contenido.

Media CAS API de Java

La API de Media CAS Java contiene los siguientes métodos.

  • Enumere todos los complementos de CA disponibles en el dispositivo.

    class MediaCas.PluginDescriptor {
      public String getName();
      public int getSystemId();
    }
    static PluginDescriptor[] enumeratePlugins();
    
  • Construya una instancia de Media CAS para el sistema de CA especificado. Esto significa que el marco Media CAS puede manejar varios sistemas CAS simultáneamente.

    MediaCas(int CA_system_id);
    MediaCas(@NonNull Context context, int casSystemId,
             @Nullable String tvInputServiceSessionId,
             @PriorityHintUseCaseType int priorityHint);
    
  • Registre un detector de eventos y permita que la aplicación especifique un controlador cuyo looper se utilice.

    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);
    
  • Envíe los datos privados para el sistema CA. Los datos privados pueden provenir del descriptor de CA, la tabla de acceso condicional o fuentes fuera de banda. Esto no está asociado con una sesión en particular.

    void setPrivateData(@NonNull byte[] data);
    
  • Procesar un paquete EMM.

    void processEmm(@NonNull byte[] data, int offset, int length);
    
  • Envíe un evento a un sistema CA. El formato del evento es específico del esquema y opaco al marco.

    void sendEvent(int event, int arg, @Nullable byte[] data);
    
  • Inicie una operación de aprovisionamiento del tipo especificado para un sistema de CA. Cuando un dispositivo se suscribe a un servicio de televisión de pago por primera vez, primero debe aprovisionarse en el servidor CAS. Proporcione un conjunto de parámetros relacionados al dispositivo para el aprovisionamiento.

    void provision(String provisionString);
    
  • Active una actualización de derechos. Cuando un usuario se suscribe a un nuevo canal (por ejemplo, respondiendo a un anuncio o agregando un canal en la guía electrónica de programas (EPG)), la aplicación debería poder decirle a los clientes de CA que actualicen las claves de derechos.

    void refreshEntitlements(int refreshType);
    
  • Cierre el objeto Media CAS.

    void close();
    
  • Abra una sesión.

    Session openSession();
    Session openSession(@SessionUsage int sessionUsage, @ScramblingMode int scramblingMode);
    
  • Cierre una sesión abierta anteriormente.

    void Session#close();
    
  • Proporcione los datos privados de CA desde un descriptor de CA en el PMT, que puede ser de la información del programa o de la sección de información de ES, a una sesión de CAS.

    void Session#setPrivateData(@NonNull byte[] sessionId, @NonNull byte[] data);
    
  • Procese un paquete ECM para una sesión.

    void Session#processEcm(@NonNull byte[] data, int offset, int length);
    
  • Obtén el ID de la sesión.

    byte[] Session#getSessionId();
    
  • Envíe un evento de sesión a un sistema de CA. El formato del evento es específico del esquema y es opaco al marco.

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