Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
8619 maxcodehac 1
/*
2
 * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
3
 * Copyright (c) 2002-2007, Professor Benoit Macq
4
 * Copyright (c) 2001-2003, David Janssens
5
 * Copyright (c) 2002-2003, Yannick Verschueren
6
 * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
7
 * Copyright (c) 2005, Herve Drolon, FreeImage Team
8
 * Copyright (c) 2006-2007, Parvatha Elangovan
9
 * All rights reserved.
10
 *
11
 * Redistribution and use in source and binary forms, with or without
12
 * modification, are permitted provided that the following conditions
13
 * are met:
14
 * 1. Redistributions of source code must retain the above copyright
15
 *    notice, this list of conditions and the following disclaimer.
16
 * 2. Redistributions in binary form must reproduce the above copyright
17
 *    notice, this list of conditions and the following disclaimer in the
18
 *    documentation and/or other materials provided with the distribution.
19
 *
20
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
21
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
24
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30
 * POSSIBILITY OF SUCH DAMAGE.
31
 */
32
 
33
#include "opj_includes.h"
34
 
35
void tcd_dump(FILE *fd, opj_tcd_t *tcd, opj_tcd_image_t * img) {
36
	int tileno, compno, resno, bandno, precno;//, cblkno;
37
 
38
	fprintf(fd, "image {\n");
39
	fprintf(fd, "  tw=%d, th=%d x0=%d x1=%d y0=%d y1=%d\n",
40
		img->tw, img->th, tcd->image->x0, tcd->image->x1, tcd->image->y0, tcd->image->y1);
41
 
42
	for (tileno = 0; tileno < img->th * img->tw; tileno++) {
43
		opj_tcd_tile_t *tile = &tcd->tcd_image->tiles[tileno];
44
		fprintf(fd, "  tile {\n");
45
		fprintf(fd, "    x0=%d, y0=%d, x1=%d, y1=%d, numcomps=%d\n",
46
			tile->x0, tile->y0, tile->x1, tile->y1, tile->numcomps);
47
		for (compno = 0; compno < tile->numcomps; compno++) {
48
			opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
49
			fprintf(fd, "    tilec {\n");
50
			fprintf(fd,
51
				"      x0=%d, y0=%d, x1=%d, y1=%d, numresolutions=%d\n",
52
				tilec->x0, tilec->y0, tilec->x1, tilec->y1, tilec->numresolutions);
53
			for (resno = 0; resno < tilec->numresolutions; resno++) {
54
				opj_tcd_resolution_t *res = &tilec->resolutions[resno];
55
				fprintf(fd, "\n   res {\n");
56
				fprintf(fd,
57
					"          x0=%d, y0=%d, x1=%d, y1=%d, pw=%d, ph=%d, numbands=%d\n",
58
					res->x0, res->y0, res->x1, res->y1, res->pw, res->ph, res->numbands);
59
				for (bandno = 0; bandno < res->numbands; bandno++) {
60
					opj_tcd_band_t *band = &res->bands[bandno];
61
					fprintf(fd, "        band {\n");
62
					fprintf(fd,
63
						"          x0=%d, y0=%d, x1=%d, y1=%d, stepsize=%f, numbps=%d\n",
64
						band->x0, band->y0, band->x1, band->y1, band->stepsize, band->numbps);
65
					for (precno = 0; precno < res->pw * res->ph; precno++) {
66
						opj_tcd_precinct_t *prec = &band->precincts[precno];
67
						fprintf(fd, "          prec {\n");
68
						fprintf(fd,
69
							"            x0=%d, y0=%d, x1=%d, y1=%d, cw=%d, ch=%d\n",
70
							prec->x0, prec->y0, prec->x1, prec->y1, prec->cw, prec->ch);
71
						/*
72
						for (cblkno = 0; cblkno < prec->cw * prec->ch; cblkno++) {
73
							opj_tcd_cblk_t *cblk = &prec->cblks[cblkno];
74
							fprintf(fd, "            cblk {\n");
75
							fprintf(fd,
76
								"              x0=%d, y0=%d, x1=%d, y1=%d\n",
77
								cblk->x0, cblk->y0, cblk->x1, cblk->y1);
78
							fprintf(fd, "            }\n");
79
						}
80
						*/
81
						fprintf(fd, "          }\n");
82
					}
83
					fprintf(fd, "        }\n");
84
				}
85
				fprintf(fd, "      }\n");
86
			}
87
			fprintf(fd, "    }\n");
88
		}
89
		fprintf(fd, "  }\n");
90
	}
91
	fprintf(fd, "}\n");
92
}
93
 
94
/* ----------------------------------------------------------------------- */
95
 
96
/**
97
Create a new TCD handle
98
*/
99
opj_tcd_t* tcd_create(opj_common_ptr cinfo) {
100
	/* create the tcd structure */
101
	opj_tcd_t *tcd = (opj_tcd_t*)opj_malloc(sizeof(opj_tcd_t));
102
	if(!tcd) return NULL;
103
	tcd->cinfo = cinfo;
104
	tcd->tcd_image = (opj_tcd_image_t*)opj_malloc(sizeof(opj_tcd_image_t));
105
	if(!tcd->tcd_image) {
106
		opj_free(tcd);
107
		return NULL;
108
	}
109
 
110
	return tcd;
111
}
112
 
113
/**
114
Destroy a previously created TCD handle
115
*/
116
void tcd_destroy(opj_tcd_t *tcd) {
117
	if(tcd) {
118
		opj_free(tcd->tcd_image);
119
		opj_free(tcd);
120
	}
121
}
122
 
123
/* ----------------------------------------------------------------------- */
124
 
125
void tcd_malloc_encode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp, int curtileno) {
126
	int tileno, compno, resno, bandno, precno, cblkno;
127
 
128
	tcd->image = image;
129
	tcd->cp = cp;
130
	tcd->tcd_image->tw = cp->tw;
131
	tcd->tcd_image->th = cp->th;
132
	tcd->tcd_image->tiles = (opj_tcd_tile_t *) opj_malloc(sizeof(opj_tcd_tile_t));
133
 
134
	for (tileno = 0; tileno < 1; tileno++) {
135
		opj_tcp_t *tcp = &cp->tcps[curtileno];
136
		int j;
137
 
138
		/* cfr p59 ISO/IEC FDIS15444-1 : 2000 (18 august 2000) */
139
		int p = curtileno % cp->tw;	/* si numerotation matricielle .. */
140
		int q = curtileno / cp->tw;	/* .. coordonnees de la tile (q,p) q pour ligne et p pour colonne */
141
 
142
		/* opj_tcd_tile_t *tile=&tcd->tcd_image->tiles[tileno]; */
143
		opj_tcd_tile_t *tile = tcd->tcd_image->tiles;
144
 
145
		/* 4 borders of the tile rescale on the image if necessary */
146
		tile->x0 = int_max(cp->tx0 + p * cp->tdx, image->x0);
147
		tile->y0 = int_max(cp->ty0 + q * cp->tdy, image->y0);
148
		tile->x1 = int_min(cp->tx0 + (p + 1) * cp->tdx, image->x1);
149
		tile->y1 = int_min(cp->ty0 + (q + 1) * cp->tdy, image->y1);
150
		tile->numcomps = image->numcomps;
151
		/* tile->PPT=image->PPT;  */
152
 
153
		/* Modification of the RATE >> */
154
		for (j = 0; j < tcp->numlayers; j++) {
155
			tcp->rates[j] = tcp->rates[j] ?
156
				cp->tp_on ?
157
					(((float) (tile->numcomps
158
					* (tile->x1 - tile->x0)
159
					* (tile->y1 - tile->y0)
160
					* image->comps[0].prec))
161
					/(tcp->rates[j] * 8 * image->comps[0].dx * image->comps[0].dy)) - (((tcd->cur_totnum_tp - 1) * 14 )/ tcp->numlayers)
162
					:
163
				((float) (tile->numcomps
164
					* (tile->x1 - tile->x0)
165
					* (tile->y1 - tile->y0)
166
					* image->comps[0].prec))/
167
					(tcp->rates[j] * 8 * image->comps[0].dx * image->comps[0].dy)
168
					: 0;
169
 
170
			if (tcp->rates[j]) {
171
				if (j && tcp->rates[j] < tcp->rates[j - 1] + 10) {
172
					tcp->rates[j] = tcp->rates[j - 1] + 20;
173
				} else {
174
					if (!j && tcp->rates[j] < 30)
175
						tcp->rates[j] = 30;
176
				}
177
 
178
				if(j == (tcp->numlayers-1)){
179
					tcp->rates[j] = tcp->rates[j]- 2;
180
				}
181
			}
182
		}
183
		/* << Modification of the RATE */
184
 
185
		tile->comps = (opj_tcd_tilecomp_t *) opj_malloc(image->numcomps * sizeof(opj_tcd_tilecomp_t));
186
		for (compno = 0; compno < tile->numcomps; compno++) {
187
			opj_tccp_t *tccp = &tcp->tccps[compno];
188
 
189
			opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
190
 
191
			/* border of each tile component (global) */
192
			tilec->x0 = int_ceildiv(tile->x0, image->comps[compno].dx);
193
			tilec->y0 = int_ceildiv(tile->y0, image->comps[compno].dy);
194
			tilec->x1 = int_ceildiv(tile->x1, image->comps[compno].dx);
195
			tilec->y1 = int_ceildiv(tile->y1, image->comps[compno].dy);
196
 
197
			tilec->data = (int *) opj_aligned_malloc((tilec->x1 - tilec->x0) * (tilec->y1 - tilec->y0) * sizeof(int));
198
			tilec->numresolutions = tccp->numresolutions;
199
 
200
			tilec->resolutions = (opj_tcd_resolution_t *) opj_malloc(tilec->numresolutions * sizeof(opj_tcd_resolution_t));
201
 
202
			for (resno = 0; resno < tilec->numresolutions; resno++) {
203
				int pdx, pdy;
204
				int levelno = tilec->numresolutions - 1 - resno;
205
				int tlprcxstart, tlprcystart, brprcxend, brprcyend;
206
				int tlcbgxstart, tlcbgystart, brcbgxend, brcbgyend;
207
				int cbgwidthexpn, cbgheightexpn;
208
				int cblkwidthexpn, cblkheightexpn;
209
 
210
				opj_tcd_resolution_t *res = &tilec->resolutions[resno];
211
 
212
				/* border for each resolution level (global) */
213
				res->x0 = int_ceildivpow2(tilec->x0, levelno);
214
				res->y0 = int_ceildivpow2(tilec->y0, levelno);
215
				res->x1 = int_ceildivpow2(tilec->x1, levelno);
216
				res->y1 = int_ceildivpow2(tilec->y1, levelno);
217
 
218
				res->numbands = resno == 0 ? 1 : 3;
219
				/* p. 35, table A-23, ISO/IEC FDIS154444-1 : 2000 (18 august 2000) */
220
				if (tccp->csty & J2K_CCP_CSTY_PRT) {
221
					pdx = tccp->prcw[resno];
222
					pdy = tccp->prch[resno];
223
				} else {
224
					pdx = 15;
225
					pdy = 15;
226
				}
227
				/* p. 64, B.6, ISO/IEC FDIS15444-1 : 2000 (18 august 2000)  */
228
				tlprcxstart = int_floordivpow2(res->x0, pdx) << pdx;
229
				tlprcystart = int_floordivpow2(res->y0, pdy) << pdy;
230
 
231
				brprcxend = int_ceildivpow2(res->x1, pdx) << pdx;
232
				brprcyend = int_ceildivpow2(res->y1, pdy) << pdy;
233
 
234
				res->pw = (brprcxend - tlprcxstart) >> pdx;
235
				res->ph = (brprcyend - tlprcystart) >> pdy;
236
 
237
				if (resno == 0) {
238
					tlcbgxstart = tlprcxstart;
239
					tlcbgystart = tlprcystart;
240
					brcbgxend = brprcxend;
241
					brcbgyend = brprcyend;
242
					cbgwidthexpn = pdx;
243
					cbgheightexpn = pdy;
244
				} else {
245
					tlcbgxstart = int_ceildivpow2(tlprcxstart, 1);
246
					tlcbgystart = int_ceildivpow2(tlprcystart, 1);
247
					brcbgxend = int_ceildivpow2(brprcxend, 1);
248
					brcbgyend = int_ceildivpow2(brprcyend, 1);
249
					cbgwidthexpn = pdx - 1;
250
					cbgheightexpn = pdy - 1;
251
				}
252
 
253
				cblkwidthexpn = int_min(tccp->cblkw, cbgwidthexpn);
254
				cblkheightexpn = int_min(tccp->cblkh, cbgheightexpn);
255
 
256
				for (bandno = 0; bandno < res->numbands; bandno++) {
257
					int x0b, y0b, i;
258
					int gain, numbps;
259
					opj_stepsize_t *ss = NULL;
260
 
261
					opj_tcd_band_t *band = &res->bands[bandno];
262
 
263
					band->bandno = resno == 0 ? 0 : bandno + 1;
264
					x0b = (band->bandno == 1) || (band->bandno == 3) ? 1 : 0;
265
					y0b = (band->bandno == 2) || (band->bandno == 3) ? 1 : 0;
266
 
267
					if (band->bandno == 0) {
268
						/* band border (global) */
269
						band->x0 = int_ceildivpow2(tilec->x0, levelno);
270
						band->y0 = int_ceildivpow2(tilec->y0, levelno);
271
						band->x1 = int_ceildivpow2(tilec->x1, levelno);
272
						band->y1 = int_ceildivpow2(tilec->y1, levelno);
273
					} else {
274
						/* band border (global) */
275
						band->x0 = int_ceildivpow2(tilec->x0 - (1 << levelno) * x0b, levelno + 1);
276
						band->y0 = int_ceildivpow2(tilec->y0 - (1 << levelno) * y0b, levelno + 1);
277
						band->x1 = int_ceildivpow2(tilec->x1 - (1 << levelno) * x0b, levelno + 1);
278
						band->y1 = int_ceildivpow2(tilec->y1 - (1 << levelno) * y0b, levelno + 1);
279
					}
280
 
281
					ss = &tccp->stepsizes[resno == 0 ? 0 : 3 * (resno - 1) + bandno + 1];
282
					gain = tccp->qmfbid == 0 ? dwt_getgain_real(band->bandno) : dwt_getgain(band->bandno);
283
					numbps = image->comps[compno].prec + gain;
284
 
285
					band->stepsize = (float)((1.0 + ss->mant / 2048.0) * pow(2.0, numbps - ss->expn));
286
					band->numbps = ss->expn + tccp->numgbits - 1;	/* WHY -1 ? */
287
 
288
					band->precincts = (opj_tcd_precinct_t *) opj_malloc(3 * res->pw * res->ph * sizeof(opj_tcd_precinct_t));
289
 
290
					for (i = 0; i < res->pw * res->ph * 3; i++) {
291
						band->precincts[i].imsbtree = NULL;
292
						band->precincts[i].incltree = NULL;
293
					}
294
 
295
					for (precno = 0; precno < res->pw * res->ph; precno++) {
296
						int tlcblkxstart, tlcblkystart, brcblkxend, brcblkyend;
297
 
298
						int cbgxstart = tlcbgxstart + (precno % res->pw) * (1 << cbgwidthexpn);
299
						int cbgystart = tlcbgystart + (precno / res->pw) * (1 << cbgheightexpn);
300
						int cbgxend = cbgxstart + (1 << cbgwidthexpn);
301
						int cbgyend = cbgystart + (1 << cbgheightexpn);
302
 
303
						opj_tcd_precinct_t *prc = &band->precincts[precno];
304
 
305
						/* precinct size (global) */
306
						prc->x0 = int_max(cbgxstart, band->x0);
307
						prc->y0 = int_max(cbgystart, band->y0);
308
						prc->x1 = int_min(cbgxend, band->x1);
309
						prc->y1 = int_min(cbgyend, band->y1);
310
 
311
						tlcblkxstart = int_floordivpow2(prc->x0, cblkwidthexpn) << cblkwidthexpn;
312
						tlcblkystart = int_floordivpow2(prc->y0, cblkheightexpn) << cblkheightexpn;
313
						brcblkxend = int_ceildivpow2(prc->x1, cblkwidthexpn) << cblkwidthexpn;
314
						brcblkyend = int_ceildivpow2(prc->y1, cblkheightexpn) << cblkheightexpn;
315
						prc->cw = (brcblkxend - tlcblkxstart) >> cblkwidthexpn;
316
						prc->ch = (brcblkyend - tlcblkystart) >> cblkheightexpn;
317
 
318
						prc->cblks.enc = (opj_tcd_cblk_enc_t*) opj_calloc((prc->cw * prc->ch), sizeof(opj_tcd_cblk_enc_t));
319
						prc->incltree = tgt_create(prc->cw, prc->ch);
320
						prc->imsbtree = tgt_create(prc->cw, prc->ch);
321
 
322
						for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
323
							int cblkxstart = tlcblkxstart + (cblkno % prc->cw) * (1 << cblkwidthexpn);
324
							int cblkystart = tlcblkystart + (cblkno / prc->cw) * (1 << cblkheightexpn);
325
							int cblkxend = cblkxstart + (1 << cblkwidthexpn);
326
							int cblkyend = cblkystart + (1 << cblkheightexpn);
327
 
328
							opj_tcd_cblk_enc_t* cblk = &prc->cblks.enc[cblkno];
329
 
330
							/* code-block size (global) */
331
							cblk->x0 = int_max(cblkxstart, prc->x0);
332
							cblk->y0 = int_max(cblkystart, prc->y0);
333
							cblk->x1 = int_min(cblkxend, prc->x1);
334
							cblk->y1 = int_min(cblkyend, prc->y1);
335
							cblk->data = (unsigned char*) opj_calloc(8192+2, sizeof(unsigned char));
336
							/* FIXME: mqc_init_enc and mqc_byteout underrun the buffer if we don't do this. Why? */
337
							cblk->data += 2;
338
							cblk->layers = (opj_tcd_layer_t*) opj_calloc(100, sizeof(opj_tcd_layer_t));
339
							cblk->passes = (opj_tcd_pass_t*) opj_calloc(100, sizeof(opj_tcd_pass_t));
340
						}
341
					}
342
				}
343
			}
344
		}
345
	}
346
 
347
	/* tcd_dump(stdout, tcd, &tcd->tcd_image); */
348
}
349
 
350
void tcd_free_encode(opj_tcd_t *tcd) {
351
	int tileno, compno, resno, bandno, precno, cblkno;
352
 
353
	for (tileno = 0; tileno < 1; tileno++) {
354
		opj_tcd_tile_t *tile = tcd->tcd_image->tiles;
355
 
356
		for (compno = 0; compno < tile->numcomps; compno++) {
357
			opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
358
 
359
			for (resno = 0; resno < tilec->numresolutions; resno++) {
360
				opj_tcd_resolution_t *res = &tilec->resolutions[resno];
361
 
362
				for (bandno = 0; bandno < res->numbands; bandno++) {
363
					opj_tcd_band_t *band = &res->bands[bandno];
364
 
365
					for (precno = 0; precno < res->pw * res->ph; precno++) {
366
						opj_tcd_precinct_t *prc = &band->precincts[precno];
367
 
368
						if (prc->incltree != NULL) {
369
							tgt_destroy(prc->incltree);
370
							prc->incltree = NULL;
371
						}
372
						if (prc->imsbtree != NULL) {
373
							tgt_destroy(prc->imsbtree);
374
							prc->imsbtree = NULL;
375
						}
376
						for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
377
							opj_free(prc->cblks.enc[cblkno].data - 2);
378
							opj_free(prc->cblks.enc[cblkno].layers);
379
							opj_free(prc->cblks.enc[cblkno].passes);
380
						}
381
						opj_free(prc->cblks.enc);
382
					} /* for (precno */
383
					opj_free(band->precincts);
384
					band->precincts = NULL;
385
				} /* for (bandno */
386
			} /* for (resno */
387
			opj_free(tilec->resolutions);
388
			tilec->resolutions = NULL;
389
		} /* for (compno */
390
		opj_free(tile->comps);
391
		tile->comps = NULL;
392
	} /* for (tileno */
393
	opj_free(tcd->tcd_image->tiles);
394
	tcd->tcd_image->tiles = NULL;
395
}
396
 
397
void tcd_init_encode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp, int curtileno) {
398
	int tileno, compno, resno, bandno, precno, cblkno;
399
 
400
	for (tileno = 0; tileno < 1; tileno++) {
401
		opj_tcp_t *tcp = &cp->tcps[curtileno];
402
		int j;
403
		/* cfr p59 ISO/IEC FDIS15444-1 : 2000 (18 august 2000) */
404
		int p = curtileno % cp->tw;
405
		int q = curtileno / cp->tw;
406
 
407
		opj_tcd_tile_t *tile = tcd->tcd_image->tiles;
408
 
409
		/* 4 borders of the tile rescale on the image if necessary */
410
		tile->x0 = int_max(cp->tx0 + p * cp->tdx, image->x0);
411
		tile->y0 = int_max(cp->ty0 + q * cp->tdy, image->y0);
412
		tile->x1 = int_min(cp->tx0 + (p + 1) * cp->tdx, image->x1);
413
		tile->y1 = int_min(cp->ty0 + (q + 1) * cp->tdy, image->y1);
414
 
415
		tile->numcomps = image->numcomps;
416
		/* tile->PPT=image->PPT; */
417
 
418
		/* Modification of the RATE >> */
419
		for (j = 0; j < tcp->numlayers; j++) {
420
			tcp->rates[j] = tcp->rates[j] ?
421
				cp->tp_on ?
422
					(((float) (tile->numcomps
423
					* (tile->x1 - tile->x0)
424
					* (tile->y1 - tile->y0)
425
					* image->comps[0].prec))
426
					/(tcp->rates[j] * 8 * image->comps[0].dx * image->comps[0].dy)) - (((tcd->cur_totnum_tp - 1) * 14 )/ tcp->numlayers)
427
					:
428
				((float) (tile->numcomps
429
					* (tile->x1 - tile->x0)
430
					* (tile->y1 - tile->y0)
431
					* image->comps[0].prec))/
432
					(tcp->rates[j] * 8 * image->comps[0].dx * image->comps[0].dy)
433
					: 0;
434
 
435
			if (tcp->rates[j]) {
436
				if (j && tcp->rates[j] < tcp->rates[j - 1] + 10) {
437
					tcp->rates[j] = tcp->rates[j - 1] + 20;
438
				} else {
439
					if (!j && tcp->rates[j] < 30)
440
						tcp->rates[j] = 30;
441
				}
442
			}
443
		}
444
		/* << Modification of the RATE */
445
 
446
		/* tile->comps=(opj_tcd_tilecomp_t*)opj_realloc(tile->comps,image->numcomps*sizeof(opj_tcd_tilecomp_t)); */
447
		for (compno = 0; compno < tile->numcomps; compno++) {
448
			opj_tccp_t *tccp = &tcp->tccps[compno];
449
 
450
			opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
451
 
452
			/* border of each tile component (global) */
453
			tilec->x0 = int_ceildiv(tile->x0, image->comps[compno].dx);
454
			tilec->y0 = int_ceildiv(tile->y0, image->comps[compno].dy);
455
			tilec->x1 = int_ceildiv(tile->x1, image->comps[compno].dx);
456
			tilec->y1 = int_ceildiv(tile->y1, image->comps[compno].dy);
457
 
458
			tilec->data = (int *) opj_aligned_malloc((tilec->x1 - tilec->x0) * (tilec->y1 - tilec->y0) * sizeof(int));
459
			tilec->numresolutions = tccp->numresolutions;
460
			/* tilec->resolutions=(opj_tcd_resolution_t*)opj_realloc(tilec->resolutions,tilec->numresolutions*sizeof(opj_tcd_resolution_t)); */
461
			for (resno = 0; resno < tilec->numresolutions; resno++) {
462
				int pdx, pdy;
463
 
464
				int levelno = tilec->numresolutions - 1 - resno;
465
				int tlprcxstart, tlprcystart, brprcxend, brprcyend;
466
				int tlcbgxstart, tlcbgystart, brcbgxend, brcbgyend;
467
				int cbgwidthexpn, cbgheightexpn;
468
				int cblkwidthexpn, cblkheightexpn;
469
 
470
				opj_tcd_resolution_t *res = &tilec->resolutions[resno];
471
 
472
				/* border for each resolution level (global) */
473
				res->x0 = int_ceildivpow2(tilec->x0, levelno);
474
				res->y0 = int_ceildivpow2(tilec->y0, levelno);
475
				res->x1 = int_ceildivpow2(tilec->x1, levelno);
476
				res->y1 = int_ceildivpow2(tilec->y1, levelno);
477
				res->numbands = resno == 0 ? 1 : 3;
478
 
479
				/* p. 35, table A-23, ISO/IEC FDIS154444-1 : 2000 (18 august 2000) */
480
				if (tccp->csty & J2K_CCP_CSTY_PRT) {
481
					pdx = tccp->prcw[resno];
482
					pdy = tccp->prch[resno];
483
				} else {
484
					pdx = 15;
485
					pdy = 15;
486
				}
487
				/* p. 64, B.6, ISO/IEC FDIS15444-1 : 2000 (18 august 2000)  */
488
				tlprcxstart = int_floordivpow2(res->x0, pdx) << pdx;
489
				tlprcystart = int_floordivpow2(res->y0, pdy) << pdy;
490
				brprcxend = int_ceildivpow2(res->x1, pdx) << pdx;
491
				brprcyend = int_ceildivpow2(res->y1, pdy) << pdy;
492
 
493
				res->pw = (brprcxend - tlprcxstart) >> pdx;
494
				res->ph = (brprcyend - tlprcystart) >> pdy;
495
 
496
				if (resno == 0) {
497
					tlcbgxstart = tlprcxstart;
498
					tlcbgystart = tlprcystart;
499
					brcbgxend = brprcxend;
500
					brcbgyend = brprcyend;
501
					cbgwidthexpn = pdx;
502
					cbgheightexpn = pdy;
503
				} else {
504
					tlcbgxstart = int_ceildivpow2(tlprcxstart, 1);
505
					tlcbgystart = int_ceildivpow2(tlprcystart, 1);
506
					brcbgxend = int_ceildivpow2(brprcxend, 1);
507
					brcbgyend = int_ceildivpow2(brprcyend, 1);
508
					cbgwidthexpn = pdx - 1;
509
					cbgheightexpn = pdy - 1;
510
				}
511
 
512
				cblkwidthexpn = int_min(tccp->cblkw, cbgwidthexpn);
513
				cblkheightexpn = int_min(tccp->cblkh, cbgheightexpn);
514
 
515
				for (bandno = 0; bandno < res->numbands; bandno++) {
516
					int x0b, y0b;
517
					int gain, numbps;
518
					opj_stepsize_t *ss = NULL;
519
 
520
					opj_tcd_band_t *band = &res->bands[bandno];
521
 
522
					band->bandno = resno == 0 ? 0 : bandno + 1;
523
					x0b = (band->bandno == 1) || (band->bandno == 3) ? 1 : 0;
524
					y0b = (band->bandno == 2) || (band->bandno == 3) ? 1 : 0;
525
 
526
					if (band->bandno == 0) {
527
						/* band border */
528
						band->x0 = int_ceildivpow2(tilec->x0, levelno);
529
						band->y0 = int_ceildivpow2(tilec->y0, levelno);
530
						band->x1 = int_ceildivpow2(tilec->x1, levelno);
531
						band->y1 = int_ceildivpow2(tilec->y1, levelno);
532
					} else {
533
						band->x0 = int_ceildivpow2(tilec->x0 - (1 << levelno) * x0b, levelno + 1);
534
						band->y0 = int_ceildivpow2(tilec->y0 - (1 << levelno) * y0b, levelno + 1);
535
						band->x1 = int_ceildivpow2(tilec->x1 - (1 << levelno) * x0b, levelno + 1);
536
						band->y1 = int_ceildivpow2(tilec->y1 - (1 << levelno) * y0b, levelno + 1);
537
					}
538
 
539
					ss = &tccp->stepsizes[resno == 0 ? 0 : 3 * (resno - 1) + bandno + 1];
540
					gain = tccp->qmfbid == 0 ? dwt_getgain_real(band->bandno) : dwt_getgain(band->bandno);
541
					numbps = image->comps[compno].prec + gain;
542
					band->stepsize = (float)((1.0 + ss->mant / 2048.0) * pow(2.0, numbps - ss->expn));
543
					band->numbps = ss->expn + tccp->numgbits - 1;	/* WHY -1 ? */
544
 
545
					for (precno = 0; precno < res->pw * res->ph; precno++) {
546
						int tlcblkxstart, tlcblkystart, brcblkxend, brcblkyend;
547
 
548
						int cbgxstart = tlcbgxstart + (precno % res->pw) * (1 << cbgwidthexpn);
549
						int cbgystart = tlcbgystart + (precno / res->pw) * (1 << cbgheightexpn);
550
						int cbgxend = cbgxstart + (1 << cbgwidthexpn);
551
						int cbgyend = cbgystart + (1 << cbgheightexpn);
552
 
553
						opj_tcd_precinct_t *prc = &band->precincts[precno];
554
 
555
						/* precinct size (global) */
556
						prc->x0 = int_max(cbgxstart, band->x0);
557
						prc->y0 = int_max(cbgystart, band->y0);
558
						prc->x1 = int_min(cbgxend, band->x1);
559
						prc->y1 = int_min(cbgyend, band->y1);
560
 
561
						tlcblkxstart = int_floordivpow2(prc->x0, cblkwidthexpn) << cblkwidthexpn;
562
						tlcblkystart = int_floordivpow2(prc->y0, cblkheightexpn) << cblkheightexpn;
563
						brcblkxend = int_ceildivpow2(prc->x1, cblkwidthexpn) << cblkwidthexpn;
564
						brcblkyend = int_ceildivpow2(prc->y1, cblkheightexpn) << cblkheightexpn;
565
						prc->cw = (brcblkxend - tlcblkxstart) >> cblkwidthexpn;
566
						prc->ch = (brcblkyend - tlcblkystart) >> cblkheightexpn;
567
 
568
						opj_free(prc->cblks.enc);
569
						prc->cblks.enc = (opj_tcd_cblk_enc_t*) opj_calloc(prc->cw * prc->ch, sizeof(opj_tcd_cblk_enc_t));
570
 
571
						if (prc->incltree != NULL) {
572
							tgt_destroy(prc->incltree);
573
						}
574
						if (prc->imsbtree != NULL) {
575
							tgt_destroy(prc->imsbtree);
576
						}
577
 
578
						prc->incltree = tgt_create(prc->cw, prc->ch);
579
						prc->imsbtree = tgt_create(prc->cw, prc->ch);
580
 
581
						for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
582
							int cblkxstart = tlcblkxstart + (cblkno % prc->cw) * (1 << cblkwidthexpn);
583
							int cblkystart = tlcblkystart + (cblkno / prc->cw) * (1 << cblkheightexpn);
584
							int cblkxend = cblkxstart + (1 << cblkwidthexpn);
585
							int cblkyend = cblkystart + (1 << cblkheightexpn);
586
 
587
							opj_tcd_cblk_enc_t* cblk = &prc->cblks.enc[cblkno];
588
 
589
							/* code-block size (global) */
590
							cblk->x0 = int_max(cblkxstart, prc->x0);
591
							cblk->y0 = int_max(cblkystart, prc->y0);
592
							cblk->x1 = int_min(cblkxend, prc->x1);
593
							cblk->y1 = int_min(cblkyend, prc->y1);
594
							cblk->data = (unsigned char*) opj_calloc(8192+2, sizeof(unsigned char));
595
							/* FIXME: mqc_init_enc and mqc_byteout underrun the buffer if we don't do this. Why? */
596
							cblk->data += 2;
597
							cblk->layers = (opj_tcd_layer_t*) opj_calloc(100, sizeof(opj_tcd_layer_t));
598
							cblk->passes = (opj_tcd_pass_t*) opj_calloc(100, sizeof(opj_tcd_pass_t));
599
						}
600
					} /* precno */
601
				} /* bandno */
602
			} /* resno */
603
		} /* compno */
604
	} /* tileno */
605
 
606
	/* tcd_dump(stdout, tcd, &tcd->tcd_image); */
607
}
608
 
609
void tcd_malloc_decode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp) {
610
	int i, j, tileno, p, q;
611
	unsigned int x0 = 0, y0 = 0, x1 = 0, y1 = 0, w, h;
612
 
613
	tcd->image = image;
614
	tcd->tcd_image->tw = cp->tw;
615
	tcd->tcd_image->th = cp->th;
616
	tcd->tcd_image->tiles = (opj_tcd_tile_t *) opj_malloc(cp->tw * cp->th * sizeof(opj_tcd_tile_t));
617
 
618
	/*
619
	Allocate place to store the decoded data = final image
620
	Place limited by the tile really present in the codestream
621
	*/
622
 
623
	for (j = 0; j < cp->tileno_size; j++) {
624
		opj_tcd_tile_t *tile;
625
 
626
		tileno = cp->tileno[j];
627
		tile = &(tcd->tcd_image->tiles[cp->tileno[tileno]]);
628
		tile->numcomps = image->numcomps;
629
		tile->comps = (opj_tcd_tilecomp_t*) opj_calloc(image->numcomps, sizeof(opj_tcd_tilecomp_t));
630
	}
631
 
632
	for (i = 0; i < image->numcomps; i++) {
633
		for (j = 0; j < cp->tileno_size; j++) {
634
			opj_tcd_tile_t *tile;
635
			opj_tcd_tilecomp_t *tilec;
636
 
637
			/* cfr p59 ISO/IEC FDIS15444-1 : 2000 (18 august 2000) */
638
 
639
			tileno = cp->tileno[j];
640
 
641
			tile = &(tcd->tcd_image->tiles[cp->tileno[tileno]]);
642
			tilec = &tile->comps[i];
643
 
644
			p = tileno % cp->tw;	/* si numerotation matricielle .. */
645
			q = tileno / cp->tw;	/* .. coordonnees de la tile (q,p) q pour ligne et p pour colonne */
646
 
647
			/* 4 borders of the tile rescale on the image if necessary */
648
			tile->x0 = int_max(cp->tx0 + p * cp->tdx, image->x0);
649
			tile->y0 = int_max(cp->ty0 + q * cp->tdy, image->y0);
650
			tile->x1 = int_min(cp->tx0 + (p + 1) * cp->tdx, image->x1);
651
			tile->y1 = int_min(cp->ty0 + (q + 1) * cp->tdy, image->y1);
652
 
653
			tilec->x0 = int_ceildiv(tile->x0, image->comps[i].dx);
654
			tilec->y0 = int_ceildiv(tile->y0, image->comps[i].dy);
655
			tilec->x1 = int_ceildiv(tile->x1, image->comps[i].dx);
656
			tilec->y1 = int_ceildiv(tile->y1, image->comps[i].dy);
657
 
658
			x0 = j == 0 ? tilec->x0 : int_min(x0, (unsigned int) tilec->x0);
659
			y0 = j == 0 ? tilec->y0 : int_min(y0,	(unsigned int) tilec->x0);
660
			x1 = j == 0 ? tilec->x1 : int_max(x1,	(unsigned int) tilec->x1);
661
			y1 = j == 0 ? tilec->y1 : int_max(y1,	(unsigned int) tilec->y1);
662
		}
663
 
664
		w = int_ceildivpow2(x1 - x0, image->comps[i].factor);
665
		h = int_ceildivpow2(y1 - y0, image->comps[i].factor);
666
 
667
		image->comps[i].w = w;
668
		image->comps[i].h = h;
669
		image->comps[i].x0 = x0;
670
		image->comps[i].y0 = y0;
671
	}
672
}
673
 
674
void tcd_malloc_decode_tile(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp, int tileno, opj_codestream_info_t *cstr_info) {
675
	int compno, resno, bandno, precno, cblkno;
676
	opj_tcp_t *tcp;
677
	opj_tcd_tile_t *tile;
678
 
679
	tcd->cp = cp;
680
 
681
	tcp = &(cp->tcps[cp->tileno[tileno]]);
682
	tile = &(tcd->tcd_image->tiles[cp->tileno[tileno]]);
683
 
684
	tileno = cp->tileno[tileno];
685
 
686
	for (compno = 0; compno < tile->numcomps; compno++) {
687
		opj_tccp_t *tccp = &tcp->tccps[compno];
688
		opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
689
 
690
		/* border of each tile component (global) */
691
		tilec->x0 = int_ceildiv(tile->x0, image->comps[compno].dx);
692
		tilec->y0 = int_ceildiv(tile->y0, image->comps[compno].dy);
693
		tilec->x1 = int_ceildiv(tile->x1, image->comps[compno].dx);
694
		tilec->y1 = int_ceildiv(tile->y1, image->comps[compno].dy);
695
 
696
		tilec->numresolutions = tccp->numresolutions;
697
		tilec->resolutions = (opj_tcd_resolution_t *) opj_malloc(tilec->numresolutions * sizeof(opj_tcd_resolution_t));
698
 
699
		for (resno = 0; resno < tilec->numresolutions; resno++) {
700
			int pdx, pdy;
701
			int levelno = tilec->numresolutions - 1 - resno;
702
			int tlprcxstart, tlprcystart, brprcxend, brprcyend;
703
			int tlcbgxstart, tlcbgystart, brcbgxend, brcbgyend;
704
			int cbgwidthexpn, cbgheightexpn;
705
			int cblkwidthexpn, cblkheightexpn;
706
 
707
			opj_tcd_resolution_t *res = &tilec->resolutions[resno];
708
 
709
			/* border for each resolution level (global) */
710
			res->x0 = int_ceildivpow2(tilec->x0, levelno);
711
			res->y0 = int_ceildivpow2(tilec->y0, levelno);
712
			res->x1 = int_ceildivpow2(tilec->x1, levelno);
713
			res->y1 = int_ceildivpow2(tilec->y1, levelno);
714
			res->numbands = resno == 0 ? 1 : 3;
715
 
716
			/* p. 35, table A-23, ISO/IEC FDIS154444-1 : 2000 (18 august 2000) */
717
			if (tccp->csty & J2K_CCP_CSTY_PRT) {
718
				pdx = tccp->prcw[resno];
719
				pdy = tccp->prch[resno];
720
			} else {
721
				pdx = 15;
722
				pdy = 15;
723
			}
724
 
725
			/* p. 64, B.6, ISO/IEC FDIS15444-1 : 2000 (18 august 2000)  */
726
			tlprcxstart = int_floordivpow2(res->x0, pdx) << pdx;
727
			tlprcystart = int_floordivpow2(res->y0, pdy) << pdy;
728
			brprcxend = int_ceildivpow2(res->x1, pdx) << pdx;
729
			brprcyend = int_ceildivpow2(res->y1, pdy) << pdy;
730
 
731
			res->pw = (res->x0 == res->x1) ? 0 : ((brprcxend - tlprcxstart) >> pdx);
732
			res->ph = (res->y0 == res->y1) ? 0 : ((brprcyend - tlprcystart) >> pdy);
733
 
734
			if (resno == 0) {
735
				tlcbgxstart = tlprcxstart;
736
				tlcbgystart = tlprcystart;
737
				brcbgxend = brprcxend;
738
				brcbgyend = brprcyend;
739
				cbgwidthexpn = pdx;
740
				cbgheightexpn = pdy;
741
			} else {
742
				tlcbgxstart = int_ceildivpow2(tlprcxstart, 1);
743
				tlcbgystart = int_ceildivpow2(tlprcystart, 1);
744
				brcbgxend = int_ceildivpow2(brprcxend, 1);
745
				brcbgyend = int_ceildivpow2(brprcyend, 1);
746
				cbgwidthexpn = pdx - 1;
747
				cbgheightexpn = pdy - 1;
748
			}
749
 
750
			cblkwidthexpn = int_min(tccp->cblkw, cbgwidthexpn);
751
			cblkheightexpn = int_min(tccp->cblkh, cbgheightexpn);
752
 
753
			for (bandno = 0; bandno < res->numbands; bandno++) {
754
				int x0b, y0b;
755
				int gain, numbps;
756
				opj_stepsize_t *ss = NULL;
757
 
758
				opj_tcd_band_t *band = &res->bands[bandno];
759
				band->bandno = resno == 0 ? 0 : bandno + 1;
760
				x0b = (band->bandno == 1) || (band->bandno == 3) ? 1 : 0;
761
				y0b = (band->bandno == 2) || (band->bandno == 3) ? 1 : 0;
762
 
763
				if (band->bandno == 0) {
764
					/* band border (global) */
765
					band->x0 = int_ceildivpow2(tilec->x0, levelno);
766
					band->y0 = int_ceildivpow2(tilec->y0, levelno);
767
					band->x1 = int_ceildivpow2(tilec->x1, levelno);
768
					band->y1 = int_ceildivpow2(tilec->y1, levelno);
769
				} else {
770
					/* band border (global) */
771
					band->x0 = int_ceildivpow2(tilec->x0 - (1 << levelno) * x0b, levelno + 1);
772
					band->y0 = int_ceildivpow2(tilec->y0 - (1 << levelno) * y0b, levelno + 1);
773
					band->x1 = int_ceildivpow2(tilec->x1 - (1 << levelno) * x0b, levelno + 1);
774
					band->y1 = int_ceildivpow2(tilec->y1 - (1 << levelno) * y0b, levelno + 1);
775
				}
776
 
777
				ss = &tccp->stepsizes[resno == 0 ? 0 : 3 * (resno - 1) + bandno + 1];
778
				gain = tccp->qmfbid == 0 ? dwt_getgain_real(band->bandno) : dwt_getgain(band->bandno);
779
				numbps = image->comps[compno].prec + gain;
780
				band->stepsize = (float)(((1.0 + ss->mant / 2048.0) * pow(2.0, numbps - ss->expn)) * 0.5);
781
				band->numbps = ss->expn + tccp->numgbits - 1;	/* WHY -1 ? */
782
 
783
				band->precincts = (opj_tcd_precinct_t *) opj_malloc(res->pw * res->ph * sizeof(opj_tcd_precinct_t));
784
 
785
				for (precno = 0; precno < res->pw * res->ph; precno++) {
786
					int tlcblkxstart, tlcblkystart, brcblkxend, brcblkyend;
787
					int cbgxstart = tlcbgxstart + (precno % res->pw) * (1 << cbgwidthexpn);
788
					int cbgystart = tlcbgystart + (precno / res->pw) * (1 << cbgheightexpn);
789
					int cbgxend = cbgxstart + (1 << cbgwidthexpn);
790
					int cbgyend = cbgystart + (1 << cbgheightexpn);
791
 
792
					opj_tcd_precinct_t *prc = &band->precincts[precno];
793
					/* precinct size (global) */
794
					prc->x0 = int_max(cbgxstart, band->x0);
795
					prc->y0 = int_max(cbgystart, band->y0);
796
					prc->x1 = int_min(cbgxend, band->x1);
797
					prc->y1 = int_min(cbgyend, band->y1);
798
 
799
					tlcblkxstart = int_floordivpow2(prc->x0, cblkwidthexpn) << cblkwidthexpn;
800
					tlcblkystart = int_floordivpow2(prc->y0, cblkheightexpn) << cblkheightexpn;
801
					brcblkxend = int_ceildivpow2(prc->x1, cblkwidthexpn) << cblkwidthexpn;
802
					brcblkyend = int_ceildivpow2(prc->y1, cblkheightexpn) << cblkheightexpn;
803
					prc->cw = (brcblkxend - tlcblkxstart) >> cblkwidthexpn;
804
					prc->ch = (brcblkyend - tlcblkystart) >> cblkheightexpn;
805
 
806
					prc->cblks.dec = (opj_tcd_cblk_dec_t*) opj_malloc(prc->cw * prc->ch * sizeof(opj_tcd_cblk_dec_t));
807
 
808
					prc->incltree = tgt_create(prc->cw, prc->ch);
809
					prc->imsbtree = tgt_create(prc->cw, prc->ch);
810
 
811
					for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
812
						int cblkxstart = tlcblkxstart + (cblkno % prc->cw) * (1 << cblkwidthexpn);
813
						int cblkystart = tlcblkystart + (cblkno / prc->cw) * (1 << cblkheightexpn);
814
						int cblkxend = cblkxstart + (1 << cblkwidthexpn);
815
						int cblkyend = cblkystart + (1 << cblkheightexpn);
816
 
817
						opj_tcd_cblk_dec_t* cblk = &prc->cblks.dec[cblkno];
818
						cblk->data = NULL;
819
						cblk->segs = NULL;
820
						/* code-block size (global) */
821
						cblk->x0 = int_max(cblkxstart, prc->x0);
822
						cblk->y0 = int_max(cblkystart, prc->y0);
823
						cblk->x1 = int_min(cblkxend, prc->x1);
824
						cblk->y1 = int_min(cblkyend, prc->y1);
825
						cblk->numsegs = 0;
826
					}
827
				} /* precno */
828
			} /* bandno */
829
		} /* resno */
830
	} /* compno */
831
	/* tcd_dump(stdout, tcd, &tcd->tcd_image); */
832
}
833
 
834
void tcd_makelayer_fixed(opj_tcd_t *tcd, int layno, int final) {
835
	int compno, resno, bandno, precno, cblkno;
836
	int value;			/*, matrice[tcd_tcp->numlayers][tcd_tile->comps[0].numresolutions][3]; */
837
	int matrice[10][10][3];
838
	int i, j, k;
839
 
840
	opj_cp_t *cp = tcd->cp;
841
	opj_tcd_tile_t *tcd_tile = tcd->tcd_tile;
842
	opj_tcp_t *tcd_tcp = tcd->tcp;
843
 
844
	/*matrice=(int*)opj_malloc(tcd_tcp->numlayers*tcd_tile->comps[0].numresolutions*3*sizeof(int)); */
845
 
846
	for (compno = 0; compno < tcd_tile->numcomps; compno++) {
847
		opj_tcd_tilecomp_t *tilec = &tcd_tile->comps[compno];
848
		for (i = 0; i < tcd_tcp->numlayers; i++) {
849
			for (j = 0; j < tilec->numresolutions; j++) {
850
				for (k = 0; k < 3; k++) {
851
					matrice[i][j][k] =
852
						(int) (cp->matrice[i * tilec->numresolutions * 3 + j * 3 + k]
853
						* (float) (tcd->image->comps[compno].prec / 16.0));
854
				}
855
			}
856
		}
857
 
858
		for (resno = 0; resno < tilec->numresolutions; resno++) {
859
			opj_tcd_resolution_t *res = &tilec->resolutions[resno];
860
			for (bandno = 0; bandno < res->numbands; bandno++) {
861
				opj_tcd_band_t *band = &res->bands[bandno];
862
				for (precno = 0; precno < res->pw * res->ph; precno++) {
863
					opj_tcd_precinct_t *prc = &band->precincts[precno];
864
					for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
865
						opj_tcd_cblk_enc_t *cblk = &prc->cblks.enc[cblkno];
866
						opj_tcd_layer_t *layer = &cblk->layers[layno];
867
						int n;
868
						int imsb = tcd->image->comps[compno].prec - cblk->numbps;	/* number of bit-plan equal to zero */
869
						/* Correction of the matrix of coefficient to include the IMSB information */
870
						if (layno == 0) {
871
							value = matrice[layno][resno][bandno];
872
							if (imsb >= value) {
873
								value = 0;
874
							} else {
875
								value -= imsb;
876
							}
877
						} else {
878
							value =	matrice[layno][resno][bandno] -	matrice[layno - 1][resno][bandno];
879
							if (imsb >= matrice[layno - 1][resno][bandno]) {
880
								value -= (imsb - matrice[layno - 1][resno][bandno]);
881
								if (value < 0) {
882
									value = 0;
883
								}
884
							}
885
						}
886
 
887
						if (layno == 0) {
888
							cblk->numpassesinlayers = 0;
889
						}
890
 
891
						n = cblk->numpassesinlayers;
892
						if (cblk->numpassesinlayers == 0) {
893
							if (value != 0) {
894
								n = 3 * value - 2 + cblk->numpassesinlayers;
895
							} else {
896
								n = cblk->numpassesinlayers;
897
							}
898
						} else {
899
							n = 3 * value + cblk->numpassesinlayers;
900
						}
901
 
902
						layer->numpasses = n - cblk->numpassesinlayers;
903
 
904
						if (!layer->numpasses)
905
							continue;
906
 
907
						if (cblk->numpassesinlayers == 0) {
908
							layer->len = cblk->passes[n - 1].rate;
909
							layer->data = cblk->data;
910
						} else {
911
							layer->len = cblk->passes[n - 1].rate - cblk->passes[cblk->numpassesinlayers - 1].rate;
912
							layer->data = cblk->data + cblk->passes[cblk->numpassesinlayers - 1].rate;
913
						}
914
						if (final)
915
							cblk->numpassesinlayers = n;
916
					}
917
				}
918
			}
919
		}
920
	}
921
}
922
 
923
void tcd_rateallocate_fixed(opj_tcd_t *tcd) {
924
	int layno;
925
	for (layno = 0; layno < tcd->tcp->numlayers; layno++) {
926
		tcd_makelayer_fixed(tcd, layno, 1);
927
	}
928
}
929
 
930
void tcd_makelayer(opj_tcd_t *tcd, int layno, double thresh, int final) {
931
	int compno, resno, bandno, precno, cblkno, passno;
932
 
933
	opj_tcd_tile_t *tcd_tile = tcd->tcd_tile;
934
 
935
	tcd_tile->distolayer[layno] = 0;	/* fixed_quality */
936
 
937
	for (compno = 0; compno < tcd_tile->numcomps; compno++) {
938
		opj_tcd_tilecomp_t *tilec = &tcd_tile->comps[compno];
939
		for (resno = 0; resno < tilec->numresolutions; resno++) {
940
			opj_tcd_resolution_t *res = &tilec->resolutions[resno];
941
			for (bandno = 0; bandno < res->numbands; bandno++) {
942
				opj_tcd_band_t *band = &res->bands[bandno];
943
				for (precno = 0; precno < res->pw * res->ph; precno++) {
944
					opj_tcd_precinct_t *prc = &band->precincts[precno];
945
					for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
946
						opj_tcd_cblk_enc_t *cblk = &prc->cblks.enc[cblkno];
947
						opj_tcd_layer_t *layer = &cblk->layers[layno];
948
 
949
						int n;
950
						if (layno == 0) {
951
							cblk->numpassesinlayers = 0;
952
						}
953
						n = cblk->numpassesinlayers;
954
						for (passno = cblk->numpassesinlayers; passno < cblk->totalpasses; passno++) {
955
							int dr;
956
							double dd;
957
							opj_tcd_pass_t *pass = &cblk->passes[passno];
958
							if (n == 0) {
959
								dr = pass->rate;
960
								dd = pass->distortiondec;
961
							} else {
962
								dr = pass->rate - cblk->passes[n - 1].rate;
963
								dd = pass->distortiondec - cblk->passes[n - 1].distortiondec;
964
							}
965
							if (!dr) {
966
								if (dd != 0)
967
									n = passno + 1;
968
								continue;
969
							}
970
							if (dd / dr >= thresh)
971
								n = passno + 1;
972
						}
973
						layer->numpasses = n - cblk->numpassesinlayers;
974
 
975
						if (!layer->numpasses) {
976
							layer->disto = 0;
977
							continue;
978
						}
979
						if (cblk->numpassesinlayers == 0) {
980
							layer->len = cblk->passes[n - 1].rate;
981
							layer->data = cblk->data;
982
							layer->disto = cblk->passes[n - 1].distortiondec;
983
						} else {
984
							layer->len = cblk->passes[n - 1].rate -	cblk->passes[cblk->numpassesinlayers - 1].rate;
985
							layer->data = cblk->data + cblk->passes[cblk->numpassesinlayers - 1].rate;
986
							layer->disto = cblk->passes[n - 1].distortiondec - cblk->passes[cblk->numpassesinlayers - 1].distortiondec;
987
						}
988
 
989
						tcd_tile->distolayer[layno] += layer->disto;	/* fixed_quality */
990
 
991
						if (final)
992
							cblk->numpassesinlayers = n;
993
					}
994
				}
995
			}
996
		}
997
	}
998
}
999
 
1000
bool tcd_rateallocate(opj_tcd_t *tcd, unsigned char *dest, int len, opj_codestream_info_t *cstr_info) {
1001
	int compno, resno, bandno, precno, cblkno, passno, layno;
1002
	double min, max;
1003
	double cumdisto[100];	/* fixed_quality */
1004
	const double K = 1;		/* 1.1; fixed_quality */
1005
	double maxSE = 0;
1006
 
1007
	opj_cp_t *cp = tcd->cp;
1008
	opj_tcd_tile_t *tcd_tile = tcd->tcd_tile;
1009
	opj_tcp_t *tcd_tcp = tcd->tcp;
1010
 
1011
	min = DBL_MAX;
1012
	max = 0;
1013
 
1014
	tcd_tile->numpix = 0;		/* fixed_quality */
1015
 
1016
	for (compno = 0; compno < tcd_tile->numcomps; compno++) {
1017
		opj_tcd_tilecomp_t *tilec = &tcd_tile->comps[compno];
1018
		tilec->numpix = 0;
1019
 
1020
		for (resno = 0; resno < tilec->numresolutions; resno++) {
1021
			opj_tcd_resolution_t *res = &tilec->resolutions[resno];
1022
 
1023
			for (bandno = 0; bandno < res->numbands; bandno++) {
1024
				opj_tcd_band_t *band = &res->bands[bandno];
1025
 
1026
				for (precno = 0; precno < res->pw * res->ph; precno++) {
1027
					opj_tcd_precinct_t *prc = &band->precincts[precno];
1028
 
1029
					for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
1030
						opj_tcd_cblk_enc_t *cblk = &prc->cblks.enc[cblkno];
1031
 
1032
						for (passno = 0; passno < cblk->totalpasses; passno++) {
1033
							opj_tcd_pass_t *pass = &cblk->passes[passno];
1034
							int dr;
1035
							double dd, rdslope;
1036
							if (passno == 0) {
1037
								dr = pass->rate;
1038
								dd = pass->distortiondec;
1039
							} else {
1040
								dr = pass->rate - cblk->passes[passno - 1].rate;
1041
								dd = pass->distortiondec - cblk->passes[passno - 1].distortiondec;
1042
							}
1043
							if (dr == 0) {
1044
								continue;
1045
							}
1046
							rdslope = dd / dr;
1047
							if (rdslope < min) {
1048
								min = rdslope;
1049
							}
1050
							if (rdslope > max) {
1051
								max = rdslope;
1052
							}
1053
						} /* passno */
1054
 
1055
						/* fixed_quality */
1056
						tcd_tile->numpix += ((cblk->x1 - cblk->x0) * (cblk->y1 - cblk->y0));
1057
						tilec->numpix += ((cblk->x1 - cblk->x0) * (cblk->y1 - cblk->y0));
1058
					} /* cbklno */
1059
				} /* precno */
1060
			} /* bandno */
1061
		} /* resno */
1062
 
1063
		maxSE += (((double)(1 << tcd->image->comps[compno].prec) - 1.0)
1064
			* ((double)(1 << tcd->image->comps[compno].prec) -1.0))
1065
			* ((double)(tilec->numpix));
1066
	} /* compno */
1067
 
1068
	/* index file */
1069
	if(cstr_info) {
1070
		opj_tile_info_t *tile_info = &cstr_info->tile[tcd->tcd_tileno];
1071
		tile_info->numpix = tcd_tile->numpix;
1072
		tile_info->distotile = tcd_tile->distotile;
1073
		tile_info->thresh = (double *) opj_malloc(tcd_tcp->numlayers * sizeof(double));
1074
	}
1075
 
1076
	for (layno = 0; layno < tcd_tcp->numlayers; layno++) {
1077
		double lo = min;
1078
		double hi = max;
1079
		int success = 0;
1080
		int maxlen = tcd_tcp->rates[layno] ? int_min(((int) ceil(tcd_tcp->rates[layno])), len) : len;
1081
		double goodthresh = 0;
1082
		double stable_thresh = 0;
1083
		int i;
1084
		double distotarget;		/* fixed_quality */
1085
 
1086
		/* fixed_quality */
1087
		distotarget = tcd_tile->distotile - ((K * maxSE) / pow((float)10, tcd_tcp->distoratio[layno] / 10));
1088
 
1089
		/* Don't try to find an optimal threshold but rather take everything not included yet, if
1090
		  -r xx,yy,zz,0   (disto_alloc == 1 and rates == 0)
1091
		  -q xx,yy,zz,0	  (fixed_quality == 1 and distoratio == 0)
1092
		  ==> possible to have some lossy layers and the last layer for sure lossless */
1093
		if ( ((cp->disto_alloc==1) && (tcd_tcp->rates[layno]>0)) || ((cp->fixed_quality==1) && (tcd_tcp->distoratio[layno]>0))) {
1094
			opj_t2_t *t2 = t2_create(tcd->cinfo, tcd->image, cp);
1095
			double thresh = 0;
1096
 
1097
			for (i = 0; i < 128; i++) {
1098
				int l = 0;
1099
				double distoachieved = 0;	/* fixed_quality */
1100
				thresh = (lo + hi) / 2;
1101
 
1102
				tcd_makelayer(tcd, layno, thresh, 0);
1103
 
1104
				if (cp->fixed_quality) {	/* fixed_quality */
1105
					if(cp->cinema){
1106
						l = t2_encode_packets(t2,tcd->tcd_tileno, tcd_tile, layno + 1, dest, maxlen, cstr_info,tcd->cur_tp_num,tcd->tp_pos,tcd->cur_pino,THRESH_CALC, tcd->cur_totnum_tp);
1107
						if (l == -999) {
1108
							lo = thresh;
1109
							continue;
1110
						}else{
1111
           		distoachieved =	layno == 0 ?
1112
							tcd_tile->distolayer[0]	: cumdisto[layno - 1] + tcd_tile->distolayer[layno];
1113
							if (distoachieved < distotarget) {
1114
								hi=thresh;
1115
								stable_thresh = thresh;
1116
								continue;
1117
							}else{
1118
								lo=thresh;
1119
							}
1120
						}
1121
					}else{
1122
						distoachieved =	(layno == 0) ?
1123
							tcd_tile->distolayer[0]	: (cumdisto[layno - 1] + tcd_tile->distolayer[layno]);
1124
						if (distoachieved < distotarget) {
1125
							hi = thresh;
1126
							stable_thresh = thresh;
1127
							continue;
1128
						}
1129
						lo = thresh;
1130
					}
1131
				} else {
1132
					l = t2_encode_packets(t2, tcd->tcd_tileno, tcd_tile, layno + 1, dest, maxlen, cstr_info,tcd->cur_tp_num,tcd->tp_pos,tcd->cur_pino,THRESH_CALC, tcd->cur_totnum_tp);
1133
					/* TODO: what to do with l ??? seek / tell ??? */
1134
					/* opj_event_msg(tcd->cinfo, EVT_INFO, "rate alloc: len=%d, max=%d\n", l, maxlen); */
1135
					if (l == -999) {
1136
						lo = thresh;
1137
						continue;
1138
					}
1139
					hi = thresh;
1140
					stable_thresh = thresh;
1141
				}
1142
			}
1143
			success = 1;
1144
			goodthresh = stable_thresh == 0? thresh : stable_thresh;
1145
			t2_destroy(t2);
1146
		} else {
1147
			success = 1;
1148
			goodthresh = min;
1149
		}
1150
 
1151
		if (!success) {
1152
			return false;
1153
		}
1154
 
1155
		if(cstr_info) {	/* Threshold for Marcela Index */
1156
			cstr_info->tile[tcd->tcd_tileno].thresh[layno] = goodthresh;
1157
		}
1158
		tcd_makelayer(tcd, layno, goodthresh, 1);
1159
 
1160
		/* fixed_quality */
1161
		cumdisto[layno] = (layno == 0) ? tcd_tile->distolayer[0] : (cumdisto[layno - 1] + tcd_tile->distolayer[layno]);
1162
	}
1163
 
1164
	return true;
1165
}
1166
 
1167
int tcd_encode_tile(opj_tcd_t *tcd, int tileno, unsigned char *dest, int len, opj_codestream_info_t *cstr_info) {
1168
	int compno;
1169
	int l, i, numpacks = 0;
1170
	opj_tcd_tile_t *tile = NULL;
1171
	opj_tcp_t *tcd_tcp = NULL;
1172
	opj_cp_t *cp = NULL;
1173
 
1174
	opj_tcp_t *tcp = &tcd->cp->tcps[0];
1175
	opj_tccp_t *tccp = &tcp->tccps[0];
1176
	opj_image_t *image = tcd->image;
1177
 
1178
	opj_t1_t *t1 = NULL;		/* T1 component */
1179
	opj_t2_t *t2 = NULL;		/* T2 component */
1180
 
1181
	tcd->tcd_tileno = tileno;
1182
	tcd->tcd_tile = tcd->tcd_image->tiles;
1183
	tcd->tcp = &tcd->cp->tcps[tileno];
1184
 
1185
	tile = tcd->tcd_tile;
1186
	tcd_tcp = tcd->tcp;
1187
	cp = tcd->cp;
1188
 
1189
	if(tcd->cur_tp_num == 0){
1190
		tcd->encoding_time = opj_clock();	/* time needed to encode a tile */
1191
		/* INDEX >> "Precinct_nb_X et Precinct_nb_Y" */
1192
		if(cstr_info) {
1193
			opj_tcd_tilecomp_t *tilec_idx = &tile->comps[0];	/* based on component 0 */
1194
			for (i = 0; i < tilec_idx->numresolutions; i++) {
1195
				opj_tcd_resolution_t *res_idx = &tilec_idx->resolutions[i];
1196
 
1197
				cstr_info->tile[tileno].pw[i] = res_idx->pw;
1198
				cstr_info->tile[tileno].ph[i] = res_idx->ph;
1199
 
1200
				numpacks += res_idx->pw * res_idx->ph;
1201
 
1202
				cstr_info->tile[tileno].pdx[i] = tccp->prcw[i];
1203
				cstr_info->tile[tileno].pdy[i] = tccp->prch[i];
1204
			}
1205
			cstr_info->tile[tileno].packet = (opj_packet_info_t*) opj_calloc(cstr_info->numcomps * cstr_info->numlayers * numpacks, sizeof(opj_packet_info_t));
1206
		}
1207
		/* << INDEX */
1208
 
1209
		/*---------------TILE-------------------*/
1210
 
1211
		for (compno = 0; compno < tile->numcomps; compno++) {
1212
			int x, y;
1213
 
1214
			int adjust = image->comps[compno].sgnd ? 0 : 1 << (image->comps[compno].prec - 1);
1215
			int offset_x = int_ceildiv(image->x0, image->comps[compno].dx);
1216
			int offset_y = int_ceildiv(image->y0, image->comps[compno].dy);
1217
 
1218
			opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
1219
			int tw = tilec->x1 - tilec->x0;
1220
			int w = int_ceildiv(image->x1 - image->x0, image->comps[compno].dx);
1221
 
1222
			/* extract tile data */
1223
 
1224
			if (tcd_tcp->tccps[compno].qmfbid == 1) {
1225
				for (y = tilec->y0; y < tilec->y1; y++) {
1226
					/* start of the src tile scanline */
1227
					int *data = &image->comps[compno].data[(tilec->x0 - offset_x) + (y - offset_y) * w];
1228
					/* start of the dst tile scanline */
1229
					int *tile_data = &tilec->data[(y - tilec->y0) * tw];
1230
					for (x = tilec->x0; x < tilec->x1; x++) {
1231
						*tile_data++ = *data++ - adjust;
1232
					}
1233
				}
1234
			} else if (tcd_tcp->tccps[compno].qmfbid == 0) {
1235
				for (y = tilec->y0; y < tilec->y1; y++) {
1236
					/* start of the src tile scanline */
1237
					int *data = &image->comps[compno].data[(tilec->x0 - offset_x) + (y - offset_y) * w];
1238
					/* start of the dst tile scanline */
1239
					int *tile_data = &tilec->data[(y - tilec->y0) * tw];
1240
					for (x = tilec->x0; x < tilec->x1; x++) {
1241
						*tile_data++ = (*data++ - adjust) << 11;
1242
					}
1243
 
1244
				}
1245
			}
1246
		}
1247
 
1248
		/*----------------MCT-------------------*/
1249
		if (tcd_tcp->mct) {
1250
			int samples = (tile->comps[0].x1 - tile->comps[0].x0) * (tile->comps[0].y1 - tile->comps[0].y0);
1251
			if (tcd_tcp->tccps[0].qmfbid == 0) {
1252
				mct_encode_real(tile->comps[0].data, tile->comps[1].data, tile->comps[2].data, samples);
1253
			} else {
1254
				mct_encode(tile->comps[0].data, tile->comps[1].data, tile->comps[2].data, samples);
1255
			}
1256
		}
1257
 
1258
		/*----------------DWT---------------------*/
1259
 
1260
		for (compno = 0; compno < tile->numcomps; compno++) {
1261
			opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
1262
			if (tcd_tcp->tccps[compno].qmfbid == 1) {
1263
				dwt_encode(tilec);
1264
			} else if (tcd_tcp->tccps[compno].qmfbid == 0) {
1265
				dwt_encode_real(tilec);
1266
			}
1267
		}
1268
 
1269
		/*------------------TIER1-----------------*/
1270
		t1 = t1_create(tcd->cinfo);
1271
		t1_encode_cblks(t1, tile, tcd_tcp);
1272
		t1_destroy(t1);
1273
 
1274
		/*-----------RATE-ALLOCATE------------------*/
1275
 
1276
		/* INDEX */
1277
		if(cstr_info) {
1278
			cstr_info->index_write = 0;
1279
		}
1280
		if (cp->disto_alloc || cp->fixed_quality) {	/* fixed_quality */
1281
			/* Normal Rate/distortion allocation */
1282
			tcd_rateallocate(tcd, dest, len, cstr_info);
1283
		} else {
1284
			/* Fixed layer allocation */
1285
			tcd_rateallocate_fixed(tcd);
1286
		}
1287
	}
1288
	/*--------------TIER2------------------*/
1289
 
1290
	/* INDEX */
1291
	if(cstr_info) {
1292
		cstr_info->index_write = 1;
1293
	}
1294
 
1295
	t2 = t2_create(tcd->cinfo, image, cp);
1296
	l = t2_encode_packets(t2,tileno, tile, tcd_tcp->numlayers, dest, len, cstr_info,tcd->tp_num,tcd->tp_pos,tcd->cur_pino,FINAL_PASS,tcd->cur_totnum_tp);
1297
	t2_destroy(t2);
1298
 
1299
	/*---------------CLEAN-------------------*/
1300
 
1301
 
1302
	if(tcd->cur_tp_num == tcd->cur_totnum_tp - 1){
1303
		tcd->encoding_time = opj_clock() - tcd->encoding_time;
1304
		opj_event_msg(tcd->cinfo, EVT_INFO, "- tile encoded in %f s\n", tcd->encoding_time);
1305
 
1306
		/* cleaning memory */
1307
		for (compno = 0; compno < tile->numcomps; compno++) {
1308
			opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
1309
			opj_aligned_free(tilec->data);
1310
		}
1311
	}
1312
 
1313
	return l;
1314
}
1315
 
1316
bool tcd_decode_tile(opj_tcd_t *tcd, unsigned char *src, int len, int tileno, opj_codestream_info_t *cstr_info) {
1317
	int l;
1318
	int compno;
1319
	int eof = 0;
1320
	double tile_time, t1_time, dwt_time;
1321
	opj_tcd_tile_t *tile = NULL;
1322
 
1323
	opj_t1_t *t1 = NULL;		/* T1 component */
1324
	opj_t2_t *t2 = NULL;		/* T2 component */
1325
 
1326
	tcd->tcd_tileno = tileno;
1327
	tcd->tcd_tile = &(tcd->tcd_image->tiles[tileno]);
1328
	tcd->tcp = &(tcd->cp->tcps[tileno]);
1329
	tile = tcd->tcd_tile;
1330
 
1331
	tile_time = opj_clock();	/* time needed to decode a tile */
1332
	opj_event_msg(tcd->cinfo, EVT_INFO, "tile %d of %d\n", tileno + 1, tcd->cp->tw * tcd->cp->th);
1333
 
1334
	/* INDEX >>  */
1335
	if(cstr_info) {
1336
		int resno, compno, numprec = 0;
1337
		for (compno = 0; compno < cstr_info->numcomps; compno++) {
1338
			opj_tcp_t *tcp = &tcd->cp->tcps[0];
1339
			opj_tccp_t *tccp = &tcp->tccps[compno];
1340
			opj_tcd_tilecomp_t *tilec_idx = &tile->comps[compno];
1341
			for (resno = 0; resno < tilec_idx->numresolutions; resno++) {
1342
				opj_tcd_resolution_t *res_idx = &tilec_idx->resolutions[resno];
1343
				cstr_info->tile[tileno].pw[resno] = res_idx->pw;
1344
				cstr_info->tile[tileno].ph[resno] = res_idx->ph;
1345
				numprec += res_idx->pw * res_idx->ph;
1346
				if (tccp->csty & J2K_CP_CSTY_PRT) {
1347
					cstr_info->tile[tileno].pdx[resno] = tccp->prcw[resno];
1348
					cstr_info->tile[tileno].pdy[resno] = tccp->prch[resno];
1349
				}
1350
				else {
1351
					cstr_info->tile[tileno].pdx[resno] = 15;
1352
					cstr_info->tile[tileno].pdx[resno] = 15;
1353
				}
1354
			}
1355
		}
1356
		cstr_info->tile[tileno].packet = (opj_packet_info_t *) opj_malloc(cstr_info->numlayers * numprec * sizeof(opj_packet_info_t));
1357
		cstr_info->packno = 0;
1358
	}
1359
	/* << INDEX */
1360
 
1361
	/*--------------TIER2------------------*/
1362
 
1363
	t2 = t2_create(tcd->cinfo, tcd->image, tcd->cp);
1364
	l = t2_decode_packets(t2, src, len, tileno, tile, cstr_info);
1365
	t2_destroy(t2);
1366
 
1367
	if (l == -999) {
1368
		eof = 1;
1369
		opj_event_msg(tcd->cinfo, EVT_ERROR, "tcd_decode: incomplete bistream\n");
1370
	}
1371
 
1372
	/*------------------TIER1-----------------*/
1373
 
1374
	t1_time = opj_clock();	/* time needed to decode a tile */
1375
	t1 = t1_create(tcd->cinfo);
1376
	for (compno = 0; compno < tile->numcomps; ++compno) {
1377
		opj_tcd_tilecomp_t* tilec = &tile->comps[compno];
1378
		/* The +3 is headroom required by the vectorized DWT */
1379
		tilec->data = (int*) opj_aligned_malloc((((tilec->x1 - tilec->x0) * (tilec->y1 - tilec->y0))+3) * sizeof(int));
1380
		t1_decode_cblks(t1, tilec, &tcd->tcp->tccps[compno]);
1381
	}
1382
	t1_destroy(t1);
1383
	t1_time = opj_clock() - t1_time;
1384
	opj_event_msg(tcd->cinfo, EVT_INFO, "- tiers-1 took %f s\n", t1_time);
1385
 
1386
	/*----------------DWT---------------------*/
1387
 
1388
	dwt_time = opj_clock();	/* time needed to decode a tile */
1389
	for (compno = 0; compno < tile->numcomps; compno++) {
1390
		opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
1391
		int numres2decode;
1392
 
1393
		if (tcd->cp->reduce != 0) {
1394
			tcd->image->comps[compno].resno_decoded =
1395
				tile->comps[compno].numresolutions - tcd->cp->reduce - 1;
1396
			if (tcd->image->comps[compno].resno_decoded < 0) {
1397
				opj_event_msg(tcd->cinfo, EVT_ERROR, "Error decoding tile. The number of resolutions to remove [%d+1] is higher than the number "
1398
					" of resolutions in the original codestream [%d]\nModify the cp_reduce parameter.\n", tcd->cp->reduce, tile->comps[compno].numresolutions);
1399
				return false;
1400
			}
1401
		}
1402
 
1403
		numres2decode = tcd->image->comps[compno].resno_decoded + 1;
1404
		if(numres2decode > 0){
1405
			if (tcd->tcp->tccps[compno].qmfbid == 1) {
1406
				dwt_decode(tilec, numres2decode);
1407
			} else {
1408
				dwt_decode_real(tilec, numres2decode);
1409
			}
1410
		}
1411
	}
1412
	dwt_time = opj_clock() - dwt_time;
1413
	opj_event_msg(tcd->cinfo, EVT_INFO, "- dwt took %f s\n", dwt_time);
1414
 
1415
	/*----------------MCT-------------------*/
1416
 
1417
	if (tcd->tcp->mct) {
1418
		int n = (tile->comps[0].x1 - tile->comps[0].x0) * (tile->comps[0].y1 - tile->comps[0].y0);
1419
		if (tcd->tcp->tccps[0].qmfbid == 1) {
1420
			mct_decode(
1421
					tile->comps[0].data,
1422
					tile->comps[1].data,
1423
					tile->comps[2].data,
1424
					n);
1425
		} else {
1426
			mct_decode_real(
1427
					(float*)tile->comps[0].data,
1428
					(float*)tile->comps[1].data,
1429
					(float*)tile->comps[2].data,
1430
					n);
1431
		}
1432
	}
1433
 
1434
	/*---------------TILE-------------------*/
1435
 
1436
	for (compno = 0; compno < tile->numcomps; ++compno) {
1437
		opj_tcd_tilecomp_t* tilec = &tile->comps[compno];
1438
		opj_image_comp_t* imagec = &tcd->image->comps[compno];
1439
		opj_tcd_resolution_t* res = &tilec->resolutions[imagec->resno_decoded];
1440
		int adjust = imagec->sgnd ? 0 : 1 << (imagec->prec - 1);
1441
		int min = imagec->sgnd ? -(1 << (imagec->prec - 1)) : 0;
1442
		int max = imagec->sgnd ?  (1 << (imagec->prec - 1)) - 1 : (1 << imagec->prec) - 1;
1443
 
1444
		int tw = tilec->x1 - tilec->x0;
1445
		int w = imagec->w;
1446
 
1447
		int offset_x = int_ceildivpow2(imagec->x0, imagec->factor);
1448
		int offset_y = int_ceildivpow2(imagec->y0, imagec->factor);
1449
 
1450
		int i, j;
1451
		if(!imagec->data){
1452
			imagec->data = (int*) opj_malloc(imagec->w * imagec->h * sizeof(int));
1453
		}
1454
		if(tcd->tcp->tccps[compno].qmfbid == 1) {
1455
			for(j = res->y0; j < res->y1; ++j) {
1456
				for(i = res->x0; i < res->x1; ++i) {
1457
					int v = tilec->data[i - res->x0 + (j - res->y0) * tw];
1458
					v += adjust;
1459
					imagec->data[(i - offset_x) + (j - offset_y) * w] = int_clamp(v, min, max);
1460
				}
1461
			}
1462
		}else{
1463
			for(j = res->y0; j < res->y1; ++j) {
1464
				for(i = res->x0; i < res->x1; ++i) {
1465
					float tmp = ((float*)tilec->data)[i - res->x0 + (j - res->y0) * tw];
1466
					int v = lrintf(tmp);
1467
					v += adjust;
1468
					imagec->data[(i - offset_x) + (j - offset_y) * w] = int_clamp(v, min, max);
1469
				}
1470
			}
1471
		}
1472
		opj_aligned_free(tilec->data);
1473
	}
1474
 
1475
	tile_time = opj_clock() - tile_time;	/* time needed to decode a tile */
1476
	opj_event_msg(tcd->cinfo, EVT_INFO, "- tile decoded in %f s\n", tile_time);
1477
 
1478
	if (eof) {
1479
		return false;
1480
	}
1481
 
1482
	return true;
1483
}
1484
 
1485
void tcd_free_decode(opj_tcd_t *tcd) {
1486
	opj_tcd_image_t *tcd_image = tcd->tcd_image;
1487
	opj_free(tcd_image->tiles);
1488
}
1489
 
1490
void tcd_free_decode_tile(opj_tcd_t *tcd, int tileno) {
1491
	int compno,resno,bandno,precno;
1492
 
1493
	opj_tcd_image_t *tcd_image = tcd->tcd_image;
1494
 
1495
	opj_tcd_tile_t *tile = &tcd_image->tiles[tileno];
1496
	for (compno = 0; compno < tile->numcomps; compno++) {
1497
		opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
1498
		for (resno = 0; resno < tilec->numresolutions; resno++) {
1499
			opj_tcd_resolution_t *res = &tilec->resolutions[resno];
1500
			for (bandno = 0; bandno < res->numbands; bandno++) {
1501
				opj_tcd_band_t *band = &res->bands[bandno];
1502
				for (precno = 0; precno < res->ph * res->pw; precno++) {
1503
					opj_tcd_precinct_t *prec = &band->precincts[precno];
1504
					if (prec->imsbtree != NULL) tgt_destroy(prec->imsbtree);
1505
					if (prec->incltree != NULL) tgt_destroy(prec->incltree);
1506
				}
1507
				opj_free(band->precincts);
1508
			}
1509
		}
1510
		opj_free(tilec->resolutions);
1511
	}
1512
	opj_free(tile->comps);
1513
}
1514