// --------------------------------------------------------------------------------------------------------------------
//
// This file is part of the HandBrake source code - It may be used under the terms of the GNU General Public License.
//
//
// An Encode Task
//
// --------------------------------------------------------------------------------------------------------------------
namespace HandBrake.ApplicationServices.Model
{
using System;
using System.Collections.ObjectModel;
using System.Linq;
using Caliburn.Micro;
using HandBrake.ApplicationServices.Model.Encoding;
using HandBrake.Interop.Model;
using HandBrake.Interop.Model.Encoding;
using HandBrake.Interop.Model.Encoding.x264;
using HandBrake.Interop.Model.Encoding.x265;
using OutputFormat = HandBrake.ApplicationServices.Model.Encoding.OutputFormat;
///
/// An Encode Task
///
public class EncodeTask : PropertyChangedBase
{
#region Private Fields
///
/// The advanced panel enabled.
///
private bool showAdvancedTab;
///
/// The advanced encoder options.
///
private string advancedEncoderOptions;
#endregion
///
/// Initializes a new instance of the class.
///
public EncodeTask()
{
this.Cropping = new Cropping();
this.AudioTracks = new ObservableCollection();
this.SubtitleTracks = new ObservableCollection();
this.ChapterNames = new ObservableCollection();
this.AllowedPassthruOptions = new AllowedPassthru();
this.X264Preset = x264Preset.Medium;
this.QsvPreset = QsvPreset.Quality;
this.H264Profile = x264Profile.None;
this.X264Tune = x264Tune.None;
this.Modulus = 16;
this.H265Profile = x265Profile.None;
this.X265Preset = x265Preset.VeryFast;
this.X265Tune = x265Tune.None;
}
///
/// Initializes a new instance of the class.
/// Copy Constructor
///
///
/// The task.
///
public EncodeTask(EncodeTask task)
{
this.AdvancedEncoderOptions = task.AdvancedEncoderOptions;
this.AllowedPassthruOptions = new AllowedPassthru(task.AllowedPassthruOptions);
this.Anamorphic = task.Anamorphic;
this.Angle = task.Angle;
this.AudioTracks = new ObservableCollection();
foreach (AudioTrack track in task.AudioTracks)
{
this.AudioTracks.Add(new AudioTrack(track));
}
this.ChapterNames = new ObservableCollection();
foreach (ChapterMarker track in task.ChapterNames)
{
this.ChapterNames.Add(new ChapterMarker(track));
}
this.ChapterMarkersFilePath = task.ChapterMarkersFilePath;
this.Cropping = new Cropping(task.Cropping);
this.CustomDecomb = task.CustomDecomb;
this.CustomDeinterlace = task.CustomDeinterlace;
this.CustomDenoise = task.CustomDenoise;
this.CustomDetelecine = task.CustomDetelecine;
this.Deblock = task.Deblock;
this.Decomb = task.Decomb;
this.Deinterlace = task.Deinterlace;
this.Denoise = task.Denoise;
this.DenoisePreset = task.DenoisePreset;
this.DenoiseTune = task.DenoiseTune;
this.Destination = task.Destination;
this.Detelecine = task.Detelecine;
this.DisplayWidth = task.DisplayWidth;
this.EndPoint = task.EndPoint;
this.Framerate = task.Framerate;
this.FramerateMode = task.FramerateMode;
this.Grayscale = task.Grayscale;
this.HasCropping = task.HasCropping;
this.Height = task.Height;
this.IncludeChapterMarkers = task.IncludeChapterMarkers;
this.IPod5GSupport = task.IPod5GSupport;
this.KeepDisplayAspect = task.KeepDisplayAspect;
this.MaxHeight = task.MaxHeight;
this.MaxWidth = task.MaxWidth;
this.Modulus = task.Modulus;
this.OptimizeMP4 = task.OptimizeMP4;
this.OutputFormat = task.OutputFormat;
this.PixelAspectX = task.PixelAspectX;
this.PixelAspectY = task.PixelAspectY;
this.PointToPointMode = task.PointToPointMode;
this.Quality = task.Quality;
this.Source = task.Source;
this.StartPoint = task.StartPoint;
this.SubtitleTracks = new ObservableCollection();
foreach (SubtitleTrack subtitleTrack in task.SubtitleTracks)
{
this.SubtitleTracks.Add(new SubtitleTrack(subtitleTrack));
}
this.Title = task.Title;
this.TurboFirstPass = task.TurboFirstPass;
this.TwoPass = task.TwoPass;
this.VideoBitrate = task.VideoBitrate;
this.VideoEncoder = task.VideoEncoder;
this.VideoEncodeRateType = task.VideoEncodeRateType;
this.Width = task.Width;
this.X264Preset = task.X264Preset;
this.QsvPreset = task.QsvPreset;
this.H264Profile = task.H264Profile;
this.X264Tune = task.X264Tune;
this.H264Level = task.H264Level;
this.FastDecode = task.FastDecode;
this.ExtraAdvancedArguments = task.ExtraAdvancedArguments;
this.PreviewStartAt = task.PreviewStartAt;
this.PreviewDuration = task.PreviewDuration;
this.ShowAdvancedTab = task.ShowAdvancedTab;
this.X265Preset = task.X265Preset;
this.X265Tune = task.X265Tune;
this.H265Profile = task.H265Profile;
}
#region Source
///
/// Gets or sets Source.
///
public string Source { get; set; }
///
/// Gets or sets Title.
///
public int Title { get; set; }
///
/// Gets or sets the Angle
///
public int Angle { get; set; }
///
/// Gets or sets PointToPointMode.
///
public PointToPointMode PointToPointMode { get; set; }
///
/// Gets or sets StartPoint.
///
public int StartPoint { get; set; }
///
/// Gets or sets EndPoint.
///
public int EndPoint { get; set; }
#endregion
#region Destination
///
/// Gets or sets Destination.
///
public string Destination { get; set; }
#endregion
#region Output Settings
///
/// Gets or sets OutputFormat.
///
public OutputFormat OutputFormat { get; set; }
///
/// Gets or sets a value indicating whether Optimize.
///
public bool OptimizeMP4 { get; set; }
///
/// Gets or sets a value indicating whether IPod5GSupport.
///
public bool IPod5GSupport { get; set; }
#endregion
#region Picture
///
/// Gets or sets Width.
///
public int? Width { get; set; }
///
/// Gets or sets Height.
///
public int? Height { get; set; }
///
/// Gets or sets MaxWidth.
///
public int? MaxWidth { get; set; }
///
/// Gets or sets MaxHeight.
///
public int? MaxHeight { get; set; }
///
/// Gets or sets Cropping.
///
public Cropping Cropping { get; set; }
///
/// Gets or sets a value indicating whether HasCropping.
///
public bool HasCropping { get; set; }
///
/// Gets or sets Anamorphic.
///
public Anamorphic Anamorphic { get; set; }
///
/// Gets or sets DisplayWidth.
///
public double? DisplayWidth { get; set; }
///
/// Gets or sets a value indicating whether KeepDisplayAspect.
///
public bool KeepDisplayAspect { get; set; }
///
/// Gets or sets PixelAspectX.
///
public int PixelAspectX { get; set; }
///
/// Gets or sets PixelAspectY.
///
public int PixelAspectY { get; set; }
///
/// Gets or sets Modulus.
///
public int? Modulus { get; set; }
#endregion
#region Filters
///
/// Gets or sets Deinterlace.
///
public Deinterlace Deinterlace { get; set; }
///
/// Gets or sets CustomDeinterlace.
///
public string CustomDeinterlace { get; set; }
///
/// Gets or sets Decomb.
///
public Decomb Decomb { get; set; }
///
/// Gets or sets CustomDecomb.
///
public string CustomDecomb { get; set; }
///
/// Gets or sets Detelecine.
///
public Detelecine Detelecine { get; set; }
///
/// Gets or sets CustomDetelecine.
///
public string CustomDetelecine { get; set; }
///
/// Gets or sets Denoise.
///
public Denoise Denoise { get; set; }
///
/// Gets or sets the denoise preset.
///
public DenoisePreset DenoisePreset { get; set; }
///
/// Gets or sets the denoise tune.
///
public DenoiseTune DenoiseTune { get; set; }
///
/// Gets or sets CustomDenoise.
///
public string CustomDenoise { get; set; }
///
/// Gets or sets Deblock.
///
public int Deblock { get; set; }
///
/// Gets or sets a value indicating whether Grayscale.
///
public bool Grayscale { get; set; }
#endregion
#region Video
///
/// Gets or sets VideoEncodeRateType.
///
public VideoEncodeRateType VideoEncodeRateType { get; set; }
///
/// Gets or sets the VideoEncoder
///
public VideoEncoder VideoEncoder { get; set; }
///
/// Gets or sets the Video Encode Mode
///
public FramerateMode FramerateMode { get; set; }
///
/// Gets or sets Quality.
///
public double? Quality { get; set; }
///
/// Gets or sets VideoBitrate.
///
public int? VideoBitrate { get; set; }
///
/// Gets or sets a value indicating whether TwoPass.
///
public bool TwoPass { get; set; }
///
/// Gets or sets a value indicating whether TurboFirstPass.
///
public bool TurboFirstPass { get; set; }
///
/// Gets or sets Framerate.
/// Null = Same as Source
///
public double? Framerate { get; set; }
#endregion
#region Audio
///
/// Gets or sets AudioEncodings.
///
public ObservableCollection AudioTracks { get; set; }
///
/// Gets or sets AllowedPassthruOptions.
///
public AllowedPassthru AllowedPassthruOptions { get; set; }
#endregion
#region Subtitles
///
/// Gets or sets SubtitleTracks.
///
public ObservableCollection SubtitleTracks { get; set; }
#endregion
#region Chapters
///
/// Gets or sets a value indicating whether IncludeChapterMarkers.
///
public bool IncludeChapterMarkers { get; set; }
///
/// Gets or sets ChapterMarkersFilePath.
///
public string ChapterMarkersFilePath { get; set; }
///
/// Gets or sets ChapterNames.
///
public ObservableCollection ChapterNames { get; set; }
#endregion
#region Advanced
///
/// Gets or sets AdvancedEncoderOptions.
///
public string AdvancedEncoderOptions
{
get
{
return this.advancedEncoderOptions;
}
set
{
this.advancedEncoderOptions = value;
}
}
///
/// Gets or sets x264Preset.
///
public x264Preset X264Preset { get; set; }
///
/// Gets or sets the qsv preset.
///
public QsvPreset QsvPreset { get; set; }
///
/// Gets or sets x264Profile.
///
public x264Profile H264Profile { get; set; }
///
/// Gets or sets the x 264 level.
///
public string H264Level { get; set; }
///
/// Gets or sets X264Tune.
///
public x264Tune X264Tune { get; set; }
///
/// Gets or sets a value indicating whether fast decode.
///
public bool FastDecode { get; set; }
///
/// Gets or sets Extra Advanced Arguments for the Video Tab.
///
public string ExtraAdvancedArguments { get; set; }
///
/// Gets or sets x265Preset.
///
public x265Preset X265Preset { get; set; }
///
/// Gets or sets x265Profile.
///
public x265Profile H265Profile { get; set; }
///
/// Gets or sets X265Tune.
///
public x265Tune X265Tune { get; set; }
#endregion
#region Preview
///
/// Gets or sets StartAt.
///
public int? PreviewStartAt { get; set; }
///
/// Gets or sets Duration.
///
public int? PreviewDuration { get; set; }
#endregion
#region Helpers
///
/// Gets a value indicating whether M4v extension is required.
///
public bool RequiresM4v
{
get
{
if (this.OutputFormat == OutputFormat.Mp4)
{
bool audio =
this.AudioTracks.Any(
item =>
item.Encoder == AudioEncoder.Ac3Passthrough || item.Encoder == AudioEncoder.Ac3
|| item.Encoder == AudioEncoder.DtsPassthrough || item.Encoder == AudioEncoder.Passthrough);
bool subtitles = this.SubtitleTracks.Any(track => track.SubtitleType != SubtitleType.VobSub);
return audio || subtitles;
}
return false;
}
}
///
/// Gets or sets a value indicating whether IsPreviewEncode.
///
public bool IsPreviewEncode { get; set; }
///
/// Gets or sets PreviewEncodeDuration.
///
public int PreviewEncodeDuration { get; set; }
///
/// Gets or sets PreviewEncodeStartAt.
///
public string PreviewEncodeStartAt { get; set; }
///
/// Gets or sets a value indicating whether advanced panel enabled.
///
public bool ShowAdvancedTab
{
get
{
return this.showAdvancedTab;
}
set
{
if (!object.Equals(value, this.showAdvancedTab))
{
this.showAdvancedTab = value;
this.NotifyOfPropertyChange(() => this.ShowAdvancedTab);
}
}
}
///
/// Gets the picture settings desc.
///
public string PictureSettingsDesc
{
get
{
string resolution = string.Empty;
switch (this.Anamorphic)
{
case Anamorphic.Strict:
resolution = "Anamorphic: Strict";
break;
case Anamorphic.Loose:
resolution = "Anamorphic: Loose, Width: " + this.Width;
break;
case Anamorphic.Custom:
resolution = "Anamorphic: Custom, Resolution: " + this.Width + "x" + this.Height;
break;
case Anamorphic.None:
resolution = "Resolution: " + this.Width + "x" + this.Height;
break;
}
return resolution + Environment.NewLine + "Crop Top: " + this.Cropping.Top + ", Botton: " + this.Cropping.Bottom + ", Left: "
+ this.Cropping.Left + ", Right: " + this.Cropping.Right;
}
}
#endregion
}
}