From: Niklas Haas <ffmpeg@haasn.xyz> To: ffmpeg-devel@ffmpeg.org Cc: Niklas Haas <git@haasn.dev> Subject: [FFmpeg-devel] [PATCH 04/12] avcodec/avcodec: add AVCodecContext.alpha_mode Date: Wed, 19 Feb 2025 21:45:40 +0100 Message-ID: <20250219204550.2826561-4-ffmpeg@haasn.xyz> (raw) In-Reply-To: <20250219204550.2826561-1-ffmpeg@haasn.xyz> From: Niklas Haas <git@haasn.dev> Following in the footsteps of the previous commit, this commit adds the new fields to AVCodecContext so we can start properly setting it on codecs, as well as limiting the list of supported options to detect a format mismatch during encode. This commit also sets up the necessary infrastructure to start using the newly added field in all codecs. --- doc/APIchanges | 4 ++++ doc/codecs.texi | 8 ++++++++ libavcodec/avcodec.c | 6 ++++++ libavcodec/avcodec.h | 8 ++++++++ libavcodec/codec_internal.h | 5 +++++ libavcodec/codec_par.c | 3 +++ libavcodec/codec_par.h | 5 +++++ libavcodec/decode.c | 2 ++ libavcodec/options_table.h | 5 +++++ libavcodec/version.h | 4 ++-- 10 files changed, 48 insertions(+), 2 deletions(-) diff --git a/doc/APIchanges b/doc/APIchanges index 601013b018..2e4736034d 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 - lavc 61.34.100 - avcodec.h codec_par.h + Add AVCodecContext.alpha_mode, AVCodecParameters.alpha_mode, and + AV_CODEC_CONFIG_ALPHA_MODE. + 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(). diff --git a/doc/codecs.texi b/doc/codecs.texi index f6bd50eb71..eec5d8e8c7 100644 --- a/doc/codecs.texi +++ b/doc/codecs.texi @@ -913,6 +913,14 @@ Possible values: @end table +@item alpha_mode @var{integer} (@emph{decoding/encoding,video}) +Possible values: +@table @samp +@item premultiplied +@item straight +@end table + + @item log_level_offset @var{integer} Set the log level offset. diff --git a/libavcodec/avcodec.c b/libavcodec/avcodec.c index e7e2c09222..9fd6c47416 100644 --- a/libavcodec/avcodec.c +++ b/libavcodec/avcodec.c @@ -765,6 +765,8 @@ int ff_default_get_supported_config(const AVCodecContext *avctx, const void **out_configs, int *out_num_configs) { + const FFCodec *codec2 = ffcodec(codec); + switch (config) { FF_DISABLE_DEPRECATION_WARNINGS case AV_CODEC_CONFIG_PIX_FORMAT: @@ -792,6 +794,10 @@ FF_ENABLE_DEPRECATION_WARNINGS if (out_num_configs) *out_num_configs = 0; return 0; + + case AV_CODEC_CONFIG_ALPHA_MODE: + WRAP_CONFIG(AVMEDIA_TYPE_VIDEO, codec2->alpha_modes, enum AVAlphaMode, AVALPHA_MODE_UNSPECIFIED); + default: return AVERROR(EINVAL); } diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index 403f02d841..a6f1060165 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -2105,6 +2105,13 @@ typedef struct AVCodecContext { */ AVFrameSideData **decoded_side_data; int nb_decoded_side_data; + + /** + * Indicates how the alpha channel of the video is represented. + * - encoding: Set by user + * - decoding: Set by libavcodec + */ + enum AVAlphaMode alpha_mode; } AVCodecContext; /** @@ -2728,6 +2735,7 @@ enum AVCodecConfig { AV_CODEC_CONFIG_CHANNEL_LAYOUT, ///< AVChannelLayout, terminated by {0} AV_CODEC_CONFIG_COLOR_RANGE, ///< AVColorRange, terminated by AVCOL_RANGE_UNSPECIFIED AV_CODEC_CONFIG_COLOR_SPACE, ///< AVColorSpace, terminated by AVCOL_SPC_UNSPECIFIED + AV_CODEC_CONFIG_ALPHA_MODE, ///< AVAlphaMode, terminated by AVALPHA_MODE_UNSPECIFIED }; /** diff --git a/libavcodec/codec_internal.h b/libavcodec/codec_internal.h index 5b2db74590..29ce6d6c62 100644 --- a/libavcodec/codec_internal.h +++ b/libavcodec/codec_internal.h @@ -148,6 +148,11 @@ typedef struct FFCodec { */ unsigned cb_type:3; + /** + * This field determines the alpha modes supported by an encoder. + */ + const enum AVAlphaMode *alpha_modes; + int priv_data_size; /** * @name Frame-level threading support functions diff --git a/libavcodec/codec_par.c b/libavcodec/codec_par.c index 790ea01d10..ddf349ceea 100644 --- a/libavcodec/codec_par.c +++ b/libavcodec/codec_par.c @@ -51,6 +51,7 @@ static void codec_parameters_reset(AVCodecParameters *par) par->framerate = (AVRational){ 0, 1 }; par->profile = AV_PROFILE_UNKNOWN; par->level = AV_LEVEL_UNKNOWN; + par->alpha_mode = AVALPHA_MODE_UNSPECIFIED; } AVCodecParameters *avcodec_parameters_alloc(void) @@ -165,6 +166,7 @@ int avcodec_parameters_from_context(AVCodecParameters *par, par->sample_aspect_ratio = codec->sample_aspect_ratio; par->video_delay = codec->has_b_frames; par->framerate = codec->framerate; + par->alpha_mode = codec->alpha_mode; break; case AVMEDIA_TYPE_AUDIO: par->format = codec->sample_fmt; @@ -229,6 +231,7 @@ int avcodec_parameters_to_context(AVCodecContext *codec, codec->sample_aspect_ratio = par->sample_aspect_ratio; codec->has_b_frames = par->video_delay; codec->framerate = par->framerate; + codec->alpha_mode = par->alpha_mode; break; case AVMEDIA_TYPE_AUDIO: codec->sample_fmt = par->format; diff --git a/libavcodec/codec_par.h b/libavcodec/codec_par.h index f4b9bb5c06..19b1d738dc 100644 --- a/libavcodec/codec_par.h +++ b/libavcodec/codec_par.h @@ -212,6 +212,11 @@ typedef struct AVCodecParameters { * Audio only. Number of samples to skip after a discontinuity. */ int seek_preroll; + + /** + * Video with alpha channel only. Alpha channel handling + */ + enum AVAlphaMode alpha_mode; } AVCodecParameters; /** diff --git a/libavcodec/decode.c b/libavcodec/decode.c index cac7e620d2..68f1070c15 100644 --- a/libavcodec/decode.c +++ b/libavcodec/decode.c @@ -583,6 +583,8 @@ static int fill_frame_props(const AVCodecContext *avctx, AVFrame *frame) frame->color_range = avctx->color_range; if (frame->chroma_location == AVCHROMA_LOC_UNSPECIFIED) frame->chroma_location = avctx->chroma_sample_location; + if (frame->alpha_mode == AVALPHA_MODE_UNSPECIFIED) + frame->alpha_mode = avctx->alpha_mode; if (avctx->codec_type == AVMEDIA_TYPE_VIDEO) { if (!frame->sample_aspect_ratio.num) frame->sample_aspect_ratio = avctx->sample_aspect_ratio; diff --git a/libavcodec/options_table.h b/libavcodec/options_table.h index 47da41b0ad..32f853bc54 100644 --- a/libavcodec/options_table.h +++ b/libavcodec/options_table.h @@ -358,6 +358,11 @@ static const AVOption avcodec_options[] = { {"bottomleft", "Bottom-left", 0, AV_OPT_TYPE_CONST, {.i64 = AVCHROMA_LOC_BOTTOMLEFT }, INT_MIN, INT_MAX, V|E|D, .unit = "chroma_sample_location_type"}, {"bottom", "Bottom", 0, AV_OPT_TYPE_CONST, {.i64 = AVCHROMA_LOC_BOTTOM }, INT_MIN, INT_MAX, V|E|D, .unit = "chroma_sample_location_type"}, {"unspecified", "Unspecified", 0, AV_OPT_TYPE_CONST, {.i64 = AVCHROMA_LOC_UNSPECIFIED }, INT_MIN, INT_MAX, V|E|D, .unit = "chroma_sample_location_type"}, +{"alpha_mode", "alpha mode", OFFSET(alpha_mode), AV_OPT_TYPE_INT, {.i64 = AVALPHA_MODE_UNSPECIFIED }, 0, INT_MAX, V|E|D, .unit = "alpha_mode_type"}, +{"unknown", "Unspecified", 0, AV_OPT_TYPE_CONST, {.i64 = AVALPHA_MODE_UNSPECIFIED }, 0, 0, V|E|D, .unit = "alpha_mode_type"}, +{"unspecified", "Unspecified", 0, AV_OPT_TYPE_CONST, {.i64 = AVALPHA_MODE_UNSPECIFIED }, 0, 0, V|E|D, .unit = "alpha_mode_type"}, +{"premultiplied", "Premultiplied", 0, AV_OPT_TYPE_CONST, {.i64 = AVALPHA_MODE_PREMULTIPLIED }, 0, 0, V|E|D, .unit = "alpha_mode_type"}, +{"straight", "Straight", 0, AV_OPT_TYPE_CONST, {.i64 = AVALPHA_MODE_STRAIGHT }, 0, 0, V|E|D, .unit = "alpha_mode_type"}, {"log_level_offset", "set the log level offset", OFFSET(log_level_offset), AV_OPT_TYPE_INT, {.i64 = 0 }, INT_MIN, INT_MAX }, {"slices", "set the number of slices, used in parallelized encoding", OFFSET(slices), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, INT_MAX, V|E}, {"thread_type", "select multithreading type", OFFSET(thread_type), AV_OPT_TYPE_FLAGS, {.i64 = FF_THREAD_SLICE|FF_THREAD_FRAME }, 0, INT_MAX, V|A|E|D, .unit = "thread_type"}, diff --git a/libavcodec/version.h b/libavcodec/version.h index 62e7eba3db..0ef6c991f3 100644 --- a/libavcodec/version.h +++ b/libavcodec/version.h @@ -29,8 +29,8 @@ #include "version_major.h" -#define LIBAVCODEC_VERSION_MINOR 33 -#define LIBAVCODEC_VERSION_MICRO 102 +#define LIBAVCODEC_VERSION_MINOR 34 +#define LIBAVCODEC_VERSION_MICRO 100 #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ LIBAVCODEC_VERSION_MINOR, \ -- 2.47.0 _______________________________________________ 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".
next prev parent reply other threads:[~2025-02-19 20:46 UTC|newest] Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top 2025-02-19 20:45 [FFmpeg-devel] [PATCH 01/12] avutil/frame: add AVFrame.alpha_mode Niklas Haas 2025-02-19 20:45 ` [FFmpeg-devel] [PATCH 02/12] fftools/ffprobe: add support for AVFrame.alpha_mode Niklas Haas 2025-02-19 20:45 ` [FFmpeg-devel] [PATCH 03/12] avfilter/vf_showinfo: print alpha mode when relevant Niklas Haas 2025-02-19 20:45 ` Niklas Haas [this message] 2025-02-19 21:04 ` [FFmpeg-devel] [PATCH 04/12] avcodec/avcodec: add AVCodecContext.alpha_mode James Almer 2025-02-19 21:18 ` Niklas Haas 2025-02-19 20:45 ` [FFmpeg-devel] [PATCH 05/12] avcodec/encode: enforce alpha mode compatibility at encode time Niklas Haas 2025-02-19 20:45 ` [FFmpeg-devel] [PATCH 06/12] avcodec/png: set correct alpha mode Niklas Haas 2025-02-19 20:45 ` [FFmpeg-devel] [PATCH 07/12] fftools/ffmpeg_enc: forward frame alpha mode to encoder Niklas Haas 2025-02-22 2:44 ` mypopy 2025-02-19 20:45 ` [FFmpeg-devel] [PATCH 08/12] avfilter/vf_premultiply: tag correct alpha mode on result Niklas Haas 2025-02-19 20:45 ` [FFmpeg-devel] [PATCH 09/12] avfilter/vf_alphamerge: tag correct alpha mode Niklas Haas 2025-02-19 20:45 ` [FFmpeg-devel] [PATCH 10/12] avfilter/vf_overlay: respect alpha mode tagging by default Niklas Haas 2025-02-19 20:45 ` [FFmpeg-devel] [PATCH 11/12] avfilter/vf_setparams: add alpha_mode parameter Niklas Haas 2025-02-19 20:45 ` [FFmpeg-devel] [PATCH 12/12] avfilter/vf_libplacebo: add an alpha_mode setting Niklas Haas 2025-02-20 8:53 ` [FFmpeg-devel] [PATCH 01/12] avutil/frame: add AVFrame.alpha_mode Zhao Zhili 2025-02-20 9:39 ` Nicolas George 2025-02-20 11:25 ` Niklas Haas
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20250219204550.2826561-4-ffmpeg@haasn.xyz \ --to=ffmpeg@haasn.xyz \ --cc=ffmpeg-devel@ffmpeg.org \ --cc=git@haasn.dev \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel This inbox may be cloned and mirrored by anyone: git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \ ffmpegdev@gitmailbox.com public-inbox-index ffmpegdev Example config snippet for mirrors. AGPL code for this site: git clone https://public-inbox.org/public-inbox.git