From e264c93f6786c5f9c320ccc64575f377869c5fa1 Mon Sep 17 00:00:00 2001 From: Malte Rosenbjerg Date: Tue, 11 Aug 2020 00:46:08 +0200 Subject: [PATCH] Make tags more flexible (dictionary) Former-commit-id: 0c19874be3e44fdf14b1be438acfbc148b2e0251 --- FFMpegCore/FFProbe/FFProbeAnalysis.cs | 40 ++++++++++++++++----------- FFMpegCore/FFProbe/MediaAnalysis.cs | 7 +++-- FFMpegCore/FFProbe/VideoStream.cs | 1 + 3 files changed, 29 insertions(+), 19 deletions(-) diff --git a/FFMpegCore/FFProbe/FFProbeAnalysis.cs b/FFMpegCore/FFProbe/FFProbeAnalysis.cs index 258ca89..4e9b952 100644 --- a/FFMpegCore/FFProbe/FFProbeAnalysis.cs +++ b/FFMpegCore/FFProbe/FFProbeAnalysis.cs @@ -12,7 +12,7 @@ public class FFProbeAnalysis public Format Format { get; set; } = null!; } - public class FFProbeStream + public class FFProbeStream : ITagsContainer { [JsonPropertyName("index")] public int Index { get; set; } @@ -66,21 +66,9 @@ public class FFProbeStream public string SampleRate { get; set; } = null!; [JsonPropertyName("tags")] - public Tags Tags { get; set; } = null!; + public Dictionary Tags { get; set; } = null!; } - - public class Tags - { - [JsonPropertyName("DURATION")] - public string Duration { get; set; } = null!; - - [JsonPropertyName("language")] - public string Language { get; set; } = null!; - - [JsonPropertyName("encoder")] - public string Encoder { get; set; } = null!; - } - public class Format + public class Format : ITagsContainer { [JsonPropertyName("filename")] public string Filename { get; set; } = null!; @@ -113,6 +101,26 @@ public class Format public int ProbeScore { get; set; } [JsonPropertyName("tags")] - public Tags Tags { get; set; } = null!; + public Dictionary Tags { get; set; } = null!; + } + + public interface ITagsContainer + { + Dictionary Tags { get; set; } + } + public static class TagExtensions + { + private static string? TryGetTagValue(ITagsContainer tagsContainer, string key) + { + if (tagsContainer.Tags != null && tagsContainer.Tags.TryGetValue(key, out var tagValue)) + return tagValue; + return null; + } + + public static string? GetLanguage(this ITagsContainer tagsContainer) => TryGetTagValue(tagsContainer, "language"); + public static string? GetRotate(this ITagsContainer tagsContainer) => TryGetTagValue(tagsContainer, "rotate"); + public static string? GetDuration(this ITagsContainer tagsContainer) => TryGetTagValue(tagsContainer, "duration"); + + } } diff --git a/FFMpegCore/FFProbe/MediaAnalysis.cs b/FFMpegCore/FFProbe/MediaAnalysis.cs index 1dbf49c..019815a 100644 --- a/FFMpegCore/FFProbe/MediaAnalysis.cs +++ b/FFMpegCore/FFProbe/MediaAnalysis.cs @@ -66,7 +66,8 @@ private VideoStream ParseVideoStream(FFProbeStream stream) Width = stream.Width ?? 0, Profile = stream.Profile, PixelFormat = stream.PixelFormat, - Language = stream.Tags?.Language + Rotation = (int)float.Parse(stream.GetRotate() ?? "0"), + Language = stream.GetLanguage() }; } @@ -74,7 +75,7 @@ private static TimeSpan ParseDuration(FFProbeStream ffProbeStream) { return !string.IsNullOrEmpty(ffProbeStream.Duration) ? TimeSpan.Parse(ffProbeStream.Duration) - : TimeSpan.Parse(TrimTimeSpan(ffProbeStream.Tags?.Duration) ?? "0"); + : TimeSpan.Parse(TrimTimeSpan(ffProbeStream.GetDuration()) ?? "0"); } private static string? TrimTimeSpan(string? durationTag) { @@ -95,7 +96,7 @@ private AudioStream ParseAudioStream(FFProbeStream stream) Duration = ParseDuration(stream), SampleRateHz = !string.IsNullOrEmpty(stream.SampleRate) ? ParseIntInvariant(stream.SampleRate) : default, Profile = stream.Profile, - Language = stream.Tags?.Language + Language = stream.GetLanguage() }; } diff --git a/FFMpegCore/FFProbe/VideoStream.cs b/FFMpegCore/FFProbe/VideoStream.cs index 18533bd..0bcfc09 100644 --- a/FFMpegCore/FFProbe/VideoStream.cs +++ b/FFMpegCore/FFProbe/VideoStream.cs @@ -12,6 +12,7 @@ public class VideoStream : MediaStream public int Height { get; internal set; } public double FrameRate { get; internal set; } public string PixelFormat { get; internal set; } = null!; + public int Rotation { get; set; } public PixelFormat GetPixelFormatInfo() => FFMpeg.GetPixelFormat(PixelFormat); }