OSDN Git Service

LinGui: tweak how audio choices are made again
authorjstebbins <jstebbins@b64f7644-9d1e-0410-96f1-a4d463321fa5>
Sun, 25 Jan 2009 19:06:13 +0000 (19:06 +0000)
committerjstebbins <jstebbins@b64f7644-9d1e-0410-96f1-a4d463321fa5>
Sun, 25 Jan 2009 19:06:13 +0000 (19:06 +0000)
prefer audio tracks with more channels
prefer audio tracks that are not for
visually impaired or director's commentary

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

gtk/src/audiohandler.c
gtk/src/hb-backend.c
gtk/src/hb-backend.h

index 7967870..1bfdcf2 100644 (file)
@@ -83,22 +83,27 @@ ghb_adjust_audio_rate_combos(signal_user_data_t *ud)
 }
 
 void
+free_audio_index_list(gpointer data)
+{
+       g_free(data);
+}
+
+void
 ghb_set_pref_audio(gint titleindex, signal_user_data_t *ud)
 {
        gint acodec_code, mix_code, track;
        gchar *source_lang;
        GtkWidget *button;
        ghb_audio_info_t ainfo;
-       gint index;
-       GHashTable *track_indicies;
-       gint *iptr;
+       GHashTable *track_indices;
 
        const GValue *pref_audio;
        const GValue *audio, *acodec, *bitrate, *rate, *mix, *drc;
        gint count, ii, list_count;
        
        g_debug("set_pref_audio");
-       track_indicies = g_hash_table_new(g_int_hash, g_int_equal);
+       track_indices = g_hash_table_new_full(g_int_hash, g_int_equal, 
+                                                                                       NULL, free_audio_index_list);
        // Clear the audio list
        ghb_clear_audio_list(ud);
        // Find "best" audio based on audio preferences
@@ -119,16 +124,10 @@ ghb_set_pref_audio(gint titleindex, signal_user_data_t *ud)
                drc = ghb_settings_get_value(audio, "AudioTrackDRCSlider");
                acodec_code = ghb_lookup_combo_int("AudioEncoder", acodec);
                // If there are multiple audios using the same codec, then
-               // select sequential tracks for each.  This hash keeps track 
-               // of the last used track for each codec.
-               iptr = g_hash_table_lookup(track_indicies, &acodec_code);
-               if (iptr == NULL)
-                       index = 0;
-               else
-                       index = *(gint*)iptr;
-
+               // select sequential tracks for each.  The hash keeps track 
+               // of the tracks used for each codec.
                track = ghb_find_audio_track(titleindex, source_lang, 
-                                                                       acodec_code, index);
+                                                                       acodec_code, track_indices);
                // Check to see if:
                // 1. pref codec is ac3
                // 2. source codec is not ac3
@@ -168,12 +167,10 @@ ghb_set_pref_audio(gint titleindex, signal_user_data_t *ud)
                                ghb_ui_update(ud, "AudioMixdown", ghb_int64_value(mix_code));
                        }
                        ghb_ui_update(ud, "AudioTrackDRCSlider", drc);
-                       index++;
-                       g_hash_table_insert(track_indicies, &acodec_code, &index);
                }
        }
        g_free(source_lang);
-       g_hash_table_destroy(track_indicies);
+       g_hash_table_destroy(track_indices);
 }
 
 static GValue*
index 501fe77..ebea3e7 100644 (file)
@@ -1609,7 +1609,7 @@ ghb_find_audio_track(
        gint titleindex, 
        const gchar *lang, 
        gint acodec,
-       gint index)
+       GHashTable *track_indices)
 {
        hb_list_t  * list;
        hb_title_t * title;
@@ -1617,7 +1617,8 @@ ghb_find_audio_track(
        gint ii;
        gint count = 0;
        gint track = -1;
-       gint match = 0;
+       gint max_chan = 0;
+       gboolean *used;
        
        g_debug("find_audio_track ()\n");
        if (h_scan == NULL) return -1;
@@ -1628,44 +1629,135 @@ ghb_find_audio_track(
                count = hb_list_count( title->list_audio );
        }
        if (count > 10) count = 10;
+       used = g_hash_table_lookup(track_indices, &acodec);
+       if (used == NULL)
+       {
+               used = g_malloc0(count * sizeof(gboolean));
+               g_hash_table_insert(track_indices, &acodec, used);
+       }
+       // Try to fine an item that matches the preferred language and
+       // the passthru codec type
        if (acodec == HB_ACODEC_AC3 || acodec == HB_ACODEC_DCA)
        {
                for (ii = 0; ii < count; ii++)
                {
+                       gint channels;
+
+                       if (used[ii])
+                               continue;
+
                audio = (hb_audio_config_t*)hb_list_audio_config_item( 
                                                                                                        title->list_audio, ii );
+                       channels = HB_INPUT_CH_LAYOUT_GET_DISCRETE_COUNT(
+                                                                                                       audio->in.channel_layout);
+                       // Find a track that is not visually impaired or dirctor's
+                       // commentary, and has the highest channel count.
                        if ((audio->in.codec == acodec) &&
+                               (audio->lang.type < 2) &&
                                ((strcmp(lang, audio->lang.iso639_2) == 0) ||
                                (strcmp(lang, "und") == 0)))
                        {
-                               if (index == match)
+                               if (channels > max_chan)
                                {
                                        track = ii;
-                                       break;
+                                       max_chan = channels;
                                }
-                               match++;
                        }
                }
        }
-       if (track > -1) return track;
-       match = 0;
+       if (track > -1)
+       {
+               used[track] = TRUE;
+               return track;
+       }
+       // Try to fine an item that matches the preferred language
        for (ii = 0; ii < count; ii++)
        {
-        audio = (hb_audio_config_t*)hb_list_audio_config_item( title->list_audio, ii );
-               if ((strcmp(lang, audio->lang.iso639_2) == 0) ||
-                       (strcmp(lang, "und") == 0))
+               if (used[ii])
+                       continue;
+        audio = (hb_audio_config_t*)hb_list_audio_config_item( 
+                                                                                                       title->list_audio, ii );
+               // Find a track that is not visually impaired or dirctor's commentary
+               if ((audio->lang.type < 2) &&
+                       ((strcmp(lang, audio->lang.iso639_2) == 0) ||
+                       (strcmp(lang, "und") == 0)))
                {
-                       if (index == match)
+                       track = ii;
+                       break;
+               }
+       }
+       if (track > -1)
+       {
+               used[track] = TRUE;
+               return track;
+       }
+       // Try to fine an item that does not match the preferred language and
+       // matches the passthru codec type
+       if (acodec == HB_ACODEC_AC3 || acodec == HB_ACODEC_DCA)
+       {
+               for (ii = 0; ii < count; ii++)
+               {
+                       gint channels;
+
+                       if (used[ii])
+                               continue;
+
+               audio = (hb_audio_config_t*)hb_list_audio_config_item( 
+                                                                                                       title->list_audio, ii );
+                       channels = HB_INPUT_CH_LAYOUT_GET_DISCRETE_COUNT(
+                                                                                                       audio->in.channel_layout);
+                       // Find a track that is not visually impaired or dirctor's
+                       // commentary, and has the highest channel count.
+                       if ((audio->in.codec == acodec) &&
+                               (audio->lang.type < 2))
                        {
-                               track = ii;
-                               break;
+                               if (channels > max_chan)
+                               {
+                                       track = ii;
+                                       max_chan = channels;
+                               }
                        }
-                       match++;
                }
        }
-       if (track > -1) return track;
-       if (index < count)
-               track = index;
+       if (track > -1)
+       {
+               used[track] = TRUE;
+               return track;
+       }
+       // Try to fine an item that does not match the preferred language
+       for (ii = 0; ii < count; ii++)
+       {
+               if (used[ii])
+                       continue;
+        audio = (hb_audio_config_t*)hb_list_audio_config_item( 
+                                                                                                       title->list_audio, ii );
+               // Find a track that is not visually impaired or dirctor's commentary
+               if (audio->lang.type < 2)
+               {
+                       track = ii;
+                       break;
+               }
+       }
+       if (track > -1)
+       {
+               used[track] = TRUE;
+               return track;
+       }
+       // Last ditch, anything goes
+       for (ii = 0; ii < count; ii++)
+       {
+        audio = (hb_audio_config_t*)hb_list_audio_config_item( 
+                                                                                                       title->list_audio, ii );
+               if (!used[ii])
+               {
+                       track = ii;
+                       break;
+               }
+       }
+       if (track > -1)
+       {
+               used[track] = TRUE;
+       }
        return track;
 }
 
index 508ea5c..69fd0ef 100644 (file)
@@ -131,7 +131,8 @@ void ghb_grey_combo_options(GtkBuilder *builder);
 void ghb_update_ui_combo_box(
        GtkBuilder *builder, const gchar *name, gint user_data, gboolean all);
 gint ghb_find_audio_track(
-       gint titleindex, const gchar *lang, gint acodec, gint index);
+       gint titleindex, const gchar *lang, 
+       gint acodec, GHashTable *track_indices);
 gint ghb_longest_title(void);
 gchar* ghb_build_x264opts_string(GValue *settings);
 GdkPixbuf* ghb_get_preview_image(