From 51c3f270ae80290da75e48b0e4aa838af72b07b6 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Mon, 19 Oct 2015 12:05:03 -0400 Subject: [PATCH] add codec tag value --- MediaBrowser.Api/Playback/BaseStreamingService.cs | 6 ++++-- MediaBrowser.Api/Playback/StreamState.cs | 11 +++++++++++ MediaBrowser.Dlna/Didl/DidlBuilder.cs | 6 ++++-- MediaBrowser.Dlna/PlayTo/PlayToController.cs | 3 ++- MediaBrowser.MediaEncoding/Encoder/EncodingJob.cs | 11 +++++++++++ .../Encoder/EncodingJobFactory.cs | 3 ++- .../Probing/ProbeResultNormalizer.cs | 1 + MediaBrowser.Model/Dlna/ConditionProcessor.cs | 12 +++++------- MediaBrowser.Model/Dlna/ContentFeatureBuilder.cs | 6 ++++-- MediaBrowser.Model/Dlna/DeviceProfile.cs | 5 +++-- MediaBrowser.Model/Dlna/ProfileConditionValue.cs | 3 ++- MediaBrowser.Model/Dlna/StreamBuilder.cs | 7 +++---- MediaBrowser.Model/Dlna/StreamInfo.cs | 15 +++++++++++++++ MediaBrowser.Model/Entities/MediaStream.cs | 6 ++++++ 14 files changed, 73 insertions(+), 22 deletions(-) diff --git a/MediaBrowser.Api/Playback/BaseStreamingService.cs b/MediaBrowser.Api/Playback/BaseStreamingService.cs index cf84b839fe..36207c8b47 100644 --- a/MediaBrowser.Api/Playback/BaseStreamingService.cs +++ b/MediaBrowser.Api/Playback/BaseStreamingService.cs @@ -1993,7 +1993,8 @@ namespace MediaBrowser.Api.Playback state.IsTargetCabac, state.TargetRefFrames, state.TargetVideoStreamCount, - state.TargetAudioStreamCount); + state.TargetAudioStreamCount, + state.TargetVideoCodecTag); if (mediaProfile != null) { @@ -2090,7 +2091,8 @@ namespace MediaBrowser.Api.Playback state.IsTargetCabac, state.TargetRefFrames, state.TargetVideoStreamCount, - state.TargetAudioStreamCount + state.TargetAudioStreamCount, + state.TargetVideoCodecTag ).FirstOrDefault() ?? string.Empty; } diff --git a/MediaBrowser.Api/Playback/StreamState.cs b/MediaBrowser.Api/Playback/StreamState.cs index fdbe5835ef..d61bb9c0fb 100644 --- a/MediaBrowser.Api/Playback/StreamState.cs +++ b/MediaBrowser.Api/Playback/StreamState.cs @@ -457,6 +457,17 @@ namespace MediaBrowser.Api.Playback } } + public string TargetVideoCodecTag + { + get + { + var stream = VideoStream; + return !Request.Static + ? null + : stream == null ? null : stream.CodecTag; + } + } + public bool? IsTargetAnamorphic { get diff --git a/MediaBrowser.Dlna/Didl/DidlBuilder.cs b/MediaBrowser.Dlna/Didl/DidlBuilder.cs index 8bea14f14e..5589a6e3ba 100644 --- a/MediaBrowser.Dlna/Didl/DidlBuilder.cs +++ b/MediaBrowser.Dlna/Didl/DidlBuilder.cs @@ -163,7 +163,8 @@ namespace MediaBrowser.Dlna.Didl streamInfo.IsTargetCabac, streamInfo.TargetRefFrames, streamInfo.TargetVideoStreamCount, - streamInfo.TargetAudioStreamCount); + streamInfo.TargetAudioStreamCount, + streamInfo.TargetVideoCodecTag); foreach (var contentFeature in contentFeatureList) { @@ -301,7 +302,8 @@ namespace MediaBrowser.Dlna.Didl streamInfo.IsTargetCabac, streamInfo.TargetRefFrames, streamInfo.TargetVideoStreamCount, - streamInfo.TargetAudioStreamCount); + streamInfo.TargetAudioStreamCount, + streamInfo.TargetVideoCodecTag); var filename = url.Substring(0, url.IndexOf('?')); diff --git a/MediaBrowser.Dlna/PlayTo/PlayToController.cs b/MediaBrowser.Dlna/PlayTo/PlayToController.cs index 941b2aecaf..cb3629678f 100644 --- a/MediaBrowser.Dlna/PlayTo/PlayToController.cs +++ b/MediaBrowser.Dlna/PlayTo/PlayToController.cs @@ -525,7 +525,8 @@ namespace MediaBrowser.Dlna.PlayTo streamInfo.IsTargetCabac, streamInfo.TargetRefFrames, streamInfo.TargetVideoStreamCount, - streamInfo.TargetAudioStreamCount); + streamInfo.TargetAudioStreamCount, + streamInfo.TargetVideoCodecTag); return list.FirstOrDefault(); } diff --git a/MediaBrowser.MediaEncoding/Encoder/EncodingJob.cs b/MediaBrowser.MediaEncoding/Encoder/EncodingJob.cs index 47babfd135..07626db334 100644 --- a/MediaBrowser.MediaEncoding/Encoder/EncodingJob.cs +++ b/MediaBrowser.MediaEncoding/Encoder/EncodingJob.cs @@ -368,6 +368,17 @@ namespace MediaBrowser.MediaEncoding.Encoder } } + public string TargetVideoCodecTag + { + get + { + var stream = VideoStream; + return !Options.Static + ? null + : stream == null ? null : stream.CodecTag; + } + } + public bool? IsTargetAnamorphic { get diff --git a/MediaBrowser.MediaEncoding/Encoder/EncodingJobFactory.cs b/MediaBrowser.MediaEncoding/Encoder/EncodingJobFactory.cs index 03dbd07f0f..692fe2b6ad 100644 --- a/MediaBrowser.MediaEncoding/Encoder/EncodingJobFactory.cs +++ b/MediaBrowser.MediaEncoding/Encoder/EncodingJobFactory.cs @@ -750,7 +750,8 @@ namespace MediaBrowser.MediaEncoding.Encoder state.IsTargetCabac, state.TargetRefFrames, state.TargetVideoStreamCount, - state.TargetAudioStreamCount); + state.TargetAudioStreamCount, + state.TargetVideoCodecTag); if (mediaProfile != null) { diff --git a/MediaBrowser.MediaEncoding/Probing/ProbeResultNormalizer.cs b/MediaBrowser.MediaEncoding/Probing/ProbeResultNormalizer.cs index 25a8e4876d..7e9fa151b3 100644 --- a/MediaBrowser.MediaEncoding/Probing/ProbeResultNormalizer.cs +++ b/MediaBrowser.MediaEncoding/Probing/ProbeResultNormalizer.cs @@ -130,6 +130,7 @@ namespace MediaBrowser.MediaEncoding.Probing var stream = new MediaStream { Codec = streamInfo.codec_name, + CodecTag = streamInfo.codec_tag_string, Profile = streamInfo.profile, Level = streamInfo.level, Index = streamInfo.index, diff --git a/MediaBrowser.Model/Dlna/ConditionProcessor.cs b/MediaBrowser.Model/Dlna/ConditionProcessor.cs index fd3df9c769..fef04647a4 100644 --- a/MediaBrowser.Model/Dlna/ConditionProcessor.cs +++ b/MediaBrowser.Model/Dlna/ConditionProcessor.cs @@ -20,15 +20,11 @@ namespace MediaBrowser.Model.Dlna bool? isCabac, int? refFrames, int? numVideoStreams, - int? numAudioStreams) + int? numAudioStreams, + string videoCodecTag) { switch (condition.Property) { - case ProfileConditionValue.AudioProfile: - // TODO: Implement - return true; - case ProfileConditionValue.Has64BitOffsets: - return true; case ProfileConditionValue.IsAnamorphic: return IsConditionSatisfied(condition, isAnamorphic); case ProfileConditionValue.IsCabac: @@ -39,6 +35,8 @@ namespace MediaBrowser.Model.Dlna return IsConditionSatisfied(condition, videoLevel); case ProfileConditionValue.VideoProfile: return IsConditionSatisfied(condition, videoProfile); + case ProfileConditionValue.VideoCodecTag: + return IsConditionSatisfied(condition, videoCodecTag); case ProfileConditionValue.PacketLength: return IsConditionSatisfied(condition, packetLength); case ProfileConditionValue.VideoBitDepth: @@ -58,7 +56,7 @@ namespace MediaBrowser.Model.Dlna case ProfileConditionValue.VideoTimestamp: return IsConditionSatisfied(condition, timestamp); default: - throw new ArgumentException("Unexpected condition on video file: " + condition.Property); + return true; } } diff --git a/MediaBrowser.Model/Dlna/ContentFeatureBuilder.cs b/MediaBrowser.Model/Dlna/ContentFeatureBuilder.cs index 62463d196a..58d669c220 100644 --- a/MediaBrowser.Model/Dlna/ContentFeatureBuilder.cs +++ b/MediaBrowser.Model/Dlna/ContentFeatureBuilder.cs @@ -118,7 +118,8 @@ namespace MediaBrowser.Model.Dlna bool? isCabac, int? refFrames, int? numVideoStreams, - int? numAudioStreams) + int? numAudioStreams, + string videoCodecTag) { // first bit means Time based seek supported, second byte range seek supported (not sure about the order now), so 01 = only byte seek, 10 = time based, 11 = both, 00 = none string orgOp = ";DLNA.ORG_OP=" + DlnaMaps.GetOrgOpValue(runtimeTicks.HasValue, isDirectStream, transcodeSeekInfo); @@ -159,7 +160,8 @@ namespace MediaBrowser.Model.Dlna isCabac, refFrames, numVideoStreams, - numAudioStreams); + numAudioStreams, + videoCodecTag); List orgPnValues = new List(); diff --git a/MediaBrowser.Model/Dlna/DeviceProfile.cs b/MediaBrowser.Model/Dlna/DeviceProfile.cs index fc508991e5..6d4aa34a3c 100644 --- a/MediaBrowser.Model/Dlna/DeviceProfile.cs +++ b/MediaBrowser.Model/Dlna/DeviceProfile.cs @@ -286,7 +286,8 @@ namespace MediaBrowser.Model.Dlna bool? isCabac, int? refFrames, int? numVideoStreams, - int? numAudioStreams) + int? numAudioStreams, + string videoCodecTag) { container = StringHelper.TrimStart((container ?? string.Empty), '.'); @@ -320,7 +321,7 @@ namespace MediaBrowser.Model.Dlna var anyOff = false; foreach (ProfileCondition c in i.Conditions) { - if (!conditionProcessor.IsVideoConditionSatisfied(c, width, height, bitDepth, videoBitrate, videoProfile, videoLevel, videoFramerate, packetLength, timestamp, isAnamorphic, isCabac, refFrames, numVideoStreams, numAudioStreams)) + if (!conditionProcessor.IsVideoConditionSatisfied(c, width, height, bitDepth, videoBitrate, videoProfile, videoLevel, videoFramerate, packetLength, timestamp, isAnamorphic, isCabac, refFrames, numVideoStreams, numAudioStreams, videoCodecTag)) { anyOff = true; break; diff --git a/MediaBrowser.Model/Dlna/ProfileConditionValue.cs b/MediaBrowser.Model/Dlna/ProfileConditionValue.cs index 7563ffb5af..4ad326e519 100644 --- a/MediaBrowser.Model/Dlna/ProfileConditionValue.cs +++ b/MediaBrowser.Model/Dlna/ProfileConditionValue.cs @@ -20,6 +20,7 @@ IsCabac = 15, NumAudioStreams = 16, NumVideoStreams = 17, - IsSecondaryAudio + IsSecondaryAudio = 18, + VideoCodecTag = 19 } } \ No newline at end of file diff --git a/MediaBrowser.Model/Dlna/StreamBuilder.cs b/MediaBrowser.Model/Dlna/StreamBuilder.cs index e23cb89519..1834e24fec 100644 --- a/MediaBrowser.Model/Dlna/StreamBuilder.cs +++ b/MediaBrowser.Model/Dlna/StreamBuilder.cs @@ -571,6 +571,7 @@ namespace MediaBrowser.Model.Dlna float? videoFramerate = videoStream == null ? null : videoStream.AverageFrameRate ?? videoStream.AverageFrameRate; bool? isAnamorphic = videoStream == null ? null : videoStream.IsAnamorphic; bool? isCabac = videoStream == null ? null : videoStream.IsCabac; + string videoCodecTag = videoStream == null ? null : videoStream.CodecTag; int? audioBitrate = audioStream == null ? null : audioStream.BitRate; int? audioChannels = audioStream == null ? null : audioStream.Channels; @@ -586,7 +587,7 @@ namespace MediaBrowser.Model.Dlna // Check container conditions foreach (ProfileCondition i in conditions) { - if (!conditionProcessor.IsVideoConditionSatisfied(i, width, height, bitDepth, videoBitrate, videoProfile, videoLevel, videoFramerate, packetLength, timestamp, isAnamorphic, isCabac, refFrames, numVideoStreams, numAudioStreams)) + if (!conditionProcessor.IsVideoConditionSatisfied(i, width, height, bitDepth, videoBitrate, videoProfile, videoLevel, videoFramerate, packetLength, timestamp, isAnamorphic, isCabac, refFrames, numVideoStreams, numAudioStreams, videoCodecTag)) { LogConditionFailure(profile, "VideoContainerProfile", i, mediaSource); @@ -619,7 +620,7 @@ namespace MediaBrowser.Model.Dlna foreach (ProfileCondition i in conditions) { - if (!conditionProcessor.IsVideoConditionSatisfied(i, width, height, bitDepth, videoBitrate, videoProfile, videoLevel, videoFramerate, packetLength, timestamp, isAnamorphic, isCabac, refFrames, numVideoStreams, numAudioStreams)) + if (!conditionProcessor.IsVideoConditionSatisfied(i, width, height, bitDepth, videoBitrate, videoProfile, videoLevel, videoFramerate, packetLength, timestamp, isAnamorphic, isCabac, refFrames, numVideoStreams, numAudioStreams, videoCodecTag)) { LogConditionFailure(profile, "VideoCodecProfile", i, mediaSource); @@ -966,8 +967,6 @@ namespace MediaBrowser.Model.Dlna } break; } - default: - throw new ArgumentException("Unrecognized ProfileConditionValue"); } } } diff --git a/MediaBrowser.Model/Dlna/StreamInfo.cs b/MediaBrowser.Model/Dlna/StreamInfo.cs index 8f74120972..50d1cdfc84 100644 --- a/MediaBrowser.Model/Dlna/StreamInfo.cs +++ b/MediaBrowser.Model/Dlna/StreamInfo.cs @@ -489,6 +489,21 @@ namespace MediaBrowser.Model.Dlna } } + /// + /// Gets the target video codec tag. + /// + /// The target video codec tag. + public string TargetVideoCodecTag + { + get + { + MediaStream stream = TargetVideoStream; + return !IsDirectStream + ? null + : stream == null ? null : stream.CodecTag; + } + } + /// /// Predicts the audio bitrate that will be in the output stream /// diff --git a/MediaBrowser.Model/Entities/MediaStream.cs b/MediaBrowser.Model/Entities/MediaStream.cs index 519d3a04c5..79d1df9110 100644 --- a/MediaBrowser.Model/Entities/MediaStream.cs +++ b/MediaBrowser.Model/Entities/MediaStream.cs @@ -18,6 +18,12 @@ namespace MediaBrowser.Model.Entities /// The codec. public string Codec { get; set; } + /// + /// Gets or sets the codec tag. + /// + /// The codec tag. + public string CodecTag { get; set; } + /// /// Gets or sets the language. ///