From patchwork Tue Jan 30 14:46:08 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Leo Izen X-Patchwork-Id: 45907 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a21:8786:b0:199:de12:6fa6 with SMTP id ph6csp2203678pzb; Tue, 30 Jan 2024 06:46:20 -0800 (PST) X-Google-Smtp-Source: AGHT+IGh8PXHFHxg2CHCFZ1+5iX7DuWauvuKYzOYV2kgixEWbkuO5kmzgtLUm9WdhkCYPRkiXZzB X-Received: by 2002:a05:6512:2823:b0:511:1eb5:2269 with SMTP id cf35-20020a056512282300b005111eb52269mr1313028lfb.21.1706625980571; Tue, 30 Jan 2024 06:46:20 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1706625980; cv=none; d=google.com; s=arc-20160816; b=pncULBIxGCUulNbIg9jvo2pItE1FE7k1U3BsNLlQlqCj/Wao6oaX1z+GsYVBL9byeM RxBbPq/aXBDwxi+vQoX/FIgtP5QS4WXZvJ7yJoK57qDQdg1NKMyeQ63m3CR47+3F5jIo 78vmFajx7CY3RMfhpoqi6/FU2vPP5ojG37VCPBM6lhnE2qlVfvNODIGmXaQ7cJsTMekn It1C+zHw08V+r9ltrSnwvQdhWh0VVTsdHfZlwjlZOraKM0DlI0Og7U5YCX9ohSdHerGR /HKpdpzXyge1C+ZL/JjQUreIjDy8tuWbANAj0Xcl75wDN/XYPmvnWRRwO7/gdgoafdp1 lUtw== 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=UOG4hFYeVSs+dALOMgcVfot/Fut4U8WTMVuvDvPsSOs=; fh=+bdjGe20eEUjtjncwA1dnEEVYNfJL4vyhV+sIRR4l+g=; b=HcsqKR9dBJOnJh8m+4hJvPlmV06d1uCovTrzT7ixCBxKyJSBZ8tCYQVDWHIQ4jGfvi FjnsAaXtoaXUtLf9FsASZ9Rd2Qc7TRZJNdVBYHhQnlUORrnX+J5ldwgB7y9MvLVrA8HC zvnUa/pIKRmG2+HORllx+tDxQk+taLTTC3pQ8zpapsrKzi+1UY6x38nzytABMUvcQ155 91eyKRDUg9PnWOg/oBjtDky4BLdnHyPUKhI42CdqPyqtkNV1bv5z+kjDD9BLis2amMKT TWib15s40I1HG7Vim/v+xASukbOh3LN80JzmjwJ1wk0uamVbhZKBLgrF5v+5EijIRZ6X eHHw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20230601 header.b=fXIbRMLQ; 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 d13-20020a50cd4d000000b0055eac41bb97si3681611edj.69.2024.01.30.06.46.20; Tue, 30 Jan 2024 06:46:20 -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=fXIbRMLQ; 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 8772968D388; Tue, 30 Jan 2024 16:46:17 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-oi1-f178.google.com (mail-oi1-f178.google.com [209.85.167.178]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id D1B5F68D370 for ; Tue, 30 Jan 2024 16:46:11 +0200 (EET) Received: by mail-oi1-f178.google.com with SMTP id 5614622812f47-3be110bbff9so888189b6e.1 for ; Tue, 30 Jan 2024 06:46:11 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1706625970; x=1707230770; 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=QKL0P3vjr+tnyqsNJ3rFcEx6CODM9Z0xBN5RO7KhPR8=; b=fXIbRMLQVN08Fl9ycFSTLYcNbnLtYRa+BC85lk2XJTgrpoMzfXsRVCwDairGq1YmBd 0bhxXzfiQPHIlAtHfSy/uRCLjdl4GgkcaYP9JEP01sqkXKXL8W2sX5wYWtztnFfmHNHU N8IfApYJxZ9WmGxWg8q4ZUoAe0BdBVX35hFWVo6007LeUHEZu5uS4zDm34yQnnPxm8LC HoQMN3AQSQUxCRe0cGvZCl0rtPOetLDN6o2TT/UQRNCaqnKDZy74+BE5nwdQOES2NhfA xNt3wQCAn2wIVhLXQI/+BQP6rtm67Z2PiwJdIm7aAyJjoZl+jI3mC1sSfbO32S/cILOC ns3g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1706625970; x=1707230770; 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=QKL0P3vjr+tnyqsNJ3rFcEx6CODM9Z0xBN5RO7KhPR8=; b=takCANtYjnK3NaGaGK1hq/M5J6NxPNd47RQEarKMCH40eHhxebLQd+VgaNVrYjqdOy 4SdgnrkSjv8yK1Ckyt+wAxIiHSMAX3zqcLWhoXvak+qKbEdxrhtv9medyNJcMvutaNz2 GPdJUmcLn+k+QYvUQkEWDjPf4MLFfwTl4SMQTkO1hq8BPYWDe7iAgyIlZrRJqwPBY08d 1B6QpTCth6DP9jD58wZnFmD8zkvzbmibQSld7xGuP1Q1oIAiFOI9B1uwh5Rb+55L5siD xRcPpcGJ5lAYEyhZ7JRmfI7XV21SZMIJWHSN9SpSreUUqtNYd5NuHzO68NrYR4KCkQEW MK4A== X-Gm-Message-State: AOJu0YxqppCdG3QeLYPp6TloV3eVMTAA4EZNPKX9CXweSsw18xlCIkXb RRtnVHiLXj2agaE+sgr4CcgLetj6EJQCvX/ghRt14PTNYCsuTInbFCMq1GL4 X-Received: by 2002:a05:6808:494:b0:3be:7cd0:926 with SMTP id z20-20020a056808049400b003be7cd00926mr3869650oid.3.1706625970153; Tue, 30 Jan 2024 06:46:10 -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 w3-20020a05620a444300b00783fbbe9741sm1945261qkp.134.2024.01.30.06.46.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 30 Jan 2024 06:46:09 -0800 (PST) From: Leo Izen To: ffmpeg-devel@ffmpeg.org Date: Tue, 30 Jan 2024 09:46:08 -0500 Message-ID: <20240130144608.54492-1-leo.izen@gmail.com> X-Mailer: git-send-email 2.43.0 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2] 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: ps0ZjC6d4m2h 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..4ddd5f9f2c 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; + const 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; }