gflops all adreno android video-encoding mediacodec

android - all - gpu qualcomm adreno 506



El codificador se bloquea en la GPU Adreno al codificar desde Surface (1)

He estado luchando con este problema durante más de una semana, y lo más probable es que sea un error en el codificador de video de hardware / GPU Qualcomm . Dado que estamos presionados para lanzar la aplicación, y sus foros de desarrolladores no proporcionaron ningún comentario, también lo publico aquí, esperando que alguien pueda proporcionar algunas pistas, o incluso mejor, una solución para que el error en el codificador sea No activado.

La aplicación codifica desde una superficie. Cuando ciertas imágenes se muestran en la superficie, el codificador falla (100%) en el mismo lugar (cuando el cuadro que se codifica actualmente es un cuadro clave). La salida de Logcat del codificador en el punto del bloqueo es (con las últimas líneas repetidas a una velocidad muy alta):

11-26 11:41:33.312: E/OMX-VENC-720p(25949): ERROR: async_msg_process() - Error statuscode = 1 11-26 11:41:33.312: E/ACodec(29317): [OMX.qcom.video.encoder.avc] ERROR(0x80001009) 11-26 11:41:33.312: E/MediaCodec(29317): Codec reported an error. (omx error 0x80001009, internalError -2147483648) 11-26 11:41:33.362: E/OMX-VENC-720p(25949): ERROR: venc_use_buf:set input buffer failed 11-26 11:41:33.362: E/OMX-VENC-720p(25949): ERROR: in dev_use_buf 11-26 11:41:33.362: E/OMX-VENC-720p(25949): ERROR: empty_buffer_done() failed! 11-26 11:41:33.372: E/OMX-VENC-720p(25949): m_fbd_count at o/p flush = 306 11-26 11:41:33.372: E/OMX-VENC-720p(25949): m_etb_count at i/p flush = 313 11-26 11:41:33.372: E/OMX-VENC-720p(25949): ERROR: ioctl VEN_IOCTL_CMD_FILL_OUTPUT_BUFFER failed 11-26 11:41:33.372: E/OMX-VENC-720p(25949): ERROR: dev_fill_buf() Failed 11-26 11:41:33.372: E/OMX-VENC-720p(25949): ERROR: FTBProxy() failed!

Puedo replicarlo también en Grafika simplemente reemplazando en la aplicación Record GL el dibujo de dos formas geométricas con el dibujo de una de las imágenes problemáticas, a pantalla completa, en modo horizontal, y cambiando la tasa de bits a un valor más alto (7Mbps). El bloqueo del codificador ocurre antes para una tasa de bits mayor.

Aquí hay una image que parece romperla fácilmente y aquí está RecordFBOActivity.java con los cambios requeridos.

Con Grafika, probé y el codificador falla tanto en Samsung S4, versión internacional, como en el Nexus 4. original Con nuestro software, que es un poco más complejo que renderizar la imagen simple, todavía falla en ambos. No probé en ningún otro dispositivo Adreno. En Samsung S3, con una GPU Mali 400, funciona bien.

A 4Mbps, el codificador en nuestra aplicación todavía falla tanto en S4 como en N4, pero más tarde. Grafika se bloquea en N4 en el mismo lugar, pero no en S4.

EDITAR: Según los comentarios a continuación, también se puede reproducir al codificar la misma imagen desde el búfer. Varias pruebas parecen limitar las condiciones para reproducirlo en: codificador h264 hw en dispositivos Qualcomm, codificando una imagen fija para muchos cuadros (esto determina tasas de bits muy bajas en el codificador debido a cuadros similares), aparece un error al codificar un cuadro clave (el El error aparece solo al codificar ciertas imágenes, que parecen tener más detalles, es decir, necesitan muchos bits para la codificación intra).


Parece ser un error como se indicó anteriormente.