diff mbox series

[FFmpeg-devel] fftools: allow decoders to set AVFrame time_base

Message ID 20220910164259.213742-1-leo.izen@gmail.com
State New
Headers show
Series [FFmpeg-devel] fftools: allow decoders to set AVFrame time_base | expand

Checks

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

Commit Message

Leo Izen Sept. 10, 2022, 4:42 p.m. UTC
This patch allows decoders to set AVFrame->time_base, which
determines the units that AVFrame->pts will use. Currently
no decoders do this, but it will allow it in the future.
---
 fftools/ffmpeg.c | 3 ++-
 fftools/ffplay.c | 2 +-
 2 files changed, 3 insertions(+), 2 deletions(-)

Comments

Marton Balint Sept. 15, 2022, 6:06 p.m. UTC | #1
On Sat, 10 Sep 2022, Leo Izen wrote:

> This patch allows decoders to set AVFrame->time_base, which
> determines the units that AVFrame->pts will use. Currently
> no decoders do this, but it will allow it in the future.

This is patch is wrong, because it implies that decoders can output frames 
in time base different to stream time base. They can't, because that would 
be a breaking change. AVFrame->time_base was not introduced for that use 
case.

Regards,
Marton

> ---
> fftools/ffmpeg.c | 3 ++-
> fftools/ffplay.c | 2 +-
> 2 files changed, 3 insertions(+), 2 deletions(-)
>
> diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c
> index 0e1477299d..e3ea7a6c29 100644
> --- a/fftools/ffmpeg.c
> +++ b/fftools/ffmpeg.c
> @@ -2274,7 +2274,8 @@ static int decode_video(InputStream *ist, AVPacket *pkt, int *got_output, int64_
>     }
>
>     if(best_effort_timestamp != AV_NOPTS_VALUE) {
> -        int64_t ts = av_rescale_q(decoded_frame->pts = best_effort_timestamp, ist->st->time_base, AV_TIME_BASE_Q);
> +        int64_t ts = av_rescale_q(decoded_frame->pts = best_effort_timestamp,
> +            decoded_frame->time_base.num ? decoded_frame->time_base : ist->st->time_base, AV_TIME_BASE_Q);
>
>         if (ts != AV_NOPTS_VALUE)
>             ist->next_pts = ist->pts = ts;
> diff --git a/fftools/ffplay.c b/fftools/ffplay.c
> index 9242047f5c..986b0831ac 100644
> --- a/fftools/ffplay.c
> +++ b/fftools/ffplay.c
> @@ -1771,7 +1771,7 @@ static int get_video_frame(VideoState *is, AVFrame *frame)
>         double dpts = NAN;
>
>         if (frame->pts != AV_NOPTS_VALUE)
> -            dpts = av_q2d(is->video_st->time_base) * frame->pts;
> +            dpts = av_q2d(frame->time_base.num ? frame->time_base : is->video_st->time_base) * frame->pts;
>
>         frame->sample_aspect_ratio = av_guess_sample_aspect_ratio(is->ic, is->video_st, frame);
>
> -- 
> 2.37.3
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
>
diff mbox series

Patch

diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c
index 0e1477299d..e3ea7a6c29 100644
--- a/fftools/ffmpeg.c
+++ b/fftools/ffmpeg.c
@@ -2274,7 +2274,8 @@  static int decode_video(InputStream *ist, AVPacket *pkt, int *got_output, int64_
     }
 
     if(best_effort_timestamp != AV_NOPTS_VALUE) {
-        int64_t ts = av_rescale_q(decoded_frame->pts = best_effort_timestamp, ist->st->time_base, AV_TIME_BASE_Q);
+        int64_t ts = av_rescale_q(decoded_frame->pts = best_effort_timestamp,
+            decoded_frame->time_base.num ? decoded_frame->time_base : ist->st->time_base, AV_TIME_BASE_Q);
 
         if (ts != AV_NOPTS_VALUE)
             ist->next_pts = ist->pts = ts;
diff --git a/fftools/ffplay.c b/fftools/ffplay.c
index 9242047f5c..986b0831ac 100644
--- a/fftools/ffplay.c
+++ b/fftools/ffplay.c
@@ -1771,7 +1771,7 @@  static int get_video_frame(VideoState *is, AVFrame *frame)
         double dpts = NAN;
 
         if (frame->pts != AV_NOPTS_VALUE)
-            dpts = av_q2d(is->video_st->time_base) * frame->pts;
+            dpts = av_q2d(frame->time_base.num ? frame->time_base : is->video_st->time_base) * frame->pts;
 
         frame->sample_aspect_ratio = av_guess_sample_aspect_ratio(is->ic, is->video_st, frame);