私はこの問題に1週間以上苦労してきましたが、おそらく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!
GrafikaRecord GL appで、2つの幾何学的形状の描画を次のように置き換えるだけで複製できます。問題のある画像の1つを全画面で横向きモードで描画し、ビットレートをより高い値(7Mbps)に変更します。ビットレートが大きいほど、エンコーダーのクラッシュが早く発生します。
これは簡単に壊れそうな image の1つであり、必要な変更を加えた RecordFBOActivity.Java です。
Grafikaを使用してテストしたところ、Samsung S4、国際バージョン、および元のNexus 4の両方でエンコーダーがクラッシュしました。プレーンイメージのレンダリングよりも少し複雑なソフトウェアを使用すると、両方でクラッシュします。他のAdrenoデバイスではテストしませんでした。 Mali 400GPUを搭載したSamsungS3では、正常に動作します。
4Mbpsでも、アプリケーションのエンコーダーはS4とN4の両方でクラッシュしますが、それ以降です。 Grafikaは同じ場所のN4でクラッシュしますが、S4ではクラッシュしません。
編集:以下のコメントによると、バッファから同じ画像をエンコードする場合にも再現できます。さまざまなテストにより、それを再現する条件が狭められているようです。Qualcommデバイスのh264 hwエンコーダー、多くのフレームの静止画像のエンコード(これにより、フレームが類似しているため、エンコーダーのビットレートが非常に低くなります)、キーフレームのエンコード中にエラーが発生します(エラーは、特定の画像をエンコードする場合にのみ表示されます。特定の画像は、より詳細に見えるため、つまり、イントラコーディングに多くのビットが必要です。
前述のようにバグのようです。