/// <summary> /// The calculate bitrate limits. /// </summary> private void SetupBitrateLimits() { // Base set of bitrates available. List <int> audioBitrates = HandBrakeEncoderHelpers.AudioBitrates; // Defaults int max = 256; int low = 32; // Based on the users settings, find the high and low bitrates. HBAudioEncoder hbaenc = HandBrakeEncoderHelpers.GetAudioEncoder(EnumHelper <HandBrakeWPF.Services.Encode.Model.Models.AudioEncoder> .GetShortName(this.Encoder)); HBRate rate = HandBrakeEncoderHelpers.AudioSampleRates.FirstOrDefault(t => t.Name == this.SampleRate.ToString(CultureInfo.InvariantCulture)); HBMixdown mixdown = this.mixDown != null?HandBrakeEncoderHelpers.GetMixdown(this.mixDown) : HandBrakeEncoderHelpers.GetMixdown("dpl2"); BitrateLimits limits = HandBrakeEncoderHelpers.GetBitrateLimits(hbaenc, rate != null ? rate.Rate : 48000, mixdown); if (limits != null) { max = limits.High; low = limits.Low; } // Return the subset of available bitrates. List <int> subsetBitrates = audioBitrates.Where(b => b <= max && b >= low).ToList(); this.bitrates = subsetBitrates; this.NotifyOfPropertyChange(() => this.Bitrates); // If the subset does not contain the current bitrate, request the default. if (!subsetBitrates.Contains(this.Bitrate)) { this.Bitrate = HandBrakeEncoderHelpers.GetDefaultBitrate(hbaenc, rate != null ? rate.Rate : 48000, mixdown); } }
private static void ParseAudio(EncodeTask task, JsonEncodeObject job) { if (job.Audio == null) { return; } task.AllowedPassthruOptions.AudioAllowAACPass = job.Audio.CopyMask.Contains(EnumHelper <AudioEncoder> .GetShortName(AudioEncoder.AacPassthru)); task.AllowedPassthruOptions.AudioAllowAC3Pass = job.Audio.CopyMask.Contains(EnumHelper <AudioEncoder> .GetShortName(AudioEncoder.Ac3Passthrough)); task.AllowedPassthruOptions.AudioAllowDTSHDPass = job.Audio.CopyMask.Contains(EnumHelper <AudioEncoder> .GetShortName(AudioEncoder.DtsHDPassthrough)); task.AllowedPassthruOptions.AudioAllowDTSPass = job.Audio.CopyMask.Contains(EnumHelper <AudioEncoder> .GetShortName(AudioEncoder.DtsPassthrough)); task.AllowedPassthruOptions.AudioAllowEAC3Pass = job.Audio.CopyMask.Contains(EnumHelper <AudioEncoder> .GetShortName(AudioEncoder.EAc3Passthrough)); task.AllowedPassthruOptions.AudioAllowFlacPass = job.Audio.CopyMask.Contains(EnumHelper <AudioEncoder> .GetShortName(AudioEncoder.FlacPassthru)); task.AllowedPassthruOptions.AudioAllowMP3Pass = job.Audio.CopyMask.Contains(EnumHelper <AudioEncoder> .GetShortName(AudioEncoder.Mp3Passthru)); task.AllowedPassthruOptions.AudioAllowTrueHDPass = job.Audio.CopyMask.Contains(EnumHelper <AudioEncoder> .GetShortName(AudioEncoder.TrueHDPassthrough)); task.AllowedPassthruOptions.AudioEncoderFallback = EnumHelper <AudioEncoder> .GetValue(job.Audio.FallbackEncoder); foreach (HandBrake.Interop.Interop.Json.Encode.AudioTrack item in job.Audio.AudioList) { HBMixdown mixdown = HandBrakeEncoderHelpers.Mixdowns.FirstOrDefault(m => m.Id == item.Mixdown); HBRate sampleRate = HandBrakeEncoderHelpers.AudioSampleRates.FirstOrDefault(s => s.Rate == item.Samplerate); AudioTrack track = new AudioTrack(); track.ScannedTrack = new Scan.Model.Audio(item.Track); // When adding to the queue, we don't need the full context. Editing queue will recovery this. track.Encoder = EnumHelper <AudioEncoder> .GetValue(item.Encoder); track.Gain = (int)item.Gain; track.MixDown = mixdown?.ShortName; track.TrackName = item.Name; track.SampleRate = sampleRate?.Rate ?? 48; // TODO this may not work. Check track.DRC = item.DRC; if (!track.IsPassthru && item.Bitrate.HasValue) { track.Bitrate = item.Bitrate.Value; track.EncoderRateType = AudioEncoderRateType.Bitrate; } if (!track.IsPassthru && item.Quality.HasValue) { track.Quality = item.Quality.Value; track.EncoderRateType = AudioEncoderRateType.Quality; } task.AudioTracks.Add(track); } }
/// <summary> /// The create audio. /// </summary> /// <param name="job"> /// The job. /// </param> /// <returns> /// The <see cref="Audio"/>. /// </returns> private static Audio CreateAudio(EncodeTask job) { Audio audio = new Audio(); List <string> copyMaskList = new List <string>(); if (job.AllowedPassthruOptions.AudioAllowAACPass) { copyMaskList.Add(EnumHelper <AudioEncoder> .GetShortName(AudioEncoder.AacPassthru)); } if (job.AllowedPassthruOptions.AudioAllowAC3Pass) { copyMaskList.Add(EnumHelper <AudioEncoder> .GetShortName(AudioEncoder.Ac3Passthrough)); } if (job.AllowedPassthruOptions.AudioAllowDTSHDPass) { copyMaskList.Add(EnumHelper <AudioEncoder> .GetShortName(AudioEncoder.DtsHDPassthrough)); } if (job.AllowedPassthruOptions.AudioAllowDTSPass) { copyMaskList.Add(EnumHelper <AudioEncoder> .GetShortName(AudioEncoder.DtsPassthrough)); } if (job.AllowedPassthruOptions.AudioAllowEAC3Pass) { copyMaskList.Add(EnumHelper <AudioEncoder> .GetShortName(AudioEncoder.EAc3Passthrough)); } if (job.AllowedPassthruOptions.AudioAllowFlacPass) { copyMaskList.Add(EnumHelper <AudioEncoder> .GetShortName(AudioEncoder.FlacPassthru)); } if (job.AllowedPassthruOptions.AudioAllowMP3Pass) { copyMaskList.Add(EnumHelper <AudioEncoder> .GetShortName(AudioEncoder.Mp3Passthru)); } if (job.AllowedPassthruOptions.AudioAllowTrueHDPass) { copyMaskList.Add(EnumHelper <AudioEncoder> .GetShortName(AudioEncoder.TrueHDPassthrough)); } audio.CopyMask = copyMaskList.ToArray(); HBAudioEncoder audioEncoder = HandBrakeEncoderHelpers.GetAudioEncoder(EnumHelper <AudioEncoder> .GetShortName(job.AllowedPassthruOptions.AudioEncoderFallback)); audio.FallbackEncoder = audioEncoder.ShortName; audio.AudioList = new List <HandBrake.Interop.Interop.Json.Encode.AudioTrack>(); foreach (AudioTrack item in job.AudioTracks) { HBAudioEncoder encoder = HandBrakeEncoderHelpers.GetAudioEncoder(EnumHelper <AudioEncoder> .GetShortName(item.Encoder)); Validate.NotNull(encoder, "Unrecognized audio encoder:" + item.Encoder); if (item.IsPassthru && (item.ScannedTrack.Codec & encoder.Id) == 0) { // We have an unsupported passthru. Rather than let libhb drop the track, switch it to the fallback. encoder = HandBrakeEncoderHelpers.GetAudioEncoder(EnumHelper <AudioEncoder> .GetShortName(job.AllowedPassthruOptions.AudioEncoderFallback)); } HBMixdown mixdown = HandBrakeEncoderHelpers.GetMixdown(item.MixDown); HBRate sampleRate = HandBrakeEncoderHelpers.AudioSampleRates.FirstOrDefault(s => s.Name == item.SampleRate.ToString(CultureInfo.InvariantCulture)); HandBrake.Interop.Interop.Json.Encode.AudioTrack audioTrack = new HandBrake.Interop.Interop.Json.Encode.AudioTrack { Track = (item.Track.HasValue ? item.Track.Value : 0) - 1, DRC = item.DRC, Encoder = encoder.ShortName, Gain = item.Gain, Mixdown = mixdown != null ? mixdown.Id : -1, NormalizeMixLevel = false, Samplerate = sampleRate != null ? sampleRate.Rate : 0, Name = !string.IsNullOrEmpty(item.TrackName) ? item.TrackName : null, }; if (!item.IsPassthru) { if (item.EncoderRateType == AudioEncoderRateType.Quality) { audioTrack.Quality = item.Quality; } if (item.EncoderRateType == AudioEncoderRateType.Bitrate) { audioTrack.Bitrate = item.Bitrate; } } audio.AudioList.Add(audioTrack); } return(audio); }
/// <summary> /// The create audio. /// </summary> /// <param name="job"> /// The job. /// </param> /// <returns> /// The <see cref="Audio"/>. /// </returns> private static Audio CreateAudio(EncodeTask job) { Audio audio = new Audio(); List <uint> copyMaskList = new List <uint>(); if (job.AllowedPassthruOptions.AudioAllowAACPass) { copyMaskList.Add(NativeConstants.HB_ACODEC_AAC_PASS); } if (job.AllowedPassthruOptions.AudioAllowAC3Pass) { copyMaskList.Add(NativeConstants.HB_ACODEC_AC3_PASS); } if (job.AllowedPassthruOptions.AudioAllowDTSHDPass) { copyMaskList.Add(NativeConstants.HB_ACODEC_DCA_HD_PASS); } if (job.AllowedPassthruOptions.AudioAllowDTSPass) { copyMaskList.Add(NativeConstants.HB_ACODEC_DCA_PASS); } if (job.AllowedPassthruOptions.AudioAllowEAC3Pass) { copyMaskList.Add(NativeConstants.HB_ACODEC_EAC3_PASS); } if (job.AllowedPassthruOptions.AudioAllowFlacPass) { copyMaskList.Add(NativeConstants.HB_ACODEC_FLAC_PASS); } if (job.AllowedPassthruOptions.AudioAllowMP3Pass) { copyMaskList.Add(NativeConstants.HB_ACODEC_MP3_PASS); } if (job.AllowedPassthruOptions.AudioAllowTrueHDPass) { copyMaskList.Add(NativeConstants.HB_ACODEC_TRUEHD_PASS); } audio.CopyMask = copyMaskList.ToArray(); HBAudioEncoder audioEncoder = HandBrakeEncoderHelpers.GetAudioEncoder(EnumHelper <AudioEncoder> .GetShortName(job.AllowedPassthruOptions.AudioEncoderFallback)); audio.FallbackEncoder = audioEncoder.Id; audio.AudioList = new List <HandBrake.ApplicationServices.Interop.Json.Encode.AudioTrack>(); foreach (AudioTrack item in job.AudioTracks) { HBAudioEncoder encoder = HandBrakeEncoderHelpers.GetAudioEncoder(EnumHelper <AudioEncoder> .GetShortName(item.Encoder)); Validate.NotNull(encoder, "Unrecognized audio encoder:" + item.Encoder); HBMixdown mixdown = HandBrakeEncoderHelpers.GetMixdown(item.MixDown); HBRate sampleRate = HandBrakeEncoderHelpers.AudioSampleRates.FirstOrDefault(s => s.Name == item.SampleRate.ToString(CultureInfo.InvariantCulture)); HandBrake.ApplicationServices.Interop.Json.Encode.AudioTrack audioTrack = new HandBrake.ApplicationServices.Interop.Json.Encode.AudioTrack { Track = (item.Track.HasValue ? item.Track.Value : 0) - 1, DRC = item.DRC, Encoder = encoder.Id, Gain = item.Gain, Mixdown = mixdown != null ? mixdown.Id : -1, NormalizeMixLevel = false, Samplerate = sampleRate != null ? sampleRate.Rate : 0, Name = !string.IsNullOrEmpty(item.TrackName) ? item.TrackName : null, }; if (!item.IsPassthru) { if (item.EncoderRateType == AudioEncoderRateType.Quality) { audioTrack.Quality = item.Quality; } if (item.EncoderRateType == AudioEncoderRateType.Bitrate) { audioTrack.Bitrate = item.Bitrate; } } audio.AudioList.Add(audioTrack); } return(audio); }