summaryrefslogtreecommitdiff
path: root/fftools
diff options
context:
space:
mode:
authorAnton Khirnov <anton@khirnov.net>2023-04-22 16:42:12 +0200
committerAnton Khirnov <anton@khirnov.net>2023-05-02 10:59:24 +0200
commit6bbea932ca9a0f124b713bef361a9e4ef19d2583 (patch)
treea3f57109618dbf17748deefc0772920b7843e9ac /fftools
parentb6e7d6439462e187e4725b611bd996d3ba939df6 (diff)
downloadffmpeg-6bbea932ca9a0f124b713bef361a9e4ef19d2583.tar.gz
fftools/ffmpeg: set AVFrame.time_base for decoded frames
Makes it easier to keep track of the timebase the frames are in.
Diffstat (limited to 'fftools')
-rw-r--r--fftools/ffmpeg.c22
1 files changed, 12 insertions, 10 deletions
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);