[FFmpeg-cvslog] avformat/seek: add ff_rescale_interval() function

Pierre-Anthony Lemieux git at videolan.org
Sat Mar 19 13:41:00 EET 2022


ffmpeg | branch: master | Pierre-Anthony Lemieux <pal at palemieux.com> | Fri Mar 11 09:16:50 2022 -0800| [b172c0f8c59c1d2921d6d1348ea2a5ae45b2288b] | committer: Zane van Iperen

avformat/seek: add ff_rescale_interval() function

Refactors a function used by avformat/concat and avformat/imf.

Signed-off-by: Zane van Iperen <zane at zanevaniperen.com>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=b172c0f8c59c1d2921d6d1348ea2a5ae45b2288b
---

 libavformat/internal.h | 20 ++++++++++++++++++++
 libavformat/seek.c     | 10 ++++++++++
 2 files changed, 30 insertions(+)

diff --git a/libavformat/internal.h b/libavformat/internal.h
index f24c68703f..342e6f7327 100644
--- a/libavformat/internal.h
+++ b/libavformat/internal.h
@@ -1023,4 +1023,24 @@ void avpriv_register_devices(const AVOutputFormat * const o[], const AVInputForm
  */
 int ff_format_shift_data(AVFormatContext *s, int64_t read_start, int shift_size);
 
+/**
+ * Rescales a timestamp and the endpoints of an interval to which the temstamp
+ * belongs, from a timebase `tb_in` to a timebase `tb_out`.
+ *
+ * The upper (lower) bound of the output interval is rounded up (down) such that
+ * the output interval always falls within the intput interval. The timestamp is
+ * rounded to the nearest integer and halfway cases away from zero, and can
+ * therefore fall outside of the output interval.
+ *
+ * Useful to simplify the rescaling of the arguments of AVInputFormat::read_seek2()
+ *
+ * @param[in] tb_in      Timebase of the input `min_ts`, `ts` and `max_ts`
+ * @param[in] tb_out     Timebase of the ouput `min_ts`, `ts` and `max_ts`
+ * @param[in,out] min_ts Lower bound of the interval
+ * @param[in,out] ts     Timestamp
+ * @param[in,out] max_ts Upper bound of the interval
+ */
+void ff_rescale_interval(AVRational tb_in, AVRational tb_out,
+                         int64_t *min_ts, int64_t *ts, int64_t *max_ts);
+
 #endif /* AVFORMAT_INTERNAL_H */
diff --git a/libavformat/seek.c b/libavformat/seek.c
index 405ca316b3..890aea7f8a 100644
--- a/libavformat/seek.c
+++ b/libavformat/seek.c
@@ -751,3 +751,13 @@ int avformat_flush(AVFormatContext *s)
     ff_read_frame_flush(s);
     return 0;
 }
+
+void ff_rescale_interval(AVRational tb_in, AVRational tb_out,
+                         int64_t *min_ts, int64_t *ts, int64_t *max_ts)
+{
+    *ts     = av_rescale_q    (*    ts, tb_in, tb_out);
+    *min_ts = av_rescale_q_rnd(*min_ts, tb_in, tb_out,
+                               AV_ROUND_UP   | AV_ROUND_PASS_MINMAX);
+    *max_ts = av_rescale_q_rnd(*max_ts, tb_in, tb_out,
+                               AV_ROUND_DOWN | AV_ROUND_PASS_MINMAX);
+}



More information about the ffmpeg-cvslog mailing list