OSDN Git Service

softsubs:
authorjstebbins <jstebbins@b64f7644-9d1e-0410-96f1-a4d463321fa5>
Wed, 3 Jun 2009 22:07:49 +0000 (22:07 +0000)
committerjstebbins <jstebbins@b64f7644-9d1e-0410-96f1-a4d463321fa5>
Wed, 3 Jun 2009 22:07:49 +0000 (22:07 +0000)
- add ability to have 1 source subtitle feed many output subtitles
  use hb_subtitle_add() to add output tracks.
  example use case:
    you want forced subtitles from a source track on one output track and
    the entire subtitle stream from the same source track on a second
    output track
- LinGui: make subtitle tab resemble functionality of the audio tab
  any track can be added multiple times with different settings.

git-svn-id: svn://localhost/HandBrake/trunk@2476 b64f7644-9d1e-0410-96f1-a4d463321fa5

12 files changed:
gtk/src/callbacks.c
gtk/src/ghb.ui
gtk/src/hb-backend.c
gtk/src/hb-backend.h
gtk/src/internal_defaults.xml
gtk/src/main.c
gtk/src/presets.c
gtk/src/settings.h
gtk/src/subtitlehandler.c
gtk/src/subtitlehandler.h
libhb/common.c
libhb/common.h

index 657d957..9e449e3 100644 (file)
@@ -1120,7 +1120,7 @@ container_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
                }
                g_free(container);
        }
-       ghb_subtitle_adjust_burn(ud);
+       ghb_subtitle_prune(ud);
 }
 
 static gchar*
@@ -1258,7 +1258,7 @@ title_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
 
        titleindex = ghb_settings_combo_int(ud->settings, "title");
        ghb_update_ui_combo_box (ud, "AudioTrack", titleindex, FALSE);
-       ghb_subtitle_track_model(ud, titleindex);
+       ghb_update_ui_combo_box (ud, "SubtitleTrack", titleindex, FALSE);
 
        ghb_set_pref_subtitle(titleindex, ud);
        if (ghb_get_title_info (&tinfo, titleindex))
index e52dac0..e182d0a 100644 (file)
                                         <property name="position">1</property>
                                       </packing>
                                     </child>
+                                    <child>
+                                      <object class="GtkAlignment" id="alignment48">
+                                        <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="xscale">0</property>
+                                        <property name="yscale">0</property>
+                                        <property name="xalign">1</property>
+                                        <child>
+                                          <object class="GtkComboBox" id="SubtitleTrack">
+                                            <property name="width_request">215</property>
+                                            <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>
+                                            <signal handler="subtitle_track_changed_cb" name="changed"/>
+                                          </object>
+                                        </child>
+                                      </object>
+                                      <packing>
+                                        <property name="expand">True</property>
+                                        <property name="position">2</property>
+                                      </packing>
+                                    </child>
                                   </object>
                                   <packing>
                                     <property name="expand">False</property>
index fa38a20..8593b02 100644 (file)
@@ -1681,7 +1681,7 @@ audio_track_opts_set(GtkBuilder *builder, const gchar *name, gint titleindex)
 }
 
 void
-ghb_subtitle_track_model(signal_user_data_t *ud, gint titleindex)
+subtitle_track_opts_set(GtkBuilder *builder, const gchar *name, gint titleindex)
 {
        GtkTreeIter iter;
        GtkListStore *store;
@@ -1689,8 +1689,11 @@ ghb_subtitle_track_model(signal_user_data_t *ud, gint titleindex)
        hb_title_t * title = NULL;
        hb_subtitle_t * subtitle;
        gint ii, count = 0;
+       static char ** options = NULL;
        
-       g_debug("ghb_subtitle_track_model ()\n");
+       g_debug("subtitle_track_opts_set ()\n");
+       store = get_combo_box_store(builder, name);
+       gtk_list_store_clear(store);
        if (h_scan != NULL)
        {
                list = hb_get_titles( h_scan );
@@ -1712,56 +1715,44 @@ ghb_subtitle_track_model(signal_user_data_t *ud, gint titleindex)
                subtitle_opts.count = LANG_TABLE_SIZE+1;
                subtitle_opts.map = g_malloc((LANG_TABLE_SIZE+1)*sizeof(options_map_t));
        }
-       if (ud->subtitle_track_model == NULL)
-       {
-               // Store contains:
-               // 1 - String to display
-               // 2 - bool indicating whether the entry is selectable (grey or not)
-               // 3 - String that is used for presets
-               // 4 - Int value determined by backend
-               // 5 - String value determined by backend
-               store = gtk_list_store_new(5, G_TYPE_STRING, G_TYPE_BOOLEAN, 
-                                                          G_TYPE_STRING, G_TYPE_DOUBLE, G_TYPE_STRING);
-               ud->subtitle_track_model = store;
-       }
-       else
-       {
-               store = ud->subtitle_track_model;
-               gtk_list_store_clear(store);
-       }
        gtk_list_store_append(store, &iter);
        gtk_list_store_set(store, &iter, 
-                                          0, "Autoselect", 
+                                          0, "Foreign Audio Search", 
                                           1, TRUE, 
                                           2, "-1", 
                                           3, -1.0, 
                                           4, "auto", 
                                           -1);
-       subtitle_opts.map[0].option = "Same as audio";
+       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)
+                       g_strfreev(options);
+               options = g_malloc((count+1)*sizeof(gchar*));
                index_str_init(count-1);
                for (ii = 0; ii < count; ii++)
                {
                        subtitle = (hb_subtitle_t *)hb_list_item(title->list_subtitle, ii);
                        // Skip subtitles that must be burned if there is already
                        // a burned subtitle in the list
-                       subtitle_opts.map[ii+1].option = subtitle->lang;
+                       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;
                        gtk_list_store_append(store, &iter);
                        gtk_list_store_set(store, &iter, 
-                                               0, subtitle->lang
+                                               0, options[ii]
                                                1, TRUE, 
                                                2, index_str[ii], 
                                                3, (gdouble)ii, 
                                                4, subtitle->iso639_2, 
                                                -1);
                }
+               options[count] = NULL;
        }
        else
        {
@@ -1968,50 +1959,6 @@ ghb_find_audio_track(
        return track;
 }
 
-void
-ghb_add_all_subtitles(signal_user_data_t *ud, gint titleindex)
-{
-       hb_list_t  * list;
-       hb_title_t * title;
-       hb_subtitle_t * subtitle;
-       gint ii;
-       gint count = 0;
-       GValue *subdict;
-       
-       g_debug("ghb_add_all_subtitles ()\n");
-       if (h_scan == NULL) 
-               return;
-       list = hb_get_titles( h_scan );
-       title = (hb_title_t*)hb_list_item( list, titleindex );
-       if (title == NULL)
-               return;
-
-       // Add special auto selection track
-       subdict = ghb_dict_value_new();
-       ghb_settings_set_boolean(subdict, "SubtitleEnabled", FALSE);
-       ghb_settings_set_int(subdict, "SubtitleTrack", -1);
-       ghb_settings_set_boolean(subdict, "SubtitleForced", FALSE);
-       ghb_settings_set_boolean(subdict, "SubtitleBurned", FALSE);
-       ghb_settings_set_boolean(subdict, "SubtitleDefaultTrack", FALSE);
-       ghb_settings_set_string(subdict, "SubtitleLanguage", "auto");
-       ghb_add_subtitle(ud, subdict, FALSE);
-
-       count = hb_list_count( title->list_subtitle );
-       for (ii = 0; ii < count; ii++)
-       {
-               subtitle = (hb_subtitle_t*)hb_list_item( title->list_subtitle, ii );
-               subdict = ghb_dict_value_new();
-               ghb_settings_set_boolean(subdict, "SubtitleEnabled", FALSE);
-               ghb_settings_set_int(subdict, "SubtitleTrack", ii);
-               ghb_settings_set_boolean(subdict, "SubtitleForced", FALSE);
-               ghb_settings_set_boolean(subdict, "SubtitleBurned", FALSE);
-               ghb_settings_set_boolean(subdict, "SubtitleDefaultTrack", FALSE);
-               ghb_settings_set_string(subdict, "SubtitleLanguage", 
-                                                               subtitle->iso639_2);
-               ghb_add_subtitle(ud, subdict, FALSE);
-       }
-}
-
 gint
 ghb_find_pref_subtitle_track(const gchar *lang)
 {
@@ -2072,38 +2019,6 @@ ghb_find_subtitle_track(
        return -2;
 }
 
-gint
-ghb_pick_subtitle_track(signal_user_data_t *ud)
-{
-       gint ii, count, track, candidate, first;
-       GValue *settings, *subtitle_list;
-
-       first = candidate = ghb_settings_combo_int(ud->settings, "SubtitleTrack");
-       subtitle_list = ghb_settings_get_value(ud->settings, "subtitle_list");
-       count = ghb_array_len(subtitle_list);
-       for (ii = 0; ii < count; ii++)
-       {
-               settings = ghb_array_get_nth(subtitle_list, ii);
-               track = ghb_settings_combo_int(settings, "SubtitleTrack");
-               if (candidate == track)
-               {
-                       // Already in use, pick another
-                       candidate++;
-                       if (candidate >= subtitle_opts.count-1)
-                       {
-                               candidate = 0;
-                       }
-                       if (candidate == first)
-                       {
-                               candidate = -1;
-                               break;
-                       }
-                       ii = -1;
-               }
-       }
-       return candidate;
-}
-
 static void
 generic_opts_set(GtkBuilder *builder, const gchar *name, combo_opts_t *opts)
 {
@@ -2275,6 +2190,7 @@ ghb_update_ui_combo_box(
                language_opts_set(ud->builder, "SourceAudioLang");
                title_opts_set(ud->builder, "title");
                audio_track_opts_set(ud->builder, "AudioTrack", user_data);
+               subtitle_track_opts_set(ud->builder, "SubtitleTrack", user_data);
                generic_opts_set(ud->builder, "VideoQualityGranularity", &vqual_granularity_opts);
                generic_opts_set(ud->builder, "PicturePAR", &par_opts);
                generic_opts_set(ud->builder, "PictureModulus", &alignment_opts);
@@ -2307,6 +2223,8 @@ ghb_update_ui_combo_box(
                        language_opts_set(ud->builder, "SourceAudioLang");
                else if (strcmp(name, "title") == 0)
                        title_opts_set(ud->builder, "title");
+               else if (strcmp(name, "SubtitleTrack") == 0)
+                       subtitle_track_opts_set(ud->builder, "SubtitleTrack", user_data);
                else if (strcmp(name, "AudioTrack") == 0)
                        audio_track_opts_set(ud->builder, "AudioTrack", user_data);
                else
@@ -3405,7 +3323,7 @@ ghb_validate_subtitles(signal_user_data_t *ud)
 
        const GValue *slist, *settings;
        gint count, ii, track, source;
-       gboolean burned, enabled;
+       gboolean burned;
 
        slist = ghb_settings_get_value(ud->settings, "subtitle_list");
        count = ghb_array_len(slist);
@@ -3413,10 +3331,9 @@ ghb_validate_subtitles(signal_user_data_t *ud)
        {
                settings = ghb_array_get_nth(slist, ii);
                track = ghb_settings_combo_int(settings, "SubtitleTrack");
-               enabled = ghb_settings_get_boolean(settings, "SubtitleEnabled");
                burned = ghb_settings_get_boolean(settings, "SubtitleBurned");
                source = ghb_subtitle_track_source(ud, track);
-               if (enabled && !burned && mux == HB_MUX_MP4 && source == VOBSUB)
+               if (!burned && mux == HB_MUX_MP4 && source == VOBSUB)
                {
                        // MP4 can only handle burned vobsubs.  make sure there isn't
                        // already something burned in the list
@@ -4041,15 +3958,10 @@ add_job(hb_handle_t *h, GValue *js, gint unique_id, gint titleindex)
        for (ii = 0; ii < count; ii++)
        {
                GValue *ssettings;
-               gboolean enabled, force, burned, def, one_burned = FALSE;
+               gboolean force, burned, def, one_burned = FALSE;
 
                ssettings = ghb_array_get_nth(subtitle_list, ii);
 
-               enabled = ghb_settings_get_boolean(ssettings, "SubtitleEnabled");
-
-               if (!enabled)
-                       continue;
-
                subtitle = ghb_settings_get_int(ssettings, "SubtitleTrack");
                force = ghb_settings_get_boolean(ssettings, "SubtitleForced");
                burned = ghb_settings_get_boolean(ssettings, "SubtitleBurned");
@@ -4082,14 +3994,16 @@ add_job(hb_handle_t *h, GValue *js, gint unique_id, gint titleindex)
                else if (subtitle >= 0)
                {
                hb_subtitle_t * subt;
+               hb_subtitle_config_t sub_config;
 
                        subt = (hb_subtitle_t *)hb_list_item(title->list_subtitle, subtitle);
+                       sub_config = subt->config;
                        if (subt != NULL)
                        {
                                if (!burned && job->mux == HB_MUX_MKV && 
                                        subt->format == PICTURESUB)
                                {
-                                       subt->config.dest = PASSTHRUSUB;
+                                       sub_config.dest = PASSTHRUSUB;
                                }
                                else if (!burned && job->mux == HB_MUX_MP4 && 
                                        subt->format == PICTURESUB)
@@ -4104,9 +4018,9 @@ add_job(hb_handle_t *h, GValue *js, gint unique_id, gint titleindex)
                                                continue;
                                        one_burned = TRUE;
                                }
-                               subt->config.force = force;
-                               subt->config.default_track = def;
-                               hb_list_add(job->list_subtitle, subt);
+                               sub_config.force = force;
+                               sub_config.default_track = def;
+                       hb_subtitle_add( job, &sub_config, subtitle );
                        }
                }
        }
@@ -4210,8 +4124,7 @@ add_job(hb_handle_t *h, GValue *js, gint unique_id, gint titleindex)
                //      g_free(job->x264opts);
        }
 
-       // First remove any audios that are already in the list
-       // This happens if you are encoding the same title a second time.
+       // clean up audio list
        gint num_audio_tracks = hb_list_count(job->list_audio);
        for(ii = 0; ii < num_audio_tracks; ii++)
        {
@@ -4220,6 +4133,15 @@ add_job(hb_handle_t *h, GValue *js, gint unique_id, gint titleindex)
                free(audio);
        }
 
+       // clean up subtitle list
+       gint num_subtitle_tracks = hb_list_count(job->list_subtitle);
+       for(ii = 0; ii < num_subtitle_tracks; ii++)
+       {
+               hb_subtitle_t *subtitle = hb_list_item(job->list_subtitle, 0);
+               hb_list_rem(job->list_subtitle, subtitle);
+               free(subtitle);
+       }
+
        if (detel_str) g_free(detel_str);
        if (decomb_str) g_free(decomb_str);
        if (deint_str) g_free(deint_str);
index 4b55897..23d0963 100644 (file)
@@ -154,7 +154,6 @@ 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);
-void ghb_subtitle_track_model(signal_user_data_t *ud, gint titleindex);
 
 gboolean ghb_validate_vquality(GValue *settings);
 gboolean ghb_validate_audio(signal_user_data_t *ud);
index a216f73..64de850 100644 (file)
                <key>SubtitleList</key>
                <array>
                        <dict>
-                               <key>SubtitleEnabled</key>
-                               <false />
                                <key>SubtitleLanguage</key>
                                <string>und</string>
                                <key>SubtitleForced</key>
index 7331c0b..4c77509 100644 (file)
@@ -381,11 +381,9 @@ bind_audio_tree_model (signal_user_data_t *ud)
 }
 
 extern G_MODULE_EXPORT void subtitle_list_selection_changed_cb(void);
-extern G_MODULE_EXPORT void subtitle_enable_toggled_cb(void);
 extern G_MODULE_EXPORT void subtitle_forced_toggled_cb(void);
 extern G_MODULE_EXPORT void subtitle_burned_toggled_cb(void);
 extern G_MODULE_EXPORT void subtitle_default_toggled_cb(void);
-extern G_MODULE_EXPORT void subtitle_track_changed_cb(void);
 
 // Create and bind the tree model to the tree view for the subtitle track list
 // Also, connect up the signal that lets us know the selection has changed
@@ -402,54 +400,44 @@ bind_subtitle_tree_model (signal_user_data_t *ud)
        g_debug("bind_subtitle_tree_model ()\n");
        treeview = GTK_TREE_VIEW(GHB_WIDGET (ud->builder, "subtitle_list"));
        selection = gtk_tree_view_get_selection (treeview);
-       // 6 columns in model.  4 are visible, the other 2 is for storing
+       // 6 columns in model.  5 are visible, the other 1 is for storing
        // values that I need
-       // Enable, Track, force, burn, default, type, track short, can delete
-       treestore = gtk_list_store_new(8
-                                                                       G_TYPE_BOOLEAN, G_TYPE_STRING,
+       // Track, force, burn, default, type, track short
+       treestore = gtk_list_store_new(6
+                                                                       G_TYPE_STRING,
                                                                        G_TYPE_BOOLEAN, G_TYPE_BOOLEAN,
                                                                        G_TYPE_BOOLEAN, G_TYPE_STRING,  
-                                                                       G_TYPE_STRING, G_TYPE_BOOLEAN);
+                                                                       G_TYPE_STRING);
        gtk_tree_view_set_model(treeview, GTK_TREE_MODEL(treestore));
 
-       cell = gtk_cell_renderer_toggle_new();
+       cell = gtk_cell_renderer_text_new();
        column = gtk_tree_view_column_new_with_attributes(
-                                                                       _("Enable"), cell, "active", 0, NULL);
-       gtk_tree_view_append_column(treeview, GTK_TREE_VIEW_COLUMN(column));
-       g_signal_connect(cell, "toggled", subtitle_enable_toggled_cb, ud);
-
-       cell = gtk_cell_renderer_combo_new();
-       ghb_subtitle_track_model(ud, -1);
-       g_object_set(G_OBJECT(cell), "model", ud->subtitle_track_model,
-       "text-column", 0, "editable", TRUE, "width", 200, "has-entry", FALSE, NULL);
-       column = gtk_tree_view_column_new_with_attributes( _("Track"), cell, 
-                               "text", 1, NULL);
+                                                                       _("Track"), cell, "text", 0, NULL);
        gtk_tree_view_append_column(treeview, GTK_TREE_VIEW_COLUMN(column));
-       g_signal_connect(cell, "changed", subtitle_track_changed_cb, ud);
 
        cell = gtk_cell_renderer_toggle_new();
        column = gtk_tree_view_column_new_with_attributes(
-                                                                       _("Forced Only"), cell, "active", 2, NULL);
+                                                                       _("Forced Only"), cell, "active", 1, NULL);
        gtk_tree_view_append_column(treeview, GTK_TREE_VIEW_COLUMN(column));
        g_signal_connect(cell, "toggled", subtitle_forced_toggled_cb, ud);
 
        cell = gtk_cell_renderer_toggle_new();
        gtk_cell_renderer_toggle_set_radio(GTK_CELL_RENDERER_TOGGLE(cell), TRUE);
        column = gtk_tree_view_column_new_with_attributes(
-                               _("Burned In"), cell, "active", 3, NULL);
+                               _("Burned In"), cell, "active", 2, NULL);
        gtk_tree_view_append_column(treeview, GTK_TREE_VIEW_COLUMN(column));
        g_signal_connect(cell, "toggled", subtitle_burned_toggled_cb, ud);
 
        cell = gtk_cell_renderer_toggle_new();
        gtk_cell_renderer_toggle_set_radio(GTK_CELL_RENDERER_TOGGLE(cell), TRUE);
        column = gtk_tree_view_column_new_with_attributes(
-                               _("Default"), cell, "active", 4, NULL);
+                               _("Default"), cell, "active", 3, NULL);
        gtk_tree_view_append_column(treeview, GTK_TREE_VIEW_COLUMN(column));
        g_signal_connect(cell, "toggled", subtitle_default_toggled_cb, ud);
 
        cell = gtk_cell_renderer_text_new();
        column = gtk_tree_view_column_new_with_attributes(
-                                                                       _("Type"), cell, "text", 5, NULL);
+                                                                       _("Type"), cell, "text", 4, NULL);
        gtk_tree_view_append_column(treeview, GTK_TREE_VIEW_COLUMN(column));
 
 
index 505ce02..74a101b 100644 (file)
@@ -3056,11 +3056,8 @@ update_subtitle_presets(signal_user_data_t *ud)
        for (ii = 0; ii < count; ii++)
        {
                subtitle = ghb_array_get_nth(subtitle_list, ii);
-               if (ghb_settings_get_boolean(subtitle, "SubtitleEnabled"))
-               {
-                       dict = ghb_value_dup(subtitle);
-                       ghb_array_append(slist, dict);
-               }
+               dict = ghb_value_dup(subtitle);
+               ghb_array_append(slist, dict);
        }
        ghb_settings_set_value(ud->settings, "SubtitleList", slist);
 }
index 0616426..072baf0 100644 (file)
@@ -53,7 +53,6 @@ typedef struct
        preview_t *preview;
        gchar *appcast;
        gint appcast_len;
-       GtkListStore *subtitle_track_model;
 } signal_user_data_t;
 
 enum
index c40e880..980e717 100644 (file)
@@ -20,8 +20,7 @@
 #include "preview.h"
 #include "subtitlehandler.h"
 
-static void add_to_subtitle_list(
-       signal_user_data_t *ud, GValue *settings, gboolean can_delete);
+static void add_to_subtitle_list(signal_user_data_t *ud, GValue *settings);
 
 void
 free_subtitle_index_list(gpointer data)
@@ -37,7 +36,7 @@ free_subtitle_key(gpointer data)
 }
 
 void
-ghb_add_subtitle(signal_user_data_t *ud, GValue *settings, gboolean can_delete)
+ghb_add_subtitle(signal_user_data_t *ud, GValue *settings)
 {
        // Add the current subtitle settings to the list.
        GValue *subtitle_list;
@@ -52,7 +51,7 @@ ghb_add_subtitle(signal_user_data_t *ud, GValue *settings, gboolean can_delete)
                ghb_settings_set_value(ud->settings, "subtitle_list", subtitle_list);
        }
        ghb_array_append(subtitle_list, settings);
-       add_to_subtitle_list(ud, settings, can_delete);
+       add_to_subtitle_list(ud, settings);
 }
 
 static void
@@ -78,7 +77,7 @@ add_all_pref_subtitles(signal_user_data_t *ud)
                {
                        // Add to subtitle list
                        ghb_settings_set_int(subtitle, "SubtitleTrack", track);
-                       ghb_add_subtitle(ud, subtitle, TRUE);
+                       ghb_add_subtitle(ud, subtitle);
                }
        }
 }
@@ -97,6 +96,9 @@ ghb_set_pref_subtitle(gint titleindex, signal_user_data_t *ud)
        g_debug("ghb_set_pref_subtitle %d", titleindex);
        track_indices = g_hash_table_new_full(g_str_hash, g_str_equal, 
                                                                                        NULL, free_subtitle_index_list);
+
+       ghb_ui_update(ud, "SubtitleTrack", ghb_int_value(0));
+
        // Clear the subtitle list
        ghb_clear_subtitle_list(ud);
        if (titleindex < 0)
@@ -104,7 +106,6 @@ ghb_set_pref_subtitle(gint titleindex, signal_user_data_t *ud)
                add_all_pref_subtitles(ud);
                return;
        }
-       ghb_add_all_subtitles(ud, titleindex);
 
        // Find "best" subtitle based on subtitle preferences
        pref_subtitle = ghb_settings_get_value(ud->settings, "SubtitleList");
@@ -121,7 +122,9 @@ ghb_set_pref_subtitle(gint titleindex, signal_user_data_t *ud)
                g_free(lang);
                if (track >= -1)
                {
-                       ghb_set_subtitle(ud, track, subtitle);
+                       GValue *dup = ghb_value_dup(subtitle);
+                       ghb_settings_set_int(dup, "SubtitleTrack", track);
+                       ghb_add_subtitle(ud, dup);
                }
        }
        g_hash_table_destroy(track_indices);
@@ -235,12 +238,7 @@ ghb_subtitle_exclusive_burn(signal_user_data_t *ud, gint track)
 
                        ghb_settings_set_boolean(settings, "SubtitleBurned", FALSE);
                        burned = FALSE;
-                       gtk_list_store_set(GTK_LIST_STORE(tm), &ti, 3, FALSE, -1);
-               }
-               if (!burned && mustBurn(ud, tt))
-               {
-                       ghb_settings_set_boolean(settings, "SubtitleEnabled", FALSE);
-                       gtk_list_store_set(GTK_LIST_STORE(tm), &ti, 0, FALSE, -1);
+                       gtk_list_store_set(GTK_LIST_STORE(tm), &ti, 2, FALSE, -1);
                }
        }
 }
@@ -274,61 +272,12 @@ ghb_subtitle_exclusive_default(signal_user_data_t *ud, gint track)
 
                        ghb_settings_set_boolean(settings, "SubtitleDefaultTrack", FALSE);
                        def = FALSE;
-                       gtk_list_store_set(GTK_LIST_STORE(tm), &ti, 4, FALSE, -1);
+                       gtk_list_store_set(GTK_LIST_STORE(tm), &ti, 3, FALSE, -1);
                }
        }
 }
 
 G_MODULE_EXPORT void
-subtitle_enable_toggled_cb(
-       GtkCellRendererToggle *cell, 
-       gchar                 *path,
-       signal_user_data_t    *ud)
-{
-       GtkTreeView  *tv;
-       GtkTreeModel *tm;
-       GtkTreeIter   ti;
-       gboolean      active;
-       gint          row;
-       GtkTreePath  *tp;
-       gint *indices;
-       GValue *subtitle_list, *settings;
-       gint track;
-
-       g_debug("forced toggled");
-       tp = gtk_tree_path_new_from_string (path);
-       tv = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "subtitle_list"));
-       g_return_if_fail(tv != NULL);
-       tm = gtk_tree_view_get_model(tv);
-       g_return_if_fail(tm != NULL);
-       gtk_tree_model_get_iter(tm, &ti, tp);
-       gtk_tree_model_get(tm, &ti, 0, &active, -1);
-       active ^= 1;
-
-       // Get the row number
-       indices = gtk_tree_path_get_indices (tp);
-       row = indices[0];
-       gtk_tree_path_free(tp);
-       subtitle_list = ghb_settings_get_value(ud->settings, "subtitle_list");
-
-       if (row < 0 || row >= ghb_array_len(subtitle_list))
-               return;
-
-       settings = ghb_array_get_nth(subtitle_list, row);
-       track = ghb_settings_combo_int(settings, "SubtitleTrack");
-
-       if (active && mustBurn(ud, track))
-       {
-               ghb_settings_set_boolean(settings, "SubtitleBurned", TRUE);
-               gtk_list_store_set(GTK_LIST_STORE(tm), &ti, 3, TRUE, -1);
-               ghb_subtitle_exclusive_burn(ud, track);
-       }
-
-       ghb_settings_set_boolean(settings, "SubtitleEnabled", active);
-       gtk_list_store_set(GTK_LIST_STORE(tm), &ti, 0, active, -1);
-}
-
-G_MODULE_EXPORT void
 subtitle_forced_toggled_cb(
        GtkCellRendererToggle *cell, 
        gchar                 *path,
@@ -351,7 +300,7 @@ subtitle_forced_toggled_cb(
        tm = gtk_tree_view_get_model(tv);
        g_return_if_fail(tm != NULL);
        gtk_tree_model_get_iter(tm, &ti, tp);
-       gtk_tree_model_get(tm, &ti, 2, &active, -1);
+       gtk_tree_model_get(tm, &ti, 1, &active, -1);
        active ^= 1;
 
        // Get the row number
@@ -372,7 +321,7 @@ subtitle_forced_toggled_cb(
                return;
 
        ghb_settings_set_boolean(settings, "SubtitleForced", active);
-       gtk_list_store_set(GTK_LIST_STORE(tm), &ti, 2, active, -1);
+       gtk_list_store_set(GTK_LIST_STORE(tm), &ti, 1, active, -1);
 }
 
 G_MODULE_EXPORT void
@@ -399,7 +348,7 @@ subtitle_burned_toggled_cb(
        tm = gtk_tree_view_get_model(tv);
        g_return_if_fail(tm != NULL);
        gtk_tree_model_get_iter(tm, &ti, tp);
-       gtk_tree_model_get(tm, &ti, 3, &active, -1);
+       gtk_tree_model_get(tm, &ti, 2, &active, -1);
        active ^= 1;
 
        // Get the row number
@@ -424,7 +373,7 @@ subtitle_burned_toggled_cb(
 
        ghb_settings_set_boolean(settings, "SubtitleBurned", active);
 
-       gtk_list_store_set(GTK_LIST_STORE(tm), &ti, 3, active, -1);
+       gtk_list_store_set(GTK_LIST_STORE(tm), &ti, 2, active, -1);
        // Unburn the rest
        ghb_subtitle_exclusive_burn(ud, track);
 }
@@ -453,7 +402,7 @@ subtitle_default_toggled_cb(
        tm = gtk_tree_view_get_model(tv);
        g_return_if_fail(tm != NULL);
        gtk_tree_model_get_iter(tm, &ti, tp);
-       gtk_tree_model_get(tm, &ti, 4, &active, -1);
+       gtk_tree_model_get(tm, &ti, 3, &active, -1);
        active ^= 1;
 
        // Get the row number
@@ -471,168 +420,96 @@ subtitle_default_toggled_cb(
 
        ghb_settings_set_boolean(settings, "SubtitleDefaultTrack", active);
 
-       gtk_list_store_set(GTK_LIST_STORE(tm), &ti, 4, active, -1);
+       gtk_list_store_set(GTK_LIST_STORE(tm), &ti, 3, active, -1);
        // allow only one default
        ghb_subtitle_exclusive_default(ud, track);
 }
 
-static gboolean
-trackUsed(signal_user_data_t *ud, gint track)
-{
-       gint ii, count, tt;
-       GValue *settings, *subtitle_list;
-
-       subtitle_list = ghb_settings_get_value(ud->settings, "subtitle_list");
-       count = ghb_array_len(subtitle_list);
-       for (ii = 0; ii < count; ii++)
-       {
-               settings = ghb_array_get_nth(subtitle_list, ii);
-               tt = ghb_settings_combo_int(settings, "SubtitleTrack");
-               if (tt == track)
-               {
-                       return TRUE;
-               }
-       }
-       return FALSE;
-}
-
-G_MODULE_EXPORT void
-subtitle_track_changed_cb(
-       GtkCellRendererCombo *combo,
-       gchar *path,
-       GtkTreeIter *iter,
-       signal_user_data_t *ud)
+static void
+subtitle_list_refresh_selected(signal_user_data_t *ud)
 {
-       GtkTreeView  *tv;
-       GtkTreeModel *tm;
-       GtkTreeIter   ti;
-       GtkTreePath  *tp;
-       gdouble dtrack;
+       GtkTreeView *treeview;
+       GtkTreePath *treepath;
+       GtkTreeSelection *selection;
+       GtkTreeModel *store;
+       GtkTreeIter iter;
        gint *indices;
-       int tt, row;
-       GValue *subtitle_list, *settings;
-       const char *lang;
-
-       g_debug("subtitle_track_changed_cb ()");
-       gtk_tree_model_get(GTK_TREE_MODEL(ud->subtitle_track_model), iter, 
-                                               3, &dtrack, -1);
-       tt = (gint)dtrack;
-       if (trackUsed(ud, tt))
-               return;
-
-       tp = gtk_tree_path_new_from_string (path);
-       tv = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "subtitle_list"));
-       g_return_if_fail(tv != NULL);
-       tm = gtk_tree_view_get_model(tv);
-       g_return_if_fail(tm != NULL);
-       gtk_tree_model_get_iter(tm, &ti, tp);
-
-       // Get the row number
-       indices = gtk_tree_path_get_indices (tp);
-       row = indices[0];
-       gtk_tree_path_free(tp);
-
-       subtitle_list = ghb_settings_get_value(ud->settings, "subtitle_list");
-       if (row >= ghb_array_len(subtitle_list))
-               return;
-       settings = ghb_array_get_nth(subtitle_list, row);
-
-       ghb_settings_set_int(settings, "SubtitleTrack", tt);
-       lang = ghb_settings_combo_string(settings, "SubtitleTrack");
-       if (mustBurn(ud, tt))
-       {
-               ghb_settings_set_boolean(settings, "SubtitleBurned", TRUE);
-       }
-       else
+       gint row;
+       GValue *settings = NULL;
+       const GValue *subtitle_list;
+       
+       g_debug("subtitle_list_refresh_selected ()");
+       treeview = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "subtitle_list"));
+       selection = gtk_tree_view_get_selection (treeview);
+       if (gtk_tree_selection_get_selected(selection, &store, &iter))
        {
-               ghb_settings_set_boolean(settings, "SubtitleBurned", FALSE);
-       }
-       ghb_settings_set_string(settings, "SubtitleLanguage", lang);
+               const gchar *track, *source;
+               gboolean forced, burned, def;
+               gchar *s_track;
+               gint i_track;
+       
+               // Get the row number
+               treepath = gtk_tree_model_get_path (store, &iter);
+               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))
+                       return;
+               settings = ghb_array_get_nth(subtitle_list, row);
 
-       const gchar *track, *source;
-       gboolean burned;
-       gchar *s_track;
-       gint i_track;
+               track = ghb_settings_combo_option(settings, "SubtitleTrack");
+               forced = ghb_settings_get_boolean(settings, "SubtitleForced");
+               burned = ghb_settings_get_boolean(settings, "SubtitleBurned");
+               def = ghb_settings_get_boolean(settings, "SubtitleDefaultTrack");
 
-       track = ghb_settings_combo_option(settings, "SubtitleTrack");
-       burned = ghb_settings_get_boolean(settings, "SubtitleBurned");
+               s_track = ghb_settings_get_string(settings, "SubtitleTrack");
+               i_track = ghb_settings_get_int(settings, "SubtitleTrack");
+               source = ghb_subtitle_track_source_name(ud, i_track);
 
-       s_track = ghb_settings_get_string(settings, "SubtitleTrack");
-       i_track = ghb_settings_get_int(settings, "SubtitleTrack");
-       source = ghb_subtitle_track_source_name(ud, i_track);
+               gint i_source;
+               i_source = ghb_subtitle_track_source(ud, i_track);
+               if (i_source != VOBSUB)
+               {
+                       // 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);
+               }
 
-       gtk_list_store_set(GTK_LIST_STORE(tm), &ti
+               gtk_list_store_set(GTK_LIST_STORE(store), &iter
                        // These are displayed in list
-                       1, track,
-                       3, burned,
-                       5, source,
-                       // These are used to set combo values when a list item is selected
-                       6, s_track,
+                       0, track,
+                       1, forced,
+                       2, burned,
+                       3, def,
+                       4, source,
+                       // These are used to set combo box values when a list item is selected
+                       5, s_track,
                        -1);
-       g_free(s_track);
-       ghb_live_reset(ud);
-
+               g_free(s_track);
+               if (burned)
+                       ghb_subtitle_exclusive_burn(ud, i_track);
+       }
 }
 
-void
-ghb_subtitle_adjust_burn(signal_user_data_t *ud)
+G_MODULE_EXPORT void
+subtitle_track_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
 {
-       GValue *subtitle_list;
        GValue *settings;
-       gint ii, count, track;
-       GtkTreeView  *tv;
-       GtkTreeModel *tm;
-       GtkTreeIter   ti;
-       gboolean burned, enabled, found;
 
-       g_debug("ghb_subtitle_adjust_burn");
-       subtitle_list = ghb_settings_get_value(ud->settings, "subtitle_list");
-       count = ghb_array_len(subtitle_list);
-       for (ii = 0; ii < count; ii++)
-       {
-               settings = ghb_array_get_nth(subtitle_list, ii);
-               enabled = ghb_settings_get_boolean(settings, "SubtitleEnabled");
-               burned = ghb_settings_get_boolean(settings, "SubtitleBurned");
-               if (enabled && burned)
-               {
-                       found = TRUE;
-                       break;
-               }
-       }
-       for (ii = 0; ii < count; ii++)
+       g_debug("subtitle_track_changed_cb ()");
+       ghb_check_dependency(ud, widget);
+       settings = ghb_selected_subtitle_settings(ud);
+       if (settings != NULL)
        {
-               settings = ghb_array_get_nth(subtitle_list, ii);
-               track = ghb_settings_combo_int(settings, "SubtitleTrack");
-
-               if (!mustBurn(ud, track))
-                       continue;
-
-               enabled = ghb_settings_get_boolean(settings, "SubtitleEnabled");
-               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 (!found)
-               {
-                       if (enabled && !burned)
-                       {
-                               ghb_settings_set_boolean(settings, "SubtitleBurned", TRUE);
-                               gtk_list_store_set(GTK_LIST_STORE(tm), &ti, 3, TRUE, -1);
-                               found = TRUE;
-                       }
-               }
-               else
-               {
-                       if (enabled && !burned)
-                       {
-                               ghb_settings_set_boolean(settings, "SubtitleEnabled", FALSE);
-                               gtk_list_store_set(GTK_LIST_STORE(tm), &ti, 0, FALSE, -1);
-                       }
-               }
+               ghb_widget_to_setting(settings, widget);
+               subtitle_list_refresh_selected(ud);
        }
+       ghb_live_reset(ud);
 }
 
 void
@@ -659,15 +536,14 @@ ghb_clear_subtitle_list(signal_user_data_t *ud)
 static void
 add_to_subtitle_list(
        signal_user_data_t *ud, 
-       GValue *settings, 
-       gboolean can_delete)
+       GValue *settings)
 {
        GtkTreeView *treeview;
        GtkTreeIter iter;
        GtkListStore *store;
        GtkTreeSelection *selection;
        const gchar *track, *source;
-       gboolean forced, burned, enabled, def;
+       gboolean forced, burned, def;
        gchar *s_track;
        gint i_track;
        
@@ -677,7 +553,6 @@ add_to_subtitle_list(
        store = GTK_LIST_STORE(gtk_tree_view_get_model(treeview));
 
        track = ghb_settings_combo_option(settings, "SubtitleTrack");
-       enabled = ghb_settings_get_boolean(settings, "SubtitleEnabled");
        forced = ghb_settings_get_boolean(settings, "SubtitleForced");
        burned = ghb_settings_get_boolean(settings, "SubtitleBurned");
        def = ghb_settings_get_boolean(settings, "SubtitleDefaultTrack");
@@ -689,15 +564,13 @@ add_to_subtitle_list(
        gtk_list_store_append(store, &iter);
        gtk_list_store_set(store, &iter, 
                // These are displayed in list
-               0, enabled,
-               1, track,
-               2, forced,
-               3, burned,
-               4, def,
-               5, source,
+               0, track,
+               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, can_delete,
+               5, s_track,
                -1);
        gtk_tree_selection_select_iter(selection, &iter);
        g_free(s_track);
@@ -716,21 +589,12 @@ subtitle_list_selection_changed_cb(GtkTreeSelection *selection, signal_user_data
        if (gtk_tree_selection_get_selected(selection, &store, &iter))
        {
                const gchar *track;
-               gboolean can_delete;
 
-               gtk_tree_model_get(store, &iter, 6, &track, 7, &can_delete, -1);
-               ghb_settings_set_string(ud->settings, "SubtitleTrack", track);
+               gtk_tree_model_get(store, &iter, 5, &track, -1);
+               ghb_ui_update(ud, "SubtitleTrack", ghb_string_value(track));
 
-               if (can_delete)
-               {
-                       widget = GHB_WIDGET (ud->builder, "subtitle_remove");
-                       gtk_widget_set_sensitive(widget, TRUE);
-               }
-               else
-               {
-                       widget = GHB_WIDGET (ud->builder, "subtitle_remove");
-                       gtk_widget_set_sensitive(widget, FALSE);
-               }
+               widget = GHB_WIDGET (ud->builder, "subtitle_remove");
+               gtk_widget_set_sensitive(widget, TRUE);
        }
 }
 
@@ -745,32 +609,42 @@ subtitle_add_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud)
        gint track;
        
        g_debug("subtitle_add_clicked_cb ()");
-       track = ghb_pick_subtitle_track(ud);
-       if (track < 0)
+       subtitle_list = ghb_settings_get_value(ud->settings, "subtitle_list");
+       if (subtitle_list == NULL)
+       {
+               subtitle_list = ghb_array_value_new(8);
+               ghb_settings_set_value(ud->settings, "subtitle_list", subtitle_list);
+       }
+       count = ghb_array_len(subtitle_list);
+       // Don't allow more than 99
+       // This is a had limit imposed by libhb/sync.c:GetFifoForId()
+       if (count >= 99)
                return;
 
+       track = ghb_settings_get_int(ud->settings, "SubtitleTrack");
+
        if (mustBurn(ud, track))
        {
                burned = TRUE;
        }
        settings = ghb_dict_value_new();
-       // Only allow up to 8 subtitle entries
        ghb_settings_set_int(settings, "SubtitleTrack", track);
-       ghb_settings_set_boolean(settings, "SubtitleEnabled", TRUE);
        ghb_settings_take_value(settings, "SubtitleForced", 
                                                        ghb_boolean_value_new(FALSE));
        ghb_settings_take_value(settings, "SubtitleBurned", 
                                                        ghb_boolean_value_new(burned));
+       ghb_settings_take_value(settings, "SubtitleDefaultTrack", 
+                                                       ghb_boolean_value_new(FALSE));
 
-       subtitle_list = ghb_settings_get_value(ud->settings, "subtitle_list");
-       if (subtitle_list == NULL)
+       ghb_array_append(subtitle_list, settings);
+       add_to_subtitle_list(ud, settings);
+       ghb_subtitle_exclusive_burn(ud, track);
+       if (count == 98)
        {
-               subtitle_list = ghb_array_value_new(8);
-               ghb_settings_set_value(ud->settings, "subtitle_list", subtitle_list);
+               GtkWidget *widget;
+               widget = GHB_WIDGET (ud->builder, "subtitle_add");
+               gtk_widget_set_sensitive(widget, FALSE);
        }
-       ghb_array_append(subtitle_list, settings);
-       add_to_subtitle_list(ud, settings, TRUE);
-       count = ghb_array_len(subtitle_list);
 }
 
 G_MODULE_EXPORT void
@@ -824,49 +698,34 @@ subtitle_remove_clicked_cb(GtkWidget *widget, signal_user_data_t *ud)
 }
 
 void
-ghb_set_subtitle(signal_user_data_t *ud, gint track, GValue *settings)
+ghb_subtitle_prune(signal_user_data_t *ud)
 {
        GtkTreeView  *tv;
        GtkTreeModel *tm;
        GtkTreeIter   ti;
-       GValue *slist;
-       GValue *subtitle;
-       gint count, ii, tt;
-       gboolean enabled, forced, burned, def;
-       
-       g_debug("ghb_set_subtitle");
-       slist = ghb_settings_get_value(ud->settings, "subtitle_list");
+       GValue *subtitle_list, *settings;
+       gint count, ii, track;
+       gboolean burned;
 
-       count = ghb_array_len(slist);
-       for (ii = 0; ii < count; ii++)
+       subtitle_list = ghb_settings_get_value(ud->settings, "subtitle_list");
+       if (subtitle_list == NULL)
+               return;
+       count = ghb_array_len(subtitle_list);
+
+       tv = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "subtitle_list"));
+       g_return_if_fail(tv != NULL);
+       tm = gtk_tree_view_get_model(tv);
+       for (ii = count-1; ii >= 0; ii--)
        {
-               subtitle = ghb_array_get_nth(slist, ii);
-               tt = ghb_settings_get_int(subtitle, "SubtitleTrack");
-               if (track != tt)
-                       continue;
-               
-               enabled = ghb_settings_get_boolean(settings, "SubtitleEnabled");
-               forced = ghb_settings_get_boolean(settings, "SubtitleForced");
+               settings = ghb_array_get_nth(subtitle_list, ii);
                burned = ghb_settings_get_boolean(settings, "SubtitleBurned");
-               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);
-
-               ghb_settings_set_boolean(subtitle, "SubtitleEnabled", enabled);
-               ghb_settings_set_boolean(subtitle, "SubtitleForced", forced);
-               ghb_settings_set_boolean(subtitle, "SubtitleBurned", burned);
-               ghb_settings_set_boolean(subtitle, "SubtitleDefaultTrack", def);
-               gtk_list_store_set(GTK_LIST_STORE(tm), &ti, 
-                       0, enabled, 
-                       2, forced, 
-                       3, burned, 
-                       4, def, 
-                       7, FALSE, 
-                       -1);
-               break;
+               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);
+               }
        }
 }
 
@@ -875,7 +734,7 @@ ghb_reset_subtitles(signal_user_data_t *ud, GValue *settings)
 {
        GValue *slist;
        GValue *subtitle;
-       gint count, ii, track;
+       gint count, ii;
        gint titleindex;
        
        g_debug("ghb_reset_subtitles");
@@ -884,16 +743,12 @@ ghb_reset_subtitles(signal_user_data_t *ud, GValue *settings)
        if (titleindex < 0)
                return;
 
-       ghb_add_all_subtitles(ud, titleindex);
        slist = ghb_settings_get_value(settings, "subtitle_list");
-
        count = ghb_array_len(slist);
        for (ii = 0; ii < count; ii++)
        {
-               subtitle = ghb_array_get_nth(slist, ii);
-               track = ghb_settings_get_int(subtitle, "SubtitleTrack");
-
-               ghb_set_subtitle(ud, track, subtitle);
+               subtitle = ghb_value_dup(ghb_array_get_nth(slist, ii));
+               ghb_add_subtitle(ud, subtitle);
        }
 }
 
index e1e9fc9..a2b920f 100644 (file)
 void ghb_set_pref_subtitle(gint titleindex, signal_user_data_t *ud);
 void ghb_clear_subtitle_list(signal_user_data_t *ud);
 void ghb_set_subtitle(signal_user_data_t *ud, gint track, GValue *settings);
-void ghb_subtitle_adjust_burn(signal_user_data_t *ud);
 GValue* ghb_selected_subtitle_settings(signal_user_data_t *ud);
 gint ghb_selected_subtitle_row(signal_user_data_t *ud);
 void ghb_add_subtitle(
-       signal_user_data_t *ud, GValue *settings, gboolean can_delete);
+       signal_user_data_t *ud, GValue *settings);
 void ghb_reset_subtitles(signal_user_data_t *ud, GValue *settings);
+void ghb_subtitle_prune(signal_user_data_t *ud);
 
 #endif // _SUBTITLEHANDLER_H_
index c8e4e07..350132b 100644 (file)
@@ -816,3 +816,42 @@ hb_audio_config_t * hb_list_audio_config_item(hb_list_t * list, int i)
 
     return NULL;
 }
+
+/**********************************************************************
+ * hb_subtitle_copy
+ **********************************************************************
+ *
+ *********************************************************************/
+hb_subtitle_t *hb_subtitle_copy(const hb_subtitle_t *src)
+{
+    hb_subtitle_t *subtitle = NULL;
+
+    if( src )
+    {
+        subtitle = calloc(1, sizeof(*subtitle));
+        memcpy(subtitle, src, sizeof(*subtitle));
+    }
+    return subtitle;
+}
+
+/**********************************************************************
+ * hb_subtitle_add
+ **********************************************************************
+ *
+ *********************************************************************/
+int hb_subtitle_add(const hb_job_t * job, const hb_subtitle_config_t * subtitlecfg, int track)
+{
+    hb_title_t *title = job->title;
+    hb_subtitle_t *subtitle;
+
+    subtitle = hb_subtitle_copy( hb_list_item( title->list_subtitle, track ) );
+    if( subtitle == NULL )
+    {
+        /* We fail! */
+        return 0;
+    }
+       subtitle->config = *subtitlecfg;
+    hb_list_add(job->list_subtitle, subtitle);
+    return 1;
+}
+
index b9e2668..f677d8b 100644 (file)
@@ -95,6 +95,8 @@ void hb_audio_config_init(hb_audio_config_t * audiocfg);
 int hb_audio_add(const hb_job_t * job, const hb_audio_config_t * audiocfg);
 hb_audio_config_t * hb_list_audio_config_item(hb_list_t * list, int i);
 
+int hb_subtitle_add(const hb_job_t * job, const hb_subtitle_config_t * subtitlecfg, int track);
+
 struct hb_rate_s
 {
     char * string;
@@ -449,7 +451,7 @@ struct hb_chapter_s
 struct hb_subtitle_s
 {
     int  id;
-    int track;
+    int  track;
 
     hb_subtitle_config_t config;