[FFmpeg-devel] [PATCH 01/12] avutil/frame: add AVFrame.alpha_mode

Zhao Zhili quinkblack at foxmail.com
Thu Feb 20 10:53:58 EET 2025



> On Feb 20, 2025, at 04:45, Niklas Haas <ffmpeg at haasn.xyz> wrote:
> 
> From: Niklas Haas <git at haasn.dev>
> 
> FFmpeg currently handles alpha in a quasi-arbitrary way. Some filters/codecs
> assume alpha is premultiplied, others assume it is independent. If there is
> to be any hope for order in this chaos, we need to start by defining an enum
> for the possible range of values.
> ---
> doc/APIchanges      |  4 ++++
> libavutil/frame.c   |  2 ++
> libavutil/frame.h   |  7 +++++++
> libavutil/pixdesc.c | 27 +++++++++++++++++++++++++++
> libavutil/pixdesc.h | 10 ++++++++++
> libavutil/pixfmt.h  | 10 ++++++++++
> libavutil/version.h |  2 +-
> 7 files changed, 61 insertions(+), 1 deletion(-)
> 
> diff --git a/doc/APIchanges b/doc/APIchanges
> index ac506f4b56..601013b018 100644
> --- a/doc/APIchanges
> +++ b/doc/APIchanges
> @@ -2,6 +2,10 @@ The last version increases of all libraries were on 2024-03-07
> 
> API changes, most recent first:
> 
> +2025-02-xx - xxxxxxxxxx - lavu 59.58.100 - frame.h pixfmt.h
> +  Add AVAlphaMode, AVFrame.alpha_mode, av_alpha_mode_name() and
> +  av_alpha_mode_from_name().
> +
> 2025-02-xx - xxxxxxxxxx - lavu 59.57.100 - log.h
>   Add flags AV_LOG_PRINT_TIME and AV_LOG_PRINT_DATETIME.
> 
> diff --git a/libavutil/frame.c b/libavutil/frame.c
> index 492b467ebd..cc906dbe21 100644
> --- a/libavutil/frame.c
> +++ b/libavutil/frame.c
> @@ -84,6 +84,7 @@ FF_ENABLE_DEPRECATION_WARNINGS
>     frame->colorspace          = AVCOL_SPC_UNSPECIFIED;
>     frame->color_range         = AVCOL_RANGE_UNSPECIFIED;
>     frame->chroma_location     = AVCHROMA_LOC_UNSPECIFIED;
> +    frame->alpha_mode          = AVALPHA_MODE_UNSPECIFIED;
>     frame->flags               = 0;
> }
> 
> @@ -364,6 +365,7 @@ FF_ENABLE_DEPRECATION_WARNINGS
>     dst->colorspace             = src->colorspace;
>     dst->color_range            = src->color_range;
>     dst->chroma_location        = src->chroma_location;
> +    dst->alpha_mode             = src->alpha_mode;
> 
>     av_dict_copy(&dst->metadata, src->metadata, 0);
> 
> diff --git a/libavutil/frame.h b/libavutil/frame.h
> index 49260ae2dd..6e53135d27 100644
> --- a/libavutil/frame.h
> +++ b/libavutil/frame.h
> @@ -822,6 +822,13 @@ typedef struct AVFrame {
>      * Duration of the frame, in the same units as pts. 0 if unknown.
>      */
>     int64_t duration;
> +
> +    /**
> +     * Indicates how the alpha channel of the video is to be handled.
> +     * - encoding: Set by user
> +     * - decoding: Set by libavcodec
> +     */
> +    enum AVAlphaMode alpha_mode;
> } AVFrame;
> 
> 
> diff --git a/libavutil/pixdesc.c b/libavutil/pixdesc.c
> index 6fe83cd16b..f4eb3d5074 100644
> --- a/libavutil/pixdesc.c
> +++ b/libavutil/pixdesc.c
> @@ -3152,6 +3152,12 @@ static const char * const chroma_location_names[] = {
>     [AVCHROMA_LOC_BOTTOM] = "bottom",
> };
> 
> +static const char * const alpha_mode_names[] = {
> +    [AVALPHA_MODE_UNSPECIFIED] = "unspecified",
> +    [AVALPHA_MODE_PREMULTIPLIED] = "premultiplied",
> +    [AVALPHA_MODE_STRAIGHT] = "straight",
> +};
> +
> static enum AVPixelFormat get_pix_fmt_internal(const char *name)
> {
>     enum AVPixelFormat pix_fmt;
> @@ -3685,3 +3691,24 @@ enum AVChromaLocation av_chroma_location_pos_to_enum(int xpos, int ypos)
>     }
>     return AVCHROMA_LOC_UNSPECIFIED;
> }
> +
> +const char *av_alpha_mode_name(enum AVAlphaMode mode)
> +{
> +    return (unsigned) mode < AVALPHA_MODE_NB ?
> +        alpha_mode_names[mode] : NULL;
> +}
> +
> +enum AVAlphaMode av_alpha_mode_from_name(const char *name)
> +{
> +    int i;
> +
> +    for (i = 0; i < FF_ARRAY_ELEMS(alpha_mode_names); i++) {
> +        if (!alpha_mode_names[i])
> +            continue;

It’s very unlikely to have a hole in alpha_mode_names, so the check can be removed.
Maybe add an assert here.

> +
> +        if (av_strstart(name, alpha_mode_names[i], NULL))
> +            return i;
> +    }
> +
> +    return AVERROR(EINVAL);
> +}
> diff --git a/libavutil/pixdesc.h b/libavutil/pixdesc.h
> index ba2f632814..0cc70eb64c 100644
> --- a/libavutil/pixdesc.h
> +++ b/libavutil/pixdesc.h
> @@ -291,6 +291,16 @@ int av_chroma_location_enum_to_pos(int *xpos, int *ypos, enum AVChromaLocation p
>  */
> enum AVChromaLocation av_chroma_location_pos_to_enum(int xpos, int ypos);
> 
> +/**
> + * @return the name for provided alpha mode or NULL if unknown.
> + */
> +const char *av_alpha_mode_name(enum AVAlphaMode mode);
> +
> +/**
> + * @return the AVAlphaMode value for name or an AVError if not found.
> + */
> +enum AVAlphaMode av_alpha_mode_from_name(const char *name);
> +
> /**
>  * Return the pixel format corresponding to name.
>  *
> diff --git a/libavutil/pixfmt.h b/libavutil/pixfmt.h
> index a64d40ad07..8af64a383d 100644
> --- a/libavutil/pixfmt.h
> +++ b/libavutil/pixfmt.h
> @@ -760,4 +760,14 @@ enum AVChromaLocation {
>     AVCHROMA_LOC_NB               ///< Not part of ABI
> };
> 
> +/**
> + * Correlation between the alpha channel and color values.
> + */
> +enum AVAlphaMode {
> +    AVALPHA_MODE_UNSPECIFIED   = 0, ///< Unknown alpha handling, or no alpha channel
> +    AVALPHA_MODE_PREMULTIPLIED = 1, ///< Alpha channel is multiplied into color values
> +    AVALPHA_MODE_STRAIGHT      = 2, ///< Alpha channel is independent of color values
> +    AVALPHA_MODE_NB                 ///< Not part of ABI
> +};
> +
> #endif /* AVUTIL_PIXFMT_H */
> diff --git a/libavutil/version.h b/libavutil/version.h
> index ee4a36cb17..4b584fd569 100644
> --- a/libavutil/version.h
> +++ b/libavutil/version.h
> @@ -79,7 +79,7 @@
>  */
> 
> #define LIBAVUTIL_VERSION_MAJOR  59
> -#define LIBAVUTIL_VERSION_MINOR  57
> +#define LIBAVUTIL_VERSION_MINOR  58
> #define LIBAVUTIL_VERSION_MICRO 100
> 
> #define LIBAVUTIL_VERSION_INT   AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \
> -- 
> 2.47.0
> 
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> 
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".



More information about the ffmpeg-devel mailing list