]> git.sesse.net Git - x264/blob - gtk/x264_gtk_rc.c
remove the restriction on number of threads as a function of resolution (it was wrong...
[x264] / gtk / x264_gtk_rc.c
1 #include <gtk/gtk.h>
2
3 #include "x264_gtk_i18n.h"
4 #include "x264_gtk_private.h"
5
6
7 /* Callbacks */
8 static void _insert_numeric (GtkEditable *editable,
9                              const gchar *text,
10                              gint         length,
11                              gint        *position,
12                              gpointer     data);
13
14 GtkWidget *
15 _rate_control_page (X264_Gui_Config *config)
16 {
17   GtkWidget   *vbox;
18   GtkWidget   *frame;
19   GtkWidget   *table;
20   GtkWidget   *eb;
21   GtkWidget   *label;
22   GtkTooltips *tooltips;
23
24   tooltips = gtk_tooltips_new ();
25
26   vbox = gtk_vbox_new (FALSE, 0);
27   gtk_container_set_border_width (GTK_CONTAINER (vbox), 6);
28
29   /* bitrate */
30   frame = gtk_frame_new (_("Bitrate"));
31   gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 6);
32   gtk_widget_show (frame);
33
34   table = gtk_table_new (3, 2, TRUE);
35   gtk_table_set_row_spacings (GTK_TABLE (table), 6);
36   gtk_container_set_border_width (GTK_CONTAINER (table), 6);
37   gtk_container_add (GTK_CONTAINER (frame), table);
38   gtk_widget_show (table);
39
40   eb = gtk_event_box_new ();
41   gtk_event_box_set_visible_window (GTK_EVENT_BOX (eb), FALSE);
42   gtk_tooltips_set_tip (tooltips, eb,
43                         _("Keyframe boost - description"),
44                         "");
45   gtk_table_attach_defaults (GTK_TABLE (table), eb,
46                              0, 1, 0, 1);
47   gtk_widget_show (eb);
48
49   label = gtk_label_new (_("Keyframe boost (%)"));
50   gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
51   gtk_container_add (GTK_CONTAINER (eb), label);
52   gtk_widget_show (label);
53
54   config->rate_control.bitrate.keyframe_boost = gtk_entry_new_with_max_length (3);
55   g_signal_connect (G_OBJECT (config->rate_control.bitrate.keyframe_boost),
56                     "insert-text",
57                     G_CALLBACK (_insert_numeric),
58                     NULL);
59   gtk_table_attach_defaults (GTK_TABLE (table),
60                              config->rate_control.bitrate.keyframe_boost,
61                              1, 2, 0, 1);
62   gtk_widget_show (config->rate_control.bitrate.keyframe_boost);
63
64   eb = gtk_event_box_new ();
65   gtk_event_box_set_visible_window (GTK_EVENT_BOX (eb), FALSE);
66   gtk_tooltips_set_tip (tooltips, eb,
67                         _("B-frames reduction - description"),
68                         "");
69   gtk_table_attach_defaults (GTK_TABLE (table), eb,
70                              0, 1, 1, 2);
71   gtk_widget_show (eb);
72
73   label = gtk_label_new (_("B-frames reduction (%)"));
74   gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
75   gtk_container_add (GTK_CONTAINER (eb), label);
76   gtk_widget_show (label);
77
78   config->rate_control.bitrate.bframes_reduction = gtk_entry_new_with_max_length (5);
79   gtk_table_attach_defaults (GTK_TABLE (table),
80                              config->rate_control.bitrate.bframes_reduction,
81                              1, 2, 1, 2);
82   gtk_widget_show (config->rate_control.bitrate.bframes_reduction);
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                         _("Bitrate variability - description"),
88                         "");
89   gtk_table_attach_defaults (GTK_TABLE (table), eb,
90                              0, 1, 2, 3);
91   gtk_widget_show (eb);
92
93   label = gtk_label_new (_("Bitrate variability (%)"));
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.bitrate_variability = gtk_entry_new_with_max_length (3);
99   gtk_table_attach_defaults (GTK_TABLE (table),
100                              config->rate_control.bitrate.bitrate_variability,
101                              1, 2, 2, 3);
102   gtk_widget_show (config->rate_control.bitrate.bitrate_variability);
103
104   /* Quantization limits */
105   frame = gtk_frame_new (_("Quantization limits"));
106   gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 6);
107   gtk_widget_show (frame);
108
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
115   eb = gtk_event_box_new ();
116   gtk_event_box_set_visible_window (GTK_EVENT_BOX (eb), FALSE);
117   gtk_tooltips_set_tip (tooltips, eb,
118                         _("Min QP - description"),
119                         "");
120   gtk_table_attach_defaults (GTK_TABLE (table), eb,
121                              0, 1, 0, 1);
122   gtk_widget_show (eb);
123
124   label = gtk_label_new (_("Min QP"));
125   gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
126   gtk_container_add (GTK_CONTAINER (eb), label);
127   gtk_widget_show (label);
128
129   config->rate_control.quantization_limits.min_qp = gtk_entry_new_with_max_length (3);
130   gtk_table_attach_defaults (GTK_TABLE (table),
131                              config->rate_control.quantization_limits.min_qp,
132                              1, 2, 0, 1);
133   gtk_widget_show (config->rate_control.quantization_limits.min_qp);
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                         _("Max QP - description"),
139                         "");
140   gtk_table_attach_defaults (GTK_TABLE (table), eb,
141                              0, 1, 1, 2);
142   gtk_widget_show (eb);
143
144   label = gtk_label_new (_("Max 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.max_qp = gtk_entry_new_with_max_length (3);
150   gtk_table_attach_defaults (GTK_TABLE (table),
151                              config->rate_control.quantization_limits.max_qp,
152                              1, 2, 1, 2);
153   gtk_widget_show (config->rate_control.quantization_limits.max_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 Step - description"),
159                         "");
160   gtk_table_attach_defaults (GTK_TABLE (table), eb,
161                              0, 1, 2, 3);
162   gtk_widget_show (eb);
163
164   label = gtk_label_new (_("Max QP Step"));
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_step = gtk_entry_new_with_max_length (3);
170   gtk_table_attach_defaults (GTK_TABLE (table),
171                              config->rate_control.quantization_limits.max_qp_step,
172                              1, 2, 2, 3);
173   gtk_widget_show (config->rate_control.quantization_limits.max_qp_step);
174
175   /* Scene Cuts */
176   frame = gtk_frame_new (_("Scene Cuts"));
177   gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 6);
178   gtk_widget_show (frame);
179
180   table = gtk_table_new (3, 2, TRUE);
181   gtk_table_set_row_spacings (GTK_TABLE (table), 6);
182   gtk_container_set_border_width (GTK_CONTAINER (table), 6);
183   gtk_container_add (GTK_CONTAINER (frame), table);
184   gtk_widget_show (table);
185
186   eb = gtk_event_box_new ();
187   gtk_event_box_set_visible_window (GTK_EVENT_BOX (eb), FALSE);
188   gtk_tooltips_set_tip (tooltips, eb,
189                         _("Scene Cut Threshold - description"),
190                         "");
191   gtk_table_attach_defaults (GTK_TABLE (table), eb,
192                              0, 1, 0, 1);
193   gtk_widget_show (eb);
194
195   label = gtk_label_new (_("Scene Cut Threshold"));
196   gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
197   gtk_container_add (GTK_CONTAINER (eb), label);
198   gtk_widget_show (label);
199
200   config->rate_control.scene_cuts.scene_cut_threshold = gtk_entry_new_with_max_length (3);
201   gtk_table_attach_defaults (GTK_TABLE (table),
202                              config->rate_control.scene_cuts.scene_cut_threshold,
203                              1, 2, 0, 1);
204   gtk_widget_show (config->rate_control.scene_cuts.scene_cut_threshold);
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                         _("Min IDR-frame interval - description"),
210                         "");
211   gtk_table_attach_defaults (GTK_TABLE (table), eb,
212                              0, 1, 1, 2);
213   gtk_widget_show (eb);
214
215   label = gtk_label_new (_("Min IDR-frame interval"));
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.min_idr_frame_interval = gtk_entry_new_with_max_length (3);
221   gtk_table_attach_defaults (GTK_TABLE (table),
222                              config->rate_control.scene_cuts.min_idr_frame_interval,
223                              1, 2, 1, 2);
224   gtk_widget_show (config->rate_control.scene_cuts.min_idr_frame_interval);
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                         _("Max IDR-frame interval - description"),
230                         "");
231   gtk_table_attach_defaults (GTK_TABLE (table), eb,
232                              0, 1, 2, 3);
233   gtk_widget_show (eb);
234
235   label = gtk_label_new (_("Max 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.max_idr_frame_interval = gtk_entry_new_with_max_length (3);
241   gtk_table_attach_defaults (GTK_TABLE (table),
242                              config->rate_control.scene_cuts.max_idr_frame_interval,
243                              1, 2, 2, 3);
244   gtk_widget_show (config->rate_control.scene_cuts.max_idr_frame_interval);
245
246   /* vbv */
247   frame = gtk_frame_new (_("Video buffer verifier"));
248   gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 6);
249   gtk_widget_show (frame);
250
251   table = gtk_table_new (3, 2, TRUE);
252   gtk_table_set_row_spacings (GTK_TABLE (table), 6);
253   gtk_container_set_border_width (GTK_CONTAINER (table), 6);
254   gtk_container_add (GTK_CONTAINER (frame), table);
255   gtk_widget_show (table);
256
257   eb = gtk_event_box_new ();
258   gtk_event_box_set_visible_window (GTK_EVENT_BOX (eb), FALSE);
259   gtk_tooltips_set_tip (tooltips, eb,
260                         _("Max local bitrate - description"),
261                         "");
262   gtk_table_attach_defaults (GTK_TABLE (table), eb,
263                              0, 1, 0, 1);
264   gtk_widget_show (eb);
265
266   label = gtk_label_new (_("Max local bitrate"));
267   gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
268   gtk_container_add (GTK_CONTAINER (eb), label);
269   gtk_widget_show (label);
270
271   config->rate_control.vbv.vbv_max_bitrate = gtk_entry_new_with_max_length (3);
272   gtk_table_attach_defaults (GTK_TABLE (table),
273                              config->rate_control.vbv.vbv_max_bitrate,
274                              1, 2, 0, 1);
275   gtk_widget_show (config->rate_control.vbv.vbv_max_bitrate);
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                         _("VBV buffer size - description"),
281                         "");
282   gtk_table_attach_defaults (GTK_TABLE (table), eb,
283                              0, 1, 1, 2);
284   gtk_widget_show (eb);
285
286   label = gtk_label_new (_("VBV buffer size"));
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_buffer_size = gtk_entry_new_with_max_length (3);
292   gtk_table_attach_defaults (GTK_TABLE (table),
293                              config->rate_control.vbv.vbv_buffer_size,
294                              1, 2, 1, 2);
295   gtk_widget_show (config->rate_control.vbv.vbv_buffer_size);
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                         _("Initial VBV buffer occupancy - description"),
301                         "");
302   gtk_table_attach_defaults (GTK_TABLE (table), eb,
303                              0, 1, 2, 3);
304   gtk_widget_show (eb);
305
306   label = gtk_label_new (_("Initial VBV buffer occupancy"));
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_init = gtk_entry_new_with_max_length (3);
312   gtk_table_attach_defaults (GTK_TABLE (table),
313                              config->rate_control.vbv.vbv_buffer_init,
314                              1, 2, 2, 3);
315   gtk_widget_show (config->rate_control.vbv.vbv_buffer_init);
316
317   return vbox;
318 }
319
320 static void
321 _insert_numeric (GtkEditable *editable,
322                  const gchar *text,
323                  gint         length,
324                  gint        *position,
325                  gpointer     data)
326 {
327   gint i;
328   gint j;
329   gchar *result;
330
331   result = (gchar *)g_malloc (sizeof (gchar) * (length + 1));
332   if (!result)
333     return;
334
335   for (i = 0, j = 0; i < length; i++)
336     {
337       if (g_ascii_isdigit (text[i]))
338         {
339           result[j] = text[i];
340           j++;
341         }
342     }
343   result[j] = '\0';
344
345   g_signal_handlers_block_by_func (editable,
346                                    (gpointer) _insert_numeric, data);
347   gtk_editable_insert_text (editable, result, j, position);
348   g_signal_handlers_unblock_by_func (editable,
349                                      (gpointer) _insert_numeric, data);
350
351   g_signal_stop_emission_by_name (editable, "insert-text");
352
353   g_free (result);
354 }
355