jellyfin/MediaBrowser.MediaEncoding/Encoder/EncodingJob.cs

198 lines
6.1 KiB
C#
Raw Normal View History

using MediaBrowser.Controller.Library;
2015-01-02 07:12:58 +01:00
using MediaBrowser.Controller.MediaEncoding;
using MediaBrowser.Model.Dlna;
using MediaBrowser.Model.Drawing;
using MediaBrowser.Model.Dto;
2015-01-02 07:12:58 +01:00
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Logging;
using MediaBrowser.Model.MediaInfo;
using MediaBrowser.Model.Net;
using System;
using System.Collections.Generic;
using System.IO;
2016-12-13 18:04:37 +01:00
using System.Linq;
2015-01-02 07:12:58 +01:00
using System.Threading;
using System.Threading.Tasks;
namespace MediaBrowser.MediaEncoding.Encoder
{
public class EncodingJob : EncodingJobInfo, IDisposable
2015-01-02 07:12:58 +01:00
{
public bool HasExited { get; internal set; }
2015-01-05 07:00:13 +01:00
public bool IsCancelled { get; internal set; }
2015-01-02 07:12:58 +01:00
public Stream LogFileStream { get; set; }
public IProgress<double> Progress { get; set; }
public TaskCompletionSource<bool> TaskCompletionSource;
public EncodingJobOptions Options
{
get { return (EncodingJobOptions) BaseRequest; }
set { BaseRequest = value; }
}
2015-01-02 07:12:58 +01:00
public string Id { get; set; }
2015-01-02 07:12:58 +01:00
public string MimeType { get; set; }
public bool EstimateContentLength { get; set; }
public TranscodeSeekInfo TranscodeSeekInfo { get; set; }
public long? EncodingDurationTicks { get; set; }
public string ItemType { get; set; }
public string GetMimeType(string outputPath)
{
if (!string.IsNullOrEmpty(MimeType))
{
return MimeType;
}
return MimeTypes.GetMimeType(outputPath);
}
private readonly ILogger _logger;
private readonly IMediaSourceManager _mediaSourceManager;
2015-01-02 07:12:58 +01:00
public EncodingJob(ILogger logger, IMediaSourceManager mediaSourceManager) :
2017-04-09 23:38:59 +02:00
base(logger, TranscodingJobType.Progressive)
2015-01-02 07:12:58 +01:00
{
_logger = logger;
_mediaSourceManager = mediaSourceManager;
2015-01-02 07:12:58 +01:00
Id = Guid.NewGuid().ToString("N");
_logger = logger;
TaskCompletionSource = new TaskCompletionSource<bool>();
}
public void Dispose()
{
DisposeLiveStream();
DisposeLogStream();
DisposeIsoMount();
}
private void DisposeLogStream()
{
if (LogFileStream != null)
{
try
{
LogFileStream.Dispose();
}
catch (Exception ex)
{
_logger.ErrorException("Error disposing log stream", ex);
}
LogFileStream = null;
}
}
private async void DisposeLiveStream()
{
2017-04-04 08:01:20 +02:00
if (MediaSource.RequiresClosing && string.IsNullOrWhiteSpace(Options.LiveStreamId) && !string.IsNullOrWhiteSpace(MediaSource.LiveStreamId))
2015-01-02 07:12:58 +01:00
{
try
{
2016-09-29 14:55:49 +02:00
await _mediaSourceManager.CloseLiveStream(MediaSource.LiveStreamId).ConfigureAwait(false);
2015-01-02 07:12:58 +01:00
}
catch (Exception ex)
{
_logger.ErrorException("Error closing media source", ex);
2015-01-02 07:12:58 +01:00
}
}
}
public string OutputFilePath { get; set; }
public string ActualOutputVideoCodec
{
get
{
var codec = OutputVideoCodec;
if (string.Equals(codec, "copy", StringComparison.OrdinalIgnoreCase))
{
var stream = VideoStream;
if (stream != null)
{
return stream.Codec;
}
return null;
}
return codec;
}
}
public string ActualOutputAudioCodec
{
get
{
var codec = OutputAudioCodec;
if (string.Equals(codec, "copy", StringComparison.OrdinalIgnoreCase))
{
var stream = AudioStream;
if (stream != null)
{
return stream.Codec;
}
return null;
}
return codec;
}
}
2017-03-24 16:03:49 +01:00
public override void ReportTranscodingProgress(TimeSpan? transcodingPosition, float? framerate, double? percentComplete, long? bytesTranscoded, int? bitRate)
2015-01-02 07:12:58 +01:00
{
var ticks = transcodingPosition.HasValue ? transcodingPosition.Value.Ticks : (long?)null;
// job.Framerate = framerate;
2015-01-05 07:00:13 +01:00
if (!percentComplete.HasValue && ticks.HasValue && RunTimeTicks.HasValue)
{
2017-03-24 16:03:49 +01:00
var pct = ticks.Value / RunTimeTicks.Value;
percentComplete = pct * 100;
2015-01-05 07:00:13 +01:00
}
2015-01-02 07:12:58 +01:00
if (percentComplete.HasValue)
{
Progress.Report(percentComplete.Value);
}
// job.TranscodingPositionTicks = ticks;
// job.BytesTranscoded = bytesTranscoded;
var deviceId = Options.DeviceId;
if (!string.IsNullOrWhiteSpace(deviceId))
{
var audioCodec = ActualOutputVideoCodec;
var videoCodec = ActualOutputVideoCodec;
// SessionManager.ReportTranscodingInfo(deviceId, new TranscodingInfo
// {
// Bitrate = job.TotalOutputBitrate,
// AudioCodec = audioCodec,
// VideoCodec = videoCodec,
// Container = job.Options.OutputContainer,
// Framerate = framerate,
// CompletionPercentage = percentComplete,
// Width = job.OutputWidth,
// Height = job.OutputHeight,
// AudioChannels = job.OutputAudioChannels,
// IsAudioDirect = string.Equals(job.OutputAudioCodec, "copy", StringComparison.OrdinalIgnoreCase),
// IsVideoDirect = string.Equals(job.OutputVideoCodec, "copy", StringComparison.OrdinalIgnoreCase)
// });
}
}
}
}