zancadas zancada tres sirve sentadilla saber reemplazar recta que puntos plano para misma extension estan ejercicios ejercicio con como brazos alineados android encoding mediacodec

android - tres - Cómo obtener los valores de alineación de zancada y plano Y para el codificador MediaCodec



zancada lateral con sentadilla (1)

El problema en pocas palabras: no hubo pruebas de CTS para la codificación de video hasta Android 4.3 (API 18).

Como resultado, el comportamiento de MediaCodec en diferentes dispositivos fue inconsistente, y algunos errores pasaron desapercibidos. Las pruebas EncodeDecodeTest ejercen las funciones que usted está solicitando y, como resultado, puede alimentar confiablemente los datos de YUV a un dispositivo 4.3+ (aunque todavía tiene que detectar en tiempo de ejecución si desea planar o semiplanar).

Para su pregunta específica, el plano Y en los dispositivos Qualcomm anteriores debe alinearse en un límite de 2K, que no es exactamente lo que está haciendo su código. Para video de 720p esto sucede naturalmente (720 * 1280 == 450 * 2048), para 176x144 ajustarías en 1280 para iniciar el plano UV en 26624 en lugar de 25344. Debes establecer la alineación absoluta dentro del búfer, no una posición fija cantidad de relleno: use uvoffset = (width*height + 2047) & ~2047 .

Deberá detectar el proveedor del códec y la versión del software de Android, y si es Qualcomm en la versión anterior a la 4.3, debe realizar este ajuste. Si cambian sus requisitos y puede orientar la API 18+, estos problemas desaparecerán. (Y puede usar Surface entrada Surface en MediaCodec , lo que evita el problema del intercambio U / V, aunque depende de sus necesidades que pueden no ser útiles).

Hay algunas preguntas y discusiones relacionadas sobre este tema:

Estoy alimentando fotogramas de vista previa de cámara ( NV21 convertido a NV12 ) a codificador MediaCodec ( NV12 también COLOR_FormatYUV420SemiPlanar como COLOR_FormatYUV420SemiPlanar ). Parece que en algunos dispositivos con codificador QualComm que ejecutan versiones de Android inferiores a 4.3 , tengo que hacer algunos procesamientos de marcos de entrada para recibir un marco posterior con el color correcto.

En Sony Xperia ZR con Android 4.2.2 debo agregar la alineación del plano Y para que funcione en casi todas las resoluciones. El código anterior agrega alineación de 1024 bytes para anchos que no se pueden dividir por alineación de 2048 y 2048 bytes para otras resoluciones. Hace que MediaCodec codifique los fotogramas correctamente para todas las resoluciones que se pueden dividir por 16 (excepto 176x144 para los que el plano UV se ve desalineado).

int getYPadding() { if (mediaCodecInfo.getName().contains("OMX.qcom") && android.os.Build.VERSION.SDK_INT < 18) { if ((getWidth() % 32) != 0) { return (getWidth()*getHeight()) % 1024; } else { return (getWidth()*getHeight()) % 2048; } } return 0; }

Intenté probar esta alineación en LG G2 que ejecuta el mismo Android 4.2.2 y tiene el codificador QualComm , y parece que no funciona correctamente. UV plano UV está desalineado (una franja verde en la parte inferior del marco). No pude calcular el relleno que funcionará para ambos teléfonos.

También tengo acceso a Sony Xperia Z1 con Android 4.3 con chipset QualComm y parece que no tiene tales problemas. El video en cada resolución se ve bien y el plano Y no necesita alinearse de ninguna manera.

Entiendo que está relacionado con el hardware y puede ser complicado, pero dado que tengo que dar soporte a los usuarios que ejecutan Android antes del 4.3 , tengo una pregunta. ¿Es posible determinar programáticamente la alineación del plano en Y y los valores de zancada vertical / horizontal que codificador espera para el formato de color dado?