From ac2b358fadcb727ca76851a8bfe396c26b795f22 Mon Sep 17 00:00:00 2001 From: Warrick Wilson Date: Mon, 9 Aug 2021 14:52:39 -0500 Subject: [PATCH] Added CodecTag and CodecTagString properties to info derived from an FFProbe.Analyse() call. This allows for specific codecs to be identified to check compatibility with hardware limitations. --- FFMpegCore.Test/FFProbeTests.cs | 4 ++++ FFMpegCore/FFProbe/FFProbeAnalysis.cs | 6 ++++++ FFMpegCore/FFProbe/MediaAnalysis.cs | 4 ++++ FFMpegCore/FFProbe/MediaStream.cs | 2 ++ 4 files changed, 16 insertions(+) diff --git a/FFMpegCore.Test/FFProbeTests.cs b/FFMpegCore.Test/FFProbeTests.cs index 897848d..7af92cd 100644 --- a/FFMpegCore.Test/FFProbeTests.cs +++ b/FFMpegCore.Test/FFProbeTests.cs @@ -63,6 +63,8 @@ public void Probe_Success() Assert.AreEqual("LC", info.PrimaryAudioStream.Profile); Assert.AreEqual(377351, info.PrimaryAudioStream.BitRate); Assert.AreEqual(48000, info.PrimaryAudioStream.SampleRateHz); + Assert.AreEqual("mp4a", info.PrimaryAudioStream.CodecTagString); + Assert.AreEqual("0x6134706d", info.PrimaryAudioStream.CodecTag); Assert.AreEqual(1471810, info.PrimaryVideoStream!.BitRate); Assert.AreEqual(16, info.PrimaryVideoStream.DisplayAspectRatio.Width); @@ -76,6 +78,8 @@ public void Probe_Success() Assert.AreEqual("h264", info.PrimaryVideoStream.CodecName); Assert.AreEqual(8, info.PrimaryVideoStream.BitsPerRawSample); Assert.AreEqual("Main", info.PrimaryVideoStream.Profile); + Assert.AreEqual("avc1", info.PrimaryVideoStream.CodecTagString); + Assert.AreEqual("0x31637661", info.PrimaryVideoStream.CodecTag); } [TestMethod, Timeout(10000)] diff --git a/FFMpegCore/FFProbe/FFProbeAnalysis.cs b/FFMpegCore/FFProbe/FFProbeAnalysis.cs index a0f2d41..1997cc3 100644 --- a/FFMpegCore/FFProbe/FFProbeAnalysis.cs +++ b/FFMpegCore/FFProbe/FFProbeAnalysis.cs @@ -41,6 +41,12 @@ public class FFProbeStream : ITagsContainer [JsonPropertyName("codec_long_name")] public string CodecLongName { get; set; } = null!; + [JsonPropertyName("codec_tag")] + public string CodecTag { get; set; } = null!; + + [JsonPropertyName("codec_tag_string")] + public string CodecTagString { get; set; } = null!; + [JsonPropertyName("display_aspect_ratio")] public string DisplayAspectRatio { get; set; } = null!; diff --git a/FFMpegCore/FFProbe/MediaAnalysis.cs b/FFMpegCore/FFProbe/MediaAnalysis.cs index d021813..aea714c 100644 --- a/FFMpegCore/FFProbe/MediaAnalysis.cs +++ b/FFMpegCore/FFProbe/MediaAnalysis.cs @@ -56,6 +56,8 @@ private VideoStream ParseVideoStream(FFProbeStream stream) BitsPerRawSample = !string.IsNullOrEmpty(stream.BitsPerRawSample) ? MediaAnalysisUtils.ParseIntInvariant(stream.BitsPerRawSample) : default, CodecName = stream.CodecName, CodecLongName = stream.CodecLongName, + CodecTag = stream.CodecTag, + CodecTagString = stream.CodecTagString, DisplayAspectRatio = MediaAnalysisUtils.ParseRatioInt(stream.DisplayAspectRatio, ':'), Duration = MediaAnalysisUtils.ParseDuration(stream), FrameRate = MediaAnalysisUtils.DivideRatio(MediaAnalysisUtils.ParseRatioDouble(stream.FrameRate, '/')), @@ -77,6 +79,8 @@ private AudioStream ParseAudioStream(FFProbeStream stream) BitRate = !string.IsNullOrEmpty(stream.BitRate) ? MediaAnalysisUtils.ParseIntInvariant(stream.BitRate) : default, CodecName = stream.CodecName, CodecLongName = stream.CodecLongName, + CodecTag = stream.CodecTag, + CodecTagString = stream.CodecTagString, Channels = stream.Channels ?? default, ChannelLayout = stream.ChannelLayout, Duration = MediaAnalysisUtils.ParseDuration(stream), diff --git a/FFMpegCore/FFProbe/MediaStream.cs b/FFMpegCore/FFProbe/MediaStream.cs index 0780c8e..22186c5 100644 --- a/FFMpegCore/FFProbe/MediaStream.cs +++ b/FFMpegCore/FFProbe/MediaStream.cs @@ -10,6 +10,8 @@ public class MediaStream public int Index { get; internal set; } public string CodecName { get; internal set; } = null!; public string CodecLongName { get; internal set; } = null!; + public string CodecTagString { get; set; } = null!; + public string CodecTag { get; set; } = null!; public int BitRate { get; internal set; } public TimeSpan Duration { get; internal set; } public string? Language { get; internal set; }