diff options
Diffstat (limited to 'MediaBrowser.MediaEncoding')
5 files changed, 57 insertions, 75 deletions
diff --git a/MediaBrowser.MediaEncoding/Encoder/BaseEncoder.cs b/MediaBrowser.MediaEncoding/Encoder/BaseEncoder.cs index e25537362..9337824a2 100644 --- a/MediaBrowser.MediaEncoding/Encoder/BaseEncoder.cs +++ b/MediaBrowser.MediaEncoding/Encoder/BaseEncoder.cs @@ -2,13 +2,10 @@ using MediaBrowser.Common.IO; using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Library; -using MediaBrowser.Controller.LiveTv; using MediaBrowser.Controller.MediaEncoding; using MediaBrowser.Controller.Session; using MediaBrowser.MediaEncoding.Subtitles; using MediaBrowser.Model.Configuration; -using MediaBrowser.Model.Dlna; -using MediaBrowser.Model.Drawing; using MediaBrowser.Model.Dto; using MediaBrowser.Model.Entities; using MediaBrowser.Model.IO; @@ -39,7 +36,7 @@ namespace MediaBrowser.MediaEncoding.Encoder protected readonly CultureInfo UsCulture = new CultureInfo("en-US"); - public BaseEncoder(MediaEncoder mediaEncoder, + protected BaseEncoder(MediaEncoder mediaEncoder, ILogger logger, IServerConfigurationManager configurationManager, IFileSystem fileSystem, @@ -64,7 +61,7 @@ namespace MediaBrowser.MediaEncoding.Encoder IProgress<double> progress, CancellationToken cancellationToken) { - var encodingJob = await new EncodingJobFactory(Logger, LibraryManager, MediaSourceManager) + var encodingJob = await new EncodingJobFactory(Logger, LibraryManager, MediaSourceManager, ConfigurationManager) .CreateJob(options, IsVideoEncoder, progress, cancellationToken).ConfigureAwait(false); encodingJob.OutputFilePath = GetOutputFilePath(encodingJob); @@ -305,25 +302,6 @@ namespace MediaBrowser.MediaEncoding.Encoder return job.Options.CpuCoreLimit ?? 0; } - protected EncodingQuality GetQualitySetting() - { - var quality = GetEncodingOptions().EncodingQuality; - - if (quality == EncodingQuality.Auto) - { - var cpuCount = Environment.ProcessorCount; - - if (cpuCount >= 4) - { - //return EncodingQuality.HighQuality; - } - - return EncodingQuality.HighSpeed; - } - - return quality; - } - protected string GetInputModifier(EncodingJob job, bool genPts = true) { var inputModifier = string.Empty; @@ -543,7 +521,7 @@ namespace MediaBrowser.MediaEncoding.Encoder var isVc1 = state.VideoStream != null && string.Equals(state.VideoStream.Codec, "vc1", StringComparison.OrdinalIgnoreCase); - var qualitySetting = GetQualitySetting(); + var qualitySetting = state.Quality; if (string.Equals(videoCodec, "libx264", StringComparison.OrdinalIgnoreCase)) { diff --git a/MediaBrowser.MediaEncoding/Encoder/EncodingJob.cs b/MediaBrowser.MediaEncoding/Encoder/EncodingJob.cs index 767f3f829..efce5abb0 100644 --- a/MediaBrowser.MediaEncoding/Encoder/EncodingJob.cs +++ b/MediaBrowser.MediaEncoding/Encoder/EncodingJob.cs @@ -1,5 +1,6 @@ using MediaBrowser.Controller.Library; using MediaBrowser.Controller.MediaEncoding; +using MediaBrowser.Model.Configuration; using MediaBrowser.Model.Dlna; using MediaBrowser.Model.Drawing; using MediaBrowser.Model.Dto; @@ -24,7 +25,7 @@ namespace MediaBrowser.MediaEncoding.Encoder public Stream LogFileStream { get; set; } public IProgress<double> Progress { get; set; } public TaskCompletionSource<bool> TaskCompletionSource; - + public EncodingQuality Quality { get; set; } public EncodingJobOptions Options { get; set; } public string InputContainer { get; set; } public MediaSourceInfo MediaSource { get; set; } diff --git a/MediaBrowser.MediaEncoding/Encoder/EncodingJobFactory.cs b/MediaBrowser.MediaEncoding/Encoder/EncodingJobFactory.cs index 44b85a77d..d56838c8b 100644 --- a/MediaBrowser.MediaEncoding/Encoder/EncodingJobFactory.cs +++ b/MediaBrowser.MediaEncoding/Encoder/EncodingJobFactory.cs @@ -1,8 +1,7 @@ -using System.IO; -using MediaBrowser.Controller.Entities; +using MediaBrowser.Common.Configuration; using MediaBrowser.Controller.Library; -using MediaBrowser.Controller.LiveTv; using MediaBrowser.Controller.MediaEncoding; +using MediaBrowser.Model.Configuration; using MediaBrowser.Model.Dlna; using MediaBrowser.Model.Dto; using MediaBrowser.Model.Entities; @@ -22,14 +21,16 @@ namespace MediaBrowser.MediaEncoding.Encoder private readonly ILogger _logger; private readonly ILibraryManager _libraryManager; private readonly IMediaSourceManager _mediaSourceManager; + private readonly IConfigurationManager _config; protected static readonly CultureInfo UsCulture = new CultureInfo("en-US"); - public EncodingJobFactory(ILogger logger, ILibraryManager libraryManager, IMediaSourceManager mediaSourceManager) + public EncodingJobFactory(ILogger logger, ILibraryManager libraryManager, IMediaSourceManager mediaSourceManager, IConfigurationManager config) { _logger = logger; _libraryManager = libraryManager; _mediaSourceManager = mediaSourceManager; + _config = config; } public async Task<EncodingJob> CreateJob(EncodingJobOptions options, bool isVideoRequest, IProgress<double> progress, CancellationToken cancellationToken) @@ -95,6 +96,10 @@ namespace MediaBrowser.MediaEncoding.Encoder TryStreamCopy(state, request); + state.Quality = options.Context == EncodingContext.Static ? + EncodingQuality.MaxQuality : + GetQualitySetting(); + return state; } @@ -194,6 +199,30 @@ namespace MediaBrowser.MediaEncoding.Encoder state.MediaSource = mediaSource; } + protected EncodingQuality GetQualitySetting() + { + var quality = GetEncodingOptions().EncodingQuality; + + if (quality == EncodingQuality.Auto) + { + var cpuCount = Environment.ProcessorCount; + + if (cpuCount >= 4) + { + //return EncodingQuality.HighQuality; + } + + return EncodingQuality.HighSpeed; + } + + return quality; + } + + protected EncodingOptions GetEncodingOptions() + { + return _config.GetConfiguration<EncodingOptions>("encoding"); + } + /// <summary> /// Infers the video codec. /// </summary> diff --git a/MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs b/MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs index 4d5b669e2..c059a8b54 100644 --- a/MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs +++ b/MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs @@ -199,7 +199,7 @@ namespace MediaBrowser.MediaEncoding.Encoder await _ffProbeResourcePool.WaitAsync(cancellationToken).ConfigureAwait(false); - using (var processWrapper = new ProcessWrapper(process, this)) + using (var processWrapper = new ProcessWrapper(process, this, _logger)) { try { @@ -308,7 +308,7 @@ namespace MediaBrowser.MediaEncoding.Encoder _logger.Debug("{0} {1}", process.StartInfo.FileName, process.StartInfo.Arguments); - using (var processWrapper = new ProcessWrapper(process, this)) + using (var processWrapper = new ProcessWrapper(process, this, _logger)) { StartProcess(processWrapper); @@ -492,7 +492,7 @@ namespace MediaBrowser.MediaEncoding.Encoder await resourcePool.WaitAsync(cancellationToken).ConfigureAwait(false); - using (var processWrapper = new ProcessWrapper(process, this)) + using (var processWrapper = new ProcessWrapper(process, this, _logger)) { bool ranToCompletion; @@ -607,7 +607,7 @@ namespace MediaBrowser.MediaEncoding.Encoder bool ranToCompletion = false; - using (var processWrapper = new ProcessWrapper(process, this)) + using (var processWrapper = new ProcessWrapper(process, this, _logger)) { try { @@ -792,11 +792,13 @@ namespace MediaBrowser.MediaEncoding.Encoder public bool HasExited; public int? ExitCode; private readonly MediaEncoder _mediaEncoder; + private readonly ILogger _logger; - public ProcessWrapper(Process process, MediaEncoder mediaEncoder) + public ProcessWrapper(Process process, MediaEncoder mediaEncoder, ILogger logger) { Process = process; this._mediaEncoder = mediaEncoder; + _logger = logger; Process.Exited += Process_Exited; } @@ -806,7 +808,14 @@ namespace MediaBrowser.MediaEncoding.Encoder HasExited = true; - ExitCode = process.ExitCode; + try + { + ExitCode = process.ExitCode; + } + catch (Exception ex) + { + _logger.ErrorException("Error determing process exit code", ex); + } lock (_mediaEncoder._runningProcesses) { diff --git a/MediaBrowser.MediaEncoding/Probing/ProbeResultNormalizer.cs b/MediaBrowser.MediaEncoding/Probing/ProbeResultNormalizer.cs index 4c34b5a95..6ca489f6d 100644 --- a/MediaBrowser.MediaEncoding/Probing/ProbeResultNormalizer.cs +++ b/MediaBrowser.MediaEncoding/Probing/ProbeResultNormalizer.cs @@ -129,7 +129,7 @@ namespace MediaBrowser.MediaEncoding.Probing } else if (string.Equals(streamInfo.codec_type, "video", StringComparison.OrdinalIgnoreCase)) { - stream.Type = isAudio + stream.Type = isAudio || string.Equals(stream.Codec, "mjpeg", StringComparison.OrdinalIgnoreCase) ? MediaStreamType.EmbeddedImage : MediaStreamType.Video; @@ -146,44 +146,8 @@ namespace MediaBrowser.MediaEncoding.Probing // string.Equals(stream.AspectRatio, "2.35:1", StringComparison.OrdinalIgnoreCase) || // string.Equals(stream.AspectRatio, "2.40:1", StringComparison.OrdinalIgnoreCase); - if (string.Equals(streamInfo.sample_aspect_ratio, "1:1", StringComparison.OrdinalIgnoreCase)) - { - stream.IsAnamorphic = false; - } - else if (!((string.IsNullOrWhiteSpace(streamInfo.sample_aspect_ratio) || string.Equals(streamInfo.sample_aspect_ratio, "0:1", StringComparison.OrdinalIgnoreCase)))) - { - stream.IsAnamorphic = true; - } - else if (string.IsNullOrWhiteSpace(streamInfo.display_aspect_ratio) || string.Equals(streamInfo.display_aspect_ratio, "0:1", StringComparison.OrdinalIgnoreCase)) - { - stream.IsAnamorphic = false; - } - else - { - var ratioParts = streamInfo.display_aspect_ratio.Split(':'); - if (ratioParts.Length != 2) - { - stream.IsAnamorphic = false; - } - else - { - int ratio0; - int ratio1; - if (!Int32.TryParse(ratioParts[0], NumberStyles.Any, CultureInfo.InvariantCulture, out ratio0)) - { - stream.IsAnamorphic = false; - } - else if (!Int32.TryParse(ratioParts[1], NumberStyles.Any, CultureInfo.InvariantCulture, out ratio1)) - { - stream.IsAnamorphic = false; - } - else - { - stream.IsAnamorphic = ((streamInfo.width * ratio1) != (stream.Height * ratio0)); - } - } - } - + // http://stackoverflow.com/questions/17353387/how-to-detect-anamorphic-video-with-ffprobe + stream.IsAnamorphic = string.Equals(streamInfo.sample_aspect_ratio, "0:1", StringComparison.OrdinalIgnoreCase); } else { @@ -519,6 +483,7 @@ namespace MediaBrowser.MediaEncoding.Probing FetchStudios(audio, tags, "organization"); FetchStudios(audio, tags, "ensemble"); FetchStudios(audio, tags, "publisher"); + FetchStudios(audio, tags, "label"); // These support mulitple values, but for now we only store the first. audio.SetProviderId(MetadataProviders.MusicBrainzAlbumArtist, GetMultipleMusicBrainzId(FFProbeHelpers.GetDictionaryValue(tags, "MusicBrainz Album Artist Id"))); |
