// -------------------------------------------------------------------------------------------------------------------- // // 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 } }