From patchwork Tue Jan 30 00:37:50 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Leo Izen X-Patchwork-Id: 45898 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a21:8786:b0:199:de12:6fa6 with SMTP id ph6csp1866852pzb; Mon, 29 Jan 2024 16:38:05 -0800 (PST) X-Google-Smtp-Source: AGHT+IFJJg2EJ5kzPWpk/+G8f+h7e4GVM7RywPRVtnqjlSNrff8GgH6FZ6WoJUCrcZP8XqvaNk2V X-Received: by 2002:a05:6402:1294:b0:55f:28cd:bb42 with SMTP id w20-20020a056402129400b0055f28cdbb42mr1344617edv.10.1706575085157; Mon, 29 Jan 2024 16:38:05 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1706575085; cv=none; d=google.com; s=arc-20160816; b=F6gDT7SPquBlTSawUOfe/EE2jNkmoiMMY9bcB+a5942BJoDWXnVm3SS8hqwJfuUyiM /E3td1t1mQSH42VkSR5CSpjQtsw1OisgJ5lr3WyHFkB8zxliOfegILmlNDWR4+ixUero Ff9w6OGUsG+WlIVQ5Vg+50UrbbQXS1BnMN6wMgiVRDGSpLzFJJ7xHEOLUD4XzyQHs0dy izC4P9pdPUZhE4E0PPXGv78KotVFh+zHL1h+ASR3QQoU9QqrA58HEjcYg9t0WHfLUupQ 1QPcV4urs2eB4VmwXcSal6wxPDlnZoYjr5SKGFDx3coPAj5N8X4d4A8qkPlU1AA2SwAm Y7FA== 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=SsGQ4ByqAmJP5MQcyVU5mYTyU9miTLoG3h5HbYl+y4w=; fh=+bdjGe20eEUjtjncwA1dnEEVYNfJL4vyhV+sIRR4l+g=; b=WXbC+lKOXZuYPku5Jbk68x8L3kYdoKLcuFzxHcNfsmQqXOlTx/H1Y3CaYoJ+10qt1x 3sknNqdoYjRr5ZBBIlhLv3iOemHevV+pCw/XAAniSpjje19G4psu6SOzDMS1ENzdNclz JwdaftDYMTBCSjiI84pdpFrrGD4rVddM7eBEW93XJsWtAofz6E71vLMeVt2Lm9sQY+xK VvZN6s5fUrdcQpVNWCn29yyJQEv7qUGUKYeE4HPHjqSy1WIhyjCkULyKD3wUfzstZraU xmFwLUXt34xkb0Y9rHJC39cOPdMaGg8yLpjzQZErKAuYEAJm5U3FEpyNU7Ud0xNeM8Cs FKpQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20230601 header.b="CfNa3m/P"; 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 7-20020a0564021f4700b0055c44dbd072si4126584edz.210.2024.01.29.16.38.04; Mon, 29 Jan 2024 16:38:05 -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=20230601 header.b="CfNa3m/P"; 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 BD6EA68D2A6; Tue, 30 Jan 2024 02:38:01 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qk1-f178.google.com (mail-qk1-f178.google.com [209.85.222.178]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 16A3A68D29E for ; Tue, 30 Jan 2024 02:37:55 +0200 (EET) Received: by mail-qk1-f178.google.com with SMTP id af79cd13be357-783cdbecfe2so109027085a.0 for ; Mon, 29 Jan 2024 16:37:55 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1706575073; x=1707179873; darn=ffmpeg.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=mu2hKUExQ+gLmdrO11J9jyjw6xznKYxl83DiJvsyWGg=; b=CfNa3m/Ph0r3l3uUvZVdL2fkj+3RAUwNfGJcnPhJSTBO/t6wovJpb09HXw7yPAn1vL XSPd8kfIUPOL9xitPpdQKYh7iSJASHGQg5E0IAS6sBmOD2YQ918luOtdWkHZr59VnXdZ 0vd6DoC5dvVnBL+JC1RQcBllAkGhXe1ms2swT24itgLGOOnEd+I/uwAl+ZdYsT9wG4oE Jt1OP/WMLU+qW2XeDJvVzIzR6atnvCYBYnXkCxjGblYjyK/F/ZzoZiTsIVzTFBFYhrgx c/g/KVHceGqQVQ+g4+0nXtLNpnF1q5BRmKT0xQobT0lVpTRIDY8V/kxtbPZ8tSS+GT10 YzOg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1706575073; x=1707179873; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=mu2hKUExQ+gLmdrO11J9jyjw6xznKYxl83DiJvsyWGg=; b=vLjIGMGIro8tICBNSjcg24UzUOdJIVyc7OikF1kIQOHlP6yNMonql7UzgJIzidcK33 0iaOrl5yclj/8ENSuFtF90inwC3kXB4XMS3td3FaJ/SgPeaaumEoPZDofg0H6ziUpWdL iVFeptQt4m2n06ToyH9XTG18hXfvHttBKeB92fAyQthLiQdF1K5cFEw6tAlmdwx3Ranl AW63n5k5NXydCUw7sZlyb2uIFxAGq+EXdtYkVvOEkGheWGRxHZ0rYJRXy+uDVNvQCWQW ulFpM6yr1UK01QoupUQpe/qOdxFDECj2W6woUb3J/P0rX4Hi6WqdTH7tyS7zelOIQeTf xHoA== X-Gm-Message-State: AOJu0YzlP0NW8HzqePsqd2z5crmnuZe96eEuvyUC39cQMOPr+gH1QsPh zMi/goDxIrjT0JP6629W3Wq3p+54zb0Puwnce9C6CODKwaKDX9WSo81KslDM X-Received: by 2002:ad4:5c66:0:b0:686:9faf:6f10 with SMTP id i6-20020ad45c66000000b006869faf6f10mr10694151qvh.0.1706575073376; Mon, 29 Jan 2024 16:37:53 -0800 (PST) Received: from gauss.local (c-68-56-149-176.hsd1.mi.comcast.net. [68.56.149.176]) by smtp.gmail.com with ESMTPSA id ow9-20020a0562143f8900b0068692ea038esm3930384qvb.91.2024.01.29.16.37.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 29 Jan 2024 16:37:53 -0800 (PST) From: Leo Izen To: ffmpeg-devel@ffmpeg.org Date: Mon, 29 Jan 2024 19:37:50 -0500 Message-ID: <20240130003750.27503-1-leo.izen@gmail.com> X-Mailer: git-send-email 2.43.0 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] avcodec/libjxlenc: support negative linesizes 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: 9TbIzOI3Xk7g libjxl doesn't support negative strides, but JPEG XL has an orientation flag inside the codestream. We can use this to work around the library limitation, by taking the absolute value of the negative row stride, sending the image up-side-down, and telling the library that the image has a vertical-flip orientation. Signed-off-by: Leo Izen --- libavcodec/libjxlenc.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/libavcodec/libjxlenc.c b/libavcodec/libjxlenc.c index 67be8a01ca..49020b1036 100644 --- a/libavcodec/libjxlenc.c +++ b/libavcodec/libjxlenc.c @@ -259,6 +259,7 @@ static int libjxl_encode_frame(AVCodecContext *avctx, AVPacket *pkt, const AVFra size_t available = ctx->buffer_size; size_t bytes_written = 0; uint8_t *next_out = ctx->buffer; + uint8_t *data; ret = libjxl_init_jxl_encoder(avctx); if (ret) { @@ -303,6 +304,7 @@ static int libjxl_encode_frame(AVCodecContext *avctx, AVPacket *pkt, const AVFra /* bitexact lossless requires there to be no XYB transform */ info.uses_original_profile = ctx->distance == 0.0; + info.orientation = frame->linesize[0] >= 0 ? JXL_ORIENT_IDENTITY : JXL_ORIENT_FLIP_VERTICAL; if (JxlEncoderSetBasicInfo(ctx->encoder, &info) != JXL_ENC_SUCCESS) { av_log(avctx, AV_LOG_ERROR, "Failed to set JxlBasicInfo\n"); @@ -383,9 +385,15 @@ static int libjxl_encode_frame(AVCodecContext *avctx, AVPacket *pkt, const AVFra } jxl_fmt.endianness = JXL_NATIVE_ENDIAN; - jxl_fmt.align = frame->linesize[0]; + if (frame->linesize[0] >= 0) { + jxl_fmt.align = frame->linesize[0]; + data = frame->data[0]; + } else { + jxl_fmt.align = -frame->linesize[0]; + data = frame->data[0] - jxl_fmt.align * (info.ysize - 1); + } - if (JxlEncoderAddImageFrame(ctx->options, &jxl_fmt, frame->data[0], jxl_fmt.align * info.ysize) != JXL_ENC_SUCCESS) { + if (JxlEncoderAddImageFrame(ctx->options, &jxl_fmt, data, jxl_fmt.align * info.ysize) != JXL_ENC_SUCCESS) { av_log(avctx, AV_LOG_ERROR, "Failed to add Image Frame\n"); return AVERROR_EXTERNAL; }