Exemple #1
0
        private SourceAudioTrack GetTargetAudioTrack()
        {
            if (this.main.SelectedTitle == null)
            {
                return(null);
            }

            SourceAudioTrack track             = null;
            List <int>       chosenAudioTracks = this.main.GetChosenAudioTracks();

            if (this.TargetStreamIndex > 0 && this.TargetStreamIndex <= chosenAudioTracks.Count)
            {
                int audioTrack = chosenAudioTracks[this.TargetStreamIndex - 1];
                if (audioTrack <= this.main.SelectedTitle.AudioList.Count)
                {
                    track = this.main.SelectedTitle.AudioList[audioTrack - 1];
                }
            }

            if (this.TargetStreamIndex == 0 && chosenAudioTracks.Count == 1)
            {
                int audioTrack = chosenAudioTracks[0];
                if (audioTrack <= this.main.SelectedTitle.AudioList.Count)
                {
                    track = this.main.SelectedTitle.AudioList[audioTrack - 1];
                }
            }

            return(track);
        }
Exemple #2
0
        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);
        }
Exemple #3
0
        private void RefreshMixdownChoices()
        {
            HBMixdown oldMixdown = null;

            if (this.SelectedMixdown != null)
            {
                oldMixdown = this.SelectedMixdown.Mixdown;
            }

            this.mixdownChoices = new List <MixdownViewModel>();

            HBAudioEncoder hbAudioEncoder = this.HBAudioEncoder;

            foreach (HBMixdown mixdown in HandBrakeEncoderHelpers.Mixdowns)
            {
                // Only add option if codec supports the mixdown
                if (HandBrakeEncoderHelpers.MixdownHasCodecSupport(mixdown, hbAudioEncoder))
                {
                    // Determine compatibility of mixdown with the input channel layout
                    // Incompatible mixdowns are grayed out
                    bool isCompatible = true;
                    if (this.main.HasVideoSource)
                    {
                        SourceAudioTrack track = this.GetTargetAudioTrack();
                        if (track != null)
                        {
                            isCompatible = HandBrakeEncoderHelpers.MixdownHasRemixSupport(mixdown, (ulong)track.ChannelLayout);
                        }
                    }

                    this.MixdownChoices.Add(new MixdownViewModel {
                        Mixdown = mixdown, IsCompatible = isCompatible
                    });
                }
            }

            this.RaisePropertyChanged(nameof(this.MixdownChoices));

            this.SelectMixdown(oldMixdown);

            this.RaisePropertyChanged(nameof(this.SelectedMixdown));
        }
Exemple #4
0
 /// <summary>
 /// Creates an instance of the AudioTrackViewModel class.
 /// </summary>
 /// <param name="audioTrack">The audio track to wrap.</param>
 /// <param name="trackNumber">The (1-based) track number.</param>
 public AudioTrackViewModel(SourceAudioTrack audioTrack, int trackNumber)
 {
     this.AudioTrack  = audioTrack;
     this.trackNumber = trackNumber;
 }
Exemple #5
0
        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);
        }
Exemple #6
0
 /// <summary>
 /// Creates an instance of the AudioTrackViewModel class.
 /// </summary>
 /// <param name="mainViewModel">An instance of the main viewmodel.</param>
 /// <param name="audioTrack">The audio track to wrap.</param>
 /// <param name="trackNumber">The (1-based) track number.</param>
 public AudioTrackViewModel(MainViewModel mainViewModel, SourceAudioTrack audioTrack, int trackNumber)
 {
     this.mainViewModel = mainViewModel;
     this.AudioTrack    = audioTrack;
     this.TrackNumber   = trackNumber;
 }
        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);
                }
            }

            // Find out what the real mixdown, sample rate and bitrate will be.
            HBMixdown mixdown;
            int       sampleRate, bitrate;

            if (encoder.ShortName == "copy")
            {
                if (this.CopyMaskChoices.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
                {
                    encoder = HandBrakeEncoderHelpers.GetAudioEncoder(this.Profile.AudioEncoderFallback);
                }

                mixdown    = HandBrakeEncoderHelpers.GetDefaultMixdown(encoder, (ulong)inputTrack.ChannelLayout);
                sampleRate = 0;
                bitrate    = 0;

                outputPreviewTrack.Encoder = encoder.DisplayName;
            }
            else
            {
                mixdown    = audioVM.SelectedMixdown.Mixdown;
                sampleRate = audioVM.SampleRate;
                bitrate    = audioVM.SelectedBitrate.Bitrate;
            }

            HBMixdown previewMixdown;

            previewMixdown = HandBrakeEncoderHelpers.SanitizeMixdown(mixdown, encoder, (ulong)inputTrack.ChannelLayout);

            int previewSampleRate = sampleRate;

            if (previewSampleRate == 0)
            {
                previewSampleRate = inputTrack.SampleRate;
            }

            int previewBitrate = bitrate;

            if (previewBitrate == 0)
            {
                previewBitrate = HandBrakeEncoderHelpers.GetDefaultBitrate(encoder, previewSampleRate, previewMixdown);
            }
            else
            {
                previewBitrate = HandBrakeEncoderHelpers.SanitizeAudioBitrate(previewBitrate, encoder, previewSampleRate, previewMixdown);
            }

            outputPreviewTrack.Mixdown    = previewMixdown.DisplayName;
            outputPreviewTrack.SampleRate = DisplayConversions.DisplaySampleRate(previewSampleRate);

            if (audioVM.EncodeRateType == AudioEncodeRateType.Bitrate)
            {
                if (previewBitrate >= 0)
                {
                    outputPreviewTrack.Quality = previewBitrate + " kbps";
                }
                else
                {
                    outputPreviewTrack.Quality = string.Empty;
                }
            }
            else
            {
                outputPreviewTrack.Quality = "CQ " + audioVM.AudioQuality;
            }

            var modifiers = new List <string>();

            if (audioVM.Gain != 0)
            {
                modifiers.Add(string.Format("{0}{1} dB", audioVM.Gain > 0 ? "+" : string.Empty, audioVM.Gain));
            }

            if (audioVM.Drc != 0)
            {
                modifiers.Add("DRC " + audioVM.Drc.ToString());
            }

            outputPreviewTrack.Modifiers = string.Join(", ", modifiers);

            return(outputPreviewTrack);
        }