diff options
-rw-r--r-- | gtk/src/ghb.ui | 22 | ||||
-rw-r--r-- | gtk/src/hb-backend.c | 63 | ||||
-rw-r--r-- | gtk/src/hb-backend.h | 2 | ||||
-rw-r--r-- | gtk/src/internal_defaults.xml | 2 | ||||
-rw-r--r-- | gtk/src/subtitlehandler.c | 29 |
5 files changed, 111 insertions, 7 deletions
diff --git a/gtk/src/ghb.ui b/gtk/src/ghb.ui index 2c5779000..354912593 100644 --- a/gtk/src/ghb.ui +++ b/gtk/src/ghb.ui @@ -4016,15 +4016,23 @@ no-dct-decimate=0:cabac=1</property> </packing> </child> <child> - <object class="GtkHBox" id="hbox63"> + <object class="GtkAlignment" id="alignment61"> <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">4</property> - <child> - <placeholder/> - </child> + <property name="yscale">0</property> + <property name="left_padding">12</property> + <property name="top_padding">6</property> + <property name="bottom_padding">6</property> <child> - <placeholder/> + <object class="GtkCheckButton" id="AddCC"> + <property name="label" translatable="yes">Add Closed Captions when available</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="active">False</property> + <property name="draw_indicator">True</property> + <signal name="toggled" handler="pref_changed_cb"/> + </object> </child> </object> <packing> @@ -4040,7 +4048,7 @@ no-dct-decimate=0:cabac=1</property> <child type="tab"> <object class="GtkLabel" id="label3"> <property name="visible">True</property> - <property name="label" translatable="yes">Audio</property> + <property name="label" translatable="yes">Audio/Subtitles</property> </object> <packing> <property name="position">1</property> diff --git a/gtk/src/hb-backend.c b/gtk/src/hb-backend.c index 0a4c58ed7..54301af09 100644 --- a/gtk/src/hb-backend.c +++ b/gtk/src/hb-backend.c @@ -31,6 +31,7 @@ #include "settings.h" #include "callbacks.h" #include "subtitlehandler.h" +#include "audiohandler.h" #include "x264handler.h" #include "preview.h" #include "values.h" @@ -1162,6 +1163,42 @@ done: return name; } +gchar* +ghb_subtitle_track_lang(signal_user_data_t *ud, gint track) +{ + gint titleindex; + + titleindex = ghb_settings_combo_int(ud->settings, "title"); + if (titleindex < 0) + goto fail; + if (track == -1) + return ghb_get_user_audio_lang(ud, titleindex, 0); + if (track < 0) + goto fail; + + hb_list_t * list; + hb_title_t * title; + hb_subtitle_t * sub; + + if (h_scan == NULL) + goto fail; + + list = hb_get_titles( h_scan ); + if( !hb_list_count( list ) ) + { + /* No valid title, stop right there */ + goto fail; + } + title = hb_list_item( list, titleindex ); + if (title == NULL) // Bad titleindex + goto fail; + sub = hb_list_item( title->list_subtitle, track); + if (sub != NULL) + return g_strdup(sub->iso639_2); + +fail: + return g_strdup("und"); +} gint ghb_get_title_number(gint titleindex) @@ -2113,6 +2150,32 @@ ghb_find_pref_subtitle_track(const gchar *lang) } gint +ghb_find_cc_track(gint titleindex) +{ + hb_list_t * list; + hb_title_t * title; + hb_subtitle_t * subtitle; + gint count, ii; + + g_debug("ghb_find_cc_track ()\n"); + if (h_scan == NULL) return -2; + list = hb_get_titles( h_scan ); + title = (hb_title_t*)hb_list_item( list, titleindex ); + if (title != NULL) + { + count = hb_list_count( title->list_subtitle ); + // Try to find an item that matches the preferred language + for (ii = 0; ii < count; ii++) + { + subtitle = (hb_subtitle_t*)hb_list_item( title->list_subtitle, ii ); + if (subtitle->source == CC608SUB || subtitle->source == CC708SUB) + return ii; + } + } + return -2; +} + +gint ghb_find_subtitle_track( gint titleindex, const gchar *lang, diff --git a/gtk/src/hb-backend.h b/gtk/src/hb-backend.h index f46b64175..f110528f0 100644 --- a/gtk/src/hb-backend.h +++ b/gtk/src/hb-backend.h @@ -145,6 +145,7 @@ gint ghb_find_pref_subtitle_track(const gchar *lang); gint ghb_find_subtitle_track( gint titleindex, const gchar *lang, GHashTable *track_indices); gint ghb_pick_subtitle_track(signal_user_data_t *ud); +gint ghb_find_cc_track(gint titleindex); gint ghb_longest_title(void); gchar* ghb_build_x264opts_string(GValue *settings); GdkPixbuf* ghb_get_preview_image( @@ -155,6 +156,7 @@ gchar* ghb_dvd_volname(const gchar *device); gint ghb_get_title_number(gint titleindex); gint ghb_subtitle_track_source(signal_user_data_t *ud, gint track); const char* ghb_subtitle_track_source_name(signal_user_data_t *ud, gint track); +gchar* ghb_subtitle_track_lang(signal_user_data_t *ud, gint track); gboolean ghb_validate_vquality(GValue *settings); gboolean ghb_validate_audio(signal_user_data_t *ud); diff --git a/gtk/src/internal_defaults.xml b/gtk/src/internal_defaults.xml index f09df0da4..88d27af24 100644 --- a/gtk/src/internal_defaults.xml +++ b/gtk/src/internal_defaults.xml @@ -105,6 +105,8 @@ </dict> <key>Preferences</key> <dict> + <key>AddCC</key> + <false /> <key>EncodeLogLocation</key> <false /> <key>show_status</key> diff --git a/gtk/src/subtitlehandler.c b/gtk/src/subtitlehandler.c index 938323ea4..c2bce5fc5 100644 --- a/gtk/src/subtitlehandler.c +++ b/gtk/src/subtitlehandler.c @@ -264,6 +264,7 @@ ghb_set_pref_subtitle(gint titleindex, signal_user_data_t *ud) gchar *lang, *pref_lang = NULL; gchar *audio_lang; gint foreign_lang_index = -1; + gboolean found_cc = FALSE; const GValue *pref_subtitle; GValue *subtitle; @@ -313,9 +314,12 @@ ghb_set_pref_subtitle(gint titleindex, signal_user_data_t *ud) // select sequential tracks for each. The hash keeps track // of the tracks used for each language. track = ghb_find_subtitle_track(titleindex, lang, track_indices); + g_free(lang); if (track >= -1) { + gint source; GValue *dup = ghb_value_dup(subtitle); + lang = ghb_subtitle_track_lang(ud, track); ghb_settings_set_int(dup, "SubtitleTrack", track); if (foreign_lang_index < 0 && pref_lang != NULL && strcmp(lang, pref_lang) == 0) @@ -326,6 +330,9 @@ ghb_set_pref_subtitle(gint titleindex, signal_user_data_t *ud) ghb_settings_take_value(dup, "SubtitleDefaultTrack", ghb_boolean_value_new(TRUE)); } + source = ghb_subtitle_track_source(ud, track); + if (source == CC608SUB || source == CC708SUB) + found_cc = TRUE; ghb_add_subtitle(ud, dup); jj++; } @@ -333,6 +340,7 @@ ghb_set_pref_subtitle(gint titleindex, signal_user_data_t *ud) } if (foreign_lang_index < 0 && pref_lang != NULL) { + // Subtitle for foreign language audio not added yet GValue *settings; gboolean burn; @@ -369,6 +377,27 @@ ghb_set_pref_subtitle(gint titleindex, signal_user_data_t *ud) ghb_subtitle_exclusive_default(ud, foreign_lang_index); ghb_log("adding subtitle for foreign language audio: %s", audio_lang); } + if (ghb_settings_get_boolean(ud->settings, "AddCC") && !found_cc) + { + // Subtitle for foreign language audio not added yet + GValue *settings; + + track = ghb_find_cc_track(titleindex); + if (track >= 0) + { + 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", + ghb_boolean_value_new(FALSE)); + ghb_settings_take_value(settings, "SubtitleDefaultTrack", + ghb_boolean_value_new(FALSE)); + + ghb_add_subtitle(ud, settings); + ghb_log("adding Closed Captions: %s", audio_lang); + } + } if (pref_lang != NULL) g_free(pref_lang); if (audio_lang != NULL) |