aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuke Pulverenti <luke.pulverenti@gmail.com>2013-08-29 22:13:58 -0400
committerLuke Pulverenti <luke.pulverenti@gmail.com>2013-08-29 22:13:58 -0400
commita5fa31cf94eeeeef0240b45e5b273b855d76be69 (patch)
tree7af5b027dc6e083600b473cb7221d983905b9845
parent87c4d447f86ab184c22a7a6dbfe654d2064ac1bf (diff)
better bitrate syncing
-rw-r--r--MediaBrowser.Api/Playback/BaseStreamingService.cs26
-rw-r--r--MediaBrowser.Api/Playback/Hls/BaseHlsService.cs5
-rw-r--r--MediaBrowser.Api/Playback/Hls/VideoHlsService.cs17
-rw-r--r--MediaBrowser.Api/Playback/Progressive/AudioService.cs6
-rw-r--r--MediaBrowser.Api/Playback/Progressive/VideoService.cs19
5 files changed, 51 insertions, 22 deletions
diff --git a/MediaBrowser.Api/Playback/BaseStreamingService.cs b/MediaBrowser.Api/Playback/BaseStreamingService.cs
index c9437b2c3..93197c387 100644
--- a/MediaBrowser.Api/Playback/BaseStreamingService.cs
+++ b/MediaBrowser.Api/Playback/BaseStreamingService.cs
@@ -659,6 +659,32 @@ namespace MediaBrowser.Api.Playback
}
}
+ protected int? GetVideoBitrateParam(StreamState state)
+ {
+ if (state.VideoRequest.VideoBitRate.HasValue)
+ {
+ // Make sure we don't request a bitrate higher than the source
+ var currentBitrate = state.VideoStream == null ? state.VideoRequest.VideoBitRate.Value : state.VideoStream.BitRate ?? state.VideoRequest.VideoBitRate.Value;
+
+ return Math.Min(currentBitrate, state.VideoRequest.VideoBitRate.Value);
+ }
+
+ return null;
+ }
+
+ protected int? GetAudioBitrateParam(StreamState state)
+ {
+ if (state.Request.AudioBitRate.HasValue)
+ {
+ // Make sure we don't request a bitrate higher than the source
+ var currentBitrate = state.AudioStream == null ? state.Request.AudioBitRate.Value : state.AudioStream.BitRate ?? state.Request.AudioBitRate.Value;
+
+ return Math.Min(currentBitrate, state.Request.AudioBitRate.Value);
+ }
+
+ return null;
+ }
+
/// <summary>
/// Gets the user agent param.
/// </summary>
diff --git a/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs b/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs
index d96736c3b..fc98e2a73 100644
--- a/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs
+++ b/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs
@@ -119,7 +119,10 @@ namespace MediaBrowser.Api.Playback.Hls
await WaitForMinimumSegmentCount(playlist, 3).ConfigureAwait(false);
}
- var playlistText = GetMasterPlaylistFileText(playlist, state.VideoRequest.VideoBitRate.Value + state.Request.AudioBitRate.Value);
+ var audioBitrate = GetAudioBitrateParam(state) ?? 0;
+ var videoBitrate = GetVideoBitrateParam(state) ?? 0;
+
+ var playlistText = GetMasterPlaylistFileText(playlist, videoBitrate + audioBitrate);
try
{
diff --git a/MediaBrowser.Api/Playback/Hls/VideoHlsService.cs b/MediaBrowser.Api/Playback/Hls/VideoHlsService.cs
index d8ae656ee..b6937c366 100644
--- a/MediaBrowser.Api/Playback/Hls/VideoHlsService.cs
+++ b/MediaBrowser.Api/Playback/Hls/VideoHlsService.cs
@@ -146,9 +146,11 @@ namespace MediaBrowser.Api.Playback.Hls
args += " -ar " + state.Request.AudioSampleRate.Value;
}
- if (state.Request.AudioBitRate.HasValue)
+ var bitrate = GetAudioBitrateParam(state);
+
+ if (bitrate.HasValue)
{
- args += " -ab " + state.Request.AudioBitRate.Value;
+ args += " -ab " + bitrate.Value.ToString(UsCulture);
}
var volParam = string.Empty;
@@ -187,14 +189,11 @@ namespace MediaBrowser.Api.Playback.Hls
var args = "-codec:v:0 " + codec + " -preset superfast" + keyFrameArg;
- if (state.VideoRequest.VideoBitRate.HasValue)
- {
- // Make sure we don't request a bitrate higher than the source
- var currentBitrate = state.VideoStream == null ? state.VideoRequest.VideoBitRate.Value : state.VideoStream.BitRate ?? state.VideoRequest.VideoBitRate.Value;
-
- var bitrate = Math.Min(currentBitrate, state.VideoRequest.VideoBitRate.Value);
+ var bitrate = GetVideoBitrateParam(state);
- args += string.Format(" -b:v {0}", bitrate);
+ if (bitrate.HasValue)
+ {
+ args += string.Format(" -b:v {0}", bitrate.Value.ToString(UsCulture));
}
// Add resolution params, if specified
diff --git a/MediaBrowser.Api/Playback/Progressive/AudioService.cs b/MediaBrowser.Api/Playback/Progressive/AudioService.cs
index 202318cfe..131bc8702 100644
--- a/MediaBrowser.Api/Playback/Progressive/AudioService.cs
+++ b/MediaBrowser.Api/Playback/Progressive/AudioService.cs
@@ -93,9 +93,11 @@ namespace MediaBrowser.Api.Playback.Progressive
audioTranscodeParams.Add("-strict experimental");
}
- if (request.AudioBitRate.HasValue)
+ var bitrate = GetAudioBitrateParam(state);
+
+ if (bitrate.HasValue)
{
- audioTranscodeParams.Add("-ab " + request.AudioBitRate.Value);
+ audioTranscodeParams.Add("-ab " + bitrate.Value.ToString(UsCulture));
}
var channels = GetNumAudioChannelsParam(request, state.AudioStream);
diff --git a/MediaBrowser.Api/Playback/Progressive/VideoService.cs b/MediaBrowser.Api/Playback/Progressive/VideoService.cs
index b091065b6..d81e91632 100644
--- a/MediaBrowser.Api/Playback/Progressive/VideoService.cs
+++ b/MediaBrowser.Api/Playback/Progressive/VideoService.cs
@@ -236,9 +236,11 @@ namespace MediaBrowser.Api.Playback.Progressive
args += " -ar " + request.AudioSampleRate.Value;
}
- if (request.AudioBitRate.HasValue)
+ var bitrate = GetAudioBitrateParam(state);
+
+ if (bitrate.HasValue)
{
- args += " -ab " + request.AudioBitRate.Value;
+ args += " -ab " + bitrate.Value.ToString(UsCulture);
}
var volParam = string.Empty;
@@ -283,16 +285,13 @@ namespace MediaBrowser.Api.Playback.Progressive
else if (videoCodec.Equals("mpeg4", StringComparison.OrdinalIgnoreCase))
{
args = "-mbd rd -flags +mv4+aic -trellis 2 -cmp 2 -subcmp 2 -bf 2";
- }
-
- if (state.VideoRequest.VideoBitRate.HasValue)
- {
- // Make sure we don't request a bitrate higher than the source
- var currentBitrate = state.VideoStream == null ? state.VideoRequest.VideoBitRate.Value : state.VideoStream.BitRate ?? state.VideoRequest.VideoBitRate.Value;
+ }
- var bitrate = Math.Min(currentBitrate, state.VideoRequest.VideoBitRate.Value);
+ var bitrate = GetVideoBitrateParam(state);
- args += " -b:v " + bitrate;
+ if (bitrate.HasValue)
+ {
+ args += " -b:v " + bitrate.Value.ToString(UsCulture);
}
return args.Trim();