OSDN Git Service

MacGui: Remove Target Size as a rate control option as it doesn't really work correct...
[handbrake-jp/handbrake-jp-git.git] / gtk / src / audiohandler.c
index 6ca0148..c52b2cd 100644 (file)
@@ -1,7 +1,7 @@
 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
 /*
  * audiohandler.c
- * Copyright (C) John Stebbins 2008 <stebbins@stebbins>
+ * Copyright (C) John Stebbins 2008-2011 <stebbins@stebbins>
  * 
  * audiohandler.c is free software.
  * 
 #include "audiohandler.h"
 
 static void ghb_add_audio(signal_user_data_t *ud, GValue *settings);
+static GValue* get_selected_asettings(signal_user_data_t *ud);
+
+static gboolean block_updates = FALSE;
 
 void
 ghb_adjust_audio_rate_combos(signal_user_data_t *ud)
 {
        gint titleindex, track, acodec, select_acodec, mix;
-       ghb_audio_info_t ainfo;
+       hb_audio_config_t *aconfig;
        GtkWidget *widget;
        GValue *gval;
        int mux;
        gint bitrate;
+       gint sr = 48000;
        
        g_debug("ghb_adjust_audio_rate_combos ()");
        mux = ghb_settings_combo_int(ud->settings, "FileFormat");
@@ -54,6 +58,10 @@ ghb_adjust_audio_rate_combos(signal_user_data_t *ud)
        gval = ghb_widget_value(widget);
        bitrate = ghb_lookup_combo_int("AudioBitrate", gval);
 
+       widget = GHB_WIDGET(ud->builder, "AudioSamplerate");
+       gval = ghb_widget_value(widget);
+       sr = ghb_lookup_combo_int("AudioSamplerate", gval);
+
        select_acodec = acodec;
        if (mux == HB_MUX_MP4)
        {
@@ -66,35 +74,38 @@ ghb_adjust_audio_rate_combos(signal_user_data_t *ud)
                acodec = select_acodec;
        }
 
+       aconfig = ghb_get_scan_audio_info(titleindex, track);
+       if (sr == 0)
+       {
+               sr = aconfig ? aconfig->in.samplerate : 48000;
+       }
+       gboolean codec_defined_bitrate = FALSE;
        if (ghb_audio_is_passthru (select_acodec))
        {
-               ghb_set_default_bitrate_opts (ud->builder, 0, -1);
-               if (ghb_get_audio_info (&ainfo, titleindex, track))
+               if (aconfig)
                {
-                       bitrate = ainfo.bitrate / 1000;
+                       bitrate = aconfig->in.bitrate / 1000;
 
                        // Set the values for bitrate and samplerate to the input rates
-                       if (ainfo.codec & select_acodec & HB_ACODEC_PASS_MASK)
+                       if (aconfig->in.codec & select_acodec & HB_ACODEC_PASS_MASK)
                        {
                                ghb_set_passthru_bitrate_opts (ud->builder, bitrate);
                                ghb_ui_update(ud, "AudioMixdown", ghb_int64_value(0));
-                               select_acodec &= ainfo.codec | HB_ACODEC_PASS_FLAG;
+                               select_acodec &= aconfig->in.codec | HB_ACODEC_PASS_FLAG;
+                               codec_defined_bitrate = TRUE;
                        }
                        else
                        {
-                               select_acodec = ghb_select_audio_codec(ud->settings, acodec, track);
+                               select_acodec = ghb_select_audio_codec(ud->settings, aconfig, acodec);
                                if (acodec != HB_ACODEC_ANY)
                                {
                                        ghb_ui_update(ud, "AudioEncoder", ghb_int64_value(select_acodec));
                                }
 
-                               int channels;
-                               mix = ghb_get_best_mix( titleindex, track, select_acodec, mix);
-                               channels = HB_AMIXDOWN_GET_DISCRETE_CHANNEL_COUNT(mix);
-                               bitrate = ghb_get_default_audio_bitrate(select_acodec, ainfo.samplerate, bitrate, channels);
+                               mix = ghb_get_best_mix( aconfig, select_acodec, mix);
+                               bitrate = hb_get_default_audio_bitrate(select_acodec, sr, mix);
                                ghb_ui_update(ud, "AudioMixdown", ghb_int64_value(mix));
                        }
-                       ghb_ui_update(ud, "AudioBitrate", ghb_int64_value(bitrate));
                        ghb_ui_update(ud, "AudioSamplerate", ghb_int64_value(0));
                }
                else
@@ -102,20 +113,31 @@ ghb_adjust_audio_rate_combos(signal_user_data_t *ud)
                        ghb_ui_update(ud, "AudioSamplerate", ghb_int64_value(0));
                        ghb_ui_update(ud, "AudioMixdown", ghb_int64_value(0));
                        bitrate = 448;
-                       mix = ghb_get_best_mix( titleindex, track, select_acodec, 0);
+                       mix = ghb_get_best_mix( aconfig, select_acodec, 0);
                }
                ghb_ui_update(ud, "AudioTrackDRCSlider", ghb_double_value(0));
        }
-       gint channels = HB_AMIXDOWN_GET_DISCRETE_CHANNEL_COUNT(mix);
-       bitrate = ghb_get_best_audio_bitrate(select_acodec, bitrate, channels);
+       else
+       {
+               bitrate = hb_get_best_audio_bitrate(select_acodec, bitrate, sr, mix);
+       }
+       if (!codec_defined_bitrate)
+       {
+               int low, high;
+               hb_get_audio_bitrate_limits(select_acodec, sr, mix, &low, &high);
+               ghb_set_default_bitrate_opts (ud->builder, low, high);
+       }
        ghb_ui_update(ud, "AudioBitrate", ghb_int64_value(bitrate));
 
-       int low, high;
-       ghb_get_audio_bitrate_limits(select_acodec, channels, &low, &high);
-       ghb_set_default_bitrate_opts (ud->builder, low, high);
-
        ghb_settings_take_value(ud->settings, "AudioEncoderActual", 
                                                        ghb_lookup_acodec_value(select_acodec));
+       GValue *asettings = get_selected_asettings(ud);
+       if (asettings)
+       {
+               ghb_settings_take_value(asettings, "AudioEncoderActual", 
+                                                       ghb_lookup_acodec_value(select_acodec));
+       }
+       ghb_audio_list_refresh_selected(ud);
        ghb_check_dependency(ud, NULL, "AudioEncoderActual");
 }
 
@@ -145,14 +167,13 @@ ghb_set_pref_audio(gint titleindex, signal_user_data_t *ud)
 {
        gint fallback_acodec, track;
        gchar *source_lang = NULL;
-       GtkWidget *button;
-       ghb_audio_info_t ainfo;
+       hb_audio_config_t *aconfig;
        GHashTable *track_indices;
        gint mux;
 
        const GValue *pref_audio;
        const GValue *audio, *drc;
-       gint mix_acodec, acodec, bitrate, mix;
+       gint acodec, bitrate, mix;
        gdouble rate;
        gint count, ii, list_count;
        
@@ -171,7 +192,6 @@ ghb_set_pref_audio(gint titleindex, signal_user_data_t *ud)
        // Clear the audio list
        ghb_clear_audio_list(ud);
        // Find "best" audio based on audio preferences
-       button = GHB_WIDGET (ud->builder, "audio_add");
        if (!ghb_settings_get_boolean(ud->settings, "AudioDUB"))
        {
                source_lang = ghb_get_source_audio_lang(titleindex, 0);
@@ -203,7 +223,6 @@ ghb_set_pref_audio(gint titleindex, signal_user_data_t *ud)
                {
                        fallback_acodec = HB_ACODEC_AC3;
                }
-               mix_acodec = acodec;
                bitrate = ghb_settings_combo_int(audio, "AudioBitrate");
                rate = ghb_settings_combo_double(audio, "AudioSamplerate");
                mix = ghb_settings_combo_int(audio, "AudioMixdown");
@@ -217,15 +236,14 @@ ghb_set_pref_audio(gint titleindex, signal_user_data_t *ud)
                // 1. pref codec is passthru
                // 2. source codec is not passthru
                // 3. next pref is enabled
-               if (ghb_get_audio_info (&ainfo, titleindex, track) && 
-                       ghb_audio_is_passthru (acodec))
+               aconfig = ghb_get_scan_audio_info(titleindex, track);
+               if (aconfig && ghb_audio_is_passthru (acodec))
                {
                        // HB_ACODEC_* are bit fields.  Treat acodec as mask
-                       if (!(ainfo.codec & select_acodec & HB_ACODEC_PASS_MASK))
+                       if (!(aconfig->in.codec & select_acodec & HB_ACODEC_PASS_MASK))
                        {
                                if (acodec != HB_ACODEC_ANY)
                                        acodec = fallback_acodec;
-                               mix_acodec = fallback_acodec;
                                // If we can't substitute the passthru with a suitable
                                // encoder and
                                // If there's more audio to process, or we've already
@@ -239,9 +257,10 @@ ghb_set_pref_audio(gint titleindex, signal_user_data_t *ud)
                                else
                                {
                                        int channels, min_rate, max_rate;
-                                       mix = ghb_get_best_mix( titleindex, track, mix_acodec, mix);
+                                       select_acodec = fallback_acodec;
+                                       mix = ghb_get_best_mix(aconfig, select_acodec, mix);
                                        channels = HB_AMIXDOWN_GET_DISCRETE_CHANNEL_COUNT(mix);
-                                       bitrate = ainfo.bitrate / 1000;
+                                       bitrate = aconfig->in.bitrate / 1000;
                                        min_rate = channels * 64;
                                        max_rate = channels * 160;
                                        if (bitrate < min_rate)
@@ -251,6 +270,10 @@ ghb_set_pref_audio(gint titleindex, signal_user_data_t *ud)
                                        rate = 0;
                                }
                        }
+                       else
+                       {
+                               select_acodec &= aconfig->in.codec | HB_ACODEC_PASS_FLAG;
+                       }
                }
                if (titleindex >= 0 && track < 0)
                        acodec = 0;
@@ -261,13 +284,13 @@ ghb_set_pref_audio(gint titleindex, signal_user_data_t *ud)
                        ghb_settings_set_string(settings, "AudioEncoder", 
                                ghb_lookup_combo_string("AudioEncoder", ghb_int_value(acodec)));
                        ghb_settings_set_value(settings, "AudioEncoderActual", 
-                               ghb_settings_get_value(ud->settings, "AudioEncoderActual"));
+                                                                       ghb_lookup_acodec_value(select_acodec));
                        // This gets set autimatically if the codec is passthru
                        ghb_settings_set_string(settings, "AudioBitrate",
                                ghb_lookup_combo_string("AudioBitrate", ghb_int_value(bitrate)));
                        ghb_settings_set_string(settings, "AudioSamplerate",
                                ghb_lookup_combo_string("AudioSamplerate", ghb_int_value(rate)));
-                       mix = ghb_get_best_mix( titleindex, track, mix_acodec, mix);
+                       mix = ghb_get_best_mix( aconfig, select_acodec, mix);
                        ghb_settings_set_string(settings, "AudioMixdown",
                                ghb_lookup_combo_string("AudioMixdown", ghb_int_value(mix)));
                        ghb_settings_set_value(settings, "AudioTrackDRCSlider", drc);
@@ -332,7 +355,7 @@ ghb_audio_list_refresh_selected(signal_user_data_t *ud)
        {
                const gchar *track, *codec, *br, *sr, *mix;
                gchar *s_drc;
-               gint itrack, icodec;
+               gint itrack;
                gdouble drc;
                // Get the row number
                treepath = gtk_tree_model_get_path (store, &iter);
@@ -348,8 +371,7 @@ ghb_audio_list_refresh_selected(signal_user_data_t *ud)
 
                track = ghb_settings_combo_option(asettings, "AudioTrack");
                itrack = ghb_settings_combo_int(asettings, "AudioTrack");
-               codec = ghb_settings_combo_option(asettings, "AudioEncoder");
-               icodec = ghb_settings_combo_int(asettings, "AudioEncoder");
+               codec = ghb_settings_combo_option(asettings, "AudioEncoderActual");
                br = ghb_settings_combo_option(asettings, "AudioBitrate");
                sr = ghb_settings_combo_option(asettings, "AudioSamplerate");
                mix = ghb_settings_combo_option(asettings, "AudioMixdown");
@@ -360,9 +382,6 @@ ghb_audio_list_refresh_selected(signal_user_data_t *ud)
                else
                        s_drc = g_strdup_printf("%.1f", drc);
 
-               if (icodec == HB_ACODEC_ANY)
-                       codec = ghb_select_audio_codec_str(ud->settings, icodec, itrack);
-
                gtk_list_store_set(GTK_LIST_STORE(store), &iter, 
                        // These are displayed in list
                        0, track,
@@ -386,6 +405,15 @@ audio_codec_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
        g_debug("audio_codec_changed_cb ()");
        gval = ghb_widget_value(widget);
        acodec_code = ghb_lookup_combo_int("AudioEncoder", gval);
+       if (block_updates)
+       {
+               prev_acodec = acodec_code;
+               ghb_grey_combo_options (ud->builder);
+               return;
+       }
+
+       gval = ghb_widget_value(widget);
+       acodec_code = ghb_lookup_combo_int("AudioEncoder", gval);
        ghb_value_free(gval);
 
        asettings = get_selected_asettings(ud);
@@ -401,7 +429,7 @@ audio_codec_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
                if (asettings != NULL)
                {
                        br = ghb_settings_get_int(asettings, "AudioBitrate");
-                       sr = ghb_settings_get_int(asettings, "AudioSamplerate");
+                       sr = ghb_settings_combo_int(asettings, "AudioSamplerate");
                        mix_code = ghb_settings_combo_int(asettings, "AudioMixdown");
                }
                else
@@ -413,14 +441,22 @@ audio_codec_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
 
                titleindex = ghb_settings_combo_int(ud->settings, "title");
                track = ghb_settings_combo_int(ud->settings, "AudioTrack");
+               if (sr)
+               {
+                       sr = ghb_find_closest_audio_rate(sr);
+               }
+               ghb_ui_update(ud, "AudioSamplerate", ghb_int64_value(sr));
 
-               mix_code = ghb_get_best_mix( titleindex, track, acodec_code, mix_code);
-               int channels = HB_AMIXDOWN_GET_DISCRETE_CHANNEL_COUNT(mix_code);
-               br = ghb_get_best_audio_bitrate(acodec_code, br, channels);
+               hb_audio_config_t *aconfig;
+               aconfig = ghb_get_scan_audio_info(titleindex, track);
+               if (sr == 0)
+               {
+                       sr = aconfig ? aconfig->in.samplerate : 48000;
+               }
+               mix_code = ghb_get_best_mix( aconfig, acodec_code, mix_code);
+               br = hb_get_best_audio_bitrate(acodec_code, br, sr, mix_code);
                ghb_ui_update(ud, "AudioBitrate", ghb_int64_value(br));
 
-               sr = ghb_find_closest_audio_rate(sr);
-               ghb_ui_update(ud, "AudioSamplerate", ghb_int64_value(sr));
                ghb_ui_update(ud, "AudioMixdown", ghb_int64_value(mix_code));
        }
        ghb_adjust_audio_rate_combos(ud);
@@ -443,6 +479,8 @@ audio_track_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
        GValue *asettings;
 
        g_debug("audio_track_changed_cb ()");
+       if (block_updates) return;
+
        ghb_adjust_audio_rate_combos(ud);
        ghb_check_dependency(ud, widget, NULL);
        ghb_grey_combo_options(ud->builder);
@@ -465,6 +503,8 @@ audio_mix_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
        GValue *asettings;
 
        g_debug("audio_mix_changed_cb ()");
+       if (block_updates) return;
+
        ghb_adjust_audio_rate_combos(ud);
        ghb_check_dependency(ud, widget, NULL);
        asettings = get_selected_asettings(ud);
@@ -482,6 +522,9 @@ audio_widget_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
        GValue *asettings;
 
        g_debug("audio_widget_changed_cb ()");
+       if (block_updates) return;
+
+       ghb_adjust_audio_rate_combos(ud);
        ghb_check_dependency(ud, widget, NULL);
        asettings = get_selected_asettings(ud);
        if (asettings != NULL)
@@ -500,6 +543,7 @@ drc_widget_changed_cb(GtkWidget *widget, gdouble val, signal_user_data_t *ud)
        gchar *drc;
 
        g_debug("drc_widget_changed_cb ()");
+       if (block_updates) return;
 
        label = GTK_LABEL(GHB_WIDGET(ud->builder, "drc_label"));
        if (val < 1.0)
@@ -548,7 +592,7 @@ add_to_audio_list(signal_user_data_t *ud, GValue *settings)
        GtkTreeSelection *selection;
        const gchar *track, *codec, *br, *sr, *mix;
        gchar *s_drc;
-       gint icodec, itrack;
+       gint itrack;
        gdouble drc;
        
        g_debug("add_to_audio_list ()");
@@ -558,8 +602,7 @@ add_to_audio_list(signal_user_data_t *ud, GValue *settings)
 
        track = ghb_settings_combo_option(settings, "AudioTrack");
        itrack = ghb_settings_combo_int(settings, "AudioTrack");
-       codec = ghb_settings_combo_option(settings, "AudioEncoder");
-       icodec = ghb_settings_combo_int(settings, "AudioEncoder");
+       codec = ghb_settings_combo_option(settings, "AudioEncoderActual");
        br = ghb_settings_combo_option(settings, "AudioBitrate");
        sr = ghb_settings_combo_option(settings, "AudioSamplerate");
        mix = ghb_settings_combo_option(settings, "AudioMixdown");
@@ -570,11 +613,6 @@ add_to_audio_list(signal_user_data_t *ud, GValue *settings)
        else
                s_drc = g_strdup_printf("%.1f", drc);
 
-       if (icodec == HB_ACODEC_ANY)
-       {
-               codec = ghb_select_audio_codec_str(ud->settings, icodec, itrack);
-       }
-
        gtk_list_store_append(store, &iter);
        gtk_list_store_set(store, &iter, 
                // These are displayed in list
@@ -620,6 +658,7 @@ audio_list_selection_changed_cb(GtkTreeSelection *selection, signal_user_data_t
                        return;
                asettings = ghb_array_get_nth(audio_list, row);
 
+               block_updates = TRUE;
                ghb_ui_update(ud, "AudioTrack", ghb_settings_get_value(asettings, "AudioTrack"));
                ghb_ui_update(ud, "AudioEncoder", ghb_settings_get_value(asettings, "AudioEncoder"));
                ghb_settings_set_value(ud->settings, "AudioEncoderActual", ghb_settings_get_value(asettings, "AudioEncoderActual"));
@@ -628,6 +667,7 @@ audio_list_selection_changed_cb(GtkTreeSelection *selection, signal_user_data_t
                ghb_ui_update(ud, "AudioSamplerate", ghb_settings_get_value(asettings, "AudioSamplerate"));
                ghb_ui_update(ud, "AudioMixdown", ghb_settings_get_value(asettings, "AudioMixdown"));
                ghb_ui_update(ud, "AudioTrackDRCSlider", ghb_settings_get_value(asettings, "AudioTrackDRCSlider"));
+               block_updates = FALSE;
                widget = GHB_WIDGET (ud->builder, "audio_remove");
                gtk_widget_set_sensitive(widget, TRUE);
        }
@@ -746,16 +786,14 @@ void
 ghb_set_audio(signal_user_data_t *ud, GValue *settings)
 {
        gint acodec_code;
-       GtkWidget *button;
 
        GValue *alist;
-       GValue *track, *audio, *acodec, *bitrate, *rate, *mix, *drc;
+       GValue *track, *audio, *acodec, *acodec_actual, *bitrate, *rate, *mix, *drc;
        gint count, ii;
        
        g_debug("set_audio");
        // Clear the audio list
        ghb_clear_audio_list(ud);
-       button = GHB_WIDGET (ud->builder, "audio_add");
        alist = ghb_settings_get_value(settings, "audio_list");
 
        count = ghb_array_len(alist);
@@ -764,6 +802,7 @@ ghb_set_audio(signal_user_data_t *ud, GValue *settings)
                audio = ghb_array_get_nth(alist, ii);
                track = ghb_settings_get_value(audio, "AudioTrack");
                acodec = ghb_settings_get_value(audio, "AudioEncoder");
+               acodec_actual = ghb_settings_get_value(audio, "AudioEncoderActual");
                bitrate = ghb_settings_get_value(audio, "AudioBitrate");
                rate = ghb_settings_get_value(audio, "AudioSamplerate");
                mix = ghb_settings_get_value(audio, "AudioMixdown");
@@ -775,8 +814,8 @@ ghb_set_audio(signal_user_data_t *ud, GValue *settings)
                        GValue *settings = ghb_dict_value_new();
                        ghb_settings_set_value(settings, "AudioTrack", track);
                        ghb_settings_set_value(settings, "AudioEncoder", acodec);
-                       ghb_settings_set_value(settings, "AudioEncoderActual", 
-                               ghb_settings_get_value(ud->settings, "AudioEncoderActual"));
+                       ghb_settings_set_value(settings, "AudioEncoderActual", acodec_actual);
+
                        // This gets set autimatically if the codec is passthru
                        ghb_settings_set_value(settings, "AudioBitrate", bitrate);
                        ghb_settings_set_value(settings, "AudioSamplerate", rate);