我一直在努力解决这个问题超过一个星期,很可能是一个错误的Qualcomm GPU /硬件视频编码器。因为我们被迫发布应用程序,并且他们的开发人员论坛没有提供任何反馈,我也在这里发布它,希望有人能够提供一些线索,或更好,一个解决方法,以便编码器中的错误未触发。
应用程序从Surface编码。当某些图像被渲染到表面时,编码器在同一位置(当当前正在编码的帧是关键帧时)失败(100%)。在崩溃点从编码器的Logcat输出(最后一行以非常高的速率重复):
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!
我可以通过在记录GL应用程序中替换绘图的两个几何形式绘制一个有问题的图像,全屏,在横向模式,并将比特率更改为更高的值(7Mbps),也可以复制它在Grafika。
编码器的崩溃发生在更大的比特率。
与Grafika,我测试和编码器崩溃的三星S4,国际版本和原来的Nexus 4.与我们的软件,这是一个比渲染平原图像复杂一点,它仍然崩溃两者。未在任何其他Adreno设备上测试。在三星S3,与Mali 400 GPU,它工作正常。
在4Mbps,我们的应用程序中的编码器仍然在S4和N4,但后来崩溃。 Grafika在N4在同一个地方,但不是在S4上崩溃。
编辑:根据下面的评论,它也可以在从缓冲区编码同一图像时再现。各种测试似乎缩小了条件以再现它:h264 hw编码器在高通设备上,编码许多帧的静态图像(这由于类似的帧而在编码器中确定非常低的比特率),在编码关键帧仅当编码某些图像时出现错误,其似乎具有更多细节,即,对于帧内编码需要许多比特)。