[FFmpeg-cvslog] pngdec: frame multithreading support

Michael Niedermayer michaelni at gmx.at
Fri Aug 23 20:01:10 CEST 2013


On Thu, Aug 22, 2013 at 04:45:58PM +0200, Paul B Mahol wrote:
> ffmpeg | branch: master | Paul B Mahol <onemda at gmail.com> | Mon Aug 12 10:56:20 2013 +0000| [6e643239d9956ce32888d87451706ee7c8757afa] | committer: Paul B Mahol
> 
> pngdec: frame multithreading support
> 
> Signed-off-by: Paul B Mahol <onemda at gmail.com>
> 
> > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=6e643239d9956ce32888d87451706ee7c8757afa
> ---
> 
>  libavcodec/pngdec.c |   69 +++++++++++++++++++++++++++++++++++++--------------
>  1 file changed, 51 insertions(+), 18 deletions(-)

It seems this still deadlocks and crashes occasionally but not
always (same file as the last one)

Deadlock: (duplicate backtraces ommited)

Thread 27 (Thread 0x7fffe017f700 (LWP 10742)):
#0  pthread_cond_wait@@GLIBC_2.3.2 () at ../nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S:162
#1  0x00000000008e16a7 in frame_worker_thread (arg=0x1743520) at libavcodec/pthread.c:330
#2  0x00007ffff0467e9a in start_thread (arg=0x7fffe017f700) at pthread_create.c:308
#3  0x00007ffff0194ccd in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:112
#4  0x0000000000000000 in ?? ()


Thread 21 (Thread 0x7fffe3185700 (LWP 10736)):
#0  pthread_cond_wait@@GLIBC_2.3.2 () at ../nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S:162
#1  0x00000000008e26d7 in ff_thread_await_progress (f=0x173add0, n=2147483647, field=0) at libavcodec/pthread.c:692
#2  0x00000000008d3d42 in decode_frame (avctx=0x173a920, data=0x1741dd0, got_frame=0x1742040, avpkt=0x1741d60) at libavcodec/pngdec.c:843
#3  0x00000000008e176f in frame_worker_thread (arg=0x1741c60) at libavcodec/pthread.c:339
#4  0x00007ffff0467e9a in start_thread (arg=0x7fffe3185700) at pthread_create.c:308
#5  0x00007ffff0194ccd in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:112
#6  0x0000000000000000 in ?? ()

Thread 1 (Thread 0x7ffff7faa780 (LWP 10714)):
#0  pthread_cond_wait@@GLIBC_2.3.2 () at ../nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S:162
#1  0x00000000008e23d7 in ff_thread_decode_frame (avctx=0x174fec0, picture=0x174b1e0, got_picture_ptr=0x7fffffffdca8, avpkt=0x7fffffffd9d0) at libavcodec/pthread.c:631
#2  0x0000000000982228 in avcodec_decode_video2 (avctx=0x174fec0, picture=0x174b1e0, got_picture_ptr=0x7fffffffdca8, avpkt=0x7fffffffdbf0) at libavcodec/utils.c:1979
#3  0x0000000000424306 in decode_video (ist=0x1752780, pkt=0x7fffffffdbf0, got_output=0x7fffffffdca8) at ffmpeg.c:1668
#4  0x0000000000425193 in output_packet (ist=0x1752780, pkt=0x7fffffffdd70) at ffmpeg.c:1866
#5  0x000000000042ad63 in process_input (file_index=0) at ffmpeg.c:3085
#6  0x000000000042b0e2 in transcode_step () at ffmpeg.c:3181
#7  0x000000000042b1ef in transcode () at ffmpeg.c:3233
#8  0x000000000042b71a in main (argc=11, argv=0x7fffffffe398) at ffmpeg.c:3411

------------
segfault (again same file, doesnt happe under valgrind)

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7fffe2d26700 (LWP 19664)]
malloc_consolidate (av=0x7fffc0000020) at malloc.c:4251
4251    malloc.c: No such file or directory.
(gdb) bt
#0  malloc_consolidate (av=0x7fffc0000020) at malloc.c:4251
#1  0x00007fffef4c1446 in malloc_consolidate (av=0x7fffc0000020) at malloc.c:4226
#2  _int_malloc (av=0x7fffc0000020, bytes=7232) at malloc.c:3543
#3  0x00007fffef4c2811 in _int_memalign (av=0x7fffc0000020, alignment=32, bytes=<optimized out>) at malloc.c:4503
#4  0x00007fffef4c4aa6 in __GI___libc_memalign (alignment=32, bytes=7152) at malloc.c:3104
#5  0x00007fffef4c5d19 in __posix_memalign (memptr=0x7fffe2d25cb8, alignment=<optimized out>, size=<optimized out>) at malloc.c:5049
#6  0x0000000000bd2bda in av_malloc (size=7152) at libavutil/mem.c:93
#7  av_mallocz (size=7152) at libavutil/mem.c:223
#8  0x00007fffefe445b7 in inflateInit2_ () from /lib/x86_64-linux-gnu/libz.so.1
#9  0x00000000008fd864 in decode_frame (avctx=0x16d2c40, data=0x16db150, got_frame=0x16db3c0, avpkt=0x16db0e0) at libavcodec/pngdec.c:539
#10 0x000000000090a755 in frame_worker_thread (arg=0x16dafe0) at libavcodec/pthread.c:339
#11 0x00007fffef807e9a in start_thread (arg=0x7fffe2d26700) at pthread_create.c:308
#12 0x00007fffef534ccd in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:112
#13 0x0000000000000000 in ?? ()

asan shows these:

=================================================================
==29015==ERROR: AddressSanitizer: heap-use-after-free on address 0x60700001f74c at pc 0x13757b0 bp 0x7f8a041959a0 sp 0x7f8a04195998
WRITE of size 4 at 0x60700001f74c thread T20
    #0 0x13757af in atomic_int_add_and_fetch_gcc ffmpeg/libavutil/atomic_gcc.h:45
    #1 0x1375887 in av_buffer_unref ffmpeg/libavutil/buffer.c:114
    #2 0x13819d8 in av_frame_unref ffmpeg/libavutil/frame.c:347
    #3 0xdbca46 in decode_frame ffmpeg/libavcodec/pngdec.c:519
    #4 0xde0d25 in frame_worker_thread ffmpeg/libavcodec/pthread.c:339
    #5 0x466e73 in _ZN6__asan10AsanThread11ThreadStartEm ??:0
    #6 0x7f8a175c0e99 in start_thread /build/buildd/eglibc-2.15/nptl/pthread_create.c:308
    #7 0x7f8a16ed3ccc in ?? /build/buildd/eglibc-2.15/misc/../sysdeps/unix/sysv/linux/x86_64/clone.S:112
0x60700001f74c is located 12 bytes inside of 40-byte region [0x60700001f740,0x60700001f768)
freed by thread T19 here:
    #0 0x4607f4 in free ??:0
    #1 0x138d9f1 in av_freep ffmpeg/libavutil/mem.c:217
    #2 0x13758f1 in av_buffer_unref ffmpeg/libavutil/buffer.c:116
    #3 0x13819d8 in av_frame_unref ffmpeg/libavutil/frame.c:347
    #4 0xdc018d in decode_frame ffmpeg/libavcodec/pngdec.c:872
    #5 0xde0d25 in frame_worker_thread ffmpeg/libavcodec/pthread.c:339
    #6 0x466e73 in _ZN6__asan10AsanThread11ThreadStartEm ??:0
previously allocated by thread T19 here:
    #0 0x460b6c in posix_memalign ??:0
    #1 0x138d6e0 in av_malloc ffmpeg/libavutil/mem.c:93
    #2 0x138da2e in av_mallocz ffmpeg/libavutil/mem.c:223
    #3 0x137523a in av_buffer_create ffmpeg/libavutil/buffer.c:34
    #4 0x1375584 in av_buffer_alloc ffmpeg/libavutil/buffer.c:74
    #5 0x13755dd in av_buffer_allocz ffmpeg/libavutil/buffer.c:83
    #6 0x1376817 in pool_alloc_buffer ffmpeg/libavutil/buffer.c:305
    #7 0xf07ca8 in video_get_buffer ffmpeg/libavcodec/utils.c:574
    #8 0xf094a4 in get_buffer_internal ffmpeg/libavcodec/utils.c:864
    #9 0xf08e1e in ff_get_buffer ffmpeg/libavcodec/utils.c:876
    #10 0xddeb6f in thread_get_buffer_internal ffmpeg/libavcodec/pthread.c:962
    #11 0xdde6ae in ff_thread_get_buffer ffmpeg/libavcodec/pthread.c:1017
    #12 0xdbe5be in decode_frame ffmpeg/libavcodec/pngdec.c:646
    #13 0xde0d25 in frame_worker_thread ffmpeg/libavcodec/pthread.c:339
    #14 0x466e73 in _ZN6__asan10AsanThread11ThreadStartEm ??:0
Thread T20 created by T0 here:
    #0 0x45c9d8 in __interceptor_pthread_create ??:0
    #1 0xde0075 in frame_thread_init ffmpeg/libavcodec/pthread.c:872
    #2 0xf0b73c in avcodec_open2 ffmpeg/libavcodec/utils.c:1222
    #3 0x4a6354 in init_input_stream ffmpeg/ffmpeg.c:1983
    #4 0x49074a in transcode_init ffmpeg/ffmpeg.c:2486
    #5 0x48bff2 in transcode ffmpeg/ffmpeg.c:3204
    #6 0x48b462 in main ffmpeg/ffmpeg.c:3411
    #7 0x7f8a16e0176c in __libc_start_main /build/buildd/eglibc-2.15/csu/libc-start.c:226
Thread T19 created by T0 here:
    #0 0x45c9d8 in __interceptor_pthread_create ??:0
    #1 0xde0075 in frame_thread_init ffmpeg/libavcodec/pthread.c:872
    #2 0xf0b73c in avcodec_open2 ffmpeg/libavcodec/utils.c:1222
    #3 0x4a6354 in init_input_stream ffmpeg/ffmpeg.c:1983
    #4 0x49074a in transcode_init ffmpeg/ffmpeg.c:2486
    #5 0x48bff2 in transcode ffmpeg/ffmpeg.c:3204
    #6 0x48b462 in main ffmpeg/ffmpeg.c:3411
    #7 0x7f8a16e0176c in __libc_start_main /build/buildd/eglibc-2.15/csu/libc-start.c:226

---------
a different one:
==29194==ERROR: AddressSanitizer: heap-use-after-free on address 0x605000002780 at pc 0x1375763 bp 0x7fffeb33d210 sp 0x7fffeb33d208
READ of size 24 at 0x605000002780 thread T0
    #0 0x1375762 in av_buffer_ref ffmpeg/libavutil/buffer.c:98
    #1 0xf167da in ff_thread_ref_frame ffmpeg/libavcodec/utils.c:3151
    #2 0xddc447 in submit_packet ffmpeg/libavcodec/pthread.c:519
    #3 0xddb48b in ff_thread_decode_frame ffmpeg/libavcodec/pthread.c:602
    #4 0xf10358 in avcodec_decode_video2 ffmpeg/libavcodec/utils.c:1979
    #5 0x499bc5 in decode_video ffmpeg/ffmpeg.c:1668
    #6 0x49542c in output_packet ffmpeg/ffmpeg.c:1866
    #7 0x4a198b in process_input ffmpeg/ffmpeg.c:3085
    #8 0x49332f in transcode_step ffmpeg/ffmpeg.c:3181
    #9 0x48c083 in transcode ffmpeg/ffmpeg.c:3233
    #10 0x48b462 in main ffmpeg/ffmpeg.c:3411
    #11 0x7f8cba42476c in __libc_start_main /build/buildd/eglibc-2.15/csu/libc-start.c:226
    #12 0x46e93c in _start ??:0
0x605000002780 is located 0 bytes inside of 24-byte region [0x605000002780,0x605000002798)
freed by thread T19 here:
    #0 0x4607f4 in free ??:0
    #1 0x138d9f1 in av_freep ffmpeg/libavutil/mem.c:217
    #2 0x1375867 in av_buffer_unref ffmpeg/libavutil/buffer.c:112
    #3 0xddeee1 in ff_thread_release_buffer ffmpeg/libavcodec/pthread.c:1044
    #4 0xdc018d in decode_frame ffmpeg/libavcodec/pngdec.c:872
    #5 0xde0d25 in frame_worker_thread ffmpeg/libavcodec/pthread.c:339
    #6 0x466e73 in _ZN6__asan10AsanThread11ThreadStartEm ??:0
previously allocated by thread T19 here:
    #0 0x460b6c in posix_memalign ??:0
    #1 0x138d6e0 in av_malloc ffmpeg/libavutil/mem.c:93
    #2 0x138da2e in av_mallocz ffmpeg/libavutil/mem.c:223
    #3 0x13753ae in av_buffer_create ffmpeg/libavutil/buffer.c:47
    #4 0x1375584 in av_buffer_alloc ffmpeg/libavutil/buffer.c:74
    #5 0xdde8cf in thread_get_buffer_internal ffmpeg/libavcodec/pthread.c:944
    #6 0xdde6ae in ff_thread_get_buffer ffmpeg/libavcodec/pthread.c:1017
    #7 0xdbe5be in decode_frame ffmpeg/libavcodec/pngdec.c:646
    #8 0xde0d25 in frame_worker_thread ffmpeg/libavcodec/pthread.c:339
    #9 0x466e73 in _ZN6__asan10AsanThread11ThreadStartEm ??:0
Thread T19 created by T0 here:
    #0 0x45c9d8 in __interceptor_pthread_create ??:0
    #1 0xde0075 in frame_thread_init ffmpeg/libavcodec/pthread.c:872
    #2 0xf0b73c in avcodec_open2 ffmpeg/libavcodec/utils.c:1222
    #3 0x4a6354 in init_input_stream ffmpeg/ffmpeg.c:1983
    #4 0x49074a in transcode_init ffmpeg/ffmpeg.c:2486
    #5 0x48bff2 in transcode ffmpeg/ffmpeg.c:3204
    #6 0x48b462 in main ffmpeg/ffmpeg.c:3411
    #7 0x7f8cba42476c in __libc_start_main /build/buildd/eglibc-2.15/csu/libc-start.c:226

[...]
-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

During times of universal deceit, telling the truth becomes a
revolutionary act. -- George Orwell
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 198 bytes
Desc: Digital signature
URL: <http://ffmpeg.org/pipermail/ffmpeg-cvslog/attachments/20130823/0b259b19/attachment.asc>


More information about the ffmpeg-cvslog mailing list