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

Audio

开发平台:

Visual C++

  1. /*****************************************************************************
  2.  * x264_gtk_rc.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_insert_numeric (GtkEditable *editable,
  25.                              const gchar *text,
  26.                              gint         length,
  27.                              gint        *position,
  28.                              gpointer     data);
  29. GtkWidget *
  30. x264_rate_control_page (X264_Gui_Config *config)
  31. {
  32.   GtkWidget   *vbox;
  33.   GtkWidget   *frame;
  34.   GtkWidget   *table;
  35.   GtkWidget   *eb;
  36.   GtkWidget   *label;
  37.   GtkTooltips *tooltips;
  38.   tooltips = gtk_tooltips_new ();
  39.   vbox = gtk_vbox_new (FALSE, 0);
  40.   gtk_container_set_border_width (GTK_CONTAINER (vbox), 6);
  41.   /* bitrate */
  42.   frame = gtk_frame_new (_("Bitrate"));
  43.   gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 6);
  44.   gtk_widget_show (frame);
  45.   table = gtk_table_new (3, 2, TRUE);
  46.   gtk_table_set_row_spacings (GTK_TABLE (table), 6);
  47.   gtk_container_set_border_width (GTK_CONTAINER (table), 6);
  48.   gtk_container_add (GTK_CONTAINER (frame), table);
  49.   gtk_widget_show (table);
  50.   eb = gtk_event_box_new ();
  51.   gtk_event_box_set_visible_window (GTK_EVENT_BOX (eb), FALSE);
  52.   gtk_tooltips_set_tip (tooltips, eb,
  53.                         _("Keyframe boost - description"),
  54.                         "");
  55.   gtk_table_attach_defaults (GTK_TABLE (table), eb,
  56.                              0, 1, 0, 1);
  57.   gtk_widget_show (eb);
  58.   label = gtk_label_new (_("Keyframe boost (%)"));
  59.   gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
  60.   gtk_container_add (GTK_CONTAINER (eb), label);
  61.   gtk_widget_show (label);
  62.   config->rate_control.bitrate.keyframe_boost = gtk_entry_new_with_max_length (3);
  63.   g_signal_connect (G_OBJECT (config->rate_control.bitrate.keyframe_boost),
  64.                     "insert-text",
  65.                     G_CALLBACK (x264_insert_numeric),
  66.                     NULL);
  67.   gtk_table_attach_defaults (GTK_TABLE (table),
  68.                              config->rate_control.bitrate.keyframe_boost,
  69.                              1, 2, 0, 1);
  70.   gtk_widget_show (config->rate_control.bitrate.keyframe_boost);
  71.   eb = gtk_event_box_new ();
  72.   gtk_event_box_set_visible_window (GTK_EVENT_BOX (eb), FALSE);
  73.   gtk_tooltips_set_tip (tooltips, eb,
  74.                         _("B-frames reduction - description"),
  75.                         "");
  76.   gtk_table_attach_defaults (GTK_TABLE (table), eb,
  77.                              0, 1, 1, 2);
  78.   gtk_widget_show (eb);
  79.   label = gtk_label_new (_("B-frames reduction (%)"));
  80.   gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
  81.   gtk_container_add (GTK_CONTAINER (eb), label);
  82.   gtk_widget_show (label);
  83.   config->rate_control.bitrate.bframes_reduction = gtk_entry_new_with_max_length (5);
  84.   gtk_table_attach_defaults (GTK_TABLE (table),
  85.                              config->rate_control.bitrate.bframes_reduction,
  86.                              1, 2, 1, 2);
  87.   gtk_widget_show (config->rate_control.bitrate.bframes_reduction);
  88.   eb = gtk_event_box_new ();
  89.   gtk_event_box_set_visible_window (GTK_EVENT_BOX (eb), FALSE);
  90.   gtk_tooltips_set_tip (tooltips, eb,
  91.                         _("Bitrate variability - description"),
  92.                         "");
  93.   gtk_table_attach_defaults (GTK_TABLE (table), eb,
  94.                              0, 1, 2, 3);
  95.   gtk_widget_show (eb);
  96.   label = gtk_label_new (_("Bitrate variability (%)"));
  97.   gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
  98.   gtk_container_add (GTK_CONTAINER (eb), label);
  99.   gtk_widget_show (label);
  100.   config->rate_control.bitrate.bitrate_variability = gtk_entry_new_with_max_length (3);
  101.   gtk_table_attach_defaults (GTK_TABLE (table),
  102.                              config->rate_control.bitrate.bitrate_variability,
  103.                              1, 2, 2, 3);
  104.   gtk_widget_show (config->rate_control.bitrate.bitrate_variability);
  105.   /* Quantization limits */
  106.   frame = gtk_frame_new (_("Quantization limits"));
  107.   gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 6);
  108.   gtk_widget_show (frame);
  109.   table = gtk_table_new (3, 2, TRUE);
  110.   gtk_table_set_row_spacings (GTK_TABLE (table), 6);
  111.   gtk_container_set_border_width (GTK_CONTAINER (table), 6);
  112.   gtk_container_add (GTK_CONTAINER (frame), table);
  113.   gtk_widget_show (table);
  114.   eb = gtk_event_box_new ();
  115.   gtk_event_box_set_visible_window (GTK_EVENT_BOX (eb), FALSE);
  116.   gtk_tooltips_set_tip (tooltips, eb,
  117.                         _("Min QP - description"),
  118.                         "");
  119.   gtk_table_attach_defaults (GTK_TABLE (table), eb,
  120.                              0, 1, 0, 1);
  121.   gtk_widget_show (eb);
  122.   label = gtk_label_new (_("Min QP"));
  123.   gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
  124.   gtk_container_add (GTK_CONTAINER (eb), label);
  125.   gtk_widget_show (label);
  126.   config->rate_control.quantization_limits.min_qp = gtk_entry_new_with_max_length (3);
  127.   gtk_table_attach_defaults (GTK_TABLE (table),
  128.                              config->rate_control.quantization_limits.min_qp,
  129.                              1, 2, 0, 1);
  130.   gtk_widget_show (config->rate_control.quantization_limits.min_qp);
  131.   eb = gtk_event_box_new ();
  132.   gtk_event_box_set_visible_window (GTK_EVENT_BOX (eb), FALSE);
  133.   gtk_tooltips_set_tip (tooltips, eb,
  134.                         _("Max QP - description"),
  135.                         "");
  136.   gtk_table_attach_defaults (GTK_TABLE (table), eb,
  137.                              0, 1, 1, 2);
  138.   gtk_widget_show (eb);
  139.   label = gtk_label_new (_("Max QP"));
  140.   gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
  141.   gtk_container_add (GTK_CONTAINER (eb), label);
  142.   gtk_widget_show (label);
  143.   config->rate_control.quantization_limits.max_qp = gtk_entry_new_with_max_length (3);
  144.   gtk_table_attach_defaults (GTK_TABLE (table),
  145.                              config->rate_control.quantization_limits.max_qp,
  146.                              1, 2, 1, 2);
  147.   gtk_widget_show (config->rate_control.quantization_limits.max_qp);
  148.   eb = gtk_event_box_new ();
  149.   gtk_event_box_set_visible_window (GTK_EVENT_BOX (eb), FALSE);
  150.   gtk_tooltips_set_tip (tooltips, eb,
  151.                         _("Max QP Step - description"),
  152.                         "");
  153.   gtk_table_attach_defaults (GTK_TABLE (table), eb,
  154.                              0, 1, 2, 3);
  155.   gtk_widget_show (eb);
  156.   label = gtk_label_new (_("Max QP Step"));
  157.   gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
  158.   gtk_container_add (GTK_CONTAINER (eb), label);
  159.   gtk_widget_show (label);
  160.   config->rate_control.quantization_limits.max_qp_step = gtk_entry_new_with_max_length (3);
  161.   gtk_table_attach_defaults (GTK_TABLE (table),
  162.                              config->rate_control.quantization_limits.max_qp_step,
  163.                              1, 2, 2, 3);
  164.   gtk_widget_show (config->rate_control.quantization_limits.max_qp_step);
  165.   /* Scene Cuts */
  166.   frame = gtk_frame_new (_("Scene Cuts"));
  167.   gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 6);
  168.   gtk_widget_show (frame);
  169.   table = gtk_table_new (3, 2, TRUE);
  170.   gtk_table_set_row_spacings (GTK_TABLE (table), 6);
  171.   gtk_container_set_border_width (GTK_CONTAINER (table), 6);
  172.   gtk_container_add (GTK_CONTAINER (frame), table);
  173.   gtk_widget_show (table);
  174.   eb = gtk_event_box_new ();
  175.   gtk_event_box_set_visible_window (GTK_EVENT_BOX (eb), FALSE);
  176.   gtk_tooltips_set_tip (tooltips, eb,
  177.                         _("Scene Cut Threshold - description"),
  178.                         "");
  179.   gtk_table_attach_defaults (GTK_TABLE (table), eb,
  180.                              0, 1, 0, 1);
  181.   gtk_widget_show (eb);
  182.   label = gtk_label_new (_("Scene Cut Threshold"));
  183.   gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
  184.   gtk_container_add (GTK_CONTAINER (eb), label);
  185.   gtk_widget_show (label);
  186.   config->rate_control.scene_cuts.scene_cut_threshold = gtk_entry_new_with_max_length (3);
  187.   gtk_table_attach_defaults (GTK_TABLE (table),
  188.                              config->rate_control.scene_cuts.scene_cut_threshold,
  189.                              1, 2, 0, 1);
  190.   gtk_widget_show (config->rate_control.scene_cuts.scene_cut_threshold);
  191.   eb = gtk_event_box_new ();
  192.   gtk_event_box_set_visible_window (GTK_EVENT_BOX (eb), FALSE);
  193.   gtk_tooltips_set_tip (tooltips, eb,
  194.                         _("Min IDR-frame interval - description"),
  195.                         "");
  196.   gtk_table_attach_defaults (GTK_TABLE (table), eb,
  197.                              0, 1, 1, 2);
  198.   gtk_widget_show (eb);
  199.   label = gtk_label_new (_("Min IDR-frame interval"));
  200.   gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
  201.   gtk_container_add (GTK_CONTAINER (eb), label);
  202.   gtk_widget_show (label);
  203.   config->rate_control.scene_cuts.min_idr_frame_interval = gtk_entry_new_with_max_length (3);
  204.   gtk_table_attach_defaults (GTK_TABLE (table),
  205.                              config->rate_control.scene_cuts.min_idr_frame_interval,
  206.                              1, 2, 1, 2);
  207.   gtk_widget_show (config->rate_control.scene_cuts.min_idr_frame_interval);
  208.   eb = gtk_event_box_new ();
  209.   gtk_event_box_set_visible_window (GTK_EVENT_BOX (eb), FALSE);
  210.   gtk_tooltips_set_tip (tooltips, eb,
  211.                         _("Max IDR-frame interval - description"),
  212.                         "");
  213.   gtk_table_attach_defaults (GTK_TABLE (table), eb,
  214.                              0, 1, 2, 3);
  215.   gtk_widget_show (eb);
  216.   label = gtk_label_new (_("Max IDR-frame interval"));
  217.   gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
  218.   gtk_container_add (GTK_CONTAINER (eb), label);
  219.   gtk_widget_show (label);
  220.   config->rate_control.scene_cuts.max_idr_frame_interval = gtk_entry_new_with_max_length (3);
  221.   gtk_table_attach_defaults (GTK_TABLE (table),
  222.                              config->rate_control.scene_cuts.max_idr_frame_interval,
  223.                              1, 2, 2, 3);
  224.   gtk_widget_show (config->rate_control.scene_cuts.max_idr_frame_interval);
  225.   /* vbv */
  226.   frame = gtk_frame_new (_("Video buffer verifier"));
  227.   gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 6);
  228.   gtk_widget_show (frame);
  229.   table = gtk_table_new (3, 2, TRUE);
  230.   gtk_table_set_row_spacings (GTK_TABLE (table), 6);
  231.   gtk_container_set_border_width (GTK_CONTAINER (table), 6);
  232.   gtk_container_add (GTK_CONTAINER (frame), table);
  233.   gtk_widget_show (table);
  234.   eb = gtk_event_box_new ();
  235.   gtk_event_box_set_visible_window (GTK_EVENT_BOX (eb), FALSE);
  236.   gtk_tooltips_set_tip (tooltips, eb,
  237.                         _("Max local bitrate - description"),
  238.                         "");
  239.   gtk_table_attach_defaults (GTK_TABLE (table), eb,
  240.                              0, 1, 0, 1);
  241.   gtk_widget_show (eb);
  242.   label = gtk_label_new (_("Max local bitrate"));
  243.   gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
  244.   gtk_container_add (GTK_CONTAINER (eb), label);
  245.   gtk_widget_show (label);
  246.   config->rate_control.vbv.vbv_max_bitrate = gtk_entry_new_with_max_length (3);
  247.   gtk_table_attach_defaults (GTK_TABLE (table),
  248.                              config->rate_control.vbv.vbv_max_bitrate,
  249.                              1, 2, 0, 1);
  250.   gtk_widget_show (config->rate_control.vbv.vbv_max_bitrate);
  251.   eb = gtk_event_box_new ();
  252.   gtk_event_box_set_visible_window (GTK_EVENT_BOX (eb), FALSE);
  253.   gtk_tooltips_set_tip (tooltips, eb,
  254.                         _("VBV buffer size - description"),
  255.                         "");
  256.   gtk_table_attach_defaults (GTK_TABLE (table), eb,
  257.                              0, 1, 1, 2);
  258.   gtk_widget_show (eb);
  259.   label = gtk_label_new (_("VBV buffer size"));
  260.   gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
  261.   gtk_container_add (GTK_CONTAINER (eb), label);
  262.   gtk_widget_show (label);
  263.   config->rate_control.vbv.vbv_buffer_size = gtk_entry_new_with_max_length (3);
  264.   gtk_table_attach_defaults (GTK_TABLE (table),
  265.                              config->rate_control.vbv.vbv_buffer_size,
  266.                              1, 2, 1, 2);
  267.   gtk_widget_show (config->rate_control.vbv.vbv_buffer_size);
  268.   eb = gtk_event_box_new ();
  269.   gtk_event_box_set_visible_window (GTK_EVENT_BOX (eb), FALSE);
  270.   gtk_tooltips_set_tip (tooltips, eb,
  271.                         _("Initial VBV buffer occupancy - description"),
  272.                         "");
  273.   gtk_table_attach_defaults (GTK_TABLE (table), eb,
  274.                              0, 1, 2, 3);
  275.   gtk_widget_show (eb);
  276.   label = gtk_label_new (_("Initial VBV buffer occupancy"));
  277.   gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
  278.   gtk_container_add (GTK_CONTAINER (eb), label);
  279.   gtk_widget_show (label);
  280.   config->rate_control.vbv.vbv_buffer_init = gtk_entry_new_with_max_length (3);
  281.   gtk_table_attach_defaults (GTK_TABLE (table),
  282.                              config->rate_control.vbv.vbv_buffer_init,
  283.                              1, 2, 2, 3);
  284.   gtk_widget_show (config->rate_control.vbv.vbv_buffer_init);
  285.   return vbox;
  286. }
  287. static void
  288. x264_insert_numeric (GtkEditable *editable,
  289.                  const gchar *text,
  290.                  gint         length,
  291.                  gint        *position,
  292.                  gpointer     data)
  293. {
  294.   gint i;
  295.   gint j;
  296.   gchar *result;
  297.   result = (gchar *)g_malloc (sizeof (gchar) * (length + 1));
  298.   if (!result)
  299.     return;
  300.   for (i = 0, j = 0; i < length; i++)
  301.     {
  302.       if (g_ascii_isdigit (text[i]))
  303.         {
  304.           result[j] = text[i];
  305.           j++;
  306.         }
  307.     }
  308.   result[j] = '';
  309.   g_signal_handlers_block_by_func (editable,
  310.    (gpointer) x264_insert_numeric, data);
  311.   gtk_editable_insert_text (editable, result, j, position);
  312.   g_signal_handlers_unblock_by_func (editable,
  313.                                      (gpointer) x264_insert_numeric, data);
  314.   g_signal_stop_emission_by_name (editable, "insert-text");
  315.   g_free (result);
  316. }