summaryrefslogtreecommitdiffstats
path: root/libhb/preset.c
diff options
context:
space:
mode:
authorJohn Stebbins <[email protected]>2016-09-08 09:08:43 -0700
committerJohn Stebbins <[email protected]>2016-09-08 09:10:56 -0700
commit0b33dd8bb12afc94ee0616859b268b28a35d4906 (patch)
tree67d808016ef798e8dc3d009f67458b806658b5db /libhb/preset.c
parente9b2d291789edf2d08453c6554e1594aedfd495d (diff)
LinGui: fix some issues with reloading audio defaults
Reloading the audio defaults basically didn't work right. Some settings didn't get loaded, some got loaded and not displayed or displayed wrong.
Diffstat (limited to 'libhb/preset.c')
-rw-r--r--libhb/preset.c99
1 files changed, 99 insertions, 0 deletions
diff --git a/libhb/preset.c b/libhb/preset.c
index 8f6ccc07c..60f46b218 100644
--- a/libhb/preset.c
+++ b/libhb/preset.c
@@ -507,6 +507,101 @@ static int sanitize_audio_codec(int in_codec, int out_codec,
return codec;
}
+void hb_sanitize_audio_settings(const hb_title_t * title,
+ hb_value_t * audio_settings)
+{
+ const char * mix_name;
+ const char * codec_name;
+ int track, codec, mix, bitrate, samplerate;
+ int quality_enable;
+ double quality;
+ hb_value_t * val;
+ hb_audio_config_t * audio_config = NULL;
+
+ track = hb_dict_get_int(audio_settings, "Track");
+ codec_name = hb_dict_get_string(audio_settings, "Encoder");
+ codec = hb_audio_encoder_get_from_name(codec_name);
+ mix_name = hb_dict_get_string(audio_settings, "Mixdown");
+ mix = hb_mixdown_get_from_name(mix_name);
+ bitrate = hb_dict_get_int(audio_settings, "Bitrate");
+ quality = hb_dict_get_double(audio_settings, "Quality");
+ samplerate = hb_dict_get_int(audio_settings, "Samplerate");
+ val = hb_dict_get(audio_settings, "Quality");
+ quality_enable = !(bitrate > 0 || val == NULL ||
+ quality == HB_INVALID_AUDIO_QUALITY);
+
+ if (title != NULL)
+ {
+ audio_config = hb_list_audio_config_item(title->list_audio, track);
+ }
+ if (samplerate == 0 && audio_config != NULL)
+ {
+ samplerate = audio_config->in.samplerate;
+ }
+
+ if (codec & HB_ACODEC_PASS_FLAG)
+ {
+ mix = HB_AMIXDOWN_NONE;
+ hb_dict_set(audio_settings, "Mixdown",
+ hb_value_string(hb_mixdown_get_short_name(mix)));
+ hb_dict_set(audio_settings, "Samplerate", hb_value_int(0));
+ hb_dict_set(audio_settings, "DRC", hb_value_double(0.0));
+ }
+ else
+ {
+ int layout = AV_CH_LAYOUT_5POINT1;
+ if (audio_config != NULL)
+ {
+ layout = audio_config->in.channel_layout;
+ }
+ if (mix == HB_AMIXDOWN_NONE)
+ {
+ mix = HB_INVALID_AMIXDOWN;
+ }
+ mix = hb_mixdown_get_best(codec, layout, mix);
+ if (quality_enable)
+ {
+ float low, high, gran;
+ int dir;
+ hb_audio_quality_get_limits(codec, &low, &high, &gran, &dir);
+ if (quality < low || quality > high)
+ {
+ quality = hb_audio_quality_get_default(codec);
+ }
+ else
+ {
+ quality = hb_audio_quality_get_best(codec, quality);
+ }
+ }
+ else
+ {
+ if (bitrate != -1)
+ {
+ bitrate = hb_audio_bitrate_get_best(codec, bitrate,
+ samplerate, mix);
+ }
+ else
+ {
+ bitrate = hb_audio_bitrate_get_default(codec, samplerate, mix);
+ }
+ }
+ hb_dict_set(audio_settings, "Mixdown",
+ hb_value_string(hb_mixdown_get_short_name(mix)));
+ }
+ if (quality_enable)
+ {
+ bitrate = -1;
+ }
+ else
+ {
+ quality = HB_INVALID_AUDIO_QUALITY;
+ }
+ hb_dict_set(audio_settings, "Quality", hb_value_double(quality));
+ hb_dict_set(audio_settings, "Bitrate", hb_value_int(bitrate));
+ hb_dict_set(audio_settings, "Encoder",
+ hb_value_string(hb_audio_encoder_get_short_name(codec)));
+}
+
static void add_audio_for_lang(hb_value_array_t *list, const hb_dict_t *preset,
hb_title_t *title, int mux, int copy_mask,
int fallback, const char *lang,
@@ -616,6 +711,10 @@ static void add_audio_for_lang(hb_value_array_t *list, const hb_dict_t *preset,
HB_VALUE_TYPE_INT));
}
}
+
+ // Sanitize the settings before adding to the audio list
+ hb_sanitize_audio_settings(title, audio_dict);
+
hb_value_array_append(list, audio_dict);
}
if (behavior == 2)