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(&copy,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(&copy,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,&copy,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(&copy,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