// -------------------------------------------------------------------------------------------------------------------- // // This file is part of the HandBrake source code - It may be used under the terms of the GNU General Public License. // // // Defines the HandrakeUnitConversionHelpers type. // // -------------------------------------------------------------------------------------------------------------------- namespace HandBrake.Interop.Interop { using System; using System.Collections.Generic; using System.Globalization; using System.Runtime.InteropServices; using HandBrake.Interop.Interop.HbLib; using HandBrake.Interop.Interop.Helpers; using HandBrake.Interop.Interop.Interfaces.Model; using HandBrake.Interop.Interop.Interfaces.Model.Encoders; /// /// Converters for various encoding values. /// public static class HandBrakeUnitConversionHelpers { private static readonly Dictionary VideoRates; /// /// Initializes static members of the HandBrakeUnitConversionHelpers class. /// static HandBrakeUnitConversionHelpers() { if (!HandBrakeUtils.IsInitialised()) { throw new Exception("Please Initialise with HandBrakeUtils.EnsureGlobalInit before using!"); } VideoRates = new Dictionary(); foreach (var framerate in HandBrakeEncoderHelpers.VideoFramerates) { VideoRates.Add(double.Parse(framerate.Name, CultureInfo.InvariantCulture), framerate.Rate); } } /// /// Convert Framerate to Video Rates /// /// /// The framerate. /// /// /// The vrate if a valid framerate is passed in. /// /// /// Thrown when framerate is invalid. /// public static int FramerateToVrate(double framerate) { if (!VideoRates.ContainsKey(framerate)) { throw new ArgumentException("Framerate not recognized.", "framerate"); } return VideoRates[framerate]; } public static int GetFramerateFromName(string name) { IntPtr frameratePrt = Marshal.StringToHGlobalAnsi(name); return HBFunctions.hb_video_framerate_get_from_name(frameratePrt); } /// /// Converts the PTS amount to a TimeSpan. There may be some accuracy loss here. /// /// /// The PTS to convert. /// /// /// The timespan for it. /// public static TimeSpan PtsToTimeSpan(ulong pts) { return TimeSpan.FromTicks((long)((pts * 10000000) / 90000)); } /// /// Converts the PTS amount to seconds. /// /// /// The PTS to convert. /// /// /// The corresponding number of seconds. /// public static double PtsToSeconds(ulong pts) { return (double)pts / 90000; } /// /// Converts a native HB encoder structure to an Encoder model. /// /// /// The structure to convert. /// /// /// The converted model. /// internal static HBVideoEncoder NativeToVideoEncoder(hb_encoder_s encoder) { return new HBVideoEncoder(encoder.muxers, encoder.name, encoder.codec, encoder.short_name); } /// /// Converts a native HB encoder structure to an Encoder model. /// /// /// The structure to convert. /// /// /// The converted model. /// internal static HBAudioEncoder NativeToAudioEncoder(hb_encoder_s encoder) { var result = new HBAudioEncoder( encoder.muxers, HandBrakeEncoderHelpers.GetAudioCompressionLimits(encoder.codec), HBFunctions.hb_audio_compression_get_default((uint)encoder.codec), HBFunctions.hb_audio_quality_get_default((uint)encoder.codec), encoder.name, encoder.codec, HandBrakeEncoderHelpers.GetAudioQualityLimits(encoder.codec), encoder.short_name); return result; } /// /// Converts a native HB rate structure to an HBRate object. /// /// /// The structure to convert. /// /// /// The converted rate object. /// internal static HBRate NativeToRate(hb_rate_s rate) { return new HBRate(rate.name, rate.rate); } /// /// Converts a native HB mixdown structure to a Mixdown model. /// /// /// The structure to convert. /// /// /// The converted model. /// internal static HBMixdown NativeToMixdown(hb_mixdown_s mixdown) { return new HBMixdown(mixdown.name, mixdown.amixdown, mixdown.short_name); } /// /// Converts a native HB container structure into an HBContainer object. /// /// /// The structure to convert. /// /// /// The converted structure. /// internal static HBContainer NativeToContainer(hb_container_s container) { return new HBContainer(container.default_extension, container.name, container.format, container.short_name); } /// /// Converts a native language structure to a Language object. /// /// /// The structure to convert. /// /// /// The converted structure. /// internal static Language NativeToLanguage(iso639_lang_t language) { string englishName = InteropUtilities.ToStringFromUtf8Ptr(language.eng_name); string nativeName = InteropUtilities.ToStringFromUtf8Ptr(language.native_name); return new Language(englishName, nativeName, language.iso639_2); } } }