From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.ffmpeg.org (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTPS id CB7964BBF4 for ; Wed, 23 Jul 2025 16:00:48 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.ffmpeg.org (Postfix) with ESMTP id 3E58C68CBC6; Wed, 23 Jul 2025 19:00:44 +0300 (EEST) Received: from mail-ed1-f44.google.com (mail-ed1-f44.google.com [209.85.208.44]) by ffbox0-bg.ffmpeg.org (Postfix) with ESMTPS id F307768BFB6 for ; Wed, 23 Jul 2025 19:00:36 +0300 (EEST) Received: by mail-ed1-f44.google.com with SMTP id 4fb4d7f45d1cf-6088d856c6eso141129a12.0 for ; Wed, 23 Jul 2025 09:00:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1753286435; x=1753891235; darn=ffmpeg.org; h=to:subject:message-id:date:from:in-reply-to:references:mime-version :from:to:cc:subject:date:message-id:reply-to; bh=M0hxPYosxBFaQ05m9kkxyCN5919ITRdzMLe7X85AX1k=; b=blUz6floCJMjBfmkZeSSOM3DMhVSfzpc0t6ij9BPtkWNB+KzjyiSgSUNo5TCe+CJd1 Dm6gIJtZVi5NROcEdVVttKKlLAfO2up60E6W+tdu5w3aYybzKTzQ0V0PcpeubCnmTJOG gQ4mIFRJo3JfSjyXeoSg7+NAMC5uH/ZsYiL4gj1izcDH3F3B4hlvawblSZZc+nUod3b+ HVw56uwZck3RTwLwnOQj5nJbkrcZMwpTz9+KaL63Sx7FOti3VPXxxQNE8KwUp2HEhIzH m9arnE4lEOYZAhFBazroCn+vq2AUwn6wVc2wzo2FUsSTJRuVh6jEGr1rwgdeU+bnxuaP 7qAQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1753286435; x=1753891235; h=to:subject:message-id:date:from:in-reply-to:references:mime-version :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=M0hxPYosxBFaQ05m9kkxyCN5919ITRdzMLe7X85AX1k=; b=XivUF6GWTRWSQPf43zl0B4YQkIn+8nHo/mOjToeQOnk8XTvoR/bajSt7nEj1kq+aa0 G2iF1BUJj2KKaVoLRCL7sf41r96g+RVUZ7DX32VI8kBDn5QBgdiuD+qh1/x1NTifsP7L TdQKmPji51BId56YnuB6kgfBUcPtbuCNDyBRV/FBgUSOtL4ke/tjM9o6iDJRPfMRy1Md bT4YFYfwgp+0EGJtMVqvHrSVe/b9plHZYjzQSpXvnsN48ku0bfPZivXke961PB/6jwYS 7XTBB7dbA5T+5oXNVBa1l3ijPcMZYVdaIPzF4Fu6fMPYE4y/XIao+6TxgnCaocwp7cg6 evDg== X-Gm-Message-State: AOJu0YyF71IocyKJQfJ5/1dJRhDnQzuHTGYHAtFTMFnSmhoHoDOolkMw DuuB+ovNGSsYrR9+o+y4G0zudKi6EXMoXju8O/+YoyZzG4Gj3dqgH4lbJBNgsDSXu1pfh3g7G50 ey3JO/QDvDCcTcKGHXXEcMaaeyIsw8eRTyQ== X-Gm-Gg: ASbGnctK6ypui/50kueUh83ZjN3KtCSicXu5nSvNAGJ3tVQDvJe39NdgN6JLiCblATw k8P1w9o6atP5gM5ru+n4GrDa4hIrCZrCjzaposvtiEPpjx3Mv60EawIHHqj9t8HlmMwZ52SWIXR +Ju6x3/q36n15TDwCbcfl+JRiS3cVkPEIyH69/NNi6ibAf0BcgV2+0KE89liugCUtjgGgv3nJNL nrvCEJocp9MF2k= X-Google-Smtp-Source: AGHT+IG96qMJfR8d9e0X3GMZcl9HtNwPugeG6a3+OYo0qUR7L26+eWh7DdJg8+Qu6ELg0Kn8h9b39ijHUMinorOFksM= X-Received: by 2002:a05:6402:2749:b0:60e:9e2:5844 with SMTP id 4fb4d7f45d1cf-6149b5ba5a8mr2947446a12.32.1753286434625; Wed, 23 Jul 2025 09:00:34 -0700 (PDT) MIME-Version: 1.0 References: <20250723135626.1390296-1-ffmpeg@haasn.xyz> <20250723135626.1390296-2-ffmpeg@haasn.xyz> In-Reply-To: <20250723135626.1390296-2-ffmpeg@haasn.xyz> From: Kacper Michajlow Date: Wed, 23 Jul 2025 18:00:02 +0200 X-Gm-Features: Ac12FXzZcrNZ4CZ9H5rg1V97oizMECvd1UCfEacOu32wU0VsqUpfXOqQj2jXZRM Message-ID: To: FFmpeg development discussions and patches Subject: Re: [FFmpeg-devel] [PATCH v2 01/18] avutil/frame: add AVFrame.alpha_mode X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: On Wed, 23 Jul 2025 at 15:56, Niklas Haas wrote: > > From: Niklas Haas > > 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 5c40b7c13d..708325c0bf 100644 > --- a/doc/APIchanges > +++ b/doc/APIchanges > @@ -2,6 +2,10 @@ The last version increases of all libraries were on 2025-03-28 > > API changes, most recent first: > > +2025-07-xx - xxxxxxxxxx - lavu 60.7.100 - frame.h pixfmt.h > + Add AVAlphaMode, AVFrame.alpha_mode, av_alpha_mode_name() and > + av_alpha_mode_from_name(). > + > 2025-07-20 - xxxxxxxxxx - lavu 60.6.100 - attributes.h, avstring.h > Add av_scanf_format() and use it on av_sscanf(). > > diff --git a/libavutil/frame.c b/libavutil/frame.c > index 8f3fda2371..be30eb09d2 100644 > --- a/libavutil/frame.c > +++ b/libavutil/frame.c > @@ -45,6 +45,7 @@ static void get_frame_defaults(AVFrame *frame) > 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; > } > > @@ -240,6 +241,7 @@ static int frame_copy_props(AVFrame *dst, const AVFrame *src, int force_copy) > 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 c50cd263d9..357626be9d 100644 > --- a/libavutil/frame.h > +++ b/libavutil/frame.h > @@ -767,6 +767,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 f0be20d749..a74cde3de9 100644 > --- a/libavutil/pixdesc.c > +++ b/libavutil/pixdesc.c > @@ -3345,6 +3345,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; > @@ -3878,3 +3884,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; nitpick, but I think we no longer require variable declarations at the beginning. Can just inline it. > + > + for (i = 0; i < FF_ARRAY_ELEMS(alpha_mode_names); i++) { > + if (!alpha_mode_names[i]) > + continue; > + > + 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 823ea8edab..6aa1c94cec 100644 > --- a/libavutil/pixfmt.h > +++ b/libavutil/pixfmt.h > @@ -794,4 +794,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 946429b8fc..b454106960 100644 > --- a/libavutil/version.h > +++ b/libavutil/version.h > @@ -79,7 +79,7 @@ > */ > > #define LIBAVUTIL_VERSION_MAJOR 60 > -#define LIBAVUTIL_VERSION_MINOR 6 > +#define LIBAVUTIL_VERSION_MINOR 7 > #define LIBAVUTIL_VERSION_MICRO 100 > > #define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ > -- > 2.50.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".