From patchwork Sat Feb 4 23:28:40 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Leo Izen X-Patchwork-Id: 40286 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:5494:b0:bf:7b3a:fd32 with SMTP id i20csp2238326pzk; Sat, 4 Feb 2023 15:28:54 -0800 (PST) X-Google-Smtp-Source: AK7set9u9BTf0d25P/yN5DU2oz4fnDy9BqCFYF3mNtHKXZpz9qvNpoiS9xP76OTvQGXQz7Kgfbxh X-Received: by 2002:a50:bae4:0:b0:4aa:a0a8:94f8 with SMTP id x91-20020a50bae4000000b004aaa0a894f8mr2922043ede.26.1675553334766; Sat, 04 Feb 2023 15:28:54 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1675553334; cv=none; d=google.com; s=arc-20160816; b=XB+RJcKVWX5N2fXtKZ8DIvHppV5Eh1YIBJh0e3UteIrLzfkn4Qm+XTyx3CXgyJr/OP DopXbKithcnVE8not1OmaHrl0kNl9NmBI/cCnfy9haqrjApC+P6D3LZ9EibcHsxdG/w4 Bgddns/2a5uA9TQKjwCpKzAfKW/wC/J84OZ9pDHjlZFpQZEIwAPf+6xcKjUUH1A3GtpS oSwg7PnWkOQLh5UXAMn7zl7vm9T2bgI0WAi7edeydi2lbcyEGXPScFhDfna9kxBfR4cs 9+ee19Qzsm5An/ABIDbRChWouu0YWtPKETLQmpaMcNRALnau6AHo7L3zMtUm9j4geHhU k3Ow== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:from:dkim-signature:delivered-to; bh=M7keS0ddUWVIXlSLu2XNOJUtKgL/SS7/8mDL4s7MEwg=; b=SKGUe7UTIEve+rmn6w2Fpl4cpSlU7RIuXHndGYI29S6sNfvvY4Y4RrQaXFPN0BCUfn 3Oy8YQEGDt5lDZLq50ZqADbxWUcOxv7jZzRschuP8O/JlH1hm2Q0vE/MpCdk2AhXVwXf xXLcJNWegT4XuOZYpm1PpfHhoggUK5c5/2fmuf69iiZDaCydOrVnDTairxSc0jUXKbIS qJmcBgHgrScaAPYL6G30uPEmLAr8iTN/HK+TdRckkSeLnEM3JKu+YcHmuMkUaiNI3wtF yAdjYIOs0kXII3ZTDSYrpiom/CYXgwZprb4jzIAotC1JI5bP3NA7eWdCNbOvQkj+/RNA YIJA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=pVUneLYc; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id s6-20020aa7d786000000b004aaa1cc2b47si2745789edq.155.2023.02.04.15.28.54; Sat, 04 Feb 2023 15:28:54 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=pVUneLYc; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 428A2687ED1; Sun, 5 Feb 2023 01:28:51 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-io1-f49.google.com (mail-io1-f49.google.com [209.85.166.49]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id CC543687ED1 for ; Sun, 5 Feb 2023 01:28:44 +0200 (EET) Received: by mail-io1-f49.google.com with SMTP id l7so3298564ioa.7 for ; Sat, 04 Feb 2023 15:28:44 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=ulbJKe/HhFfndsVEcg0UPcxk2wEMIcEIYQ93OdopAng=; b=pVUneLYcuylygQZzuTH5KAaDV5zMAB52qNvQ3vWr8MMWW3DIkkF/l7ATzrmbX/GFk0 Gcy/KAUIeNB73pjd4n9aZf+wiXktJWSABR90NHH2w9hzHCumDUWDaIAuiRjltLAjpPm2 k3X7AHx6b+9oPnd1cXJjhRR6tmK5R4nPcoAcnqjA3kNE9h75aK0zqLqZmGzVSuvl1j6C +CH6rVI7g0gedZtWAVOhKq4Wn/m3sp1EtdSe+e11Oq7RFhyT8kFYj4B+o+v+/tNWnJNi XNnqMz1wsoa5GWWmG5SpN/X7CJagKMsyxHwyHv1V/RsYX8yIbLeUldwk/kIJHBjJ+SYb 1fqQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=ulbJKe/HhFfndsVEcg0UPcxk2wEMIcEIYQ93OdopAng=; b=3b4u+BXOu+n073s6bWuQqfh8Q8yfiQ+u9RZveQXfupvAjG+Vb/YuXxvXrFVfY5Xlp/ 8pyi55qJDSn67Sfy4XusfTPX2iU0ng85irFqgeETLKnXNAz0qZqziLqC8a5fjrKWIFxw N+zrENx2E/7UMybcw/LIKPCFSxKEp81XYxHEYI0fZSNQeuMj4AXW+AmT58oU5lUkUBMg zdypdSjNR3XpDl4Sn/5Oo0HwKjvsEqf6+qqFdJSe0WSfq39sDwtYBPhCjFWxlCBEj5N3 76zk83c9X2Y5p3ldyVyZZCHaGoCU9qT4X38mwOFZZfnwWnXwUQERZHJoG84E9GB0yHOi mlPw== X-Gm-Message-State: AO0yUKVFbO6bQE8c2QgplacpO6MChmkoKgJCkVppYX0Ivy/RNPiEVntY xQD1MZmTUo74BjOhTLggmG5GAuyVXkNDsw== X-Received: by 2002:a5e:aa01:0:b0:722:b5a6:bde9 with SMTP id s1-20020a5eaa01000000b00722b5a6bde9mr8640857ioe.0.1675553323330; Sat, 04 Feb 2023 15:28:43 -0800 (PST) Received: from gauss.local (c-98-224-219-15.hsd1.mi.comcast.net. [98.224.219.15]) by smtp.gmail.com with ESMTPSA id p75-20020a02294e000000b003a2d93487easm2103188jap.38.2023.02.04.15.28.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 04 Feb 2023 15:28:43 -0800 (PST) From: Leo Izen To: ffmpeg-devel@ffmpeg.org Date: Sat, 4 Feb 2023 18:28:40 -0500 Message-Id: <20230204232840.3194-1-leo.izen@gmail.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230204133239.246049-1-leo.izen@gmail.com> References: <20230204133239.246049-1-leo.izen@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] avcodec/libjxl: add #ifdef guards for libjxl >= 0.8.0 features 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 Cc: Leo Izen Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: yWVa+RoboR4i Since many distributions ship libjxl 0.7.0 still, we'd still prefer to compile against that, but don't want to lose the features that require libjxl 0.8.0 or greater. For this reason I've added preprocessor #ifdef guards around the features that aren't necessarily in libjxl 0.7.0. Signed-off-by: Leo Izen --- libavcodec/libjxl.h | 12 ++++++++++++ libavcodec/libjxldec.c | 19 +++++++++++++------ libavcodec/libjxlenc.c | 18 ++++++++++++++---- 3 files changed, 39 insertions(+), 10 deletions(-) diff --git a/libavcodec/libjxl.h b/libavcodec/libjxl.h index 5387c438fd..e305b6e758 100644 --- a/libavcodec/libjxl.h +++ b/libavcodec/libjxl.h @@ -27,8 +27,20 @@ #ifndef AVCODEC_LIBJXL_H #define AVCODEC_LIBJXL_H +#include #include +/* + * libjxl version 0.7.0 and earlier doesn't contain these macros at all + * so to detect version 0.7.0 versus 0.8.0 we need to define them ourselves + */ +#ifndef JPEGXL_COMPUTE_NUMERIC_VERSION + #define JPEGXL_COMPUTE_NUMERIC_VERSION(major,minor,patch) ((major<<24) | (minor<<16) | (patch<<8) | 0) +#endif +#ifndef JPEGXL_NUMERIC_VERSION + #define JPEGXL_NUMERIC_VERSION JPEGXL_COMPUTE_NUMERIC_VERSION(0, 7, 0) +#endif + /** * Transform threadcount in ffmpeg to one used by libjxl. * diff --git a/libavcodec/libjxldec.c b/libavcodec/libjxldec.c index abe08eb400..045a1535f9 100644 --- a/libavcodec/libjxldec.c +++ b/libavcodec/libjxldec.c @@ -47,7 +47,9 @@ typedef struct LibJxlDecodeContext { JxlDecoder *decoder; JxlBasicInfo basic_info; JxlPixelFormat jxl_pixfmt; +#if JPEGXL_NUMERIC_VERSION >= JPEGXL_COMPUTE_NUMERIC_VERSION(0, 8, 0) JxlBitDepth jxl_bit_depth; +#endif JxlDecoderStatus events; AVBufferRef *iccp; } LibJxlDecodeContext; @@ -94,14 +96,17 @@ static av_cold int libjxl_decode_init(AVCodecContext *avctx) return libjxl_init_jxl_decoder(avctx); } -static enum AVPixelFormat libjxl_get_pix_fmt(AVCodecContext *avctx, const JxlBasicInfo *basic_info, - JxlPixelFormat *format, JxlBitDepth *depth) +static enum AVPixelFormat libjxl_get_pix_fmt(AVCodecContext *avctx, LibJxlDecodeContext *ctx) { + const JxlBasicInfo *basic_info = &ctx->basic_info; + JxlPixelFormat *format = &ctx->jxl_pixfmt; format->endianness = JXL_NATIVE_ENDIAN; format->num_channels = basic_info->num_color_channels + (basic_info->alpha_bits > 0); - depth->bits_per_sample = avctx->bits_per_raw_sample = basic_info->bits_per_sample; - depth->type = JXL_BIT_DEPTH_FROM_PIXEL_FORMAT; - depth->exponent_bits_per_sample = basic_info->exponent_bits_per_sample; +#if JPEGXL_NUMERIC_VERSION >= JPEGXL_COMPUTE_NUMERIC_VERSION(0, 8, 0) + ctx->jxl_bit_depth.bits_per_sample = avctx->bits_per_raw_sample = basic_info->bits_per_sample; + ctx->jxl_bit_depth.type = JXL_BIT_DEPTH_FROM_PIXEL_FORMAT; + ctx->jxl_bit_depth.exponent_bits_per_sample = basic_info->exponent_bits_per_sample; +#endif /* Gray */ if (basic_info->num_color_channels == 1) { if (basic_info->bits_per_sample <= 8) { @@ -372,7 +377,7 @@ static int libjxl_decode_frame(AVCodecContext *avctx, AVFrame *frame, int *got_f av_log(avctx, AV_LOG_ERROR, "Bad libjxl basic info event\n"); return AVERROR_EXTERNAL; } - avctx->pix_fmt = libjxl_get_pix_fmt(avctx, &ctx->basic_info, &ctx->jxl_pixfmt, &ctx->jxl_bit_depth); + avctx->pix_fmt = libjxl_get_pix_fmt(avctx, ctx); if (avctx->pix_fmt == AV_PIX_FMT_NONE) { av_log(avctx, AV_LOG_ERROR, "Bad libjxl pixel format\n"); return AVERROR_EXTERNAL; @@ -395,10 +400,12 @@ static int libjxl_decode_frame(AVCodecContext *avctx, AVFrame *frame, int *got_f av_log(avctx, AV_LOG_ERROR, "Bad libjxl dec need image out buffer event\n"); return AVERROR_EXTERNAL; } +#if JPEGXL_NUMERIC_VERSION >= JPEGXL_COMPUTE_NUMERIC_VERSION(0, 8, 0) if (JxlDecoderSetImageOutBitDepth(ctx->decoder, &ctx->jxl_bit_depth) != JXL_DEC_SUCCESS) { av_log(avctx, AV_LOG_ERROR, "Error setting output bit depth\n"); return AVERROR_EXTERNAL; } +#endif continue; case JXL_DEC_FULL_IMAGE: /* full image is one frame, even if animated */ diff --git a/libavcodec/libjxlenc.c b/libavcodec/libjxlenc.c index c51024f180..897452f575 100644 --- a/libavcodec/libjxlenc.c +++ b/libavcodec/libjxlenc.c @@ -250,7 +250,10 @@ static int libjxl_encode_frame(AVCodecContext *avctx, AVPacket *pkt, const AVFra JxlBasicInfo info; JxlColorEncoding jxl_color; JxlPixelFormat jxl_fmt; + int bits_per_sample; +#if JPEGXL_NUMERIC_VERSION >= JPEGXL_COMPUTE_NUMERIC_VERSION(0, 8, 0) JxlBitDepth jxl_bit_depth; +#endif JxlEncoderStatus jret; int ret; size_t available = ctx->buffer_size; @@ -270,22 +273,26 @@ static int libjxl_encode_frame(AVCodecContext *avctx, AVPacket *pkt, const AVFra info.ysize = frame->height; info.num_extra_channels = (jxl_fmt.num_channels + 1) % 2; info.num_color_channels = jxl_fmt.num_channels - info.num_extra_channels; - jxl_bit_depth.bits_per_sample = av_get_bits_per_pixel(pix_desc) / jxl_fmt.num_channels; + bits_per_sample = av_get_bits_per_pixel(pix_desc) / jxl_fmt.num_channels; info.bits_per_sample = avctx->bits_per_raw_sample > 0 && !(pix_desc->flags & AV_PIX_FMT_FLAG_FLOAT) - ? avctx->bits_per_raw_sample : jxl_bit_depth.bits_per_sample; + ? avctx->bits_per_raw_sample : bits_per_sample; info.alpha_bits = (info.num_extra_channels > 0) * info.bits_per_sample; if (pix_desc->flags & AV_PIX_FMT_FLAG_FLOAT) { info.exponent_bits_per_sample = info.bits_per_sample > 16 ? 8 : 5; info.alpha_exponent_bits = info.alpha_bits ? info.exponent_bits_per_sample : 0; jxl_fmt.data_type = info.bits_per_sample > 16 ? JXL_TYPE_FLOAT : JXL_TYPE_FLOAT16; - jxl_bit_depth.exponent_bits_per_sample = info.exponent_bits_per_sample; } else { info.exponent_bits_per_sample = 0; info.alpha_exponent_bits = 0; jxl_fmt.data_type = info.bits_per_sample <= 8 ? JXL_TYPE_UINT8 : JXL_TYPE_UINT16; - jxl_bit_depth.exponent_bits_per_sample = 0; } + +#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; + jxl_bit_depth.exponent_bits_per_sample = pix_desc->flags & AV_PIX_FMT_FLAG_FLOAT ? + info.exponent_bits_per_sample : 0; +#endif /* JPEG XL format itself does not support limited range */ if (avctx->color_range == AVCOL_RANGE_MPEG || @@ -362,8 +369,11 @@ static int libjxl_encode_frame(AVCodecContext *avctx, AVPacket *pkt, const AVFra av_log(avctx, AV_LOG_WARNING, "Could not set ICC Profile\n"); if (JxlEncoderSetColorEncoding(ctx->encoder, &jxl_color) != JXL_ENC_SUCCESS) av_log(avctx, AV_LOG_WARNING, "Failed to set JxlColorEncoding\n"); + +#if JPEGXL_NUMERIC_VERSION >= JPEGXL_COMPUTE_NUMERIC_VERSION(0, 8, 0) if (JxlEncoderSetFrameBitDepth(ctx->options, &jxl_bit_depth) != JXL_ENC_SUCCESS) av_log(avctx, AV_LOG_WARNING, "Failed to set JxlBitDepth\n"); +#endif /* depending on basic info, level 10 might * be required instead of level 5 */