From patchwork Sun Jun 26 06:47:23 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Leo Izen X-Patchwork-Id: 36452 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:8b27:b0:88:1bbf:7fd2 with SMTP id l39csp1300284pzh; Sat, 25 Jun 2022 23:47:54 -0700 (PDT) X-Google-Smtp-Source: AGRyM1tR+dDm4BW6kEz7Hkai0T1tVHE9PdxRVaX7xbp1UJ3A9oRSRywPOAHYpv+Un+wf7nB2bnqU X-Received: by 2002:a17:906:7cc5:b0:726:38e0:4e80 with SMTP id h5-20020a1709067cc500b0072638e04e80mr6946812ejp.664.1656226074097; Sat, 25 Jun 2022 23:47:54 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1656226074; cv=none; d=google.com; s=arc-20160816; b=t1D6WyJmEDvhUGF0dG7bkPK/XEnmU33AnYmmMQgplTCynmMnuPVXFizxYqQIFxK0nt 2mJVSa1BbFVvl6Kfw3zffOkX4uCaM2WcgBGxIhhD8u36OwK34e7cfrnhDY4LXMmQ8Brt 8XyzjijfVj4kq7Lzb8GLUWRfnlt3S1eQsnRhnvl7JgpIJvvfbVqz3vAlUqfw1nmD1kjy PmPfkOtfSsKIGvzxCbYKX/Q44NIpJetZx/+E8vL0ZV9OaBDgGvnpB+1bBdevrb3bxdbT 9UjDEAAvoTLsdPvZ77muBzYz32Za8TJ8Qsra+R7PpioaBgdTLaDZrkDOMkIlNTQNCQjq FdsQ== 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:message-id:date:to:from :dkim-signature:delivered-to; bh=24KXdP/es7vMJOkbz8SsGsI9r7hiwiM5LJHFSwSCZ10=; b=Xk5GqHhoUT711COQjF/k1zzQmE5B6qcMzYLOT8Nl4K0xrIZeBdbbtbLMl20TcyrnjL ehNXq1sg6Aipz2Pl8YuvX1MChCkSioUzv8IYfaUuPMqVv9bIDuz8I2k/EO2m+XyHRH+E GwWkZTSw6uYGxRgH4KeeUs5FFdHPINg33t7/moxwO3wr0sxJJRoJXi101gIARIvQW719 r6cDOpqd4dovjeMHa46iLITLdUx7ic4kBpYMLUYVbMm56KEU/wo9+exfKTaMUyI3T8U0 2nFzYk5QqVOeHEQRykTs9HQgpWArGF8kDNa6d7Yikv8BEExR10VBM4Mrf8q7ksMgWWM0 syaQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=n+YYYu8o; 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 hv11-20020a17090760cb00b0071577783853si8746638ejc.963.2022.06.25.23.47.41; Sat, 25 Jun 2022 23:47:54 -0700 (PDT) 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=n+YYYu8o; 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 2B81568B7B3; Sun, 26 Jun 2022 09:47:37 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qv1-f49.google.com (mail-qv1-f49.google.com [209.85.219.49]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 2425B68B526 for ; Sun, 26 Jun 2022 09:47:30 +0300 (EEST) Received: by mail-qv1-f49.google.com with SMTP id 88so10630542qva.9 for ; Sat, 25 Jun 2022 23:47:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=NM6Gr2A+Q3gLFZjPYTxxlQOZUuqc3PRc09+OhhDhxkg=; b=n+YYYu8oFlbRRGlxczP31J2XTzOXPAwoE+S6GjMl2faLbUYDQQqFLhjF/LU89mTcSr Ti8axzP6jNGo+vzySbLN4y6wZPmxwTyeibt5EdkX9qmjNUiz1WEffKBanUlUmua6VLxF MYSkwo01cXDDw4tWmQ+6MxznfKLR6H/K6o6VHDFMv1Y5JF1vrNZRx9TQk8b9aJAQrlXL fiZqVWax0nU7FgIR3g3DfPi/zmLUry2ws960Wxkx2C9DseMVCsCv7tffBdtEmTrO4xhV P+YkwrGDY+qkxS6ecKih1IWX9+nHiI4RITnBYGJ4otLyCFn85tP1S51EsEqaDU21tUYN ANTg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=NM6Gr2A+Q3gLFZjPYTxxlQOZUuqc3PRc09+OhhDhxkg=; b=mnblg0IEMvzz70K37XuwEVOanXy/nR2CiNFVlrJn2wmJc5wx1vEHoMvly94WCZ4Z6k nRIKJ/kiSXIhxZwMhz7bIsGi/qiHyy7v9JH/NtCrl5mK2w98XFbTYYeQoxq09J3AZ4bF ikjo+Dlrej2W/spVvi2KBv4UPtwLlao1CBUdsqAYq7oxPDli+zUnsF20pnnl3J4HeZv/ GLNrDLYjEfzUFNMZy+OS6eW3palHPKAOgHpNx0F96uaW47gx2pQZR0aqAxrkk3OTgIYy RxL1FMtpaosjnj9T43AZIVvDB2/6hFXXRci61rPtf9cbZHjcv4xuJYHAwLRwJBMadJDr JTBw== X-Gm-Message-State: AJIora/AK2c/C1MIcdYAIwpAIP0q/NrApAiBcLUFrtjH9bJKtD5l04i/ +rxSDan34lQ5kLczk+m/B14rw5X1TAE= X-Received: by 2002:ac8:7c52:0:b0:305:a14:6f77 with SMTP id o18-20020ac87c52000000b003050a146f77mr5059690qtv.441.1656226048548; Sat, 25 Jun 2022 23:47:28 -0700 (PDT) Received: from gauss.local (c-68-41-54-207.hsd1.mi.comcast.net. [68.41.54.207]) by smtp.gmail.com with ESMTPSA id bw20-20020a05622a099400b00304bc2acc25sm4653658qtb.6.2022.06.25.23.47.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 25 Jun 2022 23:47:26 -0700 (PDT) From: Leo Izen To: ffmpeg-devel@ffmpeg.org Date: Sun, 26 Jun 2022 02:47:23 -0400 Message-Id: <20220626064723.20730-1-leo.izen@gmail.com> X-Mailer: git-send-email 2.36.1 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] avcodec/libjxlenc: avoid failure when level 10 is required 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: Rmhs1QlQyLc0 If a level 10 codestream is required, JxlEncoderSetBasicInfo will fail as it verifies the codestream level restrictions. However, there's no way for the library to provide the info on what codestream level is actually required until the BasicInfo struct is already set. Thus, we work around this problem by setting the codestream level to 10 in order to prevent JxlEncoderSetBasicInfo from failing, and then we later query the required codestream level. Signed-off-by: Leo Izen --- libavcodec/libjxlenc.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/libavcodec/libjxlenc.c b/libavcodec/libjxlenc.c index 6a948cc3ae..b427d5d1a7 100644 --- a/libavcodec/libjxlenc.c +++ b/libavcodec/libjxlenc.c @@ -257,11 +257,25 @@ static int libjxl_encode_frame(AVCodecContext *avctx, AVPacket *pkt, const AVFra return ret; } + /* + * We set all codestreams to level 10 here first, because + * JxlEncoderSetBasicInfo fails if level10 is required, but there is no + * way to determine if level10 is required until after the basic info is + * already set (a catch-22). To work around this problem, we set the level + * to level10 immediately, populate the basic info, and then query the + * level that is actually required. + * + * Return value is not checked because on a fresh encoder instance this + * cannot fail. + */ + JxlEncoderSetCodestreamLevel(ctx->encoder, 10); + /* populate the basic info settings */ JxlEncoderInitBasicInfo(&info); jxl_fmt.num_channels = pix_desc->nb_components; info.xsize = frame->width; info.ysize = frame->height; + /* num_extra_channels includes the alpha channel */ info.num_extra_channels = (jxl_fmt.num_channels + 1) % 2; info.num_color_channels = jxl_fmt.num_channels - info.num_extra_channels; info.bits_per_sample = av_get_bits_per_pixel(pix_desc) / jxl_fmt.num_channels;