avcodec/libjxl: set correct alpha mode

JPEG XL supports both premultiplied and straight alpha, and the basic info
struct contains signalling for this. Forward the correct tagging on decode
and encode.
This commit is contained in:
Niklas Haas
2025-07-23 12:51:26 +02:00
parent 702a5ac29b
commit a88cc0a53e
2 changed files with 21 additions and 0 deletions
+6
View File
@@ -444,6 +444,12 @@ static int libjxl_receive_frame(AVCodecContext *avctx, AVFrame *frame)
if (ctx->basic_info.have_animation)
ctx->anim_timebase = av_make_q(ctx->basic_info.animation.tps_denominator,
ctx->basic_info.animation.tps_numerator);
if (ctx->basic_info.alpha_bits) {
if (ctx->basic_info.alpha_premultiplied)
avctx->alpha_mode = AVALPHA_MODE_PREMULTIPLIED;
else
avctx->alpha_mode = AVALPHA_MODE_STRAIGHT;
}
continue;
case JXL_DEC_COLOR_ENCODING:
av_log(avctx, AV_LOG_DEBUG, "COLOR_ENCODING event emitted\n");
+15
View File
@@ -357,6 +357,15 @@ static int libjxl_preprocess_stream(AVCodecContext *avctx, const AVFrame *frame,
jxl_fmt->data_type = info.bits_per_sample <= 8 ? JXL_TYPE_UINT8 : JXL_TYPE_UINT16;
}
if (info.alpha_bits) {
if (avctx->alpha_mode == AVALPHA_MODE_PREMULTIPLIED ||
avctx->alpha_mode == AVALPHA_MODE_UNSPECIFIED && frame->alpha_mode == AVALPHA_MODE_PREMULTIPLIED) {
info.alpha_premultiplied = 1;
} else if (avctx->alpha_mode != AVALPHA_MODE_STRAIGHT && frame->alpha_mode != AVALPHA_MODE_STRAIGHT) {
av_log(avctx, AV_LOG_WARNING, "Unknown alpha mode, assuming straight (independent)\n");
}
}
#if JPEGXL_NUMERIC_VERSION >= JPEGXL_COMPUTE_NUMERIC_VERSION(0, 8, 0)
jxl_bit_depth.bits_per_sample = bits_per_sample;
jxl_bit_depth.type = JXL_BIT_DEPTH_FROM_PIXEL_FORMAT;
@@ -771,6 +780,9 @@ const FFCodec ff_libjxl_encoder = {
FF_CODEC_CAP_AUTO_THREADS | FF_CODEC_CAP_INIT_CLEANUP |
FF_CODEC_CAP_ICC_PROFILES,
CODEC_PIXFMTS_ARRAY(libjxl_supported_pixfmts),
.alpha_modes = (const enum AVAlphaMode[]) {
AVALPHA_MODE_STRAIGHT, AVALPHA_MODE_PREMULTIPLIED, AVALPHA_MODE_UNSPECIFIED
},
.p.priv_class = &libjxl_encode_class,
.p.wrapper_name = "libjxl",
};
@@ -791,6 +803,9 @@ const FFCodec ff_libjxl_anim_encoder = {
FF_CODEC_CAP_AUTO_THREADS | FF_CODEC_CAP_INIT_CLEANUP |
FF_CODEC_CAP_ICC_PROFILES,
CODEC_PIXFMTS_ARRAY(libjxl_supported_pixfmts),
.alpha_modes = (const enum AVAlphaMode[]) {
AVALPHA_MODE_STRAIGHT, AVALPHA_MODE_PREMULTIPLIED, AVALPHA_MODE_UNSPECIFIED
},
.p.priv_class = &libjxl_encode_class,
.p.wrapper_name = "libjxl",
};