OSDN Git Service

WinGui:
[handbrake-jp/handbrake-jp-git.git] / gtk / src / hb-backend.c
index de6d503..9527977 100644 (file)
@@ -2,7 +2,7 @@
  *            hb-backend.c
  *
  *  Fri Mar 28 10:38:44 2008
- *  Copyright  2008  John Stebbins
+ *  Copyright  2008-2011  John Stebbins
  *  <john at stebbins dot name>
  ****************************************************************************/
 
@@ -1596,17 +1596,12 @@ ghb_grey_combo_options(GtkBuilder *builder)
        allow_6ch = acodec & ~HB_ACODEC_LAME;
        if (aconfig)
        {
-               gint layout = aconfig->in.channel_layout & HB_INPUT_CH_LAYOUT_DISCRETE_NO_LFE_MASK;
-               allow_stereo =
-                       ((layout == HB_INPUT_CH_LAYOUT_MONO && !allow_mono) || layout >= HB_INPUT_CH_LAYOUT_STEREO);
-               allow_dolby =
-                       (layout == HB_INPUT_CH_LAYOUT_3F1R) || 
-                       (layout == HB_INPUT_CH_LAYOUT_3F2R) || 
-                       (layout == HB_INPUT_CH_LAYOUT_DOLBY);
-               allow_dpl2 = (layout == HB_INPUT_CH_LAYOUT_3F2R);
-               allow_6ch = allow_6ch &&
-                       (layout == HB_INPUT_CH_LAYOUT_3F2R) && 
-                       (aconfig->in.channel_layout & HB_INPUT_CH_LAYOUT_HAS_LFE);
+               gint best = hb_get_best_mixdown(acodec, aconfig->in.channel_layout, 0);
+
+               allow_stereo = best >= HB_AMIXDOWN_STEREO;
+               allow_dolby = best >= HB_AMIXDOWN_DOLBY;
+               allow_dpl2 = best >= HB_AMIXDOWN_DOLBYPLII;
+               allow_6ch = best >= HB_AMIXDOWN_6CH;
        }
        grey_combo_box_item(builder, "AudioMixdown", HB_AMIXDOWN_MONO, !allow_mono);
        grey_combo_box_item(builder, "AudioMixdown", HB_AMIXDOWN_STEREO, !allow_stereo);
@@ -1618,69 +1613,10 @@ ghb_grey_combo_options(GtkBuilder *builder)
 gint
 ghb_get_best_mix(hb_audio_config_t *aconfig, gint acodec, gint mix)
 {
-       gboolean allow_mono = TRUE;
-       gboolean allow_stereo = TRUE;
-       gboolean allow_dolby = TRUE;
-       gboolean allow_dpl2 = TRUE;
-       gboolean allow_6ch = TRUE;
-       
-       if (acodec & HB_ACODEC_PASS_FLAG)
-       {
-               // Audio codec pass-thru.  No mixdown
-               return 0;
-       }
-       if (aconfig)
-       {
-               allow_mono = TRUE;
-               gint layout = aconfig->in.channel_layout & HB_INPUT_CH_LAYOUT_DISCRETE_NO_LFE_MASK;
-               allow_stereo =
-                       ((layout == HB_INPUT_CH_LAYOUT_MONO && !allow_mono) || layout >= HB_INPUT_CH_LAYOUT_STEREO);
-               allow_dolby =
-                       (layout == HB_INPUT_CH_LAYOUT_3F1R) || 
-                       (layout == HB_INPUT_CH_LAYOUT_3F2R) || 
-                       (layout == HB_INPUT_CH_LAYOUT_DOLBY);
-               allow_dpl2 = (layout == HB_INPUT_CH_LAYOUT_3F2R);
-               allow_6ch =
-                       (acodec & ~HB_ACODEC_LAME) &&
-                       (layout == HB_INPUT_CH_LAYOUT_3F2R) && 
-                       (aconfig->in.channel_layout & HB_INPUT_CH_LAYOUT_HAS_LFE);
-       }
-       gboolean greater = FALSE;
-       if (mix == 0) 
-       {
-               // If no mix is specified, select the best available.
-               mix = HB_AMIXDOWN_6CH;
-       }
-       if (mix == HB_AMIXDOWN_6CH)
-       {
-               greater = TRUE;
-               if (allow_6ch) return HB_AMIXDOWN_6CH;
-       }
-       if (mix == HB_AMIXDOWN_DOLBYPLII || greater)
-       {
-               greater = TRUE;
-               if (allow_dpl2) return HB_AMIXDOWN_DOLBYPLII;
-       }
-       if (mix == HB_AMIXDOWN_DOLBY || greater)
-       {
-               greater = TRUE;
-               if (allow_dolby) return HB_AMIXDOWN_DOLBY;
-       }
-       if (mix == HB_AMIXDOWN_STEREO || greater)
-       {
-               greater = TRUE;
-               if (allow_stereo) return HB_AMIXDOWN_STEREO;
-       }
-       if (mix == HB_AMIXDOWN_MONO || greater)
-       {
-               greater = TRUE;
-               if (allow_mono) return HB_AMIXDOWN_MONO;
-       }
-       if (allow_stereo) return HB_AMIXDOWN_STEREO;
-       if (allow_dolby) return HB_AMIXDOWN_DOLBY;
-       if (allow_dpl2) return HB_AMIXDOWN_DOLBYPLII;
-       if (allow_6ch) return HB_AMIXDOWN_6CH;
-       return 0;
+       int layout;
+       layout = aconfig ? aconfig->in.channel_layout : 
+                                               HB_INPUT_CH_LAYOUT_3F2R | HB_INPUT_CH_LAYOUT_HAS_LFE;
+       return hb_get_best_mixdown( acodec, layout, mix );
 }
 
 // Set up the model for the combo box
@@ -2304,7 +2240,7 @@ ghb_find_audio_track(
                {
                        audio = (hb_audio_config_t*)hb_list_audio_config_item( 
                                                                                                        title->list_audio, ii );
-                       passthru_acodec = acodec & audio->in.codec;
+                       passthru_acodec = HB_ACODEC_PASS_MASK & acodec & audio->in.codec;
                        // Is the source track use a passthru capable codec?
                        if (passthru_acodec == 0)
                                continue;
@@ -2385,7 +2321,7 @@ ghb_find_audio_track(
                {
                        audio = (hb_audio_config_t*)hb_list_audio_config_item( 
                                                                                                        title->list_audio, ii );
-                       passthru_acodec = HB_ACODEC_PASS_MASK & audio->in.codec;
+                       passthru_acodec = HB_ACODEC_PASS_MASK & acodec & audio->in.codec;
                        // Is the source track use a passthru capable codec?
                        if (passthru_acodec == 0)
                                continue;
@@ -4160,6 +4096,10 @@ ghb_select_audio_codec(GValue *settings, hb_audio_config_t *aconfig, gint acodec
                {
                        return HB_ACODEC_AC3;
                }
+               else if (acodec & HB_ACODEC_LAME)
+               {
+                       return HB_ACODEC_LAME;
+               }
                else if (acodec & HB_ACODEC_FAAC)
                {
                        return HB_ACODEC_FAAC;
@@ -4303,6 +4243,7 @@ ghb_validate_audio(signal_user_data_t *ud)
                        value = ghb_lookup_acodec_value(codec);
                        ghb_settings_take_value(asettings, "AudioEncoder", value);
                }
+
                gint mix = ghb_settings_combo_int (asettings, "AudioMixdown");
                gboolean allow_mono = TRUE;
                gboolean allow_stereo = TRUE;
@@ -4310,18 +4251,13 @@ ghb_validate_audio(signal_user_data_t *ud)
                gboolean allow_dpl2 = TRUE;
                gboolean allow_6ch = TRUE;
                allow_mono = TRUE;
-               gint layout = aconfig->in.channel_layout & HB_INPUT_CH_LAYOUT_DISCRETE_NO_LFE_MASK;
-               allow_stereo =
-                       ((layout == HB_INPUT_CH_LAYOUT_MONO && !allow_mono) || layout >= HB_INPUT_CH_LAYOUT_STEREO);
-               allow_dolby =
-                       (layout == HB_INPUT_CH_LAYOUT_3F1R) || 
-                       (layout == HB_INPUT_CH_LAYOUT_3F2R) || 
-                       (layout == HB_INPUT_CH_LAYOUT_DOLBY);
-               allow_dpl2 = (layout == HB_INPUT_CH_LAYOUT_3F2R);
-               allow_6ch =
-                       (codec & ~HB_ACODEC_LAME) &&
-                       (layout == HB_INPUT_CH_LAYOUT_3F2R) && 
-                       (aconfig->in.channel_layout & HB_INPUT_CH_LAYOUT_HAS_LFE);
+
+               gint best = hb_get_best_mixdown(codec, aconfig->in.channel_layout, 0);
+
+               allow_stereo = best >= HB_AMIXDOWN_STEREO;
+               allow_dolby = best >= HB_AMIXDOWN_DOLBY;
+               allow_dpl2 = best >= HB_AMIXDOWN_DOLBYPLII;
+               allow_6ch = best >= HB_AMIXDOWN_6CH;
 
                gchar *mix_unsup = NULL;
                if (mix == HB_AMIXDOWN_MONO && !allow_mono)
@@ -4403,11 +4339,28 @@ ghb_validate_vquality(GValue *settings)
                                max = 62;
                        } break;
                }
-               if (vquality < min || vquality > max)
+               if (vcodec == HB_VCODEC_X264 && vquality == 0.0)
+               {
+                       message = g_strdup_printf(
+                                               "Warning: lossless h.264 selected\n\n"
+                                               "Lossless h.264 is not well supported by\n"
+                                               "many players and editors.\n\n"
+                        "It will produce enormous output files.\n\n"
+                                               "Are you sure you wish to use this setting?",
+                                               (gint)vquality, min, max);
+                       if (!ghb_message_dialog(GTK_MESSAGE_QUESTION, message, 
+                                                                       "Cancel", "Continue"))
+                       {
+                               g_free(message);
+                               return FALSE;
+                       }
+                       g_free(message);
+               }
+               else if (vquality < min || vquality > max)
                {
                        message = g_strdup_printf(
-                                               "Interesting video quality choise: %d\n\n"
-                                               "Typical values range from %d to %d.\n"
+                                               "Interesting video quality choice: %d\n\n"
+                                               "Typical values range from %d to %d.\n\n"
                                                "Are you sure you wish to use this setting?",
                                                (gint)vquality, min, max);
                        if (!ghb_message_dialog(GTK_MESSAGE_QUESTION, message, 
@@ -4790,8 +4743,10 @@ add_job(hb_handle_t *h, GValue *js, gint unique_id, gint titleindex)
                        sub_config.offset = ghb_settings_get_int(ssettings, "SrtOffset");
                        lang = ghb_settings_get_string(ssettings, "SrtLanguage");
                        code = ghb_settings_get_string(ssettings, "SrtCodeset");
-                       strncpy(sub_config.src_filename, filename, 128);
-                       strncpy(sub_config.src_codeset, code, 40);
+                       strncpy(sub_config.src_filename, filename, 255);
+                       sub_config.src_filename[255] = 0;
+                       strncpy(sub_config.src_codeset, code, 39);
+                       sub_config.src_codeset[39] = 0;
                        sub_config.force = 0;
                        sub_config.dest = PASSTHRUSUB;
                        sub_config.default_track = def;