From patchwork Tue Feb 6 06:48:19 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marth64 X-Patchwork-Id: 46067 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:7b08:b0:19e:8a94:b663 with SMTP id s8csp1221751pzh; Mon, 5 Feb 2024 22:49:17 -0800 (PST) X-Google-Smtp-Source: AGHT+IGdKmYRR7LVzxDlhbBO7HpnEGDYQ1/Ey+K+lK0aExACmRL+CrF1+xBJVvvCV2J24sV6Esio X-Received: by 2002:a17:907:77d1:b0:a38:1de2:97e8 with SMTP id kz17-20020a17090777d100b00a381de297e8mr900263ejc.34.1707202157541; Mon, 05 Feb 2024 22:49:17 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1707202157; cv=none; d=google.com; s=arc-20160816; b=j1wYBSGqCkI1lO8UCHelp6oY8rrg2yGedTh0PcN7XAGksQEm9vcGUvQveYC/lXXlmO aZQ4YC0jdKKWuVU9PhQb717Bq2RXwbz/aZc74aCb8ktAAGy5q7pHXKRI56obC+X1fOTt sVuWr7+Pu4i7R5tuX47JqWVMQUy1GeHaqysRYH2F9jX0AwlyLgWwzumsS1Va+6vbkOND aWhkgl1vTTM8DoM91NpeVDHwFdTunsC/CK5iQ0KbD+oIFgB0GjH883sjNT+aM7Ks8Y3f eXGpFTlbNHZ3gxUqUdxjiz7nXQ+XyeBdk588wiVpMcjqw1cVwWhgrJtN8jPw9w3niNSw 0QWw== 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:dkim-signature:delivered-to; bh=VPbxA1FZ+ZEhPo7RLxkpPSi7L0XavDxCqoYpEJRaFIw=; fh=SItON1iFvD2WZWfUWYYJmSZ4hm7At4bnj/cmf2LCLPQ=; b=FVN5nGfu2zEKUhhVwgA8aIsDlG73CMLk35jZ34MZjYiRMnxOclgqcRNX3VRRcl+/Ee 79RXl1M/fCyZICVWyQioMdsP9TfNSqMFojtLE3sRRiuj+H0cDVtl/g55Ymlh4mJRx6Ks O8p9oivzTOrdPYWARuQ37Er7lgidgc6TAqOGVyypX4GHG2bK05/vL4bwSlAbfEhpKIZz M4LD2EeA8MWdfbCDb7OaDpg0UBRRcGRpxgLMwCeg1zMizbk8V6XcD1XB8/cD0vX1E7V6 UU+PoGbqzRj8z9fWnp/cLutOsRlkdjUaQHoFi12KU5Bp19SiKy6owTN1vnD1qo+gLFUL tu3Q==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@proxyid.net header.s=google header.b=PMaUlzXL; 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 X-Forwarded-Encrypted: i=0; AJvYcCX6sTkCk3tQEs1m4VbTIpewBrG8Slfp6QF2ZH8gSlJz394+f2Ey/+lWDJK/aSX/WJ5kdVCtBL/a+3qVfxCgr1LvRDjyMQdXNZMmM3g/7OCHV6Wgk4pm6cJHBgqh3WWS2v50bO73oADzJaPttosHIvvTBAOmA2wTJBxcvuceIlxNKPjxD7wxXEoabOJV9IpWtBAY75VNy0+EzVsC3axUy6Xj3Vi6eMK/XyrWjYc7Mfo2CIb6J/WRz7E0Sso8p29UPXbDUHzOaO+ZbIshpGhNP97fp8Qxn1pDsfcp3NcLs3i4dWlAJTLjyAATGcINtDbmFvUMGAtcBMVWLOYK8tJcijLiGeTY2YHRGvT08FKWzjL1o/aiu17xoauXa7dlJhwXcFWryX5jpZaXnf5Qc6dZ1OWM+TfdF1TD7TR2wGlEIkOBus6O/5/WLxhX7EC5j3kF7bM/Dg0UiD7gYcthbEh0PU3Ti8NFfN0IQOact7MnOq44phQ4fZ6cr4w8qfsK6Vg46Ytra2KD/TlUI4Jen58uqsLpDVICcINuyxnfacpIlAZVWneV3PLT0T+qsUEcckimrMNiwDeVCFvYkIb8vKeSJM4S8ZaZKtnlvnZ/jy1wgBvINZfr1WFJaNFbTl/vNDYjEhO8Y5rC5GSNOct1o2BP689hKbnLBtAKa8cVEc0mwUWfMto4CuIMwy2tc4YMM03z26hmb4N7zrAcL2rQBp0pXTVRfkt/Evp0bQhK3TsgIzdNgsL/JIBK/aktKGFIp+Cr0WoateuiENjKjd96i6A5shNEdwVcV7GunVZchCUOJAXjE4llpHNvN40piIZbShgDo/QSsJJeU4bj0UF4k65rdIiBnlZZyJ7ak61bh7D8GaRfCOEoz3/irtZkEh1SFukpfIJ4bXeKOxyyuR7WjcndG6cTc7LaJehZYGV0HY1BM3Fwl+DJY75kaeWWlEd0PyqxWfJJ+B ujmizzH48pu8NriRgwrjVw6pJblouDpvFHh0JLbkL8WqzcaYc4y2KTt6ZogtyR0mx3JNYoQ46ZMrbPnm5qkDkNhBuBw5jyoV6eWAXw+4xALed3XCbfuiqtPAL5f0ay6uEvqgs+f5hCfVSPqdCzWI0O/CNMJ8lB7PNkXFng3dZQ48gp/n1fZCuMeI3GqeCvMlL9dnpuk9xOdUpJFadz6gLNC/j6MbWPFxiQ4VZt+eT50UUrCIe7gBx29c85Wy/1zyKxH1d4MfZ3UeKtk2VSrXoUF6lzDVdwm2Zrk16FpENBIC1PrWW37uBAEK/nCdIlo0xz8Zuk/qc1ocRyNyeiv4NmHv0bcbfzQPTU9AONUpqVULdnFxNKU/zbVQIWX2XkrXrwnLMCj0WHPBbeOIUt8KtANL96ZXEwXnnPb3etvoXT5iw1CRYWKIidVf0JKbqYLApfqyAipJZi29mDBaXzBtCoLCwt2SAd19wNM+C4GjtUEn8jhc8u1X3A4M9y7KQz1xQKEm1n4typfxEYbkCrg06mmqzm5eBOSteVPCXNjToTJIPNudiESacps6nffed8tKaT0iE2AQumkRxViuKLNB7ulTxiPaYi5qqRg7ZSh4lwRXW8dblD1ZbTMeYrI9fSZjF1 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id x10-20020a170906134a00b00a359e081020si750343ejb.181.2024.02.05.22.49.17; Mon, 05 Feb 2024 22:49:17 -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=PMaUlzXL; 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 88D2668AD09; Tue, 6 Feb 2024 08:49:05 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pf1-f228.google.com (mail-pf1-f228.google.com [209.85.210.228]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id CA3F168C9F6 for ; Tue, 6 Feb 2024 08:48:58 +0200 (EET) Received: by mail-pf1-f228.google.com with SMTP id d2e1a72fcca58-6e04c4f494cso909611b3a.2 for ; Mon, 05 Feb 2024 22:48:58 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=proxyid.net; s=google; t=1707202136; x=1707806936; darn=ffmpeg.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=75HJSTM0HWWUa/YhPM9YhdWYGOA4UfWqlx5JerhaM/c=; b=PMaUlzXLPuFMuC3w6TW4XIVVetxxZY3w2mH6x5gf7orNPmZBYqTcw8I0nPwEIOkClW lDqIaggtWjiEJNprQc9fWndO4ia4bjQ9bx4XXBsqSThl0fTcjPVq7sTw2VquJW/y7LdH t2RaaCPEQ9w9nnAVSylkVnR4fC7PUPDgCIUtyZIkTwPYKYcLSW1/7ofqnLH4PG+3N2yb 19ocufkyBd5y6wle9krPbdjUZWIpec8ABUVFf08WLsD9afGrlmdZORyf3yTGRHBzyH8N pIqkOV3PhwzaL5E894LgZCVY1JFM4LnD6RuLqFCxFxjSzHEC/n35Py2VJGrhvCs/CzDz /MHA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1707202136; x=1707806936; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=75HJSTM0HWWUa/YhPM9YhdWYGOA4UfWqlx5JerhaM/c=; b=fk2eXPDOf9PNX7WvYHgEmlcm3W+P47F+B5ODg2HKG321Mp6SoumKAq9DGAAiYOpzzT aRWPmxZo5K3vH23YlmABay5lkN3ctB3JqPsY7RXjjRja38YeZi2NUNhncRwxyiCWWNNn Nhcslins+r99o591j7EJSQg5lTbHvYuyvm6bry0YKDd7T3xVvnnaJ3xh6n1n1AM+E3Aj KY2gNebJjrd3qse0wYuXRbhF3sOlFDlrCDOlrqtZ7uZfn0KB025suD546+SoWXQPPLMe JDmPS4fauhJnJ3wxQ2SryXXC5wR5EMiz/t6/SjwJnBkKSRWraNxRyeF8XjGA6PMHKNEo piQA== X-Gm-Message-State: AOJu0Yy5G6xGSA/56TwXOB9/SujMPH+u2BX+3lf3M4LTJwUo8BJsb2A7 +nAbS7hmoWaoY/ndwKtCmK6uw+gVwlD2Dj08enWKaG0veDNLTcEh+p8jTBzq8uTh2WwIDXQmsc7 Fn7f9EKFRL8GAW+YuSMBDLh1N4jubnBbX7++QOzFY X-Received: by 2002:a05:6a20:8e1b:b0:19e:972b:3e8d with SMTP id y27-20020a056a208e1b00b0019e972b3e8dmr902328pzj.28.1707202136662; Mon, 05 Feb 2024 22:48:56 -0800 (PST) Received: from wsx-cc1-001.. (c-76-141-249-38.hsd1.il.comcast.net. [76.141.249.38]) by smtp-relay.gmail.com with ESMTPS id i8-20020a17090a974800b002961301cc30sm31857pjw.0.2024.02.05.22.48.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 05 Feb 2024 22:48:56 -0800 (PST) X-Relaying-Domain: proxyid.net From: Marth64 To: ffmpeg-devel@ffmpeg.org Date: Tue, 6 Feb 2024 00:48:19 -0600 Message-Id: <20240206064818.1356723-2-marth64@proxyid.net> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240206064818.1356723-1-marth64@proxyid.net> References: <20240206064818.1356723-1-marth64@proxyid.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v8 2/2] libavformat/dvdvideo: add DVD CLUT utilities and enable palette support 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: pR7YbWnghDbf 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 --- doc/demuxers.texi | 5 ++ libavformat/Makefile | 2 +- libavformat/dvdclut.c | 104 ++++++++++++++++++++++++++++++++++++++ libavformat/dvdclut.h | 37 ++++++++++++++ libavformat/dvdvideodec.c | 16 ++++++ 5 files changed, 163 insertions(+), 1 deletion(-) create mode 100644 libavformat/dvdclut.c create mode 100644 libavformat/dvdclut.h diff --git a/doc/demuxers.texi b/doc/demuxers.texi index ad0906f6ec..9c666a29c1 100644 --- a/doc/demuxers.texi +++ b/doc/demuxers.texi @@ -390,6 +390,11 @@ often with junk data intended for controlling a real DVD player's buffering speed and with no other material data value. Default is 1, true. +@item clut_rgb +Output subtitle palettes (CLUTs) as RGB, required for Matroska and MP4. +Disable to output the palette in its original YUV colorspace. +Default is 1, true. + @end table @subsection Examples diff --git a/libavformat/Makefile b/libavformat/Makefile index df69734877..8f17e43e49 100644 --- a/libavformat/Makefile +++ b/libavformat/Makefile @@ -192,7 +192,7 @@ OBJS-$(CONFIG_DTS_MUXER) += rawenc.o OBJS-$(CONFIG_DV_MUXER) += dvenc.o OBJS-$(CONFIG_DVBSUB_DEMUXER) += dvbsub.o rawdec.o OBJS-$(CONFIG_DVBTXT_DEMUXER) += dvbtxt.o rawdec.o -OBJS-$(CONFIG_DVDVIDEO_DEMUXER) += dvdvideodec.o +OBJS-$(CONFIG_DVDVIDEO_DEMUXER) += dvdvideodec.o dvdclut.o OBJS-$(CONFIG_DXA_DEMUXER) += dxa.o OBJS-$(CONFIG_EA_CDATA_DEMUXER) += eacdata.o OBJS-$(CONFIG_EA_DEMUXER) += electronicarts.o 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 */ diff --git a/libavformat/dvdvideodec.c b/libavformat/dvdvideodec.c index 8796a24b24..d01416a37e 100644 --- a/libavformat/dvdvideodec.c +++ b/libavformat/dvdvideodec.c @@ -50,6 +50,7 @@ #include "avio_internal.h" #include "avlanguage.h" #include "demux.h" +#include "dvdclut.h" #include "internal.h" #include "url.h" @@ -91,6 +92,7 @@ typedef struct DVDVideoPGCAudioStreamEntry { typedef struct DVDVideoPGCSubtitleStreamEntry { int startcode; + uint32_t *clut; int disposition; char *lang_iso; enum DVDVideoSubpictureViewport viewport; @@ -126,6 +128,7 @@ typedef struct DVDVideoDemuxContext { int opt_angle; /* the user-provided angle number (1-indexed) */ int opt_chapter_end; /* the user-provided exit PTT (0 for last) */ int opt_chapter_start; /* the user-provided entry PTT (1-indexed) */ + int opt_clut_rgb; /* output subtitle palette (CLUT) as RGB */ int opt_pg; /* the user-provided PG number (1-indexed) */ int opt_pgc; /* the user-provided PGC number (1-indexed) */ int opt_preindex; /* pre-indexing mode (2-pass read) */ @@ -1041,6 +1044,8 @@ break_free_and_error: static int dvdvideo_subp_stream_analyze(AVFormatContext *s, uint32_t offset, subp_attr_t subp_attr, DVDVideoPGCSubtitleStreamEntry *entry) { + DVDVideoDemuxContext *c = s->priv_data; + char lang_dvd[3] = {0}; entry->startcode = 0x20 + (offset & 0x1F); @@ -1048,6 +1053,11 @@ static int dvdvideo_subp_stream_analyze(AVFormatContext *s, uint32_t offset, sub if (subp_attr.lang_extension == 9) entry->disposition |= AV_DISPOSITION_FORCED; + memcpy(entry->clut, c->play_state.pgc->palette, FF_DVDCLUT_CLUT_SIZE); + + if (c->opt_clut_rgb) + ff_dvdclut_yuv_to_rgb(entry->clut, FF_DVDCLUT_CLUT_SIZE); + AV_WB16(lang_dvd, subp_attr.lang_code); entry->lang_iso = (char *) ff_convert_lang_to(lang_dvd, AV_LANG_ISO639_2_BIBL); @@ -1069,6 +1079,9 @@ static int dvdvideo_subp_stream_add(AVFormatContext *s, DVDVideoPGCSubtitleStrea st->codecpar->codec_type = AVMEDIA_TYPE_SUBTITLE; st->codecpar->codec_id = AV_CODEC_ID_DVD_SUBTITLE; + if ((ret = ff_dvdclut_palette_extradata_cat(entry->clut, FF_DVDCLUT_CLUT_SIZE, st->codecpar)) < 0) + return ret; + if (entry->lang_iso) av_dict_set(&st->metadata, "language", entry->lang_iso, 0); @@ -1096,6 +1109,7 @@ static int dvdvideo_subp_stream_add_internal(AVFormatContext *s, uint32_t offset int ret = 0; entry = av_mallocz(sizeof(DVDVideoPGCSubtitleStreamEntry)); + entry->clut = av_mallocz(FF_DVDCLUT_CLUT_SIZE); entry->viewport = viewport; if ((ret = dvdvideo_subp_stream_analyze(s, offset, subp_attr, entry)) < 0) @@ -1116,6 +1130,7 @@ end_free_error: av_log(s, AV_LOG_ERROR, "Unable to allocate subtitle stream\n"); end_free: + av_freep(&entry->clut); av_freep(&entry); return ret; @@ -1395,6 +1410,7 @@ static const AVOption dvdvideo_options[] = { {"angle", "playback angle number", OFFSET(opt_angle), AV_OPT_TYPE_INT, { .i64=1 }, 1, 9, AV_OPT_FLAG_DECODING_PARAM }, {"chapter_end", "exit chapter (PTT) number (0=end)", OFFSET(opt_chapter_end), AV_OPT_TYPE_INT, { .i64=0 }, 0, 99, AV_OPT_FLAG_DECODING_PARAM }, {"chapter_start", "entry chapter (PTT) number", OFFSET(opt_chapter_start), AV_OPT_TYPE_INT, { .i64=1 }, 1, 99, AV_OPT_FLAG_DECODING_PARAM }, + {"clut_rgb", "output subtitle palette (CLUT) as RGB", OFFSET(opt_clut_rgb), AV_OPT_TYPE_BOOL, { .i64=1 }, 0, 1, AV_OPT_FLAG_DECODING_PARAM }, {"pg", "entry PG number (0=auto)", OFFSET(opt_pg), AV_OPT_TYPE_INT, { .i64=0 }, 0, 255, AV_OPT_FLAG_DECODING_PARAM }, {"pgc", "entry PGC number (0=auto)", OFFSET(opt_pgc), AV_OPT_TYPE_INT, { .i64=0 }, 0, 999, AV_OPT_FLAG_DECODING_PARAM }, {"preindex", "enable for accurate chapter markers, slow (2-pass read)", OFFSET(opt_preindex), AV_OPT_TYPE_BOOL, { .i64=0 }, 0, 1, AV_OPT_FLAG_DECODING_PARAM },