Question

I am trying to play around with GStreamer-java and it's h.264 encoder (x264enc) on Android.

Now, I tried to encode raw video from test video source (set its is-live property to TRUE), and when data starts flowing into the x264enc Element, I get SIGSEGV in libx264.so and my app crashes. And it looks like code is dereferencing a NULL... Exact error location is in file "gstreamer_ndk_bundle/x264/encoder/analyse.c" line 963. And it is this line:

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

My device's CPU is Cortex 8 and it has NEON feature...

I tried to printout to a file all h structure fields, and no field is uninitialized.

Android DEBUG info from LogCat: HERE

My questions:

  1. How can I know what is throwing SIGSEGV, because this line of code seems to be ok?
  2. Is this a known bug or an expected behavior of x264 encoder on ARM CPU or I am missing some encoder configuration?
  3. I noticed that if I set property analyse of the encoder to 0x3:0x113 (some random value I found online) I don't get SIGSEGV, encoder seems to work, but I get error in pipeline: Data flow error. Can I just set analyse to a meaningful value?

Update

I fprintf-ed all important "h" fields just before execution runs in x264_mb_analyse_intra() function and just before the line that it breaks, guess it could help: http://pastebin.com/sAfX239j

Was it helpful?

Solution

As you can see HERE, problem is in x264_memcpy_aligned function which for some reason is jumping to zero address, and that makes SIGSEGV happen. To fix this comment out this line:

pf->memcpy_aligned = x264_memcpy_aligned_neon;

In file /x264/common/arm/mc-c.c. It is supposed to be 250th line but I found out that it is not, so search for that text, it only occurs once in the file.

Now x264enc is working on Android, with less NEON support though...

If you follow this thread you will see that guys are working on fixing this problem, so this hack will soon be unimportant.

If you want to debug it yourself, see these:

  1. Stack trace
  2. Field values before the function it breaks, and before line that it breaks
  3. ELF of unstripped libx264.so library
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top