[Libav-user] android crash with armeabi-v7a + tegra3

Michael Zucchi notzed at gmail.com
Fri Jun 22 05:30:23 CEST 2012


I've been working on an android port of my jjmpeg library (a GPLv3 java 
binding for FFmpeg) and i've hit a snag when optimising for newer arm 
devices: for a given video I get a reliable but unpredictable bus error 
whenever i build for the armeabi-v7a platform.  I've included details 
below.  I've seen it crash in other decoders as well, but usually at one 
of those low-level asm lines.

It happens with 0.10.4 or 0.11.1, but i haven't tried HEAD yet.  It 
usually happens after about 5 minutes of video playing, but can vary 
from 1-20, so it's a bit of a pain to debug.  I've tried various player 
designs from simple single-threaded to many-threaded ones, opengles or 
not, etc.

I don't see such problems if i use just plain armeabi (armv5 i guess), 
or on amd64/x86 cpus.  I still get the same problem if i disable neon 
and/or vfp as well, it just seems to be related to armeabi-v7a on the 
tablet i'm using.

The device is a tegra 3 tablet (asus transformer prime w/ latest vendor 
firmware).  It doesn't appear to crash in the emulator, but that is only 
a single-cpu so isn't hitting the same code-paths.  It's the only device 
I have access to at the moment but i'll probably get some cheap chinese 
arm device(s) to play with soon.

I've run out of ideas at my end, but if anyone has any pointers?

If I can't get anywhere I will just default to armeabi for development 
and put it down to a shitty piece of hardware, so it's not a 
show-stopper for me, just a pita and a big waste of time.

  Michael Z

PS I tried compiling with no optimisation but the build fails if i do 
that, so the bt is a bit off.

Program received signal SIGBUS, Bus error.
[Switching to Thread 1495]
mpeg4_decode_block (s=0x1f97f40, block=0x20b0870, n=18, coded=<value 
optimized out>, intra=292,
54          __asm__ ("ldr  %0, %1" : "=r"(v) : "m"(*q));
(gdb) where
#0  mpeg4_decode_block (s=0x1f97f40, block=0x20b0870, n=18, coded=<value 
optimized out>, intra=292,
#1  0x5b91f980 in mpeg4_decode_mb (s=0x1f97f40, block=0x20b0770)
#2  0x5b79820c in decode_slice (s=0x1f97f40)
#3  0x5b799704 in ff_h263_decode_frame (avctx=0x1f66570, data=<value 
optimized out>,
     data_size=<value optimized out>, avpkt=<value optimized out>)
#4  0x5b99bd84 in frame_worker_thread (arg=<value optimized out>)
#5  0x40073e30 in __thread_entry ()
#6  0x40073984 in pthread_create ()
#7  0x00000000 in ?? ()
(gdb) info registers
r0             0x1      1
r1             0x7      7
r2             0x12     18
r3             0xe97f   59775
r4             0x4      4
r5             0x1f97f40        33128256
r6             0x20b0870        34277488
r7             0x5bf1a72c       1542563628
r8             0x29ec   10732
r9             0x215b710        34977552
r10            0x1f980b0        33128624
r11            0x20acd58        34262360
r12            0xa      10
sp             0x5ceb6cb8       0x5ceb6cb8
lr             0x5b91f980       1536293248
pc             0x5b91df5c       0x5b91df5c <mpeg4_decode_block+344>
fps            0x0      0
cpsr           0x80000010       2147483664
(gdb) disassemble
Dump of assembler code for function mpeg4_decode_block:
0x5b91df34 <mpeg4_decode_block+304>:    strne   r2, [sp, #28]
0x5b91df38 <mpeg4_decode_block+308>:    strne   r3, [sp, #20]
0x5b91df3c <mpeg4_decode_block+312>:    movw    r3, #10740      ; 0x29f4
0x5b91df40 <mpeg4_decode_block+316>:    movw    r8, #10732      ; 0x29ec
0x5b91df44 <mpeg4_decode_block+320>:    movw    r12, #63488     ; 0xf800
0x5b91df48 <mpeg4_decode_block+324>:    ldr     r3, [r5, r3]
0x5b91df4c <mpeg4_decode_block+328>:    movt    r12, #65535     ; 0xffff

0x5b91df50 <mpeg4_decode_block+332>:    str     r12, [sp, #40]
0x5b91df54 <mpeg4_decode_block+336>:    and     r1, r3, #7      ; 0x7
0x5b91df58 <mpeg4_decode_block+340>:    ldr     r9, [r5, r8]
0x5b91df5c <mpeg4_decode_block+344>:    ldr     r2, [r9, r3, lsr #3]
0x5b91df60 <mpeg4_decode_block+348>:    rev     r2, r2
0x5b91df64 <mpeg4_decode_block+352>:    mov     r1, r2, lsl r1
0x5b91df68 <mpeg4_decode_block+356>:    mov     r2, r1, lsr #23
0x5b91df6c <mpeg4_decode_block+360>:    mov     r2, r2, lsl #2

(gdb) x /10x 0x1f97f40 + 0x29ec
0x1f9a92c:      0x0215b710      0x02160a22      0x0000e967      0x00029890
0x1f9a93c:      0x00029898      0x00000000      0x00000000      0x00000000
0x1f9a94c:      0x00000000      0x00000001
(gdb) x /10x 0x215b710 + (0xe97f >> 3)
0x215d43f:      0xa20f047d      0x08142840      0xdeb9354c      0xb24ba7f7
0x215d44f:      0xb6d71947      0xf7bedeb5      0x9f318e57      0xfa883a97
0x215d45f:      0xf45edcda      0xd02a0f51

Build config

--enable-cross-compile --target-os=linux 
-mfloat-abi=softfp -mfpu=neon -marm -march=armv7-a -g -O0 
--arch=arm --disable-stripping --enable-debug --assert-level=2 
--disable-shared --enable-static --disable-symver --enable-pthreads 
--enable-gpl --enable-version3 --disable-doc --disable-ffmpeg 
--disable-ffplay --disable-ffprobe --disable-ffserver --disable-avdevice 
--disable-avfilter --disable-postproc"

#define ARCH_ARM 1
#define HAVE_ARMV5TE 1
#define HAVE_ARMV6 1
#define HAVE_ARMV6T2 1
#define HAVE_ARMVFP 1
#define HAVE_NEON 1
#define HAVE_VFPV3 1

More information about the Libav-user mailing list