aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNiels van Velzen <nielsvanvelzen@users.noreply.github.com>2026-05-04 17:59:59 +0200
committerGitHub <noreply@github.com>2026-05-04 17:59:59 +0200
commitd707a9dba106e78d1720214daf905eb39e5a3b30 (patch)
tree9cebf57dc99a48c98bb961434e9775167390d85f
parentd359d2f7a865329ba10915dbd68dc1ab54450ffa (diff)
parent9f5f18d2dbf6ccad49015765600fc858e5f85c1e (diff)
Merge pull request #16704 from dyld-w/fix/keyframe-duration-overshoot
Fix keyframe duration overshoot breaking playback
-rw-r--r--src/Jellyfin.MediaEncoding.Hls/Playlist/DynamicHlsPlaylistGenerator.cs9
-rw-r--r--tests/Jellyfin.MediaEncoding.Hls.Tests/Playlist/DynamicHlsPlaylistGeneratorTests.cs11
2 files changed, 16 insertions, 4 deletions
diff --git a/src/Jellyfin.MediaEncoding.Hls/Playlist/DynamicHlsPlaylistGenerator.cs b/src/Jellyfin.MediaEncoding.Hls/Playlist/DynamicHlsPlaylistGenerator.cs
index fb5027e5b5..c970fd8a61 100644
--- a/src/Jellyfin.MediaEncoding.Hls/Playlist/DynamicHlsPlaylistGenerator.cs
+++ b/src/Jellyfin.MediaEncoding.Hls/Playlist/DynamicHlsPlaylistGenerator.cs
@@ -156,7 +156,7 @@ public class DynamicHlsPlaylistGenerator : IDynamicHlsPlaylistGenerator
{
if (keyframeData.KeyframeTicks.Count > 0 && keyframeData.TotalDuration < keyframeData.KeyframeTicks[^1])
{
- throw new ArgumentException("Invalid duration in keyframe data", nameof(keyframeData));
+ keyframeData = new KeyframeData(keyframeData.KeyframeTicks[^1], keyframeData.KeyframeTicks);
}
long lastKeyframe = 0;
@@ -176,7 +176,12 @@ public class DynamicHlsPlaylistGenerator : IDynamicHlsPlaylistGenerator
}
}
- result.Add(TimeSpan.FromTicks(keyframeData.TotalDuration - lastKeyframe).TotalSeconds);
+ var remaining = keyframeData.TotalDuration - lastKeyframe;
+ if (remaining > 0)
+ {
+ result.Add(TimeSpan.FromTicks(remaining).TotalSeconds);
+ }
+
return result;
}
diff --git a/tests/Jellyfin.MediaEncoding.Hls.Tests/Playlist/DynamicHlsPlaylistGeneratorTests.cs b/tests/Jellyfin.MediaEncoding.Hls.Tests/Playlist/DynamicHlsPlaylistGeneratorTests.cs
index fc969527e8..1406c8ee91 100644
--- a/tests/Jellyfin.MediaEncoding.Hls.Tests/Playlist/DynamicHlsPlaylistGeneratorTests.cs
+++ b/tests/Jellyfin.MediaEncoding.Hls.Tests/Playlist/DynamicHlsPlaylistGeneratorTests.cs
@@ -15,10 +15,17 @@ namespace Jellyfin.MediaEncoding.Hls.Tests.Playlist
}
[Fact]
- public void ComputeSegments_InvalidDuration_ThrowsArgumentException()
+ public void ComputeSegments_ZeroDurationOvershoot_ClampsToDuration()
{
var keyframeData = new KeyframeData(0, new[] { MsToTicks(10000) });
- Assert.Throws<ArgumentException>(() => DynamicHlsPlaylistGenerator.ComputeSegments(keyframeData, 6000));
+ Assert.Equal(new[] { 10.0 }, DynamicHlsPlaylistGenerator.ComputeSegments(keyframeData, 6000));
+ }
+
+ [Fact]
+ public void ComputeSegments_MinorDurationOvershoot_ClampsToDuration()
+ {
+ var keyframeData = new KeyframeData(MsToTicks(9900), new[] { 0L, MsToTicks(5000), MsToTicks(10000) });
+ Assert.Equal(new[] { 10.0 }, DynamicHlsPlaylistGenerator.ComputeSegments(keyframeData, 6000));
}
[Theory]