Opened 12 years ago
Closed 12 years ago
#3329 closed defect (fixed)
fps filter bug
| Reported by: | Andrey Utkin | Owned by: | |
|---|---|---|---|
| Priority: | normal | Component: | avfilter |
| Version: | git-master | Keywords: | fps |
| Cc: | Blocked By: | ||
| Blocking: | Reproduced by developer: | yes | |
| Analyzed by developer: | yes |
Description
Summary of the bug:
Trying to make looped animation from several source images, raising framerate from 2 FPS to 25 FPS.
After several loops, order of frames was wrong in some places.
How to reproduce:
Take png files from attach.
ffmpeg -f image2 -loop 1 -framerate 2 -i '/tmp/arrow_%1d.png' -frames 1000 -vf fps=fps=25 /tmp/tmp.ts -y
ffmpeg version N-59981-g9d13432 Copyright (c) 2000-2014 the FFmpeg developers
built on Jan 19 2014 22:00:02 with gcc 4.6.3 (Gentoo 4.6.3 p1.13, pie-0.5.2)
configuration: --enable-gpl --enable-libx264 --enable-encoder=libx264 --disable-stripping --enable-debug --extra-cflags='-O0 -g -ggdb' --enable-libopus --enable-libvpx --enable-x11grab --enable-libfreetype --enable-filter=drawtext --enable-libzvbi
libavutil 52. 63.100 / 52. 63.100
libavcodec 55. 48.101 / 55. 48.101
libavformat 55. 24.100 / 55. 24.100
libavdevice 55. 5.102 / 55. 5.102
libavfilter 4. 1.100 / 4. 1.100
libswscale 2. 5.101 / 2. 5.101
libswresample 0. 17.104 / 0. 17.104
libpostproc 52. 3.100 / 52. 3.100
Input #0, image2, from '/tmp/arrow_%1d.png':
Duration: 00:00:01.50, start: 0.000000, bitrate: N/A
Stream #0:0: Video: png, rgba, 44x12, 2 fps, 2 tbr, 2 tbn, 2 tbc
Output #0, mpegts, to '/tmp/tmp.ts':
Metadata:
encoder : Lavf55.24.100
Stream #0:0: Video: mpeg2video, yuv420p, 44x12, q=2-31, 200 kb/s, 90k tbn, 25 tbc
Stream mapping:
Stream #0:0 -> #0:0 (png -> mpeg2video)
Press [q] to stop, [?] for help
frame=32188 fps=25692 q=2.0 Lsize= 9816kB time=00:21:27.48 bitrate= 62.5kbits/s}}}
Attachments (3)
Change History (6)
by , 12 years ago
| Attachment: | arrow_1.png added |
|---|
comment:1 by , 12 years ago
| Keywords: | fps added |
|---|---|
| Reproduced by developer: | set |
| Status: | new → open |
comment:2 by , 12 years ago
| Analyzed by developer: | set |
|---|
The timestamp logic in vf_fps is wrong. The major culprit is this hunk:
/* number of output frames */
delta = av_rescale_q_rnd(buf->pts - s->pts, inlink->time_base,
outlink->time_base, s->rounding);
As you can see, it means: number of frames to output = (time of next frame) - (time of current frame) rescaled to output frame rate. In this particular case (2 FPS -> 25 FPS, it is 12.5, rounded to 13. Rounded to 13 every time. That means a 0.5/25 error for every input frame.
The in this case fix would be to convert all timestamps to the output time base immediately, but it must be tested also when decreasing the frame rate and other corner cases.
As a temporary workaround, I suggest: -vf fps=50,framestep=2: 2→50 is exact, and framestep is easy.



arrow_1.png