aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Api/Playback/BaseStreamingService.cs
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Api/Playback/BaseStreamingService.cs')
-rw-r--r--MediaBrowser.Api/Playback/BaseStreamingService.cs46
1 files changed, 26 insertions, 20 deletions
diff --git a/MediaBrowser.Api/Playback/BaseStreamingService.cs b/MediaBrowser.Api/Playback/BaseStreamingService.cs
index 36207c8b4..d98e2f3a1 100644
--- a/MediaBrowser.Api/Playback/BaseStreamingService.cs
+++ b/MediaBrowser.Api/Playback/BaseStreamingService.cs
@@ -287,12 +287,18 @@ namespace MediaBrowser.Api.Playback
return threads;
}
- protected string H264Encoder
+ protected string GetH264Encoder(StreamState state)
{
- get
+ if (string.Equals(ApiEntryPoint.Instance.GetEncodingOptions().HardwareVideoDecoder, "qsv", StringComparison.OrdinalIgnoreCase))
{
- return "libx264";
+ // It's currently failing on live tv
+ if (state.RunTimeTicks.HasValue)
+ {
+ return "h264_qsv";
+ }
}
+
+ return "libx264";
}
/// <summary>
@@ -313,7 +319,7 @@ namespace MediaBrowser.Api.Playback
{
param = "-preset superfast";
- param += " -crf 23";
+ param += " -crf 23 -rc-lookahead 0 -muxdelay 0 -refs 1";
}
else if (string.Equals(videoCodec, "libx265", StringComparison.OrdinalIgnoreCase))
@@ -326,7 +332,7 @@ namespace MediaBrowser.Api.Playback
// h264 (h264_qsv)
else if (string.Equals(videoCodec, "h264_qsv", StringComparison.OrdinalIgnoreCase))
{
- param = "-preset 7";
+ param = "-preset 7 -look_ahead 0";
}
@@ -400,8 +406,10 @@ namespace MediaBrowser.Api.Playback
if (!string.IsNullOrEmpty(state.VideoRequest.Level))
{
+ var h264Encoder = GetH264Encoder(state);
+
// h264_qsv and libnvenc expect levels to be expressed as a decimal. libx264 supports decimal and non-decimal format
- if (String.Equals(H264Encoder, "h264_qsv", StringComparison.OrdinalIgnoreCase) || String.Equals(H264Encoder, "libnvenc", StringComparison.OrdinalIgnoreCase))
+ if (String.Equals(h264Encoder, "h264_qsv", StringComparison.OrdinalIgnoreCase) || String.Equals(h264Encoder, "libnvenc", StringComparison.OrdinalIgnoreCase))
{
switch (state.VideoRequest.Level)
{
@@ -561,7 +569,10 @@ namespace MediaBrowser.Api.Playback
if (string.Equals(outputVideoCodec, "h264_qsv", StringComparison.OrdinalIgnoreCase))
{
- filters[filters.Count - 1] += ":flags=fast_bilinear";
+ if (filters.Count > 1)
+ {
+ //filters[filters.Count - 1] += ":flags=fast_bilinear";
+ }
}
var output = string.Empty;
@@ -782,7 +793,7 @@ namespace MediaBrowser.Api.Playback
{
if (string.Equals(codec, "h264", StringComparison.OrdinalIgnoreCase))
{
- return H264Encoder;
+ return GetH264Encoder(state);
}
if (string.Equals(codec, "vpx", StringComparison.OrdinalIgnoreCase))
{
@@ -1416,49 +1427,45 @@ namespace MediaBrowser.Api.Playback
}
else if (i == 16)
{
- request.ClientTime = val;
- }
- else if (i == 17)
- {
if (videoRequest != null)
{
videoRequest.MaxRefFrames = int.Parse(val, UsCulture);
}
}
- else if (i == 18)
+ else if (i == 17)
{
if (videoRequest != null)
{
videoRequest.MaxVideoBitDepth = int.Parse(val, UsCulture);
}
}
- else if (i == 19)
+ else if (i == 18)
{
if (videoRequest != null)
{
videoRequest.Profile = val;
}
}
- else if (i == 20)
+ else if (i == 19)
{
if (videoRequest != null)
{
videoRequest.Cabac = string.Equals("true", val, StringComparison.OrdinalIgnoreCase);
}
}
- else if (i == 21)
+ else if (i == 20)
{
request.PlaySessionId = val;
}
- else if (i == 22)
+ else if (i == 21)
{
// api_key
}
- else if (i == 23)
+ else if (i == 22)
{
request.LiveStreamId = val;
}
- else if (i == 24)
+ else if (i == 23)
{
// Duplicating ItemId because of MediaMonkey
}
@@ -1662,7 +1669,6 @@ namespace MediaBrowser.Api.Playback
state.InputContainer = mediaSource.Container;
state.InputFileSize = mediaSource.Size;
state.InputBitrate = mediaSource.Bitrate;
- state.ReadInputAtNativeFramerate = mediaSource.ReadAtNativeFramerate;
state.RunTimeTicks = mediaSource.RunTimeTicks;
state.RemoteHttpHeaders = mediaSource.RequiredHttpHeaders;