Main MRPT website > C++ reference for MRPT 1.9.9
jcsample.cpp
Go to the documentation of this file.
1 /* +------------------------------------------------------------------------+
2  | Mobile Robot Programming Toolkit (MRPT) |
3  | http://www.mrpt.org/ |
4  | |
5  | Copyright (c) 2005-2017, Individual contributors, see AUTHORS file |
6  | See: http://www.mrpt.org/Authors - All rights reserved. |
7  | Released under BSD License. See details in http://www.mrpt.org/License |
8  +------------------------------------------------------------------------+ */
9 
10 #define JPEG_INTERNALS
11 #include "jinclude.h"
12 #include "mrpt_jpeglib.h"
13 
14 /* Pointer to routine to downsample a single component */
15 typedef JMETHOD(
16  void, downsample1_ptr, (j_compress_ptr cinfo, jpeg_component_info* compptr,
17  JSAMPARRAY input_data, JSAMPARRAY output_data));
18 
19 /* Private subobject */
20 
21 typedef struct
22 {
23  struct jpeg_downsampler pub; /* public fields */
24 
25  /* Downsampling method pointers, one per component */
26  downsample1_ptr methods[MAX_COMPONENTS];
28 
30 
31 /*
32  * Initialize for a downsampling pass.
33  */
34 
35 METHODDEF(void)
36 start_pass_downsample(j_compress_ptr) { /* no work for now */}
37 /*
38  * Expand a component horizontally from width input_cols to width output_cols,
39  * by duplicating the rightmost samples.
40  */
41 
42 LOCAL(void)
44  JSAMPARRAY image_data, int num_rows, JDIMENSION input_cols,
45  JDIMENSION output_cols)
46 {
47  JSAMPROW ptr;
48  JSAMPLE pixval;
49  int count;
50  int row;
51  int numcols = (int)(output_cols - input_cols);
52 
53  if (numcols > 0)
54  {
55  for (row = 0; row < num_rows; row++)
56  {
57  ptr = image_data[row] + input_cols;
58  pixval = ptr[-1]; /* don't need GETJSAMPLE() here */
59  for (count = numcols; count > 0; count--) *ptr++ = pixval;
60  }
61  }
62 }
63 
64 /*
65  * Do downsampling for a whole row group (all components).
66  *
67  * In this version we simply downsample each component independently.
68  */
69 
70 METHODDEF(void)
72  j_compress_ptr cinfo, JSAMPIMAGE input_buf, JDIMENSION in_row_index,
73  JSAMPIMAGE output_buf, JDIMENSION out_row_group_index)
74 {
75  my_downsample_ptr downsample = (my_downsample_ptr)cinfo->downsample;
76  int ci;
78  JSAMPARRAY in_ptr, out_ptr;
79 
80  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
81  ci++, compptr++)
82  {
83  in_ptr = input_buf[ci] + in_row_index;
84  out_ptr =
85  output_buf[ci] + (out_row_group_index * compptr->v_samp_factor);
86  (*downsample->methods[ci])(cinfo, compptr, in_ptr, out_ptr);
87  }
88 }
89 
90 /*
91  * Downsample pixel values of a single component.
92  * One row group is processed per call.
93  * This version handles arbitrary integral sampling ratios, without smoothing.
94  * Note that this version is not actually used for customary sampling ratios.
95  */
96 
97 METHODDEF(void)
100  JSAMPARRAY output_data)
101 {
102  int inrow, outrow, h_expand, v_expand, numpix, numpix2, h, v;
103  JDIMENSION outcol, outcol_h; /* outcol_h == outcol*h_expand */
104  JDIMENSION output_cols = compptr->width_in_blocks * DCTSIZE;
106  INT32 outvalue;
107 
108  h_expand = cinfo->max_h_samp_factor / compptr->h_samp_factor;
109  v_expand = cinfo->max_v_samp_factor / compptr->v_samp_factor;
110  numpix = h_expand * v_expand;
111  numpix2 = numpix / 2;
112 
113  /* Expand input data enough to let all the output samples be generated
114  * by the standard loop. Special-casing padded output would be more
115  * efficient.
116  */
118  input_data, cinfo->max_v_samp_factor, cinfo->image_width,
119  output_cols * h_expand);
120 
121  inrow = 0;
122  for (outrow = 0; outrow < compptr->v_samp_factor; outrow++)
123  {
124  outptr = output_data[outrow];
125  for (outcol = 0, outcol_h = 0; outcol < output_cols;
126  outcol++, outcol_h += h_expand)
127  {
128  outvalue = 0;
129  for (v = 0; v < v_expand; v++)
130  {
131  inptr = input_data[inrow + v] + outcol_h;
132  for (h = 0; h < h_expand; h++)
133  {
134  outvalue += (INT32)GETJSAMPLE(*inptr++);
135  }
136  }
137  *outptr++ = (JSAMPLE)((outvalue + numpix2) / numpix);
138  }
139  inrow += v_expand;
140  }
141 }
142 
143 /*
144  * Downsample pixel values of a single component.
145  * This version handles the special case of a full-size component,
146  * without smoothing.
147  */
148 
149 METHODDEF(void)
152  JSAMPARRAY output_data)
153 {
154  /* Copy the data */
156  input_data, 0, output_data, 0, cinfo->max_v_samp_factor,
157  cinfo->image_width);
158  /* Edge-expand */
160  output_data, cinfo->max_v_samp_factor, cinfo->image_width,
162 }
163 
164 /*
165  * Downsample pixel values of a single component.
166  * This version handles the common case of 2:1 horizontal and 1:1 vertical,
167  * without smoothing.
168  *
169  * A note about the "bias" calculations: when rounding fractional values to
170  * integer, we do not want to always round 0.5 up to the next integer.
171  * If we did that, we'd introduce a noticeable bias towards larger values.
172  * Instead, this code is arranged so that 0.5 will be rounded up or down at
173  * alternate pixel locations (a simple ordered dither pattern).
174  */
175 
176 METHODDEF(void)
179  JSAMPARRAY output_data)
180 {
181  int outrow;
182  JDIMENSION outcol;
183  JDIMENSION output_cols = compptr->width_in_blocks * DCTSIZE;
185  int bias;
186 
187  /* Expand input data enough to let all the output samples be generated
188  * by the standard loop. Special-casing padded output would be more
189  * efficient.
190  */
192  input_data, cinfo->max_v_samp_factor, cinfo->image_width,
193  output_cols * 2);
194 
195  for (outrow = 0; outrow < compptr->v_samp_factor; outrow++)
196  {
197  outptr = output_data[outrow];
198  inptr = input_data[outrow];
199  bias = 0; /* bias = 0,1,0,1,... for successive samples */
200  for (outcol = 0; outcol < output_cols; outcol++)
201  {
202  *outptr++ = (JSAMPLE)(
203  (GETJSAMPLE(*inptr) + GETJSAMPLE(inptr[1]) + bias) >> 1);
204  bias ^= 1; /* 0=>1, 1=>0 */
205  inptr += 2;
206  }
207  }
208 }
209 
210 /*
211  * Downsample pixel values of a single component.
212  * This version handles the standard case of 2:1 horizontal and 2:1 vertical,
213  * without smoothing.
214  */
215 
216 METHODDEF(void)
219  JSAMPARRAY output_data)
220 {
221  int inrow, outrow;
222  JDIMENSION outcol;
223  JDIMENSION output_cols = compptr->width_in_blocks * DCTSIZE;
224  JSAMPROW inptr0, inptr1, outptr;
225  int bias;
226 
227  /* Expand input data enough to let all the output samples be generated
228  * by the standard loop. Special-casing padded output would be more
229  * efficient.
230  */
232  input_data, cinfo->max_v_samp_factor, cinfo->image_width,
233  output_cols * 2);
234 
235  inrow = 0;
236  for (outrow = 0; outrow < compptr->v_samp_factor; outrow++)
237  {
238  outptr = output_data[outrow];
239  inptr0 = input_data[inrow];
240  inptr1 = input_data[inrow + 1];
241  bias = 1; /* bias = 1,2,1,2,... for successive samples */
242  for (outcol = 0; outcol < output_cols; outcol++)
243  {
244  *outptr++ = (JSAMPLE)(
245  (GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[1]) +
246  GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[1]) + bias) >>
247  2);
248  bias ^= 3; /* 1=>2, 2=>1 */
249  inptr0 += 2;
250  inptr1 += 2;
251  }
252  inrow += 2;
253  }
254 }
255 
256 #ifdef INPUT_SMOOTHING_SUPPORTED
257 
258 /*
259  * Downsample pixel values of a single component.
260  * This version handles the standard case of 2:1 horizontal and 2:1 vertical,
261  * with smoothing. One row of context is required.
262  */
263 
264 METHODDEF(void)
267  JSAMPARRAY output_data)
268 {
269  int inrow, outrow;
270  JDIMENSION colctr;
271  JDIMENSION output_cols = compptr->width_in_blocks * DCTSIZE;
272  JSAMPROW inptr0, inptr1, above_ptr, below_ptr, outptr;
273  INT32 membersum, neighsum, memberscale, neighscale;
274 
275  /* Expand input data enough to let all the output samples be generated
276  * by the standard loop. Special-casing padded output would be more
277  * efficient.
278  */
280  input_data - 1, cinfo->max_v_samp_factor + 2, cinfo->image_width,
281  output_cols * 2);
282 
283  /* We don't bother to form the individual "smoothed" input pixel values;
284  * we can directly compute the output which is the average of the four
285  * smoothed values. Each of the four member pixels contributes a fraction
286  * (1-8*SF) to its own smoothed image and a fraction SF to each of the three
287  * other smoothed pixels, therefore a total fraction (1-5*SF)/4 to the final
288  * output. The four corner-adjacent neighbor pixels contribute a fraction
289  * SF to just one smoothed pixel, or SF/4 to the final output; while the
290  * eight edge-adjacent neighbors contribute SF to each of two smoothed
291  * pixels, or SF/2 overall. In order to use integer arithmetic, these
292  * factors are scaled by 2^16 = 65536.
293  * Also recall that SF = smoothing_factor / 1024.
294  */
295 
296  memberscale = 16384 - cinfo->smoothing_factor * 80; /* scaled (1-5*SF)/4 */
297  neighscale = cinfo->smoothing_factor * 16; /* scaled SF/4 */
298 
299  inrow = 0;
300  for (outrow = 0; outrow < compptr->v_samp_factor; outrow++)
301  {
302  outptr = output_data[outrow];
303  inptr0 = input_data[inrow];
304  inptr1 = input_data[inrow + 1];
305  above_ptr = input_data[inrow - 1];
306  below_ptr = input_data[inrow + 2];
307 
308  /* Special case for first column: pretend column -1 is same as column 0
309  */
310  membersum = GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[1]) +
311  GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[1]);
312  neighsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(above_ptr[1]) +
313  GETJSAMPLE(*below_ptr) + GETJSAMPLE(below_ptr[1]) +
314  GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[2]) +
315  GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[2]);
316  neighsum += neighsum;
317  neighsum += GETJSAMPLE(*above_ptr) + GETJSAMPLE(above_ptr[2]) +
318  GETJSAMPLE(*below_ptr) + GETJSAMPLE(below_ptr[2]);
319  membersum = membersum * memberscale + neighsum * neighscale;
320  *outptr++ = (JSAMPLE)((membersum + 32768) >> 16);
321  inptr0 += 2;
322  inptr1 += 2;
323  above_ptr += 2;
324  below_ptr += 2;
325 
326  for (colctr = output_cols - 2; colctr > 0; colctr--)
327  {
328  /* sum of pixels directly mapped to this output element */
329  membersum = GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[1]) +
330  GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[1]);
331  /* sum of edge-neighbor pixels */
332  neighsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(above_ptr[1]) +
333  GETJSAMPLE(*below_ptr) + GETJSAMPLE(below_ptr[1]) +
334  GETJSAMPLE(inptr0[-1]) + GETJSAMPLE(inptr0[2]) +
335  GETJSAMPLE(inptr1[-1]) + GETJSAMPLE(inptr1[2]);
336  /* The edge-neighbors count twice as much as corner-neighbors */
337  neighsum += neighsum;
338  /* Add in the corner-neighbors */
339  neighsum += GETJSAMPLE(above_ptr[-1]) + GETJSAMPLE(above_ptr[2]) +
340  GETJSAMPLE(below_ptr[-1]) + GETJSAMPLE(below_ptr[2]);
341  /* form final output scaled up by 2^16 */
342  membersum = membersum * memberscale + neighsum * neighscale;
343  /* round, descale and output it */
344  *outptr++ = (JSAMPLE)((membersum + 32768) >> 16);
345  inptr0 += 2;
346  inptr1 += 2;
347  above_ptr += 2;
348  below_ptr += 2;
349  }
350 
351  /* Special case for last column */
352  membersum = GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[1]) +
353  GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[1]);
354  neighsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(above_ptr[1]) +
355  GETJSAMPLE(*below_ptr) + GETJSAMPLE(below_ptr[1]) +
356  GETJSAMPLE(inptr0[-1]) + GETJSAMPLE(inptr0[1]) +
357  GETJSAMPLE(inptr1[-1]) + GETJSAMPLE(inptr1[1]);
358  neighsum += neighsum;
359  neighsum += GETJSAMPLE(above_ptr[-1]) + GETJSAMPLE(above_ptr[1]) +
360  GETJSAMPLE(below_ptr[-1]) + GETJSAMPLE(below_ptr[1]);
361  membersum = membersum * memberscale + neighsum * neighscale;
362  *outptr = (JSAMPLE)((membersum + 32768) >> 16);
363 
364  inrow += 2;
365  }
366 }
367 
368 /*
369  * Downsample pixel values of a single component.
370  * This version handles the special case of a full-size component,
371  * with smoothing. One row of context is required.
372  */
373 
374 METHODDEF(void)
377  JSAMPARRAY output_data)
378 {
379  int outrow;
380  JDIMENSION colctr;
381  JDIMENSION output_cols = compptr->width_in_blocks * DCTSIZE;
382  JSAMPROW inptr, above_ptr, below_ptr, outptr;
383  INT32 membersum, neighsum, memberscale, neighscale;
384  int colsum, lastcolsum, nextcolsum;
385 
386  /* Expand input data enough to let all the output samples be generated
387  * by the standard loop. Special-casing padded output would be more
388  * efficient.
389  */
391  input_data - 1, cinfo->max_v_samp_factor + 2, cinfo->image_width,
392  output_cols);
393 
394  /* Each of the eight neighbor pixels contributes a fraction SF to the
395  * smoothed pixel, while the main pixel contributes (1-8*SF). In order
396  * to use integer arithmetic, these factors are multiplied by 2^16 = 65536.
397  * Also recall that SF = smoothing_factor / 1024.
398  */
399 
400  memberscale = 65536L - cinfo->smoothing_factor * 512L; /* scaled 1-8*SF */
401  neighscale = cinfo->smoothing_factor * 64; /* scaled SF */
402 
403  for (outrow = 0; outrow < compptr->v_samp_factor; outrow++)
404  {
405  outptr = output_data[outrow];
406  inptr = input_data[outrow];
407  above_ptr = input_data[outrow - 1];
408  below_ptr = input_data[outrow + 1];
409 
410  /* Special case for first column */
411  colsum = GETJSAMPLE(*above_ptr++) + GETJSAMPLE(*below_ptr++) +
412  GETJSAMPLE(*inptr);
413  membersum = GETJSAMPLE(*inptr++);
414  nextcolsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(*below_ptr) +
415  GETJSAMPLE(*inptr);
416  neighsum = colsum + (colsum - membersum) + nextcolsum;
417  membersum = membersum * memberscale + neighsum * neighscale;
418  *outptr++ = (JSAMPLE)((membersum + 32768) >> 16);
419  lastcolsum = colsum;
420  colsum = nextcolsum;
421 
422  for (colctr = output_cols - 2; colctr > 0; colctr--)
423  {
424  membersum = GETJSAMPLE(*inptr++);
425  above_ptr++;
426  below_ptr++;
427  nextcolsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(*below_ptr) +
428  GETJSAMPLE(*inptr);
429  neighsum = lastcolsum + (colsum - membersum) + nextcolsum;
430  membersum = membersum * memberscale + neighsum * neighscale;
431  *outptr++ = (JSAMPLE)((membersum + 32768) >> 16);
432  lastcolsum = colsum;
433  colsum = nextcolsum;
434  }
435 
436  /* Special case for last column */
437  membersum = GETJSAMPLE(*inptr);
438  neighsum = lastcolsum + (colsum - membersum) + colsum;
439  membersum = membersum * memberscale + neighsum * neighscale;
440  *outptr = (JSAMPLE)((membersum + 32768) >> 16);
441  }
442 }
443 
444 #endif /* INPUT_SMOOTHING_SUPPORTED */
445 
446 /*
447  * Module initialization routine for downsampling.
448  * Note that we must select a routine for each component.
449  */
450 
451 GLOBAL(void)
453 {
454  my_downsample_ptr downsample;
455  int ci;
457  boolean smoothok = TRUE;
458 
459  downsample = (my_downsample_ptr)(*cinfo->mem->alloc_small)(
461  cinfo->downsample = (struct jpeg_downsampler*)downsample;
462  downsample->pub.start_pass = start_pass_downsample;
463  downsample->pub.downsample = sep_downsample;
464  downsample->pub.need_context_rows = FALSE;
465 
466  if (cinfo->CCIR601_sampling) ERREXIT(cinfo, JERR_CCIR601_NOTIMPL);
467 
468  /* Verify we can handle the sampling factors, and set up method pointers */
469  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
470  ci++, compptr++)
471  {
472  if (compptr->h_samp_factor == cinfo->max_h_samp_factor &&
473  compptr->v_samp_factor == cinfo->max_v_samp_factor)
474  {
475 #ifdef INPUT_SMOOTHING_SUPPORTED
476  if (cinfo->smoothing_factor)
477  {
478  downsample->methods[ci] = fullsize_smooth_downsample;
479  downsample->pub.need_context_rows = TRUE;
480  }
481  else
482 #endif
483  downsample->methods[ci] = fullsize_downsample;
484  }
485  else if (
486  compptr->h_samp_factor * 2 == cinfo->max_h_samp_factor &&
487  compptr->v_samp_factor == cinfo->max_v_samp_factor)
488  {
489  smoothok = FALSE;
490  downsample->methods[ci] = h2v1_downsample;
491  }
492  else if (
493  compptr->h_samp_factor * 2 == cinfo->max_h_samp_factor &&
494  compptr->v_samp_factor * 2 == cinfo->max_v_samp_factor)
495  {
496 #ifdef INPUT_SMOOTHING_SUPPORTED
497  if (cinfo->smoothing_factor)
498  {
499  downsample->methods[ci] = h2v2_smooth_downsample;
500  downsample->pub.need_context_rows = TRUE;
501  }
502  else
503 #endif
504  downsample->methods[ci] = h2v2_downsample;
505  }
506  else if (
507  (cinfo->max_h_samp_factor % compptr->h_samp_factor) == 0 &&
508  (cinfo->max_v_samp_factor % compptr->v_samp_factor) == 0)
509  {
510  smoothok = FALSE;
511  downsample->methods[ci] = int_downsample;
512  }
513  else
514  ERREXIT(cinfo, JERR_FRACT_SAMPLE_NOTIMPL);
515  }
516 
517 #ifdef INPUT_SMOOTHING_SUPPORTED
518  if (cinfo->smoothing_factor && !smoothok)
519  TRACEMS(cinfo, 0, JTRC_SMOOTH_NOTIMPL);
520 #endif
521 }
jinit_downsampler(j_compress_ptr cinfo)
Definition: jcsample.cpp:452
start_pass_downsample(j_compress_ptr)
Definition: jcsample.cpp:36
GLuint GLuint GLsizei count
Definition: glext.h:3528
my_downsampler * my_downsample_ptr
Definition: jcsample.cpp:29
char JSAMPLE
Definition: jmorecfg.h:58
h2v2_downsample(j_compress_ptr cinfo, jpeg_component_info *compptr, JSAMPARRAY input_data, JSAMPARRAY output_data)
Definition: jcsample.cpp:217
#define DCTSIZE
Definition: mrpt_jpeglib.h:36
struct jpeg_common_struct * j_common_ptr
Definition: mrpt_jpeglib.h:258
int_downsample(j_compress_ptr cinfo, jpeg_component_info *compptr, JSAMPARRAY input_data, JSAMPARRAY output_data)
Definition: jcsample.cpp:98
#define MAX_COMPONENTS
Definition: jmorecfg.h:30
#define GETJSAMPLE(value)
Definition: jmorecfg.h:62
#define ERREXIT(cinfo, code)
Definition: jerror.h:451
for(ctr=DCTSIZE;ctr > 0;ctr--)
Definition: jidctflt.cpp:56
#define SIZEOF(object)
Definition: jinclude.h:74
JSAMPLE FAR * JSAMPROW
Definition: mrpt_jpeglib.h:60
long INT32
Definition: jmorecfg.h:151
JDIMENSION width_in_blocks
Definition: mrpt_jpeglib.h:132
#define TRACEMS(cinfo, lvl, code)
Definition: jerror.h:494
jcopy_sample_rows(JSAMPARRAY input_array, int source_row, JSAMPARRAY output_array, int dest_row, int num_rows, JDIMENSION num_cols)
Definition: jutils.cpp:96
h2v1_downsample(j_compress_ptr cinfo, jpeg_component_info *compptr, JSAMPARRAY input_data, JSAMPARRAY output_data)
Definition: jcsample.cpp:177
JCOEFPTR inptr
Definition: jidctflt.cpp:42
GLfloat bias
Definition: glext.h:5037
JSAMPROW outptr
Definition: jidctflt.cpp:45
expand_right_edge(JSAMPARRAY image_data, int num_rows, JDIMENSION input_cols, JDIMENSION output_cols)
Definition: jcsample.cpp:43
#define FALSE
Definition: jmorecfg.h:216
jpeg_component_info JCOEFPTR JSAMPARRAY output_buf
Definition: jidctflt.cpp:36
#define JPOOL_IMAGE
Definition: mrpt_jpeglib.h:750
#define LOCAL(type)
Definition: jmorecfg.h:175
JSAMPROW * JSAMPARRAY
Definition: mrpt_jpeglib.h:61
#define TRUE
Definition: jmorecfg.h:219
sep_downsample(j_compress_ptr cinfo, JSAMPIMAGE input_buf, JDIMENSION in_row_index, JSAMPIMAGE output_buf, JDIMENSION out_row_group_index)
Definition: jcsample.cpp:71
struct jpeg_downsampler pub
Definition: jcsample.cpp:23
const GLdouble * v
Definition: glext.h:3678
JSAMPARRAY * JSAMPIMAGE
Definition: mrpt_jpeglib.h:62
#define GLOBAL(type)
Definition: jmorecfg.h:177
GLenum GLenum GLvoid * row
Definition: glext.h:3576
#define METHODDEF(type)
Definition: jmorecfg.h:173
downsample1_ptr methods[MAX_COMPONENTS]
Definition: jcsample.cpp:26
fullsize_downsample(j_compress_ptr cinfo, jpeg_component_info *compptr, JSAMPARRAY input_data, JSAMPARRAY output_data)
Definition: jcsample.cpp:150
fullsize_smooth_downsample(j_compress_ptr cinfo, jpeg_component_info *compptr, JSAMPARRAY input_data, JSAMPARRAY output_data)
Definition: jcsample.cpp:375
unsigned int JDIMENSION
Definition: jmorecfg.h:161
boolean need_context_rows
Definition: jpegint.h:99
typedef JMETHOD(void, downsample1_ptr,(j_compress_ptr cinfo, jpeg_component_info *compptr, JSAMPARRAY input_data, JSAMPARRAY output_data))
jpeg_component_info * compptr
Definition: jidctflt.cpp:36
h2v2_smooth_downsample(j_compress_ptr cinfo, jpeg_component_info *compptr, JSAMPARRAY input_data, JSAMPARRAY output_data)
Definition: jcsample.cpp:265



Page generated by Doxygen 1.8.14 for MRPT 1.9.9 Git: ae4571287 Thu Nov 23 00:06:53 2017 +0100 at dom oct 27 23:51:55 CET 2019