// -------------------------------------------------------------------------------------------------------------------- // // 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 { using System; using System.Collections.Generic; using System.Globalization; using HandBrake.Interop.HbLib; using HandBrake.Interop.Helpers; using HandBrake.Interop.Model; using HandBrake.Interop.Model.Encoding; /// /// Converters for various encoding values. /// public static class HandBrakeUnitConversionHelpers { /// /// Video Frame Rates /// private static readonly Dictionary VideoRates; /// /// Initializes static members of the HandBrakeUnitConversionHelpers class. /// static HandBrakeUnitConversionHelpers() { HandBrakeUtils.EnsureGlobalInit(); 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]; } /// /// Converts a native HB encoder structure to an Encoder model. /// /// /// The structure to convert. /// /// /// The converted model. /// public static HBVideoEncoder NativeToVideoEncoder(hb_encoder_s encoder) { return new HBVideoEncoder { Id = encoder.codec, ShortName = encoder.short_name, DisplayName = encoder.name, CompatibleContainers = encoder.muxers }; } /// /// Converts a native HB encoder structure to an Encoder model. /// /// /// The structure to convert. /// /// /// The converted model. /// public static HBAudioEncoder NativeToAudioEncoder(hb_encoder_s encoder) { var result = new HBAudioEncoder { Id = encoder.codec, ShortName = encoder.short_name, DisplayName = encoder.name, CompatibleContainers = encoder.muxers, QualityLimits = HandBrakeEncoderHelpers.GetAudioQualityLimits(encoder.codec), DefaultQuality = HBFunctions.hb_audio_quality_get_default((uint)encoder.codec), CompressionLimits = HandBrakeEncoderHelpers.GetAudioCompressionLimits(encoder.codec), DefaultCompression = HBFunctions.hb_audio_compression_get_default((uint)encoder.codec) }; return result; } /// /// Converts a native HB rate structure to an HBRate object. /// /// /// The structure to convert. /// /// /// The converted rate object. /// public static HBRate NativeToRate(hb_rate_s rate) { return new HBRate { Name = rate.name, Rate = rate.rate }; } /// /// Converts a native HB mixdown structure to a Mixdown model. /// /// /// The structure to convert. /// /// /// The converted model. /// public static HBMixdown NativeToMixdown(hb_mixdown_s mixdown) { return new HBMixdown { Id = mixdown.amixdown, ShortName = mixdown.short_name, DisplayName = mixdown.name }; } /// /// Converts a native HB container structure into an HBContainer object. /// /// /// The structure to convert. /// /// /// The converted structure. /// public static HBContainer NativeToContainer(hb_container_s container) { return new HBContainer { DisplayName = container.name, ShortName = container.short_name, DefaultExtension = container.default_extension, Id = container.format }; } /// /// Converts a native language structure to a Language object. /// /// /// The structure to convert. /// /// /// The converted structure. /// public static Language NativeToLanguage(iso639_lang_t language) { string englishName = InteropUtilities.ToStringFromUtf8Ptr(language.eng_name); string nativeName = InteropUtilities.ToStringFromUtf8Ptr(language.native_name); return new Language { Code = language.iso639_2, EnglishName = englishName, NativeName = nativeName }; } /// /// 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; } } }