From 4acdbb1c6c1901893ebbe2bca1ef9014fc97070c Mon Sep 17 00:00:00 2001 From: James Almer Date: Mon, 11 Jul 2016 22:09:34 -0300 Subject: [PATCH] avformat/oggenc: always use the time base stored in the theora header Fixes ticket #5704 Reviewed-by: Michael Niedermayer Signed-off-by: James Almer --- libavformat/oggenc.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/libavformat/oggenc.c b/libavformat/oggenc.c index fe1f34d843..6940a7b02f 100644 --- a/libavformat/oggenc.c +++ b/libavformat/oggenc.c @@ -533,6 +533,14 @@ static int ogg_write_header(AVFormatContext *s) bytestream_put_buffer(&p, cstr, 6); if (st->codecpar->codec_id == AV_CODEC_ID_THEORA) { + int den = AV_RB32(oggstream->header[0] + 22), num = AV_RB32(oggstream->header[0] + 26); + /* Make sure to use time base stored in the Theora stream header to write + correct timestamps */ + if (st->time_base.num != num || st->time_base.den != den) { + av_log(s, AV_LOG_DEBUG, "Changing time base from %d/%d to %d/%d\n", + st->time_base.num, st->time_base.den, num, den); + avpriv_set_pts_info(st, 64, num, den); + } /** KFGSHIFT is the width of the less significant section of the granule position The less significant section is the frame count since the last keyframe */ oggstream->kfgshift = ((oggstream->header[0][40]&3)<<3)|(oggstream->header[0][41]>>5);