// --------------------------------------------------------------------------------------------------------------------
//
// 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);
}
}
}