1 /*****************************************************************************
2 * x264_gtk_rc.c: h264 gtk encoder frontend
3 *****************************************************************************
4 * Copyright (C) 2006 Vincent Torri
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.
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.
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 *****************************************************************************/
23 #include "x264_gtk_i18n.h"
24 #include "x264_gtk_private.h"
28 static void x264_insert_numeric (GtkEditable *editable,
35 x264_rate_control_page (X264_Gui_Config *config)
42 GtkTooltips *tooltips;
44 tooltips = gtk_tooltips_new ();
46 vbox = gtk_vbox_new (FALSE, 0);
47 gtk_container_set_border_width (GTK_CONTAINER (vbox), 6);
50 frame = gtk_frame_new (_("Bitrate"));
51 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 6);
52 gtk_widget_show (frame);
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);
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"),
65 gtk_table_attach_defaults (GTK_TABLE (table), eb,
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);
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),
77 G_CALLBACK (x264_insert_numeric),
79 gtk_table_attach_defaults (GTK_TABLE (table),
80 config->rate_control.bitrate.keyframe_boost,
82 gtk_widget_show (config->rate_control.bitrate.keyframe_boost);
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"),
89 gtk_table_attach_defaults (GTK_TABLE (table), eb,
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);
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,
102 gtk_widget_show (config->rate_control.bitrate.bframes_reduction);
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"),
109 gtk_table_attach_defaults (GTK_TABLE (table), eb,
111 gtk_widget_show (eb);
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);
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,
122 gtk_widget_show (config->rate_control.bitrate.bitrate_variability);
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);
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);
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"),
140 gtk_table_attach_defaults (GTK_TABLE (table), eb,
142 gtk_widget_show (eb);
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);
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,
153 gtk_widget_show (config->rate_control.quantization_limits.min_qp);
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"),
160 gtk_table_attach_defaults (GTK_TABLE (table), eb,
162 gtk_widget_show (eb);
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);
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,
173 gtk_widget_show (config->rate_control.quantization_limits.max_qp);
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"),
180 gtk_table_attach_defaults (GTK_TABLE (table), eb,
182 gtk_widget_show (eb);
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);
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,
193 gtk_widget_show (config->rate_control.quantization_limits.max_qp_step);
196 frame = gtk_frame_new (_("Scene Cuts"));
197 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 6);
198 gtk_widget_show (frame);
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);
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"),
211 gtk_table_attach_defaults (GTK_TABLE (table), eb,
213 gtk_widget_show (eb);
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);
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,
224 gtk_widget_show (config->rate_control.scene_cuts.scene_cut_threshold);
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"),
231 gtk_table_attach_defaults (GTK_TABLE (table), eb,
233 gtk_widget_show (eb);
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);
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,
244 gtk_widget_show (config->rate_control.scene_cuts.min_idr_frame_interval);
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"),
251 gtk_table_attach_defaults (GTK_TABLE (table), eb,
253 gtk_widget_show (eb);
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);
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,
264 gtk_widget_show (config->rate_control.scene_cuts.max_idr_frame_interval);
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);
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);
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"),
282 gtk_table_attach_defaults (GTK_TABLE (table), eb,
284 gtk_widget_show (eb);
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);
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,
295 gtk_widget_show (config->rate_control.vbv.vbv_max_bitrate);
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"),
302 gtk_table_attach_defaults (GTK_TABLE (table), eb,
304 gtk_widget_show (eb);
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);
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,
315 gtk_widget_show (config->rate_control.vbv.vbv_buffer_size);
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"),
322 gtk_table_attach_defaults (GTK_TABLE (table), eb,
324 gtk_widget_show (eb);
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);
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,
335 gtk_widget_show (config->rate_control.vbv.vbv_buffer_init);
341 x264_insert_numeric (GtkEditable *editable,
351 result = (gchar *)g_malloc (sizeof (gchar) * (length + 1));
355 for (i = 0, j = 0; i < length; i++)
357 if (g_ascii_isdigit (text[i]))
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);
371 g_signal_stop_emission_by_name (editable, "insert-text");