X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=gtk%2Fsrc%2Fx264handler.c;h=17c67db362bffa0255205692c35564a28da642f2;hb=61c0e9c10ba95847f39e1610d52257ac42162b20;hp=cad6049996f31fb4794b18ec5c6f38b05a25159d;hpb=c3fc9b34d0f0266d65f4992da6e3068eb5fe13d1;p=handbrake-jp%2Fhandbrake-jp-git.git diff --git a/gtk/src/x264handler.c b/gtk/src/x264handler.c index cad60499..17c67db3 100644 --- a/gtk/src/x264handler.c +++ b/gtk/src/x264handler.c @@ -26,7 +26,7 @@ static gchar* sanitize_x264opts(signal_user_data_t *ud, const gchar *options); // Flag needed to prevent x264 options processing from chasing its tail static gboolean ignore_options_update = FALSE; -void +G_MODULE_EXPORT void x264_widget_changed_cb(GtkWidget *widget, signal_user_data_t *ud) { ghb_widget_to_setting(ud->settings, widget); @@ -40,10 +40,9 @@ x264_widget_changed_cb(GtkWidget *widget, signal_user_data_t *ud) ghb_clear_presets_selection(ud); } -void +G_MODULE_EXPORT void x264_me_changed_cb(GtkWidget *widget, signal_user_data_t *ud) { - const GValue *gval; gint me; ghb_widget_to_setting(ud->settings, widget); @@ -56,8 +55,7 @@ x264_me_changed_cb(GtkWidget *widget, signal_user_data_t *ud) ghb_check_dependency(ud, widget); ghb_clear_presets_selection(ud); widget = GHB_WIDGET(ud->builder, "x264_merange"); - gval = ghb_settings_get_value(ud->settings, "x264_me"); - me = ghb_lookup_combo_int("x264_me", gval); + me = ghb_settings_combo_int(ud->settings, "x264_me"); if (me < 2) { // me < umh // me_range 4 - 16 @@ -70,7 +68,7 @@ x264_me_changed_cb(GtkWidget *widget, signal_user_data_t *ud) } } -void +G_MODULE_EXPORT void x264_entry_changed_cb(GtkWidget *widget, signal_user_data_t *ud) { g_debug("x264_entry_changed_cb ()"); @@ -98,7 +96,7 @@ x264_entry_changed_cb(GtkWidget *widget, signal_user_data_t *ud) } } -gboolean +G_MODULE_EXPORT gboolean x264_focus_out_cb(GtkWidget *widget, GdkEventFocus *event, signal_user_data_t *ud) { @@ -254,7 +252,7 @@ x264_update_combo(signal_user_data_t *ud, const gchar *name, const gchar *val) GtkTreeModel *store; GtkTreeIter iter; gchar *shortOpt; - gint ivalue; + gdouble ivalue; gboolean foundit = FALSE; GtkWidget *widget; @@ -336,31 +334,37 @@ x264_update_deblock(signal_user_data_t *ud, const gchar *xval) } static void -x264_update_psy(signal_user_data_t *ud, const gchar *xval) +x264_parse_psy(const gchar *psy, gdouble *psy_rd, gdouble *psy_trell) { - gdouble rd_value, trell_value; - gchar *end; gchar *val; gchar *trell_val = NULL; + gchar *end; - if (xval == NULL) return; - val = g_strdup(xval); - rd_value = trell_value = 0; - if (val != NULL) + *psy_rd = 0.; + *psy_trell = 0.; + if (psy == NULL) return; + val = g_strdup(psy); + gchar *pos = strchr(val, ','); + if (pos != NULL) { - gchar *pos = strchr(val, ','); - if (pos != NULL) - { - trell_val = pos + 1; - *pos = 0; - } - rd_value = g_strtod (val, &end); - if (trell_val != NULL) - { - trell_value = g_strtod (trell_val, &end); - } + trell_val = pos + 1; + *pos = 0; + } + *psy_rd = g_strtod (val, &end); + if (trell_val != NULL) + { + *psy_trell = g_strtod (trell_val, &end); } g_free(val); +} + +static void +x264_update_psy(signal_user_data_t *ud, const gchar *xval) +{ + gdouble rd_value, trell_value; + + if (xval == NULL) return; + x264_parse_psy(xval, &rd_value, &trell_value); ghb_ui_update(ud, "x264_psy_rd", ghb_double_value(rd_value)); ghb_ui_update(ud, "x264_psy_trell", ghb_double_value(trell_value)); } @@ -602,6 +606,29 @@ x264_opt_update(signal_user_data_t *ud, GtkWidget *widget) } } +static gint +x264_find_opt(gchar **opts, gchar **opt_syns) +{ + gint ii; + for (ii = 0; opts[ii] != NULL; ii++) + { + gchar *opt; + opt = g_strdup(opts[ii]); + gchar *pos = strchr(opt, '='); + if (pos != NULL) + { + *pos = 0; + } + if (find_syn_match(opt, opt_syns) >= 0) + { + g_free(opt); + return ii; + } + g_free(opt); + } + return -1; +} + static void x264_remove_opt(gchar **opts, gchar **opt_syns) { @@ -624,37 +651,88 @@ x264_remove_opt(gchar **opts, gchar **opt_syns) } } -// Construct the x264 options string -// The result is allocated, so someone must free it at some point. static gchar* -sanitize_x264opts(signal_user_data_t *ud, const gchar *options) +x264_lookup_value(gchar **opts, gchar **opt_syns) { - GString *x264opts = g_string_new(""); - gchar **split = g_strsplit(options, ":", -1); + gchar *ret = NULL; + gint pos; - // Remove entries that match the defaults - gint ii; - for (ii = 0; split[ii] != NULL; ii++) + const gchar *def_val = x264_opt_get_default(opt_syns[0]); + + pos = x264_find_opt(opts, opt_syns); + if (pos >= 0) { - gchar *val = NULL; - gchar *opt = g_strdup(split[ii]); - gchar *pos = strchr(opt, '='); - if (pos != NULL) + gchar *cpos = strchr(opts[pos], '='); + if (cpos != NULL) { - val = pos + 1; - *pos = 0; + ret = g_strdup(cpos+1); } else { - val = "1"; + ret = g_strdup(""); } - const gchar *def_val = x264_opt_get_default(opt); - if (strcmp(val, def_val) == 0) + } + else if (def_val != NULL) + { + ret = g_strdup(def_val); + } + return ret; +} + +gint +ghb_lookup_badapt(gchar *options) +{ + gint ret = 0; + gchar *result; + gchar **split; + + if (options == NULL) + options = ""; + + split = g_strsplit(options, ":", -1); + + result = x264_lookup_value(split, x264_badapt_syns); + g_strfreev(split); + if (result != NULL) + { + ret = g_strtod(result, NULL); + g_free(result); + } + return ret; +} + +// Construct the x264 options string +// The result is allocated, so someone must free it at some point. +static gchar* +sanitize_x264opts(signal_user_data_t *ud, const gchar *options) +{ + GString *x264opts = g_string_new(""); + gchar **split = g_strsplit(options, ":", -1); + gint ii; + + // Fix up option dependencies + gint subme = ghb_settings_combo_int(ud->settings, "x264_subme"); + if (subme < 6) + { + x264_remove_opt(split, x264_psy_syns); + } + gint trell = ghb_settings_combo_int(ud->settings, "x264_trellis"); + if (trell < 1) + { + gint psy; + gdouble psy_rd = 0., psy_trell; + + psy = x264_find_opt(split, x264_psy_syns); + if (psy >= 0) { - // Matches the default, so remove it - split[ii][0] = 0; + gchar *pos = strchr(split[psy], '='); + if (pos != NULL) + { + x264_parse_psy(pos+1, &psy_rd, &psy_trell); + } + g_free(split[psy]); + split[psy] = g_strdup_printf("psy-rd=%g,0", psy_rd); } - g_free(opt); } gint refs = ghb_settings_get_int(ud->settings, "x264_refs"); if (refs <= 1) @@ -676,6 +754,29 @@ sanitize_x264opts(signal_user_data_t *ud, const gchar *options) { x264_remove_opt(split, x264_trellis_syns); } + // Remove entries that match the defaults + for (ii = 0; split[ii] != NULL; ii++) + { + gchar *val = NULL; + gchar *opt = g_strdup(split[ii]); + gchar *pos = strchr(opt, '='); + if (pos != NULL) + { + val = pos + 1; + *pos = 0; + } + else + { + val = "1"; + } + const gchar *def_val = x264_opt_get_default(opt); + if (strcmp(val, def_val) == 0) + { + // Matches the default, so remove it + split[ii][0] = 0; + } + g_free(opt); + } for (ii = 0; split[ii] != NULL; ii++) { if (split[ii][0] != 0)