1 /***************************************************************************
2 FAC_bitrate.cpp
3 Handle dialog factory element : Bitrate (encoding mode)
4 (C) 2006 Mean Fixounet@free.fr
5 ***************************************************************************/
6
7 /***************************************************************************
8 * *
9 * This program is free software; you can redistribute it and/or modify *
10 * it under the terms of the GNU General Public License as published by *
11 * the Free Software Foundation; either version 2 of the License, or *
12 * (at your option) any later version. *
13 * *
14 ***************************************************************************/
15
16 #include "ADM_toolkitGtk.h"
17 #include "DIA_factory.h"
18 namespace ADM_GtkFactory
19 {
20 class diaElemBitrate : public diaElemBitrateBase
21 {
22 protected:
23 public:
24
25 diaElemBitrate(COMPRES_PARAMS *p,const char *toggleTitle,const char *tip=NULL);
26 virtual ~diaElemBitrate() ;
27 void setMe(void *dialog, void *opaque,uint32_t line);
28 void getMe(void);
29 void setMaxQz(uint32_t qz);
30 void setMinQz(uint32_t qz);
31 void updateMe(void);
32 int getRequiredLayout(void);
33 };
34
35 static void cb_mod(void *w,void *p);
36 /**
37 * \fn readPullDown
38 * \brief Convert the raw read of the combox into the actual compression mode
39 */
readPulldown(COMPRES_PARAMS * copy,int rank)40 static COMPRESSION_MODE readPulldown(COMPRES_PARAMS *copy,int rank)
41 {
42 int index=0;
43 COMPRESSION_MODE mode=COMPRESS_MAX;
44
45 #undef LOOKUP
46 #define LOOKUP(A,B) \
47 if(copy->capabilities & ADM_ENC_CAP_##A) \
48 { \
49 if(rank==index) mode=COMPRESS_##B; \
50 index++; \
51 }
52
53 LOOKUP(CBR,CBR);
54 LOOKUP(CQ,CQ);
55 LOOKUP(SAME,SAME);
56 LOOKUP(AQ,AQ);
57 LOOKUP(2PASS,2PASS);
58 LOOKUP(2PASS_BR,2PASS_BITRATE);
59
60 ADM_assert(mode!=COMPRESS_MAX);
61 return mode;
62 }
63
diaElemBitrate(COMPRES_PARAMS * p,const char * toggleTitle,const char * tip)64 diaElemBitrate::diaElemBitrate(COMPRES_PARAMS *p,const char *toggleTitle,const char *tip)
65 : diaElemBitrateBase()
66 {
67 param=(void *)p;
68 memcpy(©,p,sizeof(copy));
69 paramTitle=toggleTitle;
70 this->tip=tip;
71 setSize(2);
72 minQ=2;
73 maxQ=31;
74 }
75
setMinQz(uint32_t qz)76 void diaElemBitrate::setMinQz(uint32_t qz)
77 {
78 minQ=qz;
79 }
80
setMaxQz(uint32_t qz)81 void diaElemBitrate::setMaxQz(uint32_t qz)
82 {
83 maxQ=qz;
84 }
~diaElemBitrate()85 diaElemBitrate::~diaElemBitrate()
86 {
87 GtkWidget *w=(GtkWidget *)myWidget;
88 delete [] w;
89 myWidget=NULL;
90 }
91 /**
92 * \fn setMe
93 * @param dialog Pointer to father dialog
94 * @param opaque Internal, Gtk table to attach to
95 * @param line Line were the widget should be displayed
96 */
setMe(void * dialog,void * opaque,uint32_t line)97 void diaElemBitrate::setMe(void *dialog, void *opaque,uint32_t line)
98 {
99 GtkWidget *widget;
100 GtkWidget *label1;
101 GtkWidget *label2;
102 GtkWidget *combo;
103 GtkWidget *spin;
104
105 #define PUT_ARRAY(x,y,widget) gtk_table_attach (GTK_TABLE (opaque), widget, x, x+1, line+y, line+y+1, \
106 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), \
107 (GtkAttachOptions) (0), 0, 0);
108
109 /* Add text -> encoding mode */
110 label1 = gtk_label_new_with_mnemonic (QT_TR_NOOP("_Encoding mode:"));
111 gtk_misc_set_alignment (GTK_MISC (label1), 0.0, 0.5);
112 gtk_widget_show(label1);
113
114 /* put entry in hbox */
115
116 PUT_ARRAY(0,0,label1);
117
118
119 /* Add text -> encoding mode */
120 label2 = gtk_label_new_with_mnemonic (QT_TR_NOOP("_Bitrate (kb/s):"));
121 gtk_misc_set_alignment (GTK_MISC (label2), 0.0, 0.5);
122 gtk_widget_show(label2);
123 /* put entry in hbox */
124 PUT_ARRAY(0,1,label2);
125
126 /* Add encoding menu combo */
127
128
129 combo = gtk_combo_box_text_new ();
130 gtk_widget_show (combo);
131
132 gtk_label_set_mnemonic_widget (GTK_LABEL(label1), combo);
133 if((copy.capabilities & ADM_ENC_CAP_CBR))
134 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo),QT_TR_NOOP("Single pass - bitrate"));
135 if((copy.capabilities & ADM_ENC_CAP_CQ))
136 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo),QT_TR_NOOP("Single pass - constant quality"));
137 if((copy.capabilities & ADM_ENC_CAP_SAME))
138 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo),QT_TR_NOOP("Single pass - same qz as input"));
139 if((copy.capabilities & ADM_ENC_CAP_AQ))
140 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo),QT_TR_NOOP("Single pass - Average quantizer"));
141
142 if((copy.capabilities & ADM_ENC_CAP_2PASS))
143 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo),QT_TR_NOOP("Two pass - video size"));
144 if((copy.capabilities & ADM_ENC_CAP_2PASS_BR))
145 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo),QT_TR_NOOP("Two pass - average bitrate"));
146
147 /**/
148
149
150
151 PUT_ARRAY(1,0,combo);
152
153
154 /* Now add value */
155 spin = gtk_spin_button_new_with_range(0,1,1);
156 gtk_spin_button_set_numeric (GTK_SPIN_BUTTON(spin),TRUE);
157 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(spin),0);
158
159 gtk_widget_show (spin);
160
161 PUT_ARRAY(1,1,spin);
162 /* add button */
163 gtk_label_set_mnemonic_widget (GTK_LABEL(label1), combo);
164 gtk_label_set_mnemonic_widget (GTK_LABEL(label2), spin);
165
166 g_signal_connect(combo, "changed", G_CALLBACK(cb_mod), (void *) this);
167
168 GtkWidget **w;
169 w=new GtkWidget*[4];
170 w[0]=label1;
171 w[1]=label2;
172 w[2]=combo;
173 w[3]=spin;
174 myWidget=(void *)w;
175
176 int index=0,set=-1;
177 #undef LOOKUP
178 #define LOOKUP(A,B) \
179 if(copy.capabilities & ADM_ENC_CAP_##A) \
180 { \
181 if(copy.mode==COMPRESS_##B) set=index; \
182 index++; \
183 } \
184
185 LOOKUP(CBR,CBR);
186 LOOKUP(CQ,CQ);
187 LOOKUP(SAME,SAME);
188 LOOKUP(AQ,AQ);
189 LOOKUP(2PASS,2PASS);
190 LOOKUP(2PASS_BR,2PASS_BITRATE);
191 if(set!=-1) gtk_combo_box_set_active(GTK_COMBO_BOX(combo),set);
192 }
193
194
195
getMe(void)196 void diaElemBitrate::getMe(void)
197 {
198
199
200 // Read current value
201 GtkWidget **w=(GtkWidget **)myWidget;
202 GtkComboBox *combo=(GtkComboBox *)w[2];
203 GtkSpinButton *spin=(GtkSpinButton*)w[3];
204 GtkLabel *label=(GtkLabel*)w[1];
205
206 int rank=gtk_combo_box_get_active(GTK_COMBO_BOX(combo));
207 COMPRESSION_MODE mode=readPulldown(©,rank);
208
209
210 #undef P
211 #undef M
212 #undef S
213 #define P(x)
214 #define M(x,y)
215 #define S(x) x=(uint32_t)gtk_spin_button_get_value (GTK_SPIN_BUTTON(spin))
216 switch(mode)
217 {
218 case COMPRESS_CBR: //CBR
219 P(_Bitrate (kb/s):);
220 M(0,20000);
221 S(copy.bitrate);
222 copy.mode=COMPRESS_CBR;
223 break;
224 case COMPRESS_AQ:// CQ
225 P(_Quantizer:);
226 M(2,31);
227 S(copy.qz);
228 copy.mode=COMPRESS_AQ;
229 break;
230
231 case COMPRESS_CQ:// CQ
232 P(_Quantizer:);
233 M(2,31);
234 S(copy.qz);
235 copy.mode=COMPRESS_CQ;
236 break;
237 case COMPRESS_2PASS: // 2pass Filesize
238 P(_Video size (MB):);
239 M(1,8000);
240 S(copy.finalsize);
241 copy.mode=COMPRESS_2PASS;
242 break;
243 case COMPRESS_2PASS_BITRATE : // 2pass Avg
244 P(_Average bitrate (kb/s):);
245 M(0,20000);
246 S(copy.avg_bitrate);
247 copy.mode=COMPRESS_2PASS_BITRATE;
248 break;
249 case COMPRESS_SAME : // Same Qz as input
250 P(-);
251 M(0,0);
252 copy.mode=COMPRESS_SAME;
253 break;
254 default:ADM_assert(0);
255 }
256 memcpy(param,©,sizeof(copy));
257 }
258
getRequiredLayout(void)259 int diaElemBitrate::getRequiredLayout(void) { return 0; }
260
updateMe(void)261 void diaElemBitrate::updateMe(void)
262 {
263 // Read current value
264 GtkWidget **w=(GtkWidget **)myWidget;
265 GtkComboBox *combo=(GtkComboBox *)w[2];
266 GtkSpinButton *spin=(GtkSpinButton*)w[3];
267 GtkLabel *label=(GtkLabel*)w[1];
268 int rank=gtk_combo_box_get_active(GTK_COMBO_BOX(combo));
269 COMPRESSION_MODE mode=readPulldown(©,rank);
270
271 //#undef P
272 #undef M
273 #undef S
274 //#define P(x) gtk_label_set_text_with_mnemonic(GTK_LABEL(label),QT_TR_NOOP(#x));
275 #define M(x,y) gtk_spin_button_set_range (GTK_SPIN_BUTTON(spin),x,y)
276 #define S(x) gtk_spin_button_set_value (GTK_SPIN_BUTTON(spin),x)
277 switch(mode)
278 {
279 case COMPRESS_CBR: //CBR
280 gtk_label_set_text_with_mnemonic(GTK_LABEL(label),QT_TR_NOOP("_Bitrate (kb/s):"));
281 M(0,20000);
282 S(copy.bitrate);
283 break;
284 case COMPRESS_CQ:// CQ
285 gtk_label_set_text_with_mnemonic(GTK_LABEL(label),QT_TR_NOOP("_Quantizer:"));
286 M(minQ,maxQ);
287 S(copy.qz);
288 break;
289 case COMPRESS_AQ:// CQ
290 gtk_label_set_text_with_mnemonic(GTK_LABEL(label),QT_TR_NOOP("A_vg Quantizer:"));
291 M(2,64);
292 S(copy.qz);
293 break;
294 case COMPRESS_2PASS : // 2pass Filesize
295 gtk_label_set_text_with_mnemonic(GTK_LABEL(label),QT_TR_NOOP("_Video size (MB):"));
296 M(1,8000);
297 S(copy.finalsize);
298 break;
299 case COMPRESS_2PASS_BITRATE : // 2pass Avg
300 gtk_label_set_text_with_mnemonic(GTK_LABEL(label),QT_TR_NOOP("_Average bitrate (kb/s):"));
301 M(0,20000);
302 S(copy.avg_bitrate);
303 break;
304 case COMPRESS_SAME : // Same Qz as input
305 gtk_label_set_text_with_mnemonic(GTK_LABEL(label),QT_TR_NOOP("-"));
306 M(0,0);
307 break;
308 default:ADM_assert(0);
309 }
310 }
311
cb_mod(void * w,void * p)312 void cb_mod(void *w,void *p)
313 {
314 diaElemBitrate *me=(diaElemBitrate *)p;
315 me->updateMe();
316 }
317
318 } // End of namespace
319 //****************************Hoook*****************
320
gtkCreateBitrate(COMPRES_PARAMS * p,const char * toggleTitle,const char * tip)321 diaElem *gtkCreateBitrate(COMPRES_PARAMS *p,const char *toggleTitle,const char *tip)
322 {
323 return new ADM_GtkFactory::diaElemBitrate(p,toggleTitle,tip);
324 }
gtkDestroyBitrate(diaElem * e)325 void gtkDestroyBitrate(diaElem *e)
326 {
327 ADM_GtkFactory::diaElemBitrate *a=(ADM_GtkFactory::diaElemBitrate *)e;
328 delete a;
329 }
330 //EOF
331