diff options
Diffstat (limited to 'gtk/src')
-rw-r--r-- | gtk/src/ghb.ui | 75 | ||||
-rw-r--r-- | gtk/src/hb-backend.c | 83 | ||||
-rw-r--r-- | gtk/src/internal_defaults.xml | 8 | ||||
-rw-r--r-- | gtk/src/subtitlehandler.c | 48 | ||||
-rw-r--r-- | gtk/src/widgetdeps.c | 2 |
5 files changed, 160 insertions, 56 deletions
diff --git a/gtk/src/ghb.ui b/gtk/src/ghb.ui index 109f0ac68..473cac057 100644 --- a/gtk/src/ghb.ui +++ b/gtk/src/ghb.ui @@ -2280,6 +2280,79 @@ </packing> </child> <child> + <object class="GtkHBox" id="hbox79"> + <property name="visible">True</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <property name="spacing">15</property> + <child> + <object class="GtkCheckButton" id="SubtitleForeignSearch"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <property name="tooltip-text" translatable="yes">Search subtitle tracks for one that may contain subtitles for foreign language segments of the audio track.</property> + <property name="label" translatable="yes">Foreign Audio Search</property> + <property name="active">False</property> + <property name="draw_indicator">True</property> + <signal handler="subtitle_foreign_changed_cb" name="toggled"/> + </object> + <packing> + <property name="expand">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="SubtitleForeignForced"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <property name="tooltip-text" translatable="yes">Only used the forced subtitles found.</property> + <property name="label" translatable="yes">Forced</property> + <property name="active">True</property> + <property name="draw_indicator">True</property> + <signal name="toggled" handler="setting_widget_changed_cb"/> + </object> + <packing> + <property name="expand">False</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="SubtitleForeignBurned"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="tooltip-text" translatable="yes">Burn subtitle into the video track.</property> + <property name="label" translatable="yes">Burned</property> + <property name="active">False</property> + <property name="draw_indicator">True</property> + <signal handler="subtitle_foreign_changed_cb" name="toggled"/> + </object> + <packing> + <property name="expand">False</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="SubtitleForeignDefaultTrack"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="tooltip-text" translatable="yes">Mark as the default subtitle track. Most players will display this track automatically.</property> + <property name="label" translatable="yes">Default</property> + <property name="active">False</property> + <property name="draw_indicator">True</property> + <signal handler="subtitle_foreign_changed_cb" name="toggled"/> + </object> + <packing> + <property name="expand">False</property> + <property name="position">3</property> + </packing> + </child> + </object> + <packing> + <property name="position">1</property> + <property name="expand">False</property> + </packing> + </child> + <child> <object class="GtkScrolledWindow" id="scrolledwindow4"> <property name="visible">True</property> <property name="can_focus">True</property> @@ -2296,7 +2369,7 @@ </child> </object> <packing> - <property name="position">1</property> + <property name="position">2</property> </packing> </child> </object> diff --git a/gtk/src/hb-backend.c b/gtk/src/hb-backend.c index 4b2e607c2..22ea2efbc 100644 --- a/gtk/src/hb-backend.c +++ b/gtk/src/hb-backend.c @@ -1707,26 +1707,14 @@ subtitle_track_opts_set(GtkBuilder *builder, const gchar *name, gint titleindex) if (subtitle_opts.map) g_free(subtitle_opts.map); if (count > 0) { - subtitle_opts.count = count+1; - subtitle_opts.map = g_malloc((count+1)*sizeof(options_map_t)); + subtitle_opts.count = count; + subtitle_opts.map = g_malloc((count)*sizeof(options_map_t)); } else { - subtitle_opts.count = LANG_TABLE_SIZE+1; - subtitle_opts.map = g_malloc((LANG_TABLE_SIZE+1)*sizeof(options_map_t)); + subtitle_opts.count = LANG_TABLE_SIZE; + subtitle_opts.map = g_malloc((LANG_TABLE_SIZE)*sizeof(options_map_t)); } - gtk_list_store_append(store, &iter); - gtk_list_store_set(store, &iter, - 0, "Foreign Audio Search", - 1, TRUE, - 2, "-1", - 3, -1.0, - 4, "auto", - -1); - subtitle_opts.map[0].option = "Foreign Audio Search"; - subtitle_opts.map[0].shortOpt = "-1"; - subtitle_opts.map[0].ivalue = -1; - subtitle_opts.map[0].svalue = "auto"; if (count > 0) { if (options != NULL) @@ -1739,10 +1727,10 @@ subtitle_track_opts_set(GtkBuilder *builder, const gchar *name, gint titleindex) // Skip subtitles that must be burned if there is already // a burned subtitle in the list options[ii] = g_strdup_printf("%d - %s", ii+1, subtitle->lang); - subtitle_opts.map[ii+1].option = options[ii]; - subtitle_opts.map[ii+1].shortOpt = index_str[ii]; - subtitle_opts.map[ii+1].ivalue = ii; - subtitle_opts.map[ii+1].svalue = subtitle->iso639_2; + subtitle_opts.map[ii].option = options[ii]; + subtitle_opts.map[ii].shortOpt = index_str[ii]; + subtitle_opts.map[ii].ivalue = ii; + subtitle_opts.map[ii].svalue = subtitle->iso639_2; gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, 0, options[ii], @@ -1759,10 +1747,10 @@ subtitle_track_opts_set(GtkBuilder *builder, const gchar *name, gint titleindex) index_str_init(LANG_TABLE_SIZE-1); for (ii = 0; ii < LANG_TABLE_SIZE; ii++) { - subtitle_opts.map[ii+1].option = ghb_language_table[ii].eng_name; - subtitle_opts.map[ii+1].shortOpt = index_str[ii]; - subtitle_opts.map[ii+1].ivalue = ii; - subtitle_opts.map[ii+1].svalue = ghb_language_table[ii].iso639_2; + subtitle_opts.map[ii].option = ghb_language_table[ii].eng_name; + subtitle_opts.map[ii].shortOpt = index_str[ii]; + subtitle_opts.map[ii].ivalue = ii; + subtitle_opts.map[ii].svalue = ghb_language_table[ii].iso639_2; gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, 0, ghb_language_table[ii].eng_name, @@ -3976,47 +3964,44 @@ add_job(hb_handle_t *h, GValue *js, gint unique_id, gint titleindex) const GValue *subtitle_list; gint subtitle; + gboolean force, burned, def, one_burned = FALSE; job->select_subtitle = NULL; - subtitle_list = ghb_settings_get_value(js, "subtitle_list"); - count = ghb_array_len(subtitle_list); - for (ii = 0; ii < count; ii++) + if (ghb_settings_get_boolean(js, "SubtitleForeignSearch")) { - GValue *ssettings; - gboolean force, burned, def, one_burned = FALSE; - - ssettings = ghb_array_get_nth(subtitle_list, ii); + force = ghb_settings_get_boolean(js, "SubtitleForeignForced"); + burned = ghb_settings_get_boolean(js, "SubtitleForeignBurned"); + def = ghb_settings_get_boolean(js, "SubtitleForeignDefaultTrack"); - subtitle = ghb_settings_get_int(ssettings, "SubtitleTrack"); - force = ghb_settings_get_boolean(ssettings, "SubtitleForced"); - burned = ghb_settings_get_boolean(ssettings, "SubtitleBurned"); - def = ghb_settings_get_boolean(ssettings, "SubtitleDefaultTrack"); - - if (subtitle == -1) + if (burned || job->mux != HB_MUX_MP4) { if (!burned && job->mux == HB_MUX_MKV) { job->select_subtitle_config.dest = PASSTHRUSUB; } - else if (!burned && job->mux == HB_MUX_MP4) - { - // Skip any non-burned vobsubs when output is mp4 - continue; - } - else - { - // Only allow one subtitle to be burned into the video - if (one_burned) - continue; + if (burned) one_burned = TRUE; - } job->select_subtitle_config.force = force; job->select_subtitle_config.default_track = def; job->indepth_scan = 1; job->select_subtitle = malloc(sizeof(hb_subtitle_t*)); *job->select_subtitle = NULL; } - else if (subtitle >= 0) + } + subtitle_list = ghb_settings_get_value(js, "subtitle_list"); + count = ghb_array_len(subtitle_list); + for (ii = 0; ii < count; ii++) + { + GValue *ssettings; + + ssettings = ghb_array_get_nth(subtitle_list, ii); + + subtitle = ghb_settings_get_int(ssettings, "SubtitleTrack"); + force = ghb_settings_get_boolean(ssettings, "SubtitleForced"); + burned = ghb_settings_get_boolean(ssettings, "SubtitleBurned"); + def = ghb_settings_get_boolean(ssettings, "SubtitleDefaultTrack"); + + if (subtitle >= 0) { hb_subtitle_t * subt; hb_subtitle_config_t sub_config; diff --git a/gtk/src/internal_defaults.xml b/gtk/src/internal_defaults.xml index 64de850b8..ac8bfa088 100644 --- a/gtk/src/internal_defaults.xml +++ b/gtk/src/internal_defaults.xml @@ -266,6 +266,14 @@ <integer>1</integer> <key>SourceAudioLang</key> <string>und</string> + <key>SubtitleForeignSearch</key> + <false /> + <key>SubtitleForeignForced</key> + <true /> + <key>SubtitleForeignBurned</key> + <false /> + <key>SubtitleForeignDefaultTrack</key> + <false /> <key>SubtitleList</key> <array> <dict> diff --git a/gtk/src/subtitlehandler.c b/gtk/src/subtitlehandler.c index 70d96224c..1a54fecf3 100644 --- a/gtk/src/subtitlehandler.c +++ b/gtk/src/subtitlehandler.c @@ -18,6 +18,7 @@ #include "values.h" #include "callbacks.h" #include "preview.h" +#include "presets.h" #include "subtitlehandler.h" static void add_to_subtitle_list(signal_user_data_t *ud, GValue *settings); @@ -70,6 +71,12 @@ ghb_subtitle_exclusive_burn(signal_user_data_t *ud, gint index) g_debug("ghb_subtitle_exclusive_burn"); subtitle_list = ghb_settings_get_value(ud->settings, "subtitle_list"); count = ghb_array_len(subtitle_list); + if (index != -1) + { + burned = ghb_settings_get_boolean(ud->settings, "SubtitleForeignBurned"); + if (burned && !mustBurn(ud, -1)) + ghb_ui_update(ud, "SubtitleForeignBurned", ghb_boolean_value(FALSE)); + } for (ii = 0; ii < count; ii++) { settings = ghb_array_get_nth(subtitle_list, ii); @@ -83,18 +90,17 @@ ghb_subtitle_exclusive_burn(signal_user_data_t *ud, gint index) if (burned && ii != index && !mustBurn(ud, tt)) { ghb_settings_set_boolean(settings, "SubtitleBurned", FALSE); - burned = FALSE; gtk_list_store_set(GTK_LIST_STORE(tm), &ti, 2, FALSE, -1); } } } void -ghb_subtitle_exclusive_default(signal_user_data_t *ud, gint track) +ghb_subtitle_exclusive_default(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; @@ -103,17 +109,22 @@ ghb_subtitle_exclusive_default(signal_user_data_t *ud, gint track) g_debug("ghb_subtitle_exclusive_default"); subtitle_list = ghb_settings_get_value(ud->settings, "subtitle_list"); count = ghb_array_len(subtitle_list); + if (index != -1) + { + def = ghb_settings_get_boolean(ud->settings, "SubtitleForeignDefaultTrack"); + if (def) + ghb_ui_update(ud, "SubtitleForeignDefaultTrack", ghb_boolean_value(FALSE)); + } for (ii = 0; ii < count; ii++) { settings = ghb_array_get_nth(subtitle_list, ii); - tt = ghb_settings_combo_int(settings, "SubtitleTrack"); def = ghb_settings_get_boolean(settings, "SubtitleDefaultTrack"); 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 (def && tt != track) + if (def && ii != index) { ghb_settings_set_boolean(settings, "SubtitleDefaultTrack", FALSE); @@ -429,7 +440,7 @@ subtitle_default_toggled_cb( gtk_list_store_set(GTK_LIST_STORE(tm), &ti, 3, active, -1); // allow only one default - ghb_subtitle_exclusive_default(ud, track); + ghb_subtitle_exclusive_default(ud, row); } static void @@ -743,6 +754,13 @@ ghb_subtitle_prune(signal_user_data_t *ud) { ghb_subtitle_exclusive_burn(ud, first_track); } + int mux; + mux = ghb_settings_combo_int(ud->settings, "FileFormat"); + if (mux == HB_MUX_MP4) + { + ghb_ui_update(ud, "SubtitleForeignBurned", ghb_boolean_value(TRUE)); + ghb_ui_update(ud, "SubtitleForeignDefaultTrack", ghb_boolean_value(FALSE)); + } } void @@ -768,3 +786,21 @@ ghb_reset_subtitles(signal_user_data_t *ud, GValue *settings) } } +G_MODULE_EXPORT void +subtitle_foreign_changed_cb(GtkWidget *widget, signal_user_data_t *ud) +{ + ghb_widget_to_setting(ud->settings, widget); + ghb_check_dependency(ud, widget); + ghb_clear_presets_selection(ud); + ghb_live_reset(ud); + + if (ghb_settings_get_boolean(ud->settings, "SubtitleForeignBurned")) + { + ghb_subtitle_exclusive_burn(ud, -1); + } + if (ghb_settings_get_boolean(ud->settings, "SubtitleForeignDefaultTrack")) + { + ghb_subtitle_exclusive_default(ud, -1); + } +} + diff --git a/gtk/src/widgetdeps.c b/gtk/src/widgetdeps.c index af8049f58..90e80756b 100644 --- a/gtk/src/widgetdeps.c +++ b/gtk/src/widgetdeps.c @@ -40,6 +40,8 @@ static dependency_t dep_map[] = {"FileFormat", "Mp4LargeFile", "mp4|m4v", FALSE, TRUE}, {"FileFormat", "Mp4HttpOptimize", "mp4|m4v", FALSE, TRUE}, {"FileFormat", "Mp4iPodCompatible", "mp4|m4v", FALSE, TRUE}, + {"FileFormat", "SubtitleForeignBurned", "mp4|m4v", TRUE, FALSE}, + {"FileFormat", "SubtitleForeignDefaultTrack", "mp4|m4v", TRUE, FALSE}, {"PictureDecomb", "PictureDeinterlace", "none", FALSE, FALSE}, {"PictureDecomb", "PictureDeinterlaceCustom", "none", FALSE, TRUE}, {"PictureDeinterlace", "PictureDeinterlaceCustom", "custom", FALSE, TRUE}, |