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 / subtitlehandler.c
index b781cfb..0746b26 100644 (file)
@@ -1,7 +1,7 @@
 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
 /*
  * subtitlehandler.c
- * Copyright (C) John Stebbins 2008 <stebbins@stebbins>
+ * Copyright (C) John Stebbins 2008-2011 <stebbins@stebbins>
  * 
  * subtitlehandler.c is free software.
  * 
@@ -39,24 +39,21 @@ free_subtitle_key(gpointer data)
 }
 
 static gboolean
-mustBurn(signal_user_data_t *ud, gint track)
+mustBurn(signal_user_data_t *ud, GValue *settings)
 {
-       gint mux;
+       return FALSE;
+}
 
-       mux = ghb_settings_combo_int(ud->settings, "FileFormat");
-       if (mux == HB_MUX_MP4)
-       {
-               gint source;
+static gboolean
+canBurn(int source)
+{
+       return (source == VOBSUB || source == SSASUB);
+}
 
-               // MP4 can only handle burned vobsubs.  make sure there isn't
-               // already something burned in the list
-               source = ghb_subtitle_track_source(ud, track);
-               if (source == VOBSUB)
-               {
-                       return TRUE;
-               }
-       }
-       return FALSE;
+static gboolean
+canForce(int source)
+{
+       return (source == VOBSUB);
 }
 
 gboolean
@@ -82,7 +79,7 @@ ghb_subtitle_exclusive_burn(signal_user_data_t *ud, gint index)
 {
        GValue *subtitle_list;
        GValue *settings;
-       gint ii, count, tt;
+       gint ii, count;
        GtkTreeView  *tv;
        GtkTreeModel *tm;
        GtkTreeIter   ti;
@@ -94,14 +91,13 @@ ghb_subtitle_exclusive_burn(signal_user_data_t *ud, gint index)
        for (ii = 0; ii < count; ii++)
        {
                settings = ghb_array_get_nth(subtitle_list, ii);
-               tt = ghb_settings_combo_int(settings, "SubtitleTrack");
                burned = ghb_settings_get_boolean(settings, "SubtitleBurned");
 
                tv = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "subtitle_list"));
                g_return_if_fail(tv != NULL);
                tm = gtk_tree_view_get_model(tv);
                gtk_tree_model_iter_nth_child(tm, &ti, NULL, ii);
-               if (burned && ii != index && !mustBurn(ud, tt))
+               if (burned && ii != index && !mustBurn(ud, settings))
                {
                        ghb_settings_set_boolean(settings, "SubtitleBurned", FALSE);
                        gtk_list_store_set(GTK_LIST_STORE(tm), &ti, 2, FALSE, -1);
@@ -151,13 +147,12 @@ ghb_add_srt(signal_user_data_t *ud, GValue *settings)
        
        g_debug("ghb_add_srt ()");
 
+       ghb_settings_set_boolean(settings, "SubtitleBurned", FALSE);
        // Add the long track description so the queue can access it
        // when a different title is selected.
        lang = ghb_settings_combo_option(settings, "SrtLanguage");
        ghb_settings_set_string(settings, "SubtitleTrackDescription", lang);
 
-       ghb_settings_set_int(settings, "SubtitleSource", SRTSUB);
-
        subtitle_list = ghb_settings_get_value(ud->settings, "subtitle_list");
        if (subtitle_list == NULL)
        {
@@ -198,7 +193,6 @@ ghb_add_subtitle(signal_user_data_t *ud, GValue *settings)
        gboolean burned;
        const gchar *track;
        const gchar *lang;
-       gint tt, source;
        
        g_debug("ghb_add_subtitle ()");
 
@@ -210,10 +204,6 @@ ghb_add_subtitle(signal_user_data_t *ud, GValue *settings)
        lang = ghb_settings_combo_string(settings, "SubtitleTrack");
        ghb_settings_set_string(settings, "SubtitleLanguage", lang);
 
-       tt = ghb_settings_get_int(settings, "SubtitleTrack");
-       source = ghb_subtitle_track_source(ud, tt);
-       ghb_settings_set_int(settings, "SubtitleSource", source);
-
        subtitle_list = ghb_settings_get_value(ud->settings, "subtitle_list");
        if (subtitle_list == NULL)
        {
@@ -269,8 +259,12 @@ add_all_pref_subtitles(signal_user_data_t *ud)
                g_free(lang);
                if (track >= -1)
                {
+                       int source;
+
                        // Add to subtitle list
                        ghb_settings_set_int(subtitle, "SubtitleTrack", track);
+                       source = ghb_subtitle_track_source(ud, track);
+                       ghb_settings_set_int(subtitle, "SubtitleSource", source);
                        ghb_add_subtitle(ud, subtitle);
                }
        }
@@ -357,6 +351,7 @@ ghb_set_pref_subtitle(gint titleindex, signal_user_data_t *ud)
                                                                ghb_boolean_value_new(TRUE));
                        }
                        source = ghb_subtitle_track_source(ud, track);
+                       ghb_settings_set_int(dup, "SubtitleSource", source);
                        if (source == CC608SUB || source == CC708SUB)
                                found_cc = TRUE;
                        ghb_add_subtitle(ud, dup);
@@ -373,9 +368,13 @@ ghb_set_pref_subtitle(gint titleindex, signal_user_data_t *ud)
                track = ghb_find_subtitle_track(titleindex, pref_lang, FALSE, FALSE, VOBSUB, track_indices);
                if (track >= -1)
                {
-                       burn = mustBurn(ud, track);
+                       int source;
+
                        settings = ghb_dict_value_new();
                        ghb_settings_set_int(settings, "SubtitleTrack", track);
+                       source = ghb_subtitle_track_source(ud, track);
+                       ghb_settings_set_int(settings, "SubtitleSource", source);
+                       burn = mustBurn(ud, settings);
                        ghb_settings_take_value(settings, "SubtitleForced", 
                                                        ghb_boolean_value_new(FALSE));
                        ghb_settings_take_value(settings, "SubtitleBurned", 
@@ -411,8 +410,12 @@ ghb_set_pref_subtitle(gint titleindex, signal_user_data_t *ud)
                track = ghb_find_cc_track(titleindex);
                if (track >= 0)
                {
+                       int source;
+
                        settings = ghb_dict_value_new();
                        ghb_settings_set_int(settings, "SubtitleTrack", track);
+                       source = ghb_subtitle_track_source(ud, track);
+                       ghb_settings_set_int(settings, "SubtitleSource", source);
                        ghb_settings_take_value(settings, "SubtitleForced", 
                                                        ghb_boolean_value_new(FALSE));
                        ghb_settings_take_value(settings, "SubtitleBurned", 
@@ -528,7 +531,7 @@ subtitle_forced_toggled_cb(
        settings = ghb_array_get_nth(subtitle_list, row);
 
        source = ghb_settings_get_int(settings, "SubtitleSource");
-       if (source != VOBSUB)
+       if (!canForce(source))
                return;
 
        ghb_settings_set_boolean(settings, "SubtitleForced", active);
@@ -550,8 +553,9 @@ subtitle_burned_toggled_cb(
        gint          row;
        gint *indices;
        GValue *subtitle_list;
-       gint count, track, source;
+       gint count;
        GValue *settings;
+       gint source;
 
        g_debug("burned toggled");
        tp = gtk_tree_path_new_from_string (path);
@@ -574,18 +578,21 @@ subtitle_burned_toggled_cb(
                return;
 
        settings = ghb_array_get_nth(subtitle_list, row);
-
        source = ghb_settings_get_int(settings, "SubtitleSource");
-       if (source != VOBSUB)
+       if (!canBurn(source))
                return;
-
-       track = ghb_settings_combo_int(settings, "SubtitleTrack");
-       if (!active && mustBurn(ud, track))
+       if (!active && mustBurn(ud, settings))
                return;
 
        ghb_settings_set_boolean(settings, "SubtitleBurned", active);
-
        gtk_list_store_set(GTK_LIST_STORE(tm), &ti, 2, active, -1);
+
+       if (active)
+       {
+               ghb_settings_set_boolean(settings, "SubtitleDefaultTrack", !active);
+               gtk_list_store_set(GTK_LIST_STORE(tm), &ti, 3, !active, -1);
+       }
+
        // Unburn the rest
        if (active)
                ghb_subtitle_exclusive_burn(ud, row);
@@ -631,37 +638,20 @@ subtitle_default_toggled_cb(
                return;
 
        settings = ghb_array_get_nth(subtitle_list, row);
+       if (active && mustBurn(ud, settings))
+               return;
 
        ghb_settings_set_boolean(settings, "SubtitleDefaultTrack", active);
-
        gtk_list_store_set(GTK_LIST_STORE(tm), &ti, 3, active, -1);
-       // allow only one default
-       ghb_subtitle_exclusive_default(ud, row);
-       ghb_live_reset(ud);
-}
-
-static const char*
-subtitle_source_name(gint source)
-{
-       const gchar * name;
 
-       switch (source)
+       if (active)
        {
-               case VOBSUB:
-                       name = "Bitmap";
-                       break;
-               case CC708SUB:
-               case CC608SUB:
-                       name = "Text";
-                       break;
-               case SRTSUB:
-                       name = "SRT";
-                       break;
-               default:
-                       name = "Unknown";
-                       break;
+               ghb_settings_set_boolean(settings, "SubtitleBurned", !active);
+               gtk_list_store_set(GTK_LIST_STORE(tm), &ti, 2, !active, -1);
        }
-       return name;
+       // allow only one default
+       ghb_subtitle_exclusive_default(ud, row);
+       ghb_live_reset(ud);
 }
 
 static void
@@ -676,6 +666,8 @@ subtitle_list_refresh_selected(signal_user_data_t *ud)
        gint row;
        GValue *settings = NULL;
        const GValue *subtitle_list;
+       gboolean allow_force = FALSE;
+       gboolean allow_burn = FALSE;
        
        g_debug("subtitle_list_refresh_selected ()");
        treeview = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "subtitle_list"));
@@ -692,7 +684,6 @@ subtitle_list_refresh_selected(signal_user_data_t *ud)
                indices = gtk_tree_path_get_indices (treepath);
                row = indices[0];
                gtk_tree_path_free(treepath);
-               // find audio settings
                if (row < 0) return;
                subtitle_list = ghb_settings_get_value(ud->settings, "subtitle_list");
                if (row >= ghb_array_len(subtitle_list))
@@ -703,14 +694,17 @@ subtitle_list_refresh_selected(signal_user_data_t *ud)
 
                gint i_source;
                i_source = ghb_settings_get_int(settings, "SubtitleSource");
-               if (i_source != VOBSUB)
+               if (!canBurn(i_source))
                {
-                       // Force and burn only apply to VOBSUBS
-                       forced = FALSE;
                        burned = FALSE;
-                       ghb_settings_set_boolean(settings, "SubtitleForced", forced);
                        ghb_settings_set_boolean(settings, "SubtitleBurned", burned);
                }
+               if (!canForce(i_source))
+               {
+                       // Force only apply to VOBSUBS
+                       forced = FALSE;
+                       ghb_settings_set_boolean(settings, "SubtitleForced", forced);
+               }
 
                if (i_source == SRTSUB)
                {
@@ -719,8 +713,6 @@ subtitle_list_refresh_selected(signal_user_data_t *ud)
 
                        lang = ghb_settings_combo_option(settings, "SrtLanguage");
                        code = ghb_settings_get_string(settings, "SrtCodeset");
-                       track = g_strdup_printf("%s (%s)", lang, code);
-                       g_free(code);
 
                        s_track = ghb_settings_get_string(settings, "SrtFile");
                        if (g_file_test(s_track, G_FILE_TEST_IS_REGULAR))
@@ -728,13 +720,16 @@ subtitle_list_refresh_selected(signal_user_data_t *ud)
                                gchar *basename;
 
                                basename = g_path_get_basename(s_track);
+                               track = g_strdup_printf("%s (%s)(SRT)(%s)", lang, code, basename);
                                source = g_strdup_printf("SRT (%s)", basename);
                                g_free(basename);
                        }
                        else
                        {
+                               track = g_strdup_printf("%s (%s)(SRT)", lang, code);
                                source = g_strdup_printf("SRT (none)");
                        }
+                       g_free(code);
                        offset = ghb_settings_get_int(settings, "SrtOffset");
 
                        forced = FALSE;
@@ -744,24 +739,30 @@ subtitle_list_refresh_selected(signal_user_data_t *ud)
                {
                        track = g_strdup(
                                ghb_settings_combo_option(settings, "SubtitleTrack"));
-                       source = g_strdup(subtitle_source_name(i_source));
+                       source = g_strdup(ghb_subtitle_source_name(i_source));
                        s_track = ghb_settings_get_string(settings, "SubtitleTrack");
 
                        forced = ghb_settings_get_boolean(settings, "SubtitleForced");
                        burned = ghb_settings_get_boolean(settings, "SubtitleBurned");
                }
 
+               if (canBurn(i_source))
+                       allow_burn = TRUE;
+               if (canForce(i_source))
+                       allow_force = TRUE;
+
                gtk_list_store_set(GTK_LIST_STORE(store), &iter, 
                        // These are displayed in list
                        0, track,
                        1, forced,
                        2, burned,
                        3, def,
-                       4, source,
-                       5, offset,
+                       4, offset,
                        // These are used to set combo box values when a list item is selected
-                       6, s_track,
-                       7, i_source,
+                       5, s_track,
+                       6, i_source,
+                       7, allow_force,
+                       8, allow_burn,
                        -1);
                g_free(track);
                g_free(source);
@@ -777,7 +778,7 @@ subtitle_track_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
        GValue *settings;
 
        g_debug("subtitle_track_changed_cb ()");
-       ghb_check_dependency(ud, widget);
+       ghb_check_dependency(ud, widget, NULL);
        ghb_widget_to_setting(ud->settings, widget);
        settings = ghb_selected_subtitle_settings(ud);
        if (settings != NULL)
@@ -805,7 +806,7 @@ srt_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
        GValue *settings;
 
        g_debug("srt_changed_cb ()");
-       ghb_check_dependency(ud, widget);
+       ghb_check_dependency(ud, widget, NULL);
        ghb_widget_to_setting(ud->settings, widget);
        settings = ghb_selected_subtitle_settings(ud);
        if (settings != NULL)
@@ -822,8 +823,8 @@ srt_file_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
 {
        GValue *settings;
 
-       g_debug("srt_changed_cb ()");
-       ghb_check_dependency(ud, widget);
+       g_debug("srt_file_changed_cb ()");
+       ghb_check_dependency(ud, widget, NULL);
        ghb_widget_to_setting(ud->settings, widget);
        settings = ghb_selected_subtitle_settings(ud);
        if (settings != NULL)
@@ -857,7 +858,7 @@ srt_lang_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
        GValue *settings;
 
        g_debug("srt_lang_changed_cb ()");
-       ghb_check_dependency(ud, widget);
+       ghb_check_dependency(ud, widget, NULL);
        ghb_widget_to_setting(ud->settings, widget);
        settings = ghb_selected_subtitle_settings(ud);
        if (settings != NULL)
@@ -908,6 +909,8 @@ add_to_subtitle_list(
        gboolean forced, burned, def;
        gchar *s_track;
        gint i_source;
+       gboolean allow_force = FALSE;
+       gboolean allow_burn = FALSE;
        
        g_debug("add_to_subtitle_list ()");
        treeview = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "subtitle_list"));
@@ -921,7 +924,12 @@ add_to_subtitle_list(
 
        s_track = ghb_settings_get_string(settings, "SubtitleTrack");
        i_source = ghb_settings_get_int(settings, "SubtitleSource");
-       source = subtitle_source_name(i_source);
+       source = ghb_subtitle_source_name(i_source);
+
+       if (canBurn(i_source))
+               allow_burn = TRUE;
+       if (canForce(i_source))
+               allow_force = TRUE;
 
        gtk_list_store_append(store, &iter);
        gtk_list_store_set(store, &iter, 
@@ -930,13 +938,12 @@ add_to_subtitle_list(
                1, forced,
                2, burned,
                3, def,
-               4, source,
                // These are used to set combo box values when a list item is selected
-               6, s_track,
-               7, i_source,
-               8, TRUE,
-               9, TRUE,
-               10, FALSE,
+               5, s_track,
+               6, i_source,
+               7, allow_force,
+               8, allow_burn,
+               9, FALSE,
                -1);
        gtk_tree_selection_select_iter(selection, &iter);
        g_free(s_track);
@@ -963,7 +970,6 @@ add_to_srt_list(
 
        lang = ghb_settings_combo_option(settings, "SrtLanguage");
        code = ghb_settings_get_string(settings, "SrtCodeset");
-       track = g_strdup_printf("%s (%s)", lang, code);
        forced = FALSE;
        burned = FALSE;
        def = ghb_settings_get_boolean(settings, "SubtitleDefaultTrack");
@@ -974,11 +980,13 @@ add_to_srt_list(
                gchar *basename;
 
                basename = g_path_get_basename(filename);
+               track = g_strdup_printf("%s (%s)(SRT)(%s)", lang, code, basename);
                source = g_strdup_printf("SRT (%s)", basename);
                g_free(basename);
        }
        else
        {
+               track = g_strdup_printf("%s (%s)(SRT)", lang, code);
                source = g_strdup_printf("SRT (none)");
        }
        i_source = SRTSUB;
@@ -991,14 +999,13 @@ add_to_srt_list(
                1, forced,
                2, burned,
                3, def,
-               4, source,
-               5, offset,
+               4, offset,
                // These are used to set combo box values when a list item is selected
-               6, filename,
-               7, i_source,
+               5, filename,
+               6, i_source,
+               7, FALSE,
                8, FALSE,
-               9, FALSE,
-               10, TRUE,
+               9, TRUE,
                -1);
        gtk_tree_selection_select_iter(selection, &iter);
        g_free(code);
@@ -1137,19 +1144,15 @@ srt_add_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud)
 {
        // Add the current subtitle settings to the list.
        GValue *settings;
-       gboolean burned = FALSE;
-       gint track;
-       gchar *dir, *filename;
+       gchar *dir, *filename, *lang;
        
        g_debug("subtitle_add_clicked_cb ()");
 
-       track = ghb_settings_get_int(ud->settings, "SubtitleTrack");
-       if (mustBurn(ud, track))
-       {
-               burned = TRUE;
-       }
        settings = ghb_dict_value_new();
-       ghb_settings_set_string(settings, "SrtLanguage", "und");
+       ghb_settings_set_int(settings, "SubtitleSource", SRTSUB);
+       lang = ghb_settings_get_string(ud->settings, "PreferredLanguage");
+       ghb_settings_set_string(settings, "SrtLanguage", lang);
+       g_free(lang);
        ghb_settings_set_string(settings, "SrtCodeset", "UTF-8");
 
        dir = ghb_settings_get_string(ud->settings, "SrtDir");
@@ -1171,17 +1174,20 @@ subtitle_add_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud)
        // Add the current subtitle settings to the list.
        GValue *settings;
        gboolean burned = FALSE;
-       gint track;
+       gint track, source;
        
        g_debug("subtitle_add_clicked_cb ()");
 
        track = ghb_settings_get_int(ud->settings, "SubtitleTrack");
-       if (mustBurn(ud, track))
+
+       settings = ghb_dict_value_new();
+       ghb_settings_set_int(settings, "SubtitleTrack", track);
+       source = ghb_subtitle_track_source(ud, track);
+       ghb_settings_set_int(settings, "SubtitleSource", source);
+       if (mustBurn(ud, settings))
        {
                burned = TRUE;
        }
-       settings = ghb_dict_value_new();
-       ghb_settings_set_int(settings, "SubtitleTrack", track);
        ghb_settings_take_value(settings, "SubtitleForced", 
                                                        ghb_boolean_value_new(FALSE));
        ghb_settings_take_value(settings, "SubtitleBurned", 
@@ -1265,27 +1271,21 @@ ghb_subtitle_prune(signal_user_data_t *ud)
        tm = gtk_tree_view_get_model(tv);
        for (ii = count-1; ii >= 0; ii--)
        {
-               gint source, track;
                gboolean burned;
                GValue *settings;
 
                settings = ghb_array_get_nth(subtitle_list, ii);
                burned = ghb_settings_get_boolean(settings, "SubtitleBurned");
-               source = ghb_settings_get_int(settings, "SubtitleSource");
-               if (source == VOBSUB)
+               if (!burned && mustBurn(ud, settings))
                {
-                       track = ghb_settings_combo_int(settings, "SubtitleTrack");
-                       if (!burned && mustBurn(ud, track))
-                       {
-                               gtk_tree_model_iter_nth_child(tm, &ti, NULL, ii);
-                               gtk_list_store_remove (GTK_LIST_STORE(tm), &ti);
-                               ghb_array_remove(subtitle_list, ii);
-                       }
-                       if (burned)
-                       {
-                               first_track = ii;
-                               one_burned++;
-                       }
+                       gtk_tree_model_iter_nth_child(tm, &ti, NULL, ii);
+                       gtk_list_store_remove (GTK_LIST_STORE(tm), &ti);
+                       ghb_array_remove(subtitle_list, ii);
+               }
+               if (burned)
+               {
+                       first_track = ii;
+                       one_burned++;
                }
        }
        if (one_burned)
@@ -1312,8 +1312,14 @@ ghb_reset_subtitles(signal_user_data_t *ud, GValue *settings)
        count = ghb_array_len(slist);
        for (ii = 0; ii < count; ii++)
        {
+               int source;
+
                subtitle = ghb_value_dup(ghb_array_get_nth(slist, ii));
-               ghb_add_subtitle(ud, subtitle);
+               source = ghb_settings_get_int(subtitle, "SubtitleSource");
+               if (source == SRTSUB)
+                       ghb_add_srt(ud, subtitle);
+               else
+                       ghb_add_subtitle(ud, subtitle);
        }
 }