[FFmpeg-trac] #8644(undetermined:new): Demux multi-image TIFF beyond first image
FFmpeg
trac at avcodec.org
Thu Apr 30 14:50:00 EEST 2020
#8644: Demux multi-image TIFF beyond first image
-------------------------------------+-------------------------------------
Reporter: adaerr | Type:
| enhancement
Status: new | Priority: normal
Component: | Version: git-
undetermined | master
Keywords: tiff | Blocked By:
Blocking: | Reproduced by developer: 0
Analyzed by developer: 0 |
-------------------------------------+-------------------------------------
I would like to create a video from a TIFF file containing a sequence
of images of the same size. However currently ffmpeg decodes only the
first image from the TIFF input.
TIFF files containing multiple images are indeed possible, and used as
native format by software ranging from scan software to scientific
image processing software like ImageJ. It would be convenient if
ffmpeg could decode/demux/process the sequence of images as a video input
just as it can for a collection of image files. In other words, I
would expect
`ffmpeg -i all-frames.tif video-from-tif.webm`
to produce the same video as that obtained by splitting the TIFF into
separate files and running
`ffmpeg -i single-frame-%03d.png video-from-png.webm`
The observed behaviour (see full output below) is that ffmpeg only
reads a single image from TIFF input, so that `video-from-tif.webm`
contains only one frame, where `video-from-png.webm` contains the same
number of frames as there are PNG files in the input.
To reproduce, I attach[*] a sample TIFF with 20 frames:
`20-frame-stack_416x160_grayscale-8bpp.tif`
[*] Sorry, I failed to connect and upload the sample to the ftp server as
specified in the instructions at http://www.ffmpeg.org/bugreports.html
A test stack can also easily be generated by the convert tool from the
ImageMagick software. The following command line for example produces
a TIFF containing 30 256x256 grayscale (8bpp) images showing a
gradient in varying orientation.
`convert -size 256x256 gradient: -duplicate 29 -distort SRT
'%[fx:360*t/n]' -depth 8 30-frame-stack_256x256_grayscale-8pp.tif`
Here is the full log produced by a recent build from git sources:
{{{
Log level: 48
Command line:
/home/adrian/.local/bin/ffmpeg -report -i 20-frame-
stack_416x160_grayscale-8bpp.tif -y out.webm
ffmpeg version N-97504-g1128aa8753 Copyright (c) 2000-2020 the FFmpeg
developers
built with gcc 9 (Debian 9.3.0-10)
configuration: --prefix=/home/adrian/.local --enable-gpl --enable-
version3 --enable-nonfree --enable-shared --enable-pthreads --enable-
libfreetype --enable-fontconfig --enable-libass --enable-gnutls --enable-
librtmp --enable-libxcb --enable-libmp3lame --enable-libvorbis --enable-
libspeex --enable-libopus --enable-libgsm --enable-libopencore-amrnb
--enable-libopencore-amrwb --enable-libvo-amrwbenc --enable-libx264
--enable-libxvid --enable-libtheora --enable-libvpx --enable-libopenjpeg
--enable-frei0r --enable-libmodplug --enable-libzmq --enable-ladspa
--enable-libssh --enable-libzvbi --enable-libgme --enable-libwavpack
--enable-libwebp --enable-libx265 --enable-opengl --enable-librubberband
--enable-libxml2
libavutil 56. 43.100 / 56. 43.100
libavcodec 58. 82.100 / 58. 82.100
libavformat 58. 42.101 / 58. 42.101
libavdevice 58. 9.103 / 58. 9.103
libavfilter 7. 79.100 / 7. 79.100
libswscale 5. 6.101 / 5. 6.101
libswresample 3. 6.100 / 3. 6.100
libpostproc 55. 6.100 / 55. 6.100
Splitting the commandline.
Reading option '-report' ... matched as option 'report' (generate a
report) with argument '1'.
Reading option '-i' ... matched as input url with argument '20-frame-
stack_416x160_grayscale-8bpp.tif'.
Reading option '-y' ... matched as option 'y' (overwrite output files)
with argument '1'.
Reading option 'out.webm' ... matched as output url.
Finished splitting the commandline.
Parsing a group of options: global .
Applying option report (generate a report) with argument 1.
Applying option y (overwrite output files) with argument 1.
Successfully parsed a group of options.
Parsing a group of options: input url 20-frame-stack_416x160_grayscale-
8bpp.tif.
Successfully parsed a group of options.
Opening an input file: 20-frame-stack_416x160_grayscale-8bpp.tif.
[NULL @ 0x562105205440] Opening '20-frame-stack_416x160_grayscale-
8bpp.tif' for reading
[file @ 0x562105205f00] Setting default whitelist 'file,crypto,data'
[tiff_pipe @ 0x562105205440] Format tiff_pipe probed with size=2048 and
score=51
[tiff_pipe @ 0x562105205440] Before avformat_find_stream_info() pos: 0
bytes read:32768 seeks:0 nb_streams:1
[tiff_pipe @ 0x562105205440] parser not found for codec tiff, packets or
times may be invalid.
[tiff_pipe @ 0x562105205440] parser not found for codec tiff, packets or
times may be invalid.
[tiff_pipe @ 0x562105205440] After avformat_find_stream_info() pos:
1334978 bytes read:1334978 seeks:0 frames:1
Input #0, tiff_pipe, from '20-frame-stack_416x160_grayscale-8bpp.tif':
Duration: N/A, bitrate: N/A
Stream #0:0, 1, 1/25: Video: tiff, gray, 416x160 [SAR 1:1 DAR 13:5],
25 tbr, 25 tbn, 25 tbc
Successfully opened the file.
Parsing a group of options: output url out.webm.
Successfully parsed a group of options.
Opening an output file: out.webm.
[file @ 0x562105218540] Setting default whitelist 'file,crypto,data'
Successfully opened the file.
detected 4 logical cores
Stream mapping:
Stream #0:0 -> #0:0 (tiff (native) -> vp9 (libvpx-vp9))
Press [q] to stop, [?] for help
cur_dts is invalid st:0 (0) [init:0 i_done:0 finish:0] (this is harmless
if it occurs once at the start per stream)
cur_dts is invalid st:0 (0) [init:0 i_done:0 finish:0] (this is harmless
if it occurs once at the start per stream)
[graph 0 input from stream 0:0 @ 0x562105355900] Setting 'video_size' to
value '416x160'
[graph 0 input from stream 0:0 @ 0x562105355900] Setting 'pix_fmt' to
value '8'
[graph 0 input from stream 0:0 @ 0x562105355900] Setting 'time_base' to
value '1/25'
[graph 0 input from stream 0:0 @ 0x562105355900] Setting 'pixel_aspect' to
value '1/1'
[graph 0 input from stream 0:0 @ 0x562105355900] Setting 'frame_rate' to
value '25/1'
[graph 0 input from stream 0:0 @ 0x562105355900] w:416 h:160 pixfmt:gray
tb:1/25 fr:25/1 sar:1/1
[format @ 0x562105355d00] Setting 'pix_fmts' to value
'yuv420p|yuva420p|yuv422p|yuv440p|yuv444p|gbrp'
[auto_scaler_0 @ 0x56210535de00] Setting 'flags' to value 'bicubic'
[auto_scaler_0 @ 0x56210535de00] w:iw h:ih flags:'bicubic' interl:0
[format @ 0x562105355d00] auto-inserting filter 'auto_scaler_0' between
the filter 'Parsed_null_0' and the filter 'format'
[AVFilterGraph @ 0x56210532d440] query_formats: 4 queried, 2 merged, 1
already done, 0 delayed
[auto_scaler_0 @ 0x56210535de00] picking gbrp out of 6 ref:gray alpha:0
[swscaler @ 0x56210535f300] Forcing full internal H chroma due to input
having non subsampled chroma
[auto_scaler_0 @ 0x56210535de00] w:416 h:160 fmt:gray sar:1/1 -> w:416
h:160 fmt:gbrp sar:1/1 flags:0x4
[libvpx-vp9 @ 0x56210521ac40] v1.8.2
[libvpx-vp9 @ 0x56210521ac40] --prefix=/usr --enable-pic --enable-shared
--disable-install-bins --disable-install-srcs --size-limit=16384x16384
--enable-postproc --enable-multi-res-encoding --enable-temporal-denoising
--enable-vp9-temporal-denoising --enable-vp9-postproc --target=x86_64
-linux-gcc
[libvpx-vp9 @ 0x56210521ac40] vpx_codec_enc_cfg
[libvpx-vp9 @ 0x56210521ac40] generic settings
g_usage: 0
g_threads: 8
g_profile: 1
g_w: 320
g_h: 240
g_bit_depth: 8
g_input_bit_depth: 8
g_timebase: {1/30}
g_error_resilient: 0
g_pass: 0
g_lag_in_frames: 25
[libvpx-vp9 @ 0x56210521ac40] rate control settings
rc_dropframe_thresh: 0
rc_resize_allowed: 0
rc_resize_up_thresh: 60
rc_resize_down_thresh: 30
rc_end_usage: 0
rc_twopass_stats_in: (nil)(0)
rc_target_bitrate: 256
[libvpx-vp9 @ 0x56210521ac40] quantizer settings
rc_min_quantizer: 0
rc_max_quantizer: 63
[libvpx-vp9 @ 0x56210521ac40] bitrate tolerance
rc_undershoot_pct: 25
rc_overshoot_pct: 25
[libvpx-vp9 @ 0x56210521ac40] temporal layering settings
ts_number_layers: 1
[libvpx-vp9 @ 0x56210521ac40]
layer_target_bitrate: 0 0 0 0 0
[libvpx-vp9 @ 0x56210521ac40]
ts_rate_decimator: 0 0 0 0 0
[libvpx-vp9 @ 0x56210521ac40]
ts_periodicity: 0
[libvpx-vp9 @ 0x56210521ac40]
ts_layer_id: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[libvpx-vp9 @ 0x56210521ac40] decoder buffer model
rc_buf_sz: 6000
rc_buf_initial_sz: 4000
rc_buf_optimal_sz: 5000
[libvpx-vp9 @ 0x56210521ac40] 2 pass rate control settings
rc_2pass_vbr_bias_pct: 50
rc_2pass_vbr_minsection_pct: 0
rc_2pass_vbr_maxsection_pct: 2000
[libvpx-vp9 @ 0x56210521ac40] rc_2pass_vbr_corpus_complexity:0
[libvpx-vp9 @ 0x56210521ac40] keyframing settings
kf_mode: 1
kf_min_dist: 0
kf_max_dist: 128
[libvpx-vp9 @ 0x56210521ac40]
[libvpx-vp9 @ 0x56210521ac40] Neither bitrate nor constrained quality
specified, using default CRF of 32
[libvpx-vp9 @ 0x56210521ac40] vpx_codec_enc_cfg
[libvpx-vp9 @ 0x56210521ac40] generic settings
g_usage: 0
g_threads: 4
g_profile: 1
g_w: 416
g_h: 160
g_bit_depth: 8
g_input_bit_depth: 8
g_timebase: {1/25}
g_error_resilient: 0
g_pass: 0
g_lag_in_frames: 25
[libvpx-vp9 @ 0x56210521ac40] rate control settings
rc_dropframe_thresh: 0
rc_resize_allowed: 0
rc_resize_up_thresh: 60
rc_resize_down_thresh: 30
rc_end_usage: 3
rc_twopass_stats_in: (nil)(0)
rc_target_bitrate: 256
[libvpx-vp9 @ 0x56210521ac40] quantizer settings
rc_min_quantizer: 0
rc_max_quantizer: 63
[libvpx-vp9 @ 0x56210521ac40] bitrate tolerance
rc_undershoot_pct: 25
rc_overshoot_pct: 25
[libvpx-vp9 @ 0x56210521ac40] temporal layering settings
ts_number_layers: 1
[libvpx-vp9 @ 0x56210521ac40]
layer_target_bitrate: 0 0 0 0 0
[libvpx-vp9 @ 0x56210521ac40]
ts_rate_decimator: 0 0 0 0 0
[libvpx-vp9 @ 0x56210521ac40]
ts_periodicity: 0
[libvpx-vp9 @ 0x56210521ac40]
ts_layer_id: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[libvpx-vp9 @ 0x56210521ac40] decoder buffer model
rc_buf_sz: 6000
rc_buf_initial_sz: 4000
rc_buf_optimal_sz: 5000
[libvpx-vp9 @ 0x56210521ac40] 2 pass rate control settings
rc_2pass_vbr_bias_pct: 50
rc_2pass_vbr_minsection_pct: 0
rc_2pass_vbr_maxsection_pct: 2000
[libvpx-vp9 @ 0x56210521ac40] rc_2pass_vbr_corpus_complexity:0
[libvpx-vp9 @ 0x56210521ac40] keyframing settings
kf_mode: 1
kf_min_dist: 0
kf_max_dist: 128
[libvpx-vp9 @ 0x56210521ac40]
[libvpx-vp9 @ 0x56210521ac40] vpx_codec_control
[libvpx-vp9 @ 0x56210521ac40] VP8E_SET_CPUUSED: 1
[libvpx-vp9 @ 0x56210521ac40] VP8E_SET_ARNR_MAXFRAMES: 0
[libvpx-vp9 @ 0x56210521ac40] VP8E_SET_ARNR_STRENGTH: 3
[libvpx-vp9 @ 0x56210521ac40] VP8E_SET_ARNR_TYPE: 3
[libvpx-vp9 @ 0x56210521ac40] VP8E_SET_STATIC_THRESHOLD: 0
[libvpx-vp9 @ 0x56210521ac40] VP8E_SET_CQ_LEVEL: 32
[libvpx-vp9 @ 0x56210521ac40] VP9E_SET_COLOR_SPACE: 7
[libvpx-vp9 @ 0x56210521ac40] VP9E_SET_COLOR_RANGE: 0
[libvpx-vp9 @ 0x56210521ac40] VP9E_SET_TARGET_LEVEL: 255
[libvpx-vp9 @ 0x56210521ac40] Using deadline: 1000000
[webm @ 0x562105216480] get_metadata_duration returned: 0
Output #0, webm, to 'out.webm':
Metadata:
encoder : Lavf58.42.101
Stream #0:0, 0, 1/1000: Video: vp9 (libvpx-vp9), gbrp, 416x160 [SAR
1:1 DAR 13:5], q=-1--1, 25 fps, 1k tbn, 25 tbc
Metadata:
encoder : Lavc58.82.100 libvpx-vp9
Side data:
cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: N/A
Clipping frame in rate conversion by 0.000008
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)
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)
[out_0_0 @ 0x56210535bb00] EOF on sink link out_0_0:default.
No more output streams to write to, finishing.
Automatically inserted bitstream filter 'vp9_superframe'; args=''
[webm @ 0x562105216480] Starting new cluster with timestamp 0 at offset
478 bytes
[webm @ 0x562105216480] Writing block of size 8070 with pts 0, dts 0,
duration 40 at relative offset 3 in cluster at offset 478. TrackNumber 1,
keyframe 1
[webm @ 0x562105216480] end duration = 40
[webm @ 0x562105216480] stream 0 end duration = 40
frame= 1 fps=0.0 q=0.0 Lsize= 8kB time=00:00:00.00
bitrate=68688.0kbits/s speed=0.0109x
video:8kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB
muxing overhead: 6.394052%
Input file #0 (20-frame-stack_416x160_grayscale-8bpp.tif):
Input stream #0:0 (video): 1 packets read (1334978 bytes); 1 frames
decoded;
Total: 1 packets (1334978 bytes) demuxed
Output file #0 (out.webm):
Output stream #0:0 (video): 1 frames encoded; 1 packets muxed (8070
bytes);
Total: 1 packets (8070 bytes) muxed
1 frames successfully decoded, 0 decoding errors
[AVIOContext @ 0x56210521b380] Statistics: 0 seeks, 1 writeouts
[AVIOContext @ 0x56210520e2c0] Statistics: 1334978 bytes read, 0 seeks
}}}
--
Ticket URL: <https://trac.ffmpeg.org/ticket/8644>
FFmpeg <https://ffmpeg.org>
FFmpeg issue tracker
More information about the FFmpeg-trac
mailing list