mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2026-06-16 04:32:47 +02:00
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:
@@ -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");
|
||||
|
||||
@@ -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",
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user