// -------------------------------------------------------------------------------------------------------------------- // // This file is part of the HandBrake source code - It may be used under the terms of the GNU General Public License. // // // A Utility Class to Convert a // // -------------------------------------------------------------------------------------------------------------------- namespace HandBrake.ApplicationServices.Utilities { using System; using System.Collections.Generic; using System.Linq; using HandBrake.ApplicationServices.Model; using HandBrake.ApplicationServices.Model.Encoding; using HandBrake.Interop.Model; using HandBrake.Interop.Model.Encoding; using HandBrake.Interop.Model.Encoding.x264; /// /// A Utility Class to Convert a /// public class InteropModelCreator { /// /// The get encode job. /// /// /// The task. /// /// /// The . /// public static EncodeJob GetEncodeJob(QueueTask task) { // Sanity Checking if (task == null || task.Task == null) { return null; } return GetEncodeJob(task.Task); } /// /// Get an EncodeJob model for a LibHB Encode. /// /// /// The task. /// /// /// An Interop.EncodeJob model. /// public static EncodeJob GetEncodeJob(EncodeTask task) { // The current Job Configuration EncodeTask work = task; // Which will be converted to this EncodeJob Model. EncodeJob job = new EncodeJob(); EncodingProfile profile = new EncodingProfile(); job.EncodingProfile = profile; // Audio Settings profile.AudioEncodings = new List(); job.ChosenAudioTracks = new List(); foreach (AudioTrack track in work.AudioTracks) { AudioEncoding newTrack = new AudioEncoding { Bitrate = track.Bitrate, Drc = track.DRC, Gain = track.Gain, Encoder = Converters.GetCliAudioEncoder(track.Encoder), InputNumber = track.Track.HasValue ? track.Track.Value : 0, Mixdown = Converters.GetCliMixDown(track.MixDown), SampleRateRaw = GetSampleRateRaw(track.SampleRate), }; profile.AudioEncodings.Add(newTrack); if (track.Track != null) { job.ChosenAudioTracks.Add(track.Track.Value); } } // Title Settings job.OutputPath = work.Destination; job.SourcePath = work.Source; job.Title = work.Title; // job.SourceType = work.Type; switch (work.PointToPointMode) { case PointToPointMode.Chapters: job.RangeType = VideoRangeType.Chapters; break; case PointToPointMode.Seconds: job.RangeType = VideoRangeType.Seconds; break; case PointToPointMode.Frames: job.RangeType = VideoRangeType.Frames; break; } if (work.PointToPointMode == PointToPointMode.Seconds) { job.SecondsEnd = work.EndPoint; job.SecondsStart = work.StartPoint; } if (work.PointToPointMode == PointToPointMode.Chapters) { job.ChapterStart = work.StartPoint; job.ChapterEnd = work.EndPoint; } if (work.PointToPointMode == PointToPointMode.Frames) { job.FramesEnd = work.EndPoint; job.FramesStart = work.StartPoint; } job.Angle = work.Angle; job.EncodingProfile = profile; // Output Settings profile.IPod5GSupport = work.IPod5GSupport; profile.Optimize = work.OptimizeMP4; switch (work.OutputFormat) { case OutputFormat.Mp4: case OutputFormat.M4V: profile.ContainerName = "av_mp4"; // TODO make part of enum. break; case OutputFormat.Mkv: profile.ContainerName = "av_mkv"; // TODO make part of enum. break; } // Picture Settings profile.Anamorphic = work.Anamorphic; profile.Cropping = new Cropping { Top = work.Cropping.Top, Bottom = work.Cropping.Bottom, Left = work.Cropping.Left, Right = work.Cropping.Right }; profile.CroppingType = CroppingType.Custom; // TODO deal with this better profile.DisplayWidth = work.DisplayWidth.HasValue ? int.Parse(Math.Round(work.DisplayWidth.Value, 0).ToString()) : 0; profile.PixelAspectX = work.PixelAspectX; profile.PixelAspectY = work.PixelAspectY; profile.Height = work.Height.HasValue ? work.Height.Value : 0; profile.KeepDisplayAspect = work.KeepDisplayAspect; profile.MaxHeight = work.MaxHeight.HasValue ? work.MaxHeight.Value : 0; profile.MaxWidth = work.MaxWidth.HasValue ? work.MaxWidth.Value : 0; profile.Modulus = work.Modulus.HasValue ? work.Modulus.Value : 16; profile.UseDisplayWidth = true; profile.Width = work.Width.HasValue ? work.Width.Value : 0; // Filter Settings profile.CustomDecomb = work.CustomDecomb; profile.CustomDeinterlace = work.CustomDeinterlace; profile.CustomDenoise = work.CustomDenoise; profile.CustomDetelecine = work.CustomDetelecine; if (work.Deblock > 4) profile.Deblock = work.Deblock; profile.Decomb = work.Decomb; profile.Deinterlace = work.Deinterlace; profile.Denoise = work.Denoise; profile.Detelecine = work.Detelecine; profile.Grayscale = work.Grayscale; // Video Settings profile.Framerate = work.Framerate.HasValue ? work.Framerate.Value : 0; profile.ConstantFramerate = work.FramerateMode == FramerateMode.CFR; profile.Quality = work.Quality.HasValue ? work.Quality.Value : 0; profile.VideoBitrate = work.VideoBitrate.HasValue ? work.VideoBitrate.Value : 0; profile.VideoEncodeRateType = work.VideoEncodeRateType; profile.VideoEncoder = Converters.GetVideoEncoder(work.VideoEncoder); if (work.VideoEncoder == VideoEncoder.X264) { profile.VideoPreset = work.X264Preset.ToString().ToLower().Replace(" ", string.Empty); profile.VideoTunes = new List(); if (work.X264Tune != x264Tune.None) { profile.VideoTunes.Add(work.X264Tune.ToString().ToLower().Replace(" ", string.Empty)); } if (work.FastDecode) { profile.VideoTunes.Add("fastdecode"); } } else if (work.VideoEncoder == VideoEncoder.X265) { profile.VideoPreset = work.X265Preset.ToString().ToLower().Replace(" ", string.Empty); profile.VideoProfile = work.H265Profile.ToString().ToLower().Replace(" ", string.Empty); profile.VideoTunes = new List(); } profile.VideoLevel = work.H264Level; profile.VideoProfile = work.H264Profile.ToString().ToLower().Replace(" ", string.Empty); // TODO change these away from strings. // Chapter Markers profile.IncludeChapterMarkers = work.IncludeChapterMarkers; job.CustomChapterNames = work.ChapterNames.Select(item => item.ChapterName).ToList(); job.UseDefaultChapterNames = work.IncludeChapterMarkers; // Advanced Settings profile.VideoOptions = work.AdvancedEncoderOptions; // Subtitles job.Subtitles = new Subtitles { SourceSubtitles = new List(), SrtSubtitles = new List() }; foreach (SubtitleTrack track in work.SubtitleTracks) { if (track.IsSrtSubtitle) { job.Subtitles.SrtSubtitles.Add( new SrtSubtitle { CharacterCode = track.SrtCharCode, Default = track.Default, FileName = track.SrtFileName, LanguageCode = track.SrtLang, Offset = track.SrtOffset }); } else { if (track.SourceTrack != null) { job.Subtitles.SourceSubtitles.Add( new SourceSubtitle { BurnedIn = track.Burned, Default = track.Default, Forced = track.Forced, TrackNumber = track.SourceTrack.TrackNumber }); } } } return job; } /// /// Get the Raw Sample Rate /// /// /// The rate. /// /// /// The Raw sample rate as an int /// private static int GetSampleRateRaw(double rate) { if (rate == 22.05) return 22050; else if (rate == 24) return 24000; else if (rate == 44.1) return 32000; else if (rate == 48) return 48000; else return 48000; } } }