ffmpeg: use new decode API

Multimedia / FFmpeg - wm4 [googlemail.com] - 1 October 2016 10:22 UTC

This is a bit messy, mainly due to timestamp handling.

decode_video() relied on the fact that it could set dts on a flush/drain packet. This is not possible with the old API, and won't be. (I think doing this was very questionable with the old API. Flush packets should not contain any information; they just cause a FIFO to be emptied.) This is replaced with checking the best_effort_timestamp for AV_NOPTS_VALUE, and using the suggested DTS in the drain case.

The modified tests (fate-cavs and others) still fails due to dropping the last frame. This happens because the timestamp of the last frame goes backwards (ffprobe -show_frames shows the same thing). I suspect that this "worked" due to the best effort timestamp logic picking the DTS over the decreasing PTS. Since this logic is in libavcodec (where it probably shouldn't be), this can't be easily fixed. The timestamps of the cavs samples are weird anyway, so I chose not to fix it.

Another strange thing is the timestamp handling in the video path of process_input_packet (after the decode_video() call). It looks like the code to increase next_dts and next_pts should be run every time a frame is decoded - but it's needed even if output is skipped.

8f6f232 ffmpeg: use new decode API
ffmpeg.c | 178 ++++++++++++++++++++++++++++------------
ffmpeg.h | 3 +
tests/ref/fate/cavs | 1 -
tests/ref/fate/mpeg2-ticket186 | 1 -
tests/ref/fate/svq3-watermark | 1 -
5 files changed, 129 insertions(+), 55 deletions(-)

  • Share