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

Transcodificación de medios compatibles

La transcodificación de medios compatibles, introducida en Android 12, es una función que permite a los dispositivos usar formatos de medios más modernos y eficientes en almacenamiento para la captura de video, como HEVC, mientras se mantiene la compatibilidad con las aplicaciones. Con esta función, los fabricantes de dispositivos pueden usar HEVC en lugar de AVC de forma predeterminada para mejorar la calidad del video y reducir los requisitos de almacenamiento y ancho de banda. Para dispositivos con la transcodificación de medios compatible habilitada, Android puede convertir automáticamente videos (de hasta un minuto de duración) grabados en formatos como HEVC o HDR cuando los videos son abiertos por una aplicación que no admite el formato. Esto permite que las aplicaciones funcionen incluso cuando los videos se capturan en formatos más nuevos en el dispositivo.

La función de transcodificación de medios compatible está desactivada de forma predeterminada. Para solicitar la transcodificación de medios, las aplicaciones deben declarar sus capacidades de medios. Para obtener más información sobre las capacidades de los medios de comunicación que declaran, ver los medios de comunicación compatibles transcodificación en el sitio de desarrolladores de Android.

Cómo funciona

La función de transcodificación de medios compatibles consta de dos partes principales:

  • Transcodificación de servicios en el marco de los medios de comunicación: Estos servicios convertir archivos de un formato a otro utilizando el hardware de baja latencia y conversiones de alta calidad. Esto incluye la API de transcodificación, el servicio de transcodificación, un complemento OEM para filtros personalizados y hardware. Para más detalles, consulte Descripción de la arquitectura .
  • Soportes compatibles función de transcodificación de los proveedores de medios: Este componente se ha encontrado en los proveedores de medios intercepta apps para acceder a los archivos multimedia y sirve bien el archivo original o un archivo transcodificado basado en las capacidades declaradas de la aplicación. Si una aplicación admite el formato del archivo multimedia, no se requiere un manejo especial. Si una aplicación no admite el formato, el marco convierte el archivo a un formato más antiguo, como AVC, cuando la aplicación accede al archivo.

La Figura 1 muestra una descripción general del proceso de transcodificación de medios.

Proceso de transcodificación de medios compatibles

Figura 1. Visión general de la transcodificación de medios compatibles.

Formatos admitidos

La función de transcodificación de medios compatible admite las siguientes conversiones de formato:

  • HEVC (8 bits) para AVC: conversiones Codec se llevan a cabo a través de la conexión de un decodificador mediacodec y un codificador Mediacode.
  • HDR10 + (10-bit) para AVC (SDR): HDR a SDR conversiones se realizan utilizando casos mediacodec y un plugin gancho proveedor en los casos decodificador. Para obtener más información, consulte HDR a DEG codificación .

Fuentes de contenido admitidas

Los medios de comunicación compatibles admita la función de transcodificación en el dispositivo de medios generados por la aplicación nativa de la cámara del OEM que se almacena en el DCIM/Camera/ carpeta en el volumen externo primario. La función no admite medios en almacenamiento secundario. El contenido que se transmite a los dispositivos a través del correo electrónico o las tarjetas SD no es compatible.

Las aplicaciones acceden a los archivos basándose en varias rutas de archivo. A continuación, se describen las rutas de archivo en las que se habilita o se omite la transcodificación:

  • Transcodificación habilitada:

    • Acceso a la aplicación a través de las API de MediaStore
    • Acceso a la aplicación a través de API de ruta de archivo directa, incluido Java y código nativo
    • Acceso a la aplicación a través de Storage Access Framework (SAF)
    • Acceso a la aplicación a través de las intenciones de la hoja de recursos compartidos del sistema operativo. (Solo URI de MediaStore)
    • Transferencia de archivos MTP / PTP desde el teléfono a la PC
  • Transcodificación omitida:

    • Transferencia de archivos desde un dispositivo expulsando la tarjeta SD
    • Transferir archivos de un dispositivo a otro mediante opciones como Compartir cercano o transferencia Bluetooth.

Agregue rutas de archivo personalizadas para la transcodificación

Los fabricantes de dispositivos pueden añadir opcionalmente rutas de los archivos para los medios de transcodificación bajo la DCIM/ directorio. Cualquier ruta fuera de la DCIM/ directorio son rechazados. Es posible que sea necesario agregar tales rutas de archivo para cumplir con los requisitos del operador o las regulaciones locales.

Para añadir una ruta de archivo, utilice la ruta de transcodificación superposición de recursos en tiempo de ejecución (RRO) , config_supported_transcoding_relative_paths . El siguiente es un ejemplo de cómo agregar una ruta de archivo:

<string-array name="config_supported_transcoding_relative_paths" translatable="false">
    <item>DCIM/JCF/</item>
</string-array>

Para verificar las rutas de archivo configuradas, use:

adb shell dumpsys activity provider com.google.android.providers.media.module/com.android.providers.media.MediaProvider | head -n 20

Descripción general de la arquitectura

Esta sección describe la arquitectura de la función de transcodificación de medios.

arquitectura de transcodificación de medios

Figura 2. Medios transcodificación arquitectura.

La arquitectura de transcodificación de medios consta de los siguientes componentes:

  • MediaTranscodingManager sistema API: Interfaz que permite al cliente comunicarse con el servicio de MediaTranscoding. El Mediaprovider módulo utiliza esta API.
  • MediaTranscodingService: servicio nativo que gestiona las conexiones del cliente, horarios transcodificación de solicitudes, y gestiona la contabilidad para TranscodingSessions .
  • MediaTranscoder: biblioteca nativa que realiza la transcodificación. Esta biblioteca se construye en la parte superior de la NDK marco de los medios de comunicación para que sea compatible con los módulos .

La función de transcodificación de medios compatible registra las métricas de transcodificación tanto en el servicio como en el transcodificador de medios. El código del lado del cliente y del lado del servicio están en el módulo MediaProvider para permitir la corrección de errores y las actualizaciones oportunas.

Acceso a archivos

Transcodificación de medios Compatible se construye en la parte superior del sistema de archivos en el espacio de usuario de sistema de archivos (FUSE) , que se utiliza para el almacenamiento restringidos. FUSE permite que el módulo MediaProvider examine las operaciones de archivos en el espacio del usuario y controle el acceso a los archivos según la política para permitir, denegar o censurar el acceso.

Cuando una aplicación intenta acceder a un archivo, el demonio FUSE intercepta el acceso de lectura del archivo desde la aplicación. Si la aplicación admite un formato más nuevo (como HEVC), se devuelve el archivo original. Si la aplicación no admite el formato, el archivo se transcodifica a un formato anterior (como AVC) o se devuelve de la caché si hay una versión transcodificada disponible.

Solicitar archivos transcodificados

Los medios de comunicación compatibles función de transcodificación está desactivado por defecto, lo que significa que si el dispositivo es compatible con HEVC, Android no archivos de transcodificación menos que se especifique mediante una aplicación en un archivo de manifiesto o en la lista de la fuerza de transcodificación .

Las aplicaciones pueden solicitar activos transcodificados mediante las siguientes opciones:

  • Declare formatos no admitidos en el archivo de manifiesto. Para más detalles, ver las capacidades de declarar en un recurso y declarar las capacidades de código .
  • Añadir aplicaciones a la lista de transcodificación fuerza que se incluye en el Mediaprovider módulo. Esto permite la transcodificación de aplicaciones que no han actualizado su archivo de manifiesto. Una vez que una aplicación actualiza su archivo de manifiesto con formatos no compatibles, debe eliminarse de la lista de forzar transcodificación. Los fabricantes de dispositivos pueden nominar a ser añadidos o eliminados de la lista de transcodificación fuerza de sus aplicaciones por la presentación de un parche o por informar de un error . El equipo de Android revisa periódicamente la lista y puede eliminar aplicaciones de la lista.
  • Deshabilite los formatos admitidos con el marco de compatibilidad de la aplicación en tiempo de ejecución (los usuarios también pueden deshabilitar esto para cada aplicación en Configuración).
  • Abrir un archivo con MediaStore mientras especifica explícitamente formatos no soportados con la openTypedAssetFileDescriptor API.

Para las transferencias USB (dispositivo a la PC), transcodificación está desactivado por defecto pero los usuarios pueden optar por habilitar la transcodificación utilizando los videos Convertir a AVC de palanca en las Preferencias USB pantalla de configuración como se muestra en la Figura 3.

Alternar para habilitar la transcodificación de medios

Figura 3. Activar para activar medios de comunicación transcodificación en pantalla Preferencias de USB.

Restricciones para solicitar archivos transcodificados

Para evitar que las solicitudes de transcodificación bloqueen los recursos del sistema durante períodos prolongados, las aplicaciones que solicitan sesiones de transcodificación están limitadas a:

  • 10 sesiones consecutivas
  • un tiempo total de ejecución de tres minutos

Si una aplicación supera todas estas restricciones, el marco devuelve el descriptor de archivo original.

Requisitos del dispositivo

Para admitir la función de transcodificación de medios compatible, los dispositivos deben cumplir los siguientes requisitos:

  • El dispositivo tiene la codificación HEVC habilitada de forma predeterminada en la aplicación de cámara nativa
  • (Dispositivos que admiten la transcodificación de HDR a SDR) El dispositivo admite la captura de video HDR

Para garantizar el rendimiento del dispositivo para la transcodificación de medios, se debe optimizar el hardware de video y el rendimiento del acceso de lectura / escritura al almacenamiento. Cuando codecs de medios de comunicación se configuran con prioridad igual a 1 , los codecs deben operar en el más alto rendimiento posible. Recomendamos que el rendimiento de transcodificación alcance un mínimo de 200 fps. Para probar el rendimiento del hardware, realizar la prueba de transcodificación de medios en frameworks/av/media/libmediatranscoding/transcoder/benchmark .

Validación

Para validar la función de transcodificación de medios compatible, ejecute las siguientes pruebas CTS:

  • android.media.mediatranscoding.cts
  • android.mediaprovidertranscode.cts

Habilite la transcodificación de medios a nivel mundial

Para probar el marco de transcodificación de medios o el comportamiento de la aplicación con la transcodificación, puede habilitar o deshabilitar la función de transcodificación de medios compatible a nivel mundial. En la Configuración> Sistema> desarrollador> página de opciones de medios de desarrolladores de transcodificación, establece la transcodificación anular valores predeterminados de ajuste puedan y luego establecer el Habilitar la transcodificación de palanca de encendido o apagado. Si esta configuración está habilitada, la transcodificación de medios puede ocurrir en segundo plano para aplicaciones distintas a la que está desarrollando.

Verificar el estado de la transcodificación

Durante la prueba, puede usar el siguiente comando de shell ADB para verificar el estado de la transcodificación, incluidas las sesiones de transcodificación actuales y pasadas:

adb shell dumpsys media.transcoding

Extender la limitación de duración del video

Para propósitos de prueba, puede extender el límite de duración de video de un minuto para la transcodificación usando el siguiente comando. Es posible que sea necesario reiniciar después de ejecutar este comando.

adb shell device_config put storage_native_boot transcode_max_duration_ms <LARGE_NUMBER_IN_MS>

Fuente y referencias de AOSP

A continuación, se muestra el código fuente de AOSP relacionado con la transcodificación de medios compatibles.

Codificación HDR a SDR

Para apoyar HDR a DEG de codificación, los fabricantes de dispositivos pueden usar la muestra AOSP Codec filtro de 2,0 Plugin situado en /platform/frameworks/av/media/codec2/hidl/plugin/ . Esta sección describe cómo funciona el complemento de filtro, cómo implementar el complemento y cómo probar el complemento.

Si un dispositivo no incluye un complemento que admita la codificación HDR a SDR, una aplicación que accede a un video HDR obtiene el descriptor de archivo original independientemente de las capacidades multimedia de la aplicación declaradas en el manifiesto.

Cómo funciona

Esta sección describe el comportamiento general del complemento de filtro Codec 2.0.

Fondo

Android proporciona una implementación capa de adaptación entre el 2,0 Codec interfaz y el android.hardware.media.c2 interfaz HAL en android::hardware::media::c2 . Para los complementos de filtro, AOSP incluye un mecanismo de envoltura que envuelve los decodificadores junto con los complementos de filtro. MediaCodec reconoce estos componentes envueltos como decodificadores con características de filtrado.

Descripción general

El FilterWrapper clase toma codecs de proveedores y retornos codecs envueltos atrás a la media.c2 capa de adaptación. Los FilterWrapper cargas de clase libc2filterplugin.so a través de la FilterWrapper::Plugin API y registros de filtros disponibles desde el plugin. En la creación, FilterWrapper instancia todos los filtros disponibles. Solo los filtros que alteran el búfer se inician al inicio.

Arquitectura del complemento de filtro

Figura arquitectura de plugin 1. Filtro.

Interfaz de complemento de filtro

El FilterPlugin.h interfaz define las siguientes API para exponer los filtros:

  • std::shared_ptr<C2ComponentStore>getComponentStore()

    Devuelve una C2ComponentStore objeto que contiene filtros. Esto es independiente de lo que expone la implementación de Codec 2.0 del proveedor. Por lo general, esta tienda sólo contiene los filtros utilizados por Te FilterWrapper clase.

  • bool describe(C2String name, Descriptor *desc)

    Describe los filtros, además de lo que está disponible a partir C2ComponentStore . Se definen las siguientes descripciones:

    • controlParam : Los parámetros que controlan el comportamiento de los filtros. Por ejemplo, para el mapeador de tonos de HDR a SDR, el parámetro de control es la función de transferencia de destino.
    • affectedParams : Los parámetros que se ven afectados por las operaciones de filtrado. Por ejemplo, para el mapeador de tonos de HDR a SDR, los parámetros afectados son los aspectos de color.
  • bool isFilteringEnabled(const std::shared_ptr<C2ComponentInterface> &intf)

    Devuelve true si se altera el componente de filtro de la memoria intermedia. Por ejemplo, el filtro de tonos-mapping devuelve true si la función de transferencia de destino es SDR y la función de transferencia de entrada es HDR (GAN o PQ).

Detalles de FilterWrapper

La sección se describen los detalles de la FilterWrapper clase.

Creación

El componente envuelto instancia el decodificador subyacente y todos los filtros definidos en la creación.

Consulta y configuración

El componente empaquetado separa los parámetros entrantes de las consultas o solicitudes de configuración de acuerdo con la descripción del filtro. Por ejemplo, la configuración del parámetro de control de filtro se enruta al filtro correspondiente y los parámetros afectados de los filtros están presentes en las consultas (en lugar de leer desde el decodificador que tiene parámetros no afectados).

Consulta y configuración

Figura 2. Consulta y configuración.

Comienzo

Al principio, el componente envuelto inicia el decodificador y todos los filtros que alteran los búferes. Si no se habilita ningún filtro, el componente envuelto inicia el decodificador y los búferes de paso y envía comandos al decodificador mismo.

Manejo de búfer

Manejo de búfer

Manipulación Figura 3. Buffer.

Los búferes en cola del decodificador envuelto van al decodificador subyacente. El componente de envuelta agarra el búfer de salida desde el decodificador a través de un onWorkDone_nb() de devolución de llamada, y después se pone en cola a los filtros. El búfer de salida final del último filtro se informa al cliente.

Por esta manipulación para el trabajo búfer, el componente envuelto debe configurar C2PortBlockPoolsTuning al último filtro para que los buffers de salida marco de la piscina de bloque esperado.

Detener, reiniciar y soltar

En la parada, el componente envuelto detiene el decodificador y todos los filtros habilitados que se iniciaron. En el reinicio y lanzamiento, todos los componentes se reinician o liberan independientemente de si están habilitados o no.

Implementar el complemento de filtro de muestra

Para habilitar el complemento, haga lo siguiente:

  1. Implementar la FilterPlugin interfaz en una biblioteca y soltarlo en /vendor/lib[64]/libc2filterplugin.so.
  2. Añadir permisos adicionales a mediacodec.te si es necesario.
  3. Actualización de la capa de adaptación a Android 12 y reconstruir el media.c2 servicio.

Prueba el complemento

Para probar el complemento de muestra, haga lo siguiente:

  1. Reconstruya y actualice el dispositivo.
  2. Cree el complemento de muestra con el siguiente comando:

    m sample-codec2-filter-plugin
    
  3. Vuelva a montar el dispositivo y cambie el nombre del complemento del proveedor para que sea reconocido por el servicio de códec.

    adb root
    adb remount
    adb reboot
    adb wait-for-device
    adb root
    adb remount
    adb
    push /out/target/<...>/lib64/sample-codec2-filter-plugin.so \
    
    /vendor/lib64/libc2filterplugin.so
    adb push
    /out/target/<...>/lib/sample-codec2-filter-plugin.so \
    
    /vendor/lib/libc2filterplugin.so
    adb reboot