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

« back to all changes in this revision

Viewing changes to avidemux/ADM_dialog/DIA_contrast.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_register_dialog(dialog);
 
159
  gtk_widget_set_usize (WID (drawingarea1), sw, sh);
 
160
 
 
161
 
 
162
  SCHECKBOX (checkLuma, par.doLuma);
 
163
  SCHECKBOX (checkbuttonU, par.doChromaU);
 
164
  SCHECKBOX (checkbuttonV, par.doChromaV);
 
165
 
 
166
  GTK_ADJUSTMENT (adj_offset)->value = par.offset;
 
167
  GTK_ADJUSTMENT (adj_coeff)->value = par.coef;
 
168
 
 
169
  // add display callback
 
170
  gtk_signal_connect (GTK_OBJECT (WID (drawingarea1)), "expose_event",
 
171
                      GTK_SIGNAL_FUNC (gui_draw), NULL);
 
172
 
 
173
  // and value changed
 
174
#define CNX(x,y) gtk_signal_connect(GTK_OBJECT(WID(x)), y, \
 
175
                                                           GTK_SIGNAL_FUNC(gui_update), (void *) (1));
 
176
 
 
177
  CNX (hscaleContrast, "value_changed");
 
178
  CNX (hscaleContrast, "drag_data_received");
 
179
 
 
180
  CNX (hscaleBright, "value_changed");
 
181
  CNX (hscaleBright, "drag_data_received");
 
182
 
 
183
  //gtk_widget_show (dialog);
 
184
 
 
185
  ret = 0;
 
186
  if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_OK)
 
187
    {
 
188
      CHECKBOX (checkLuma, par.doLuma);
 
189
      CHECKBOX (checkbuttonU, par.doChromaU);
 
190
      CHECKBOX (checkbuttonV, par.doChromaV);
 
191
 
 
192
      par.coef = GTK_ADJUSTMENT (adj_coeff)->value;
 
193
      par.offset = (int8_t) floor (GTK_ADJUSTMENT (adj_offset)->value);
 
194
 
 
195
      //  printf("\n Luma : %d,u %d, v:%d",par.doLuma,par.doChromaU,par.doChromaV);
 
196
      //  printf("\n off : %d, coeff %f\n",par.offset,par.coef);
 
197
 
 
198
      ret = 1;
 
199
    }
 
200
  gtk_unregister_dialog(dialog);
 
201
  gtk_widget_destroy (dialog);
 
202
  dialog = NULL;
 
203
  adj_coeff = adj_coeff = NULL;
 
204
  return ret;
 
205
}
 
206
//
 
207
//        Check entered values and green-out the selected portion on the screen
 
208
//        Each value must be even
 
209
//
 
210
void
 
211
gui_update (GtkButton * button, gpointer user_data)
 
212
{
 
213
  UNUSED_ARG (button);
 
214
  UNUSED_ARG (user_data);
 
215
  uint32_t
 
216
    sz;
 
217
 
 
218
  sz = sw * sh;
 
219
  CHECKBOX (checkLuma, par.doLuma);
 
220
  CHECKBOX (checkbuttonU, par.doChromaU);
 
221
  CHECKBOX (checkbuttonV, par.doChromaV);
 
222
 
 
223
  par.coef = GTK_ADJUSTMENT (adj_coeff)->value;
 
224
  par.offset = (int8_t) floor (GTK_ADJUSTMENT (adj_offset)->value);
 
225
 
 
226
  // printf("\n Luma : %d,u %d, v:%d",par.doLuma,par.doChromaU,par.doChromaV);
 
227
  // printf("\n off : %d, coeff %f\n",par.offset,par.coef);
 
228
 
 
229
  buildContrastTable (par.coef, par.offset, tableluma, tablechroma);
 
230
 
 
231
  memcpy (video2, aImage->data, (sh * sw * 3)>>1);
 
232
  if (par.doLuma)
 
233
    {
 
234
      doContrast (aImage->data, video2, tableluma, sw, sh);
 
235
 
 
236
    }
 
237
  if (par.doChromaU)
 
238
    {
 
239
      doContrast (aImage->data + sz, video2 + sz, tablechroma, sw >> 1,
 
240
                  sh >> 1);
 
241
    }
 
242
 
 
243
  if (par.doChromaV)
 
244
    {
 
245
      doContrast (aImage->data + sz + (sz >> 2), video2 + sz + (sz >> 2),
 
246
                  tablechroma, sw >> 1, sh >> 1);
 
247
    }
 
248
 
 
249
  //COL_yv12rgb (sw, sh, video2, video3);
 
250
  rgbConv->scale(video2,video3);
 
251
  GUI_RGBDisplay (video3, sw, sh, (void *) WID (drawingarea1));
 
252
 
 
253
 
 
254
}
 
255
 
 
256
gboolean
 
257
gui_draw (GtkWidget * widget, GdkEventExpose * event, gpointer user_data)
 
258
{
 
259
  UNUSED_ARG (widget);
 
260
  UNUSED_ARG (event);
 
261
  UNUSED_ARG (user_data);
 
262
 
 
263
  GUI_RGBDisplay (video3, sw, sh, (void *) WID (drawingarea1));
 
264
  return TRUE;
 
265
}
 
266
 
 
267
 
 
268
GtkWidget *
 
269
create_dialog1 (void)
 
270
{
 
271
  GtkWidget *
 
272
    dialog1;
 
273
  GtkWidget *
 
274
    dialog_vbox1;
 
275
  GtkWidget *
 
276
    vbox1;
 
277
  GtkWidget *
 
278
    hbox1;
 
279
  GtkWidget *
 
280
    vbox3;
 
281
  GtkWidget *
 
282
    label1;
 
283
  GtkWidget *
 
284
    hscaleContrast;
 
285
  GtkWidget *
 
286
    label2;
 
287
  GtkWidget *
 
288
    hscaleBright;
 
289
  GtkWidget *
 
290
    vbox2;
 
291
  GtkWidget *
 
292
    checkLuma;
 
293
  GtkWidget *
 
294
    checkbuttonU;
 
295
  GtkWidget *
 
296
    checkbuttonV;
 
297
  GtkWidget *
 
298
    drawingarea1;
 
299
  GtkWidget *
 
300
    dialog_action_area1;
 
301
  GtkWidget *
 
302
    cancelbutton1;
 
303
  GtkWidget *
 
304
    okbutton1;
 
305
 
 
306
  dialog1 = gtk_dialog_new ();
 
307
  gtk_window_set_title (GTK_WINDOW (dialog1), _("Contrast"));
 
308
 
 
309
  dialog_vbox1 = GTK_DIALOG (dialog1)->vbox;
 
310
  gtk_widget_show (dialog_vbox1);
 
311
 
 
312
  vbox1 = gtk_vbox_new (FALSE, 0);
 
313
  gtk_widget_show (vbox1);
 
314
  gtk_box_pack_start (GTK_BOX (dialog_vbox1), vbox1, TRUE, TRUE, 0);
 
315
 
 
316
  hbox1 = gtk_hbox_new (FALSE, 0);
 
317
  gtk_widget_show (hbox1);
 
318
  gtk_box_pack_start (GTK_BOX (vbox1), hbox1, TRUE, TRUE, 0);
 
319
 
 
320
  vbox3 = gtk_vbox_new (FALSE, 0);
 
321
  gtk_widget_show (vbox3);
 
322
  gtk_box_pack_start (GTK_BOX (hbox1), vbox3, TRUE, TRUE, 0);
 
323
 
 
324
  label1 = gtk_label_new (_("Contrast"));
 
325
  gtk_widget_show (label1);
 
326
  gtk_box_pack_start (GTK_BOX (vbox3), label1, FALSE, FALSE, 0);
 
327
  gtk_label_set_justify (GTK_LABEL (label1), GTK_JUSTIFY_LEFT);
 
328
 
 
329
 
 
330
 
 
331
  adj_coeff = gtk_adjustment_new (1, 0.5, 1.5, 0.1, 0.1, 0);
 
332
  hscaleContrast = gtk_hscale_new (GTK_ADJUSTMENT (adj_coeff));
 
333
  gtk_widget_show (hscaleContrast);
 
334
  gtk_box_pack_start (GTK_BOX (vbox3), hscaleContrast, FALSE, TRUE, 0);
 
335
  gtk_scale_set_value_pos (GTK_SCALE (hscaleContrast), GTK_POS_LEFT);
 
336
 
 
337
  label2 = gtk_label_new (_("Brightness"));
 
338
  gtk_widget_show (label2);
 
339
  gtk_box_pack_start (GTK_BOX (vbox3), label2, FALSE, FALSE, 0);
 
340
  gtk_label_set_justify (GTK_LABEL (label2), GTK_JUSTIFY_LEFT);
 
341
 
 
342
 
 
343
  adj_offset = gtk_adjustment_new (0, -127, 127, 1, 1, 0);
 
344
  hscaleBright = gtk_hscale_new (GTK_ADJUSTMENT (adj_offset));
 
345
  gtk_widget_show (hscaleBright);
 
346
  gtk_box_pack_start (GTK_BOX (vbox3), hscaleBright, FALSE, TRUE, 0);
 
347
  gtk_scale_set_value_pos (GTK_SCALE (hscaleBright), GTK_POS_LEFT);
 
348
  gtk_scale_set_digits (GTK_SCALE (hscaleBright), 0);
 
349
 
 
350
  vbox2 = gtk_vbox_new (FALSE, 0);
 
351
  gtk_widget_show (vbox2);
 
352
  gtk_box_pack_start (GTK_BOX (hbox1), vbox2, TRUE, TRUE, 0);
 
353
 
 
354
  checkLuma = gtk_check_button_new_with_mnemonic (_("Luma"));
 
355
  gtk_widget_show (checkLuma);
 
356
  gtk_box_pack_start (GTK_BOX (vbox2), checkLuma, FALSE, FALSE, 0);
 
357
 
 
358
  checkbuttonU = gtk_check_button_new_with_mnemonic (_("Chroma U"));
 
359
  gtk_widget_show (checkbuttonU);
 
360
  gtk_box_pack_start (GTK_BOX (vbox2), checkbuttonU, FALSE, FALSE, 0);
 
361
 
 
362
  checkbuttonV = gtk_check_button_new_with_mnemonic (_("Chroma V"));
 
363
  gtk_widget_show (checkbuttonV);
 
364
  gtk_box_pack_start (GTK_BOX (vbox2), checkbuttonV, FALSE, FALSE, 0);
 
365
 
 
366
  drawingarea1 = gtk_drawing_area_new ();
 
367
  gtk_widget_show (drawingarea1);
 
368
  gtk_box_pack_start (GTK_BOX (vbox1), drawingarea1, TRUE, TRUE, 0);
 
369
  gtk_widget_set_size_request (drawingarea1, -1, 300);
 
370
 
 
371
  dialog_action_area1 = GTK_DIALOG (dialog1)->action_area;
 
372
  gtk_widget_show (dialog_action_area1);
 
373
  gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area1),
 
374
                             GTK_BUTTONBOX_END);
 
375
 
 
376
  cancelbutton1 = gtk_button_new_from_stock ("gtk-cancel");
 
377
  gtk_widget_show (cancelbutton1);
 
378
  gtk_dialog_add_action_widget (GTK_DIALOG (dialog1), cancelbutton1,
 
379
                                GTK_RESPONSE_CANCEL);
 
380
  GTK_WIDGET_SET_FLAGS (cancelbutton1, GTK_CAN_DEFAULT);
 
381
 
 
382
  okbutton1 = gtk_button_new_from_stock ("gtk-ok");
 
383
  gtk_widget_show (okbutton1);
 
384
  gtk_dialog_add_action_widget (GTK_DIALOG (dialog1), okbutton1,
 
385
                                GTK_RESPONSE_OK);
 
386
  GTK_WIDGET_SET_FLAGS (okbutton1, GTK_CAN_DEFAULT);
 
387
 
 
388
  /* Store pointers to all widgets, for use by lookup_widget(). */
 
389
  GLADE_HOOKUP_OBJECT_NO_REF (dialog1, dialog1, "dialog1");
 
390
  GLADE_HOOKUP_OBJECT_NO_REF (dialog1, dialog_vbox1, "dialog_vbox1");
 
391
  GLADE_HOOKUP_OBJECT (dialog1, vbox1, "vbox1");
 
392
  GLADE_HOOKUP_OBJECT (dialog1, hbox1, "hbox1");
 
393
  GLADE_HOOKUP_OBJECT (dialog1, vbox3, "vbox3");
 
394
  GLADE_HOOKUP_OBJECT (dialog1, label1, "label1");
 
395
  GLADE_HOOKUP_OBJECT (dialog1, hscaleContrast, "hscaleContrast");
 
396
  GLADE_HOOKUP_OBJECT (dialog1, label2, "label2");
 
397
  GLADE_HOOKUP_OBJECT (dialog1, hscaleBright, "hscaleBright");
 
398
  GLADE_HOOKUP_OBJECT (dialog1, vbox2, "vbox2");
 
399
  GLADE_HOOKUP_OBJECT (dialog1, checkLuma, "checkLuma");
 
400
  GLADE_HOOKUP_OBJECT (dialog1, checkbuttonU, "checkbuttonU");
 
401
  GLADE_HOOKUP_OBJECT (dialog1, checkbuttonV, "checkbuttonV");
 
402
  GLADE_HOOKUP_OBJECT (dialog1, drawingarea1, "drawingarea1");
 
403
  GLADE_HOOKUP_OBJECT_NO_REF (dialog1, dialog_action_area1,
 
404
                              "dialog_action_area1");
 
405
  GLADE_HOOKUP_OBJECT (dialog1, cancelbutton1, "cancelbutton1");
 
406
  GLADE_HOOKUP_OBJECT (dialog1, okbutton1, "okbutton1");
 
407
 
 
408
  return dialog1;
 
409
}
 
410
 
 
411
 
 
412
#endif