Clean up last bits

This commit is contained in:
Bond_009 2019-01-20 12:03:05 +01:00
parent 37be6c87eb
commit 06d9423f00

View File

@ -761,21 +761,21 @@ namespace MediaBrowser.Model.Dlna
bool applyConditions = true; bool applyConditions = true;
foreach (ProfileCondition applyCondition in i.ApplyConditions) foreach (ProfileCondition applyCondition in i.ApplyConditions)
{ {
int? width = videoStream == null ? null : videoStream.Width; int? width = videoStream?.Width;
int? height = videoStream == null ? null : videoStream.Height; int? height = videoStream?.Height;
int? bitDepth = videoStream == null ? null : videoStream.BitDepth; int? bitDepth = videoStream?.BitDepth;
int? videoBitrate = videoStream == null ? null : videoStream.BitRate; int? videoBitrate = videoStream?.BitRate;
double? videoLevel = videoStream == null ? null : videoStream.Level; double? videoLevel = videoStream?.Level;
string videoProfile = videoStream == null ? null : videoStream.Profile; string videoProfile = videoStream?.Profile;
float videoFramerate = videoStream == null ? 0 : videoStream.AverageFrameRate ?? videoStream.AverageFrameRate ?? 0; float videoFramerate = videoStream == null ? 0 : videoStream.AverageFrameRate ?? videoStream.AverageFrameRate ?? 0;
bool? isAnamorphic = videoStream == null ? null : videoStream.IsAnamorphic; bool? isAnamorphic = videoStream?.IsAnamorphic;
bool? isInterlaced = videoStream == null ? (bool?)null : videoStream.IsInterlaced; bool? isInterlaced = videoStream?.IsInterlaced;
string videoCodecTag = videoStream == null ? null : videoStream.CodecTag; string videoCodecTag = videoStream?.CodecTag;
bool? isAvc = videoStream == null ? null : videoStream.IsAVC; bool? isAvc = videoStream?.IsAVC;
TransportStreamTimestamp? timestamp = videoStream == null ? TransportStreamTimestamp.None : item.Timestamp; TransportStreamTimestamp? timestamp = videoStream == null ? TransportStreamTimestamp.None : item.Timestamp;
int? packetLength = videoStream == null ? null : videoStream.PacketLength; int? packetLength = videoStream?.PacketLength;
int? refFrames = videoStream == null ? null : videoStream.RefFrames; int? refFrames = videoStream?.RefFrames;
int? numAudioStreams = item.GetStreamCount(MediaStreamType.Audio); int? numAudioStreams = item.GetStreamCount(MediaStreamType.Audio);
int? numVideoStreams = item.GetStreamCount(MediaStreamType.Video); int? numVideoStreams = item.GetStreamCount(MediaStreamType.Video);
@ -870,7 +870,7 @@ namespace MediaBrowser.Model.Dlna
return playlistItem; return playlistItem;
} }
private int GetDefaultAudioBitrateIfUnknown(MediaStream audioStream) private static int GetDefaultAudioBitrateIfUnknown(MediaStream audioStream)
{ {
if ((audioStream.Channels ?? 0) >= 6) if ((audioStream.Channels ?? 0) >= 6)
{ {
@ -880,35 +880,39 @@ namespace MediaBrowser.Model.Dlna
return 192000; return 192000;
} }
private int GetAudioBitrate(string subProtocol, long maxTotalBitrate, string[] targetAudioCodecs, MediaStream audioStream, StreamInfo item) private static int GetAudioBitrate(string subProtocol, long maxTotalBitrate, string[] targetAudioCodecs, MediaStream audioStream, StreamInfo item)
{ {
var targetAudioCodec = targetAudioCodecs.Length == 0 ? null : targetAudioCodecs[0]; string targetAudioCodec = targetAudioCodecs.Length == 0 ? null : targetAudioCodecs[0];
var targetAudioChannels = item.GetTargetAudioChannels(targetAudioCodec); int? targetAudioChannels = item.GetTargetAudioChannels(targetAudioCodec);
int defaultBitrate = audioStream == null ? 192000 : audioStream.BitRate ?? GetDefaultAudioBitrateIfUnknown(audioStream);
// Reduce the bitrate if we're downmixing
if (targetAudioChannels.HasValue && audioStream != null && audioStream.Channels.HasValue && targetAudioChannels.Value < audioStream.Channels.Value)
{
defaultBitrate = targetAudioChannels.Value <= 2 ? 128000 : 192000;
}
int defaultBitrate;
int encoderAudioBitrateLimit = int.MaxValue; int encoderAudioBitrateLimit = int.MaxValue;
if (audioStream != null) if (audioStream == null)
{ {
defaultBitrate = 192000;
}
else
{
if (targetAudioChannels.HasValue && audioStream.Channels.HasValue && targetAudioChannels.Value < audioStream.Channels.Value)
{
// Reduce the bitrate if we're downmixing
defaultBitrate = targetAudioChannels.Value <= 2 ? 128000 : 192000;
}
else
{
defaultBitrate = audioStream.BitRate ?? GetDefaultAudioBitrateIfUnknown(audioStream);
}
// Seeing webm encoding failures when source has 1 audio channel and 22k bitrate. // Seeing webm encoding failures when source has 1 audio channel and 22k bitrate.
// Any attempts to transcode over 64k will fail // Any attempts to transcode over 64k will fail
if (audioStream.Channels.HasValue && if (audioStream.Channels == 1
audioStream.Channels.Value == 1) && (audioStream.BitRate ?? 0) < 64000)
{
if ((audioStream.BitRate ?? 0) < 64000)
{ {
encoderAudioBitrateLimit = 64000; encoderAudioBitrateLimit = 64000;
} }
} }
}
if (maxTotalBitrate > 0) if (maxTotalBitrate > 0)
{ {
@ -918,19 +922,17 @@ namespace MediaBrowser.Model.Dlna
return Math.Min(defaultBitrate, encoderAudioBitrateLimit); return Math.Min(defaultBitrate, encoderAudioBitrateLimit);
} }
private int GetMaxAudioBitrateForTotalBitrate(long totalBitrate) private static int GetMaxAudioBitrateForTotalBitrate(long totalBitrate)
{ {
if (totalBitrate <= 640000) if (totalBitrate <= 640000)
{ {
return 128000; return 128000;
} }
else if (totalBitrate <= 2000000)
if (totalBitrate <= 2000000)
{ {
return 384000; return 384000;
} }
else if (totalBitrate <= 3000000)
if (totalBitrate <= 3000000)
{ {
return 448000; return 448000;
} }
@ -938,24 +940,25 @@ namespace MediaBrowser.Model.Dlna
return 640000; return 640000;
} }
private Tuple<PlayMethod?, List<TranscodeReason>> GetVideoDirectPlayProfile(VideoOptions options, private (PlayMethod?, List<TranscodeReason>) GetVideoDirectPlayProfile(
VideoOptions options,
MediaSourceInfo mediaSource, MediaSourceInfo mediaSource,
MediaStream videoStream, MediaStream videoStream,
MediaStream audioStream, MediaStream audioStream,
bool isEligibleForDirectPlay, bool isEligibleForDirectPlay,
bool isEligibleForDirectStream) bool isEligibleForDirectStream)
{ {
DeviceProfile profile = options.Profile;
if (options.ForceDirectPlay) if (options.ForceDirectPlay)
{ {
return new Tuple<PlayMethod?, List<TranscodeReason>>(PlayMethod.DirectPlay, new List<TranscodeReason>()); return (PlayMethod.DirectPlay, new List<TranscodeReason>());
} }
if (options.ForceDirectStream) if (options.ForceDirectStream)
{ {
return new Tuple<PlayMethod?, List<TranscodeReason>>(PlayMethod.DirectStream, new List<TranscodeReason>()); return (PlayMethod.DirectStream, new List<TranscodeReason>());
} }
DeviceProfile profile = options.Profile;
// See if it can be direct played // See if it can be direct played
DirectPlayProfile directPlay = null; DirectPlayProfile directPlay = null;
foreach (var i in profile.DirectPlayProfiles) foreach (var i in profile.DirectPlayProfiles)
@ -973,7 +976,7 @@ namespace MediaBrowser.Model.Dlna
profile.Name ?? "Unknown Profile", profile.Name ?? "Unknown Profile",
mediaSource.Path ?? "Unknown path"); mediaSource.Path ?? "Unknown path");
return new Tuple<PlayMethod?, List<TranscodeReason>>(null, GetTranscodeReasonsFromDirectPlayProfile(mediaSource, videoStream, audioStream, profile.DirectPlayProfiles)); return (null, GetTranscodeReasonsFromDirectPlayProfile(mediaSource, videoStream, audioStream, profile.DirectPlayProfiles));
} }
string container = mediaSource.Container; string container = mediaSource.Container;
@ -981,8 +984,8 @@ namespace MediaBrowser.Model.Dlna
var conditions = new List<ProfileCondition>(); var conditions = new List<ProfileCondition>();
foreach (var i in profile.ContainerProfiles) foreach (var i in profile.ContainerProfiles)
{ {
if (i.Type == DlnaProfileType.Video && if (i.Type == DlnaProfileType.Video
i.ContainsContainer(container)) && i.ContainsContainer(container))
{ {
foreach (var c in i.Conditions) foreach (var c in i.Conditions)
{ {
@ -1026,13 +1029,13 @@ namespace MediaBrowser.Model.Dlna
var transcodeReason = GetTranscodeReasonForFailedCondition(i); var transcodeReason = GetTranscodeReasonForFailedCondition(i);
var transcodeReasons = transcodeReason.HasValue var transcodeReasons = transcodeReason.HasValue
? new List<TranscodeReason> { transcodeReason.Value } ? new List<TranscodeReason> { transcodeReason.Value }
: new List<TranscodeReason> { }; : new List<TranscodeReason>();
return new Tuple<PlayMethod?, List<TranscodeReason>>(null, transcodeReasons); return (null, transcodeReasons);
} }
} }
string videoCodec = videoStream == null ? null : videoStream.Codec; string videoCodec = videoStream?.Codec;
conditions = new List<ProfileCondition>(); conditions = new List<ProfileCondition>();
foreach (var i in profile.CodecProfiles) foreach (var i in profile.CodecProfiles)
@ -1071,14 +1074,13 @@ namespace MediaBrowser.Model.Dlna
? new List<TranscodeReason> { transcodeReason.Value } ? new List<TranscodeReason> { transcodeReason.Value }
: new List<TranscodeReason>(); : new List<TranscodeReason>();
return new Tuple<PlayMethod?, List<TranscodeReason>>(null, transcodeReasons); return (null, transcodeReasons);
} }
} }
if (audioStream != null) if (audioStream != null)
{ {
string audioCodec = audioStream.Codec; string audioCodec = audioStream.Codec;
conditions = new List<ProfileCondition>(); conditions = new List<ProfileCondition>();
bool? isSecondaryAudio = audioStream == null ? null : mediaSource.IsSecondaryAudio(audioStream); bool? isSecondaryAudio = audioStream == null ? null : mediaSource.IsSecondaryAudio(audioStream);
@ -1118,17 +1120,17 @@ namespace MediaBrowser.Model.Dlna
? new List<TranscodeReason> { transcodeReason.Value } ? new List<TranscodeReason> { transcodeReason.Value }
: new List<TranscodeReason>(); : new List<TranscodeReason>();
return new Tuple<PlayMethod?, List<TranscodeReason>>(null, transcodeReasons); return (null, transcodeReasons);
} }
} }
} }
if (isEligibleForDirectStream && mediaSource.SupportsDirectStream) if (isEligibleForDirectStream && mediaSource.SupportsDirectStream)
{ {
return new Tuple<PlayMethod?, List<TranscodeReason>>(PlayMethod.DirectStream, new List<TranscodeReason>()); return (PlayMethod.DirectStream, new List<TranscodeReason>());
} }
return new Tuple<PlayMethod?, List<TranscodeReason>>(null, new List<TranscodeReason> { TranscodeReason.ContainerBitrateExceedsLimit }); return (null, new List<TranscodeReason> { TranscodeReason.ContainerBitrateExceedsLimit });
} }
private void LogConditionFailure(DeviceProfile profile, string type, ProfileCondition condition, MediaSourceInfo mediaSource) private void LogConditionFailure(DeviceProfile profile, string type, ProfileCondition condition, MediaSourceInfo mediaSource)
@ -1166,7 +1168,14 @@ namespace MediaBrowser.Model.Dlna
return (result, result ? (TranscodeReason?)null : TranscodeReason.ContainerBitrateExceedsLimit); return (result, result ? (TranscodeReason?)null : TranscodeReason.ContainerBitrateExceedsLimit);
} }
public static SubtitleProfile GetSubtitleProfile(MediaSourceInfo mediaSource, MediaStream subtitleStream, SubtitleProfile[] subtitleProfiles, PlayMethod playMethod, ITranscoderSupport transcoderSupport, string outputContainer, string transcodingSubProtocol) public static SubtitleProfile GetSubtitleProfile(
MediaSourceInfo mediaSource,
MediaStream subtitleStream,
SubtitleProfile[] subtitleProfiles,
PlayMethod playMethod,
ITranscoderSupport transcoderSupport,
string outputContainer,
string transcodingSubProtocol)
{ {
if (!subtitleStream.IsExternal && (playMethod != PlayMethod.Transcode || !string.Equals(transcodingSubProtocol, "hls", StringComparison.OrdinalIgnoreCase))) if (!subtitleStream.IsExternal && (playMethod != PlayMethod.Transcode || !string.Equals(transcodingSubProtocol, "hls", StringComparison.OrdinalIgnoreCase)))
{ {
@ -1249,15 +1258,15 @@ namespace MediaBrowser.Model.Dlna
{ {
return false; return false;
} }
if (ContainerProfile.ContainsContainer(normalizedContainers, "mpegts")) else if (ContainerProfile.ContainsContainer(normalizedContainers, "mpegts"))
{ {
return false; return false;
} }
if (ContainerProfile.ContainsContainer(normalizedContainers, "mp4")) else if (ContainerProfile.ContainsContainer(normalizedContainers, "mp4"))
{ {
return false; return false;
} }
if (ContainerProfile.ContainsContainer(normalizedContainers, "mkv") || else if (ContainerProfile.ContainsContainer(normalizedContainers, "mkv") ||
ContainerProfile.ContainsContainer(normalizedContainers, "matroska")) ContainerProfile.ContainsContainer(normalizedContainers, "matroska"))
{ {
return true; return true;
@ -1330,10 +1339,10 @@ namespace MediaBrowser.Model.Dlna
return true; return true;
} }
var requestedMaxBitrate = maxBitrate > 0 ? maxBitrate : 1000000; long requestedMaxBitrate = maxBitrate > 0 ? maxBitrate : 1000000;
// If we don't know the bitrate, then force a transcode if requested max bitrate is under 40 mbps // If we don't know the bitrate, then force a transcode if requested max bitrate is under 40 mbps
var itemBitrate = item.Bitrate ?? 40000000; int itemBitrate = item.Bitrate ?? 40000000;
if (itemBitrate > requestedMaxBitrate) if (itemBitrate > requestedMaxBitrate)
{ {
@ -1345,7 +1354,7 @@ namespace MediaBrowser.Model.Dlna
return true; return true;
} }
private void ValidateInput(VideoOptions options) private static void ValidateInput(VideoOptions options)
{ {
ValidateAudioInput(options); ValidateAudioInput(options);
@ -1360,7 +1369,7 @@ namespace MediaBrowser.Model.Dlna
} }
} }
private void ValidateAudioInput(AudioOptions options) private static void ValidateAudioInput(AudioOptions options)
{ {
if (options.ItemId.Equals(Guid.Empty)) if (options.ItemId.Equals(Guid.Empty))
{ {
@ -1380,32 +1389,6 @@ namespace MediaBrowser.Model.Dlna
} }
} }
private void ApplyTranscodingConditions(StreamInfo item, List<CodecProfile> codecProfiles)
{
foreach (var profile in codecProfiles)
{
ApplyTranscodingConditions(item, profile);
}
}
private void ApplyTranscodingConditions(StreamInfo item, CodecProfile codecProfile)
{
var codecs = ContainerProfile.SplitValue(codecProfile.Codec);
if (codecs.Length == 0)
{
ApplyTranscodingConditions(item, codecProfile.Conditions, null, true, true);
return;
}
var enableNonQualified = true;
foreach (var codec in codecs)
{
ApplyTranscodingConditions(item, codecProfile.Conditions, codec, true, enableNonQualified);
enableNonQualified = false;
}
}
private void ApplyTranscodingConditions(StreamInfo item, IEnumerable<ProfileCondition> conditions, string qualifier, bool enableQualifiedConditions, bool enableNonQualifiedConditions) private void ApplyTranscodingConditions(StreamInfo item, IEnumerable<ProfileCondition> conditions, string qualifier, bool enableQualifiedConditions, bool enableNonQualifiedConditions)
{ {
foreach (ProfileCondition condition in conditions) foreach (ProfileCondition condition in conditions)
@ -1780,7 +1763,7 @@ namespace MediaBrowser.Model.Dlna
} }
} }
private bool IsAudioDirectPlaySupported(DirectPlayProfile profile, MediaSourceInfo item, MediaStream audioStream) private static bool IsAudioDirectPlaySupported(DirectPlayProfile profile, MediaSourceInfo item, MediaStream audioStream)
{ {
// Check container type // Check container type
if (!profile.SupportsContainer(item.Container)) if (!profile.SupportsContainer(item.Container))
@ -1789,7 +1772,7 @@ namespace MediaBrowser.Model.Dlna
} }
// Check audio codec // Check audio codec
string audioCodec = audioStream == null ? null : audioStream.Codec; string audioCodec = audioStream?.Codec;
if (!profile.SupportsAudioCodec(audioCodec)) if (!profile.SupportsAudioCodec(audioCodec))
{ {
return false; return false;
@ -1807,21 +1790,17 @@ namespace MediaBrowser.Model.Dlna
} }
// Check video codec // Check video codec
string videoCodec = videoStream == null ? null : videoStream.Codec; string videoCodec = videoStream?.Codec;
if (!profile.SupportsVideoCodec(videoCodec)) if (!profile.SupportsVideoCodec(videoCodec))
{ {
return false; return false;
} }
// Check audio codec // Check audio codec
if (audioStream != null) if (audioStream != null && !profile.SupportsAudioCodec(audioStream.Codec))
{
string audioCodec = audioStream == null ? null : audioStream.Codec;
if (!profile.SupportsAudioCodec(audioCodec))
{ {
return false; return false;
} }
}
return true; return true;
} }