diff mbox series

[FFmpeg-devel,15/21] fftools/ffmpeg: set AVFrame.time_base for decoded frames

Message ID 20230427142601.2613-15-anton@khirnov.net
State Accepted
Commit 6bbea932ca9a0f124b713bef361a9e4ef19d2583
Headers show
Series [FFmpeg-devel,01/21] fftools/ffmpeg: deprecate -adrift_threshold | expand

Checks

Context Check Description
andriy/make_x86 success Make finished
andriy/make_fate_x86 success Make fate finished

Commit Message

Anton Khirnov April 27, 2023, 2:25 p.m. UTC
Makes it easier to keep track of the timebase the frames are in.
---
 fftools/ffmpeg.c | 22 ++++++++++++----------
 1 file changed, 12 insertions(+), 10 deletions(-)
diff mbox series

Patch

diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c
index 5913a57d16..8829a163e0 100644
--- a/fftools/ffmpeg.c
+++ b/fftools/ffmpeg.c
@@ -855,6 +855,8 @@  static int decode(InputStream *ist, AVCodecContext *avctx,
             fd->idx = avctx->frame_num - 1;
         }
 
+        frame->time_base = avctx->pkt_timebase;
+
         *got_frame = 1;
     }
 
@@ -885,7 +887,6 @@  static int decode_audio(InputStream *ist, AVPacket *pkt, int *got_output,
     AVFrame *decoded_frame = ist->decoded_frame;
     AVCodecContext *avctx = ist->dec_ctx;
     int ret, err = 0;
-    AVRational decoded_frame_tb;
 
     update_benchmark(NULL);
     ret = decode(ist, avctx, decoded_frame, got_output, pkt);
@@ -909,23 +910,24 @@  static int decode_audio(InputStream *ist, AVPacket *pkt, int *got_output,
     ist->next_dts += ((int64_t)AV_TIME_BASE * decoded_frame->nb_samples) /
                      decoded_frame->sample_rate;
 
-    if (decoded_frame->pts != AV_NOPTS_VALUE) {
-        decoded_frame_tb   = ist->st->time_base;
-    }else {
+    if (decoded_frame->pts == AV_NOPTS_VALUE) {
         decoded_frame->pts = ist->dts;
-        decoded_frame_tb   = AV_TIME_BASE_Q;
+        decoded_frame->time_base = AV_TIME_BASE_Q;
     }
     if (pkt && pkt->duration && ist->prev_pkt_pts != AV_NOPTS_VALUE &&
         pkt->pts != AV_NOPTS_VALUE && pkt->pts - ist->prev_pkt_pts > pkt->duration)
         ist->filter_in_rescale_delta_last = AV_NOPTS_VALUE;
     if (pkt)
         ist->prev_pkt_pts = pkt->pts;
-    if (decoded_frame->pts != AV_NOPTS_VALUE)
-        decoded_frame->pts = av_rescale_delta(decoded_frame_tb, decoded_frame->pts,
-                                              (AVRational){1, decoded_frame->sample_rate},
-                                              decoded_frame->nb_samples,
+    if (decoded_frame->pts != AV_NOPTS_VALUE) {
+        AVRational tb_filter = (AVRational){1, decoded_frame->sample_rate};
+        decoded_frame->pts = av_rescale_delta(decoded_frame->time_base, decoded_frame->pts,
+                                              tb_filter, decoded_frame->nb_samples,
                                               &ist->filter_in_rescale_delta_last,
-                                              (AVRational){1, decoded_frame->sample_rate});
+                                              tb_filter);
+        decoded_frame->time_base = tb_filter;
+    }
+
     ist->nb_samples = decoded_frame->nb_samples;
     err = send_frame_to_filters(ist, decoded_frame);