[FFmpeg-devel] [PATCHv2] lavf: add av_guess_frame_sample_aspect_ratio function

Marton Balint cus at passwd.hu
Sat May 5 19:30:08 CEST 2012


On Mon, 30 Apr 2012, Marton Balint wrote:

> Guesses the sample aspect ratio of a frame, based on both the stream and the
> frame aspect ratio.
>
> Since the frame aspect ratio is set by the codec but the stream aspect ratio
> is set by the demuxer, these two may not be equal. This function tries to
> return the value that you should use if you would like to display the frame.
>
> Basic logic is to use the stream aspect ratio if it is set to something sane
> otherwise use the frame aspect ratio. This way a container setting, which is
> usually easy to modify can override the coded value in the frames.

What do you think guys, is this ready to be part of the API? I have some 
pending ffplay patches which depend on this functionality.

Thanks,
Marton

>
> Signed-off-by: Marton Balint <cus at passwd.hu>
> ---
> doc/APIchanges         |    3 +++
> libavformat/avformat.h |   19 +++++++++++++++++++
> libavformat/utils.c    |   22 ++++++++++++++++++++++
> libavformat/version.h  |    2 +-
> 4 files changed, 45 insertions(+), 1 deletions(-)
>
> diff --git a/doc/APIchanges b/doc/APIchanges
> index 0867fa4..93d616d 100644
> --- a/doc/APIchanges
> +++ b/doc/APIchanges
> @@ -14,6 +14,9 @@ libavutil:   2011-04-18
>
> API changes, most recent first:
>
> +2012-04-28 - xxxxxxx - lavf 54.4.100
> +  Add av_guess_sample_aspect_ratio() function.
> +
> 2012-04-20 - xxxxxxx - lavfi 2.70.100
>   Add avfilter_unref_bufferp() to avfilter.h.
>
> diff --git a/libavformat/avformat.h b/libavformat/avformat.h
> index 730ce12..f33a933 100644
> --- a/libavformat/avformat.h
> +++ b/libavformat/avformat.h
> @@ -1911,6 +1911,25 @@ const struct AVCodecTag *avformat_get_riff_video_tags(void);
>  * @return the table mapping RIFF FourCCs for audio to CodecID.
>  */
> const struct AVCodecTag *avformat_get_riff_audio_tags(void);
> +
> +/**
> + * Guesses the sample aspect ratio of a frame, based on both the stream and the
> + * frame aspect ratio.
> + *
> + * Since the frame aspect ratio is set by the codec but the stream aspect ratio
> + * is set by the demuxer, these two may not be equal. This function tries to
> + * return the value that you should use if you would like to display the frame.
> + *
> + * Basic logic is to use the stream aspect ratio if it is set to something sane
> + * otherwise use the frame aspect ratio. This way a container setting, which is
> + * usually easy to modify can override the coded value in the frames.
> + *
> + * @param stream the stream which the frame is part of
> + * @param frame the frame with the aspect ratio to be determined
> + * @return the guessed (valid) sample_aspect_ratio, 0/1 if no idea
> + */
> +AVRational av_guess_sample_aspect_ratio(AVStream *stream, AVFrame *frame);
> +
> /**
>  * @}
>  */
> diff --git a/libavformat/utils.c b/libavformat/utils.c
> index d6e7f69..4f37524 100644
> --- a/libavformat/utils.c
> +++ b/libavformat/utils.c
> @@ -4392,3 +4392,25 @@ const struct AVCodecTag *avformat_get_riff_audio_tags(void)
> {
>     return ff_codec_wav_tags;
> }
> +
> +AVRational av_guess_sample_aspect_ratio(AVStream *stream, AVFrame *frame)
> +{
> +    AVRational undef = {0, 1};
> +    AVRational stream_sample_aspect_ratio = stream ? stream->sample_aspect_ratio : undef;
> +    AVRational frame_sample_aspect_ratio  = frame  ? frame->sample_aspect_ratio  : undef;
> +
> +    av_reduce(&stream_sample_aspect_ratio.num, &stream_sample_aspect_ratio.den,
> +               stream_sample_aspect_ratio.num,  stream_sample_aspect_ratio.den, INT_MAX);
> +    if (stream_sample_aspect_ratio.num <= 0 || stream_sample_aspect_ratio.den <= 0)
> +        stream_sample_aspect_ratio = undef;
> +
> +    av_reduce(&frame_sample_aspect_ratio.num, &frame_sample_aspect_ratio.den,
> +               frame_sample_aspect_ratio.num,  frame_sample_aspect_ratio.den, INT_MAX);
> +    if (frame_sample_aspect_ratio.num <= 0 || frame_sample_aspect_ratio.den <= 0)
> +        frame_sample_aspect_ratio = undef;
> +
> +    if (stream_sample_aspect_ratio.num)
> +        return stream_sample_aspect_ratio;
> +    else
> +        return frame_sample_aspect_ratio;
> +}
> diff --git a/libavformat/version.h b/libavformat/version.h
> index 7c4d8e7..a3143c3 100644
> --- a/libavformat/version.h
> +++ b/libavformat/version.h
> @@ -30,7 +30,7 @@
> #include "libavutil/avutil.h"
>
> #define LIBAVFORMAT_VERSION_MAJOR 54
> -#define LIBAVFORMAT_VERSION_MINOR  3
> +#define LIBAVFORMAT_VERSION_MINOR  4
> #define LIBAVFORMAT_VERSION_MICRO 100
>
> #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
> -- 
> 1.7.3.4
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>


More information about the ffmpeg-devel mailing list