summaryrefslogtreecommitdiff
path: root/libavformat/avformat.c
diff options
context:
space:
mode:
Diffstat (limited to 'libavformat/avformat.c')
-rw-r--r--libavformat/avformat.c26
1 files changed, 26 insertions, 0 deletions
diff --git a/libavformat/avformat.c b/libavformat/avformat.c
index 2249f09825..2a919ad89f 100644
--- a/libavformat/avformat.c
+++ b/libavformat/avformat.c
@@ -663,6 +663,32 @@ AVRational av_stream_get_codec_timebase(const AVStream *st)
return cffstream(st)->avctx->time_base;
}
+void avpriv_set_pts_info(AVStream *st, int pts_wrap_bits,
+ unsigned int pts_num, unsigned int pts_den)
+{
+ FFStream *const sti = ffstream(st);
+ AVRational new_tb;
+ if (av_reduce(&new_tb.num, &new_tb.den, pts_num, pts_den, INT_MAX)) {
+ if (new_tb.num != pts_num)
+ av_log(NULL, AV_LOG_DEBUG,
+ "st:%d removing common factor %d from timebase\n",
+ st->index, pts_num / new_tb.num);
+ } else
+ av_log(NULL, AV_LOG_WARNING,
+ "st:%d has too large timebase, reducing\n", st->index);
+
+ if (new_tb.num <= 0 || new_tb.den <= 0) {
+ av_log(NULL, AV_LOG_ERROR,
+ "Ignoring attempt to set invalid timebase %d/%d for st:%d\n",
+ new_tb.num, new_tb.den,
+ st->index);
+ return;
+ }
+ st->time_base = new_tb;
+ sti->avctx->pkt_timebase = new_tb;
+ st->pts_wrap_bits = pts_wrap_bits;
+}
+
const AVCodec *ff_find_decoder(AVFormatContext *s, const AVStream *st,
enum AVCodecID codec_id)
{