From patchwork Wed Dec 6 08:22:16 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marton Balint X-Patchwork-Id: 44952 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:9153:b0:181:818d:5e7f with SMTP id x19csp106352pzc; Wed, 6 Dec 2023 00:23:03 -0800 (PST) X-Google-Smtp-Source: AGHT+IE0RWZ2RpEQf935weK1wKL8U+AY7GehqDgZ0M8/ZYyR0ts8LDl48IoDuHYjHk6CQZi7ATYv X-Received: by 2002:a05:6402:3595:b0:54c:d1a2:45fc with SMTP id y21-20020a056402359500b0054cd1a245fcmr782429edc.3.1701850983620; Wed, 06 Dec 2023 00:23:03 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1701850983; cv=none; d=google.com; s=arc-20160816; b=xhzxrq+HyMF83qOHLXp+gK5rry6vOaH0edkjtLNG+Q2JhZebWWWdGD+IJ3V6+pWGnJ W1pXmPwJPcdUvIJ/cHCHR1WKNx/B/t/br2InZl2mlvVz1EFXTXD5Xsw3aRSsAWkY0SSm xBT7XYh2rjGzUXhrVf1WYKE4E3bhNfTHxzz2FHnkYJ9Iyne6dVe4QlfkAyNw7fGdCAMl 8dALldEN97EnysNUPEaVtf8p2BTLeM7MCPWUtU68K7W8qdocXK2edf/cNy8XWy8JV7CF QLASe+PJKJNvF5h44TFQnn0hqL0H3j1s3BtisJeKaCY9/zIPmMuL5qARaSWTVHiajG8R TiQw== 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:delivered-to; bh=aNjDeKKHOJ9KOCku3K7pNV02SEYHaBxwCOuvsQlZxOE=; fh=s+G8Ss4JbeMFkWPSp2LmIH/LXFyBlALRiww1j3FPjHY=; b=s3ZXXMe86iZCLAKWxfZ2xIBYHtRB0Pou/97/EjXgBQhNpk75MP6z1CTuQMsfoFggRX S5tTguTir4ZJWFJHhWCz3LNK++Ija7zIG3B4oXpVfJXqV4RZLhDrKq3hRbBm+OSwiavz FlHy9kSC6Y+yU19+QqLvGNyAGtPC5q8hCjX8VOoImDEXYpECSctON59t3vA7ijXQV2Sg 5FHW7fRP2CGuhnfPQ9TGu707Ej4hOCdNs2LsCvIzfttTIRhUAMku8ZUOm+nHO3YLCloE LbZMoXSOSTH+km0HxtRlgU6K1VT2/2a3XoXR2fJOywFnVt7uyXK0vJ05FDJ7BC7GjSmS d5rg== ARC-Authentication-Results: i=1; mx.google.com; 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 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id ee8-20020a056402290800b0054c4b16b045si1735062edb.626.2023.12.06.00.23.03; Wed, 06 Dec 2023 00:23:03 -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; 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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 0A0FE68CF5A; Wed, 6 Dec 2023 10:22:39 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from iq.passwd.hu (iq.passwd.hu [217.27.212.140]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 447DC68CDF6 for ; Wed, 6 Dec 2023 10:22:31 +0200 (EET) Received: from localhost (localhost [127.0.0.1]) by iq.passwd.hu (Postfix) with ESMTP id 262B9E9A20; Wed, 6 Dec 2023 09:22:31 +0100 (CET) X-Virus-Scanned: amavisd-new at passwd.hu Received: from iq.passwd.hu ([127.0.0.1]) by localhost (iq.passwd.hu [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id YGgaKYYp6hiF; Wed, 6 Dec 2023 09:22:28 +0100 (CET) Received: from bluegene.passwd.hu (localhost [127.0.0.1]) by iq.passwd.hu (Postfix) with ESMTP id 9FFFFE9982; Wed, 6 Dec 2023 09:22:27 +0100 (CET) From: Marton Balint To: ffmpeg-devel@ffmpeg.org Date: Wed, 6 Dec 2023 09:22:16 +0100 Message-Id: <20231206082220.5532-3-cus@passwd.hu> X-Mailer: git-send-email 2.35.3 In-Reply-To: <20231206082220.5532-1-cus@passwd.hu> References: <20231206082220.5532-1-cus@passwd.hu> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2 3/7] avutil/imgutils: fix av_image_fill_black() for some pixel formats 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: Marton Balint Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: 4T4+P1MbqGiN - Fixes YA formats, because previous code always assumed alpha as the 4th component. - Fixes PAL format (as long as 0 is black, as in a systematic palette), because previous code assumed it as limited Y. - Fixes XYZ format because it does not need nonzero chroma components - Fixes xv30be as the bitstream mode got merged to the non-bitstream mode. Signed-off-by: Marton Balint --- libavutil/imgutils.c | 49 +++++++++++++++-------------------------- tests/ref/fate/imgutils | 14 ++++++------ 2 files changed, 25 insertions(+), 38 deletions(-) diff --git a/libavutil/imgutils.c b/libavutil/imgutils.c index da3812698e..5e401139c8 100644 --- a/libavutil/imgutils.c +++ b/libavutil/imgutils.c @@ -590,35 +590,18 @@ int av_image_fill_black(uint8_t * const dst_data[4], const ptrdiff_t dst_linesiz uint8_t clear_block[4][MAX_BLOCK_SIZE] = {{0}}; // clear padding with 0 int clear_block_size[4] = {0}; ptrdiff_t plane_line_bytes[4] = {0}; - int rgb, limited; + int rgb, xyz, pal, limited, alpha, bitstream; int plane, c; if (!desc || nb_planes < 1 || nb_planes > 4 || desc->flags & AV_PIX_FMT_FLAG_HWACCEL) return AVERROR(EINVAL); rgb = !!(desc->flags & AV_PIX_FMT_FLAG_RGB); - limited = !rgb && range != AVCOL_RANGE_JPEG; - - if (desc->flags & AV_PIX_FMT_FLAG_BITSTREAM) { - ptrdiff_t bytewidth = av_image_get_linesize(pix_fmt, width, 0); - uint8_t *data; - int mono = pix_fmt == AV_PIX_FMT_MONOWHITE || pix_fmt == AV_PIX_FMT_MONOBLACK; - int fill = pix_fmt == AV_PIX_FMT_MONOWHITE ? 0xFF : 0; - if (nb_planes != 1 || !(rgb || mono) || bytewidth < 1) - return AVERROR(EINVAL); - - if (!dst_data) - return 0; - - data = dst_data[0]; - - // (Bitstream + alpha will be handled incorrectly - it'll remain transparent.) - for (;height > 0; height--) { - memset(data, fill, bytewidth); - data += dst_linesize[0]; - } - return 0; - } + xyz = !!(desc->flags & AV_PIX_FMT_FLAG_XYZ); + pal = !!(desc->flags & AV_PIX_FMT_FLAG_PAL); + limited = !rgb && !xyz && !pal && range != AVCOL_RANGE_JPEG; + alpha = !pal && !!(desc->flags & AV_PIX_FMT_FLAG_ALPHA); + bitstream = !!(desc->flags & AV_PIX_FMT_FLAG_BITSTREAM); for (c = 0; c < desc->nb_components; c++) { const AVComponentDescriptor comp = desc->comp[c]; @@ -635,7 +618,7 @@ int av_image_fill_black(uint8_t * const dst_data[4], const ptrdiff_t dst_linesiz for (c = 0; c < desc->nb_components; c++) { const AVComponentDescriptor comp = desc->comp[c]; // (Multiple pixels happen e.g. with AV_PIX_FMT_UYVY422.) - int w = clear_block_size[comp.plane] / comp.step; + int w = (bitstream ? 8 : 1) * clear_block_size[comp.plane] / comp.step; uint8_t *c_data[4]; const int c_linesize[4] = {0}; uint16_t src_array[MAX_BLOCK_SIZE]; @@ -644,18 +627,22 @@ int av_image_fill_black(uint8_t * const dst_data[4], const ptrdiff_t dst_linesiz if (comp.depth > 16) return AVERROR(EINVAL); - if (!rgb && comp.depth < 8) - return AVERROR(EINVAL); if (w < 1) return AVERROR(EINVAL); - if (c == 0 && limited) { - src = 16 << (comp.depth - 8); - } else if ((c == 1 || c == 2) && !rgb) { - src = 128 << (comp.depth - 8); - } else if (c == 3) { + if (pix_fmt == AV_PIX_FMT_MONOWHITE) { + src = 1; + } else if (c + 1 == desc->nb_components && alpha) { // (Assume even limited YUV uses full range alpha.) src = (1 << comp.depth) - 1; + } else if (c == 0 && limited && comp.depth > 1) { + if (comp.depth < 8) + return AVERROR(EINVAL); + src = 16 << (comp.depth - 8); + } else if ((c == 1 || c == 2) && !rgb && !xyz) { + if (comp.depth < 8) + return AVERROR(EINVAL); + src = 128 << (comp.depth - 8); } for (x = 0; x < w; x++) diff --git a/tests/ref/fate/imgutils b/tests/ref/fate/imgutils index f12bef3fb5..c31bc38d77 100644 --- a/tests/ref/fate/imgutils +++ b/tests/ref/fate/imgutils @@ -282,7 +282,7 @@ yuv411p total_size: 4608, black_unknown_crc: 0xd00f6cc6, black_tv_cr gray total_size: 3072, black_unknown_crc: 0x63e301a2, black_tv_crc: 0x63e301a2, black_pc_crc: 0x00000000 monow total_size: 384, black_unknown_crc: 0x1ba3e150, black_tv_crc: 0x1ba3e150, black_pc_crc: 0x1ba3e150 monob total_size: 384, black_unknown_crc: 0x00000000, black_tv_crc: 0x00000000, black_pc_crc: 0x00000000 -pal8 total_size: 4096, black_unknown_crc: 0x63e301a2, black_tv_crc: 0x63e301a2, black_pc_crc: 0x00000000 +pal8 total_size: 4096, black_unknown_crc: 0x00000000, black_tv_crc: 0x00000000, black_pc_crc: 0x00000000 yuvj420p total_size: 4608, black_unknown_crc: 0xd00f6cc6, black_tv_crc: 0xd00f6cc6, black_pc_crc: 0x234969af yuvj422p total_size: 6144, black_unknown_crc: 0x71fcc79c, black_tv_crc: 0x71fcc79c, black_pc_crc: 0xa9fa0192 yuvj444p total_size: 9216, black_unknown_crc: 0x1c302b58, black_tv_crc: 0x1c302b58, black_pc_crc: 0xdf792ea7 @@ -325,7 +325,7 @@ rgb444le total_size: 6144, black_unknown_crc: 0x00000000, black_tv_cr rgb444be total_size: 6144, black_unknown_crc: 0x00000000, black_tv_crc: 0x00000000, black_pc_crc: 0x00000000 bgr444le total_size: 6144, black_unknown_crc: 0x00000000, black_tv_crc: 0x00000000, black_pc_crc: 0x00000000 bgr444be total_size: 6144, black_unknown_crc: 0x00000000, black_tv_crc: 0x00000000, black_pc_crc: 0x00000000 -ya8 total_size: 6144, black_unknown_crc: 0xcb089fb0, black_tv_crc: 0xcb089fb0, black_pc_crc: 0xc9dc3ddf +ya8 total_size: 6144, black_unknown_crc: 0x21aa6b6a, black_tv_crc: 0x21aa6b6a, black_pc_crc: 0x237ec905 bgr48be total_size: 18432, black_unknown_crc: 0x00000000, black_tv_crc: 0x00000000, black_pc_crc: 0x00000000 bgr48le total_size: 18432, black_unknown_crc: 0x00000000, black_tv_crc: 0x00000000, black_pc_crc: 0x00000000 yuv420p9be total_size: 9216, black_unknown_crc: 0x9154a536, black_tv_crc: 0x9154a536, black_pc_crc: 0xeeddecd0 @@ -367,8 +367,8 @@ yuva422p16be total_size: 18432, black_unknown_crc: 0x630b483b, black_tv_cr yuva422p16le total_size: 18432, black_unknown_crc: 0xdac3d2ac, black_tv_crc: 0xdac3d2ac, black_pc_crc: 0x31970804 yuva444p16be total_size: 24576, black_unknown_crc: 0x4010c8d3, black_tv_crc: 0x4010c8d3, black_pc_crc: 0xca6bd07e yuva444p16le total_size: 24576, black_unknown_crc: 0x1824855b, black_tv_crc: 0x1824855b, black_pc_crc: 0x06f5c440 -xyz12le total_size: 18432, black_unknown_crc: 0x24c4432b, black_tv_crc: 0x24c4432b, black_pc_crc: 0xfe5a7889 -xyz12be total_size: 18432, black_unknown_crc: 0xac983d03, black_tv_crc: 0xac983d03, black_pc_crc: 0x949a61fc +xyz12le total_size: 18432, black_unknown_crc: 0x00000000, black_tv_crc: 0x00000000, black_pc_crc: 0x00000000 +xyz12be total_size: 18432, black_unknown_crc: 0x00000000, black_tv_crc: 0x00000000, black_pc_crc: 0x00000000 nv16 total_size: 6144, black_unknown_crc: 0x71fcc79c, black_tv_crc: 0x71fcc79c, black_pc_crc: 0xa9fa0192 nv20le total_size: 12288, black_unknown_crc: 0x2ef977dc, black_tv_crc: 0x2ef977dc, black_pc_crc: 0x5a944de0 nv20be total_size: 12288, black_unknown_crc: 0x7cb8d0b6, black_tv_crc: 0x7cb8d0b6, black_pc_crc: 0xa0507635 @@ -377,8 +377,8 @@ rgba64le total_size: 24576, black_unknown_crc: 0x0ab5caf6, black_tv_cr bgra64be total_size: 24576, black_unknown_crc: 0x0ab5caf6, black_tv_crc: 0x0ab5caf6, black_pc_crc: 0x0ab5caf6 bgra64le total_size: 24576, black_unknown_crc: 0x0ab5caf6, black_tv_crc: 0x0ab5caf6, black_pc_crc: 0x0ab5caf6 yvyu422 total_size: 6144, black_unknown_crc: 0xcb089fb0, black_tv_crc: 0xcb089fb0, black_pc_crc: 0xc9dc3ddf -ya16be total_size: 12288, black_unknown_crc: 0x5483d935, black_tv_crc: 0x5483d935, black_pc_crc: 0x06397bf3 -ya16le total_size: 12288, black_unknown_crc: 0x5d8e1cf6, black_tv_crc: 0x5d8e1cf6, black_pc_crc: 0x8fceec45 +ya16be total_size: 12288, black_unknown_crc: 0x9f12f9d6, black_tv_crc: 0x9f12f9d6, black_pc_crc: 0xcda85b10 +ya16le total_size: 12288, black_unknown_crc: 0x1fe8aba3, black_tv_crc: 0x1fe8aba3, black_pc_crc: 0xcda85b10 gbrap total_size: 12288, black_unknown_crc: 0xda63f152, black_tv_crc: 0xda63f152, black_pc_crc: 0xda63f152 gbrap16be total_size: 24576, black_unknown_crc: 0x53374343, black_tv_crc: 0x53374343, black_pc_crc: 0x53374343 gbrap16le total_size: 24576, black_unknown_crc: 0x53374343, black_tv_crc: 0x53374343, black_pc_crc: 0x53374343 @@ -471,7 +471,7 @@ p012le total_size: 9216, black_unknown_crc: 0xfff85b60, black_tv_cr p012be total_size: 9216, black_unknown_crc: 0x4d4d9903, black_tv_crc: 0x4d4d9903, black_pc_crc: 0x69c6fe01 y212be total_size: 12288, black_unknown_crc: 0x5483d935, black_tv_crc: 0x5483d935, black_pc_crc: 0x06397bf3 y212le total_size: 12288, black_unknown_crc: 0x5d8e1cf6, black_tv_crc: 0x5d8e1cf6, black_pc_crc: 0x8fceec45 -xv30be total_size: 12288, black_unknown_crc: ----------, black_tv_crc: ----------, black_pc_crc: ---------- +xv30be total_size: 12288, black_unknown_crc: 0x1c42115f, black_tv_crc: 0x1c42115f, black_pc_crc: 0x37bf2ef8 xv30le total_size: 12288, black_unknown_crc: 0x4bb0b075, black_tv_crc: 0x4bb0b075, black_pc_crc: 0x02d585cf xv36be total_size: 24576, black_unknown_crc: 0x6ba828bd, black_tv_crc: 0x6ba828bd, black_pc_crc: 0x5f450f41 xv36le total_size: 24576, black_unknown_crc: 0xc3794950, black_tv_crc: 0xc3794950, black_pc_crc: 0x40874939