【问题标题】:GStreamer x264enc and SIGSEGV on AndroidAndroid 上的 GStreamer x264enc 和 SIGSEGV
【发布时间】:2012-07-12 13:41:18
【问题描述】:

我正在尝试使用 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 调试信息:HERE

我的问题:

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

更新

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

【问题讨论】:

    标签: android gstreamer segmentation-fault x264 libx264


    【解决方案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,你会看到人们正在努力解决这个问题,所以这个 hack 很快就会变得无关紧要。

    如果你想自己调试,请看这些:

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

    【讨论】:

    • 使用 ndk-stack 时,我得到unable to get routine information for <address> in <module>!可能是什么问题?
    猜你喜欢
    • 2013-06-25
    • 1970-01-01
    • 2011-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-09
    相关资源
    最近更新 更多