public static Preset ImportPreset(HBPreset importedPreset) { Preset preset = new Preset(); preset.Name = importedPreset.PresetName; preset.Description = importedPreset.PresetDescription; preset.Task = new EncodeTask(); preset.IsDefault = importedPreset.Default; preset.IsBuildIn = importedPreset.Type == 0; // Step 1, Create the EncodeTask Object that can be loaded into the UI. /* Output Settings */ preset.Task.OptimizeMP4 = importedPreset.Mp4HttpOptimize; preset.Task.IPod5GSupport = importedPreset.Mp4iPodCompatible; preset.Task.OutputFormat = GetFileFormat(importedPreset.FileFormat.Replace("file", string.Empty).Trim()); preset.Task.AlignAVStart = importedPreset.AlignAVStart; preset.Task.MetaData.PassthruMetadataEnabled = importedPreset.MetadataPassthrough; /* Picture Settings */ preset.Task.MaxWidth = importedPreset.PictureWidth.HasValue && importedPreset.PictureWidth.Value > 0 ? importedPreset.PictureWidth.Value : (int?)null; preset.Task.MaxHeight = importedPreset.PictureHeight.HasValue && importedPreset.PictureHeight.Value > 0 ? importedPreset.PictureHeight.Value : (int?)null; preset.Task.Cropping = new Cropping(importedPreset.PictureTopCrop, importedPreset.PictureBottomCrop, importedPreset.PictureLeftCrop, importedPreset.PictureRightCrop); preset.Task.HasCropping = !importedPreset.PictureAutoCrop; preset.Task.KeepDisplayAspect = importedPreset.PictureKeepRatio; preset.Task.AllowUpscaling = importedPreset.PictureAllowUpscaling; preset.Task.OptimalSize = importedPreset.PictureUseMaximumSize; preset.Task.Padding = new PaddingFilter(); preset.Task.Padding.Set(importedPreset.PicturePadTop, importedPreset.PicturePadBottom, importedPreset.PicturePadLeft, importedPreset.PicturePadRight, importedPreset.PicturePadColor, importedPreset.PicturePadMode); switch (importedPreset.PicturePAR) { case "custom": preset.Task.Anamorphic = Anamorphic.Custom; preset.Task.DisplayWidth = importedPreset.PictureDARWidth; preset.Task.PixelAspectX = importedPreset.PicturePARWidth == 0 ? 1 : importedPreset.PicturePARWidth; preset.Task.PixelAspectY = importedPreset.PicturePARHeight == 0 ? 1 : importedPreset.PicturePARHeight; break; case "auto": case "loose": preset.Task.Anamorphic = Anamorphic.Automatic; break; default: preset.Task.Anamorphic = Anamorphic.None; break; } /* Filter Settings */ preset.Task.Grayscale = importedPreset.VideoGrayScale; if (!string.IsNullOrEmpty(importedPreset.PictureColorspacePreset)) { preset.Task.Colourspace = new FilterPreset(HandBrakeFilterHelpers.GetFilterPresets((int)hb_filter_ids.HB_FILTER_COLORSPACE).FirstOrDefault(s => s.ShortName == importedPreset.PictureColorspacePreset)); preset.Task.CustomColourspace = importedPreset.PictureColorspaceCustom; } else { preset.Task.Colourspace = new FilterPreset("Off", "off"); } if (!string.IsNullOrEmpty(importedPreset.PictureChromaSmoothPreset)) { preset.Task.ChromaSmooth = new FilterPreset(HandBrakeFilterHelpers.GetFilterPresets((int)hb_filter_ids.HB_FILTER_CHROMA_SMOOTH).FirstOrDefault(s => s.ShortName == importedPreset.PictureChromaSmoothPreset)); preset.Task.ChromaSmoothTune = new FilterTune(HandBrakeFilterHelpers.GetFilterTunes((int)hb_filter_ids.HB_FILTER_CHROMA_SMOOTH).FirstOrDefault(s => s.ShortName == importedPreset.PictureChromaSmoothTune)); preset.Task.CustomChromaSmooth = importedPreset.PictureChromaSmoothCustom; } else { preset.Task.ChromaSmooth = new FilterPreset("Off", "off"); } if (!string.IsNullOrEmpty(importedPreset.PictureDeblockPreset)) { preset.Task.DeblockPreset = new FilterPreset(HandBrakeFilterHelpers.GetFilterPresets((int)hb_filter_ids.HB_FILTER_DEBLOCK).FirstOrDefault(s => s.ShortName == importedPreset.PictureDeblockPreset)); } else { preset.Task.DeblockPreset = new FilterPreset("Off", "off"); } if (!string.IsNullOrEmpty(importedPreset.PictureDeblockTune)) { preset.Task.DeblockTune = new FilterTune(HandBrakeFilterHelpers.GetFilterTunes((int)hb_filter_ids.HB_FILTER_DEBLOCK).FirstOrDefault(s => s.ShortName == importedPreset.PictureDeblockTune)); } else { preset.Task.DeblockTune = new FilterTune("Off", "off"); } preset.Task.CustomDeblock = importedPreset.PictureDeblockCustom; if (importedPreset.PictureSharpenFilter != null) { preset.Task.Sharpen = EnumHelper <Sharpen> .GetValue(importedPreset.PictureSharpenFilter); hb_filter_ids filterId = hb_filter_ids.HB_FILTER_INVALID; switch (preset.Task.Sharpen) { case Sharpen.LapSharp: filterId = hb_filter_ids.HB_FILTER_LAPSHARP; break; case Sharpen.UnSharp: filterId = hb_filter_ids.HB_FILTER_UNSHARP; break; } if (filterId != hb_filter_ids.HB_FILTER_INVALID) { preset.Task.SharpenPreset = new FilterPreset(HandBrakeFilterHelpers.GetFilterPresets((int)filterId).FirstOrDefault(s => s.ShortName == importedPreset.PictureSharpenPreset)); preset.Task.SharpenTune = new FilterTune(HandBrakeFilterHelpers.GetFilterTunes((int)filterId).FirstOrDefault(s => s.ShortName == importedPreset.PictureSharpenTune)); preset.Task.SharpenCustom = importedPreset.PictureSharpenCustom; } else { // Default Values. preset.Task.SharpenPreset = new FilterPreset("Medium", "medium"); preset.Task.SharpenTune = new FilterTune("None", "none"); preset.Task.SharpenCustom = string.Empty; } } switch (importedPreset.PictureDeinterlaceFilter) { case "decomb": preset.Task.DeinterlaceFilter = DeinterlaceFilter.Decomb; break; case "yadif": preset.Task.DeinterlaceFilter = DeinterlaceFilter.Yadif; break; default: preset.Task.DeinterlaceFilter = DeinterlaceFilter.Off; break; } if (preset.Task.DeinterlaceFilter == DeinterlaceFilter.Decomb) { List <HBPresetTune> filterPresets = HandBrakeFilterHelpers.GetFilterPresets((int)hb_filter_ids.HB_FILTER_DECOMB); HBPresetTune presetTune = filterPresets.FirstOrDefault(f => f.ShortName == importedPreset.PictureDeinterlacePreset); preset.Task.DeinterlacePreset = presetTune ?? new HBPresetTune("Default", "default"); preset.Task.CustomDeinterlaceSettings = importedPreset.PictureDeinterlaceCustom; } if (preset.Task.DeinterlaceFilter == DeinterlaceFilter.Yadif) { List <HBPresetTune> filterPresets = HandBrakeFilterHelpers.GetFilterPresets((int)hb_filter_ids.HB_FILTER_DEINTERLACE); HBPresetTune presetTune = filterPresets.FirstOrDefault(f => f.ShortName == importedPreset.PictureDeinterlacePreset); preset.Task.DeinterlacePreset = presetTune ?? new HBPresetTune("Default", "default"); preset.Task.CustomDeinterlaceSettings = importedPreset.PictureDeinterlaceCustom; } if (preset.Task.DeinterlaceFilter == DeinterlaceFilter.Yadif || preset.Task.DeinterlaceFilter == DeinterlaceFilter.Decomb) { switch (importedPreset.PictureCombDetectPreset) { case "off": preset.Task.CombDetect = CombDetect.Off; break; case "custom": preset.Task.CombDetect = CombDetect.Custom; break; case "default": preset.Task.CombDetect = CombDetect.Default; break; case "permissive": preset.Task.CombDetect = CombDetect.LessSensitive; break; case "fast": preset.Task.CombDetect = CombDetect.Fast; break; default: preset.Task.CombDetect = CombDetect.Off; break; } } preset.Task.CustomDenoise = importedPreset.PictureDenoiseCustom; preset.Task.CustomDetelecine = importedPreset.PictureDetelecineCustom; preset.Task.CustomCombDetect = importedPreset.PictureCombDetectCustom; switch (importedPreset.PictureDetelecine) { case "custom": preset.Task.Detelecine = Detelecine.Custom; break; case "default": preset.Task.Detelecine = Detelecine.Default; break; default: preset.Task.Detelecine = Detelecine.Off; break; } switch (importedPreset.PictureDenoiseFilter) { case "nlmeans": preset.Task.Denoise = Denoise.NLMeans; break; case "hqdn3d": preset.Task.Denoise = Denoise.hqdn3d; break; default: preset.Task.Denoise = Denoise.Off; break; } switch (importedPreset.PictureDenoisePreset) { case "custom": preset.Task.DenoisePreset = DenoisePreset.Custom; break; case "light": preset.Task.DenoisePreset = DenoisePreset.Light; break; case "medium": preset.Task.DenoisePreset = DenoisePreset.Medium; break; case "strong": preset.Task.DenoisePreset = DenoisePreset.Strong; break; case "ultralight": preset.Task.DenoisePreset = DenoisePreset.Ultralight; break; case "weak": preset.Task.DenoisePreset = DenoisePreset.Weak; break; } switch (importedPreset.PictureDenoiseTune) { case "animation": preset.Task.DenoiseTune = DenoiseTune.Animation; break; case "film": preset.Task.DenoiseTune = DenoiseTune.Film; break; case "grain": preset.Task.DenoiseTune = DenoiseTune.Grain; break; case "highmotion": preset.Task.DenoiseTune = DenoiseTune.HighMotion; break; case "tape": preset.Task.DenoiseTune = DenoiseTune.Tape; break; case "sprite": preset.Task.DenoiseTune = DenoiseTune.Sprite; break; default: preset.Task.DenoiseTune = DenoiseTune.None; break; } // Rotation and Flip if (!string.IsNullOrEmpty(importedPreset.PictureRotate)) { string[] rotation = importedPreset.PictureRotate.Split(':'); if (rotation.Length == 2) { int rotate; if (int.TryParse(rotation[0], out rotate)) { preset.Task.Rotation = int.Parse(rotation[0]); preset.Task.FlipVideo = rotation[1] == "1"; } } } /* Video Settings */ preset.Task.VideoEncoder = EnumHelper <VideoEncoder> .GetValue(importedPreset.VideoEncoder); preset.Task.VideoBitrate = importedPreset.VideoAvgBitrate; preset.Task.TwoPass = importedPreset.VideoTwoPass; preset.Task.TurboFirstPass = importedPreset.VideoTurboTwoPass; preset.Task.ExtraAdvancedArguments = importedPreset.VideoOptionExtra; preset.Task.Quality = double.Parse(importedPreset.VideoQualitySlider.ToString(CultureInfo.InvariantCulture), CultureInfo.InvariantCulture); preset.Task.VideoEncodeRateType = (VideoEncodeRateType)importedPreset.VideoQualityType; preset.Task.VideoLevel = new VideoLevel(importedPreset.VideoLevel, importedPreset.VideoLevel); preset.Task.VideoPreset = new VideoPreset(importedPreset.VideoPreset, importedPreset.VideoPreset); preset.Task.VideoProfile = new VideoProfile(importedPreset.VideoProfile, importedPreset.VideoProfile); if (!string.IsNullOrEmpty(importedPreset.VideoTune)) { string[] split = importedPreset.VideoTune.Split(','); foreach (var item in split) { preset.Task.VideoTunes.Add(new VideoTune(item?.Trim(), item?.Trim())); } } if (importedPreset.VideoFramerate == "auto" || importedPreset.VideoFramerate == "Same as source" || string.IsNullOrEmpty(importedPreset.VideoFramerate)) { preset.Task.Framerate = null; } else { double parsedFramerate; if (double.TryParse(importedPreset.VideoFramerate, NumberStyles.Any, CultureInfo.CurrentCulture, out parsedFramerate) || double.TryParse(importedPreset.VideoFramerate, NumberStyles.Any, CultureInfo.InvariantCulture, out parsedFramerate)) { preset.Task.Framerate = parsedFramerate; } } string parsedValue = importedPreset.VideoFramerateMode; switch (parsedValue) { case "vfr": preset.Task.FramerateMode = FramerateMode.VFR; break; case "cfr": preset.Task.FramerateMode = FramerateMode.CFR; break; default: preset.Task.FramerateMode = FramerateMode.PFR; break; } /* Audio Settings */ preset.AudioTrackBehaviours = new AudioBehaviours(); preset.AudioTrackBehaviours.AllowedPassthruOptions.AudioEncoderFallback = EnumHelper <AudioEncoder> .GetValue(importedPreset.AudioEncoderFallback); preset.AudioTrackBehaviours.SelectedBehaviour = importedPreset.AudioTrackSelectionBehavior == "all" ? AudioBehaviourModes.AllMatching : AudioBehaviourModes.FirstMatch; preset.AudioTrackBehaviours.SelectedTrackDefaultBehaviour = importedPreset.AudioSecondaryEncoderMode ? AudioTrackDefaultsMode.FirstTrack : AudioTrackDefaultsMode.AllTracks; if (importedPreset.AudioCopyMask != null) { preset.AudioTrackBehaviours.AllowedPassthruOptions.SetFalse(); foreach (var item in importedPreset.AudioCopyMask) { AudioEncoder encoder = EnumHelper <AudioEncoder> .GetValue(item); switch (encoder) { case AudioEncoder.AacPassthru: preset.AudioTrackBehaviours.AllowedPassthruOptions.AudioAllowAACPass = true; break; case AudioEncoder.Ac3Passthrough: preset.AudioTrackBehaviours.AllowedPassthruOptions.AudioAllowAC3Pass = true; break; case AudioEncoder.EAc3Passthrough: preset.AudioTrackBehaviours.AllowedPassthruOptions.AudioAllowEAC3Pass = true; break; case AudioEncoder.DtsHDPassthrough: preset.AudioTrackBehaviours.AllowedPassthruOptions.AudioAllowDTSHDPass = true; break; case AudioEncoder.DtsPassthrough: preset.AudioTrackBehaviours.AllowedPassthruOptions.AudioAllowDTSPass = true; break; case AudioEncoder.FlacPassthru: preset.AudioTrackBehaviours.AllowedPassthruOptions.AudioAllowFlacPass = true; break; case AudioEncoder.Mp2Passthru: preset.AudioTrackBehaviours.AllowedPassthruOptions.AudioAllowMP2Pass = true; break; case AudioEncoder.Mp3Passthru: preset.AudioTrackBehaviours.AllowedPassthruOptions.AudioAllowMP3Pass = true; break; case AudioEncoder.TrueHDPassthrough: preset.AudioTrackBehaviours.AllowedPassthruOptions.AudioAllowTrueHDPass = true; break; } } } if (importedPreset.AudioLanguageList != null) { IList <string> names = LanguageUtilities.GetLanguageNames(importedPreset.AudioLanguageList); foreach (var name in names) { preset.AudioTrackBehaviours.SelectedLanguages.Add(name); } } preset.Task.AudioTracks = new ObservableCollection <AudioTrack>(); if (importedPreset.AudioList != null) { foreach (var audioTrack in importedPreset.AudioList) { AudioBehaviourTrack track = new AudioBehaviourTrack(EnumHelper <AudioEncoder> .GetValue(importedPreset.AudioEncoderFallback)); // track.CompressionLevel = audioTrack.AudioCompressionLevel; // track.AudioDitherMethod = audioTrack.AudioDitherMethod; if (audioTrack.AudioEncoder == "ca_aac") { audioTrack.AudioEncoder = "av_aac"; // No Core Audio support on windows. } track.Encoder = EnumHelper <AudioEncoder> .GetValue(audioTrack.AudioEncoder); track.MixDown = HandBrakeEncoderHelpers.GetMixdown(audioTrack.AudioMixdown); track.Bitrate = audioTrack.AudioBitrate; // track.AudioNormalizeMixLevel = audioTrack.AudioNormalizeMixLevel; if ("auto".Equals(audioTrack.AudioSamplerate)) { track.SampleRate = 0; } else if (!string.IsNullOrEmpty(audioTrack.AudioSamplerate)) { double sampleRate = 0; if (double.TryParse(audioTrack.AudioSamplerate, NumberStyles.Any, CultureInfo.InvariantCulture, out sampleRate)) { track.SampleRate = sampleRate; } } track.EncoderRateType = audioTrack.AudioTrackQualityEnable ? AudioEncoderRateType.Quality : AudioEncoderRateType.Bitrate; track.Quality = audioTrack.AudioTrackQuality; track.Gain = (int)audioTrack.AudioTrackGainSlider; track.DRC = audioTrack.AudioTrackDRCSlider; preset.AudioTrackBehaviours.BehaviourTracks.Add(track); } } /* Subtitle Settings */ preset.SubtitleTrackBehaviours = new SubtitleBehaviours(); preset.SubtitleTrackBehaviours.SelectedBehaviour = EnumHelper <SubtitleBehaviourModes> .GetValue(importedPreset.SubtitleTrackSelectionBehavior); preset.SubtitleTrackBehaviours.SelectedBurnInBehaviour = EnumHelper <SubtitleBurnInBehaviourModes> .GetValue(importedPreset.SubtitleBurnBehavior); preset.SubtitleTrackBehaviours.AddClosedCaptions = importedPreset.SubtitleAddCC; preset.SubtitleTrackBehaviours.AddForeignAudioScanTrack = importedPreset.SubtitleAddForeignAudioSearch; if (importedPreset.SubtitleLanguageList != null) { IList <string> names = LanguageUtilities.GetLanguageNames(importedPreset.SubtitleLanguageList); foreach (var name in names) { preset.SubtitleTrackBehaviours.SelectedLanguages.Add(name); } } /* Chapter Marker Settings */ preset.Task.IncludeChapterMarkers = importedPreset.ChapterMarkers; /* Not Supported Yet */ // public int VideoColorMatrixCode { get; set; } // public bool VideoQSVDecode { get; set; } // public int VideoQSVAsyncDepth { get; set; } // public bool SubtitleAddForeignAudioSubtitle { get; set; } // public bool SubtitleBurnBDSub { get; set; } // public bool SubtitleBurnDVDSub { get; set; } // public bool PictureItuPAR { get; set; } // public bool PictureLooseCrop { get; set; } // public int PictureForceHeight { get; set; } // public int PictureForceWidth { get; set; } // public List<object> ChildrenArray { get; set; } // public int Type { get; set; } return(preset); }
/// <summary> /// The create filter. /// </summary> /// <param name="job"> /// The job. /// </param> /// <returns> /// The <see cref="Filters"/>. /// </returns> private static Filters CreateFilters(EncodeTask job) { Filters filter = new Filters { FilterList = new List <Filter>(), }; // Note, order is important. // Detelecine if (job.Detelecine != Detelecine.Off) { IntPtr settingsPtr = HBFunctions.hb_generate_filter_settings_json((int)hb_filter_ids.HB_FILTER_DETELECINE, null, null, job.CustomDetelecine); string unparsedJson = Marshal.PtrToStringAnsi(settingsPtr); if (!string.IsNullOrEmpty(unparsedJson)) { JToken settings = JObject.Parse(unparsedJson); Filter filterItem = new Filter { ID = (int)hb_filter_ids.HB_FILTER_DETELECINE, Settings = settings }; filter.FilterList.Add(filterItem); } } // Deinterlace if (job.DeinterlaceFilter == DeinterlaceFilter.Yadif) { IntPtr settingsPtr = HBFunctions.hb_generate_filter_settings_json((int)hb_filter_ids.HB_FILTER_DEINTERLACE, job.DeinterlacePreset?.ShortName, null, job.CustomDeinterlaceSettings); string unparsedJson = Marshal.PtrToStringAnsi(settingsPtr); if (!string.IsNullOrEmpty(unparsedJson)) { JToken root = JObject.Parse(unparsedJson); Filter filterItem = new Filter { ID = (int)hb_filter_ids.HB_FILTER_DEINTERLACE, Settings = root }; filter.FilterList.Add(filterItem); } } // Decomb if (job.DeinterlaceFilter == DeinterlaceFilter.Decomb) { IntPtr settingsPtr = HBFunctions.hb_generate_filter_settings_json((int)hb_filter_ids.HB_FILTER_DECOMB, job.DeinterlacePreset?.ShortName, null, job.CustomDeinterlaceSettings); string unparsedJson = Marshal.PtrToStringAnsi(settingsPtr); if (!string.IsNullOrEmpty(unparsedJson)) { JToken settings = JObject.Parse(unparsedJson); Filter filterItem = new Filter { ID = (int)hb_filter_ids.HB_FILTER_DECOMB, Settings = settings }; filter.FilterList.Add(filterItem); } } if (job.DeinterlaceFilter == DeinterlaceFilter.Decomb || job.DeinterlaceFilter == DeinterlaceFilter.Yadif) { if (job.CombDetect != CombDetect.Off) { IntPtr settingsPtr = HBFunctions.hb_generate_filter_settings_json((int)hb_filter_ids.HB_FILTER_COMB_DETECT, EnumHelper <CombDetect> .GetShortName(job.CombDetect), null, job.CustomCombDetect); string unparsedJson = Marshal.PtrToStringAnsi(settingsPtr); if (!string.IsNullOrEmpty(unparsedJson)) { JToken settings = JObject.Parse(unparsedJson); Filter filterItem = new Filter { ID = (int)hb_filter_ids.HB_FILTER_COMB_DETECT, Settings = settings }; filter.FilterList.Add(filterItem); } } } // Denoise if (job.Denoise != Denoise.Off) { hb_filter_ids id = job.Denoise == Denoise.hqdn3d ? hb_filter_ids.HB_FILTER_HQDN3D : hb_filter_ids.HB_FILTER_NLMEANS; IntPtr settingsPtr = HBFunctions.hb_generate_filter_settings_json((int)id, job.DenoisePreset.ToString().ToLower().Replace(" ", string.Empty), job.DenoiseTune.ToString().ToLower().Replace(" ", string.Empty), job.CustomDenoise); string unparsedJson = Marshal.PtrToStringAnsi(settingsPtr); if (!string.IsNullOrEmpty(unparsedJson)) { JToken settings = JObject.Parse(unparsedJson); Filter filterItem = new Filter { ID = (int)id, Settings = settings }; filter.FilterList.Add(filterItem); } } // Sharpen if (job.Sharpen != Sharpen.Off) { hb_filter_ids id = job.Sharpen == Sharpen.LapSharp ? hb_filter_ids.HB_FILTER_LAPSHARP : hb_filter_ids.HB_FILTER_UNSHARP; IntPtr settingsPtr = HBFunctions.hb_generate_filter_settings_json((int)id, job.SharpenPreset.Key, job.SharpenTune.Key, job.SharpenCustom); string unparsedJson = Marshal.PtrToStringAnsi(settingsPtr); if (!string.IsNullOrEmpty(unparsedJson)) { JToken settings = JObject.Parse(unparsedJson); Filter filterItem = new Filter { ID = (int)id, Settings = settings }; filter.FilterList.Add(filterItem); } } // Deblock if (job.Deblock >= 5) { IntPtr settingsPtr = HBFunctions.hb_generate_filter_settings_json((int)hb_filter_ids.HB_FILTER_DEBLOCK, null, null, string.Format("qp={0}", job.Deblock)); string unparsedJson = Marshal.PtrToStringAnsi(settingsPtr); if (!string.IsNullOrEmpty(unparsedJson)) { JToken settings = JObject.Parse(unparsedJson); Filter filterItem = new Filter { ID = (int)hb_filter_ids.HB_FILTER_DEBLOCK, Settings = settings }; filter.FilterList.Add(filterItem); } } // CropScale Filter string cropSettings = string.Format("width={0}:height={1}:crop-top={2}:crop-bottom={3}:crop-left={4}:crop-right={5}", job.Width, job.Height, job.Cropping.Top, job.Cropping.Bottom, job.Cropping.Left, job.Cropping.Right); IntPtr cropSettingsPtr = HBFunctions.hb_generate_filter_settings_json((int)hb_filter_ids.HB_FILTER_CROP_SCALE, null, null, cropSettings); string unparsedCropSettingsJson = Marshal.PtrToStringAnsi(cropSettingsPtr); if (!string.IsNullOrEmpty(unparsedCropSettingsJson)) { JToken cropSettingsJson = JObject.Parse(unparsedCropSettingsJson); Filter cropScale = new Filter { ID = (int)hb_filter_ids.HB_FILTER_CROP_SCALE, Settings = cropSettingsJson }; filter.FilterList.Add(cropScale); } // Grayscale if (job.Grayscale) { Filter filterItem = new Filter { ID = (int)hb_filter_ids.HB_FILTER_GRAYSCALE, Settings = null }; filter.FilterList.Add(filterItem); } // Rotate if (job.Rotation != 0 || job.FlipVideo) { string rotateSettings = string.Format("angle={0}:hflip={1}", job.Rotation, job.FlipVideo ? "1" : "0"); IntPtr settingsPtr = HBFunctions.hb_generate_filter_settings_json((int)hb_filter_ids.HB_FILTER_ROTATE, null, null, rotateSettings); string unparsedJson = Marshal.PtrToStringAnsi(settingsPtr); if (!string.IsNullOrEmpty(unparsedJson)) { JToken settings = JObject.Parse(unparsedJson); Filter filterItem = new Filter { ID = (int)hb_filter_ids.HB_FILTER_ROTATE, Settings = settings }; filter.FilterList.Add(filterItem); } } // Framerate shaping filter int fm = job.FramerateMode == FramerateMode.CFR ? 1 : job.FramerateMode == FramerateMode.PFR ? 2 : 0; int?num = null, den = null; if (job.Framerate != null) { IntPtr frameratePrt = Marshal.StringToHGlobalAnsi(job.Framerate.Value.ToString(CultureInfo.InvariantCulture)); int vrate = HBFunctions.hb_video_framerate_get_from_name(frameratePrt); if (vrate > 0) { num = 27000000; den = vrate; } } string framerateString = num.HasValue ? string.Format("mode={0}:rate={1}/{2}", fm, num, den) : string.Format("mode={0}", fm); // filter_cfr, filter_vrate.num, filter_vrate.den IntPtr framerateSettingsPtr = HBFunctions.hb_generate_filter_settings_json((int)hb_filter_ids.HB_FILTER_VFR, null, null, framerateString); string unparsedFramerateJson = Marshal.PtrToStringAnsi(framerateSettingsPtr); if (!string.IsNullOrEmpty(unparsedFramerateJson)) { JToken framerateSettings = JObject.Parse(unparsedFramerateJson); Filter framerateShaper = new Filter { ID = (int)hb_filter_ids.HB_FILTER_VFR, Settings = framerateSettings }; filter.FilterList.Add(framerateShaper); } return(filter); }
/// <summary> /// The create filter. /// </summary> /// <param name="job"> /// The job. /// </param> /// <returns> /// The <see cref="Filters"/>. /// </returns> private static Filters CreateFilters(EncodeTask job) { Filters filter = new Filters { FilterList = new List <Filter>(), }; // Detelecine if (job.Detelecine != Detelecine.Off) { Filter filterItem = new Filter { ID = (int)hb_filter_ids.HB_FILTER_DETELECINE, Settings = job.CustomDetelecine }; filter.FilterList.Add(filterItem); } // Decomb if (job.DeinterlaceFilter == DeinterlaceFilter.Decomb) { string options; if (job.Decomb == Decomb.Fast) { options = "7:2:6:9:1:80"; } else if (job.Decomb == Decomb.Bob) { options = "455"; } else { options = job.CustomDecomb; } Filter filterItem = new Filter { ID = (int)hb_filter_ids.HB_FILTER_DECOMB, Settings = options }; filter.FilterList.Add(filterItem); } // Deinterlace if (job.DeinterlaceFilter == DeinterlaceFilter.Deinterlace) { string options; if (job.Deinterlace == Deinterlace.Fast) { options = "0"; } else if (job.Deinterlace == Deinterlace.Slow) { options = "1"; } else if (job.Deinterlace == Deinterlace.Slower) { options = "3"; } else if (job.Deinterlace == Deinterlace.Bob) { options = "15"; } else { options = job.CustomDeinterlace; } Filter filterItem = new Filter { ID = (int)hb_filter_ids.HB_FILTER_DEINTERLACE, Settings = options }; filter.FilterList.Add(filterItem); } // VFR / CFR int fm = job.FramerateMode == FramerateMode.CFR ? 1 : job.FramerateMode == FramerateMode.PFR ? 2 : 0; int?num = null, den = null; if (job.Framerate != null) { IntPtr frameratePrt = Marshal.StringToHGlobalAnsi(job.Framerate.Value.ToString(CultureInfo.InvariantCulture)); int vrate = HBFunctions.hb_video_framerate_get_from_name(frameratePrt); if (vrate > 0) { num = 27000000; den = vrate; } } string framerateString = num.HasValue ? string.Format("{0}:{1}:{2}", fm, num, den) : string.Format("{0}", fm); // filter_cfr, filter_vrate.num, filter_vrate.den Filter framerateShaper = new Filter { ID = (int)hb_filter_ids.HB_FILTER_VFR, Settings = framerateString }; filter.FilterList.Add(framerateShaper); // Deblock if (job.Deblock >= 5) { Filter filterItem = new Filter { ID = (int)hb_filter_ids.HB_FILTER_DEBLOCK, Settings = job.Deblock.ToString() }; filter.FilterList.Add(filterItem); } // Denoise if (job.Denoise != Denoise.Off) { hb_filter_ids id = job.Denoise == Denoise.hqdn3d ? hb_filter_ids.HB_FILTER_HQDN3D : hb_filter_ids.HB_FILTER_NLMEANS; string settings; if (!string.IsNullOrEmpty(job.CustomDenoise)) { settings = job.CustomDenoise; } else { IntPtr settingsPtr = HBFunctions.hb_generate_filter_settings((int)id, job.DenoisePreset.ToString().ToLower().Replace(" ", string.Empty), job.DenoiseTune.ToString().ToLower().Replace(" ", string.Empty)); settings = Marshal.PtrToStringAnsi(settingsPtr); } Filter filterItem = new Filter { ID = (int)id, Settings = settings }; filter.FilterList.Add(filterItem); } if (job.Grayscale) { Filter filterItem = new Filter { ID = (int)hb_filter_ids.HB_FILTER_GRAYSCALE, Settings = null }; filter.FilterList.Add(filterItem); } // CropScale Filter Filter cropScale = new Filter { ID = (int)hb_filter_ids.HB_FILTER_CROP_SCALE, Settings = string.Format( "{0}:{1}:{2}:{3}:{4}:{5}", job.Width, job.Height, job.Cropping.Top, job.Cropping.Bottom, job.Cropping.Left, job.Cropping.Right) }; filter.FilterList.Add(cropScale); // Rotate /* TODO NOT SUPPORTED YET. */ return(filter); }
private List <ComboChoice> GetFilterTuneChoices(hb_filter_ids filter, string resourcePrefix = null) { return(ConvertParameterListToComboChoices(HandBrakeFilterHelpers.GetFilterTunes((int)filter), resourcePrefix)); }
private Filters CreateFilters(EncodeTask job) { Filters filter = new Filters { FilterList = new List <Filter>(), }; // Note, order is important. // Detelecine if (job.Detelecine != Detelecine.Off) { string unparsedJson = HandBrakeFilterHelpers.GenerateFilterSettingJson((int)hb_filter_ids.HB_FILTER_DETELECINE, null, null, job.CustomDetelecine); if (!string.IsNullOrEmpty(unparsedJson)) { JsonDocument settings = JsonDocument.Parse(unparsedJson); Filter filterItem = new Filter { ID = (int)hb_filter_ids.HB_FILTER_DETELECINE, Settings = settings }; filter.FilterList.Add(filterItem); } } // Deinterlace if (job.DeinterlaceFilter == DeinterlaceFilter.Yadif) { string unparsedJson = HandBrakeFilterHelpers.GenerateFilterSettingJson((int)hb_filter_ids.HB_FILTER_DEINTERLACE, job.DeinterlacePreset?.ShortName, null, job.CustomDeinterlaceSettings); if (!string.IsNullOrEmpty(unparsedJson)) { JsonDocument root = JsonDocument.Parse(unparsedJson); Filter filterItem = new Filter { ID = (int)hb_filter_ids.HB_FILTER_DEINTERLACE, Settings = root }; filter.FilterList.Add(filterItem); } } // Decomb if (job.DeinterlaceFilter == DeinterlaceFilter.Decomb) { string unparsedJson = HandBrakeFilterHelpers.GenerateFilterSettingJson((int)hb_filter_ids.HB_FILTER_DECOMB, job.DeinterlacePreset?.ShortName, null, job.CustomDeinterlaceSettings); if (!string.IsNullOrEmpty(unparsedJson)) { JsonDocument settings = JsonDocument.Parse(unparsedJson); Filter filterItem = new Filter { ID = (int)hb_filter_ids.HB_FILTER_DECOMB, Settings = settings }; filter.FilterList.Add(filterItem); } } if (job.DeinterlaceFilter == DeinterlaceFilter.Decomb || job.DeinterlaceFilter == DeinterlaceFilter.Yadif) { if (job.CombDetect != CombDetect.Off) { string unparsedJson = HandBrakeFilterHelpers.GenerateFilterSettingJson((int)hb_filter_ids.HB_FILTER_COMB_DETECT, EnumHelper <CombDetect> .GetShortName(job.CombDetect), null, job.CustomCombDetect); if (!string.IsNullOrEmpty(unparsedJson)) { JsonDocument settings = JsonDocument.Parse(unparsedJson); Filter filterItem = new Filter { ID = (int)hb_filter_ids.HB_FILTER_COMB_DETECT, Settings = settings }; filter.FilterList.Add(filterItem); } } } // Denoise if (job.Denoise != Denoise.Off) { hb_filter_ids id = job.Denoise == Denoise.hqdn3d ? hb_filter_ids.HB_FILTER_HQDN3D : hb_filter_ids.HB_FILTER_NLMEANS; string unparsedJson = HandBrakeFilterHelpers.GenerateFilterSettingJson((int)id, job.DenoisePreset.ToString().ToLower().Replace(" ", string.Empty), job.DenoiseTune.ToString().ToLower().Replace(" ", string.Empty), job.CustomDenoise); if (!string.IsNullOrEmpty(unparsedJson)) { JsonDocument settings = JsonDocument.Parse(unparsedJson); Filter filterItem = new Filter { ID = (int)id, Settings = settings }; filter.FilterList.Add(filterItem); } } // Sharpen if (job.Sharpen != Sharpen.Off) { hb_filter_ids id = job.Sharpen == Sharpen.LapSharp ? hb_filter_ids.HB_FILTER_LAPSHARP : hb_filter_ids.HB_FILTER_UNSHARP; string unparsedJson = HandBrakeFilterHelpers.GenerateFilterSettingJson((int)id, job.SharpenPreset.Key, job.SharpenTune.Key, job.SharpenCustom); if (!string.IsNullOrEmpty(unparsedJson)) { JsonDocument settings = JsonDocument.Parse(unparsedJson); Filter filterItem = new Filter { ID = (int)id, Settings = settings }; filter.FilterList.Add(filterItem); } } // Deblock if (job.DeblockPreset != null && job.DeblockPreset.Key != "off") { string unparsedJson = HandBrakeFilterHelpers.GenerateFilterSettingJson((int)hb_filter_ids.HB_FILTER_DEBLOCK, job.DeblockPreset.Key, job.DeblockTune.Key, job.CustomDeblock); if (!string.IsNullOrEmpty(unparsedJson)) { JsonDocument settings = JsonDocument.Parse(unparsedJson); Filter filterItem = new Filter { ID = (int)hb_filter_ids.HB_FILTER_DEBLOCK, Settings = settings }; filter.FilterList.Add(filterItem); } } // CropScale Filter string cropSettings = string.Format("width={0}:height={1}:crop-top={2}:crop-bottom={3}:crop-left={4}:crop-right={5}", job.Width, job.Height, job.Cropping.Top, job.Cropping.Bottom, job.Cropping.Left, job.Cropping.Right); string unparsedCropSettingsJson = HandBrakeFilterHelpers.GenerateFilterSettingJson((int)hb_filter_ids.HB_FILTER_CROP_SCALE, null, null, cropSettings); if (!string.IsNullOrEmpty(unparsedCropSettingsJson)) { JsonDocument cropSettingsJson = JsonDocument.Parse(unparsedCropSettingsJson); Filter cropScale = new Filter { ID = (int)hb_filter_ids.HB_FILTER_CROP_SCALE, Settings = cropSettingsJson }; filter.FilterList.Add(cropScale); } // Padding Filter if (job.Padding.Enabled) { // Calculate the new Width / Height int?width = job.Width; int?height = job.Height; if (job.Padding.Enabled) { width = width + job.Padding.W; height = height + job.Padding.H; } // Setup the filter. string padSettings = string.Format("width={0}:height={1}:color={2}:x={3}:y={4}", width, height, job.Padding.Color, job.Padding.X, job.Padding.Y); string unparsedPadSettingsJson = HandBrakeFilterHelpers.GenerateFilterSettingJson((int)hb_filter_ids.HB_FILTER_PAD, null, null, padSettings); if (!string.IsNullOrEmpty(unparsedPadSettingsJson)) { JsonDocument PadSettingsJson = JsonDocument.Parse(unparsedPadSettingsJson); Filter padding = new Filter { ID = (int)hb_filter_ids.HB_FILTER_PAD, Settings = PadSettingsJson }; filter.FilterList.Add(padding); } } // Colourspace if (job.Colourspace != null && job.Colourspace.Key != "off") { string unparsedJson = HandBrakeFilterHelpers.GenerateFilterSettingJson((int)hb_filter_ids.HB_FILTER_COLORSPACE, job.Colourspace.Key, null, job.CustomColourspace); if (!string.IsNullOrEmpty(unparsedJson)) { JsonDocument settings = JsonDocument.Parse(unparsedJson); Filter filterItem = new Filter { ID = (int)hb_filter_ids.HB_FILTER_COLORSPACE, Settings = settings }; filter.FilterList.Add(filterItem); } } if (job.ChromaSmooth != null && job.ChromaSmooth.Key != "off") { string unparsedJson = HandBrakeFilterHelpers.GenerateFilterSettingJson((int)hb_filter_ids.HB_FILTER_CHROMA_SMOOTH, job.ChromaSmooth.Key, job.ChromaSmoothTune?.Key, job.CustomChromaSmooth); if (!string.IsNullOrEmpty(unparsedJson)) { JsonDocument settings = JsonDocument.Parse(unparsedJson); Filter filterItem = new Filter { ID = (int)hb_filter_ids.HB_FILTER_CHROMA_SMOOTH, Settings = settings }; filter.FilterList.Add(filterItem); } } // Grayscale if (job.Grayscale) { Filter filterItem = new Filter { ID = (int)hb_filter_ids.HB_FILTER_GRAYSCALE, Settings = null }; filter.FilterList.Add(filterItem); } // Rotate if (job.Rotation != 0 || job.FlipVideo) { string rotateSettings = string.Format("angle={0}:hflip={1}", job.Rotation, job.FlipVideo ? "1" : "0"); string unparsedJson = HandBrakeFilterHelpers.GenerateFilterSettingJson((int)hb_filter_ids.HB_FILTER_ROTATE, null, null, rotateSettings); if (!string.IsNullOrEmpty(unparsedJson)) { JsonDocument settings = JsonDocument.Parse(unparsedJson); Filter filterItem = new Filter { ID = (int)hb_filter_ids.HB_FILTER_ROTATE, Settings = settings }; filter.FilterList.Add(filterItem); } } // Framerate shaping filter int fm = job.FramerateMode == FramerateMode.CFR ? 1 : job.FramerateMode == FramerateMode.PFR ? 2 : 0; int?num = null, den = null; if (job.Framerate != null) { int vrate = HandBrakeUnitConversionHelpers.GetFramerateFromName(job.Framerate.Value.ToString(CultureInfo.InvariantCulture)); if (vrate > 0) { num = 27000000; den = vrate; } } string framerateString = num.HasValue ? string.Format("mode={0}:rate={1}/{2}", fm, num, den) : string.Format("mode={0}", fm); // filter_cfr, filter_vrate.num, filter_vrate.den string unparsedFramerateJson = HandBrakeFilterHelpers.GenerateFilterSettingJson((int)hb_filter_ids.HB_FILTER_VFR, null, null, framerateString); if (!string.IsNullOrEmpty(unparsedFramerateJson)) { JsonDocument framerateSettings = JsonDocument.Parse(unparsedFramerateJson); Filter framerateShaper = new Filter { ID = (int)hb_filter_ids.HB_FILTER_VFR, Settings = framerateSettings }; filter.FilterList.Add(framerateShaper); } return(filter); }