summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--gtk/src/videohandler.c268
-rw-r--r--gtk/src/videohandler.h33
2 files changed, 301 insertions, 0 deletions
diff --git a/gtk/src/videohandler.c b/gtk/src/videohandler.c
new file mode 100644
index 000000000..96a59c4b9
--- /dev/null
+++ b/gtk/src/videohandler.c
@@ -0,0 +1,268 @@
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
+/*
+ * callbacks.c
+ * Copyright (C) John Stebbins 2008-2013 <stebbins@stebbins>
+ *
+ * callbacks.c is free software.
+ *
+ * You may redistribute it and/or modify it under the terms of the
+ * GNU General Public License, as published by the Free Software
+ * Foundation; either version 2 of the License, or (at your option)
+ * any later version.
+ */
+
+#include "ghbcompat.h"
+#include <string.h>
+#include "settings.h"
+#include "values.h"
+#include "callbacks.h"
+#include "presets.h"
+#include "preview.h"
+#include "hb-backend.h"
+
+int ghb_get_video_encoder(GValue *settings)
+{
+ const char *encoder;
+ encoder = ghb_settings_get_const_string(settings, "VideoEncoder");
+ return hb_video_encoder_get_from_name(encoder);
+}
+
+G_MODULE_EXPORT void
+vcodec_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
+{
+ float val, vqmin, vqmax, step, page;
+ int inverted, digits;
+
+ ghb_widget_to_setting(ud->settings, widget);
+ ghb_check_dependency(ud, widget, NULL);
+ ghb_show_container_options(ud);
+ ghb_clear_presets_selection(ud);
+ ghb_live_reset(ud);
+
+ // Set the range of the video quality slider
+ val = ghb_vquality_default(ud);
+ ghb_vquality_range(ud, &vqmin, &vqmax, &step, &page, &digits, &inverted);
+ ghb_scale_configure(ud, "VideoQualitySlider", val, vqmin, vqmax,
+ step, page, digits, inverted);
+
+ ghb_update_ui_combo_box(ud, "VideoTune", NULL, FALSE);
+ ghb_update_ui_combo_box(ud, "VideoProfile", NULL, FALSE);
+ ghb_update_ui_combo_box(ud, "VideoLevel", NULL, FALSE);
+ ghb_ui_update(ud, "VideoTune", ghb_int_value(0));
+ ghb_ui_update(ud, "VideoProfile", ghb_int_value(0));
+ ghb_ui_update(ud, "VideoLevel", ghb_int_value(0));
+
+ // Set the range of the preset slider
+ int encoder = ghb_get_video_encoder(ud->settings);
+ GtkWidget *presetSlider = GHB_WIDGET(ud->builder, "VideoPresetSlider");
+ const char * const *video_presets;
+ int count = 0;
+ video_presets = hb_video_encoder_get_presets(encoder);
+ while (video_presets && video_presets[count]) count++;
+ if (count)
+ gtk_range_set_range(GTK_RANGE(presetSlider), 0, count-1);
+
+ // Advanced options are only for x264
+ if (encoder != HB_VCODEC_X264)
+ {
+ ghb_ui_update(ud, "x264UseAdvancedOptions", ghb_boolean_value(FALSE));
+ }
+}
+
+void
+ghb_video_setting_changed(GtkWidget *widget, signal_user_data_t *ud)
+{
+ static char *tt = NULL;
+
+
+ if (tt == NULL)
+ {
+ GtkWidget *eo = GTK_WIDGET(GHB_WIDGET(ud->builder, "VideoOptionExtra"));
+ tt = gtk_widget_get_tooltip_text(eo);
+ }
+
+ ghb_widget_to_setting(ud->settings, widget);
+
+ int encoder = ghb_get_video_encoder(ud->settings);
+ int presetIndex = ghb_settings_get_int(ud->settings, "VideoPresetSlider");
+ const char * const *video_presets;
+ const char *preset;
+ video_presets = hb_video_encoder_get_presets(encoder);
+ if (video_presets != NULL)
+ {
+ preset = video_presets[presetIndex];
+ ghb_settings_set_string(ud->settings, "VideoPreset", preset);
+ }
+
+ if (!ghb_settings_get_boolean(ud->settings, "x264UseAdvancedOptions") &&
+ encoder == HB_VCODEC_X264)
+ {
+ GString *str = g_string_new("");
+ char *preset;
+ char *tune;
+ char *profile;
+ char *level;
+ char *opts;
+ char *tunes;
+
+ preset = ghb_settings_get_string(ud->settings, "VideoPreset");
+ tune = ghb_settings_get_string(ud->settings, "VideoTune");
+ profile = ghb_settings_get_string(ud->settings, "VideoProfile");
+ level = ghb_settings_get_string(ud->settings, "VideoLevel");
+ opts = ghb_settings_get_string(ud->settings, "VideoOptionExtra");
+
+ if (tune[0] && strcmp(tune, "none"))
+ {
+ g_string_append_printf(str, "%s", tune);
+ }
+ if (ghb_settings_get_boolean(ud->settings, "x264FastDecode"))
+ {
+ g_string_append_printf(str, "%s%s", str->str[0] ? "," : "", "fastdecode");
+ }
+ if (ghb_settings_get_boolean(ud->settings, "x264ZeroLatency"))
+ {
+ g_string_append_printf(str, "%s%s", str->str[0] ? "," : "", "zerolatency");
+ }
+ tunes = g_string_free(str, FALSE);
+
+ char * new_opts;
+
+ int w = ghb_settings_get_int(ud->settings, "scale_width");
+ int h = ghb_settings_get_int(ud->settings, "scale_height");
+
+ if (w == 0 || h == 0)
+ {
+ if (!ghb_settings_get_boolean(ud->settings, "autoscale"))
+ {
+ w = ghb_settings_get_int(ud->settings, "PictureWidth");
+ h = ghb_settings_get_int(ud->settings, "PictureHeight");
+
+ if (h == 0 && w != 0)
+ {
+ h = w * 9 / 16;
+ }
+ if (w == 0 && h != 0)
+ {
+ w = h * 16 / 9;
+ }
+ }
+ if (w == 0 || h == 0)
+ {
+ w = 1280;
+ h = 720;
+ }
+ }
+
+ if (!strcasecmp(profile, "auto"))
+ {
+ profile[0] = 0;
+ }
+ if (!strcasecmp(level, "auto"))
+ {
+ level[0] = 0;
+ }
+ new_opts = hb_x264_param_unparse(
+ preset, tunes, opts, profile, level, w, h);
+ if (new_opts)
+ ghb_ui_update(ud, "x264Option", ghb_string_value(new_opts));
+ else
+ ghb_ui_update(ud, "x264Option", ghb_string_value(""));
+
+ GtkWidget *eo = GTK_WIDGET(GHB_WIDGET(ud->builder, "VideoOptionExtra"));
+
+ char * new_tt;
+ if (new_opts)
+ new_tt = g_strdup_printf("%s\n\nExpanded Options:\n\"%s\"", tt, new_opts);
+ else
+ new_tt = g_strdup_printf("%s\n\nExpanded Options:\n\"\"", tt);
+ gtk_widget_set_tooltip_text(eo, new_tt);
+
+ g_free(new_tt);
+ g_free(new_opts);
+
+ g_free(preset);
+ g_free(tune);
+ g_free(profile);
+ g_free(level);
+ g_free(opts);
+ g_free(tunes);
+ }
+ else if (ghb_settings_get_boolean(ud->settings, "x264UseAdvancedOptions"))
+ {
+ char *opts = ghb_settings_get_string(ud->settings, "x264Option");
+
+ GtkWidget *eo = GTK_WIDGET(GHB_WIDGET(ud->builder, "VideoOptionExtra"));
+ char * new_tt;
+ if (opts)
+ new_tt = g_strdup_printf("%s\n\nExpanded Options:\n\"%s\"", tt, opts);
+ else
+ new_tt = g_strdup_printf("%s\n\nExpanded Options:\n\"\"", tt);
+ gtk_widget_set_tooltip_text(eo, new_tt);
+ g_free(new_tt);
+
+ g_free(opts);
+ }
+
+ ghb_check_dependency(ud, widget, NULL);
+ ghb_clear_presets_selection(ud);
+}
+
+G_MODULE_EXPORT void
+video_setting_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
+{
+ ghb_video_setting_changed(widget, ud);
+}
+
+G_MODULE_EXPORT void
+x264_use_advanced_options_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
+{
+ ghb_widget_to_setting(ud->settings, widget);
+
+ if (ghb_settings_get_boolean(ud->prefs, "HideAdvancedVideoSettings") &&
+ ghb_settings_get_boolean(ud->settings, "x264UseAdvancedOptions"))
+ {
+ ghb_ui_update(ud, "x264UseAdvancedOptions", ghb_boolean_value(FALSE));
+ return;
+ }
+
+ if (ghb_settings_get_boolean(ud->settings, "x264UseAdvancedOptions"))
+ {
+ ghb_ui_update(ud, "VideoPresetSlider", ghb_int_value(5));
+ ghb_ui_update(ud, "VideoTune", ghb_string_value("none"));
+ ghb_ui_update(ud, "VideoProfile", ghb_string_value("auto"));
+ ghb_ui_update(ud, "VideoLevel", ghb_string_value("auto"));
+
+ char *options = ghb_settings_get_string(ud->settings, "x264Option");
+ ghb_ui_update(ud, "VideoOptionExtra", ghb_string_value(options));
+ g_free(options);
+ }
+
+ ghb_check_dependency(ud, widget, NULL);
+ ghb_clear_presets_selection(ud);
+}
+
+G_MODULE_EXPORT void
+video_option_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
+{
+ GtkWidget *textview;
+
+ textview = GTK_WIDGET(GHB_WIDGET(ud->builder, "VideoOptionExtra"));
+ ghb_video_setting_changed(textview, ud);
+}
+
+G_MODULE_EXPORT gchar*
+format_video_preset_cb(GtkScale *scale, gdouble val, signal_user_data_t *ud)
+{
+ const char * const *video_presets;
+ const char *preset;
+ int encoder = ghb_get_video_encoder(ud->settings);
+
+ video_presets = hb_video_encoder_get_presets(encoder);
+ if (video_presets != NULL)
+ {
+ preset = video_presets[(int)val];
+ return g_strdup_printf(" %-12s", preset);
+ }
+ return g_strdup_printf(" %-12s", "ERROR");
+}
+
diff --git a/gtk/src/videohandler.h b/gtk/src/videohandler.h
new file mode 100644
index 000000000..92d2c50c4
--- /dev/null
+++ b/gtk/src/videohandler.h
@@ -0,0 +1,33 @@
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
+/*
+ * audiohandler.h
+ * Copyright (C) John Stebbins 2008-2013 <stebbins@stebbins>
+ *
+ * audiohandler.h is free software.
+ *
+ * You may redistribute it and/or modify it under the terms of the
+ * GNU General Public License, as published by the Free Software
+ * Foundation; either version 2 of the License, or (at your option)
+ * any later version.
+ *
+ * callbacks.h is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with callbacks.h. If not, write to:
+ * The Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA 02110-1301, USA.
+ */
+
+#if !defined(_VIDEOHANDLER_H_)
+#define _VIDEOHANDLER_H_
+
+#include "settings.h"
+
+int ghb_get_video_encoder(GValue *settings);
+void ghb_video_setting_changed(GtkWidget *widget, signal_user_data_t *ud);
+
+#endif // _VIDEOHANDLER_H_