OSDN Git Service

LinGui: fix aq-strength slider range. should be 0-2, not 0-1
[handbrake-jp/handbrake-jp-git.git] / gtk / src / hb-backend.c
index 517f105..63ce0c0 100644 (file)
@@ -287,6 +287,30 @@ combo_opts_t badapt_opts =
        d_badapt_opts
 };
 
+static options_map_t d_bpyramid_opts[] =
+{
+       {"Off",    "none",   0, "none"},
+       {"Strict", "strict", 1, "strict"},
+       {"Normal", "normal", 2, "normal"},
+};
+combo_opts_t bpyramid_opts =
+{
+       sizeof(d_bpyramid_opts)/sizeof(options_map_t),
+       d_bpyramid_opts
+};
+
+static options_map_t d_weightp_opts[] =
+{
+       {"Off",   "0", 0, "0"},
+       {"Blind", "1", 1, "1"},
+       {"Smart", "2", 2, "2"},
+};
+combo_opts_t weightp_opts =
+{
+       sizeof(d_weightp_opts)/sizeof(options_map_t),
+       d_weightp_opts
+};
+
 static options_map_t d_me_opts[] =
 {
        {"Diamond",              "dia",  0, "dia"},
@@ -303,16 +327,17 @@ combo_opts_t me_opts =
 
 static options_map_t d_subme_opts[] =
 {
-       {"1", "1", 1, "1"},
-       {"2", "2", 2, "2"},
-       {"3", "3", 3, "3"},
-       {"4", "4", 4, "4"},
-       {"5", "5", 5, "5"},
-       {"6", "6", 6, "6"},
-       {"7", "7", 7, "7"},
-       {"8", "8", 8, "8"},
-       {"9", "9", 9, "9"},
-       {"10", "10", 10, "10"},
+       {"0: SAD, no subpel",          "0", 0, "0"},
+       {"1: SAD, qpel",               "1", 1, "1"},
+       {"2: SATD, qpel",              "2", 2, "2"},
+       {"3: SATD: multi-qpel",        "3", 3, "3"},
+       {"4: SATD, qpel on all",       "4", 4, "4"},
+       {"5: SATD, multi-qpel on all", "5", 5, "5"},
+       {"6: RD in I/P-frames",        "6", 6, "6"},
+       {"7: RD in all frames",        "7", 7, "7"},
+       {"8: RD refine in I/P-frames", "8", 8, "8"},
+       {"9: RD refine in all frames", "9", 9, "9"},
+       {"10: QPRD in all frames",     "10", 10, "10"},
 };
 combo_opts_t subme_opts =
 {
@@ -322,10 +347,11 @@ combo_opts_t subme_opts =
 
 static options_map_t d_analyse_opts[] =
 {
-       {"Some", "some", 0, "some"},
+       {"Most", "p8x8,b8x8,i8x8,i4x4", 0, "p8x8,b8x8,i8x8,i4x4"},
        {"None", "none", 1, "none"},
-       {"All",  "all",  2, "all"},
-       {"Custom",  "custom",  3, "all"},
+       {"Some", "i4x4,i8x8", 2, "i4x4,i8x8"},
+       {"All",  "all",  3, "all"},
+       {"Custom",  "custom",  4, "all"},
 };
 combo_opts_t analyse_opts =
 {
@@ -335,9 +361,9 @@ combo_opts_t analyse_opts =
 
 static options_map_t d_trellis_opts[] =
 {
-       {"Disabled",          "0", 0, "0"},
-       {"Final Macro Block", "1", 1, "1"},
-       {"Always",            "2", 2, "2"},
+       {"Off",         "0", 0, "0"},
+       {"Encode only", "1", 1, "1"},
+       {"Always",      "2", 2, "2"},
 };
 combo_opts_t trellis_opts =
 {
@@ -388,6 +414,8 @@ combo_name_map_t combo_name_map[] =
        {"AudioEncoder", &acodec_opts},
        {"x264_direct", &direct_opts},
        {"x264_b_adapt", &badapt_opts},
+       {"x264_bpyramid", &bpyramid_opts},
+       {"x264_weighted_pframes", &weightp_opts},
        {"x264_me", &me_opts},
        {"x264_subme", &subme_opts},
        {"x264_analyse", &analyse_opts},
@@ -841,20 +869,36 @@ static gint
 lookup_mix_int(const GValue *mix)
 {
        gint ii;
-       gchar *str;
        gint result = 0;
 
 
-       str = ghb_value_string(mix);
-       for (ii = 0; ii < hb_audio_mixdowns_count; ii++)
+       if (G_VALUE_TYPE(mix) == G_TYPE_STRING)
        {
-               if (strcmp(hb_audio_mixdowns[ii].short_name, str) == 0)
+               gchar * str = ghb_value_string(mix);
+               for (ii = 0; ii < hb_audio_mixdowns_count; ii++)
                {
-                       result = hb_audio_mixdowns[ii].amixdown;
-                       break;
+                       if (strcmp(hb_audio_mixdowns[ii].short_name, str) == 0)
+                       {
+                               result = hb_audio_mixdowns[ii].amixdown;
+                               break;
+                       }
+               }
+               g_free(str);
+       }
+       else if (G_VALUE_TYPE(mix) == G_TYPE_INT ||
+                        G_VALUE_TYPE(mix) == G_TYPE_INT64 ||
+                        G_VALUE_TYPE(mix) == G_TYPE_DOUBLE)
+       {
+               gint val = ghb_value_int(mix);
+               for (ii = 0; ii < hb_audio_mixdowns_count; ii++)
+               {
+                       if (hb_audio_mixdowns[ii].amixdown == val)
+                       {
+                               result = hb_audio_mixdowns[ii].amixdown;
+                               break;
+                       }
                }
        }
-       g_free(str);
        return result;
 }
 
@@ -862,20 +906,73 @@ static const gchar*
 lookup_mix_option(const GValue *mix)
 {
        gint ii;
-       gchar *str;
        gchar *result = "None";
 
 
-       str = ghb_value_string(mix);
-       for (ii = 0; ii < hb_audio_mixdowns_count; ii++)
+       if (G_VALUE_TYPE(mix) == G_TYPE_STRING)
        {
-               if (strcmp(hb_audio_mixdowns[ii].short_name, str) == 0)
+               gchar *str = ghb_value_string(mix);
+               for (ii = 0; ii < hb_audio_mixdowns_count; ii++)
                {
-                       result = hb_audio_mixdowns[ii].human_readable_name;
-                       break;
+                       if (strcmp(hb_audio_mixdowns[ii].short_name, str) == 0)
+                       {
+                               result = hb_audio_mixdowns[ii].human_readable_name;
+                               break;
+                       }
+               }
+               g_free(str);
+       }
+       else if (G_VALUE_TYPE(mix) == G_TYPE_INT ||
+                        G_VALUE_TYPE(mix) == G_TYPE_INT64 ||
+                        G_VALUE_TYPE(mix) == G_TYPE_DOUBLE)
+       {
+               gint val = ghb_value_int(mix);
+               for (ii = 0; ii < hb_audio_mixdowns_count; ii++)
+               {
+                       if (hb_audio_mixdowns[ii].amixdown == val)
+                       {
+                               result = hb_audio_mixdowns[ii].human_readable_name;
+                               break;
+                       }
+               }
+       }
+       return result;
+}
+
+static const gchar*
+lookup_mix_string(const GValue *mix)
+{
+       gint ii;
+       gchar *result = "None";
+
+
+       if (G_VALUE_TYPE(mix) == G_TYPE_STRING)
+       {
+               gchar *str = ghb_value_string(mix);
+               for (ii = 0; ii < hb_audio_mixdowns_count; ii++)
+               {
+                       if (strcmp(hb_audio_mixdowns[ii].short_name, str) == 0)
+                       {
+                               result = hb_audio_mixdowns[ii].short_name;
+                               break;
+                       }
+               }
+               g_free(str);
+       }
+       else if (G_VALUE_TYPE(mix) == G_TYPE_INT ||
+                        G_VALUE_TYPE(mix) == G_TYPE_INT64 ||
+                        G_VALUE_TYPE(mix) == G_TYPE_DOUBLE)
+       {
+               gint val = ghb_value_int(mix);
+               for (ii = 0; ii < hb_audio_mixdowns_count; ii++)
+               {
+                       if (hb_audio_mixdowns[ii].amixdown == val)
+                       {
+                               result = hb_audio_mixdowns[ii].short_name;
+                               break;
+                       }
                }
        }
-       g_free(str);
        return result;
 }
 
@@ -925,21 +1022,37 @@ static gint
 lookup_audio_rate_int(const GValue *rate)
 {
        gint ii;
-       gchar *str;
        gint result = 0;
 
-       // Coincidentally, the string "source" will return 0
-       // which is our flag to use "same as source"
-       str = ghb_value_string(rate);
-       for (ii = 0; ii < hb_audio_rates_count; ii++)
+       if (G_VALUE_TYPE(rate) == G_TYPE_STRING)
        {
-               if (strcmp(hb_audio_rates[ii].string, str) == 0)
+               // Coincidentally, the string "source" will return 0
+               // which is our flag to use "same as source"
+               gchar * str = ghb_value_string(rate);
+               for (ii = 0; ii < hb_audio_rates_count; ii++)
                {
-                       result = hb_audio_rates[ii].rate;
-                       break;
+                       if (strcmp(hb_audio_rates[ii].string, str) == 0)
+                       {
+                               result = hb_audio_rates[ii].rate;
+                               break;
+                       }
+               }
+               g_free(str);
+       }
+       else if (G_VALUE_TYPE(rate) == G_TYPE_INT ||
+                        G_VALUE_TYPE(rate) == G_TYPE_INT64 ||
+                        G_VALUE_TYPE(rate) == G_TYPE_DOUBLE)
+       {
+               for (ii = 0; ii < hb_audio_rates_count; ii++)
+               {
+                       gint val = ghb_value_int(rate);
+                       if (val == hb_audio_rates[ii].rate)
+                       {
+                               result = hb_audio_rates[ii].rate;
+                               break;
+                       }
                }
        }
-       g_free(str);
        return result;
 }
 
@@ -947,21 +1060,37 @@ static const gchar*
 lookup_audio_rate_option(const GValue *rate)
 {
        gint ii;
-       gchar *str;
        const gchar *result = "Same as source";
 
-       // Coincidentally, the string "source" will return 0
-       // which is our flag to use "same as source"
-       str = ghb_value_string(rate);
-       for (ii = 0; ii < hb_audio_rates_count; ii++)
+       if (G_VALUE_TYPE(rate) == G_TYPE_STRING)
        {
-               if (strcmp(hb_audio_rates[ii].string, str) == 0)
+               // Coincidentally, the string "source" will return 0
+               // which is our flag to use "same as source"
+               gchar *str = ghb_value_string(rate);
+               for (ii = 0; ii < hb_audio_rates_count; ii++)
                {
-                       result = hb_audio_rates[ii].string;
-                       break;
+                       if (strcmp(hb_audio_rates[ii].string, str) == 0)
+                       {
+                               result = hb_audio_rates[ii].string;
+                               break;
+                       }
+               }
+               g_free(str);
+       }
+       else if (G_VALUE_TYPE(rate) == G_TYPE_INT ||
+                        G_VALUE_TYPE(rate) == G_TYPE_INT64 ||
+                        G_VALUE_TYPE(rate) == G_TYPE_DOUBLE)
+       {
+               for (ii = 0; ii < hb_audio_rates_count; ii++)
+               {
+                       gint val = ghb_value_int(rate);
+                       if (val == hb_audio_rates[ii].rate)
+                       {
+                               result = hb_audio_rates[ii].string;
+                               break;
+                       }
                }
        }
-       g_free(str);
        return result;
 }
 
@@ -996,21 +1125,37 @@ static gint
 lookup_audio_bitrate_int(const GValue *rate)
 {
        gint ii;
-       gchar *str;
        gint result = 0;
 
-       // Coincidentally, the string "source" will return 0
-       // which is our flag to use "same as source"
-       str = ghb_value_string(rate);
-       for (ii = 0; ii < hb_audio_bitrates_count; ii++)
+       if (G_VALUE_TYPE(rate) == G_TYPE_STRING)
        {
-               if (strcmp(hb_audio_bitrates[ii].string, str) == 0)
+               // Coincidentally, the string "source" will return 0
+               // which is our flag to use "same as source"
+               gchar *str = ghb_value_string(rate);
+               for (ii = 0; ii < hb_audio_bitrates_count; ii++)
                {
-                       result = hb_audio_bitrates[ii].rate;
-                       break;
+                       if (strcmp(hb_audio_bitrates[ii].string, str) == 0)
+                       {
+                               result = hb_audio_bitrates[ii].rate;
+                               break;
+                       }
+               }
+               g_free(str);
+       }
+       else if (G_VALUE_TYPE(rate) == G_TYPE_INT ||
+                        G_VALUE_TYPE(rate) == G_TYPE_INT64 ||
+                        G_VALUE_TYPE(rate) == G_TYPE_DOUBLE)
+       {
+               gint val = ghb_value_int(rate);
+               for (ii = 0; ii < hb_audio_bitrates_count; ii++)
+               {
+                       if (hb_audio_bitrates[ii].rate == val)
+                       {
+                               result = hb_audio_bitrates[ii].rate;
+                               break;
+                       }
                }
        }
-       g_free(str);
        return result;
 }
 
@@ -1018,21 +1163,37 @@ static const gchar*
 lookup_audio_bitrate_option(const GValue *rate)
 {
        gint ii;
-       gchar *str;
        const gchar *result = "Same as source";
 
-       // Coincidentally, the string "source" will return 0
-       // which is our flag to use "same as source"
-       str = ghb_value_string(rate);
-       for (ii = 0; ii < hb_audio_bitrates_count; ii++)
+       if (G_VALUE_TYPE(rate) == G_TYPE_STRING)
        {
-               if (strcmp(hb_audio_bitrates[ii].string, str) == 0)
+               // Coincidentally, the string "source" will return 0
+               // which is our flag to use "same as source"
+               gchar *str = ghb_value_string(rate);
+               for (ii = 0; ii < hb_audio_bitrates_count; ii++)
                {
-                       result = hb_audio_bitrates[ii].string;
-                       break;
+                       if (strcmp(hb_audio_bitrates[ii].string, str) == 0)
+                       {
+                               result = hb_audio_bitrates[ii].string;
+                               break;
+                       }
+               }
+               g_free(str);
+       }
+       else if (G_VALUE_TYPE(rate) == G_TYPE_INT ||
+                        G_VALUE_TYPE(rate) == G_TYPE_INT64 ||
+                        G_VALUE_TYPE(rate) == G_TYPE_DOUBLE)
+       {
+               gint val = ghb_value_int(rate);
+               for (ii = 0; ii < hb_audio_bitrates_count; ii++)
+               {
+                       if (hb_audio_bitrates[ii].rate == val)
+                       {
+                               result = hb_audio_bitrates[ii].string;
+                               break;
+                       }
                }
        }
-       g_free(str);
        return result;
 }
 
@@ -1394,7 +1555,7 @@ ghb_grey_combo_options(GtkBuilder *builder)
        container = ghb_lookup_combo_int("FileFormat", gval);
        ghb_value_free(gval);
 
-       grey_combo_box_item(builder, "x264_analyse", 3, TRUE);
+       grey_combo_box_item(builder, "x264_analyse", 4, TRUE);
        grey_combo_box_item(builder, "AudioEncoder", HB_ACODEC_FAAC, FALSE);
        grey_combo_box_item(builder, "AudioEncoder", HB_ACODEC_LAME, FALSE);
        grey_combo_box_item(builder, "AudioEncoder", HB_ACODEC_VORBIS, FALSE);
@@ -2152,7 +2313,7 @@ ghb_find_audio_track(
        gint ii;
        gint count = 0;
        gint track = -1;
-       gint max_chan = 0;
+       gint max_chan;
        gboolean *used = NULL;
        gboolean *passthru_used;
        gint try_acodec;
@@ -2171,6 +2332,7 @@ ghb_find_audio_track(
        if (count > 10) count = 10;
        // Try to find an item that matches the preferred language and
        // the passthru codec type
+       max_chan = 0;
        passthru = (acodec & (HB_ACODEC_AC3 | HB_ACODEC_DCA)) != 0;
        if (passthru)
        {
@@ -2257,8 +2419,6 @@ ghb_find_audio_track(
        {
                for (ii = 0; ii < count; ii++)
                {
-                       gint channels;
-
                        audio = (hb_audio_config_t*)hb_list_audio_config_item( 
                                                                                                        title->list_audio, ii );
                        passthru_acodec = (HB_ACODEC_AC3 | HB_ACODEC_DCA) & audio->in.codec;
@@ -2305,6 +2465,8 @@ ghb_find_audio_track(
                audio = (hb_audio_config_t*)hb_list_audio_config_item( 
                                                                                                        title->list_audio, ii );
                passthru_acodec = (HB_ACODEC_AC3 | HB_ACODEC_DCA) & audio->in.codec;
+               channels = HB_INPUT_CH_LAYOUT_GET_DISCRETE_COUNT(
+                                                                                               audio->in.channel_layout);
                if (passthru_acodec && passthru)
                {
                        passthru_used = get_track_used(passthru_acodec, track_indices, count);
@@ -2612,7 +2774,7 @@ ghb_lookup_combo_string(const gchar *name, const GValue *gval)
        else if (strcmp(name, "VideoFramerate") == 0)
                return lookup_video_rate_option(gval);
        else if (strcmp(name, "AudioMixdown") == 0)
-               return lookup_mix_option(gval);
+               return lookup_mix_string(gval);
        else if (strcmp(name, "SrtLanguage") == 0)
                return lookup_audio_lang_option(gval);
        else if (strcmp(name, "PreferredLanguage") == 0)
@@ -2683,12 +2845,14 @@ ghb_update_ui_combo_box(
                generic_opts_set(ud->builder, "PictureDenoise", &denoise_opts);
                generic_opts_set(ud->builder, "VideoEncoder", &vcodec_opts);
                small_opts_set(ud->builder, "AudioEncoder", &acodec_opts);
-               generic_opts_set(ud->builder, "x264_direct", &direct_opts);
-               generic_opts_set(ud->builder, "x264_b_adapt", &badapt_opts);
-               generic_opts_set(ud->builder, "x264_me", &me_opts);
-               generic_opts_set(ud->builder, "x264_subme", &subme_opts);
-               generic_opts_set(ud->builder, "x264_analyse", &analyse_opts);
-               generic_opts_set(ud->builder, "x264_trellis", &trellis_opts);
+               small_opts_set(ud->builder, "x264_direct", &direct_opts);
+               small_opts_set(ud->builder, "x264_b_adapt", &badapt_opts);
+               small_opts_set(ud->builder, "x264_bpyramid", &bpyramid_opts);
+               small_opts_set(ud->builder, "x264_weighted_pframes", &weightp_opts);
+               small_opts_set(ud->builder, "x264_me", &me_opts);
+               small_opts_set(ud->builder, "x264_subme", &subme_opts);
+               small_opts_set(ud->builder, "x264_analyse", &analyse_opts);
+               small_opts_set(ud->builder, "x264_trellis", &trellis_opts);
        }
        else
        {
@@ -4514,7 +4678,11 @@ add_job(hb_handle_t *h, GValue *js, gint unique_id, gint titleindex)
        {
                job->vrate = 27000000;
                job->vrate_base = vrate;
-               job->cfr = 1;
+               gboolean pfr = ghb_settings_get_boolean(js, "VideoFrameratePFR");
+               if (pfr)
+                       job->cfr = 2;
+               else
+                       job->cfr = 1;
        }
 
        const GValue *audio_list;