aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcvium <clausvium@gmail.com>2021-09-25 11:47:44 +0200
committercvium <clausvium@gmail.com>2021-09-25 11:47:44 +0200
commit3e5cb8e04e11d05b4af54e88686e829429305870 (patch)
treea2a6b87847bc645aee6b652b5ad49da0a7db715d
parentc7b25a9fe466083a761dc768169e09f68313f862 (diff)
Add tests for ComputeEqualLengthSegments and fix bug
-rw-r--r--src/Jellyfin.MediaEncoding.Hls/Playlist/DynamicHlsPlaylistGenerator.cs11
-rw-r--r--tests/Jellyfin.MediaEncoding.Hls.Tests/Playlist/DynamicHlsPlaylistGeneratorTests.cs32
2 files changed, 40 insertions, 3 deletions
diff --git a/src/Jellyfin.MediaEncoding.Hls/Playlist/DynamicHlsPlaylistGenerator.cs b/src/Jellyfin.MediaEncoding.Hls/Playlist/DynamicHlsPlaylistGenerator.cs
index 9cb52e678..5c6809a87 100644
--- a/src/Jellyfin.MediaEncoding.Hls/Playlist/DynamicHlsPlaylistGenerator.cs
+++ b/src/Jellyfin.MediaEncoding.Hls/Playlist/DynamicHlsPlaylistGenerator.cs
@@ -221,7 +221,14 @@ namespace Jellyfin.MediaEncoding.Hls.Playlist
internal static double[] ComputeEqualLengthSegments(long desiredSegmentLengthMs, long totalRuntimeTicks)
{
- var segmentLengthTicks = TimeSpan.FromMilliseconds(desiredSegmentLengthMs).Ticks;
+ if (desiredSegmentLengthMs == 0 || totalRuntimeTicks == 0)
+ {
+ throw new InvalidOperationException($"Invalid segment length ({desiredSegmentLengthMs}) or runtime ticks ({totalRuntimeTicks})");
+ }
+
+ var desiredSegmentLength = TimeSpan.FromMilliseconds(desiredSegmentLengthMs);
+
+ var segmentLengthTicks = desiredSegmentLength.Ticks;
var wholeSegments = totalRuntimeTicks / segmentLengthTicks;
var remainingTicks = totalRuntimeTicks % segmentLengthTicks;
@@ -229,7 +236,7 @@ namespace Jellyfin.MediaEncoding.Hls.Playlist
var segments = new double[segmentsLen];
for (int i = 0; i < wholeSegments; i++)
{
- segments[i] = desiredSegmentLengthMs;
+ segments[i] = desiredSegmentLength.TotalSeconds;
}
if (remainingTicks != 0)
diff --git a/tests/Jellyfin.MediaEncoding.Hls.Tests/Playlist/DynamicHlsPlaylistGeneratorTests.cs b/tests/Jellyfin.MediaEncoding.Hls.Tests/Playlist/DynamicHlsPlaylistGeneratorTests.cs
index c55b7e304..4b2fce171 100644
--- a/tests/Jellyfin.MediaEncoding.Hls.Tests/Playlist/DynamicHlsPlaylistGeneratorTests.cs
+++ b/tests/Jellyfin.MediaEncoding.Hls.Tests/Playlist/DynamicHlsPlaylistGeneratorTests.cs
@@ -1,4 +1,5 @@
-using Jellyfin.MediaEncoding.Hls.Playlist;
+using System;
+using Jellyfin.MediaEncoding.Hls.Playlist;
using Xunit;
namespace Jellyfin.MediaEncoding.Hls.Tests.Playlist
@@ -6,6 +7,21 @@ namespace Jellyfin.MediaEncoding.Hls.Tests.Playlist
public class DynamicHlsPlaylistGeneratorTests
{
[Theory]
+ [MemberData(nameof(ComputeEqualLengthSegments_Valid_Success_Data))]
+ public void ComputeEqualLengthSegments_Valid_Success(long desiredSegmentLengthMs, long totalRuntimeTicks, double[] segments)
+ {
+ Assert.Equal(segments, DynamicHlsPlaylistGenerator.ComputeEqualLengthSegments(desiredSegmentLengthMs, totalRuntimeTicks));
+ }
+
+ [Theory]
+ [InlineData(0, 1000000)]
+ [InlineData(1000, 0)]
+ public void ComputeEqualLengthSegments_Invalid_ThrowsInvalidOperationException(long desiredSegmentLengthMs, long totalRuntimeTicks)
+ {
+ Assert.Throws<InvalidOperationException>(() => DynamicHlsPlaylistGenerator.ComputeEqualLengthSegments(desiredSegmentLengthMs, totalRuntimeTicks));
+ }
+
+ [Theory]
[InlineData("testfile.mkv", new string[0], false)]
[InlineData("testfile.flv", new[] { "mp4", "mkv", "ts" }, false)]
[InlineData("testfile.flv", new[] { "mp4", "mkv", "ts", "flv" }, true)]
@@ -21,5 +37,19 @@ namespace Jellyfin.MediaEncoding.Hls.Tests.Playlist
{
Assert.False(DynamicHlsPlaylistGenerator.IsExtractionAllowedForFile(filePath, allowedExtensions));
}
+
+ private static TheoryData<long, long, double[]> ComputeEqualLengthSegments_Valid_Success_Data()
+ {
+ var data = new TheoryData<long, long, double[]>
+ {
+ { 6000, TimeSpan.FromMilliseconds(13000).Ticks, new[] { 6.0, 6.0, 1.0 } },
+ { 3000, TimeSpan.FromMilliseconds(15000).Ticks, new[] { 3.0, 3.0, 3.0, 3.0, 3.0 } },
+ { 6000, TimeSpan.FromMilliseconds(25000).Ticks, new[] { 6.0, 6.0, 6.0, 6.0, 1.0 } },
+ { 6000, TimeSpan.FromMilliseconds(20123).Ticks, new[] { 6.0, 6.0, 6.0, 2.123 } },
+ { 6000, TimeSpan.FromMilliseconds(1234).Ticks, new[] { 1.234 } }
+ };
+
+ return data;
+ }
}
}