summaryrefslogtreecommitdiff
path: root/libavformat/avformat.c
diff options
context:
space:
mode:
authorAndreas Rheinhardt <andreas.rheinhardt@outlook.com>2022-05-07 08:59:48 +0200
committerAndreas Rheinhardt <andreas.rheinhardt@outlook.com>2022-05-10 07:49:16 +0200
commit60fa58b8357984867b9104ad5e902a21ba2d78b0 (patch)
tree4310be419f5465cd16f5d99d2fdff25b3dc594b2 /libavformat/avformat.c
parentfc2fc98c7535b2984010155292efbe634b267485 (diff)
avformat/utils: Move avpriv_set_pts_info() to avformat.c
It is an essential auxiliary function for both demuxing and muxing. Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
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)
{