Skip to content

Improve handling of videos that are corrupt or have decoding failures #160

Description

@mmokrejs

Bug/Issue Description:

In bug #118 somebody else reported that dvr-scan silently stops processing its input. I have several HEVC containers manifestig same issue with dvr-scan v1.6 from pip. The HEVC file was created from many short 3gp files by ffmpeg.

dvr-scan --verbosity debug --min-event-length 2 --time-before-event 0.1s --time-post-event 0.1s --threshold 0.1 --kernel-size 3 --bg-subtractor MOG2 --output-mode opencv --add-region 5 816 843 984 2560 1492 2560 1920 1855 1920 1690 1551 0 1548 -i input.hevc -o output.mkv
[DVR-Scan] DVR-Scan 1.6
[DVR-Scan] Initializing scan context...
[DVR-Scan] Opened video input.hevc (2560 x 1920 at 25.000 FPS).
[DVR-Scan] Limiting detection to 1 region.
[DVR-Scan] Using subtractor MOG2 with kernel_size = 3
[DVR-Scan] Scanning input video for motion events...
Detected: 7773 | Progress: : 386991 frames [1:14:19, 88.38 frames/s][hevc @ 0x55e97abafd80] Duplicate POC in a sequence: 13.
Detected: 7775 | Progress: : 387014 frames [1:14:19, 86.78 frames/s]
[DVR-Scan] Processed 387014 frames read in 4459.8 secs (avg 86.8 FPS).
[DVR-Scan] Detected 7775 motion events in input.
[DVR-Scan] List of motion events:
-------------------------------------------------------------
|   Event #    |  Start Time  |   Duration   |   End Time   |
-------------------------------------------------------------
|  Event    1  |  00:00:07.4  |  00:00:00.2  |  00:00:07.6  |
...
|  Event 7775  |  04:18:00.4  |  00:00:00.2  |  04:18:00.6  |
-------------------------------------------------------------
[DVR-Scan] Comma-separated timecode values:
00:00:07.360,00:00:07.600,00:00:11.160,00:00:11.400,
...
,04:18:00.080,04:18:00.360,04:18:00.560
[DVR-Scan] Motion events written to disk.

I ran the same command now with --verbosity debug, there is little bit more info.

INFO: controller.run_dvr_scan(): Initializing scan context...
INFO: video_joiner._load_input_videos(): Opened video input.hevc (2560 x 1920 at 25.000 FPS).
INFO: scanner._handle_regions(): Limiting detection to 1 region.
DEBUG: detector.__init__(): Region Mask: area = (0,816),(2560,1920), coverage = 27.98%
INFO: scanner.scan(): Using subtractor MOG2 with kernel_size = 3
INFO: scanner.scan(): Scanning input video for motion events...
Detected: 7773 | Progress: : 386992 frames [1:56:06, 56.16 frames/s][hevc @ 0x55a89b671680] Duplicate POC in a sequence: 13.
Detected: 7774 | Progress: : 387009 frames [1:56:06, 54.36 frames/s]DEBUG: video_joiner.read(): No more input to process.
Detected: 7775 | Progress: : 387014 frames [1:56:06, 55.55 frames/s]
INFO: controller.run_dvr_scan(): Processed 387014 frames read in 6966.8 secs (avg 55.6 FPS).
INFO: controller.run_dvr_scan(): Detected 7775 motion events in input.
INFO: controller.run_dvr_scan(): List of motion events:
-------------------------------------------------------------
|   Event #    |  Start Time  |   Duration   |   End Time   |
-------------------------------------------------------------
|  Event    1  |  00:00:07.4  |  00:00:00.2  |  00:00:07.6  |
...

I tracked it back to the original 3gp file (51MB). mpv stalls in the problematic position with:

[ffmpeg/video] hevc: Duplicate POC in a sequence: 13.    
[ffmpeg/video] hevc: Error parsing NAL unit #0.
Error while decoding frame (hardware decoding)!

Maybe similar underlying issue is in iina/iina#3448 (no testcase)?

Meanwhile you can drop me an email so I can share some example files with you.

Would be nice if the List of motion events: table contained also the frame starts and ends, so that one could see if the input was processed up to the very last frame or not.

Expected Behavior:
A clear error message if dvr-scan stopped reading the input, ideally reporting ffmpeg command to extract some data around the problematic position in the input stream (for copy&pasting).

Computing Environment:

  • OS: Linux (Distro: Gentoo)
  • Python Version: 3.11.8
  • OpenCV Version: 4.9.0
$ ffmpeg 
ffmpeg version 4.4.4 Copyright (c) 2000-2023 the FFmpeg developers
  built with gcc 13 (Gentoo 13.2.1_p20240210 p14)
  configuration: --prefix=/usr --libdir=/usr/lib64 --shlibdir=/usr/lib64 --docdir=/usr/share/doc/ffmpeg-4.4.4-r9/html --mandir=/usr/share/man --enable-shared --cc=x86_64-pc-linux-gnu-gcc --cxx=x86_64-pc-linux-gnu-g++ --ar=x86_64-pc-linux-gnu-ar --nm=x86_64-pc-linux-gnu-nm --strip=x86_64-pc-linux-gnu-strip --ranlib=x86_64-pc-linux-gnu-ranlib --pkg-config=x86_64-pc-linux-gnu-pkg-config --optflags='-O2 -pipe -march=native -ftree-vectorize' --disable-static --enable-avfilter --enable-avresample --disable-stripping --disable-optimizations --disable-libcelt --enable-nonfree --enable-version3 --disable-indev=oss --disable-indev=jack --disable-outdev=oss --enable-version3 --enable-version3 --enable-nonfree --enable-bzlib --enable-runtime-cpudetect --disable-debug --disable-gcrypt --enable-gnutls --enable-gmp --enable-gpl --disable-hardcoded-tables --enable-iconv --enable-libxml2 --enable-lzma --enable-network --enable-opencl --enable-openssl --enable-postproc --disable-libsmbclient --disable-ffplay --disable-sdl2 --enable-vaapi --disable-vdpau --enable-vulkan --enable-xlib --enable-libxcb --enable-libxcb-shm --enable-libxcb-xfixes --enable-zlib --enable-libcdio --disable-libiec61883 --disable-libdc1394 --disable-libcaca --enable-openal --enable-opengl --enable-libv4l2 --disable-libpulse --enable-libdrm --disable-libjack --enable-libopencore-amrwb --enable-libopencore-amrnb --enable-libcodec2 --enable-libdav1d --enable-libfdk-aac --enable-libopenjpeg --disable-libbluray --disable-libgme --disable-libgsm --disable-libaribb24 --disable-mmal --disable-libmodplug --enable-libopus --disable-libmfx --disable-libilbc --enable-librtmp --enable-libssh --disable-libspeex --enable-libsrt --enable-librsvg --enable-ffnvcodec --enable-libvorbis --enable-libvpx --disable-libzvbi --disable-appkit --disable-libbs2b --disable-chromaprint --disable-cuda-llvm --disable-libflite --enable-frei0r --disable-libfribidi --enable-fontconfig --disable-libglslang --enable-ladspa --disable-libass --enable-libtesseract --disable-lv2 --enable-libfreetype --enable-libvidstab --disable-libvmaf --enable-librubberband --disable-libzmq --disable-libzimg --enable-libsoxr --enable-pthreads --disable-amf --enable-libvo-amrwbenc --disable-libkvazaar --enable-libaom --enable-libmp3lame --enable-libopenh264 --enable-librav1e --disable-libsnappy --enable-libsvtav1 --disable-libtheora --enable-libtwolame --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --disable-gnutls --disable-armv5te --disable-armv6 --disable-armv6t2 --disable-neon --disable-vfp --disable-vfpv3 --disable-armv8 --disable-mipsdsp --disable-mipsdspr2 --disable-mipsfpu --disable-altivec --disable-vsx --disable-power8 --disable-amd3dnow --disable-amd3dnowext --disable-fma4 --disable-xop --enable-pic --cpu=host --disable-doc --disable-htmlpages --enable-manpages
  libavutil      56. 70.100 / 56. 70.100
  libavcodec     58.134.100 / 58.134.100
  libavformat    58. 76.100 / 58. 76.100
  libavdevice    58. 13.100 / 58. 13.100
  libavfilter     7.110.100 /  7.110.100
  libavresample   4.  0.  0 /  4.  0.  0
  libswscale      5.  9.100 /  5.  9.100
  libswresample   3.  9.100 /  3.  9.100
  libpostproc    55.  9.100 / 55.  9.100
Hyper fast Audio and Video encoder
usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...

Use -h to get full help or, even better, run 'man ffmpeg'

but also with:

$ ffmpeg 
ffmpeg version 6.1.1 Copyright (c) 2000-2023 the FFmpeg developers
  built with gcc 13 (Gentoo 13.2.1_p20240210 p14)
  configuration: --prefix=/usr --libdir=/usr/lib64 --shlibdir=/usr/lib64 --docdir=/usr/share/doc/ffmpeg-6.1.1-r5/html --mandir=/usr/share/man --enable-shared --cc=x86_64-pc-linux-gnu-gcc --cxx=x86_64-pc-linux-gnu-g++ --ar=x86_64-pc-linux-gnu-ar --nm=x86_64-pc-linux-gnu-nm --strip=x86_64-pc-linux-gnu-strip --ranlib=x86_64-pc-linux-gnu-ranlib --pkg-config=x86_64-pc-linux-gnu-pkg-config --optflags='-O2 -pipe -march=native -ftree-vectorize' --disable-static --disable-libaribcaption --enable-avfilter --disable-stripping --disable-optimizations --disable-libcelt --enable-nonfree --enable-version3 --disable-indev=oss --disable-indev=jack --disable-outdev=oss --enable-version3 --enable-version3 --enable-nonfree --enable-bzlib --enable-runtime-cpudetect --disable-debug --disable-gcrypt --enable-gnutls --enable-gmp --enable-gpl --disable-hardcoded-tables --enable-iconv --enable-libxml2 --enable-lzma --enable-network --enable-opencl --enable-openssl --enable-postproc --disable-libsmbclient --disable-ffplay --disable-sdl2 --enable-vaapi --disable-vdpau --enable-vulkan --enable-xlib --enable-libxcb --enable-libxcb-shm --enable-libxcb-xfixes --enable-zlib --enable-libcdio --disable-libiec61883 --disable-libdc1394 --disable-libcaca --enable-openal --enable-opengl --enable-libv4l2 --disable-libpulse --enable-libdrm --disable-libjack --enable-libopencore-amrwb --enable-libopencore-amrnb --enable-libcodec2 --enable-libdav1d --enable-libfdk-aac --enable-libopenjpeg --disable-libjxl --disable-libbluray --disable-libgme --disable-libgsm --disable-libaribb24 --disable-libmodplug --enable-libopus --disable-libvpl --disable-libilbc --enable-librtmp --enable-libssh --disable-libspeex --enable-libsrt --enable-librsvg --disable-ffnvcodec --enable-libvorbis --enable-libvpx --disable-libzvbi --disable-appkit --disable-libbs2b --disable-chromaprint --disable-cuda-llvm --disable-libflite --enable-fontconfig --enable-frei0r --disable-libfribidi --disable-libglslang --enable-ladspa --enable-lcms2 --disable-libass --disable-libplacebo --enable-libtesseract --disable-lv2 --enable-librubberband --disable-libshaderc --enable-libfreetype --enable-libharfbuzz --enable-libvidstab --enable-libvmaf --disable-libzmq --disable-libzimg --enable-libsoxr --enable-pthreads --disable-amf --enable-libvo-amrwbenc --disable-libkvazaar --enable-libaom --enable-libmp3lame --enable-libopenh264 --enable-librav1e --disable-libsnappy --enable-libsvtav1 --disable-libtheora --enable-libtwolame --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --disable-gnutls --enable-version3 --disable-armv5te --disable-armv6 --disable-armv6t2 --disable-neon --disable-vfp --disable-vfpv3 --disable-armv8 --disable-dotprod --disable-i8mm --disable-mipsdsp --disable-mipsdspr2 --disable-mipsfpu --disable-altivec --disable-vsx --disable-power8 --disable-amd3dnow --disable-amd3dnowext --disable-fma4 --disable-xop --enable-pic --cpu=host --disable-doc --disable-htmlpages --enable-manpages
  libavutil      58. 29.100 / 58. 29.100
  libavcodec     60. 31.102 / 60. 31.102
  libavformat    60. 16.100 / 60. 16.100
  libavdevice    60.  3.100 / 60.  3.100
  libavfilter     9. 12.100 /  9. 12.100
  libswscale      7.  5.100 /  7.  5.100
  libswresample   4. 12.100 /  4. 12.100
  libpostproc    57.  3.100 / 57.  3.100
Hyper fast Audio and Video encoder
usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...

Use -h to get full help or, even better, run 'man ffmpeg'

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions