[Libav-user] Misuse of av_read_frame()'s return in the examples
Michel Rouzic
Michel0528 at yahoo.fr
Mon Mar 11 01:05:12 EET 2019
Most of the examples provided in doc/examples stop decoding when
av_read_frame() returns a negative number, which can cause them to
completely miss the last few frames of a video. I have verified that
this is a problem with transcoding.c using this 300 frame video (with
visually labelled frames for convenience)
https://photosounder.com/misc/drop_loop_300_frames_360p.mp4 and by
running `./transcoding.exe drop_loop_300_frames_360p.mp4
transcoded.mp4`. In a properly-written video player the original video's
last frame shows "299" as expected whereas the transcoding example
claims that only 298 were transcoded and the transcoded video indeed
shows the last frame as labelled "297". Transcoding the transcoded video
outputs only 296 frames, doing that again outputs only 294 frames, and
so on, so this is quite serious, and a quick `grep 'av_read_frame' *.c
-C 3` in the examples folder seems to show that all the examples might
be affected, so that would be great for everyone relying on the examples
if this could be addressed.
I don't quite know how to fix this except that somehow some empty frames
should be provided when av_read_frame() returns a negative value. FFplay
does it properly (see line 3007 of fftools/ffplay.c) however its code
lacks the genericness and clarity of the examples which makes it hard to
learn how to change the examples or my own code from it.
More information about the Libav-user
mailing list