Files
flowframes/CodeLegacy/Media/GetFrameCountCached.cs

79 lines
2.4 KiB
C#
Raw Normal View History

2021-08-23 16:50:18 +02:00
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
2021-08-23 16:50:18 +02:00
using System.Threading.Tasks;
using Flowframes.Data;
using Flowframes.IO;
namespace Flowframes.Media
{
class GetFrameCountCached
{
private static Dictionary<QueryInfo, int> cache = new Dictionary<QueryInfo, int>();
2021-08-23 16:50:18 +02:00
public static async Task<int> GetFrameCountAsync(MediaFile mf, int retryCount = 3)
{
return await GetFrameCountAsync(mf.SourcePath, retryCount);
}
public static async Task<int> GetFrameCountAsync(string path, int retryCount = 3)
2021-08-23 16:50:18 +02:00
{
Logger.Log($"Getting frame count ({path})...", true);
2021-08-23 16:50:18 +02:00
long filesize = IoUtils.GetPathSize(path);
2021-09-14 18:18:41 +02:00
QueryInfo hash = new QueryInfo(path, filesize);
2021-08-23 16:50:18 +02:00
if (filesize > 0 && cache.ContainsKey(hash))
2021-08-23 16:50:18 +02:00
{
Logger.Log($"Using cached frame count value.", true);
return cache[hash];
2021-08-23 16:50:18 +02:00
}
int frameCount;
if (IoUtils.IsPathDirectory(path))
{
frameCount = IoUtils.GetAmountOfFiles(path, false); // Count frames based on image file amount
}
2021-08-23 16:50:18 +02:00
else
{
if (path.IsConcatFile())
{
var lines = IoUtils.ReadFileLines(path);
var filtered = lines.Where(l => l.StartsWith("file '"));
frameCount = filtered.Count(); // Count frames from concat file
}
else
frameCount = await FfmpegCommands.GetFrameCountAsync(path); // Count frames from video stream
}
2021-08-23 16:50:18 +02:00
if (frameCount > 0)
{
Logger.Log($"Caching frame count ({frameCount}).", true);
cache.Add(hash, frameCount);
}
else
{
if (retryCount > 0)
{
Logger.Log($"Got {frameCount} frames, retrying ({retryCount} left)", true);
Clear();
frameCount = await GetFrameCountAsync(path, retryCount - 1);
}
else
{
Logger.Log($"Failed to get frames and out of retries ({frameCount} frames for {path})", true);
}
}
2021-08-23 16:50:18 +02:00
return frameCount;
}
public static void Clear()
{
cache.Clear();
}
2021-08-23 16:50:18 +02:00
}
}