aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--MediaBrowser.Api/Playback/BaseStreamingService.cs29
-rw-r--r--MediaBrowser.Api/Playback/StreamState.cs5
-rw-r--r--MediaBrowser.Controller/MediaEncoding/IMediaEncoder.cs1
-rw-r--r--MediaBrowser.MediaEncoding/Encoder/EncoderValidator.cs1
-rw-r--r--MediaBrowser.MediaEncoding/Encoder/EncodingJobFactory.cs47
-rw-r--r--MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs4
-rw-r--r--MediaBrowser.MediaEncoding/Encoder/VideoEncoder.cs2
-rw-r--r--MediaBrowser.MediaEncoding/Probing/ProbeResultNormalizer.cs3
-rw-r--r--MediaBrowser.Server.Implementations/Library/LibraryManager.cs12
-rw-r--r--MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs20
10 files changed, 80 insertions, 44 deletions
diff --git a/MediaBrowser.Api/Playback/BaseStreamingService.cs b/MediaBrowser.Api/Playback/BaseStreamingService.cs
index a5f78420c..164d607d2 100644
--- a/MediaBrowser.Api/Playback/BaseStreamingService.cs
+++ b/MediaBrowser.Api/Playback/BaseStreamingService.cs
@@ -286,28 +286,41 @@ namespace MediaBrowser.Api.Playback
protected string GetH264Encoder(StreamState state)
{
+ var defaultEncoder = "libx264";
+
// Only use alternative encoders for video files.
// When using concat with folder rips, if the mfx session fails to initialize, ffmpeg will be stuck retrying and will not exit gracefully
// Since transcoding of folder rips is expiremental anyway, it's not worth adding additional variables such as this.
if (state.VideoType == VideoType.VideoFile)
{
- if (string.Equals(ApiEntryPoint.Instance.GetEncodingOptions().HardwareAccelerationType, "qsv", StringComparison.OrdinalIgnoreCase) ||
- string.Equals(ApiEntryPoint.Instance.GetEncodingOptions().HardwareAccelerationType, "h264_qsv", StringComparison.OrdinalIgnoreCase))
+ var hwType = ApiEntryPoint.Instance.GetEncodingOptions().HardwareAccelerationType;
+
+ if (string.Equals(hwType, "qsv", StringComparison.OrdinalIgnoreCase) ||
+ string.Equals(hwType, "h264_qsv", StringComparison.OrdinalIgnoreCase))
{
- return "h264_qsv";
+ return GetAvailableEncoder("h264_qsv", defaultEncoder);
}
- if (string.Equals(ApiEntryPoint.Instance.GetEncodingOptions().HardwareAccelerationType, "nvenc", StringComparison.OrdinalIgnoreCase))
+ if (string.Equals(hwType, "nvenc", StringComparison.OrdinalIgnoreCase))
{
- return "h264_nvenc";
+ return GetAvailableEncoder("h264_nvenc", defaultEncoder);
}
- if (string.Equals(ApiEntryPoint.Instance.GetEncodingOptions().HardwareAccelerationType, "h264_omx", StringComparison.OrdinalIgnoreCase))
+ if (string.Equals(hwType, "h264_omx", StringComparison.OrdinalIgnoreCase))
{
- return "h264_omx";
+ return GetAvailableEncoder("h264_omx", defaultEncoder);
}
}
- return "libx264";
+ return defaultEncoder;
+ }
+
+ private string GetAvailableEncoder(string preferredEncoder, string defaultEncoder)
+ {
+ if (MediaEncoder.SupportsEncoder(preferredEncoder))
+ {
+ return preferredEncoder;
+ }
+ return defaultEncoder;
}
/// <summary>
diff --git a/MediaBrowser.Api/Playback/StreamState.cs b/MediaBrowser.Api/Playback/StreamState.cs
index d97169fa5..d7d94c69b 100644
--- a/MediaBrowser.Api/Playback/StreamState.cs
+++ b/MediaBrowser.Api/Playback/StreamState.cs
@@ -80,7 +80,10 @@ namespace MediaBrowser.Api.Playback
{
return 10;
}
- if (userAgent.IndexOf("cfnetwork", StringComparison.OrdinalIgnoreCase) != -1)
+ if (userAgent.IndexOf("cfnetwork", StringComparison.OrdinalIgnoreCase) != -1 ||
+ userAgent.IndexOf("ipad", StringComparison.OrdinalIgnoreCase) != -1 ||
+ userAgent.IndexOf("iphone", StringComparison.OrdinalIgnoreCase) != -1 ||
+ userAgent.IndexOf("ipod", StringComparison.OrdinalIgnoreCase) != -1)
{
return 10;
}
diff --git a/MediaBrowser.Controller/MediaEncoding/IMediaEncoder.cs b/MediaBrowser.Controller/MediaEncoding/IMediaEncoder.cs
index 05e82a16e..1fef8bead 100644
--- a/MediaBrowser.Controller/MediaEncoding/IMediaEncoder.cs
+++ b/MediaBrowser.Controller/MediaEncoding/IMediaEncoder.cs
@@ -133,5 +133,6 @@ namespace MediaBrowser.Controller.MediaEncoding
Task Init();
Task UpdateEncoderPath(string path, string pathType);
+ bool SupportsEncoder(string encoder);
}
}
diff --git a/MediaBrowser.MediaEncoding/Encoder/EncoderValidator.cs b/MediaBrowser.MediaEncoding/Encoder/EncoderValidator.cs
index 50df08e66..5d3db612f 100644
--- a/MediaBrowser.MediaEncoding/Encoder/EncoderValidator.cs
+++ b/MediaBrowser.MediaEncoding/Encoder/EncoderValidator.cs
@@ -86,6 +86,7 @@ namespace MediaBrowser.MediaEncoding.Encoder
"srt",
"h264_nvenc",
"h264_qsv",
+ "h264_omx",
"ac3"
};
diff --git a/MediaBrowser.MediaEncoding/Encoder/EncodingJobFactory.cs b/MediaBrowser.MediaEncoding/Encoder/EncodingJobFactory.cs
index 7c4b7fc2f..ba7b14950 100644
--- a/MediaBrowser.MediaEncoding/Encoder/EncodingJobFactory.cs
+++ b/MediaBrowser.MediaEncoding/Encoder/EncodingJobFactory.cs
@@ -522,10 +522,8 @@ namespace MediaBrowser.MediaEncoding.Encoder
/// <summary>
/// Gets the name of the output video codec
/// </summary>
- /// <param name="state">The state.</param>
- /// <param name="options">The options.</param>
/// <returns>System.String.</returns>
- internal static string GetVideoEncoder(EncodingJob state, EncodingOptions options)
+ internal static string GetVideoEncoder(IMediaEncoder mediaEncoder, EncodingJob state, EncodingOptions options)
{
var codec = state.OutputVideoCodec;
@@ -533,7 +531,7 @@ namespace MediaBrowser.MediaEncoding.Encoder
{
if (string.Equals(codec, "h264", StringComparison.OrdinalIgnoreCase))
{
- return GetH264Encoder(state, options);
+ return GetH264Encoder(mediaEncoder, state, options);
}
if (string.Equals(codec, "vpx", StringComparison.OrdinalIgnoreCase))
{
@@ -554,24 +552,43 @@ namespace MediaBrowser.MediaEncoding.Encoder
return "copy";
}
- internal static string GetH264Encoder(EncodingJob state, EncodingOptions options)
+ private static string GetAvailableEncoder(IMediaEncoder mediaEncoder, string preferredEncoder, string defaultEncoder)
{
- if (string.Equals(options.HardwareAccelerationType, "qsv", StringComparison.OrdinalIgnoreCase) ||
- string.Equals(options.HardwareAccelerationType, "h264_qsv", StringComparison.OrdinalIgnoreCase))
+ if (mediaEncoder.SupportsEncoder(preferredEncoder))
{
- return "h264_qsv";
+ return preferredEncoder;
}
+ return defaultEncoder;
+ }
- if (string.Equals(options.HardwareAccelerationType, "nvenc", StringComparison.OrdinalIgnoreCase))
- {
- return "h264_nvenc";
- }
- if (string.Equals(options.HardwareAccelerationType, "h264_omx", StringComparison.OrdinalIgnoreCase))
+ internal static string GetH264Encoder(IMediaEncoder mediaEncoder, EncodingJob state, EncodingOptions options)
+ {
+ var defaultEncoder = "libx264";
+
+ // Only use alternative encoders for video files.
+ // When using concat with folder rips, if the mfx session fails to initialize, ffmpeg will be stuck retrying and will not exit gracefully
+ // Since transcoding of folder rips is expiremental anyway, it's not worth adding additional variables such as this.
+ if (state.VideoType == VideoType.VideoFile)
{
- return "h264_omx";
+ var hwType = options.HardwareAccelerationType;
+
+ if (string.Equals(hwType, "qsv", StringComparison.OrdinalIgnoreCase) ||
+ string.Equals(hwType, "h264_qsv", StringComparison.OrdinalIgnoreCase))
+ {
+ return GetAvailableEncoder(mediaEncoder, "h264_qsv", defaultEncoder);
+ }
+
+ if (string.Equals(hwType, "nvenc", StringComparison.OrdinalIgnoreCase))
+ {
+ return GetAvailableEncoder(mediaEncoder, "h264_nvenc", defaultEncoder);
+ }
+ if (string.Equals(hwType, "h264_omx", StringComparison.OrdinalIgnoreCase))
+ {
+ return GetAvailableEncoder(mediaEncoder, "h264_omx", defaultEncoder);
+ }
}
- return "libx264";
+ return defaultEncoder;
}
internal static bool CanStreamCopyVideo(EncodingJobOptions request, MediaStream videoStream)
diff --git a/MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs b/MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs
index 25b80ee92..08ab99f9b 100644
--- a/MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs
+++ b/MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs
@@ -392,9 +392,9 @@ namespace MediaBrowser.MediaEncoding.Encoder
//_logger.Info("Supported decoders: {0}", string.Join(",", list.ToArray()));
}
- public bool SupportsEncoder(string decoder)
+ public bool SupportsEncoder(string encoder)
{
- return _encoders.Contains(decoder, StringComparer.OrdinalIgnoreCase);
+ return _encoders.Contains(encoder, StringComparer.OrdinalIgnoreCase);
}
public bool SupportsDecoder(string decoder)
diff --git a/MediaBrowser.MediaEncoding/Encoder/VideoEncoder.cs b/MediaBrowser.MediaEncoding/Encoder/VideoEncoder.cs
index 82a966821..d65e05783 100644
--- a/MediaBrowser.MediaEncoding/Encoder/VideoEncoder.cs
+++ b/MediaBrowser.MediaEncoding/Encoder/VideoEncoder.cs
@@ -21,7 +21,7 @@ namespace MediaBrowser.MediaEncoding.Encoder
protected override async Task<string> GetCommandLineArguments(EncodingJob state)
{
// Get the output codec name
- var videoCodec = EncodingJobFactory.GetVideoEncoder(state, GetEncodingOptions());
+ var videoCodec = EncodingJobFactory.GetVideoEncoder(MediaEncoder, state, GetEncodingOptions());
var format = string.Empty;
var keyFrame = string.Empty;
diff --git a/MediaBrowser.MediaEncoding/Probing/ProbeResultNormalizer.cs b/MediaBrowser.MediaEncoding/Probing/ProbeResultNormalizer.cs
index 44a0f264d..f37e223de 100644
--- a/MediaBrowser.MediaEncoding/Probing/ProbeResultNormalizer.cs
+++ b/MediaBrowser.MediaEncoding/Probing/ProbeResultNormalizer.cs
@@ -398,7 +398,8 @@ namespace MediaBrowser.MediaEncoding.Probing
// These are mp4 chapters
if (string.Equals(streamInfo.codec_name, "mov_text", StringComparison.OrdinalIgnoreCase))
{
- return null;
+ // Edit: but these are also sometimes subtitles?
+ //return null;
}
var stream = new MediaStream
diff --git a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs
index 015fc3778..7af495f5a 100644
--- a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs
+++ b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs
@@ -923,14 +923,14 @@ namespace MediaBrowser.Server.Implementations.Library
if (type == typeof(Person))
{
- var subFolderIndex = 0;
-
- while (!char.IsLetterOrDigit(validFilename[subFolderIndex]))
+ foreach (char c in validFilename)
{
- subFolderIndex++;
+ if (char.IsLetterOrDigit(c))
+ {
+ subFolderPrefix = c.ToString();
+ break;
+ }
}
-
- subFolderPrefix = validFilename.Substring(subFolderIndex, 1);
}
var fullPath = string.IsNullOrEmpty(subFolderPrefix) ?
diff --git a/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs b/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs
index 26ec599fa..09d156661 100644
--- a/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs
+++ b/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs
@@ -133,7 +133,10 @@ namespace MediaBrowser.Server.Implementations.LiveTv
void service_DataSourceChanged(object sender, EventArgs e)
{
- _taskManager.CancelIfRunningAndQueue<RefreshChannelsScheduledTask>();
+ if (!_isDisposed)
+ {
+ _taskManager.CancelIfRunningAndQueue<RefreshChannelsScheduledTask>();
+ }
}
public async Task<QueryResult<LiveTvChannel>> GetInternalChannels(LiveTvChannelQuery query, CancellationToken cancellationToken)
@@ -1238,7 +1241,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv
var programs = new List<Guid>();
var channels = new List<Guid>();
- var guideDays = GetGuideDays(list.Count);
+ var guideDays = GetGuideDays();
_logger.Info("Refreshing guide with {0} days of guide data", guideDays);
@@ -1326,7 +1329,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv
}
private const int MaxGuideDays = 14;
- private double GetGuideDays(int channelCount)
+ private double GetGuideDays()
{
var config = GetConfiguration();
@@ -1335,13 +1338,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv
return Math.Max(1, Math.Min(config.GuideDays.Value, MaxGuideDays));
}
- var programsPerDay = channelCount * 48;
-
- const int maxPrograms = 24000;
-
- var days = Math.Round((double)maxPrograms / programsPerDay);
-
- return Math.Max(3, Math.Min(days, MaxGuideDays));
+ return 7;
}
private async Task<IEnumerable<Tuple<string, ChannelInfo>>> GetChannels(ILiveTvService service, CancellationToken cancellationToken)
@@ -2309,6 +2306,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv
}
private readonly object _disposeLock = new object();
+ private bool _isDisposed = false;
/// <summary>
/// Releases unmanaged and - optionally - managed resources.
/// </summary>
@@ -2317,6 +2315,8 @@ namespace MediaBrowser.Server.Implementations.LiveTv
{
if (dispose)
{
+ _isDisposed = true;
+
lock (_disposeLock)
{
foreach (var stream in _openStreams.Values.ToList())