[FFmpeg-trac] #3406(avcodec:new): H.264 threaded decode error

FFmpeg trac at avcodec.org
Fri Feb 21 20:33:05 CET 2014


#3406: H.264 threaded decode error
--------------------------------------+---------------------------------
               Reporter:  Cigaes      |                  Owner:
                   Type:  defect      |                 Status:  new
               Priority:  normal      |              Component:  avcodec
                Version:  git-master  |               Keywords:
             Blocked By:              |               Blocking:
Reproduced by developer:  0           |  Analyzed by developer:  0
--------------------------------------+---------------------------------
 There are some samples that decode correctly with threads turned off or
 only a few threads, but fail to decode with mode threads.

 For example:
 {{{
 $ ./ffmpeg_g -threads 4 -i /tmp/sf.h264 -f framecrc -c png -
 ffmpeg version N-60805-gc8f3c3a Copyright (c) 2000-2014 the FFmpeg
 developers
   built on Feb 21 2014 20:26:22 with gcc 4.8 (Debian 4.8.2-15)
   configuration: --enable-shared --disable-static --enable-gpl --enable-
 libx264 --enable-libopus --enable-libass --enable-libfreetype --enable-
 opengl --assert-level=2
   libavutil      52. 65.100 / 52. 65.100
   libavcodec     55. 52.102 / 55. 52.102
   libavformat    55. 33.100 / 55. 33.100
   libavdevice    55. 10.100 / 55. 10.100
   libavfilter     4.  1.103 /  4.  1.103
   libswscale      2.  5.101 /  2.  5.101
   libswresample   0. 17.104 /  0. 17.104
   libpostproc    52.  3.100 / 52.  3.100
 Input #0, h264, from '/tmp/sf.h264':
   Duration: N/A, bitrate: N/A
     Stream #0:0: Video: h264 (High 4:4:4 Predictive), yuv444p, 320x240
 [SAR 1:1 DAR 4:3], 25 fps, 25 tbr, 1200k tbn, 50 tbc
 #software: Lavf55.33.100
 #tb 0: 1/25
 Output #0, framecrc, to 'pipe:':
   Metadata:
     encoder         : Lavf55.33.100
     Stream #0:0: Video: png, rgb24, 320x240 [SAR 1:1 DAR 4:3], q=2-31, 200
 kb/s, 25 tbn, 25 tbc
 Stream mapping:
   Stream #0:0 -> #0:0 (h264 -> png)
 Press [q] to stop, [?] for help
 0,          0,          0,        1,    14600, 0x4d4b3314
 0,          1,          1,        1,    20624, 0x9d04c3da
 0,          2,          2,        1,    20373, 0x3224514e
 0,          3,          3,        1,    16474, 0x5a53824a
 0,          4,          4,        1,    20997, 0xe2ac63ec
 0,          5,          5,        1,    21466, 0x3a5edae1
 0,          6,          6,        1,    15290, 0x9fb36a83
 0,          7,          7,        1,    19601, 0x8af6664a
 0,          8,          8,        1,    20217, 0x96032e30
 0,          9,          9,        1,    16655, 0x6e0a0985
 0,         10,         10,        1,    18492, 0x12b572b4
 0,         11,         11,        1,    18118, 0x6b1994d6
 frame=   12 fps=0.0 q=0.0 Lsize=       1kB time=00:00:00.48 bitrate=
 12.2kbits/s
 video:218kB audio:0kB subtitle:0 data:0 global headers:0kB muxing overhead
 -99.671165%
 }}}

 {{{
 $ ./ffmpeg_g -threads 5 -i /tmp/sf.h264 -f framecrc -c png -
 ffmpeg version N-60805-gc8f3c3a Copyright (c) 2000-2014 the FFmpeg
 developers
   built on Feb 21 2014 20:26:22 with gcc 4.8 (Debian 4.8.2-15)
   configuration: --enable-shared --disable-static --enable-gpl --enable-
 libx264 --enable-libopus --enable-libass --enable-libfreetype --enable-
 opengl --assert-level=2
   libavutil      52. 65.100 / 52. 65.100
   libavcodec     55. 52.102 / 55. 52.102
   libavformat    55. 33.100 / 55. 33.100
   libavdevice    55. 10.100 / 55. 10.100
   libavfilter     4.  1.103 /  4.  1.103
   libswscale      2.  5.101 /  2.  5.101
   libswresample   0. 17.104 /  0. 17.104
   libpostproc    52.  3.100 / 52.  3.100
 Input #0, h264, from '/tmp/sf.h264':
   Duration: N/A, bitrate: N/A
     Stream #0:0: Video: h264 (High 4:4:4 Predictive), yuv444p, 320x240
 [SAR 1:1 DAR 4:3], 25 fps, 25 tbr, 1200k tbn, 50 tbc
 #software: Lavf55.33.100
 #tb 0: 1/25
 Output #0, framecrc, to 'pipe:':
   Metadata:
     encoder         : Lavf55.33.100
     Stream #0:0: Video: png, rgb24, 320x240 [SAR 1:1 DAR 4:3], q=2-31, 200
 kb/s, 25 tbn, 25 tbc
 Stream mapping:
   Stream #0:0 -> #0:0 (h264 -> png)
 Press [q] to stop, [?] for help
 Error while decoding stream #0:0: Invalid data found when processing input
 [h264 @ 0xa81240] reference picture missing during reorder
     Last message repeated 1 times
 [h264 @ 0xa81240] Missing reference picture, default is 65548
     Last message repeated 1 times
 [h264 @ 0xad9200] reference picture missing during reorder
 [h264 @ 0xad9200] Missing reference picture, default is 65556
 0,          0,          0,        1,    14600, 0x4d4b3314
 0,          1,          1,        1,    20624, 0x9d04c3da
 0,          3,          3,        1,    20373, 0x3224514e
 0,          4,          4,        1,    16474, 0x5a53824a
 0,          5,          5,        1,    21099, 0x61cb8a88
 0,          6,          6,        1,    21466, 0x7d3727ad
 0,          8,          8,        1,    15370, 0x4b0bcbbd
 0,          9,          9,        1,    19775, 0xed275f1c
 0,         10,         10,        1,    16851, 0x0725c06b
 0,         11,         11,        1,    16717, 0xd445fc7c
 frame=   10 fps=0.0 q=0.0 Lsize=       1kB time=00:00:00.48 bitrate=
 10.3kbits/s
 video:179kB audio:0kB subtitle:0 data:0 global headers:0kB muxing overhead
 -99.663483%
 }}}

 The {{{-c png}}} is necessary to reproduce the problem in this particular
 case, but threading issues are sensitive to timing. Helgrind spews a load
 of errors too:

 {{{
 ==10123== Helgrind, a thread error detector
 ==10123== Copyright (C) 2007-2012, and GNU GPL'd, by OpenWorks LLP et al.
 ==10123== Using Valgrind-3.8.1 and LibVEX; rerun with -h for copyright
 info
 ==10123== Command: ./ffmpeg_g -threads 5 -i /tmp/sf.h264 -f framecrc -c
 png -
 ==10123==
 ffmpeg version N-60805-gc8f3c3a Copyright (c) 2000-2014 the FFmpeg
 developers
   built on Feb 21 2014 20:26:22 with gcc 4.8 (Debian 4.8.2-15)
   configuration: --enable-shared --disable-static --enable-gpl --enable-
 libx264 --enable-libopus --enable-libass --enable-libfreetype --enable-
 opengl --assert-level=2
   libavutil      52. 65.100 / 52. 65.100
   libavcodec     55. 52.102 / 55. 52.102
   libavformat    55. 33.100 / 55. 33.100
   libavdevice    55. 10.100 / 55. 10.100
   libavfilter     4.  1.103 /  4.  1.103
   libswscale      2.  5.101 /  2.  5.101
   libswresample   0. 17.104 /  0. 17.104
   libpostproc    52.  3.100 / 52.  3.100
 Input #0, h264, from '/tmp/sf.h264':
   Duration: N/A, bitrate: N/A
     Stream #0:0: Video: h264 (High 4:4:4 Predictive), yuv444p, 320x240
 [SAR 1:1 DAR 4:3], 25 fps, 25 tbr, 1200k tbn, 50 tbc
 #software: Lavf55.33.100
 #tb 0: 1/25
 Output #0, framecrc, to 'pipe:':
   Metadata:
     encoder         : Lavf55.33.100
     Stream #0:0: Video: png, rgb24, 320x240 [SAR 1:1 DAR 4:3], q=2-31, 200
 kb/s, 25 tbn, 25 tbc
 Stream mapping:
   Stream #0:0 -> #0:0 (h264 -> png)
 Press [q] to stop, [?] for help
 ==10123== ---Thread-Announcement------------------------------------------
 ==10123==
 ==10123== Thread #11 was created
 ==10123==    at 0x7BC40BE: clone (clone.S:76)
 ==10123==    by 0x78C5FF4: do_clone.constprop.4 (createthread.c:74)
 ==10123==    by 0x78C7473: pthread_create@@GLIBC_2.2.5
 (createthread.c:244)
 ==10123==    by 0x4C2D8F0: ??? (in /usr/lib/valgrind/vgpreload_helgrind-
 amd64-linux.so)
 ==10123==    by 0x58A417F: ff_frame_thread_encoder_init
 (frame_thread_encoder.c:204)
 ==10123==    by 0x5B7B5D1: avcodec_open2 (utils.c:1305)
 ==10123==    by 0x4210EA: transcode_init (ffmpeg.c:2658)
 ==10123==    by 0x406F8E: main (ffmpeg.c:3413)
 ==10123==
 ==10123== ---Thread-Announcement------------------------------------------
 ==10123==
 ==10123== Thread #1 is the program's root thread
 ==10123==
 ==10123== ----------------------------------------------------------------
 ==10123==
 ==10123== Lock at 0x103824B0 was first observed
 ==10123==    at 0x4C2E96A: pthread_mutex_init (in /usr/lib/valgrind
 /vgpreload_helgrind-amd64-linux.so)
 ==10123==    by 0x58A4082: ff_frame_thread_encoder_init
 (frame_thread_encoder.c:176)
 ==10123==    by 0x5B7B5D1: avcodec_open2 (utils.c:1305)
 ==10123==    by 0x4210EA: transcode_init (ffmpeg.c:2658)
 ==10123==    by 0x406F8E: main (ffmpeg.c:3413)
 ==10123==
 ==10123== Possible data race during write of size 8 at 0x103814B8 by
 thread #11
 ==10123== Locks held: 1, at address 0x103824B0
 ==10123==    at 0x58A3E54: worker (frame_thread_encoder.c:105)
 ==10123==    by 0x4C2DA86: ??? (in /usr/lib/valgrind/vgpreload_helgrind-
 amd64-linux.so)
 ==10123==    by 0x78C6E0D: start_thread (pthread_create.c:311)
 ==10123==    by 0x7BC40FC: clone (clone.S:113)
 ==10123==
 ==10123== This conflicts with a previous read of size 8 by thread #1
 ==10123== Locks held: none
 ==10123==    at 0x58A4487: ff_thread_video_encode_frame
 (frame_thread_encoder.c:275)
 ==10123==    by 0x41DCCB: reap_filters (ffmpeg.c:997)
 ==10123==    by 0x407BFD: main (ffmpeg.c:3399)
 ==10123==
 ==10123== Address 0x103814B8 is 152 bytes inside a block of size 4856
 alloc'd
 ==10123==    at 0x4C2BA30: memalign (in /usr/lib/valgrind
 /vgpreload_helgrind-amd64-linux.so)
 ==10123==    by 0x4C2BB57: posix_memalign (in /usr/lib/valgrind
 /vgpreload_helgrind-amd64-linux.so)
 ==10123==    by 0x6E4A7AC: av_malloc (mem.c:94)
 ==10123==    by 0x6E4A96D: av_mallocz (mem.c:244)
 ==10123==    by 0x58A403F: ff_frame_thread_encoder_init
 (frame_thread_encoder.c:165)
 ==10123==    by 0x5B7B5D1: avcodec_open2 (utils.c:1305)
 ==10123==    by 0x4210EA: transcode_init (ffmpeg.c:2658)
 ==10123==    by 0x406F8E: main (ffmpeg.c:3413)
 ==10123==
 0,          0,          0,        1,    14600, 0x4d4b3314
 0,          1,          1,        1,    20624, 0x9d04c3da4 bitrate=
 19.0kbits/s
 0,          2,          2,        1,    20373, 0x3224514e8 bitrate=
 15.3kbits/s
 0,          3,          3,        1,    16474, 0x5a53824a2 bitrate=
 14.1kbits/s
 0,          4,          4,        1,    20997, 0xe2ac63ec6 bitrate=
 13.4kbits/s
 0,          5,          5,        1,    21466, 0x3a5edae10 bitrate=
 13.1kbits/s
 0,          6,          6,        1,    15290, 0x9fb36a832:-22.-77
 bitrate=N/A
 0,          7,          7,        1,    19601, 0x8af6664a
 0,          8,          8,        1,    20217, 0x96032e30
 0,          9,          9,        1,    16655, 0x6e0a0985
 0,         10,         10,        1,    18492, 0x12b572b4
 0,         11,         11,        1,    18118, 0x6b1994d6
 frame=   12 fps=0.7 q=0.0 Lsize=       1kB time=00:00:00.48 bitrate=
 12.2kbits/s
 video:218kB audio:0kB subtitle:0 data:0 global headers:0kB muxing overhead
 -99.671165%
 ==10123== ----------------------------------------------------------------
 ==10123==
 ==10123== Lock at 0x1038AD20 was first observed
 ==10123==    at 0x4C2E96A: pthread_mutex_init (in /usr/lib/valgrind
 /vgpreload_helgrind-amd64-linux.so)
 ==10123==    by 0x5B75323: default_lockmgr_cb (utils.c:81)
 ==10123==    by 0x5B7AD9D: ff_lock_avcodec (utils.c:3299)
 ==10123==    by 0x5B7B07C: avcodec_open2 (utils.c:1193)
 ==10123==    by 0x54647A3: avformat_find_stream_info (utils.c:2993)
 ==10123==    by 0x412DE0: open_input_file (ffmpeg_opt.c:860)
 ==10123==    by 0x4177C0: ffmpeg_parse_options (ffmpeg_opt.c:2597)
 ==10123==    by 0x406F20: main (ffmpeg.c:3600)
 ==10123==
 ==10123== Possible data race during write of size 4 at 0x10385924 by
 thread #1
 ==10123== Locks held: 1, at address 0x1038AD20
 ==10123==    at 0x5AD50FD: ff_frame_thread_free (pthread_frame.c:565)
 ==10123==    by 0x5754DBA: avcodec_close (utils.c:2602)
 ==10123==    by 0x407618: main (ffmpeg.c:3491)
 ==10123==
 ==10123== Address 0x10385924 is 68 bytes inside a block of size 72 alloc'd
 ==10123==    at 0x4C2BA30: memalign (in /usr/lib/valgrind
 /vgpreload_helgrind-amd64-linux.so)
 ==10123==    by 0x4C2BB57: posix_memalign (in /usr/lib/valgrind
 /vgpreload_helgrind-amd64-linux.so)
 ==10123==    by 0x6E4A7AC: av_malloc (mem.c:94)
 ==10123==    by 0x6E4A96D: av_mallocz (mem.c:244)
 ==10123==    by 0x5AD53E5: ff_frame_thread_init (pthread_frame.c:641)
 ==10123==    by 0x5B7B5FF: avcodec_open2 (utils.c:1313)
 ==10123==    by 0x4214D7: transcode_init (ffmpeg.c:2144)
 ==10123==    by 0x406F8E: main (ffmpeg.c:3413)
 ==10123==
 ==10123==
 ==10123== For counts of detected and suppressed errors, rerun with: -v
 ==10123== Use --history-level=approx or =none to gain increased speed, at
 ==10123== the cost of reduced accuracy of conflicting-access information
 ==10123== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 2274 from
 350)
 }}}

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


More information about the FFmpeg-trac mailing list