[FFmpeg-trac] #824(avcodec:new): Segfault while using h264 hardware acceleration

FFmpeg trac at avcodec.org
Fri Dec 23 18:47:05 CET 2011


#824: Segfault while using h264 hardware acceleration
-------------------------------------+-------------------------------------
             Reporter:  static-void  |                     Type:  defect
               Status:  new          |                 Priority:  normal
            Component:  avcodec      |                  Version:  git-
             Keywords:               |  master
             Blocking:               |               Blocked By:
Analyzed by developer:  0            |  Reproduced by developer:  0
-------------------------------------+-------------------------------------
 I'm using FFmpeg integrated in mplayer (with VA-API pathes), and I'm
 getting a SIGSEGV while trying to watch h264 video with HW-acceleration.

 I've poked around with gdb and I think this is multithreading-related.
 After I added mplayer option "-lavdopts threads=1", which configures
 libavcodec, the problem has gone.

 === General info ===

 Crash happens inside a thread, in the start_frame function
 (libavcodec/vaapi_h264.c:234):

 {{{
     vactx->slice_param_size = sizeof(VASliceParameterBufferH264);
       ^-- vactx is NULL
 }}}

 and vactx is AVCodecContext.hwaccel_context, which should be set to
 vaapi_context struct instance. But I've set a breakpoint and seen
 hwaccel_context being properly set at the init stage, although
 AVCodecContext pointer being not the same as the one in the place it
 crashes. I suppose it happens because AVCodecContext gets copied and its
 fields are replicated across worker threads (libavcodec/pthread.c), and I
 haven't seen hwaccel_context being copied in the code.

 Considering all above, I don't think it is needed to copy hwaccel_context,
 but rather to force threads=1 configuration on libavcodec when using HW
 acceleration. Several working threads would not improve anything in the
 case of HW accel, would they?

 === Debug info ===

 {{{
 (gdb) run -vo vaapi:gl -va vaapi "<...>.mkv"
 Starting program: /usr/local/mplayer-vaapi-build/mplayer -vo vaapi:gl -va
 vaapi "<...>.mkv"
 [Thread debugging using libthread_db enabled]
 MPlayer SVN-r34365-4.6.1 (C) 2000-2011 MPlayer Team

 Playing <...>.mkv.
 libavformat file format detected.
 [matroska,webm @ 0xc798e0]max_analyze_duration 5000000 reached at 5019000
 [lavf] stream 0: video (h264), -vid 0
 [lavf] stream 1: audio (aac), -aid 0, -alang jpn
 [lavf] stream 2: subtitle (ass), -sid 0, -slang eng
 VIDEO:  [H264]  1280x720  0bpp  23.976 fps    0.0 kbps ( 0.0 kbyte/s)
 Load subtitles in <...>
 [vo_vaapi] Using OpenGL rendering
 libva: libva version 0.32.0
 Xlib:  extension "XFree86-DRI" missing on display ":0.0".
 libva: va_getDriverName() returns 0
 libva: Trying to open /usr/lib/dri/fglrx_drv_video.so
 libva: va_openDriver() returns 0
 Opening video filter: [ass auto=1]
 Couldn't open video filter 'ass'.
 ASS: cannot add video filter
 ==========================================================================
 Opening video decoder: [ffmpeg] FFmpeg's libavcodec codec family
 [New Thread 0x7fffe13b6700 (LWP 12803)]
 [New Thread 0x7fffe0bb5700 (LWP 12804)]
 Selected video codec: [ffh264] vfm: ffmpeg (FFmpeg H.264)
 ==========================================================================
 ==========================================================================
 Opening audio decoder: [ffmpeg] FFmpeg/libavcodec audio decoders
 AUDIO: 48000 Hz, 2 ch, s16le, 0.0 kbit/0.00% (ratio: 0->192000)
 Selected audio codec: [ffaac] afm: ffmpeg (FFmpeg AAC (MPEG-2/MPEG-4
 Audio))
 ==========================================================================
 [AO SDL] Samplerate: 48000Hz Channels: Stereo Format s16le
 [New Thread 0x7fffdc3b3700 (LWP 12805)]
 [Thread 0x7fffdc3b3700 (LWP 12805) exited]
 [New Thread 0x7fffdc3b3700 (LWP 12806)]
 AO: [sdl] 48000Hz 2ch s16le (2 bytes per sample)
 Starting playback...
 Unsupported PixelFormat 61
 [VD_FFMPEG] Trying pixfmt=1.
 Movie-Aspect is 1.78:1 - prescaling to correct movie aspect.
 VO: [vaapi] 1280x720 => 1280x720 H.264 VA-API Acceleration
 [VD_FFMPEG] XVMC-accelerated MPEG-2.

 Program received signal SIGSEGV, Segmentation fault.
 [Switching to Thread 0x7fffe13b6700 (LWP 12803)]
 start_frame (avctx=0x1b098c0, buffer=0x0, size=0) at
 libavcodec/vaapi_h264.c:234
 234         vactx->slice_param_size = sizeof(VASliceParameterBufferH264);

 (gdb) bt
 #0  start_frame (avctx=0x1b098c0, buffer=0x0, size=0) at
 libavcodec/vaapi_h264.c:234
 #1  0x00000000008724bb in decode_nal_units (h=0x2504250, buf=0x1b1b780 "",
 buf_size=2752) at libavcodec/h264.c:3920
 #2  0x0000000000872c4a in decode_frame (avctx=0x1b098c0, data=0x1e53080,
 data_size=0x1e53200, avpkt=<optimized out>)
     at libavcodec/h264.c:4105
 #3  0x0000000000945818 in frame_worker_thread (arg=0x1e52f20) at
 libavcodec/pthread.c:364
 #4  0x00007ffff6170efc in start_thread () from /lib/x86_64-linux-
 gnu/libpthread.so.0
 #5  0x00007ffff055389d in clone () from /lib/x86_64-linux-gnu/libc.so.6
 #6  0x0000000000000000 in ?? ()

 (gdb) disass /m $pc-32,+64
 Dump of assembler code from 0x9af3a7 to 0x9af3e7:
 225     {
    0x00000000009af3ad <start_frame+0>:  push   %r14
    0x00000000009af3af <start_frame+2>:  push   %r13
    0x00000000009af3b1 <start_frame+4>:  push   %r12
    0x00000000009af3b3 <start_frame+6>:  push   %rbp
    0x00000000009af3b4 <start_frame+7>:  push   %rbx
    0x00000000009af3b5 <start_frame+8>:  sub    $0x10,%rsp

 226         H264Context * const h = avctx->priv_data;
    0x00000000009af3b9 <start_frame+12>: mov    0x98(%rdi),%rbx

 227         MpegEncContext * const s = &h->s;
 228         struct vaapi_context * const vactx = avctx->hwaccel_context;
    0x00000000009af3c0 <start_frame+19>: mov    0x3e8(%rdi),%r12

 229         VAPictureParameterBufferH264 *pic_param;
 230         VAIQMatrixBufferH264 *iq_matrix;
 231
 232         av_dlog(avctx, "start_frame()\n");
 233
 234         vactx->slice_param_size = sizeof(VASliceParameterBufferH264);
 => 0x00000000009af3c7 <start_frame+26>: movl   $0x828,0x38(%r12)

 235
 236         /* Fill in VAPictureParameterBufferH264. */
 237         pic_param = ff_vaapi_alloc_pic_param(vactx,
 sizeof(VAPictureParameterBufferH264));
    0x00000000009af3d0 <start_frame+35>: mov    $0x170,%esi
    0x00000000009af3d5 <start_frame+40>: mov    %r12,%rdi
    0x00000000009af3d8 <start_frame+43>: callq  0xa9f079
 <ff_vaapi_alloc_pic_param>
    0x00000000009af3dd <start_frame+48>: mov    %rax,%rbp

 238         if (!pic_param)
    0x00000000009af3e0 <start_frame+51>: test   %rax,%rax
 ---Type <return> to continue, or q <return> to quit---q
 Quit

 (gdb) info locals
 h = 0x2504250
 s = 0x2504250
 vactx = 0x0
 pic_param = <optimized out>
 iq_matrix = <optimized out>

 (gdb) info registers
 rax            0x10995a0        17405344
 rbx            0x2504250        38814288
 rcx            0x0      0
 rdx            0x0      0
 rsi            0x0      0
 rdi            0x1b098c0        28350656
 rbp            0x2504250        0x2504250
 rsp            0x7fffe13b5c90   0x7fffe13b5c90
 r8             0x1      1
 r9             0x0      0
 r10            0x0      0
 r11            0x2      2
 r12            0x0      0
 r13            0x0      0
 r14            0x0      0
 r15            0x415f   16735
 rip            0x9af3c7 0x9af3c7 <start_frame+26>
 eflags         0x10206  [ PF IF RF ]
 cs             0x33     51
 ss             0x2b     43
 ds             0x0      0
 es             0x0      0
 fs             0x0      0
 gs             0x0      0
 }}}

-- 
Ticket URL: <https://ffmpeg.org/trac/ffmpeg/ticket/824>
FFmpeg <http://ffmpeg.org>
FFmpeg issue tracker


More information about the FFmpeg-trac mailing list