1

我正在尝试使用 GStreamer-java,它是 Android 上的 h.264 编码器 (x264enc)。

现在,我尝试对来自测试视频源的原始视频进行编码(将其is-live属性设置为TRUE),当数据开始流入 x264enc 元素时,我在 libx264.so 中获得 SIGSEGV 并且我的应用程序崩溃。看起来代码正在取消引用 NULL... 确切的错误位置在文件“gstreamer_ndk_bundle/x264/encoder/analyze.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 调试信息:这里

我的问题:

  1. 我怎么知道是什么在抛出 SIGSEGV,因为这行代码似乎没问题?
  2. 这是 ARM CPU 上 x264 编码器的已知错误或预期行为,还是我缺少一些编码器配置?
  3. 我注意到如果我将编码器的属性分析设置为0x3:0x113我在网上找到的一些随机值)我没有得到 SIGSEGV,编码器似乎工作,但我在管道中得到错误:数据流错误。我可以将分析设置为有意义的值吗?

更新

我在 x264_mb_analysis_intra() 函数中运行之前以及在它中断的行之前对所有重要的“h”字段进行了 fprintf 编辑,猜测它可能会有所帮助: http://pastebin.com/sAfX239j

4

1 回答 1

1

正如您在此处看到的,问题出在x264_memcpy_aligned函数中,由于某种原因跳转到零地址,这使得 SIGSEGV 发生。要修复此注释,请执行以下操作:

pf->memcpy_aligned = x264_memcpy_aligned_neon;

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

现在 x264enc 正在 Android 上运行,但对 NEON 的支持较少......

如果你关注这个帖子,你会看到人们正在努力解决这个问题,所以这个黑客很快就会变得不重要。

如果您想自己调试,请参阅以下内容:

  1. 堆栈跟踪
  2. 在它中断的函数之前和它中断的行之前的字段值
  3. 未剥离的 libx264.so 库的 ELF
于 2012-07-18T12:10:03.823 回答