[FFmpeg-trac] #5662(avfilter:open): Enhancement request for the detelecine filter

FFmpeg trac at avcodec.org
Fri Jun 24 04:53:34 CEST 2016


#5662: Enhancement request for the detelecine filter
------------------------------------+------------------------------------
             Reporter:  mkver       |                    Owner:
                 Type:  defect      |                   Status:  open
             Priority:  normal      |                Component:  avfilter
              Version:  git-master  |               Resolution:
             Keywords:  detelecine  |               Blocked By:
             Blocking:              |  Reproduced by developer:  1
Analyzed by developer:  0           |
------------------------------------+------------------------------------

Comment (by mkver):

 Sorry for not including the command line and the console output. I read
 the bug report guidelines, but I did not think of this as a bug, but
 merely as a suggestion for an enhancement (therefore I also did not set
 the type of this ticket to "defect"). Anyway, here is it (when I initially
 did this I did of course not use the "-v 9 -loglevel 99 -report"
 parameters):

 {{{
 ffmpeg started on 2016-06-24 at 03:08:00
 Report written to "ffmpeg-20160624-030800.log"
 Command line:
 ffmpeg -v 9 -loglevel 99 -report -i Hardtelecine.mkv -vf detelecine -c:v
 libx264 -qp 0 Hardtelecine.detelecined.mkv
 ffmpeg version N-80256-g0a9e781 Copyright (c) 2000-2016 the FFmpeg
 developers
   built with gcc 5.4.0 (GCC)
   configuration: --disable-static --enable-shared --enable-gpl --enable-
 version3 --disable-w32threads --enable-nvenc --enable-avisynth --enable-
 bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv
 --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca
 --enable-libfreetype --enable-libgme --enable-libgsm --enable-libilbc
 --enable-libmodplug --enable-libmfx --enable-libmp3lame --enable-
 libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg
 --enable-libopus --enable-librtmp --enable-libschroedinger --enable-
 libsnappy --enable-libsoxr --enable-libspeex --enable-libtheora --enable-
 libtwolame --enable-libvidstab --enable-libvo-amrwbenc --enable-libvorbis
 --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264
 --enable-libx265 --enable-libxavs --enable-libxvid --enable-libzimg
 --enable-lzma --enable-decklink --enable-zlib
   libavutil      55. 24.100 / 55. 24.100
   libavcodec     57. 45.100 / 57. 45.100
   libavformat    57. 37.101 / 57. 37.101
   libavdevice    57.  0.101 / 57.  0.101
   libavfilter     6. 46.101 /  6. 46.101
   libswscale      4.  1.100 /  4.  1.100
   libswresample   2.  0.101 /  2.  0.101
   libpostproc    54.  0.100 / 54.  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 '-report' ... matched as option 'report' (generate a
 report) with argument '1'.
 Reading option '-i' ... matched as input file with argument
 'Hardtelecine.mkv'.
 Reading option '-vf' ... matched as option 'vf' (set video filters) with
 argument 'detelecine'.
 Reading option '-c:v' ... matched as option 'c' (codec name) with argument
 'libx264'.
 Reading option '-qp' ... matched as AVOption 'qp' with argument '0'.
 Reading option 'Hardtelecine.detelecined.mkv' ... matched as output file.
 Finished splitting the commandline.
 Parsing a group of options: global .
 Applying option v (set logging level) with argument 9.
 Applying option loglevel (set logging level) with argument 99.
 Applying option report (generate a report) with argument 1.
 Successfully parsed a group of options.
 Parsing a group of options: input file Hardtelecine.mkv.
 Successfully parsed a group of options.
 Opening an input file: Hardtelecine.mkv.
 [file @ 00000000004b69e0] Setting default whitelist 'file,crypto'
 [matroska,webm @ 00000000004b5300] Format matroska,webm probed with
 size=2048 and score=100
 st:0 removing common factor 50000 from timebase
 [matroska,webm @ 00000000004b5300] Before avformat_find_stream_info() pos:
 233 bytes read:32768 seeks:0
 [h264 @ 00000000004c8640] nal_unit_type: 7, nal_ref_idc: 3
 [h264 @ 00000000004c8640] nal_unit_type: 8, nal_ref_idc: 3
 [h264 @ 00000000004c8640] nal_unit_type: 7, nal_ref_idc: 3
 [h264 @ 00000000004c8640] nal_unit_type: 8, nal_ref_idc: 3
 [h264 @ 00000000004c8640] user data:"x264 - core 148 r2694 3b70645 -
 H.264/MPEG-4 AVC codec - Copyleft 2003-2016 -
 http://www.videolan.org/x264.html - options: cabac=1 ref=16 deblock=1:0:0
 analyse=0x1:0x131 me=umh subme=9 psy=0 mixed_ref=1 me_range=24 chroma_me=1
 trellis=0 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=0 chroma_qp_offset=0
 threads=6 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1
 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=0 weightp=2
 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc=cqp mbtree=0 qp=0"
 [h264 @ 00000000004c8640] nal_unit_type: 6, nal_ref_idc: 0
 [h264 @ 00000000004c8640] nal_unit_type: 5, nal_ref_idc: 3
 [h264 @ 00000000004c8640] user data:"x264 - core 148 r2694 3b70645 -
 H.264/MPEG-4 AVC codec - Copyleft 2003-2016 -
 http://www.videolan.org/x264.html - options: cabac=1 ref=16 deblock=1:0:0
 analyse=0x1:0x131 me=umh subme=9 psy=0 mixed_ref=1 me_range=24 chroma_me=1
 trellis=0 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=0 chroma_qp_offset=0
 threads=6 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1
 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=0 weightp=2
 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc=cqp mbtree=0 qp=0"
 [h264 @ 00000000004c8640] nal_unit_type: 1, nal_ref_idc: 2
 [h264 @ 00000000004c8640] nal_unit_type: 1, nal_ref_idc: 2
 [h264 @ 00000000004c8640] nal_unit_type: 1, nal_ref_idc: 2
 [h264 @ 00000000004c8640] nal_unit_type: 1, nal_ref_idc: 2
 [matroska,webm @ 00000000004b5300] decoding for stream 0 failed
 [matroska,webm @ 00000000004b5300] After avformat_find_stream_info() pos:
 396347 bytes read:396347 seeks:0 frames:5
 Input #0, matroska,webm, from 'Hardtelecine.mkv':
   Metadata:
     encoder         : Haali Matroska Writer b0
   Duration: 00:00:00.17, bitrate: 19005 kb/s
     Stream #0:0(eng), 5, 1/20000: Video: h264 (High 4:4:4 Predictive), 1
 reference frame, yuv420p(left), 718x480 (0x0) [SAR 8:9 DAR 359:270], 0/1,
 29.97 fps, 29.97 tbr, 20k tbn, 59.94 tbc (default)
 Successfully opened the file.
 Parsing a group of options: output file Hardtelecine.detelecined.mkv.
 Applying option vf (set video filters) with argument detelecine.
 Applying option c:v (codec name) with argument libx264.
 Successfully parsed a group of options.
 Opening an output file: Hardtelecine.detelecined.mkv.
 [file @ 0000000002243b40] Setting default whitelist 'file,crypto'
 Successfully opened the file.
 detected 4 logical cores
 [Parsed_detelecine_0 @ 00000000004bc2a0] Detelecine pattern 23 removes up
 to 2 frames per frame, pts advance factor: 5/4
 [graph 0 input from stream 0:0 @ 00000000004bcc20] Setting 'video_size' to
 value '718x480'
 [graph 0 input from stream 0:0 @ 00000000004bcc20] Setting 'pix_fmt' to
 value '0'
 [graph 0 input from stream 0:0 @ 00000000004bcc20] Setting 'time_base' to
 value '1/20000'
 [graph 0 input from stream 0:0 @ 00000000004bcc20] Setting 'pixel_aspect'
 to value '8/9'
 [graph 0 input from stream 0:0 @ 00000000004bcc20] Setting 'sws_param' to
 value 'flags=2'
 [graph 0 input from stream 0:0 @ 00000000004bcc20] Setting 'frame_rate' to
 value '30000/1001'
 [graph 0 input from stream 0:0 @ 00000000004bcc20] w:718 h:480
 pixfmt:yuv420p tb:1/20000 fr:30000/1001 sar:8/9 sws_param:flags=2
 [format @ 00000000004bd0a0] compat: called with
 args=[yuv420p|yuvj420p|yuv422p|yuvj422p|yuv444p|yuvj444p|nv12|nv16|nv21]
 [format @ 00000000004bd0a0] Setting 'pix_fmts' to value
 'yuv420p|yuvj420p|yuv422p|yuvj422p|yuv444p|yuvj444p|nv12|nv16|nv21'
 [AVFilterGraph @ 00000000022058a0] query_formats: 4 queried, 3 merged, 0
 already done, 0 delayed
 [Parsed_detelecine_0 @ 00000000004bc2a0] FPS: 30000/1001 -> 24000/1001
 [Parsed_detelecine_0 @ 00000000004bc2a0] TB: 1/20000 -> 1/16000
 [h264 @ 00000000004bdbc0] nal_unit_type: 7, nal_ref_idc: 3
 [h264 @ 00000000004bdbc0] nal_unit_type: 8, nal_ref_idc: 3
 [libx264 @ 0000000002205300] using mv_range_thread = 40
 [libx264 @ 0000000002205300] using SAR=8/9
 [libx264 @ 0000000002205300] using cpu capabilities: MMX2 SSE2Fast SSSE3
 SSE4.2 AVX FMA3 AVX2 LZCNT BMI2
 [libx264 @ 0000000002205300] profile High 4:4:4 Predictive, level 3.0,
 4:2:0 8-bit
 [libx264 @ 0000000002205300] 264 - core 148 r2694 3b70645 - H.264/MPEG-4
 AVC codec - Copyleft 2003-2016 - http://www.videolan.org/x264.html -
 options: cabac=1 ref=3 deblock=1:0:0 analyse=0x1:0x111 me=hex subme=7
 psy=0 mixed_ref=1 me_range=16 chroma_me=1 trellis=0 8x8dct=1 cqm=0
 deadzone=21,11 fast_pskip=0 chroma_qp_offset=0 threads=6
 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0
 bluray_compat=0 constrained_intra=0 bframes=0 weightp=2 keyint=250
 keyint_min=23 scenecut=40 intra_refresh=0 rc=cqp mbtree=0 qp=0
 [matroska @ 0000000002242be0] Using AVStream.codec to pass codec
 parameters to muxers is deprecated, use AVStream.codecpar instead.
 Output #0, matroska, to 'Hardtelecine.detelecined.mkv':
   Metadata:
     encoder         : Lavf57.37.101
     Stream #0:0(eng), 0, 1/1000: Video: h264 (libx264), 1 reference frame
 (H264 / 0x34363248), yuv420p(left), 718x480 (0x0) [SAR 8:9 DAR 359:270],
 0/1, q=-1--1, 23.98 fps, 1k tbn, 23.98 tbc (default)
     Metadata:
       encoder         : Lavc57.45.100 libx264
     Side data:
       cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: -1
 Stream mapping:
   Stream #0:0 -> #0:0 (h264 (native) -> h264 (libx264))
 Press [q] to stop, [?] for help
 cur_dts is invalid (this is harmless if it occurs once at the start per
 stream)
 cur_dts is invalid (this is harmless if it occurs once at the start per
 stream)
 [h264 @ 00000000004bdbc0] nal_unit_type: 6, nal_ref_idc: 0
 [h264 @ 00000000004bdbc0] nal_unit_type: 5, nal_ref_idc: 3
 [h264 @ 00000000004bdbc0] user data:"x264 - core 148 r2694 3b70645 -
 H.264/MPEG-4 AVC codec - Copyleft 2003-2016 -
 http://www.videolan.org/x264.html - options: cabac=1 ref=16 deblock=1:0:0
 analyse=0x1:0x131 me=umh subme=9 psy=0 mixed_ref=1 me_range=24 chroma_me=1
 trellis=0 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=0 chroma_qp_offset=0
 threads=6 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1
 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=0 weightp=2
 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc=cqp mbtree=0 qp=0"
 cur_dts is invalid (this is harmless if it occurs once at the start per
 stream)
 [h264 @ 0000000002534000] nal_unit_type: 1, nal_ref_idc: 2
 cur_dts is invalid (this is harmless if it occurs once at the start per
 stream)
 [h264 @ 00000000025344a0] nal_unit_type: 1, nal_ref_idc: 2
 cur_dts is invalid (this is harmless if it occurs once at the start per
 stream)
 [h264 @ 000000000051efe0] nal_unit_type: 1, nal_ref_idc: 2
 [h264 @ 000000000051f480] nal_unit_type: 1, nal_ref_idc: 2
 Clipping frame in rate conversion by 0.000008
 cur_dts is invalid (this is harmless if it occurs once at the start per
 stream)
 Clipping frame in rate conversion by 0.000481
 cur_dts is invalid (this is harmless if it occurs once at the start per
 stream)
 cur_dts is invalid (this is harmless if it occurs once at the start per
 stream)
 cur_dts is invalid (this is harmless if it occurs once at the start per
 stream)
 cur_dts is invalid (this is harmless if it occurs once at the start per
 stream)
 cur_dts is invalid (this is harmless if it occurs once at the start per
 stream)
 cur_dts is invalid (this is harmless if it occurs once at the start per
 stream)
 [output stream 0:0 @ 00000000004bcea0] EOF on sink link output stream
 0:0:default.
 No more output streams to write to, finishing.
 [libx264 @ 0000000002205300] scene cut at 3 Icost:247409 Pcost:241812
 ratio:0.0226 bias:0.0250 gop:3 (imb:1130 pmb:74)
 [libx264 @ 0000000002205300] frame=   0 QP=0.00 NAL=3 Slice:I Poc:0
 I:1350 P:0    SKIP:0    size=120527 bytes
 [matroska @ 0000000002242be0] Writing block at offset 725, size 121056,
 pts 0, dts 0, duration 42, keyframe 1
 [libx264 @ 0000000002205300] frame=   1 QP=0.00 NAL=2 Slice:P Poc:2
 I:128  P:1044 SKIP:178  size=34483 bytes
 [matroska @ 0000000002242be0] Writing block at offset 121790, size 34483,
 pts 42, dts 42, duration 42, keyframe 0
 [libx264 @ 0000000002205300] frame=   2 QP=0.00 NAL=2 Slice:P Poc:4
 I:1047 P:303  SKIP:0    size=122464 bytes
 [matroska @ 0000000002242be0] Writing block at offset 156281, size 122464,
 pts 83, dts 83, duration 42, keyframe 0
 [libx264 @ 0000000002205300] frame=   3 QP=0.00 NAL=2 Slice:I Poc:6
 I:1350 P:0    SKIP:0    size=107946 bytes
 [matroska @ 0000000002242be0] Writing block at offset 278753, size 107946,
 pts 125, dts 125, duration 42, keyframe 0
 [matroska @ 0000000002242be0] end duration = 167
 [matroska @ 0000000002242be0] stream 0 end duration = 167
 frame=    4 fps=0.0 q=-1.0 Lsize=     378kB time=00:00:00.12
 bitrate=24554.7kbits/s speed=0.377x
 video:377kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB
 muxing overhead: 0.203913%
 Input file #0 (Hardtelecine.mkv):
   Input stream #0:0 (video): 5 packets read (396068 bytes); 5 frames
 decoded;
   Total: 5 packets (396068 bytes) demuxed
 Output file #0 (Hardtelecine.detelecined.mkv):
   Output stream #0:0 (video): 4 frames encoded; 4 packets muxed (385949
 bytes);
   Total: 4 packets (385949 bytes) muxed
 5 frames successfully decoded, 0 decoding errors
 [AVIOContext @ 00000000022057a0] Statistics: 25 seeks, 33 writeouts
 [libx264 @ 0000000002205300] frame I:2     Avg QP: 0.00  size:114236
 [libx264 @ 0000000002205300] frame P:2     Avg QP: 0.00  size: 78474
 [libx264 @ 0000000002205300] mb I  I16..4: 62.0%  0.0% 38.0%
 [libx264 @ 0000000002205300] mb P  I16..4: 35.6%  0.0%  7.9%  P16..4:
 41.3%  5.0%  3.6%  0.0%  0.0%    skip: 6.6%
 [libx264 @ 0000000002205300] 8x8 transform intra:0.0% inter:41.3%
 [libx264 @ 0000000002205300] coded y,uvDC,uvAC intra: 99.6% 99.8% 99.8%
 inter: 65.1% 68.2% 66.9%
 [libx264 @ 0000000002205300] i16 v,h,dc,p: 12% 88%  0%  0%
 [libx264 @ 0000000002205300] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 20% 67%  1%
 2%  3%  2%  2%  2%  1%
 [libx264 @ 0000000002205300] i8c dc,h,v,p:  1% 86% 13%  0%
 [libx264 @ 0000000002205300] Weighted P-Frames: Y:0.0% UV:0.0%
 [libx264 @ 0000000002205300] ref P L0: 92.0%  3.1%  5.0%
 [libx264 @ 0000000002205300] kb/s:18481.68
 [AVIOContext @ 00000000004beba0] Statistics: 396347 bytes read, 0 seeks

 }}}

 Because my initial description seems to be harder to understand than I
 imagined, I'll try it again:
 [[Image(ticket:5662:Hardtelecine.mkv_snapshot_3.png​)]] and
 [[Image(ticket:5662:Hardtelecine.mkv_snapshot_4.png​)]] are the last two
 frames of a 2:3 telecined video. The bottom fields of both frames should
 coincide, but in practice they don't. The detelecine filter now does not
 use the latter of these two frames as reconstruction of the fourth frame
 of the original source from which the telecine has been made. Instead it
 uses the bottom field of the former and the top field of the latter giving
 this result:
 [[Image(ticket:5662:Hardtelecine.detelecined.mkv_snapshot.png)]]
 I choose this example with a scenecut intentionally, but actually the
 situation arises (albeit not so severly) in non-scenecuts. Half of all the
 frames output by the detelecine filter are mixtures of two different
 frames from the telecined source (assuming a usual 2:3 pulldown). It could
 be as low as one quarter.
 I don't see a reason why it should be a disadvantage to use the complete
 frames instead of the mixed ones. The only videos for which this would be
 worse are probably videos made for this very purpose: One can of course
 create take a progressive clip, telecine it and disturb the bottom field
 of the last frame. But I don't know of any reason why such a sitation
 should happen in practice.
 There is by the way another complication: The detelecine filter accepts
 input with numbers bigger than 3 so that it is possible that for a frame
 of the original non-telecine source there are two or more full frame
 copies of this frame from which one has to choose one. The first complete
 frame sounds like a sensible strategy in such cases (which are probably
 rare; I have never ever heard of a pattern with a number >3).

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


More information about the FFmpeg-trac mailing list