1ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if !defined(_FX_JPEG_TURBO_)
2ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*
3ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * jdmerge.c
4ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *
5ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Copyright (C) 1994-1996, Thomas G. Lane.
6ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * This file is part of the Independent JPEG Group's software.
7ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * For conditions of distribution and use, see the accompanying README file.
8ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *
9ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * This file contains code for merged upsampling/color conversion.
10ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *
11ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * This file combines functions from jdsample.c and jdcolor.c;
12ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * read those files first to understand what's going on.
13ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *
14ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * When the chroma components are to be upsampled by simple replication
15ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * (ie, box filtering), we can save some work in color conversion by
16ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * calculating all the output pixels corresponding to a pair of chroma
17ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * samples at one time.  In the conversion equations
18ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *	R = Y           + K1 * Cr
19ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *	G = Y + K2 * Cb + K3 * Cr
20ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *	B = Y + K4 * Cb
21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * only the Y term varies among the group of pixels corresponding to a pair
22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * of chroma samples, so the rest of the terms can be calculated just once.
23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * At typical sampling ratios, this eliminates half or three-quarters of the
24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * multiplications needed for color conversion.
25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *
26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * This file currently provides implementations for the following cases:
27ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *	YCbCr => RGB color conversion only.
28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *	Sampling ratios of 2h1v or 2h2v.
29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *	No scaling needed at upsample time.
30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *	Corner-aligned (non-CCIR601) sampling alignment.
31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Other special cases could be added, but in most applications these are
32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * the only common cases.  (For uncommon cases we fall back on the more
33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * general code in jdsample.c and jdcolor.c.)
34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */
35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define JPEG_INTERNALS
37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "jinclude.h"
38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "jpeglib.h"
39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef UPSAMPLE_MERGING_SUPPORTED
41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef _FX_MANAGED_CODE_
43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define my_upsampler	my_upsampler_m
44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* Private subobject */
47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovtypedef struct {
49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  struct jpeg_upsampler pub;	/* public fields */
50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* Pointer to routine to do actual upsampling/conversion of one row group */
52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  JMETHOD(void, upmethod, (j_decompress_ptr cinfo,
53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			   JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr,
54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			   JSAMPARRAY output_buf));
55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* Private state for YCC->RGB conversion */
57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  int * Cr_r_tab;		/* => table for Cr to R conversion */
58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  int * Cb_b_tab;		/* => table for Cb to B conversion */
59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  INT32 * Cr_g_tab;		/* => table for Cr to G conversion */
60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  INT32 * Cb_g_tab;		/* => table for Cb to G conversion */
61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* For 2:1 vertical sampling, we produce two output rows at a time.
63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   * We need a "spare" row buffer to hold the second output row if the
64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   * application provides just a one-row buffer; we also use the spare
65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   * to discard the dummy last row if the image height is odd.
66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   */
67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  JSAMPROW spare_row;
68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  boolean spare_full;		/* T if spare buffer is occupied */
69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  JDIMENSION out_row_width;	/* samples per output row */
71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  JDIMENSION rows_to_go;	/* counts rows remaining in image */
72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} my_upsampler;
73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovtypedef my_upsampler * my_upsample_ptr;
75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define SCALEBITS	16	/* speediest right-shift on some machines */
77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define ONE_HALF	((INT32) 1 << (SCALEBITS-1))
78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FIX(x)		((INT32) ((x) * (1L<<SCALEBITS) + 0.5))
79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*
82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Initialize tables for YCC->RGB colorspace conversion.
83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * This is taken directly from jdcolor.c; see that file for more info.
84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */
85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
86ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovLOCAL(void)
87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovbuild_ycc_rgb_table (j_decompress_ptr cinfo)
88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;
90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  int i;
91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  INT32 x;
92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  SHIFT_TEMPS
93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  upsample->Cr_r_tab = (int *)
95ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
96ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				(MAXJSAMPLE+1) * SIZEOF(int));
97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  upsample->Cb_b_tab = (int *)
98ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
99ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				(MAXJSAMPLE+1) * SIZEOF(int));
100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  upsample->Cr_g_tab = (INT32 *)
101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				(MAXJSAMPLE+1) * SIZEOF(INT32));
103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  upsample->Cb_g_tab = (INT32 *)
104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				(MAXJSAMPLE+1) * SIZEOF(INT32));
106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  for (i = 0, x = -CENTERJSAMPLE; i <= MAXJSAMPLE; i++, x++) {
108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* i is the actual input pixel value, in the range 0..MAXJSAMPLE */
109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* The Cb or Cr value we are thinking of is x = i - CENTERJSAMPLE */
110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* Cr=>R value is nearest int to 1.40200 * x */
111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    upsample->Cr_r_tab[i] = (int)
112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		    RIGHT_SHIFT(FIX(1.40200) * x + ONE_HALF, SCALEBITS);
113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* Cb=>B value is nearest int to 1.77200 * x */
114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    upsample->Cb_b_tab[i] = (int)
115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		    RIGHT_SHIFT(FIX(1.77200) * x + ONE_HALF, SCALEBITS);
116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* Cr=>G value is scaled-up -0.71414 * x */
117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    upsample->Cr_g_tab[i] = (- FIX(0.71414)) * x;
118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* Cb=>G value is scaled-up -0.34414 * x */
119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* We also add in ONE_HALF so that need not do it in inner loop */
120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    upsample->Cb_g_tab[i] = (- FIX(0.34414)) * x + ONE_HALF;
121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*
126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Initialize for an upsampling pass.
127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */
128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
129ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovMETHODDEF(void)
130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstart_pass_merged_upsample (j_decompress_ptr cinfo)
131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;
133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* Mark the spare buffer empty */
135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  upsample->spare_full = FALSE;
136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* Initialize total-height counter for detecting bottom of image */
137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  upsample->rows_to_go = cinfo->output_height;
138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*
142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Control routine to do upsampling (and color conversion).
143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *
144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * The control routine just handles the row buffering considerations.
145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */
146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
147ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovMETHODDEF(void)
148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovmerged_2v_upsample (j_decompress_ptr cinfo,
149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		    JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,
150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		    JDIMENSION in_row_groups_avail,
151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		    JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		    JDIMENSION out_rows_avail)
153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* 2:1 vertical sampling case: may need a spare row. */
154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;
156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  JSAMPROW work_ptrs[2];
157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  JDIMENSION num_rows;		/* number of rows returned to caller */
158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  if (upsample->spare_full) {
160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* If we have a spare row saved from a previous cycle, just return it. */
161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    jcopy_sample_rows(& upsample->spare_row, 0, output_buf + *out_row_ctr, 0,
162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		      1, upsample->out_row_width);
163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    num_rows = 1;
164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    upsample->spare_full = FALSE;
165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  } else {
166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* Figure number of rows to return to caller. */
167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    num_rows = 2;
168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* Not more than the distance to the end of the image. */
169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (num_rows > upsample->rows_to_go)
170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      num_rows = upsample->rows_to_go;
171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* And not more than what the client can accept: */
172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    out_rows_avail -= *out_row_ctr;
173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (num_rows > out_rows_avail)
174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      num_rows = out_rows_avail;
175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* Create output pointer array for upsampler. */
176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    work_ptrs[0] = output_buf[*out_row_ctr];
177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (num_rows > 1) {
178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      work_ptrs[1] = output_buf[*out_row_ctr + 1];
179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    } else {
180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      work_ptrs[1] = upsample->spare_row;
181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      upsample->spare_full = TRUE;
182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* Now do the upsampling. */
184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    (*upsample->upmethod) (cinfo, input_buf, *in_row_group_ctr, work_ptrs);
185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* Adjust counts */
188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  *out_row_ctr += num_rows;
189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  upsample->rows_to_go -= num_rows;
190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* When the buffer is emptied, declare this input row group consumed */
191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  if (! upsample->spare_full)
192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    (*in_row_group_ctr)++;
193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
196ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovMETHODDEF(void)
197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovmerged_1v_upsample (j_decompress_ptr cinfo,
198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		    JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,
199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		    JDIMENSION in_row_groups_avail,
200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		    JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		    JDIMENSION out_rows_avail)
202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* 1:1 vertical sampling case: much easier, never need a spare row. */
203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;
205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* Just do the upsampling. */
207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  (*upsample->upmethod) (cinfo, input_buf, *in_row_group_ctr,
208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			 output_buf + *out_row_ctr);
209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* Adjust counts */
210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  (*out_row_ctr)++;
211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  (*in_row_group_ctr)++;
212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*
216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * These are the routines invoked by the control routines to do
217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * the actual upsampling/conversion.  One row group is processed per call.
218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *
219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Note: since we may be writing directly into application-supplied buffers,
220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * we have to be honest about the output width; we can't assume the buffer
221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * has been rounded up to an even width.
222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */
223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*
226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Upsample and color convert for the case of 2:1 horizontal and 1:1 vertical.
227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */
228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
229ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovMETHODDEF(void)
230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovh2v1_merged_upsample (j_decompress_ptr cinfo,
231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		      JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr,
232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		      JSAMPARRAY output_buf)
233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;
235ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  register int y, cred, cgreen, cblue;
236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  int cb, cr;
237ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  register JSAMPROW outptr;
238ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  JSAMPROW inptr0, inptr1, inptr2;
239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  JDIMENSION col;
240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* copy these pointers into registers if possible */
241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  register JSAMPLE * range_limit = cinfo->sample_range_limit;
242ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  int * Crrtab = upsample->Cr_r_tab;
243ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  int * Cbbtab = upsample->Cb_b_tab;
244ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  INT32 * Crgtab = upsample->Cr_g_tab;
245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  INT32 * Cbgtab = upsample->Cb_g_tab;
246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  SHIFT_TEMPS
247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  inptr0 = input_buf[0][in_row_group_ctr];
249ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  inptr1 = input_buf[1][in_row_group_ctr];
250ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  inptr2 = input_buf[2][in_row_group_ctr];
251ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  outptr = output_buf[0];
252ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* Loop for each pair of output pixels */
253ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  for (col = cinfo->output_width >> 1; col > 0; col--) {
254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* Do the chroma part of the calculation */
255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    cb = GETJSAMPLE(*inptr1++);
256ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    cr = GETJSAMPLE(*inptr2++);
257ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    cred = Crrtab[cr];
258ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS);
259ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    cblue = Cbbtab[cb];
260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* Fetch 2 Y values and emit 2 pixels */
261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    y  = GETJSAMPLE(*inptr0++);
262ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    outptr[RGB_RED] =   range_limit[y + cred];
263ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    outptr[RGB_GREEN] = range_limit[y + cgreen];
264ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    outptr[RGB_BLUE] =  range_limit[y + cblue];
265ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    outptr += RGB_PIXELSIZE;
266ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    y  = GETJSAMPLE(*inptr0++);
267ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    outptr[RGB_RED] =   range_limit[y + cred];
268ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    outptr[RGB_GREEN] = range_limit[y + cgreen];
269ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    outptr[RGB_BLUE] =  range_limit[y + cblue];
270ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    outptr += RGB_PIXELSIZE;
271ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
272ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* If image width is odd, do the last output column separately */
273ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  if (cinfo->output_width & 1) {
274ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    cb = GETJSAMPLE(*inptr1);
275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    cr = GETJSAMPLE(*inptr2);
276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    cred = Crrtab[cr];
277ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS);
278ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    cblue = Cbbtab[cb];
279ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    y  = GETJSAMPLE(*inptr0);
280ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    outptr[RGB_RED] =   range_limit[y + cred];
281ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    outptr[RGB_GREEN] = range_limit[y + cgreen];
282ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    outptr[RGB_BLUE] =  range_limit[y + cblue];
283ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
284ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
285ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
286ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
287ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*
288ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Upsample and color convert for the case of 2:1 horizontal and 2:1 vertical.
289ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */
290ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
291ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovMETHODDEF(void)
292ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovh2v2_merged_upsample (j_decompress_ptr cinfo,
293ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		      JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr,
294ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		      JSAMPARRAY output_buf)
295ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
296ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;
297ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  register int y, cred, cgreen, cblue;
298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  int cb, cr;
299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  register JSAMPROW outptr0, outptr1;
300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  JSAMPROW inptr00, inptr01, inptr1, inptr2;
301ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  JDIMENSION col;
302ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* copy these pointers into registers if possible */
303ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  register JSAMPLE * range_limit = cinfo->sample_range_limit;
304ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  int * Crrtab = upsample->Cr_r_tab;
305ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  int * Cbbtab = upsample->Cb_b_tab;
306ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  INT32 * Crgtab = upsample->Cr_g_tab;
307ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  INT32 * Cbgtab = upsample->Cb_g_tab;
308ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  SHIFT_TEMPS
309ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
310ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  inptr00 = input_buf[0][in_row_group_ctr*2];
311ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  inptr01 = input_buf[0][in_row_group_ctr*2 + 1];
312ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  inptr1 = input_buf[1][in_row_group_ctr];
313ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  inptr2 = input_buf[2][in_row_group_ctr];
314ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  outptr0 = output_buf[0];
315ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  outptr1 = output_buf[1];
316ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* Loop for each group of output pixels */
317ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  for (col = cinfo->output_width >> 1; col > 0; col--) {
318ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* Do the chroma part of the calculation */
319ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    cb = GETJSAMPLE(*inptr1++);
320ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    cr = GETJSAMPLE(*inptr2++);
321ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    cred = Crrtab[cr];
322ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS);
323ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    cblue = Cbbtab[cb];
324ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* Fetch 4 Y values and emit 4 pixels */
325ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    y  = GETJSAMPLE(*inptr00++);
326ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    outptr0[RGB_RED] =   range_limit[y + cred];
327ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    outptr0[RGB_GREEN] = range_limit[y + cgreen];
328ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    outptr0[RGB_BLUE] =  range_limit[y + cblue];
329ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    outptr0 += RGB_PIXELSIZE;
330ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    y  = GETJSAMPLE(*inptr00++);
331ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    outptr0[RGB_RED] =   range_limit[y + cred];
332ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    outptr0[RGB_GREEN] = range_limit[y + cgreen];
333ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    outptr0[RGB_BLUE] =  range_limit[y + cblue];
334ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    outptr0 += RGB_PIXELSIZE;
335ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    y  = GETJSAMPLE(*inptr01++);
336ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    outptr1[RGB_RED] =   range_limit[y + cred];
337ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    outptr1[RGB_GREEN] = range_limit[y + cgreen];
338ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    outptr1[RGB_BLUE] =  range_limit[y + cblue];
339ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    outptr1 += RGB_PIXELSIZE;
340ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    y  = GETJSAMPLE(*inptr01++);
341ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    outptr1[RGB_RED] =   range_limit[y + cred];
342ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    outptr1[RGB_GREEN] = range_limit[y + cgreen];
343ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    outptr1[RGB_BLUE] =  range_limit[y + cblue];
344ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    outptr1 += RGB_PIXELSIZE;
345ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
346ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* If image width is odd, do the last output column separately */
347ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  if (cinfo->output_width & 1) {
348ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    cb = GETJSAMPLE(*inptr1);
349ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    cr = GETJSAMPLE(*inptr2);
350ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    cred = Crrtab[cr];
351ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS);
352ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    cblue = Cbbtab[cb];
353ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    y  = GETJSAMPLE(*inptr00);
354ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    outptr0[RGB_RED] =   range_limit[y + cred];
355ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    outptr0[RGB_GREEN] = range_limit[y + cgreen];
356ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    outptr0[RGB_BLUE] =  range_limit[y + cblue];
357ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    y  = GETJSAMPLE(*inptr01);
358ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    outptr1[RGB_RED] =   range_limit[y + cred];
359ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    outptr1[RGB_GREEN] = range_limit[y + cgreen];
360ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    outptr1[RGB_BLUE] =  range_limit[y + cblue];
361ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
362ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
363ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
364ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
365ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*
366ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Module initialization routine for merged upsampling/color conversion.
367ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *
368ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * NB: this is called under the conditions determined by use_merged_upsample()
369ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * in jdmaster.c.  That routine MUST correspond to the actual capabilities
370ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * of this module; no safety checks are made here.
371ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */
372ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
373ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovGLOBAL(void)
374ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovjinit_merged_upsampler (j_decompress_ptr cinfo)
375ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
376ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  my_upsample_ptr upsample;
377ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
378ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  upsample = (my_upsample_ptr)
379ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
380ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				SIZEOF(my_upsampler));
381ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  cinfo->upsample = (struct jpeg_upsampler *) upsample;
382ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  upsample->pub.start_pass = start_pass_merged_upsample;
383ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  upsample->pub.need_context_rows = FALSE;
384ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
385ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  upsample->out_row_width = cinfo->output_width * cinfo->out_color_components;
386ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
387ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  if (cinfo->max_v_samp_factor == 2) {
388ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    upsample->pub.upsample = merged_2v_upsample;
389ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    upsample->upmethod = h2v2_merged_upsample;
390ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* Allocate a spare row buffer */
391ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    upsample->spare_row = (JSAMPROW)
392ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE,
393ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		(size_t) (upsample->out_row_width * SIZEOF(JSAMPLE)));
394ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  } else {
395ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    upsample->pub.upsample = merged_1v_upsample;
396ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    upsample->upmethod = h2v1_merged_upsample;
397ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* No spare row needed */
398ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    upsample->spare_row = NULL;
399ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
400ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
401ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  build_ycc_rgb_table(cinfo);
402ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
403ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
404ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif /* UPSAMPLE_MERGING_SUPPORTED */
405ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
406ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif //_FX_JPEG_TURBO_
407