From 0b20d7a05bb174181ef56e9c2ee08a590a74528e Mon Sep 17 00:00:00 2001 From: Oskar Bali <51484222+Oggeb1@users.noreply.github.com> Date: Wed, 19 Aug 2026 11:29:52 +0200 Subject: [PATCH 1/3] Fix BDMV PGS subtitles with TrueHD Add myself CONTRIBUTORS.md --- CONTRIBUTORS.md | 1 + .../MediaEncoding/EncodingHelper.cs | 19 ++++++++++++++++++- .../Subtitles/SubtitleEncoder.cs | 4 ++-- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 99f24e3a14..a97d335170 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -240,6 +240,7 @@ - [Florin-Popescu](https://github.com/Florin-Popescu) - [m0g3r](https://github.com/m0g3r) - [martin-77](https://github.com/martin-77) + - [Oggeb1](https://github.com/Oggeb1) # Emby Contributors diff --git a/MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs b/MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs index 9a68889352..9e6d4a2899 100644 --- a/MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs +++ b/MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs @@ -6311,7 +6311,7 @@ namespace MediaBrowser.Controller.MediaEncoding string.Join(',', overlayFilters)); var mapPrefix = Convert.ToInt32(state.SubtitleStream.IsExternal); - var subtitleStreamIndex = FindIndex(state.MediaSource.MediaStreams, state.SubtitleStream); + var subtitleStreamIndex = GetSubtitleStreamIndexForFfmpeg(state.MediaSource, state.SubtitleStream); var videoStreamIndex = FindIndex(state.MediaSource.MediaStreams, state.VideoStream); if (hasSubs) @@ -7943,6 +7943,23 @@ namespace MediaBrowser.Controller.MediaEncoding return -1; } + public static int GetSubtitleStreamIndexForFfmpeg(MediaSourceInfo mediaSource, MediaStream subtitleStream) + { + var index = FindIndex(mediaSource.MediaStreams, subtitleStream); + if (index == -1 || mediaSource.VideoType != VideoType.BluRay) + { + return index; + } + + var hiddenStreamsBefore = mediaSource.MediaStreams.Count(s => + s.Type == MediaStreamType.Audio + && (string.Equals(s.Codec, "truehd", StringComparison.OrdinalIgnoreCase) + || string.Equals(s.Codec, "atmos", StringComparison.OrdinalIgnoreCase)) + && s.Index < subtitleStream.Index); + + return index + hiddenStreamsBefore; + } + public static bool IsCopyCodec(string codec) { return string.Equals(codec, "copy", StringComparison.OrdinalIgnoreCase); diff --git a/MediaBrowser.MediaEncoding/Subtitles/SubtitleEncoder.cs b/MediaBrowser.MediaEncoding/Subtitles/SubtitleEncoder.cs index bd516f0a9f..e733cfd8ac 100644 --- a/MediaBrowser.MediaEncoding/Subtitles/SubtitleEncoder.cs +++ b/MediaBrowser.MediaEncoding/Subtitles/SubtitleEncoder.cs @@ -648,7 +648,7 @@ namespace MediaBrowser.MediaEncoding.Subtitles List subtitleStreams, CancellationToken cancellationToken) { - var inputPath = _mediaEncoder.GetInputArgument(mediaSource.Path, mediaSource); + var inputPath = _mediaEncoder.GetInputPathArgument(mediaSource.Path, mediaSource); var outputPaths = new List(); var args = string.Format( CultureInfo.InvariantCulture, @@ -672,7 +672,7 @@ namespace MediaBrowser.MediaEncoding.Subtitles var outputCodec = IsCodecCopyable(subtitleStream.Codec) ? "copy" : "srt"; // FFmpeg does not provide an .idx/.sub muxer, so VobSub streams must be written as MKS files. var outputFormatOption = MediaStream.IsVobSubFormat(subtitleStream.Codec) ? " -f matroska" : string.Empty; - var streamIndex = EncodingHelper.FindIndex(mediaSource.MediaStreams, subtitleStream); + var streamIndex = EncodingHelper.GetSubtitleStreamIndexForFfmpeg(mediaSource, subtitleStream); if (streamIndex == -1) { From 163895b99f780df1ce8f50f3d0e17f4a2880e251 Mon Sep 17 00:00:00 2001 From: Oskar Bali <51484222+Oggeb1@users.noreply.github.com> Date: Sat, 29 Aug 2026 13:52:20 +0200 Subject: [PATCH 2/3] Fix BDMV with external subtitle GetSubtitleStreamIndexForFfmpeg treated external and internal subtitles the same. This made subtitles out of sync with the video. --- MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs b/MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs index 9e6d4a2899..cb01c1486b 100644 --- a/MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs +++ b/MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs @@ -7946,7 +7946,7 @@ namespace MediaBrowser.Controller.MediaEncoding public static int GetSubtitleStreamIndexForFfmpeg(MediaSourceInfo mediaSource, MediaStream subtitleStream) { var index = FindIndex(mediaSource.MediaStreams, subtitleStream); - if (index == -1 || mediaSource.VideoType != VideoType.BluRay) + if (index == -1 || subtitleStream.IsExternal || mediaSource.VideoType != VideoType.BluRay) { return index; } From 9528d0e601e87bbff79d46f0c5f30fecee62a526 Mon Sep 17 00:00:00 2001 From: Oggeb1 <51484222+Oggeb1@users.noreply.github.com> Date: Sat, 5 Sep 2026 17:15:00 +0200 Subject: [PATCH 3/3] Fix BDMV subtitles with external audio Co-authored-by: gnattu --- MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs b/MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs index 8cd191c055..f0c2580e08 100644 --- a/MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs +++ b/MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs @@ -7953,6 +7953,7 @@ namespace MediaBrowser.Controller.MediaEncoding var hiddenStreamsBefore = mediaSource.MediaStreams.Count(s => s.Type == MediaStreamType.Audio + && !s.IsExternal && (string.Equals(s.Codec, "truehd", StringComparison.OrdinalIgnoreCase) || string.Equals(s.Codec, "atmos", StringComparison.OrdinalIgnoreCase)) && s.Index < subtitleStream.Index);