aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuke Pulverenti <luke.pulverenti@gmail.com>2014-04-02 00:10:46 -0400
committerLuke Pulverenti <luke.pulverenti@gmail.com>2014-04-02 00:10:46 -0400
commit6fe7264f7828aff196e19cfa3497835c5921a7f9 (patch)
tree75ef8f32fc4b7359cc48f45be58216491d624b93
parent21308be83fd8678dc1030c6493762f09828b1d2d (diff)
add automatic stream copy for hls
-rw-r--r--MediaBrowser.Api/Playback/BaseStreamingService.cs107
-rw-r--r--MediaBrowser.Api/Playback/Hls/VideoHlsService.cs8
-rw-r--r--MediaBrowser.MediaEncoding/Encoder/EncodingUtils.cs4
3 files changed, 115 insertions, 4 deletions
diff --git a/MediaBrowser.Api/Playback/BaseStreamingService.cs b/MediaBrowser.Api/Playback/BaseStreamingService.cs
index 418a9c9ba..297bbad5c 100644
--- a/MediaBrowser.Api/Playback/BaseStreamingService.cs
+++ b/MediaBrowser.Api/Playback/BaseStreamingService.cs
@@ -309,9 +309,9 @@ namespace MediaBrowser.Api.Playback
case EncodingQuality.HighSpeed:
return 2;
case EncodingQuality.HighQuality:
- return 2;
+ return isWebm ? Math.Max(Environment.ProcessorCount - 1, 1) : 0;
case EncodingQuality.MaxQuality:
- return isWebm ? 2 : 0;
+ return isWebm ? Math.Max(Environment.ProcessorCount - 1, 1) : 0;
default:
throw new Exception("Unrecognized MediaEncodingQuality value.");
}
@@ -1499,9 +1499,112 @@ namespace MediaBrowser.Api.Playback
ApplyDeviceProfileSettings(state);
+ if (videoRequest != null && state.VideoStream != null)
+ {
+ if (CanStreamCopyVideo(videoRequest, state.VideoStream, state.VideoType))
+ {
+ videoRequest.VideoCodec = "copy";
+ }
+ }
+
return state;
}
+ private bool CanStreamCopyVideo(VideoStreamRequest request, MediaStream videoStream, VideoType videoType)
+ {
+ if (videoStream.IsInterlaced)
+ {
+ return false;
+ }
+
+ // Not going to attempt this with folder rips
+ if (videoType != VideoType.VideoFile)
+ {
+ return false;
+ }
+
+ // Source and target codecs must match
+ if (!string.Equals(request.VideoCodec, videoStream.Codec, StringComparison.OrdinalIgnoreCase))
+ {
+ return false;
+ }
+
+ // If client is requesting a specific video profile, it must match the source
+ if (!string.IsNullOrEmpty(request.Profile) && !string.Equals(request.Profile, videoStream.Profile))
+ {
+ return false;
+ }
+
+ // Video width must fall within requested value
+ if (request.MaxWidth.HasValue)
+ {
+ if (!videoStream.Width.HasValue || videoStream.Width.Value > request.MaxWidth.Value)
+ {
+ return false;
+ }
+ }
+
+ // Video height must fall within requested value
+ if (request.MaxHeight.HasValue)
+ {
+ if (!videoStream.Height.HasValue || videoStream.Height.Value > request.MaxHeight.Value)
+ {
+ return false;
+ }
+ }
+
+ // Video framerate must fall within requested value
+ var requestedFramerate = request.MaxFramerate ?? request.Framerate;
+ if (requestedFramerate.HasValue)
+ {
+ var videoFrameRate = videoStream.AverageFrameRate ?? videoStream.RealFrameRate;
+
+ if (!videoFrameRate.HasValue || videoFrameRate.Value > requestedFramerate.Value)
+ {
+ return false;
+ }
+ }
+
+ // Video bitrate must fall within requested value
+ if (request.VideoBitRate.HasValue)
+ {
+ if (!videoStream.BitRate.HasValue || videoStream.BitRate.Value > request.VideoBitRate.Value)
+ {
+ return false;
+ }
+ }
+
+ // If a specific level was requested, the source must match or be less than
+ if (!string.IsNullOrEmpty(request.Level))
+ {
+ double requestLevel;
+
+ if (double.TryParse(request.Level, NumberStyles.Any, UsCulture, out requestLevel))
+ {
+ if (!videoStream.Level.HasValue)
+ {
+ return false;
+ }
+
+ if (videoStream.Level.Value > requestLevel)
+ {
+ return false;
+ }
+ }
+ return false;
+ }
+
+ return SupportsAutomaticVideoStreamCopy;
+ }
+
+ protected virtual bool SupportsAutomaticVideoStreamCopy
+ {
+ get
+ {
+ return false;
+ }
+ }
+
private void ApplyDeviceProfileSettings(StreamState state)
{
var headers = new Dictionary<string, string>();
diff --git a/MediaBrowser.Api/Playback/Hls/VideoHlsService.cs b/MediaBrowser.Api/Playback/Hls/VideoHlsService.cs
index 1bca4cae9..bedf742c2 100644
--- a/MediaBrowser.Api/Playback/Hls/VideoHlsService.cs
+++ b/MediaBrowser.Api/Playback/Hls/VideoHlsService.cs
@@ -98,6 +98,14 @@ namespace MediaBrowser.Api.Playback.Hls
ApiEntryPoint.Instance.OnTranscodeEndRequest(playlist, TranscodingJobType.Hls);
}
+ protected override bool SupportsAutomaticVideoStreamCopy
+ {
+ get
+ {
+ return true;
+ }
+ }
+
/// <summary>
/// Gets the specified request.
/// </summary>
diff --git a/MediaBrowser.MediaEncoding/Encoder/EncodingUtils.cs b/MediaBrowser.MediaEncoding/Encoder/EncodingUtils.cs
index 4a9023c7f..95ad488fc 100644
--- a/MediaBrowser.MediaEncoding/Encoder/EncodingUtils.cs
+++ b/MediaBrowser.MediaEncoding/Encoder/EncodingUtils.cs
@@ -224,9 +224,9 @@ namespace MediaBrowser.MediaEncoding.Encoder
case EncodingQuality.HighSpeed:
return 2;
case EncodingQuality.HighQuality:
- return 2;
+ return isWebm ? Math.Max(Environment.ProcessorCount - 1, 1) : 0;
case EncodingQuality.MaxQuality:
- return isWebm ? 2 : 0;
+ return isWebm ? Math.Max(Environment.ProcessorCount - 1, 1) : 0;
default:
throw new Exception("Unrecognized MediaEncodingQuality value.");
}