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