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