Opened 9 months ago

Last modified 9 months ago

#9580 new defect

WebVTT decoder processes an invalid input file without complaining, producing a truncated output

Reported by: Lise Owned by:
Priority: normal Component: avcodec
Version: git-master Keywords: webvtt
Cc: Blocked By:
Blocking: Reproduced by developer: no
Analyzed by developer: no

Description

If there is an error in the input WebVTT file, ffmpeg just processes the file until the error, without any warnings. The result is a truncated output file.

How to reproduce:

Input file (the line with 'why?' makes the file an invalid webvtt I guess):

WEBVTT

00:01.000 --> 00:04.000
- Never drink liquid nitrogen.

why?

00:05.000 --> 00:09.000
- It will perforate your stomach.
- You could die.

Command and console output:

ffmpeg -v 9 -loglevel 99 -i invalid.vtt -c copy truncated.vtt

ffmpeg version N-105057-g68d0a7e446-20220103 Copyright (c) 2000-2022 the FFmpeg developers
  built with gcc 11.2.0 (crosstool-NG 1.24.0.498_5075e1f)
  configuration: --prefix=/ffbuild/prefix --pkg-config-flags=--static --pkg-config=pkg-config --cross-prefix=x86_64-ffbuild-linux-gnu- --arch=x86_64 --target-os=linux --enable-gpl --enable-version3 --disable-debug --enable-iconv --enable-libxml2 --enable-zlib --enable-libfreetype --enable-libfribidi --enable-gmp --enable-lzma --enable-fontconfig --enable-libvorbis --enable-opencl --enable-libpulse --enable-libvmaf --enable-libxcb --enable-xlib --enable-amf --enable-libaom --enable-avisynth --enable-libdav1d --enable-libdavs2 --disable-libfdk-aac --enable-ffnvcodec --enable-cuda-llvm --enable-frei0r --enable-libgme --enable-libass --enable-libbluray --enable-libmp3lame --enable-libopus --enable-mbedtls --enable-librist --enable-libtheora --enable-libvpx --enable-libwebp --enable-lv2 --enable-libmfx --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenh264 --enable-libopenjpeg --enable-libopenmpt --enable-librav1e --enable-librubberband --disable-schannel --enable-sdl2 --enable-libsoxr --enable-libsrt --enable-libsvtav1 --enable-libtwolame --enable-libuavs3d --enable-libdrm --enable-vaapi --enable-libvidstab --enable-vulkan --enable-libshaderc --enable-libplacebo --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-libxvid --enable-libzimg --enable-libzvbi --extra-cflags=-DLIBTWOLAME_STATIC --extra-cxxflags= --extra-ldflags=-pthread --extra-ldexeflags=-pie --extra-libs='-ldl -lgomp' --extra-version=20220103
  libavutil      57. 13.100 / 57. 13.100
  libavcodec     59. 15.102 / 59. 15.102
  libavformat    59. 12.100 / 59. 12.100
  libavdevice    59.  1.100 / 59.  1.100
  libavfilter     8. 21.100 /  8. 21.100
  libswscale      6.  1.102 /  6.  1.102
  libswresample   4.  0.100 /  4.  0.100
  libpostproc    56.  0.100 / 56.  0.100
Splitting the commandline.
Reading option '-v' ... matched as option 'v' (set logging level) with argument '9'.                                           
Reading option '-loglevel' ... matched as option 'loglevel' (set logging level) with argument '99'.                            
Reading option '-i' ... matched as input url with argument 'invalid.vtt'.                                                      
Reading option '-c' ... matched as option 'c' (codec name) with argument 'copy'.                                               
Reading option 'truncated.vtt' ... matched as output url.                                                                      
Finished splitting the commandline.                                                                                            
Parsing a group of options: global .                                                                                           
Applying option v (set logging level) with argument 9.                                                                         
Successfully parsed a group of options.                                                                                        
Parsing a group of options: input url invalid.vtt.                                                                             
Successfully parsed a group of options.                                                                                        
Opening an input file: invalid.vtt.                                                                                            
[NULL @ 0x55bc88dfa8c0] Opening 'invalid.vtt' for reading                                                                      
[file @ 0x55bc88dfb1c0] Setting default whitelist 'file,crypto,data'                                                           
Probing webvtt score:100 size:145                                                                                              
[webvtt @ 0x55bc88dfa8c0] Format webvtt probed with size=2048 and score=100                                                    
[webvtt @ 0x55bc88dfa8c0] Before avformat_find_stream_info() pos: 70 bytes read:145 seeks:0 nb_streams:1                       
[webvtt @ 0x55bc88dfa8c0] All info found                                                                                       
[webvtt @ 0x55bc88dfa8c0] stream 0: start_time: NOPTS duration: NOPTS                                                          
[webvtt @ 0x55bc88dfa8c0] format: start_time: NOPTS duration: NOPTS (estimate from bit rate) bitrate=0 kb/s                    
[webvtt @ 0x55bc88dfa8c0] After avformat_find_stream_info() pos: 70 bytes read:145 seeks:0 frames:0                            
Input #0, webvtt, from 'invalid.vtt':                                                                                          
  Duration: N/A, bitrate: N/A
  Stream #0:0, 0, 1/1000: Subtitle: webvtt
Successfully opened the file.
Parsing a group of options: output url truncated.vtt.                                                                          
Applying option c (codec name) with argument copy.                                                                             
Successfully parsed a group of options.                                                                                        
Opening an output file: truncated.vtt.                                                                                         
[file @ 0x55bc88e007c0] Setting default whitelist 'file,crypto,data'                                                           
Successfully opened the file.                                                                                                  
Output #0, webvtt, to 'truncated.vtt':                                                                                         
  Metadata:
    encoder         : Lavf59.12.100
  Stream #0:0, 0, 1/1000: Subtitle: webvtt
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
Press [q] to stop, [?] for help
cur_dts is invalid st:0 (0) [init:1 i_done:0 finish:0] (this is harmless if it occurs once at the start per stream)
No more output streams to write to, finishing.5kbits/s speed=N/A                                                               
size=       0kB time=00:00:01.00 bitrate=   0.5kbits/s speed=6.33e+03x                                                         
video:0kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 110.000000%
Input file #0 (invalid.vtt):
  Input stream #0:0 (subtitle): 1 packets read (30 bytes);                                                                     
  Total: 1 packets (30 bytes) demuxed                                                                                          
Output file #0 (truncated.vtt):                                                                                                
  Output stream #0:0 (subtitle): 1 packets muxed (30 bytes);                                                                   
  Total: 1 packets (30 bytes) muxed                                                                                            
[AVIOContext @ 0x55bc88e00a40] Statistics: 63 bytes written, 0 seeks, 1 writeouts                                              
0 frames successfully decoded, 0 decoding errors                                                                               
[AVIOContext @ 0x55bc88e03580] Statistics: 145 bytes read, 0 seeks                                                             

Output file:

WEBVTT

00:01.000 --> 00:04.000
- Never drink liquid nitrogen.

So we can see in the output that only 70 of 145 bytes were processed, that's the file until the error:

Before avformat_find_stream_info() pos: 70 bytes read:145

Maybe that is how it's supposed to work, but a warning or error message would be helpful here.

Change History (1)

comment:1 by Lise, 9 months ago

Summary: WebVTT decoder processes an invalid input file without complaining, producing a tuncated outputWebVTT decoder processes an invalid input file without complaining, producing a truncated output
Note: See TracTickets for help on using tickets.