From patchwork Fri Dec 24 03:08:59 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: rcombs X-Patchwork-Id: 32882 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:cd86:0:0:0:0:0 with SMTP id d128csp7805206iog; Thu, 23 Dec 2021 19:10:47 -0800 (PST) X-Google-Smtp-Source: ABdhPJzyIYTVbs13PbLes9Dd/IgowlaEtpf+lGpbYt4+0CdPE06FOS8dWUEdCiWteFJvWK2LMXBP X-Received: by 2002:a17:907:86aa:: with SMTP id qa42mr3979902ejc.142.1640315447517; Thu, 23 Dec 2021 19:10:47 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1640315447; cv=none; d=google.com; s=arc-20160816; b=hIxWtGHLkNhrE7OOQBppkG1zdt5KGtcIxTJrSxNDsCswV/b9yFO2UTCZ6fQ3pobdXc y0hApLdHFKs0kudS1kx6TVZgxC5de6VD+8CPod5rwLbKiPlQWdNwbChVgvOaAPoDQ1mt xqZ0UZe2CPaJzR1Yf4H45gM2eP9MN5tekCfZkUfaI9f9K547vnuENhX0lf54usuPXAB2 2FDPBZOj7UeOfIFs7oDt8EyTrk/SMCH/LuTc9t6RPV+YGUWrnmzFBVLuUQBTPoCseN+0 kuSdt6SCknJo7gE03j8orw0a+66FDKmVZivthdyEdAQndX9z0iVBG+lYoys8wHcjDRpk gZVg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding: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=WXGheIvd/NdQfjBCZlBYRtT/mpWewos+Yyh22aDyDsE=; b=KD2+ehKoQb+GiA+jdAvDoW+WKD8D1M4PzVumki8PG473z3Xi/PQ6zt8zeLXvi+OS/j NvCXabQMDpLw6rTjzb/0UCWkSJ/pyeTdj1swSGnPIclkE6A0NV6mAf7tb5j0+4gFdRMq d50Aj3/eDTc2W0oNBrcoZiD9Z5Y7HDpQB6PpbUC0ugvIZpm4aKlk9LKJfRLI6wKGPcDW ipZJwL/VvtDQWDtPdzKclJmo2B25s2JBV6Wgi66w+XXEb5ljpr+qT2HZSeFlWBBI/nGS cunqeeDDIiSqJlChIAJFNHCVJiU6gbil4hD1Tb4toGQgCeQ5xtOUN+iIOZ7vvuS3D1NS GFFw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@rcombs.me header.s=google header.b=J2Ix78n2; 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=QUARANTINE sp=QUARANTINE dis=NONE) header.from=rcombs.me Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id cr1si3269310ejc.534.2021.12.23.19.10.47; Thu, 23 Dec 2021 19:10:47 -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=@rcombs.me header.s=google header.b=J2Ix78n2; 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=QUARANTINE sp=QUARANTINE dis=NONE) header.from=rcombs.me Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 01EA168B22F; Fri, 24 Dec 2021 05:09:32 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qv1-f46.google.com (mail-qv1-f46.google.com [209.85.219.46]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id C3BED68B1FA for ; Fri, 24 Dec 2021 05:09:25 +0200 (EET) Received: by mail-qv1-f46.google.com with SMTP id kc16so6807631qvb.3 for ; Thu, 23 Dec 2021 19:09:25 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rcombs.me; s=google; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=TsA1yHdbiURyPXJAkpxs7dCHo/yQXZYKYHQjmvfB0s4=; b=J2Ix78n2Fi50bN5ld53MhHOrMrRzqK4niWAfCEXYJKZgojh/cK+UGWNvOIjg3IHnHh jxvoXq2A9HK2j0+MTPm/xPJgzfXuhQsPt4bq5cHu21L8nK8u0HTbE0j7QdFIieqn8rAs oeMpWtBLCgQZPh70it55NHgTpltsCh0NXoLrcuprg9wuxB8X25dzTQmzSXxHa5I3TSvI R/Prnl/97ZrFDCoUj7PYl2qJNxqdO+fu7b1TzBFvwR7M8wBo75D7M7h9cN8x6AaHF2HQ seNm5jvVeNPSwoikZ6EcmjFuQ0bcM6PJi7mKXs82iXAehrwFvpH/G0rNrazUEzUsjXV4 zktA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=TsA1yHdbiURyPXJAkpxs7dCHo/yQXZYKYHQjmvfB0s4=; b=gwJuOoVs0vDxWYo9S8f8wmQ4ef0i07zrN7Jb4FiG+igDybkz9MunKStiCM0ABeP2/2 Rv20mpaXfkA70LekbhX85qFr0Yx7CJEPOH9RMN6V0U7rtMcp0M97APwFE/qXNORxO0CZ pw114jvyocjNryXhAqOgVYpkKmhTQShFVjeTw3mGjX9HZUmGB/wCqOrbLbNTVflsaxQf 44jCcuYijxyl3YKw/ccjfMq3jN9KKW4QLyiS+v3BcEAnTAQ+9gR7akDH2RLTbWwdb7nh WMFFCaVLPRG2vQJO0l6ARR8DutpH58L/unMlKIIF+Z1LqbqaqG2MPkt6pdnv73uCMt7A 2QJA== X-Gm-Message-State: AOAM532mkL2CjVCO+99DV+gXoOwaoxnowAR3iSDUZqUhv1qYkjJ1ouBq 7gVZ0B1wwz2acUojb5Q8bzpeI5qGrcIs708= X-Received: by 2002:ad4:5cef:: with SMTP id iv15mr4159009qvb.82.1640315364018; Thu, 23 Dec 2021 19:09:24 -0800 (PST) Received: from rcombs-mbp.localdomain ([2601:243:2000:5ac:cd8d:58a:de7b:88f1]) by smtp.gmail.com with ESMTPSA id e15sm5162479qtq.83.2021.12.23.19.09.23 for (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Thu, 23 Dec 2021 19:09:23 -0800 (PST) From: rcombs To: ffmpeg-devel@ffmpeg.org Date: Thu, 23 Dec 2021 21:08:59 -0600 Message-Id: <20211224030904.1196-12-rcombs@rcombs.me> X-Mailer: git-send-email 2.33.1 In-Reply-To: <20211224030904.1196-1-rcombs@rcombs.me> References: <20211224030904.1196-1-rcombs@rcombs.me> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 11/16] lavfi/drawutils: reimplement ff_fill_rgba_map without hardcoding the list 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: uyg8R0V1mPX5 Same outputs, but computed instead of statically known, so new formats will be supported more easily. Asserts in place to ensure we update this if we add anything incompatible with its logic. --- libavfilter/drawutils.c | 81 ++++++++++++++++++++--------------------- 1 file changed, 39 insertions(+), 42 deletions(-) diff --git a/libavfilter/drawutils.c b/libavfilter/drawutils.c index 0965afb03e..e4d6ddcf4c 100644 --- a/libavfilter/drawutils.c +++ b/libavfilter/drawutils.c @@ -21,6 +21,7 @@ #include +#include "libavutil/avassert.h" #include "libavutil/avutil.h" #include "libavutil/colorspace.h" #include "libavutil/intreadwrite.h" @@ -32,50 +33,46 @@ enum { RED = 0, GREEN, BLUE, ALPHA }; int ff_fill_rgba_map(uint8_t *rgba_map, enum AVPixelFormat pix_fmt) { - switch (pix_fmt) { - case AV_PIX_FMT_0RGB: - case AV_PIX_FMT_ARGB: rgba_map[ALPHA] = 0; rgba_map[RED ] = 1; rgba_map[GREEN] = 2; rgba_map[BLUE ] = 3; break; - case AV_PIX_FMT_0BGR: - case AV_PIX_FMT_ABGR: rgba_map[ALPHA] = 0; rgba_map[BLUE ] = 1; rgba_map[GREEN] = 2; rgba_map[RED ] = 3; break; - case AV_PIX_FMT_RGB48LE: - case AV_PIX_FMT_RGB48BE: - case AV_PIX_FMT_RGBA64BE: - case AV_PIX_FMT_RGBA64LE: - case AV_PIX_FMT_RGB0: - case AV_PIX_FMT_RGBA: - case AV_PIX_FMT_RGB24: rgba_map[RED ] = 0; rgba_map[GREEN] = 1; rgba_map[BLUE ] = 2; rgba_map[ALPHA] = 3; break; - case AV_PIX_FMT_BGR48LE: - case AV_PIX_FMT_BGR48BE: - case AV_PIX_FMT_BGRA64BE: - case AV_PIX_FMT_BGRA64LE: - case AV_PIX_FMT_BGRA: - case AV_PIX_FMT_BGR0: - case AV_PIX_FMT_BGR24: rgba_map[BLUE ] = 0; rgba_map[GREEN] = 1; rgba_map[RED ] = 2; rgba_map[ALPHA] = 3; break; - case AV_PIX_FMT_GBRP9LE: - case AV_PIX_FMT_GBRP9BE: - case AV_PIX_FMT_GBRP10LE: - case AV_PIX_FMT_GBRP10BE: - case AV_PIX_FMT_GBRP12LE: - case AV_PIX_FMT_GBRP12BE: - case AV_PIX_FMT_GBRP14LE: - case AV_PIX_FMT_GBRP14BE: - case AV_PIX_FMT_GBRP16LE: - case AV_PIX_FMT_GBRP16BE: - case AV_PIX_FMT_GBRAP: - case AV_PIX_FMT_GBRAP10LE: - case AV_PIX_FMT_GBRAP10BE: - case AV_PIX_FMT_GBRAP12LE: - case AV_PIX_FMT_GBRAP12BE: - case AV_PIX_FMT_GBRAP16LE: - case AV_PIX_FMT_GBRAP16BE: - case AV_PIX_FMT_GBRPF32LE: - case AV_PIX_FMT_GBRPF32BE: - case AV_PIX_FMT_GBRAPF32LE: - case AV_PIX_FMT_GBRAPF32BE: - case AV_PIX_FMT_GBRP: rgba_map[GREEN] = 0; rgba_map[BLUE ] = 1; rgba_map[RED ] = 2; rgba_map[ALPHA] = 3; break; - default: /* unsupported */ + const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt); + if (!(desc->flags & AV_PIX_FMT_FLAG_RGB)) return AVERROR(EINVAL); + if (desc->flags & AV_PIX_FMT_FLAG_BITSTREAM) + return AVERROR(EINVAL); + av_assert0(desc->nb_components == 3 + !!(desc->flags & AV_PIX_FMT_FLAG_ALPHA)); + if (desc->flags & AV_PIX_FMT_FLAG_PLANAR) { + rgba_map[RED] = desc->comp[0].plane; + rgba_map[GREEN] = desc->comp[1].plane; + rgba_map[BLUE] = desc->comp[2].plane; + rgba_map[ALPHA] = (desc->flags & AV_PIX_FMT_FLAG_ALPHA) ? desc->comp[3].plane : 3; + } else { + int had0 = 0; + unsigned depthb = 0; + unsigned i; + for (i = 0; i < desc->nb_components; i++) { + /* all components must have same depth in bytes */ + unsigned db = (desc->comp[i].depth + 7) / 8; + unsigned pos = desc->comp[i].offset / db; + if (depthb && (depthb != db)) + return AVERROR(ENOSYS); + + if (desc->comp[i].offset % db) + return AVERROR(ENOSYS); + + had0 |= pos == 0; + rgba_map[i] = pos; + } + + if (desc->nb_components == 3) + rgba_map[ALPHA] = had0 ? 3 : 0; } + + av_assert0(rgba_map[RED] != rgba_map[GREEN]); + av_assert0(rgba_map[GREEN] != rgba_map[BLUE]); + av_assert0(rgba_map[BLUE] != rgba_map[RED]); + av_assert0(rgba_map[RED] != rgba_map[ALPHA]); + av_assert0(rgba_map[GREEN] != rgba_map[ALPHA]); + av_assert0(rgba_map[BLUE] != rgba_map[ALPHA]); + return 0; }