From patchwork Mon Jan 29 05:53:44 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marth64 X-Patchwork-Id: 45879 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a21:8786:b0:199:de12:6fa6 with SMTP id ph6csp1338870pzb; Sun, 28 Jan 2024 21:54:59 -0800 (PST) X-Google-Smtp-Source: AGHT+IEJ0IhSZllwjaOJyg8+0dz6/amWuDdbhihVG0kDNfngdo0T8ZNAatMeYg9Zv3t5l01rxEFr X-Received: by 2002:a17:906:4814:b0:a35:cd33:f2fc with SMTP id w20-20020a170906481400b00a35cd33f2fcmr629771ejq.18.1706507698922; Sun, 28 Jan 2024 21:54:58 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1706507698; cv=none; d=google.com; s=arc-20160816; b=Eg94BUJKFcyv2Z6AVHCSRvJJxgPESNXZ3C1Pk6t3rEKsrJUtJigkOPXvIT2p8ZJRB3 RvfgKJYIZ1mErqNme/5N16bPjbWb3q0YEPObCqHyj79vn2uhre2WKqeOpYVDWQYGSLwc zSCC1givi+AXBvrUD/DaVzIbwTHdrtJF/9o1fPZy0z5+hu1ICrWfJXNMWefiF81MUABn hbsOnutajfp1mq+eLmTwnOrfd8n5U7kp98VJS9ZHPjZQnEng+MeWWIq32G5ZhfcFmS0b Woh+DnZmN5aXrPnCX1STfleqISwX9EM75fb0nZrQMXl19SIbosfLwxmu9rhzpULcAPDG En9A== 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=iJl7VdoNcZkl9vphB9UzoeIDu6voY6V7nsrC1Sg9m2Y=; fh=PlWMzmI9LD2qGS7ipLrQl8z0iaQTLQLHzoGuXcBzpCg=; b=jBpzLQzMxyvZpW5lD+k/wFCcb+pMgiBzOP6NKC2xRsaalCcCVane4q4hzprW31Hy5e lWYr9Na+PPODH+z5vzF9pju7OdDO1zzIIPYS4tNExoUKZxHiJTsGPi1iM84P9b70t6K5 QY1QETZM+D6yVthnbono+d17t5dTefdaBXPpOy40A3KtM3CtNzNkqEncJQpsY1IJtr9d 8lDP+vddOd9xNCN4L1ll3/taHbayn/WmPblBkmD/DjJ7U5r0EZeaNBQ+Tvoz5WUBcwbU Nd0K5ARt08aXLFYd10paf0zMYYfX8xGx8ayw1c+UA/jmzjuhtHMI5f49QsP4op3+2bXI zXFw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@proxyid.net header.s=google header.b=MKLiNjdF; 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 y20-20020a17090629d400b00a317601a8b2si3311368eje.350.2024.01.28.21.54.58; Sun, 28 Jan 2024 21:54:58 -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=MKLiNjdF; 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 DC1DC68D1DD; Mon, 29 Jan 2024 07:54:55 +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 D498F68C9F6 for ; Mon, 29 Jan 2024 07:54:49 +0200 (EET) Received: by mail-io1-f100.google.com with SMTP id ca18e2360f4ac-7bed9c7d33fso88960039f.1 for ; Sun, 28 Jan 2024 21:54:49 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=proxyid.net; s=google; t=1706507688; x=1707112488; 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=q97I+0MfWTcq0CiqzpM0E51ems7N0p9VaW6sLpOxC1k=; b=MKLiNjdFtY2sI8eBSdWsiHAV6oKAQS7bow06zBwiNvlaGOgEcQN2nVTAMOHotfBPf1 3PHEZexseJ31mv4XFpveb2r/S4mYeR0vlGcbaxZ8IzO6Kxm3fu26LOYA010LVJxb1Npt QPm3uBV3Luq4ANyxLmTe71O3wXLu0YaYx/NmN3daAkbZ8KOm/OzV75u0o0YoM5Oe4Z0v DYG05Kz6phngVPvL/vFSRWrxlv6mhmc3tKtfdIoOyDNeyynmqpKzpEzeLE0nVzghaoDW GKRkPQu7QjzsGYmnWC4u9/pQ/Soy7wpaUsMWKOMdOsqhQ9mKr4BwND+BY414VNicPfga aRlA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1706507688; x=1707112488; 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=q97I+0MfWTcq0CiqzpM0E51ems7N0p9VaW6sLpOxC1k=; b=du1x7fHsuuNbd6WSw9E2PjTe0sVzDWDg/XGGoJQhjB2rdNKjcrZT1IZzj4bNCM5feD fkI2tq3Dpdl+XDUMDV8xDVbPIisTvTCjfUd7IB2NUZqfaL27N+oTH+ZGAfR3Pd8673ve yTSbkna/qmdTH5g3QE2Y33DOBUaKZjkUNOXnpfq4p3Fbd1P+HSHGlKzTT/7Rc6Z3MLoR UvRxDvEB/SQ56OrQApJ2TZGgKRBjd4DpZxMI2NLElKlhrfJssnGqduR4VP9KMJiN7jOF 0xzAgf+RghJTYLMa5UTI1hl6wVjQeVUWI2DX30r+378DdP4mI+A4xl8OPcCQcpEBYmbE Wd/g== X-Gm-Message-State: AOJu0YxQ8nloTdUkH1iwRyhBg2xn1VAybhUmq5KxO9XWnnKW3u83q+co qqjS2ukEuEu9i8jOvRbc/KmQwhQfpSoptpHPBuYRLHoeJF08wPHFAnn56lurdiLxgRzsMl0F8P8 4i11pprR2DFcQI8Q2SzZBh2hlgTmiDB+foesnJh1/ X-Received: by 2002:a92:d28a:0:b0:363:777b:77da with SMTP id p10-20020a92d28a000000b00363777b77damr2657028ilp.17.1706507688438; Sun, 28 Jan 2024 21:54:48 -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 u14-20020a056e021a4e00b00361915b5c2fsm323617ilv.78.2024.01.28.21.54.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 28 Jan 2024 21:54:48 -0800 (PST) X-Relaying-Domain: proxyid.net From: Marth64 To: ffmpeg-devel@ffmpeg.org Date: Sun, 28 Jan 2024 23:53:44 -0600 Message-Id: <20240129055343.432489-1-marth64@proxyid.net> X-Mailer: git-send-email 2.34.1 MIME-Version: 1.0 Subject: [FFmpeg-devel] libavformat/dvdvideo: enable subtitle 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: ocL+J+8V3rN3 If DVD demuxer and CLUT utilities patches are merged, then this enables RGB palette support for demuxed DVD subtitles and in turn makes them playable/usable with nearly all compatible players (which do not support YUV palettes). Signed-off-by: Marth64 --- doc/demuxers.texi | 5 +++++ libavformat/Makefile | 2 +- libavformat/dvdvideodec.c | 16 +++++++++++++++- 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/doc/demuxers.texi b/doc/demuxers.texi index f7f9e6769a..7f0af820ae 100644 --- a/doc/demuxers.texi +++ b/doc/demuxers.texi @@ -412,6 +412,11 @@ for a uniform output from many discs which insert AC3 delay or filler frames at the start of the PGC. Default is 1, true. +@item clut_rgb +Output subtitle palettes (CLUTs) as RGB, required for Matroska. +Disable to output the palette in its original YUV colorspace. +Default is 1, true. + @end table @section ea diff --git a/libavformat/Makefile b/libavformat/Makefile index f0b42188a2..8cbbea8356 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/dvdvideodec.c b/libavformat/dvdvideodec.c index b9ec3acaaf..68ddf73bd4 100644 --- a/libavformat/dvdvideodec.c +++ b/libavformat/dvdvideodec.c @@ -51,6 +51,7 @@ #include "avio_internal.h" #include "avlanguage.h" #include "demux.h" +#include "dvdclut.h" #include "internal.h" #include "url.h" @@ -92,6 +93,7 @@ typedef struct DVDVideoPGCAudioStreamEntry { typedef struct DVDVideoPGCSubtitleStreamEntry { int startcode; + uint32_t *clut; int disposition; char *lang_iso; enum DVDVideoSubpictureViewport viewport; @@ -133,6 +135,7 @@ typedef struct DVDVideoDemuxContext { int opt_preindex; /* pre-indexing mode (2-pass read) */ int opt_trim; /* trim padding cells at beginning and end */ int opt_wait_for_audio; /* wait for audio streams to start, if any */ + int opt_clut_rgb; /* output subtitle palette (CLUT) as RGB */ /* subdemux */ const AVInputFormat *mpeg_fmt; /* inner MPEG-PS (VOB) demuxer */ @@ -1031,6 +1034,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); @@ -1038,6 +1043,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); @@ -1059,7 +1069,8 @@ 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; - /* XXX: palette support will be inserted here in upcoming patch */ + 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); @@ -1088,6 +1099,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) @@ -1107,6 +1119,7 @@ end_free_error: av_log(s, AV_LOG_ERROR, "Unable to allocate subtitle stream\n"); end_free: + av_free(entry->clut); av_freep(&entry); return ret; @@ -1386,6 +1399,7 @@ static const AVOption dvdvideo_options[] = { {"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 }, {"trim", "trim padding cells from start", OFFSET(opt_trim), AV_OPT_TYPE_BOOL, { .i64=1 }, 0, 1, AV_OPT_FLAG_DECODING_PARAM }, {"wait_for_audio", "wait for audio keyframe at start, if any", OFFSET(opt_wait_for_audio), AV_OPT_TYPE_BOOL, { .i64=1 }, 0, 1, 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 }, {NULL} };