OSDN Git Service

LinGui: add a hidden feature to allow tweaking some settings. currently
authorjstebbins <jstebbins@b64f7644-9d1e-0410-96f1-a4d463321fa5>
Thu, 21 Aug 2008 00:43:46 +0000 (00:43 +0000)
committerjstebbins <jstebbins@b64f7644-9d1e-0410-96f1-a4d463321fa5>
Thu, 21 Aug 2008 00:43:46 +0000 (00:43 +0000)
tweaks are available for detelecine, decomb, deinterlace, deblock, and denoise
to enable, you must manually edit preferences file and add "allow_tweaks=1"
to tweak a setting, right click on the widget, an entry dialog will appear.
minimal validity checking is done on the tweak's value.

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

gtk/src/callbacks.c
gtk/src/ghb.ui
gtk/src/hb-backend.c
gtk/src/hb-backend.h
gtk/src/internal_defaults
gtk/src/internal_defaults.h
gtk/src/main.c

index df6a17b..8037372 100644 (file)
@@ -2471,6 +2471,11 @@ validate_settings(signal_user_data_t *ud)
        {
                return FALSE;
        }
+       // Validate filter settings
+       if (!ghb_validate_filters(ud))
+       {
+               return FALSE;
+       }
        audio_list_refresh(ud);
        return TRUE;
 }
@@ -3510,3 +3515,62 @@ ghb_hal_init()
     //gvm_hal_claim_branch ("/org/freedesktop/Hal/devices/local");
 }
 
+gboolean 
+tweak_setting_cb(
+       GtkWidget *widget, 
+       GdkEventButton *event, 
+       signal_user_data_t *ud)
+{
+       const gchar *name;
+       gchar *tweak_name;
+       gboolean ret = FALSE;
+       gboolean allow_tweaks;
+
+       g_debug("press %d %d", event->type, event->button);
+       allow_tweaks = ghb_settings_get_bool (ud->settings, "allow_tweaks");
+       if (allow_tweaks && event->type == GDK_BUTTON_PRESS && event->button == 3)
+       { // Its a right mouse click
+               GtkWidget *dialog;
+               GtkEntry *entry;
+               GtkResponseType response;
+               const gchar *tweak = NULL;
+
+               name = gtk_widget_get_name(widget);
+               if (g_str_has_prefix(name, "tweak_"))
+               {
+                       tweak_name = g_strdup(name);
+               }
+               else
+               {
+                       tweak_name = g_strdup_printf("tweak_%s", name);
+               }
+
+               tweak = ghb_settings_get_string (ud->settings, tweak_name);
+               dialog = GHB_WIDGET(ud->builder, "tweak_dialog");
+               gtk_window_set_title(GTK_WINDOW(dialog), tweak_name);
+               entry = GTK_ENTRY(GHB_WIDGET(ud->builder, "tweak_setting"));
+               if (tweak)
+                       gtk_entry_set_text(entry, tweak);
+               response = gtk_dialog_run(GTK_DIALOG(dialog));
+               gtk_widget_hide(dialog);
+               if (response == GTK_RESPONSE_OK)
+               {
+                       tweak = gtk_entry_get_text(entry);
+                       if (ghb_validate_filter_string(tweak, -1))
+                               ghb_settings_set_string(ud->settings, tweak_name, tweak);
+                       else
+                       {
+                               gchar *message;
+                               message = g_strdup_printf(
+                                                       "Invalid Settings:\n%s",
+                                                       tweak);
+                               ghb_message_dialog(GTK_MESSAGE_ERROR, message, "Cancel", NULL);
+                               g_free(message);
+                       }
+               }
+               g_free(tweak_name);
+               ret = TRUE;
+       }
+       return ret;
+}
+
index 6af3229..594388b 100644 (file)
                                         <property name="label" translatable="yes">Detelecine</property>
                                         <property name="draw_indicator">True</property>
                                         <signal handler="setting_widget_changed_cb" name="toggled"/>
+                                        <signal handler="tweak_setting_cb" name="button-press-event"/>
                                       </object>
                                       <packing>
                                         <property name="position">1</property>
                                         <property name="active">True</property>
                                         <property name="draw_indicator">True</property>
                                         <signal handler="setting_widget_changed_cb" name="toggled"/>
+                                        <signal handler="tweak_setting_cb" name="button-press-event"/>
                                       </object>
                                       <packing>
                                         <property name="expand">False</property>
                                         <property name="label" translatable="yes">Deblock</property>
                                         <property name="draw_indicator">True</property>
                                         <signal handler="setting_widget_changed_cb" name="toggled"/>
+                                        <signal handler="tweak_setting_cb" name="button-press-event"/>
                                       </object>
                                       <packing>
                                         <property name="expand">False</property>
                                         <property name="visible">True</property>
                                         <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
                                         <child>
-                                          <object class="GtkLabel" id="label20">
+                                          <object class="GtkEventBox" id="tweak_deinterlace">
                                             <property name="visible">True</property>
-                                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                            <property name="xalign">0</property>
-                                            <property name="label" translatable="yes">Deinterlace:</property>
-                                            <property name="width_chars">10</property>
+                                            <property name="visible_window">False</property>
+                                            <property name="above_child">True</property>
+                                            <signal name="button_press_event" handler="tweak_setting_cb"/>
+                                            <child>
+                                              <object class="GtkLabel" id="label20">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">True</property>
+                                                <property name="selectable">False</property>
+                                                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                                <property name="xalign">0</property>
+                                                <property name="label" translatable="yes">Deinterlace:</property>
+                                                <property name="width_chars">10</property>
+                                              </object>
+                                            </child>
                                           </object>
                                           <packing>
                                             <property name="expand">False</property>
                                             <property name="visible">True</property>
                                             <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
                                             <signal handler="setting_widget_changed_cb" name="changed"/>
+                                            <signal handler="tweak_setting_cb" name="button-press-event"/>
                                           </object>
                                           <packing>
                                             <property name="expand">False</property>
                                         <property name="visible">True</property>
                                         <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
                                         <child>
-                                          <object class="GtkLabel" id="label21">
+                                          <object class="GtkEventBox" id="tweak_denoise">
                                             <property name="visible">True</property>
-                                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                            <property name="xalign">0</property>
-                                            <property name="label" translatable="yes">Denoise:</property>
-                                            <property name="width_chars">10</property>
+                                            <property name="visible_window">False</property>
+                                            <property name="above_child">True</property>
+                                            <signal name="button_press_event" handler="tweak_setting_cb"/>
+                                            <child>
+                                              <object class="GtkLabel" id="label21">
+                                                <property name="visible">True</property>
+                                                <property name="selectable">True</property>
+                                                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                                <property name="xalign">0</property>
+                                                <property name="label" translatable="yes">Denoise:</property>
+                                                <property name="width_chars">10</property>
+                                              </object>
+                                            </child>
                                           </object>
                                           <packing>
                                             <property name="expand">False</property>
                                             <property name="visible">True</property>
                                             <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
                                             <signal handler="setting_widget_changed_cb" name="changed"/>
+                                            <signal handler="tweak_setting_cb" name="button-press-event"/>
                                           </object>
                                           <packing>
                                             <property name="expand">False</property>
@@ -3412,6 +3436,97 @@ this setting.</property>
       <action-widget response="-5">pref_ok</action-widget>
     </action-widgets>
   </object>
+  <object class="GtkDialog" id="tweak_dialog">
+    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+    <property name="border_width">5</property>
+    <property name="modal">True</property>
+    <property name="window_position">GTK_WIN_POS_CENTER_ON_PARENT</property>
+    <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
+    <property name="has_separator">False</property>
+    <signal handler="gtk_widget_hide_on_delete" name="delete_event"/>
+    <child internal-child="vbox">
+      <object class="GtkVBox" id="dialog-vbox7">
+        <property name="visible">True</property>
+        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+        <property name="spacing">2</property>
+        <child>
+          <object class="GtkHBox" id="hbox9">
+            <property name="visible">True</property>
+            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+            <child>
+              <object class="GtkLabel" id="label33">
+                <property name="visible">True</property>
+                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                <property name="label" translatable="yes">Setting:</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkEntry" id="tweak_setting">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                <property name="max_length">40</property>
+                <property name="activates_default">True</property>
+                <property name="width_chars">30</property>
+                <property name="truncate_multiline">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
+        <child internal-child="action_area">
+          <object class="GtkHButtonBox" id="dialog-action_area7">
+            <property name="visible">True</property>
+            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+            <property name="layout_style">GTK_BUTTONBOX_END</property>
+            <child>
+              <object class="GtkButton" id="tweak_cancel">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                <property name="label" translatable="yes">gtk-cancel</property>
+                <property name="use_stock">True</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkButton" id="tweak_ok">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="can_default">True</property>
+                <property name="has_default">True</property>
+                <property name="receives_default">True</property>
+                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                <property name="label" translatable="yes">gtk-ok</property>
+                <property name="use_stock">True</property>
+              </object>
+              <packing>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="pack_type">GTK_PACK_END</property>
+          </packing>
+        </child>
+      </object>
+    </child>
+    <action-widgets>
+      <action-widget response="0">tweak_cancel</action-widget>
+      <action-widget response="-5">tweak_ok</action-widget>
+    </action-widgets>
+  </object>
   <object class="GtkDialog" id="preset_save_dialog">
     <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
     <property name="border_width">5</property>
index 57e1a85..3761664 100644 (file)
@@ -2024,6 +2024,107 @@ ghb_guess_bitrate(GHashTable *settings)
 }
 
 gboolean
+ghb_validate_filter_string(const gchar *str, gint max_fields)
+{
+       gint fields = 0;
+       gboolean in_field = FALSE;
+       if (str == NULL || *str == 0) return TRUE;
+       while (*str)
+       {
+               if (*str >= '0' && *str <= '9')
+               {
+                       if (!in_field)
+                       {
+                               fields++;
+                               // negative max_fields means infinate
+                               if (max_fields >= 0 && fields > max_fields) return FALSE;
+                               in_field = TRUE;
+                       }
+               }
+               else if (!in_field) return FALSE;
+               else if (*str != ':') return FALSE;
+               else in_field = FALSE;
+               str++;
+       }
+       return TRUE;
+}
+
+gboolean
+ghb_validate_filters(signal_user_data_t *ud)
+{
+       gboolean tweaks;
+       const gchar *str;
+       gchar *message;
+       gboolean enabled;
+
+       tweaks = ghb_settings_get_bool(ud->settings, "allow_tweaks");
+       if (tweaks)
+       {
+               // detele 6
+               str = ghb_settings_get_string(ud->settings, "tweak_detelecine");
+               enabled = ghb_settings_get_bool(ud->settings, "detelecine");
+               if (enabled && !ghb_validate_filter_string(str, 6))
+               {
+                       message = g_strdup_printf(
+                                               "Invalid Detelecine Settings:\n\n%s\n",
+                                               str);
+                       ghb_message_dialog(GTK_MESSAGE_ERROR, message, "Cancel", NULL);
+                       g_free(message);
+                       return FALSE;
+               }
+               // decomb 7
+               str = ghb_settings_get_string(ud->settings, "tweak_decomb");
+               enabled = ghb_settings_get_bool(ud->settings, "decomb");
+               if (enabled && !ghb_validate_filter_string(str, 7))
+               {
+                       message = g_strdup_printf(
+                                               "Invalid Decomb Settings:\n\n%s\n",
+                                               str);
+                       ghb_message_dialog(GTK_MESSAGE_ERROR, message, "Cancel", NULL);
+                       g_free(message);
+                       return FALSE;
+               }
+               // deinte 4
+               str = ghb_settings_get_string(ud->settings, "tweak_deinterlace");
+               enabled = ghb_settings_get_bool(ud->settings, "deinterlace");
+               if (enabled && !ghb_validate_filter_string(str, 4))
+               {
+                       message = g_strdup_printf(
+                                               "Invalid Deinterlace Settings:\n\n%s\n",
+                                               str);
+                       ghb_message_dialog(GTK_MESSAGE_ERROR, message, "Cancel", NULL);
+                       g_free(message);
+                       return FALSE;
+               }
+               // debloc 2
+               str = ghb_settings_get_string(ud->settings, "tweak_deblock");
+               enabled = ghb_settings_get_bool(ud->settings, "deblock");
+               if (enabled && !ghb_validate_filter_string(str, 2))
+               {
+                       message = g_strdup_printf(
+                                               "Invalid Deblock Settings:\n\n%s\n",
+                                               str);
+                       ghb_message_dialog(GTK_MESSAGE_ERROR, message, "Cancel", NULL);
+                       g_free(message);
+                       return FALSE;
+               }
+               // denois 4
+               str = ghb_settings_get_string(ud->settings, "tweak_denoise");
+               enabled = ghb_settings_get_bool(ud->settings, "denoise");
+               if (enabled && !ghb_validate_filter_string(str, 4))
+               {
+                       message = g_strdup_printf(
+                                               "Invalid Denoise Settings:\n\n%s\n",
+                                               str);
+                       ghb_message_dialog(GTK_MESSAGE_ERROR, message, "Cancel", NULL);
+                       g_free(message);
+                       return FALSE;
+               }
+       }
+       return TRUE;
+}
+
+gboolean
 ghb_validate_video(signal_user_data_t *ud)
 {
        GHashTable *settings = ud->settings;
@@ -2363,6 +2464,7 @@ ghb_add_job(job_settings_t *js, gint unique_id)
        GHashTable *settings = js->settings;
        static gchar *x264opts;
        gint sub_id = 0;
+       gboolean tweaks = FALSE;
 
        g_debug("ghb_add_job()\n");
        if (h == NULL) return;
@@ -2382,6 +2484,7 @@ ghb_add_job(job_settings_t *js, gint unique_id)
        job   = title->job;
        if (job == NULL) return;
 
+       tweaks = ghb_settings_get_int(settings, "allow_tweaks");
        job->mux = ghb_settings_get_int(settings, "container");
        if (job->mux == HB_MUX_MP4)
        {
@@ -2465,28 +2568,73 @@ ghb_add_job(job_settings_t *js, gint unique_id)
        if( ghb_settings_get_bool(settings, "detelecine" ) || job->vfr )
        {
                hb_filter_detelecine.settings = NULL;
+               if (tweaks)
+               {
+                       const gchar *str;
+                       str = ghb_settings_get_string(settings, "tweak_detelecine");
+                       if (str && str[0])
+                       {
+                               hb_filter_detelecine.settings = (gchar*)str;
+                       }
+               }
                hb_list_add( job->filters, &hb_filter_detelecine );
        }
        if( decomb )
        {
                // Use default settings
                hb_filter_decomb.settings = NULL;
+               if (tweaks)
+               {
+                       const gchar *str;
+                       str = ghb_settings_get_string(settings, "tweak_decomb");
+                       if (str && str[0])
+                       {
+                               hb_filter_decomb.settings = (gchar*)str;
+                       }
+               }
                hb_list_add( job->filters, &hb_filter_decomb );
        }
        if( job->deinterlace )
        {
                hb_filter_deinterlace.settings = (gchar*)ghb_settings_get_string(settings, "deinterlace");
+               if (tweaks)
+               {
+                       const gchar *str;
+                       str = ghb_settings_get_string(settings, "tweak_deinterlace");
+                       if (str && str[0])
+                       {
+                               hb_filter_deinterlace.settings = (gchar*)str;
+                       }
+               }
                hb_list_add( job->filters, &hb_filter_deinterlace );
        }
        if( ghb_settings_get_bool(settings, "deblock") )
        {
                hb_filter_deblock.settings = NULL;
+               if (tweaks)
+               {
+                       const gchar *str;
+                       str = ghb_settings_get_string(settings, "tweak_deblock");
+                       if (str && str[0])
+                       {
+                               hb_filter_deblock.settings = (gchar*)str;
+                       }
+               }
                hb_list_add( job->filters, &hb_filter_deblock );
        }
        gint denoise = ghb_settings_get_int(settings, "denoise");
        if( denoise != 0 )
        {
                hb_filter_denoise.settings = (gchar*)ghb_settings_get_string(settings, "denoise");
+               if (tweaks)
+               {
+                       const gchar *str;
+                       str = ghb_settings_get_string(settings, "tweak_denoise");
+                       if (str && str[0])
+                       {
+                               hb_filter_denoise.settings = (gchar*)str;
+                       }
+               }
                hb_list_add( job->filters, &hb_filter_denoise );
        }
        job->width = ghb_settings_get_int(settings, "scale_width");
index 1b7e641..eaf4e4c 100644 (file)
@@ -118,6 +118,8 @@ gboolean ghb_validate_container(signal_user_data_t *ud);
 gboolean ghb_validate_vquality(GHashTable *settings);
 gboolean ghb_validate_audio(signal_user_data_t *ud);
 gboolean ghb_validate_video(signal_user_data_t *ud);
+gboolean ghb_validate_filters(signal_user_data_t *ud);
+gboolean ghb_validate_filter_string(const gchar *str, gint max_fields);
 void ghb_hb_cleanup(gboolean partial);
 gint ghb_lookup_acodec(const gchar *acodec);
 gint ghb_lookup_bitrate(const gchar *bitrate);
index 19ac6fe..4fb15f2 100644 (file)
@@ -23,8 +23,13 @@ detelecine=enable
 decomb=enable
 deinterlace=none
 denoise=none
-grayscale=disable
 deblock=disable
+tweak_decomb=
+tweak_detelecine=
+tweak_deblock=
+tweak_deinterlace=
+tweak_denoise=
+grayscale=disable
 video_codec=x264
 two_pass=disable
 turbo=enable
@@ -82,5 +87,5 @@ show_presets=enable
 linear_vquality=disable
 noscale=disable
 nocheckvquality=disable
-
+allow_tweaks=disable
 
index 13ffbe1..fbd2d35 100644 (file)
 "decomb=enable\n"
 "deinterlace=none\n"
 "denoise=none\n"
-"grayscale=disable\n"
 "deblock=disable\n"
+"tweak_decomb=\n"
+"tweak_detelecine=\n"
+"tweak_deblock=\n"
+"tweak_deinterlace=\n"
+"tweak_denoise=\n"
+"grayscale=disable\n"
 "video_codec=x264\n"
 "two_pass=disable\n"
 "turbo=enable\n"
@@ -82,5 +87,5 @@
 "linear_vquality=disable\n"
 "noscale=disable\n"
 "nocheckvquality=disable\n"
-"\n"
+"allow_tweaks=disable\n"
 "\n"
index 53b71d9..18d64da 100644 (file)
@@ -166,8 +166,10 @@ MyConnect(
     g_return_if_fail(handler_name != NULL);
     g_return_if_fail(signal_name != NULL);
 
-       g_debug("handler_name %s\n", handler_name);
-       g_debug("signal_name %s\n", signal_name);
+       //const gchar *name = gtk_widget_get_name((GtkWidget*)object);
+       //g_message("\n\nname %s", name);
+       g_debug("handler_name %s", handler_name);
+       g_debug("signal_name %s", signal_name);
     callback = self_symbol_lookup(handler_name);
     if (!callback) 
        {