Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
 help / color / mirror / Atom feed
From: Marton Balint <cus@passwd.hu>
To: FFmpeg development discussions and patches <ffmpeg-devel@ffmpeg.org>
Subject: Re: [FFmpeg-devel] [PATCH 1/3] lavc/encode: make sure frame timebase matches encoder, when set
Date: Wed, 28 Sep 2022 21:54:11 +0200 (CEST)
Message-ID: <5f92999c-2097-5016-daff-7ecddbfac1f3@passwd.hu> (raw)
In-Reply-To: <20220928093213.947-1-anton@khirnov.net>



On Wed, 28 Sep 2022, Anton Khirnov wrote:

> AVFrame.time_base has been added recently, but is currently not used for
> anything. Prepare for its use in encoders by rejecting frames where
> time_base is set, but differs from the AVCodecContext one.

How is that not an API break? Users can encode AVFrames with anything in 
the AVFrame->time_base right now, if you change that behaviour, that will 
surely break some code. That is why it was explicitly documented that 
it will be ignored by encoders by default.

It is the second time people make this mistake, and it is exactly this 
confusion why I was hesitant to accept adding the time base to AVFrame.

Regards,
Marton

> ---
> libavcodec/avcodec.h | 4 ++++
> libavcodec/encode.c  | 8 ++++++++
> libavutil/frame.h    | 5 +++--
> 3 files changed, 15 insertions(+), 2 deletions(-)
>
> diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
> index 7365eb5cc0..4030675d4f 100644
> --- a/libavcodec/avcodec.h
> +++ b/libavcodec/avcodec.h
> @@ -2645,6 +2645,10 @@ int avcodec_receive_frame(AVCodecContext *avctx, AVFrame *frame);
>  *                  packets are ignored, and sending frames will return
>  *                  AVERROR_EOF.
>  *
> + *                  frame->time_base should be set to the same value as
> + *                  avctx->time_base. This is not required yet, but may be in
> + *                  the future.
> + *
>  *                  For audio:
>  *                  If AV_CODEC_CAP_VARIABLE_FRAME_SIZE is set, then each frame
>  *                  can have any number of samples.
> diff --git a/libavcodec/encode.c b/libavcodec/encode.c
> index b275344bd1..0f78012747 100644
> --- a/libavcodec/encode.c
> +++ b/libavcodec/encode.c
> @@ -386,6 +386,14 @@ static int encode_send_frame_internal(AVCodecContext *avctx, const AVFrame *src)
>     AVFrame *dst = avci->buffer_frame;
>     int ret;
>
> +    /* make sure the frame's timebase (if set) matches the encoder one */
> +    if (src->time_base.num &&
> +        (src->time_base.num != avctx->time_base.num ||
> +         src->time_base.den != avctx->time_base.den)) {
> +        av_log(avctx, AV_LOG_ERROR, "Mismatching frame/encoder time base\n");
> +        return AVERROR(EINVAL);
> +    }
> +
>     if (avctx->codec->type == AVMEDIA_TYPE_AUDIO) {
>         /* extract audio service type metadata */
>         AVFrameSideData *sd = av_frame_get_side_data(src, AV_FRAME_DATA_AUDIO_SERVICE_TYPE);
> diff --git a/libavutil/frame.h b/libavutil/frame.h
> index 6d9563bc5d..c5e2de85b3 100644
> --- a/libavutil/frame.h
> +++ b/libavutil/frame.h
> @@ -441,8 +441,9 @@ typedef struct AVFrame {
>     /**
>      * Time base for the timestamps in this frame.
>      * In the future, this field may be set on frames output by decoders or
> -     * filters, but its value will be by default ignored on input to encoders
> -     * or filters.
> +     * filters; its value will be by default ignored on input to filters.
> +     * For frames sent to encoders, it should be set by the user to the same
> +     * value as AVCodecContext.time_base.
>      */
>     AVRational time_base;
>
> -- 
> 2.35.1
>
> _______________________________________________
> 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".
>
_______________________________________________
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".

  parent reply	other threads:[~2022-09-28 19:54 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-09-28  9:32 Anton Khirnov
2022-09-28  9:32 ` [FFmpeg-devel] [PATCH 2/3] lavc/encode: generalize a check for setting dts=pts Anton Khirnov
2022-09-28  9:32 ` [FFmpeg-devel] [PATCH 3/3] lavc/encode: combine setting no-delay pts for video/audio Anton Khirnov
2022-09-28 19:54 ` Marton Balint [this message]
2022-10-04  9:36   ` [FFmpeg-devel] [PATCH 1/3] lavc/encode: make sure frame timebase matches encoder, when set Anton Khirnov
2022-10-05 18:54     ` Marton Balint
2022-10-11  9:24       ` Anton Khirnov

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=5f92999c-2097-5016-daff-7ecddbfac1f3@passwd.hu \
    --to=cus@passwd.hu \
    --cc=ffmpeg-devel@ffmpeg.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

This inbox may be cloned and mirrored by anyone:

	git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
		ffmpegdev@gitmailbox.com
	public-inbox-index ffmpegdev

Example config snippet for mirrors.


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git