~ubuntu-branches/ubuntu/feisty/avidemux/feisty

« back to all changes in this revision

Viewing changes to avidemux/ADM_video/ADM_guiContrast.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Daniel T Chen
  • Date: 2006-12-15 17:13:20 UTC
  • mfrom: (1.1.6 upstream)
  • Revision ID: james.westby@ubuntu.com-20061215171320-w79pvpehxx2fr217
Tags: 1:2.3.0-0.0ubuntu1
* Merge from debian-multimedia.org, remaining Ubuntu change:
  - desktop file,
  - no support for ccache and make -j.
* Closes Ubuntu: #69614.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/***************************************************************************
2
 
                          ADM_guiContrast.cpp  -  description
3
 
                             -------------------
4
 
    begin                : Mon Sep 23 2002
5
 
    copyright            : (C) 2002 by mean
6
 
    email                : fixounet@free.fr
7
 
 ***************************************************************************/
8
 
 
9
 
/***************************************************************************
10
 
 *                                                                         *
11
 
 *   This program is free software; you can redistribute it and/or modify  *
12
 
 *   it under the terms of the GNU General Public License as published by  *
13
 
 *   the Free Software Foundation; either version 2 of the License, or     *
14
 
 *   (at your option) any later version.                                   *
15
 
 *                                                                         *
16
 
 ***************************************************************************/
17
 
#include "config.h"
18
 
 
19
 
#include <stdio.h>
20
 
#include <stdlib.h>
21
 
#include <string.h>
22
 
 
23
 
#include <gtk/gtk.h>
24
 
#include <time.h>
25
 
#include <sys/time.h>
26
 
#include <math.h>
27
 
 
28
 
 
29
 
#include "fourcc.h"
30
 
#include "avio.hxx"
31
 
 
32
 
#include "avi_vars.h"
33
 
#ifdef HAVE_ENCODER
34
 
 
35
 
 
36
 
#include "ADM_editor/ADM_edit.hxx"
37
 
#include "ADM_video/ADM_genvideo.hxx"
38
 
#include "ADM_video/ADM_vidContrast.h"
39
 
 
40
 
#include "ADM_colorspace/ADM_rgb.h"
41
 
#include "ADM_gui2/support.h"
42
 
#include "ADM_toolkit/toolkit_gtk.h"
43
 
#include "ADM_toolkit/toolkit_gtk_include.h"
44
 
#include <ADM_assert.h>
45
 
 
46
 
 
47
 
#include "prototype.h"
48
 
 
49
 
 
50
 
static int getContrastParams (void);
51
 
 
52
 
static GtkWidget *create_dialog1 (void);
53
 
static GtkWidget *dialog = NULL;
54
 
static GtkObject *adj_offset = NULL, *adj_coeff = NULL;
55
 
 
56
 
static gboolean gui_draw (GtkWidget * widget,
57
 
                          GdkEventExpose * event, gpointer user_data);
58
 
 
59
 
//static int croplock;
60
 
static ColYuvRgb    *rgbConv=NULL;
61
 
static void gui_update (GtkButton * button, gpointer user_data);
62
 
 
63
 
 
64
 
// Ugly !
65
 
static uint8_t *video2, *video3;
66
 
static ADMImage *aImage;
67
 
static uint32_t sw, sh;
68
 
static CONTRAST_PARAM par;
69
 
 
70
 
static uint8_t tableluma[256], tablechroma[256];
71
 
 
72
 
uint8_t ADMVideoContrast::configure (AVDMGenericVideoStream * instream)
73
 
{
74
 
  uint32_t
75
 
    w,
76
 
    h,
77
 
    l,
78
 
    f;
79
 
  uint8_t
80
 
    r;
81
 
 
82
 
 
83
 
  video2 = video3 = NULL;
84
 
 
85
 
  // Get info from previous filter
86
 
  w = _in->getInfo ()->width;
87
 
  h = _in->getInfo ()->height;
88
 
 
89
 
  rgbConv=new ColYuvRgb(w,h);
90
 
  rgbConv->reset(w,h);
91
 
 
92
 
  
93
 
  aImage = new ADMImage (w, h);
94
 
 
95
 
  video2 = (uint8_t *) ADM_alloc (w * h * 4);
96
 
  ADM_assert (video2);
97
 
 
98
 
  video3 = (uint8_t *) ADM_alloc (w * h * 4);
99
 
  ADM_assert (video3);
100
 
 
101
 
 
102
 
  // ask current frame from previous filter
103
 
  ADM_assert (instream->getFrameNumberNoAlloc (curframe, &l, aImage, &f));
104
 
 
105
 
  // From now we work in RGB !
106
 
  memcpy (video2, aImage->data, (w * h * 3)>>1);
107
 
 
108
 
  //COL_yv12rgb (w, h, video2, video3);
109
 
  rgbConv->scale(video2,video3);
110
 
  
111
 
  ADM_assert (_param);
112
 
  memcpy (&par, _param, sizeof (par));
113
 
  sw = w;
114
 
  sh = h;
115
 
 
116
 
  switch (r = getContrastParams ())
117
 
    {
118
 
    case 0:
119
 
      printf ("cancelled\n");
120
 
      break;
121
 
    case 1:
122
 
      memcpy (_param, &par, sizeof (par));
123
 
      break;
124
 
    default:
125
 
      ADM_assert (0);
126
 
    }
127
 
 
128
 
  delete
129
 
    aImage;
130
 
  ADM_dealloc (video2);
131
 
  ADM_dealloc (video3);
132
 
 
133
 
  video2 = video3 = NULL;
134
 
  aImage = NULL;
135
 
 
136
 
  buildContrastTable (_param->coef, _param->offset, _tableFlat, _tableNZ);
137
 
  delete rgbConv;
138
 
  rgbConv=NULL;
139
 
  return r;
140
 
 
141
 
}
142
 
//
143
 
//      Get crop parameters from GUI
144
 
//                         left, right, top, down , initial size
145
 
//
146
 
int
147
 
getContrastParams (void)
148
 
{
149
 
 
150
 
#define WID(x) lookup_widget(dialog,#x)
151
 
#define CHECKBOX(x,y) if(TRUE==gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(lookup_widget(dialog,#x))))  \
152
 
                        y=1; else y=0;
153
 
#define SCHECKBOX(x,y) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(lookup_widget(dialog,#x)),y)
154
 
  int
155
 
    ret = 0;
156
 
 
157
 
  dialog = create_dialog1 ();
158
 
  gtk_widget_set_usize (WID (drawingarea1), sw, sh);
159
 
 
160
 
 
161
 
  SCHECKBOX (checkLuma, par.doLuma);
162
 
  SCHECKBOX (checkbuttonU, par.doChromaU);
163
 
  SCHECKBOX (checkbuttonV, par.doChromaV);
164
 
 
165
 
  GTK_ADJUSTMENT (adj_offset)->value = par.offset;
166
 
  GTK_ADJUSTMENT (adj_coeff)->value = par.coef;
167
 
 
168
 
  // add display callback
169
 
  gtk_signal_connect (GTK_OBJECT (WID (drawingarea1)), "expose_event",
170
 
                      GTK_SIGNAL_FUNC (gui_draw), NULL);
171
 
 
172
 
  // and value changed
173
 
#define CNX(x,y) gtk_signal_connect(GTK_OBJECT(WID(x)), y, \
174
 
                                                           GTK_SIGNAL_FUNC(gui_update), (void *) (1));
175
 
 
176
 
  CNX (hscaleContrast, "value_changed");
177
 
  CNX (hscaleContrast, "drag_data_received");
178
 
 
179
 
  CNX (hscaleBright, "value_changed");
180
 
  CNX (hscaleBright, "drag_data_received");
181
 
 
182
 
  gtk_widget_show (dialog);
183
 
 
184
 
  ret = 0;
185
 
  if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_OK)
186
 
    {
187
 
      CHECKBOX (checkLuma, par.doLuma);
188
 
      CHECKBOX (checkbuttonU, par.doChromaU);
189
 
      CHECKBOX (checkbuttonV, par.doChromaV);
190
 
 
191
 
      par.coef = GTK_ADJUSTMENT (adj_coeff)->value;
192
 
      par.offset = (int8_t) floor (GTK_ADJUSTMENT (adj_offset)->value);
193
 
 
194
 
      //  printf("\n Luma : %d,u %d, v:%d",par.doLuma,par.doChromaU,par.doChromaV);
195
 
      //  printf("\n off : %d, coeff %f\n",par.offset,par.coef);
196
 
 
197
 
      ret = 1;
198
 
    }
199
 
 
200
 
  gtk_widget_destroy (dialog);
201
 
  dialog = NULL;
202
 
  adj_coeff = adj_coeff = NULL;
203
 
  return ret;
204
 
}
205
 
//
206
 
//        Check entered values and green-out the selected portion on the screen
207
 
//        Each value must be even
208
 
//
209
 
void
210
 
gui_update (GtkButton * button, gpointer user_data)
211
 
{
212
 
  UNUSED_ARG (button);
213
 
  UNUSED_ARG (user_data);
214
 
  uint32_t
215
 
    sz;
216
 
 
217
 
  sz = sw * sh;
218
 
  CHECKBOX (checkLuma, par.doLuma);
219
 
  CHECKBOX (checkbuttonU, par.doChromaU);
220
 
  CHECKBOX (checkbuttonV, par.doChromaV);
221
 
 
222
 
  par.coef = GTK_ADJUSTMENT (adj_coeff)->value;
223
 
  par.offset = (int8_t) floor (GTK_ADJUSTMENT (adj_offset)->value);
224
 
 
225
 
  // printf("\n Luma : %d,u %d, v:%d",par.doLuma,par.doChromaU,par.doChromaV);
226
 
  // printf("\n off : %d, coeff %f\n",par.offset,par.coef);
227
 
 
228
 
  buildContrastTable (par.coef, par.offset, tableluma, tablechroma);
229
 
 
230
 
  memcpy (video2, aImage->data, (sh * sw * 3)>>1);
231
 
  if (par.doLuma)
232
 
    {
233
 
      doContrast (aImage->data, video2, tableluma, sw, sh);
234
 
 
235
 
    }
236
 
  if (par.doChromaU)
237
 
    {
238
 
      doContrast (aImage->data + sz, video2 + sz, tablechroma, sw >> 1,
239
 
                  sh >> 1);
240
 
    }
241
 
 
242
 
  if (par.doChromaV)
243
 
    {
244
 
      doContrast (aImage->data + sz + (sz >> 2), video2 + sz + (sz >> 2),
245
 
                  tablechroma, sw >> 1, sh >> 1);
246
 
    }
247
 
 
248
 
  //COL_yv12rgb (sw, sh, video2, video3);
249
 
  rgbConv->scale(video2,video3);
250
 
  GUI_RGBDisplay (video3, sw, sh, (void *) WID (drawingarea1));
251
 
 
252
 
 
253
 
}
254
 
 
255
 
gboolean
256
 
gui_draw (GtkWidget * widget, GdkEventExpose * event, gpointer user_data)
257
 
{
258
 
  UNUSED_ARG (widget);
259
 
  UNUSED_ARG (event);
260
 
  UNUSED_ARG (user_data);
261
 
 
262
 
  GUI_RGBDisplay (video3, sw, sh, (void *) WID (drawingarea1));
263
 
  return TRUE;
264
 
}
265
 
 
266
 
 
267
 
GtkWidget *
268
 
create_dialog1 (void)
269
 
{
270
 
  GtkWidget *
271
 
    dialog1;
272
 
  GtkWidget *
273
 
    dialog_vbox1;
274
 
  GtkWidget *
275
 
    vbox1;
276
 
  GtkWidget *
277
 
    hbox1;
278
 
  GtkWidget *
279
 
    vbox3;
280
 
  GtkWidget *
281
 
    label1;
282
 
  GtkWidget *
283
 
    hscaleContrast;
284
 
  GtkWidget *
285
 
    label2;
286
 
  GtkWidget *
287
 
    hscaleBright;
288
 
  GtkWidget *
289
 
    vbox2;
290
 
  GtkWidget *
291
 
    checkLuma;
292
 
  GtkWidget *
293
 
    checkbuttonU;
294
 
  GtkWidget *
295
 
    checkbuttonV;
296
 
  GtkWidget *
297
 
    drawingarea1;
298
 
  GtkWidget *
299
 
    dialog_action_area1;
300
 
  GtkWidget *
301
 
    cancelbutton1;
302
 
  GtkWidget *
303
 
    okbutton1;
304
 
 
305
 
  dialog1 = gtk_dialog_new ();
306
 
  gtk_window_set_title (GTK_WINDOW (dialog1), _("Contrast"));
307
 
 
308
 
  dialog_vbox1 = GTK_DIALOG (dialog1)->vbox;
309
 
  gtk_widget_show (dialog_vbox1);
310
 
 
311
 
  vbox1 = gtk_vbox_new (FALSE, 0);
312
 
  gtk_widget_show (vbox1);
313
 
  gtk_box_pack_start (GTK_BOX (dialog_vbox1), vbox1, TRUE, TRUE, 0);
314
 
 
315
 
  hbox1 = gtk_hbox_new (FALSE, 0);
316
 
  gtk_widget_show (hbox1);
317
 
  gtk_box_pack_start (GTK_BOX (vbox1), hbox1, TRUE, TRUE, 0);
318
 
 
319
 
  vbox3 = gtk_vbox_new (FALSE, 0);
320
 
  gtk_widget_show (vbox3);
321
 
  gtk_box_pack_start (GTK_BOX (hbox1), vbox3, TRUE, TRUE, 0);
322
 
 
323
 
  label1 = gtk_label_new (_("Contrast"));
324
 
  gtk_widget_show (label1);
325
 
  gtk_box_pack_start (GTK_BOX (vbox3), label1, FALSE, FALSE, 0);
326
 
  gtk_label_set_justify (GTK_LABEL (label1), GTK_JUSTIFY_LEFT);
327
 
 
328
 
 
329
 
 
330
 
  adj_coeff = gtk_adjustment_new (1, 0.5, 1.5, 0.1, 0.1, 0);
331
 
  hscaleContrast = gtk_hscale_new (GTK_ADJUSTMENT (adj_coeff));
332
 
  gtk_widget_show (hscaleContrast);
333
 
  gtk_box_pack_start (GTK_BOX (vbox3), hscaleContrast, FALSE, TRUE, 0);
334
 
  gtk_scale_set_value_pos (GTK_SCALE (hscaleContrast), GTK_POS_LEFT);
335
 
 
336
 
  label2 = gtk_label_new (_("Brightness"));
337
 
  gtk_widget_show (label2);
338
 
  gtk_box_pack_start (GTK_BOX (vbox3), label2, FALSE, FALSE, 0);
339
 
  gtk_label_set_justify (GTK_LABEL (label2), GTK_JUSTIFY_LEFT);
340
 
 
341
 
 
342
 
  adj_offset = gtk_adjustment_new (0, -127, 127, 1, 1, 0);
343
 
  hscaleBright = gtk_hscale_new (GTK_ADJUSTMENT (adj_offset));
344
 
  gtk_widget_show (hscaleBright);
345
 
  gtk_box_pack_start (GTK_BOX (vbox3), hscaleBright, FALSE, TRUE, 0);
346
 
  gtk_scale_set_value_pos (GTK_SCALE (hscaleBright), GTK_POS_LEFT);
347
 
  gtk_scale_set_digits (GTK_SCALE (hscaleBright), 0);
348
 
 
349
 
  vbox2 = gtk_vbox_new (FALSE, 0);
350
 
  gtk_widget_show (vbox2);
351
 
  gtk_box_pack_start (GTK_BOX (hbox1), vbox2, TRUE, TRUE, 0);
352
 
 
353
 
  checkLuma = gtk_check_button_new_with_mnemonic (_("Luma"));
354
 
  gtk_widget_show (checkLuma);
355
 
  gtk_box_pack_start (GTK_BOX (vbox2), checkLuma, FALSE, FALSE, 0);
356
 
 
357
 
  checkbuttonU = gtk_check_button_new_with_mnemonic (_("Chroma U"));
358
 
  gtk_widget_show (checkbuttonU);
359
 
  gtk_box_pack_start (GTK_BOX (vbox2), checkbuttonU, FALSE, FALSE, 0);
360
 
 
361
 
  checkbuttonV = gtk_check_button_new_with_mnemonic (_("Chroma v"));
362
 
  gtk_widget_show (checkbuttonV);
363
 
  gtk_box_pack_start (GTK_BOX (vbox2), checkbuttonV, FALSE, FALSE, 0);
364
 
 
365
 
  drawingarea1 = gtk_drawing_area_new ();
366
 
  gtk_widget_show (drawingarea1);
367
 
  gtk_box_pack_start (GTK_BOX (vbox1), drawingarea1, TRUE, TRUE, 0);
368
 
  gtk_widget_set_size_request (drawingarea1, -1, 300);
369
 
 
370
 
  dialog_action_area1 = GTK_DIALOG (dialog1)->action_area;
371
 
  gtk_widget_show (dialog_action_area1);
372
 
  gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area1),
373
 
                             GTK_BUTTONBOX_END);
374
 
 
375
 
  cancelbutton1 = gtk_button_new_from_stock ("gtk-cancel");
376
 
  gtk_widget_show (cancelbutton1);
377
 
  gtk_dialog_add_action_widget (GTK_DIALOG (dialog1), cancelbutton1,
378
 
                                GTK_RESPONSE_CANCEL);
379
 
  GTK_WIDGET_SET_FLAGS (cancelbutton1, GTK_CAN_DEFAULT);
380
 
 
381
 
  okbutton1 = gtk_button_new_from_stock ("gtk-ok");
382
 
  gtk_widget_show (okbutton1);
383
 
  gtk_dialog_add_action_widget (GTK_DIALOG (dialog1), okbutton1,
384
 
                                GTK_RESPONSE_OK);
385
 
  GTK_WIDGET_SET_FLAGS (okbutton1, GTK_CAN_DEFAULT);
386
 
 
387
 
  /* Store pointers to all widgets, for use by lookup_widget(). */
388
 
  GLADE_HOOKUP_OBJECT_NO_REF (dialog1, dialog1, "dialog1");
389
 
  GLADE_HOOKUP_OBJECT_NO_REF (dialog1, dialog_vbox1, "dialog_vbox1");
390
 
  GLADE_HOOKUP_OBJECT (dialog1, vbox1, "vbox1");
391
 
  GLADE_HOOKUP_OBJECT (dialog1, hbox1, "hbox1");
392
 
  GLADE_HOOKUP_OBJECT (dialog1, vbox3, "vbox3");
393
 
  GLADE_HOOKUP_OBJECT (dialog1, label1, "label1");
394
 
  GLADE_HOOKUP_OBJECT (dialog1, hscaleContrast, "hscaleContrast");
395
 
  GLADE_HOOKUP_OBJECT (dialog1, label2, "label2");
396
 
  GLADE_HOOKUP_OBJECT (dialog1, hscaleBright, "hscaleBright");
397
 
  GLADE_HOOKUP_OBJECT (dialog1, vbox2, "vbox2");
398
 
  GLADE_HOOKUP_OBJECT (dialog1, checkLuma, "checkLuma");
399
 
  GLADE_HOOKUP_OBJECT (dialog1, checkbuttonU, "checkbuttonU");
400
 
  GLADE_HOOKUP_OBJECT (dialog1, checkbuttonV, "checkbuttonV");
401
 
  GLADE_HOOKUP_OBJECT (dialog1, drawingarea1, "drawingarea1");
402
 
  GLADE_HOOKUP_OBJECT_NO_REF (dialog1, dialog_action_area1,
403
 
                              "dialog_action_area1");
404
 
  GLADE_HOOKUP_OBJECT (dialog1, cancelbutton1, "cancelbutton1");
405
 
  GLADE_HOOKUP_OBJECT (dialog1, okbutton1, "okbutton1");
406
 
 
407
 
  return dialog1;
408
 
}
409
 
 
410
 
 
411
 
#endif