1

私は GStreamer-java をいじろうとしていますが、これは Android の h.264 エンコーダー (x264enc) です。

ここで、テスト ビデオ ソースから未加工のビデオをエンコードしようとしました (そのis-liveプロパティをTRUEに設定)。データが x264enc 要素に流れ始めると、libx264.so で SIGSEGV が取得され、アプリがクラッシュします。そして、コードが NULL を逆参照しているように見えます...正確なエラーの場所は、ファイル「gstreamer_ndk_bundle/x264/encoder/analyse.c」の 963 行目です。そして、この行です。

h->mc.memcpy_aligned( h->mb.pic.i8x8_dct_buf, h->dct.luma8x8, sizeof(h->mb.pic.i8x8_dct_buf) );

私のデバイスの CPU は Cortex 8 で、NEON 機能を備えています...

すべての構造体フィールドをファイルに出力しようとしましたhが、初期化されていないフィールドはありません。

LogCat からの Android DEBUG 情報: HERE

私の質問:

  1. このコード行は問題ないように見えるので、SIGSEGV をスローしているものをどのように知ることができますか?
  2. これは既知のバグですか、または ARM CPU 上の x264 エンコーダーの予想される動作ですか? または、エンコーダーの構成が不足していますか?
  3. エンコーダーのプロパティ分析を0x3:0x113 (オンラインで見つけたランダムな値) に設定すると、SIGSEGV が取得されず、エンコーダーが動作しているように見えますが、パイプラインでエラーが発生することに気付きました: Data flow error分析を意味のある値に設定することはできますか?

アップデート

x264_mb_analyse_intra() 関数で実行が実行される直前、およびそれが壊れる行の直前に、すべての重要な「h」フィールドを fprintf-ed しました

4

1 に答える 1

1

HEREでわかるようx264_memcpy_alignedに、何らかの理由でゼロ アドレスにジャンプする関数に問題があり、 SIGSEGV が発生します。このコメントを修正するには、次の行を削除します。

pf->memcpy_aligned = x264_memcpy_aligned_neon;

ファイル内/x264/common/arm/mc-c.c。250 行目であるはずですが、そうではないことがわかったので、そのテキストを検索して、ファイル内で 1 回しか発生しません。

現在、x264enc は Android で動作していますが、NEON のサポートは少なくなっています...

このスレッドをたどると、この問題の修正に取り組んでいることがわかります。そのため、このハックはすぐに重要ではなくなります。

自分でデバッグしたい場合は、以下を参照してください。

  1. スタックトレース
  2. 関数が壊れる前、および壊れる行の前のフィールド値
  3. ストリップされていない libx264.so ライブラリの ELF
于 2012-07-18T12:10:03.823 に答える