--- /dev/null
+// --------------------------------------------------------------------------------------------------------------------\r
+// <copyright file="JsonPresetFactory.cs" company="HandBrake Project (http://handbrake.fr)">\r
+// This file is part of the HandBrake source code - It may be used under the terms of the GNU General Public License.\r
+// </copyright>\r
+// <summary>\r
+// The json preset factory.\r
+// </summary>\r
+// --------------------------------------------------------------------------------------------------------------------\r
+\r
+namespace HandBrakeWPF.Services.Presets.Factories\r
+{\r
+ using System.Collections.ObjectModel;\r
+ using System.Globalization;\r
+\r
+ using HandBrake.ApplicationServices.Interop.Model;\r
+ using HandBrake.ApplicationServices.Interop.Model.Encoding;\r
+ using HandBrake.ApplicationServices.Services.Encode.Model;\r
+ using HandBrake.ApplicationServices.Services.Encode.Model.Models;\r
+ using HandBrake.ApplicationServices.Services.Encode.Model.Models.Video;\r
+ using HandBrake.ApplicationServices.Utilities;\r
+\r
+ using HandBrakeWPF.Model.Audio;\r
+ using HandBrakeWPF.Model.Picture;\r
+ using HandBrakeWPF.Model.Subtitles;\r
+ using HandBrakeWPF.Services.Presets.Model;\r
+\r
+ /// <summary>\r
+ /// The json preset factory.\r
+ /// </summary>\r
+ public class JsonPresetFactory\r
+ {\r
+ /// <summary>\r
+ /// The create preset.\r
+ /// </summary>\r
+ /// <param name="preset">\r
+ /// The preset.\r
+ /// </param>\r
+ /// <returns>\r
+ /// The <see cref="Preset"/>.\r
+ /// </returns>\r
+ public static Preset ImportPreset(HandBrake.ApplicationServices.Interop.Json.Presets.HBPreset preset)\r
+ {\r
+ EncodeTask task = new EncodeTask();\r
+ Preset parsedPreset = new Preset();\r
+ parsedPreset.Name = preset.PresetName;\r
+ parsedPreset.Description = preset.PresetDescription;\r
+ parsedPreset.UsePictureFilters = preset.UsesPictureFilters;\r
+ parsedPreset.PictureSettingsMode = (PresetPictureSettingsMode)preset.UsesPictureSettings;\r
+ parsedPreset.UseDeinterlace = preset.PictureDecombDeinterlace;\r
+ parsedPreset.Task = new EncodeTask();\r
+\r
+ // Step 1, Create the EncodeTask Object that can be loaded into the UI.\r
+\r
+ /* Output Settings */ \r
+ task.OptimizeMP4 = preset.Mp4HttpOptimize;\r
+ task.IPod5GSupport = preset.Mp4iPodCompatible;\r
+ task.OutputFormat = GetFileFormat(preset.FileFormat.Replace("file", string.Empty).Trim()); // TOOD null check.\r
+\r
+ /* Picture Settings */ \r
+ task.Cropping = new Cropping(preset.PictureTopCrop, preset.PictureBottomCrop, preset.PictureLeftCrop, preset.PictureRightCrop);\r
+ task.HasCropping = preset.PictureAutoCrop;\r
+ task.Width = preset.PictureWidth;\r
+ task.Height = preset.PictureHeight;\r
+ task.Modulus = preset.PictureModulus;\r
+ task.KeepDisplayAspect = preset.PictureKeepRatio;\r
+ switch (preset.PicturePAR)\r
+ {\r
+ case "custom":\r
+ task.Anamorphic = Anamorphic.Custom;\r
+ break;\r
+ case "loose":\r
+ task.Anamorphic = Anamorphic.Loose;\r
+ break;\r
+ case "strict":\r
+ task.Anamorphic = Anamorphic.Strict;\r
+ break;\r
+ default:\r
+ task.Anamorphic = Anamorphic.Loose;\r
+ break;\r
+ }\r
+\r
+ /* Filter Settings */ \r
+ task.Grayscale = preset.VideoGrayScale;\r
+ task.Deblock = preset.PictureDeblock;\r
+ switch (preset.PictureDecomb)\r
+ {\r
+ case "custom":\r
+ task.Decomb = Decomb.Custom;\r
+ break;\r
+ case "default":\r
+ task.Decomb = Decomb.Default;\r
+ break;\r
+ case "bob":\r
+ task.Decomb = Decomb.Bob;\r
+ break;\r
+ case "fast":\r
+ task.Decomb = Decomb.Fast;\r
+ break;\r
+\r
+ default:\r
+ task.Decomb = Decomb.Off;\r
+ break;\r
+ }\r
+\r
+ task.CustomDecomb = preset.PictureDecombCustom;\r
+\r
+ switch (preset.PictureDeinterlace)\r
+ {\r
+ case "custom":\r
+ task.Deinterlace = Deinterlace.Custom;\r
+ break;\r
+ case "bob":\r
+ task.Deinterlace = Deinterlace.Bob;\r
+ break;\r
+ case "gast":\r
+ task.Deinterlace = Deinterlace.Fast;\r
+ break;\r
+ case "slow":\r
+ task.Deinterlace = Deinterlace.Slow;\r
+ break;\r
+ case "slower":\r
+ task.Deinterlace = Deinterlace.Slower;\r
+ break;\r
+ default:\r
+ task.Deinterlace = Deinterlace.Off;\r
+ break;\r
+ }\r
+\r
+ task.CustomDeinterlace = preset.PictureDetelecineCustom;\r
+ task.CustomDenoise = preset.PictureDenoiseCustom;\r
+ task.CustomDetelecine = preset.PictureDetelecineCustom;\r
+\r
+ switch (preset.PictureDetelecine)\r
+ {\r
+ case "custom":\r
+ task.Detelecine = Detelecine.Custom;\r
+ break;\r
+ case "default":\r
+ task.Detelecine = Detelecine.Default;\r
+ break;\r
+ default:\r
+ task.Detelecine = Detelecine.Off;\r
+ break;\r
+ }\r
+\r
+ switch (preset.PictureDenoiseFilter)\r
+ {\r
+ case "nlmeans":\r
+ task.Denoise = Denoise.NLMeans;\r
+ break;\r
+ case "hqdn3d":\r
+ task.Denoise = Denoise.hqdn3d;\r
+ break;\r
+ default:\r
+ task.Denoise = Denoise.Off;\r
+ break;\r
+ }\r
+\r
+ switch (preset.PictureDenoisePreset)\r
+ {\r
+ case "custom":\r
+ task.DenoisePreset = DenoisePreset.Custom;\r
+ break;\r
+ case "light":\r
+ task.DenoisePreset = DenoisePreset.Light;\r
+ break;\r
+ case "medium":\r
+ task.DenoisePreset = DenoisePreset.Medium;\r
+ break;\r
+ case "strong":\r
+ task.DenoisePreset = DenoisePreset.Strong;\r
+ break;\r
+ case "ultralight":\r
+ task.DenoisePreset = DenoisePreset.Ultralight;\r
+ break;\r
+ case "weak":\r
+ task.DenoisePreset = DenoisePreset.Weak;\r
+ break;\r
+ }\r
+\r
+ switch (preset.PictureDenoiseTune)\r
+ {\r
+ case "animation":\r
+ task.DenoiseTune = DenoiseTune.Animation;\r
+ break;\r
+ case "film":\r
+ task.DenoiseTune = DenoiseTune.Film;\r
+ break;\r
+ case "grain":\r
+ task.DenoiseTune = DenoiseTune.Grain;\r
+ break;\r
+ case "highnotion":\r
+ task.DenoiseTune = DenoiseTune.HighMotion;\r
+ break;\r
+\r
+ default:\r
+ task.DenoiseTune = DenoiseTune.None;\r
+ break;\r
+ }\r
+\r
+ /* Video Settings */ \r
+ task.VideoEncoder = EnumHelper<VideoEncoder>.GetValue(preset.VideoEncoder);\r
+ task.VideoBitrate = preset.VideoAvgBitrate;\r
+ task.TwoPass = preset.VideoTwoPass;\r
+ task.TurboFirstPass = preset.VideoTurboTwoPass;\r
+ task.ExtraAdvancedArguments = preset.VideoOptionExtra;\r
+ task.Quality = double.Parse(preset.VideoQualitySlider.ToString(CultureInfo.InvariantCulture), CultureInfo.InvariantCulture);\r
+ task.VideoEncodeRateType = (VideoEncodeRateType)preset.VideoQualityType;\r
+ task.VideoLevel = new VideoLevel(preset.VideoLevel, preset.VideoLevel);\r
+ task.VideoPreset = new VideoPreset(preset.VideoPreset, preset.VideoPreset);\r
+ string[] split = preset.VideoTune.Split(',');\r
+ foreach (var item in split)\r
+ {\r
+ task.VideoTunes.Add(new VideoTune(item, item));\r
+ }\r
+ task.Framerate = preset.VideoFramerate == "auto" || string.IsNullOrEmpty(preset.VideoFramerate)\r
+ ? (double?)null\r
+ : double.Parse(preset.VideoFramerate, CultureInfo.InvariantCulture);\r
+ string parsedValue = preset.VideoFramerateMode;\r
+ switch (parsedValue)\r
+ {\r
+ case "vfr":\r
+ task.FramerateMode = FramerateMode.VFR;\r
+ break;\r
+ case "cfr":\r
+ task.FramerateMode = FramerateMode.CFR;\r
+ break;\r
+ default:\r
+ task.FramerateMode = FramerateMode.PFR;\r
+ break;\r
+ }\r
+\r
+ /* Audio Settings */ \r
+ parsedPreset.AudioTrackBehaviours = new AudioBehaviours();\r
+ task.AllowedPassthruOptions.AudioEncoderFallback = EnumHelper<AudioEncoder>.GetValue(preset.AudioEncoderFallback);\r
+ parsedPreset.AudioTrackBehaviours.SelectedBehaviour = preset.AudioTrackSelectionBehavior == "all"\r
+ ? AudioBehaviourModes.AllMatching\r
+ : preset.AudioTrackSelectionBehavior == "first"\r
+ ? AudioBehaviourModes.FirstMatch\r
+ : AudioBehaviourModes.None;\r
+\r
+ if (preset.AudioCopyMask != null)\r
+ {\r
+ foreach (var item in preset.AudioCopyMask)\r
+ {\r
+ AudioEncoder encoder = EnumHelper<AudioEncoder>.GetValue(item.ToString());\r
+ switch (encoder)\r
+ {\r
+ case AudioEncoder.AacPassthru:\r
+ task.AllowedPassthruOptions.AudioAllowAACPass = true;\r
+ break;\r
+ case AudioEncoder.Ac3Passthrough:\r
+ task.AllowedPassthruOptions.AudioAllowAACPass = true;\r
+ break;\r
+ case AudioEncoder.EAc3Passthrough:\r
+ task.AllowedPassthruOptions.AudioAllowAACPass = true;\r
+ break;\r
+ case AudioEncoder.DtsHDPassthrough:\r
+ task.AllowedPassthruOptions.AudioAllowAACPass = true;\r
+ break;\r
+ case AudioEncoder.DtsPassthrough:\r
+ task.AllowedPassthruOptions.AudioAllowAACPass = true;\r
+ break;\r
+ case AudioEncoder.FlacPassthru:\r
+ task.AllowedPassthruOptions.AudioAllowAACPass = true;\r
+ break;\r
+ case AudioEncoder.Mp3Passthru:\r
+ task.AllowedPassthruOptions.AudioAllowAACPass = true;\r
+ break;\r
+ }\r
+ }\r
+ }\r
+\r
+ if (preset.AudioLanguageList != null)\r
+ {\r
+ foreach (var item in preset.AudioLanguageList)\r
+ {\r
+ parsedPreset.AudioTrackBehaviours.SelectedLangauges.Add(item);\r
+ }\r
+ }\r
+\r
+ task.AudioTracks = new ObservableCollection<AudioTrack>();\r
+\r
+ if (preset.AudioList != null)\r
+ {\r
+ foreach (var audioTrack in preset.AudioList)\r
+ {\r
+ AudioTrack track = new AudioTrack();\r
+ track.Bitrate = audioTrack.AudioBitrate;\r
+\r
+ // track.CompressionLevel = audioTrack.AudioCompressionLevel;\r
+ // track.AudioDitherMethod = audioTrack.AudioDitherMethod;\r
+ track.Encoder = EnumHelper<AudioEncoder>.GetValue(audioTrack.AudioEncoder);\r
+ track.MixDown = Converters.GetAudioMixDown(audioTrack.AudioMixdown);\r
+\r
+ // track.AudioNormalizeMixLevel = audioTrack.AudioNormalizeMixLevel;\r
+ track.SampleRate = audioTrack.AudioSamplerate == "auto" ? 0 : double.Parse(audioTrack.AudioSamplerate);\r
+\r
+ // track.IsQualityBased = audioTrack.AudioTrackQualityEnable;\r
+ // track.Quality = audioTrack.AudioTrackQuality;\r
+ track.Gain = (int)audioTrack.AudioTrackGainSlider;\r
+ track.DRC = audioTrack.AudioTrackDRCSlider;\r
+\r
+ task.AudioTracks.Add(track);\r
+ }\r
+ }\r
+\r
+\r
+ /* Subtitle Settings */ \r
+ parsedPreset.SubtitleTrackBehaviours = new SubtitleBehaviours();\r
+\r
+ // parsedPreset.SubtitleTrackBehaviours.SelectedBehaviour = preset.SubtitleTrackSelectionBehavior;\r
+ parsedPreset.SubtitleTrackBehaviours.AddClosedCaptions = preset.SubtitleAddCC;\r
+ parsedPreset.SubtitleTrackBehaviours.AddForeignAudioScanTrack = preset.SubtitleAddForeignAudioSearch;\r
+ if (preset.SubtitleLanguageList != null)\r
+ {\r
+ foreach (var item in preset.SubtitleLanguageList)\r
+ {\r
+ parsedPreset.SubtitleTrackBehaviours.SelectedLangauges.Add(item);\r
+ }\r
+ }\r
+\r
+ /* Chapter Marker Settings */ \r
+ task.IncludeChapterMarkers = preset.ChapterMarkers;\r
+\r
+ /* Advanced Settings */ \r
+ task.ShowAdvancedTab = preset.x264UseAdvancedOptions;\r
+ task.AdvancedEncoderOptions = preset.x264Option;\r
+\r
+ /* Not Supported Yet */ \r
+ // public int VideoColorMatrixCode { get; set; }\r
+ // public bool VideoHWDecode { get; set; }\r
+ // public string VideoScaler { get; set; }\r
+ // public bool VideoQSVDecode { get; set; }\r
+ // public int VideoQSVAsyncDepth { get; set; }\r
+ // public bool SubtitleAddForeignAudioSubtitle { get; set; }\r
+ // public string SubtitleBurnBehavior { get; set; }\r
+ // public bool SubtitleBurnBDSub { get; set; }\r
+ // public bool SubtitleBurnDVDSub { get; set; }\r
+ // public bool PictureItuPAR { get; set; }\r
+ // public bool PictureLooseCrop { get; set; }\r
+ // public int PicturePARWidth { get; set; }\r
+ // public int PicturePARHeight { get; set; }\r
+ // public int PictureRotate { get; set; }\r
+ // public int PictureForceHeight { get; set; }\r
+ // public int PictureForceWidth { get; set; }\r
+ // public bool AudioSecondaryEncoderMode { get; set; }\r
+ // public List<object> ChildrenArray { get; set; }\r
+ // public bool Default { get; set; }\r
+ // public bool Folder { get; set; }\r
+ // public bool FolderOpen { get; set; }\r
+ // public int PictureDARWidth { get; set; }\r
+ // public int Type { get; set; }\r
+\r
+ return parsedPreset;\r
+ }\r
+\r
+ /// <summary>\r
+ /// The export preset.\r
+ /// </summary>\r
+ /// <param name="export">\r
+ /// The export.\r
+ /// </param>\r
+ /// <returns>\r
+ /// The <see cref="Preset"/>.\r
+ /// </returns>\r
+ public HandBrake.ApplicationServices.Interop.Json.Presets.HBPreset ExportPreset(Preset export)\r
+ {\r
+ HandBrake.ApplicationServices.Interop.Json.Presets.HBPreset preset = new HandBrake.ApplicationServices.Interop.Json.Presets.HBPreset();\r
+\r
+ return preset;\r
+ }\r
+\r
+ /// <summary>\r
+ /// Get the OutputFormat Enum for a given string\r
+ /// </summary>\r
+ /// <param name="format">\r
+ /// OutputFormat as a string\r
+ /// </param>\r
+ /// <returns>\r
+ /// An OutputFormat Enum\r
+ /// </returns>\r
+ public static OutputFormat GetFileFormat(string format)\r
+ {\r
+ switch (format.ToLower())\r
+ {\r
+ default:\r
+ return OutputFormat.Mp4;\r
+ case "m4v":\r
+ return OutputFormat.Mp4;\r
+ case "mkv":\r
+ return OutputFormat.Mkv;\r
+ }\r
+ }\r
+ }\r
+}\r