x264_gtk_mb.c
上传用户:hjq518
上传日期:2021-12-09
资源大小:5084k
文件大小:11k
源码类别:

Audio

开发平台:

Visual C++

  1. /*****************************************************************************
  2.  * x264_gtk_mb.c: h264 gtk encoder frontend
  3.  *****************************************************************************
  4.  * Copyright (C) 2006 Vincent Torri
  5.  *
  6.  * This program is free software; you can redistribute it and/or modify
  7.  * it under the terms of the GNU General Public License as published by
  8.  * the Free Software Foundation; either version 2 of the License, or
  9.  * (at your option) any later version.
  10.  *
  11.  * This program is distributed in the hope that it will be useful,
  12.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.  * GNU General Public License for more details.
  15.  *
  16.  * You should have received a copy of the GNU General Public License
  17.  * along with this program; if not, write to the Free Software
  18.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111, USA.
  19.  *****************************************************************************/
  20. #include <gtk/gtk.h>
  21. #include "x264_gtk_i18n.h"
  22. #include "x264_gtk_private.h"
  23. /* Callbacks */
  24. static void x264_mb_bframe_pyramid (GtkToggleButton *button,
  25.                                 gpointer         user_data);
  26. static void x264_mb_inter_search_8 (GtkToggleButton *button,
  27.                                 gpointer         user_data);
  28. static void x264_mb_transform_8x8  (GtkToggleButton *button,
  29.                                 gpointer         user_data);
  30. GtkWidget *
  31. x264_mb_page (X264_Gui_Config *config)
  32. {
  33.   GtkWidget   *vbox;
  34.   GtkWidget   *frame;
  35.   GtkWidget   *vbox2;
  36.   GtkWidget   *table;
  37.   GtkWidget   *eb;
  38.   GtkWidget   *label;
  39.   GtkTooltips *tooltips;
  40.   tooltips = gtk_tooltips_new ();
  41.   vbox = gtk_vbox_new (FALSE, 0);
  42.   gtk_container_set_border_width (GTK_CONTAINER (vbox), 6);
  43.   /* Partitions */
  44.   frame = gtk_frame_new (_("Partitions"));
  45.   gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 6);
  46.   gtk_widget_show (frame);
  47.   vbox2 = gtk_vbox_new (FALSE, 6);
  48.   gtk_container_set_border_width (GTK_CONTAINER (vbox2), 6);
  49.   gtk_container_add (GTK_CONTAINER (frame), vbox2);
  50.   gtk_widget_show (vbox2);
  51.   config->mb.partitions.transform_8x8 = gtk_check_button_new_with_label (_("8x8 Transform"));
  52.   gtk_tooltips_set_tip (tooltips, config->mb.partitions.transform_8x8,
  53.                         _("8x8 Transform - description"),
  54.                         "");
  55.   g_signal_connect (G_OBJECT (config->mb.partitions.transform_8x8),
  56.                     "toggled",
  57.                     G_CALLBACK (x264_mb_transform_8x8), config);
  58.   gtk_box_pack_start (GTK_BOX (vbox2), config->mb.partitions.transform_8x8, FALSE, TRUE, 0);
  59.   gtk_widget_show (config->mb.partitions.transform_8x8);
  60.   config->mb.partitions.pframe_search_8 = gtk_check_button_new_with_label (_("8x16, 16x8 and 8x8 P-frame search"));
  61.   gtk_tooltips_set_tip (tooltips, config->mb.partitions.pframe_search_8,
  62.                         _("8x16, 16x8 and 8x8 P-frame search - description"),
  63.                         "");
  64.   gtk_box_pack_start (GTK_BOX (vbox2), config->mb.partitions.pframe_search_8, FALSE, TRUE, 0);
  65.   gtk_widget_show (config->mb.partitions.pframe_search_8);
  66.   config->mb.partitions.bframe_search_8 = gtk_check_button_new_with_label (_("8x16, 16x8 and 8x8 B-frame search"));
  67.   gtk_tooltips_set_tip (tooltips, config->mb.partitions.bframe_search_8,
  68.                         _("8x16, 16x8 and 8x8 B-frame search - description"),
  69.                         "");
  70.   gtk_box_pack_start (GTK_BOX (vbox2), config->mb.partitions.bframe_search_8, FALSE, TRUE, 0);
  71.   gtk_widget_show (config->mb.partitions.bframe_search_8);
  72.   config->mb.partitions.pframe_search_4 = gtk_check_button_new_with_label (_("4x8, 8x4 and 4x4 P-frame search"));
  73.   gtk_tooltips_set_tip (tooltips, config->mb.partitions.pframe_search_4,
  74.                         _("4x8, 8x4 and 4x4 P-frame search - description"),
  75.                         "");
  76.   gtk_box_pack_start (GTK_BOX (vbox2), config->mb.partitions.pframe_search_4, FALSE, TRUE, 0);
  77.   gtk_widget_show (config->mb.partitions.pframe_search_4);
  78.   config->mb.partitions.inter_search_8 = gtk_check_button_new_with_label (_("8x8 Intra search"));
  79.   gtk_tooltips_set_tip (tooltips, config->mb.partitions.inter_search_8,
  80.                         _("8x8 Intra search - description"),
  81.                         "");
  82.   g_signal_connect (G_OBJECT (config->mb.partitions.inter_search_8),
  83.                     "toggled",
  84.                     G_CALLBACK (x264_mb_inter_search_8), config);
  85.   gtk_box_pack_start (GTK_BOX (vbox2), config->mb.partitions.inter_search_8, FALSE, TRUE, 0);
  86.   gtk_widget_show (config->mb.partitions.inter_search_8);
  87.   config->mb.partitions.inter_search_4 = gtk_check_button_new_with_label (_("4x4 Intra search"));
  88.   gtk_tooltips_set_tip (tooltips, config->mb.partitions.inter_search_4,
  89.                         _("4x4 Intra search - description"),
  90.                         "");
  91.   gtk_box_pack_start (GTK_BOX (vbox2), config->mb.partitions.inter_search_4, FALSE, TRUE, 0);
  92.   gtk_widget_show (config->mb.partitions.inter_search_4);
  93.   /* B-Frames */
  94.   frame = gtk_frame_new (_("B-Frames"));
  95.   gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 6);
  96.   gtk_widget_show (frame);
  97.   table = gtk_table_new (5, 2, TRUE);
  98.   gtk_table_set_row_spacings (GTK_TABLE (table), 6);
  99.   gtk_container_set_border_width (GTK_CONTAINER (table), 6);
  100.   gtk_container_add (GTK_CONTAINER (frame), table);
  101.   gtk_widget_show (table);
  102.   eb = gtk_event_box_new ();
  103.   gtk_event_box_set_visible_window (GTK_EVENT_BOX (eb), FALSE);
  104.   gtk_tooltips_set_tip (tooltips, eb,
  105.                         _("Max consecutive - description"),
  106.                         "");
  107.   gtk_table_attach_defaults (GTK_TABLE (table), eb,
  108.                              0, 1, 0, 1);
  109.   gtk_widget_show (eb);
  110.   label = gtk_label_new (_("Max consecutive"));
  111.   gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
  112.   gtk_container_add (GTK_CONTAINER (eb), label);
  113.   gtk_widget_show (label);
  114.   config->mb.bframes.bframe = gtk_entry_new_with_max_length (3);
  115.   gtk_table_attach_defaults (GTK_TABLE (table), config->mb.bframes.bframe,
  116.                              1, 2, 0, 1);
  117.   gtk_widget_show (config->mb.bframes.bframe);
  118.   eb = gtk_event_box_new ();
  119.   gtk_event_box_set_visible_window (GTK_EVENT_BOX (eb), FALSE);
  120.   gtk_tooltips_set_tip (tooltips, eb,
  121.                         _("Bias - description"),
  122.                         "");
  123.   gtk_table_attach_defaults (GTK_TABLE (table), eb,
  124.                              0, 1, 1, 2);
  125.   gtk_widget_show (eb);
  126.   label = gtk_label_new (_("Bias"));
  127.   gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
  128.   gtk_container_add (GTK_CONTAINER (eb), label);
  129.   gtk_widget_show (label);
  130.   config->mb.bframes.bframe_bias = gtk_hscale_new_with_range (-100.0, 100.0, 1.0);
  131.   gtk_scale_set_digits (GTK_SCALE (config->mb.bframes.bframe_bias), 0);
  132.   gtk_scale_set_value_pos (GTK_SCALE (config->mb.bframes.bframe_bias), GTK_POS_RIGHT);
  133.   gtk_table_attach_defaults (GTK_TABLE (table), config->mb.bframes.bframe_bias,
  134.                              1, 2, 1, 2);
  135.   gtk_widget_show (config->mb.bframes.bframe_bias);
  136.   config->mb.bframes.bframe_pyramid = gtk_check_button_new_with_label (_("Use as references"));
  137.   gtk_tooltips_set_tip (tooltips, config->mb.bframes.bframe_pyramid,
  138.                         _("Use as references - description"),
  139.                         "");
  140.   g_signal_connect (G_OBJECT (config->mb.bframes.bframe_pyramid),
  141.                     "toggled",
  142.                     G_CALLBACK (x264_mb_bframe_pyramid), config);
  143.   gtk_table_attach_defaults (GTK_TABLE (table), config->mb.bframes.bframe_pyramid,
  144.                              0, 1, 2, 3);
  145.   gtk_widget_show (config->mb.bframes.bframe_pyramid);
  146.   config->mb.bframes.bidir_me = gtk_check_button_new_with_label (_("Bidirectional ME"));
  147.   gtk_tooltips_set_tip (tooltips, config->mb.bframes.bidir_me,
  148.                         _("Bidirectional ME - description"),
  149.                         "");
  150.   gtk_table_attach_defaults (GTK_TABLE (table), config->mb.bframes.bidir_me,
  151.                              1, 2, 2, 3);
  152.   gtk_widget_show (config->mb.bframes.bidir_me);
  153.   config->mb.bframes.bframe_adaptive = gtk_check_button_new_with_label (_("Adaptive"));
  154.   gtk_tooltips_set_tip (tooltips, config->mb.bframes.bframe_adaptive,
  155.                         _("Adaptive - description"),
  156.                         "");
  157.   gtk_table_attach_defaults (GTK_TABLE (table), config->mb.bframes.bframe_adaptive,
  158.                              0, 1, 3, 4);
  159.   gtk_widget_show (config->mb.bframes.bframe_adaptive);
  160.   config->mb.bframes.weighted_bipred = gtk_check_button_new_with_label (_("Weighted biprediction"));
  161.   gtk_tooltips_set_tip (tooltips, config->mb.bframes.weighted_bipred,
  162.                         _("Weighted biprediction - description"),
  163.                         "");
  164.   gtk_table_attach_defaults (GTK_TABLE (table), config->mb.bframes.weighted_bipred,
  165.                              1, 2, 3, 4);
  166.   gtk_widget_show (config->mb.bframes.weighted_bipred);
  167.   eb = gtk_event_box_new ();
  168.   gtk_event_box_set_visible_window (GTK_EVENT_BOX (eb), FALSE);
  169.   gtk_tooltips_set_tip (tooltips, eb,
  170.                         _("Direct mode - description"),
  171.                         "");
  172.   gtk_table_attach_defaults (GTK_TABLE (table), eb,
  173.                              0, 1, 4, 5);
  174.   gtk_widget_show (eb);
  175.   label = gtk_label_new (_("Direct mode"));
  176.   gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
  177.   gtk_container_add (GTK_CONTAINER (eb), label);
  178.   gtk_widget_show (label);
  179.   config->mb.bframes.direct_mode = gtk_combo_box_new_text ();
  180.   gtk_combo_box_append_text (GTK_COMBO_BOX (config->mb.bframes.direct_mode),
  181.                              _("None"));
  182.   gtk_combo_box_append_text (GTK_COMBO_BOX (config->mb.bframes.direct_mode),
  183.                              _("Spatial"));
  184.   gtk_combo_box_append_text (GTK_COMBO_BOX (config->mb.bframes.direct_mode),
  185.                              _("Temporal"));
  186.   gtk_combo_box_append_text (GTK_COMBO_BOX (config->mb.bframes.direct_mode),
  187.                              _("Auto"));
  188.   gtk_table_attach_defaults (GTK_TABLE (table),
  189.                              config->mb.bframes.direct_mode,
  190.                              1, 2, 4, 5);
  191.   gtk_widget_show (config->mb.bframes.direct_mode);
  192.   return vbox;
  193. }
  194. static void
  195. x264_mb_bframe_pyramid (GtkToggleButton *button,
  196.                     gpointer         user_data)
  197. {
  198.   X264_Gui_Config *config;
  199.   config = (X264_Gui_Config *)user_data;
  200.   if (gtk_toggle_button_get_active (button)) {
  201.     const gchar *text;
  202.     gint         val;
  203.     text = gtk_entry_get_text (GTK_ENTRY (config->mb.bframes.bframe));
  204.     val = (gint)g_ascii_strtoull (text, NULL, 10);
  205.     if (val < 2)
  206.       gtk_entry_set_text (GTK_ENTRY (config->mb.bframes.bframe), "2");
  207.   }
  208. }
  209. static void
  210. x264_mb_inter_search_8 (GtkToggleButton *button,
  211.                     gpointer         user_data)
  212. {
  213.   X264_Gui_Config *config;
  214.   config = (X264_Gui_Config *)user_data;
  215.   if (gtk_toggle_button_get_active (button)) {
  216.     gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (config->mb.partitions.transform_8x8), TRUE);
  217.   }
  218. }
  219. static void
  220. x264_mb_transform_8x8 (GtkToggleButton *button,
  221.                    gpointer         user_data)
  222. {
  223.   X264_Gui_Config *config;
  224.   config = (X264_Gui_Config *)user_data;
  225.   if (!gtk_toggle_button_get_active (button)) {
  226.     gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (config->mb.partitions.inter_search_8), FALSE);
  227.   }
  228. }