[FFmpeg-trac] #6884(avfilter:reopened): Crash if libvmaf model file has DOS line endings or can't be found

FFmpeg trac at avcodec.org
Thu Nov 30 15:27:47 EET 2017


#6884: Crash if libvmaf model file has DOS line endings or can't be found
------------------------------------+------------------------------------
             Reporter:  Gyan        |                    Owner:
                 Type:  defect      |                   Status:  reopened
             Priority:  important   |                Component:  avfilter
              Version:  git-master  |               Resolution:
             Keywords:              |               Blocked By:
             Blocking:              |  Reproduced by developer:  1
Analyzed by developer:  1           |
------------------------------------+------------------------------------
Changes (by rbultje):

 * analyzed:  0 => 1
 * resolution:  needs_more_info =>
 * status:  closed => reopened
 * component:  undetermined => avfilter
 * reproduced:  0 => 1


Comment:

 {{{
 $ lldb ./ffmpeg_g
 (lldb) target create "./ffmpeg_g"
 r Current executable set to './ffmpeg_g' (x86_64).
 (lldb) r -i ~/Movies/nflx360p/res/box.1k.ivf -i
 ~/Movies/nflx360p/BoxingPractice.ffv1.mkv -lavfi
 libvmaf=/Users/ronaldbultje/Projects/vmaf/model/nflxall_vmafv3.pkl2 -f
 null -
 Process 52892 launched: './ffmpeg_g' (x86_64)
 ffmpeg version N-88433-gfa21ab3 Copyright (c) 2000-2017 the FFmpeg
 developers
   built with Apple LLVM version 9.0.0 (clang-900.0.38)
   configuration: --enable-gpl --samples=/Users/ronaldbultje/Movies/fate-
 suite-ff --enable-libvpx --enable-libx264 --enable-libvmaf --extra-
 cflags=-I/Users/ronaldbultje/Projects/libvpx --extra-libs='
 -L/Users/ronaldbultje/Projects/libvpx/x86-64' --disable-autodetect
   libavutil      56.  0.100 / 56.  0.100
   libavcodec     58.  1.100 / 58.  1.100
   libavformat    58.  0.102 / 58.  0.102
   libavdevice    58.  0.100 / 58.  0.100
   libavfilter     7.  0.101 /  7.  0.101
   libswscale      5.  0.101 /  5.  0.101
   libswresample   3.  0.100 /  3.  0.100
   libpostproc    55.  0.100 / 55.  0.100
 Input #0, ivf, from '/Users/ronaldbultje/Movies/nflx360p/res/box.1k.ivf':
   Duration: 00:00:04.23, start: 0.000000, bitrate: 985 kb/s
     Stream #0:0: Video: vp9 (Profile 0) (VP90 / 0x30395056), yuv420p(tv),
 640x360, 30 tbr, 30 tbn, 30 tbc
 Input #1, matroska,webm, from
 '/Users/ronaldbultje/Movies/nflx360p/BoxingPractice.ffv1.mkv':
   Metadata:
     ENCODER         : Lavf57.23.100
   Duration: 00:00:04.23, start: 0.000000, bitrate: 31842 kb/s
     Stream #1:0: Video: ffv1 (FFV1 / 0x31564646), yuv420p, 640x360, SAR
 1:1 DAR 16:9, 30 fps, 30 tbr, 1k tbn, 1k tbc (default)
     Metadata:
       ENCODER         : Lavc57.22.100 ffv1
       DURATION        : 00:00:04.233000000
 Stream mapping:
   Stream #0:0 (vp9) -> libvmaf:main
   Stream #1:0 (ffv1) -> libvmaf:reference
   libvmaf -> Stream #0:0 (wrapped_avframe)
 Press [q] to stop, [?] for help
 Start calculating VMAF score...
 Output #0, null, to 'pipe:':
   Metadata:
     encoder         : Lavf58.0.102
     Stream #0:0: Video: wrapped_avframe, yuv420p, 640x360, q=2-31, 200
 kb/s, 30 fps, 30 tbn, 30 tbc (default)
     Metadata:
       encoder         : Lavc58.1.100 wrapped_avframe
 Input model at /Users/ronaldbultje/Projects/vmaf/model/nflxall_vmafv3.pkl2
 cannot be read successfully.
 libc++abi.dylib: terminating with uncaught exception of type
 VmafException: Error loading model (.pkl): Trouble reading the
 file:/Users/ronaldbultje/Projects/vmaf/model/nflxall_vmafv3.pkl2
 Process 52892 stopped
 * thread #2, stop reason = signal SIGABRT
     frame #0: 0x00007fffb554bd42 libsystem_kernel.dylib`__pthread_kill +
 10
 libsystem_kernel.dylib`__pthread_kill:
 ->  0x7fffb554bd42 <+10>: jae    0x7fffb554bd4c            ; <+20>
     0x7fffb554bd44 <+12>: movq   %rax, %rdi
     0x7fffb554bd47 <+15>: jmp    0x7fffb5544caf            ;
 cerror_nocancel
     0x7fffb554bd4c <+20>: retq
 Target 0: (ffmpeg_g) stopped.
 (lldb) bt
 * thread #2, stop reason = signal SIGABRT
   * frame #0: 0x00007fffb554bd42 libsystem_kernel.dylib`__pthread_kill +
 10
     frame #1: 0x00007fffb5639457 libsystem_pthread.dylib`pthread_kill + 90
     frame #2: 0x00007fffb54b1420 libsystem_c.dylib`abort + 129
     frame #3: 0x00007fffb400494a libc++abi.dylib`abort_message + 266
     frame #4: 0x00007fffb4029c17
 libc++abi.dylib`default_terminate_handler() + 243
     frame #5: 0x00007fffb4b39713 libobjc.A.dylib`_objc_terminate() + 124
     frame #6: 0x00007fffb4026d49 libc++abi.dylib`std::__terminate(void
 (*)()) + 8
     frame #7: 0x00007fffb40267be libc++abi.dylib`__cxa_throw + 121
     frame #8: 0x0000000100d8dbe4
 ffmpeg_g`_read_and_assert_model(model_path="/Users/ronaldbultje/Projects/vmaf/model/nflxall_vmafv3.pkl2",
 feature_names=0x00007000104bb790, norm_type=<unavailable>,
 slopes=0x00007000104bb730, intercepts=<unavailable>,
 score_clip=<unavailable>, score_transform=<unavailable>) at vmaf.cpp:92
 [opt]
     frame #9: 0x0000000100d8e44c
 ffmpeg_g`VmafRunner::run(this=0x00007000104bb890, asset=<unavailable>,
 read_frame=(ffmpeg_g`read_frame_8bit at vf_libvmaf.c:145),
 user_data=0x0000000102504f40, disable_clip=<unavailable>,
 enable_transform=<unavailable>, do_psnr=<unavailable>,
 do_ssim=<unavailable>, do_ms_ssim=<unavailable>)(float*, float*, float*,
 int, void*), void*, bool, bool, bool, bool, bool) at vmaf.cpp:149 [opt]
     frame #10: 0x0000000100d92aa2 ffmpeg_g`RunVmaf(fmt=<unavailable>,
 width=640, height=360, read_frame=<unavailable>, user_data=<unavailable>,
 model_path="/Users/ronaldbultje/Projects/vmaf/model/nflxall_vmafv3.pkl2",
 log_path="UAWAVAUATSH\x83?HM\x89?A\x89?H\x89t$ H\x89?M\x8d?\x90",
 log_fmt=<unavailable>, disable_clip=<unavailable>,
 enable_transform=<unavailable>, do_psnr=<unavailable>,
 do_ssim=<unavailable>, do_ms_ssim=<unavailable>,
 pool_method=0x0000000000000000)(float*, float*, float*, int, void*),
 void*, char const*, char const*, char const*, bool, bool, bool, bool,
 bool, char const*) at vmaf.cpp:645 [opt]
     frame #11: 0x0000000100d6696f
 ffmpeg_g`::compute_vmaf(fmt=<unavailable>, width=<unavailable>,
 height=<unavailable>, read_frame=<unavailable>, user_data=<unavailable>,
 model_path=<unavailable>, log_path=0x0000000000000000,
 log_fmt=0x0000000000000000, disable_clip=0, disable_avx=0,
 enable_transform=0, phone_model=0, do_psnr=0, do_ssim=0, do_ms_ssim=0,
 pool_method=0x0000000000000000)(float *, float *, float *, int, void *),
 void *, char *, char *, char *, int, int, int, int, int, int, int, char *)
 at libvmaf.cpp:63 [opt]
     frame #12: 0x000000010010e86f ffmpeg_g`call_vmaf [inlined]
 compute_vmaf_score(s=0x0000000102504f40) at vf_libvmaf.c:159 [opt]
     frame #13: 0x000000010010e7cf
 ffmpeg_g`call_vmaf(ctx=0x0000000102504f40) at vf_libvmaf.c:168 [opt]
     frame #14: 0x00007fffb563693b libsystem_pthread.dylib`_pthread_body +
 180
     frame #15: 0x00007fffb5636887 libsystem_pthread.dylib`_pthread_start +
 286
     frame #16: 0x00007fffb563608d libsystem_pthread.dylib`thread_start +
 13
 }}}

 It appears the library aborts if the model is missing, so we should
 probably check that the model is valid before passing it in (at least
 check if the file exists), or alternatively fix the upstream code to not
 abort but instead return an error.

--
Ticket URL: <https://trac.ffmpeg.org/ticket/6884#comment:4>
FFmpeg <https://ffmpeg.org>
FFmpeg issue tracker


More information about the FFmpeg-trac mailing list