[FFmpeg-devel] [crop support for matroska demuxer, V3 1/3] libavcodec: Add crop related fields to structure AVCodecContext and AVCodecParameters.

Timo Rothenpieler timo at rothenpieler.org
Tue Oct 11 15:43:25 EEST 2022



On 07/10/2022 16:59, OvchinnikovDmitrii wrote:
> ---
>   libavcodec/avcodec.h       | 35 +++++++++++++++++++++++++++++++++++
>   libavcodec/codec_par.h     |  8 ++++++++
>   libavcodec/options_table.h |  4 ++++
>   3 files changed, 47 insertions(+)
> 
> diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
> index 7365eb5cc0..d28a7cc022 100644
> --- a/libavcodec/avcodec.h
> +++ b/libavcodec/avcodec.h
> @@ -380,6 +380,19 @@ typedef struct RcOverride{
>    */
>   #define AV_GET_ENCODE_BUFFER_FLAG_REF (1 << 0)
>   
> +/**
> +* Video decoding only. Certain container support cropping, meaning that
> +* only a sub-rectangle of the decoded frame is intended for display.
> +* Certain codec supports cropping as well.This option controls how
> +* cropping is handled by libavcodec when  container cropping and
> +* codec cropping exist.
> +*/
> +enum CONTAINER_CROPPING_POLICY_TYPE {
> +    FF_CONTAINER_CROPPING_IGNORE = 0,
> +    FF_CONTAINER_CROPPING_ADDITION,
> +    FF_CONTAINER_CROPPING_OVERWRITE
> +};
> +
>   struct AVCodecInternal;
>   
>   /**
> @@ -2057,6 +2070,28 @@ typedef struct AVCodecContext {
>        *             The decoder can then override during decoding as needed.
>        */
>       AVChannelLayout ch_layout;
> +
> +    /* When set to 1 (the default), libavcodec will apply container cropping
> +     * to codec cropping additionally.
> +     *
> +     * When set to 2, libavcodec will use container cropping to overwrite
> +     * codec cropping (the final cropping uses container cropping parameters)
> +     *
> +     * When set to 0, libavcodec will ignore container cropping parameters
> +     * (the final cropping uses codec cropping parameters)
> +     *
> +     * This field works with "apply_cropping". Only if apply_cropping is 1, this
> +     * field works
> +     */
> +    enum CONTAINER_CROPPING_POLICY_TYPE container_apply_cropping;
> +
> +    /**
> +     * The cropping parameters from container.
> +     */
> +    int container_crop_top;
> +    int container_crop_left;
> +    int container_crop_bottom;
> +    int container_crop_right;
>   } AVCodecContext;
>   
>   /**
> diff --git a/libavcodec/codec_par.h b/libavcodec/codec_par.h
> index 7660791a12..12d8ceb521 100644
> --- a/libavcodec/codec_par.h
> +++ b/libavcodec/codec_par.h
> @@ -210,6 +210,14 @@ typedef struct AVCodecParameters {
>        * Audio only. The channel layout and number of channels.
>        */
>       AVChannelLayout ch_layout;
> +
> +    /**
> +     * The cropping parameters from container.
> +     */
> +    int container_crop_top;
> +    int container_crop_left;
> +    int container_crop_bottom;
> +    int container_crop_right;
>   } AVCodecParameters;

I really don't like seeing this in avcodec.
Why does an encoder or decoder need to care about this, given it's 
container level information?

Do you plan on implementing cropping support into all the encoders?
This should be handled via an avfilter, which might get the cropping 
info from the demuxer via site data or something.


More information about the ffmpeg-devel mailing list