From patchwork Mon Jan 29 05:51:20 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marth64 X-Patchwork-Id: 45878 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a21:8786:b0:199:de12:6fa6 with SMTP id ph6csp1338198pzb; Sun, 28 Jan 2024 21:52:08 -0800 (PST) X-Google-Smtp-Source: AGHT+IGVzoJkKKigrFKxWEB2HHdKMlNmTCOXML0UiQ/iRO9QDZC8nNZ/SkfSK5H0prNB206YxKT/ X-Received: by 2002:a17:906:6a02:b0:a31:234e:6a9c with SMTP id qw2-20020a1709066a0200b00a31234e6a9cmr4478432ejc.5.1706507528350; Sun, 28 Jan 2024 21:52:08 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1706507528; cv=none; d=google.com; s=arc-20160816; b=Dbk9cHpo/Ge3vi+PWnWXnGYPbwC1X+r5y0tnMTz8AG/TYTVShAluiyFpdEzEORyUzk xD9U6VJ3OLCUeVil7iOsLwqJptGLu+6hBlxnZeXvHIIp49yGVjw9iz86VQH0W0Oh5OIT Bi6WY9S44o0LhTgjnpw6Rmc5vHJ6IoFGvmjtfzl9DS/hSZ6YwEJiwHzfwnEpnDOFkCgw SVJj+ggUYgK5tLJDuvC9b9kYRLj4yuYdMRfnYfHgqfXRyG/MNcHmcVcsMADBzSwyGkfU 1aDG132BJqJh5H6fM6zT5wATQC1Tk8saPdlDFwLmLRsJy2BOYSnLtw6NowSQqz/BeNks +FGA== 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=ThJu7oEB24bQYRFNO+gJ6NyyLIlhaUSadepJqo7qFXg=; fh=PlWMzmI9LD2qGS7ipLrQl8z0iaQTLQLHzoGuXcBzpCg=; b=1CLy5iIlqzrEYq+uGGxo9HBDXu2zHaMguOnCJr5jtpbwIiylYimIXvSfkKIbkbGBDl XK/HqnMtJvtxT4NdA+u32TswsbeGFAdoM5Nvo9QOPGC7AZUqMw5bMzVOUYv+L1z5OFmh tpKt1UQ4wIAzs9HCHaBqeeXZ+WAVkV7FmuneDhqa5kLMceSoVyzIoEyBTFVZW/TY+zEE /C6Unc4/sTBPJNJNTzJgkDiXLwRl+RHCl5+XSzX3ko97ruoKXHVFo8/M4Q+6OBcVIb5g PAwepw5O3BIfE0f1LB7+g8pr5F6thn1FdkuGPyxmpZL5z/AfqcdLJ+4ahhxy23EW1iwB CumA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@proxyid.net header.s=google header.b=iuUSbIy+; 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 f22-20020a17090631d600b00a35ddf3a7c5si156427ejf.951.2024.01.28.21.52.07; Sun, 28 Jan 2024 21:52:08 -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=@proxyid.net header.s=google header.b=iuUSbIy+; 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 795A868D1D8; Mon, 29 Jan 2024 07:52:04 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-io1-f100.google.com (mail-io1-f100.google.com [209.85.166.100]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id EFB076807D3 for ; Mon, 29 Jan 2024 07:51:57 +0200 (EET) Received: by mail-io1-f100.google.com with SMTP id ca18e2360f4ac-7bed9f5d35dso101774639f.3 for ; Sun, 28 Jan 2024 21:51:57 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=proxyid.net; s=google; t=1706507516; x=1707112316; 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=stbIyTTn2YWkdFp94px3vSVM5GmUuPVHon0SEnUr5/c=; b=iuUSbIy+Ycd7NuZCxy3CGtjo8261BrpjZOx4wPTQHShWpSnNIJWdX4nBzr05K/jbqY AZSdjEAwuXxnrPk0xkFLtniAc/2WlWMQg3CpAbU6jKvIsIcD92R/4pxEljqidECYwbiq vEanLFsa6aajMq/EtvgfNAMlCAVF9kT7A/tba/hFawc2sS8URlCct7Kc1b+QQ57rZD2N OcbR2xluB1+/V5bNE86kjo4fQP305Cd78L0WRT0LnLKZyGNUgMcv7sC6Sh/jzPkaz3ih Sd/pNVPWNfe9hmCfztWe8tPj6ONmxDU7Z/FVAJOzXLya5RQ8smi5slbcURqkJj2pQiRk NK/Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1706507516; x=1707112316; 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=stbIyTTn2YWkdFp94px3vSVM5GmUuPVHon0SEnUr5/c=; b=QDw4rwO0Ye15No9xLT9MTE/I2RKSREhNspUmVRml3XROBvycWtpZ1N65LYXPakhQM/ JC7x+Uyda8WafQIPof/gNGNfAlhuJ+dgiCzu2j0OxP8dHQQxAjmKmQcAXP6YqGFCJvv2 /91Dqk5v2cSxDicyV3FrWtpnNMaThadl1q40f9Sv4XkRjd2PIoc2b1Ut70alW9vxG014 OLnZ9n6lI8ZtWDq6JVnx1UiPcMN5ciBDG3TN1SXUzaz7oM596jtD1YYgUKBrfQB/hrq+ gCS4T3mVglzaUrlaOcdRla2s0J+z0iPD2FHNRjw801mTQyBBCeOaM9HjHZsqJgp8QB1w cMLg== X-Gm-Message-State: AOJu0Yw/vusvXaLx6+lXLbO1QbnxhihaPd+k6KqL+C8/jvHRwRuv4C9Y R2rNjfNFrqn2ScyXZavYSq5zmH/mApthALLPPBlzWxNlZtf2vObyl+5Kud+A99YS/d7hItrGuaM xaJTIb/4BiP+jDk/JjpvZJjwuaOHT7g+TQgj4oO0B X-Received: by 2002:a5e:8a41:0:b0:7bf:e80a:d76f with SMTP id o1-20020a5e8a41000000b007bfe80ad76fmr3572344iom.0.1706507516359; Sun, 28 Jan 2024 21:51:56 -0800 (PST) Received: from wsx-cc1-001.. (c-76-141-0-17.hsd1.il.comcast.net. [76.141.0.17]) by smtp-relay.gmail.com with ESMTPS id f1-20020a056638168100b00470ab07292asm101471jat.19.2024.01.28.21.51.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 28 Jan 2024 21:51:56 -0800 (PST) X-Relaying-Domain: proxyid.net From: Marth64 To: ffmpeg-devel@ffmpeg.org Date: Sun, 28 Jan 2024 23:51:20 -0600 Message-Id: <20240129055119.432310-1-marth64@proxyid.net> X-Mailer: git-send-email 2.34.1 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] libavformat: add DVD subtitle palette (CLUT) utilities 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: Marth64 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: 6ziHZ2AI/zdk DVD subtitle palettes, which are natively YUV, are currently carried as a hex string in their respective subtitle streams and have no concept of colorspace tagging. In fact, the convention is to convert them to RGB prior to storage. Common players will only render the palettes properly if they are stored as RGB. Even ffmpeg itself expects this, and already does -in libavformat- the YUV-RGB conversions, specifically in mov.c and movenc.c. The point of this patch is to provide a consolidation of the code that deals with creating the extradata as well as the RGB conversion. That can then (1) enable usable palette support for DVD demuxer if it is merged and (2) start the process of consolidating the related conversions in MOV muxer/demuxer and eventually find a way to properly tag the colorspace. Signed-off-by: Marth64 --- libavformat/dvdclut.c | 104 ++++++++++++++++++++++++++++++++++++++++++ libavformat/dvdclut.h | 37 +++++++++++++++ 2 files changed, 141 insertions(+) create mode 100644 libavformat/dvdclut.c create mode 100644 libavformat/dvdclut.h diff --git a/libavformat/dvdclut.c b/libavformat/dvdclut.c new file mode 100644 index 0000000000..71fdda7925 --- /dev/null +++ b/libavformat/dvdclut.c @@ -0,0 +1,104 @@ +/* + * DVD-Video subpicture CLUT (Color Lookup Table) utilities + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "libavutil/bprint.h" +#include "libavutil/colorspace.h" +#include "libavutil/intreadwrite.h" + +#include "avformat.h" +#include "dvdclut.h" +#include "internal.h" + +/* crop table for YUV to RGB subpicture palette conversion */ +#define FF_DVDCLUT_YUV_NEG_CROP_MAX 1024 +#define times4(x) x, x, x, x +#define times256(x) times4(times4(times4(times4(times4(x))))) + +const uint8_t ff_dvdclut_yuv_crop_tab[256 + 2 * FF_DVDCLUT_YUV_NEG_CROP_MAX] = { +times256(0x00), +0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F, +0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F, +0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F, +0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, +0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F, +0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F, +0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F, +0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F, +0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, +0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, +0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, +0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, +0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, +0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, +0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, +0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF, +times256(0xFF) +}; + +int ff_dvdclut_palette_extradata_cat(const uint32_t *clut, + const size_t clut_size, + AVCodecParameters *par) +{ + int ret = 0; + AVBPrint bp; + + if (clut_size != FF_DVDCLUT_CLUT_SIZE) + return AVERROR(EINVAL); + + av_bprint_init(&bp, 0, FF_DVDCLUT_EXTRADATA_SIZE); + + av_bprintf(&bp, "palette: "); + + for (int i = 0; i < FF_DVDCLUT_CLUT_LEN; i++) + av_bprintf(&bp, "%06"PRIx32"%s", clut[i], i != 15 ? ", " : ""); + + av_bprintf(&bp, "\n"); + + ret = ff_bprint_to_codecpar_extradata(par, &bp); + + av_bprint_finalize(&bp, NULL); + + return ret; +} + +int ff_dvdclut_yuv_to_rgb(uint32_t *clut, const size_t clut_size) +{ + const uint8_t *cm = ff_dvdclut_yuv_crop_tab + FF_DVDCLUT_YUV_NEG_CROP_MAX; + + int i, y, cb, cr; + uint8_t r, g, b; + int r_add, g_add, b_add; + + if (clut_size != FF_DVDCLUT_CLUT_SIZE) + return AVERROR(EINVAL); + + for (i = 0; i < FF_DVDCLUT_CLUT_LEN; i++) { + y = (clut[i] >> 16) & 0xFF; + cr = (clut[i] >> 8) & 0xFF; + cb = clut[i] & 0xFF; + + YUV_TO_RGB1_CCIR(cb, cr); + YUV_TO_RGB2_CCIR(r, g, b, y); + + clut[i] = (r << 16) | (g << 8) | b; + } + + return 0; +} diff --git a/libavformat/dvdclut.h b/libavformat/dvdclut.h new file mode 100644 index 0000000000..40eff6de34 --- /dev/null +++ b/libavformat/dvdclut.h @@ -0,0 +1,37 @@ +/* + * DVD-Video subpicture CLUT (Color Lookup Table) utilities + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVFORMAT_DVDCLUT_H +#define AVFORMAT_DVDCLUT_H + +#include "avformat.h" + +/* ("palette: ") + ("rrggbb, "*15) + ("rrggbb") + \n + \0 */ +#define FF_DVDCLUT_EXTRADATA_SIZE (9 + (8 * 15) + 6 + 1 + 1) +#define FF_DVDCLUT_CLUT_LEN 16 +#define FF_DVDCLUT_CLUT_SIZE FF_DVDCLUT_CLUT_LEN * sizeof(uint32_t) + +int ff_dvdclut_palette_extradata_cat(const uint32_t *clut, + const size_t clut_size, + AVCodecParameters *par); + +int ff_dvdclut_yuv_to_rgb(uint32_t *clut, const size_t clut_size); + +#endif /* AVFORMAT_DVDCLUT_H */