[FFmpeg-devel] [PATCH 1/2] avcodec: add YUV color space metadata to AVCodec
Andreas Rheinhardt
andreas.rheinhardt at outlook.com
Mon Feb 5 20:04:30 EET 2024
Niklas Haas:
> From: Niklas Haas <git at haasn.dev>
>
> This is motivated primarily by a desire for YUVJ removal, which will
> require signalling the supported color ranges as part of the codec
> capabilities. But since we're adding YUV range, we might as well add the
> YUV color matrix as well - since some codecs (e.g. VP8, JPEG) only
> support certain values.
>
> I decided to preserve the ambiguous and misleading "color_spaces" name,
> for symmetry with AVFrame.colorspace. (Though this would IMO be better
> called "color_matrix" or "color_system")
>
> I also decided to omit the other AVColor* fields for now, because
> vf_scale cannot handle auto-conversion between primaries/transfer/etc.
> There is little value in adding metadata we cannot do anything with, and
> no harm in extending the API again in the future. In theory, vf_scale
> can handle conversion between chroma locations, but also the signalling
> for this is annoying, so I'll defer it to a future commit.
> ---
> doc/APIchanges | 3 +++
> libavcodec/codec.h | 6 ++++++
> libavcodec/version.h | 2 +-
> 3 files changed, 10 insertions(+), 1 deletion(-)
>
> diff --git a/doc/APIchanges b/doc/APIchanges
> index 1f5724324a..7849ce47d9 100644
> --- a/doc/APIchanges
> +++ b/doc/APIchanges
> @@ -2,6 +2,9 @@ The last version increases of all libraries were on 2023-02-09
>
> API changes, most recent first:
>
> +2024-02-xx - xxxxxxxxxx - lavc 60.40.100 - avcodec.h
> + Add AVCodec.color_ranges and AVCodec.color_spaces.
> +
> 2024-02-04 - xxxxxxxxxx - lavc 60.39.100 - packet.h
> Add AV_PKT_DATA_AMBIENT_VIEWING_ENVIRONMENT.
>
> diff --git a/libavcodec/codec.h b/libavcodec/codec.h
> index 8034f1a53c..8bd678de7a 100644
> --- a/libavcodec/codec.h
> +++ b/libavcodec/codec.h
> @@ -235,6 +235,12 @@ typedef struct AVCodec {
> * Array of supported channel layouts, terminated with a zeroed layout.
> */
> const AVChannelLayout *ch_layouts;
> +
> + /**
> + * Array of supported YUV color formats. Ignored for RGB/Gray formats.
> + */
> + const enum AVColorRange *color_ranges; ///< terminated by AVCOL_RANGE_UNSPECIFIED
> + const enum AVColorSpace *color_spaces; ///< terminated by AVCOL_SPC_UNSPECIFIED
> } AVCodec;
>
> /**
> diff --git a/libavcodec/version.h b/libavcodec/version.h
> index f2f14eaed1..19f3f4a272 100644
> --- a/libavcodec/version.h
> +++ b/libavcodec/version.h
> @@ -29,7 +29,7 @@
>
> #include "version_major.h"
>
> -#define LIBAVCODEC_VERSION_MINOR 39
> +#define LIBAVCODEC_VERSION_MINOR 40
> #define LIBAVCODEC_VERSION_MICRO 100
>
> #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
This presumes the relevant states to be a cartesian product. Which need
not be true. A callback would be better; this would also allow to base
the list on other values already set in an AVCodecContext. And if this
were extended, it would also allow to remove init_static_data one day.
It is furthermore quite wasteful to store color_ranges in a list,
although there are only very few states for it.
- Andreas
More information about the ffmpeg-devel
mailing list