aboutsummaryrefslogtreecommitdiff
path: root/src/Jellyfin.MediaEncoding.Hls
diff options
context:
space:
mode:
authorcvium <clausvium@gmail.com>2021-09-26 21:07:30 +0200
committercvium <clausvium@gmail.com>2021-09-26 21:07:30 +0200
commit2899b77cd58456470b8dd4d01d3a8c525a9b5911 (patch)
treedecd61105f437fb0c0efc75b02d433b1aca29407 /src/Jellyfin.MediaEncoding.Hls
parent41383e6fe4d2ae80552c1b3df0b469f5416f2d89 (diff)
Implement FfProbeKeyframeExtractor and add tests for it
Diffstat (limited to 'src/Jellyfin.MediaEncoding.Hls')
-rw-r--r--src/Jellyfin.MediaEncoding.Hls/Playlist/DynamicHlsPlaylistGenerator.cs19
1 files changed, 13 insertions, 6 deletions
diff --git a/src/Jellyfin.MediaEncoding.Hls/Playlist/DynamicHlsPlaylistGenerator.cs b/src/Jellyfin.MediaEncoding.Hls/Playlist/DynamicHlsPlaylistGenerator.cs
index 5411d5667..cbc62eb59 100644
--- a/src/Jellyfin.MediaEncoding.Hls/Playlist/DynamicHlsPlaylistGenerator.cs
+++ b/src/Jellyfin.MediaEncoding.Hls/Playlist/DynamicHlsPlaylistGenerator.cs
@@ -90,9 +90,11 @@ namespace Jellyfin.MediaEncoding.Hls.Playlist
.AppendLine();
}
- double currentRuntimeInSeconds = 0;
+ long currentRuntimeInSeconds = 0;
foreach (var length in segments)
{
+ // Manually convert to ticks to avoid precision loss when converting double
+ var lengthTicks = Convert.ToInt64(length * TimeSpan.TicksPerSecond);
builder.Append("#EXTINF:")
.Append(length.ToString("0.000000", CultureInfo.InvariantCulture))
.AppendLine(", nodesc")
@@ -101,12 +103,12 @@ namespace Jellyfin.MediaEncoding.Hls.Playlist
.Append(segmentExtension)
.Append(request.QueryString)
.Append("&runtimeTicks=")
- .Append(TimeSpan.FromSeconds(currentRuntimeInSeconds).Ticks)
+ .Append(currentRuntimeInSeconds)
.Append("&actualSegmentLengthTicks=")
- .Append(TimeSpan.FromSeconds(length).Ticks)
+ .Append(lengthTicks)
.AppendLine();
- currentRuntimeInSeconds += length;
+ currentRuntimeInSeconds += lengthTicks;
}
builder.AppendLine("#EXT-X-ENDLIST");
@@ -122,6 +124,7 @@ namespace Jellyfin.MediaEncoding.Hls.Playlist
return false;
}
+ var succeeded = false;
var cachePath = GetCachePath(filePath);
if (TryReadFromCache(cachePath, out var cachedResult))
{
@@ -139,10 +142,14 @@ namespace Jellyfin.MediaEncoding.Hls.Playlist
return false;
}
- CacheResult(cachePath, keyframeData);
+ succeeded = keyframeData.KeyframeTicks.Count > 0;
+ if (succeeded)
+ {
+ CacheResult(cachePath, keyframeData);
+ }
}
- return keyframeData.KeyframeTicks.Count > 0;
+ return succeeded;
}
private void CacheResult(string cachePath, KeyframeData keyframeData)