From patchwork Sat Sep 28 21:30:12 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jonathan Baecker X-Patchwork-Id: 51920 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:d8ca:0:b0:48e:c0f8:d0de with SMTP id dy10csp1165379vqb; Sat, 28 Sep 2024 14:30:43 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCVytiZK1nrs59jxeOISajZQ8UDYn79vSMG+5B6Rn6K1yn0ApGnz6fLYTn5ZFtPRBMCTn32xFWrc2BtwtviHEcZN@gmail.com X-Google-Smtp-Source: AGHT+IELN1FU+zSnK57UcXX0Jmxbjp7DV3NwwW1dJuAr5/r8drjvnzjxCIjMudcWWw+BheR0u4Bo X-Received: by 2002:a17:907:9488:b0:a8d:6073:2c13 with SMTP id a640c23a62f3a-a93c4946d42mr745352866b.33.1727559043546; Sat, 28 Sep 2024 14:30:43 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1727559043; cv=none; d=google.com; s=arc-20240605; b=OqDoBBkrT+54YLtzFuk/ztmN4eps6+rshfbxSZx3OkQID4UiYQ07lknKeVI/Aogfio F/pvnk9gqwn3VKNFoBRVF19ZtJmN3dE3QKdXx0FsV+/qZ4aWBKBha9gjb3HTCVAj4DAd zkHNXBTm+1sscXFhU6BAoRB++dlzKj6O5n/p/prglKguiZK+uoB0tNCat+ZeE+W8WP+g bqMXR4BvkW+TlIoYs2XBAc0NWfsaUbh0nk/UA6amhYNMdMe1pE0GvMMqsqIrkviYOMyV H3v4jnJ0AHOAJ6LWtoH+btx+syYrpmqonmxP2uvMuLQ8L8bEPBCSlJEoF2+6qPmskWu2 tYKQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; 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=uuavkP7JFl/PVnAIsXMI4NBZ2Hmb3antfpGTMX+CpMQ=; fh=lQBCBVZ2KMTOWC5s3Vc1cNHB+9rtn7YWTj1usTHC3ZU=; b=LY3VgLO4SRrnC4rsWh8B8kieo7amm8XJmm7QuJsBV7sIar3kTfW/Sht3zh/kF8Vt5z tRvEoreZlbDJth4PQcEmA+UR3XHAtWzQvw6GPBCazalpByTwrVn0wF4pa19SkJiITKVo gvVXTKEtRZMKESYLHrBvio4i9qdCNnn6dTbacCHYHqIdzIw1JjJt90TxgZubVtOBhSVa HemVJocfaoUja3z6AebGBv/sHPwIHgTrzeNHnoHCjHvYiT8aHZU4+0gnjCRgpO80XNAM OzcqMM5upnXmEW++i6L7X16XfzRBe7ZBTbhCa5ULAQ3MzU3yqejahJ4hUGcyX/r4xyLO xa8Q==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20230601 header.b=YvSwWDNA; 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=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com; dara=fail header.i=@gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id a640c23a62f3a-a93c27f38c8si363113666b.176.2024.09.28.14.30.43; Sat, 28 Sep 2024 14:30:43 -0700 (PDT) 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=@gmail.com header.s=20230601 header.b=YvSwWDNA; 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=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com; dara=fail header.i=@gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 39B7568D9A5; Sun, 29 Sep 2024 00:30:40 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f45.google.com (mail-wr1-f45.google.com [209.85.221.45]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 6A6B168CD3E for ; Sun, 29 Sep 2024 00:30:33 +0300 (EEST) Received: by mail-wr1-f45.google.com with SMTP id ffacd0b85a97d-3770320574aso2085608f8f.2 for ; Sat, 28 Sep 2024 14:30:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1727559032; x=1728163832; 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=vPfloVNYh6jxCHhpgVQG6uKtUQa/bh+9RllFk8j1jQY=; b=YvSwWDNAAMpXXKfJayRHGCL/cxYmpgkybydOhwsTIvS9DY7cR3n1bMYzGA8YfQncub /gHZwFKhwK124qOe9SjBaWIp4eTanf69JCRrW8BQIlvrvBJLGOrojy7aLCIDiCRZFGzo Yutp9z4IzDiXg9hLv3E1Li/qeh6gFo0oSIizwCUSj8pX0POd15pPLPXgJieXxO2o8LyE iD6fWq9SGt6TfTMo6n0eXACgBX5gzPesBXo2XkimK15Qty6b8q53ClL0DYsV8jp2SSXt o0K8FCB42FCYaEzDOT41zbBTSTOtdyzUpkMUrGBS8KEXwRF8qGtHVTscgXvQl8djuFCi +J9A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1727559032; x=1728163832; 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=vPfloVNYh6jxCHhpgVQG6uKtUQa/bh+9RllFk8j1jQY=; b=A2Xa87dHAV13YLZ8N9Qw+7KTriCH5+EC7+k6nqs8CQ1Gdvr6oOQlM2Vb89Mz3sfVbk kH7pDLE3jaR2EB8sv0/H+s8rCI5sB/jyUe9A+5fm1NhO8vYGDNGfQKhep7olMDMmuD8a c0mCuWlrQ2TwFrdccsU8WBxpeBRCvNKLYjB8UjqqxC6V3b5yfKEFi2xuUJxNgNEzterE cter+RhlIRxDMH/QphecqwsQ1NgjdcAwBmnGIZA17mJd+giNHTbO1VpDUen+ewLhv8tN XkBSMnafUwqrnxdYw7a7ank8g2lcM1CSbsFJL9TZBthEhTf3BygD3Bl0VZjtky4BgKAC aNBQ== X-Gm-Message-State: AOJu0YxgF5ZCArLRvwrkGy5OIVfi9QRAltGF73zzNt9/pCF10kHS1IjD aS8dwhHXGnGftA67myJ9MXxFrBFSWwGyQiNSvgl4eCSWjk6+HoRmZMtZZg== X-Received: by 2002:adf:fa4d:0:b0:37c:cbca:fd7c with SMTP id ffacd0b85a97d-37cd5ad1271mr4661017f8f.41.1727559032304; Sat, 28 Sep 2024 14:30:32 -0700 (PDT) Received: from jb-fedora-fritz-box.fritz.box ([2001:9e8:83e2:5d00:560a:c202:7316:f11e]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-37cd572fbd3sm5543243f8f.84.2024.09.28.14.30.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 28 Sep 2024 14:30:31 -0700 (PDT) From: Jonathan Baecker To: ffmpeg-devel@ffmpeg.org Date: Sat, 28 Sep 2024 23:30:12 +0200 Message-ID: <20240928213012.48808-1-jonbae77@gmail.com> X-Mailer: git-send-email 2.46.2 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] libavformat/hlsplaylist: add subtitle_varname for naming subtitle streams 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: Jonathan Baecker Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: C5ZPCY8oucZ0 If 'sname:*' is set in the var_stream_map variable, use it as the NAME attribute for subtitles. This improves the naming of subtitle streams in HTML players, providing clearer and more descriptive labels for users. --- doc/muxers.texi | 5 +++-- libavformat/hlsenc.c | 7 ++++++- libavformat/hlsplaylist.c | 9 +++++++-- libavformat/hlsplaylist.h | 2 +- 4 files changed, 17 insertions(+), 6 deletions(-) -- 2.46.1 diff --git a/doc/muxers.texi b/doc/muxers.texi index ce93ba1488..04b7f20b7e 100644 --- a/doc/muxers.texi +++ b/doc/muxers.texi @@ -2436,13 +2436,14 @@ ffmpeg -re -i in.ts -b:a:0 32k -b:a:1 64k -b:v:0 1000k \ @item Create a single variant stream. Add the @code{#EXT-X-MEDIA} tag with @code{TYPE=SUBTITLES} in the master playlist with webvtt subtitle group name -'subtitle'. Make sure the input file has one text subtitle stream at least. +'subtitle' and optional subtitle name, e.g. 'English'. Make sure the input +file has one text subtitle stream at least. @example ffmpeg -y -i input_with_subtitle.mkv \ -b:v:0 5250k -c:v h264 -pix_fmt yuv420p -profile:v main -level 4.1 \ -b:a:0 256k \ -c:s webvtt -c:a mp2 -ar 48000 -ac 2 -map 0:v -map 0:a:0 -map 0:s:0 \ - -f hls -var_stream_map "v:0,a:0,s:0,sgroup:subtitle" \ + -f hls -var_stream_map "v:0,a:0,s:0,sgroup:subtitle,sname:English" \ -master_pl_name master.m3u8 -t 300 -hls_time 10 -hls_init_time 4 -hls_list_size \ 10 -master_pl_publish_rate 10 -hls_flags \ delete_segments+discont_start+split_by_time ./tmp/video.m3u8 diff --git a/libavformat/hlsenc.c b/libavformat/hlsenc.c index 1e932b7b0e..7b2145f5bf 100644 --- a/libavformat/hlsenc.c +++ b/libavformat/hlsenc.c @@ -189,6 +189,7 @@ typedef struct VariantStream { const char *sgroup; /* subtitle group name */ const char *ccgroup; /* closed caption group name */ const char *varname; /* variant name */ + const char *subtitle_varname; /* subtitle variant name */ } VariantStream; typedef struct ClosedCaptionsStream { @@ -1533,7 +1534,8 @@ static int create_master_playlist(AVFormatContext *s, break; } - ff_hls_write_subtitle_rendition(hls->m3u8_out, sgroup, vtt_m3u8_rel_name, vs->language, i, hls->has_default_key ? vs->is_default : 1); + ff_hls_write_subtitle_rendition(hls->m3u8_out, sgroup, vtt_m3u8_rel_name, vs->language, + vs->subtitle_varname, i, hls->has_default_key ? vs->is_default : 1); } if (!hls->has_default_key || !hls->has_video_m3u8) { @@ -2107,6 +2109,9 @@ static int parse_variant_stream_mapstring(AVFormatContext *s) } else if (av_strstart(keyval, "name:", &val)) { vs->varname = val; continue; + } else if (av_strstart(keyval, "sname:", &val)) { + vs->subtitle_varname = val; + continue; } else if (av_strstart(keyval, "agroup:", &val)) { vs->agroup = val; continue; diff --git a/libavformat/hlsplaylist.c b/libavformat/hlsplaylist.c index f8a6977702..17b93a5ef1 100644 --- a/libavformat/hlsplaylist.c +++ b/libavformat/hlsplaylist.c @@ -57,13 +57,18 @@ void ff_hls_write_audio_rendition(AVIOContext *out, const char *agroup, void ff_hls_write_subtitle_rendition(AVIOContext *out, const char *sgroup, const char *filename, const char *language, - int name_id, int is_default) + const char *sname, int name_id, int is_default) { if (!out || !filename) return; avio_printf(out, "#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID=\"%s\"", sgroup); - avio_printf(out, ",NAME=\"subtitle_%d\",DEFAULT=%s,", name_id, is_default ? "YES" : "NO"); + if (sname) { + avio_printf(out, ",NAME=\"%s\",", sname); + } else { + avio_printf(out, ",NAME=\"subtitle_%d\",", name_id); + } + avio_printf(out, "DEFAULT=%s,", is_default ? "YES" : "NO"); if (language) { avio_printf(out, "LANGUAGE=\"%s\",", language); } diff --git a/libavformat/hlsplaylist.h b/libavformat/hlsplaylist.h index d7aa44d8dc..ec44e5a0ae 100644 --- a/libavformat/hlsplaylist.h +++ b/libavformat/hlsplaylist.h @@ -41,7 +41,7 @@ void ff_hls_write_audio_rendition(AVIOContext *out, const char *agroup, int name_id, int is_default, int nb_channels); void ff_hls_write_subtitle_rendition(AVIOContext *out, const char *sgroup, const char *filename, const char *language, - int name_id, int is_default); + const char *sname, int name_id, int is_default); void ff_hls_write_stream_info(AVStream *st, AVIOContext *out, int bandwidth, int avg_bandwidth, const char *filename, const char *agroup,