public static OutputAudioTrackInfo GetDefaultSettings(SourceAudioTrack source, HBAudioEncoder encoder) { if (source == null) { throw new ArgumentNullException(nameof(source)); } if (encoder == null) { throw new ArgumentNullException(nameof(encoder)); } var result = new OutputAudioTrackInfo { Encoder = encoder, Drc = 0, Gain = 0, SampleRate = HandBrakeEncoderHelpers.SanitizeSampleRate(encoder, source.SampleRate) }; if (encoder.SupportsCompression) { result.CompressionLevel = HandBrakeEncoderHelpers.GetDefaultAudioCompression(encoder); } HBMixdown mixdown = HandBrakeEncoderHelpers.GetDefaultMixdown(encoder, (ulong)source.ChannelLayout); result.Mixdown = mixdown; // For some reason HB does not honor Quality when falling back to an encoder during auto-passthrough. // For now we do bitrate only. //if (encoder.SupportsQuality) //{ // result.EncodeRateType = AudioEncodeRateType.Quality; // result.Quality = HandBrakeEncoderHelpers.GetDefaultQuality(encoder); //} //else //{ result.EncodeRateType = AudioEncodeRateType.Bitrate; result.Bitrate = HandBrakeEncoderHelpers.GetDefaultBitrate(encoder, result.SampleRate, mixdown); //} return(result); }
// Applies values from an AudioTrack output to the preview object private static void UpdateAudioPreviewTrack(AudioOutputPreview outputPreviewTrack, OutputAudioTrackInfo outputTrack) { // Change from AudioTrack to custom object and remove dependency on JSON model? outputPreviewTrack.Encoder = outputTrack.Encoder.DisplayName; outputPreviewTrack.Mixdown = outputTrack.Mixdown.DisplayName; outputPreviewTrack.SampleRate = DisplayConversions.DisplaySampleRate(outputTrack.SampleRate); if (outputTrack.EncodeRateType == AudioEncodeRateType.Bitrate) { if (outputTrack.Bitrate >= 0) { outputPreviewTrack.Quality = outputTrack.Bitrate + " kbps"; } else { outputPreviewTrack.Quality = string.Empty; } } else { outputPreviewTrack.Quality = "CQ " + outputTrack.Quality; } var modifiers = new List <string>(); if (outputTrack.Gain != 0) { modifiers.Add(string.Format("{0}{1} dB", outputTrack.Gain > 0 ? "+" : string.Empty, outputTrack.Gain)); } if (outputTrack.Drc != 0) { modifiers.Add("DRC " + outputTrack.Drc.ToString(CultureInfo.CurrentCulture)); } outputPreviewTrack.Modifiers = string.Join(", ", modifiers); }
public AudioOutputPreview GetAudioPreview(SourceAudioTrack inputTrack, AudioEncodingViewModel audioVM) { HBAudioEncoder encoder = audioVM.HBAudioEncoder; var outputPreviewTrack = new AudioOutputPreview { Name = inputTrack.Description, Encoder = encoder.DisplayName }; if (encoder.IsPassthrough) { // For passthrough encodes, we need to make sure the input track is of the right type if (!HandBrakeEncoderHelpers.AudioEncoderIsCompatible(inputTrack.Codec, encoder) && encoder.ShortName != "copy") { return(null); } } if (encoder.ShortName == "copy") { if (this.copyMaskChoices.Items.Any( choice => { if (!choice.Enabled) { return(false); } return((HandBrakeEncoderHelpers.GetAudioEncoder("copy:" + choice.Codec).Id & inputTrack.Codec) > 0); })) { return(outputPreviewTrack); } if (this.Profile.AudioEncoderFallback == null) { encoder = HandBrakeEncoderHelpers.AudioEncoders.First(a => !a.IsPassthrough); } else { // The fallback is explicitly set to "None", so drop the track. if (this.Profile.AudioEncoderFallback == "none") { return(null); } encoder = HandBrakeEncoderHelpers.GetAudioEncoder(this.Profile.AudioEncoderFallback); } // Get the default output values for the input track and encoder var defaultSettings = AudioUtilities.GetDefaultSettings(inputTrack, encoder); // Apply the output values to the preview object UpdateAudioPreviewTrack(outputPreviewTrack, defaultSettings); } else { HBMixdown previewMixdown; previewMixdown = HandBrakeEncoderHelpers.SanitizeMixdown(audioVM.SelectedMixdown.Mixdown, encoder, (ulong)inputTrack.ChannelLayout); int previewSampleRate = audioVM.SampleRate; if (previewSampleRate == 0) { previewSampleRate = inputTrack.SampleRate; } // Collect the output values in the AudioTrack object var outputTrack = new OutputAudioTrackInfo { Encoder = encoder, Mixdown = previewMixdown, SampleRate = HandBrakeEncoderHelpers.SanitizeSampleRate(encoder, previewSampleRate), EncodeRateType = audioVM.EncodeRateType }; if (audioVM.EncodeRateType == AudioEncodeRateType.Bitrate) { int previewBitrate = audioVM.SelectedBitrate.Bitrate; if (previewBitrate == 0) { previewBitrate = HandBrakeEncoderHelpers.GetDefaultBitrate(encoder, previewSampleRate, previewMixdown); } else { previewBitrate = HandBrakeEncoderHelpers.SanitizeAudioBitrate(previewBitrate, encoder, previewSampleRate, previewMixdown); } outputTrack.Bitrate = previewBitrate; } else { outputTrack.Quality = audioVM.AudioQuality; } outputTrack.Gain = audioVM.Gain; outputTrack.Drc = audioVM.Drc; // Apply the output values to the preview object UpdateAudioPreviewTrack(outputPreviewTrack, outputTrack); } return(outputPreviewTrack); }