</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>
</child>
</object>
<packing>
- <property name="position">1</property>
+ <property name="position">2</property>
</packing>
</child>
</object>
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)
// 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],
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,
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;
<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>
#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);
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);
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;
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);
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
{
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
}
}
+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);
+ }
+}
+
{"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},