Adreno GPU上的编码器崩溃,同时从Surface进行编码

我一直在为这个问题苦苦挣扎了一个多星期,很可能这是Qualcomm GPU /硬件video编码器中的一个错误。 由于我们被迫发布应用程序,他们的开发者论坛没有提供任何反馈,所以我也在这里发布,希望有人能够提供一些线索,甚至更好的解决方法,以便编码器中的错误是没有触发。

该应用程序从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! 

我可以在Grafika上复制它, 方法是在Record GL应用程序中简单地replace两个几何形状的绘图,使用横向模式画全景图,然后将比特率更改为更高的值(7Mbps)。 编码器的崩溃发生得越早,对于更大的比特率。

这是一个似乎很容易打破它的形象 ,这是RecordFBOActivity.java与所需的更改。

随着Grafika,我testing和编码器崩溃在三星S4,国际版本,并在原来的Nexus 4.与我们的软件,这比渲染一个简单的图像更复杂一点,它仍然崩溃的两个。 没有在任何其他Adreno设备上testing。 在三星S3,与马里400 GPU,它工作正常。

在4Mbps,我们的应用程序中的编码器仍然在S4和N4,但后来崩溃。 Grafika在N4在同一个地方崩溃,但不是在S4。

编辑:根据下面的评论,它也可以从缓冲区编码相同的图像时再现。 在Qualcomm设备上的h264hw编码器上,各种testing似乎都缩小了条件,以便为多帧编码静止图像(由于类似的帧,编码器会确定非常低的比特率),编码关键帧时会出现错误错误只在编码某些图像时出现,这些图像似乎有更多的细节,即需要多个位来进行帧内编码)。

这似乎是一个如前所述的错误。