Android上的GStreamer x264enc和SIGSEGV

时间:2012-07-12 13:41:19

标签: android gstreamer sigsegv x264 libx264

我正在尝试使用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,编码器似乎工作,但我在管道中得到错误:数据流错误。我可以将分析设置为有意义的值吗?
  4. 更新

    我在执行x264_mb_analyse_intra()函数之前的所有重要的“h”字段上打印,并且在它破坏的行之前,猜测它可以帮助:http://pastebin.com/sAfX239j

1 个答案:

答案 0 :(得分:1)

正如您所见HERE,问题出现在x264_memcpy_aligned函数中,由于某种原因,该函数跳转到零地址,这使得SIGSEGV发生。要在此行中修复此评论:

pf->memcpy_aligned = x264_memcpy_aligned_neon;

在档案/x264/common/arm/mc-c.c中。它应该是第250行,但我发现它不是,所以搜索该文本,它只在文件中出现一次。

现在x264enc正在使用Android,虽然支持的NEON较少......

如果你按照this thread进行操作,你会看到那些人正在努力解决这个问题,所以这个黑客很快就会变得不重要了。

如果您想自己调试,请参阅:

  1. Stack trace
  2. Field values before the function it breaks, and before line that it breaks
  3. ELF of unstripped libx264.so library