|  |  | @@ -732,85 +732,103 @@ static int jpeg2000_decode_packet(Jpeg2000DecoderContext *s, | 
		
	
		
			
			|  |  |  | return 0; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | static int jpeg2000_decode_packets(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile) | 
		
	
		
			
			|  |  |  | static int decode_pgod_lrcp(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | int ret = 0; | 
		
	
		
			
			|  |  |  | int layno, reslevelno, compno, precno, ok_reslevel; | 
		
	
		
			
			|  |  |  | int x, y; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | s->bit_index = 8; | 
		
	
		
			
			|  |  |  | switch (tile->codsty[0].prog_order) { | 
		
	
		
			
			|  |  |  | case JPEG2000_PGOD_LRCP: | 
		
	
		
			
			|  |  |  | for (layno = 0; layno < tile->codsty[0].nlayers; layno++) { | 
		
	
		
			
			|  |  |  | ok_reslevel = 1; | 
		
	
		
			
			|  |  |  | for (reslevelno = 0; ok_reslevel; reslevelno++) { | 
		
	
		
			
			|  |  |  | ok_reslevel = 0; | 
		
	
		
			
			|  |  |  | for (compno = 0; compno < s->ncomponents; compno++) { | 
		
	
		
			
			|  |  |  | Jpeg2000CodingStyle *codsty = tile->codsty + compno; | 
		
	
		
			
			|  |  |  | Jpeg2000QuantStyle *qntsty  = tile->qntsty + compno; | 
		
	
		
			
			|  |  |  | if (reslevelno < codsty->nreslevels) { | 
		
	
		
			
			|  |  |  | Jpeg2000ResLevel *rlevel = tile->comp[compno].reslevel + | 
		
	
		
			
			|  |  |  | reslevelno; | 
		
	
		
			
			|  |  |  | ok_reslevel = 1; | 
		
	
		
			
			|  |  |  | for (precno = 0; precno < rlevel->num_precincts_x * rlevel->num_precincts_y; precno++) | 
		
	
		
			
			|  |  |  | if ((ret = jpeg2000_decode_packet(s, | 
		
	
		
			
			|  |  |  | codsty, rlevel, | 
		
	
		
			
			|  |  |  | precno, layno, | 
		
	
		
			
			|  |  |  | qntsty->expn + (reslevelno ? 3 * (reslevelno - 1) + 1 : 0), | 
		
	
		
			
			|  |  |  | qntsty->nguardbits)) < 0) | 
		
	
		
			
			|  |  |  | return ret; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | int ret; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | for (layno = 0; layno < tile->codsty[0].nlayers; layno++) { | 
		
	
		
			
			|  |  |  | ok_reslevel = 1; | 
		
	
		
			
			|  |  |  | for (reslevelno = 0; ok_reslevel; reslevelno++) { | 
		
	
		
			
			|  |  |  | ok_reslevel = 0; | 
		
	
		
			
			|  |  |  | for (compno = 0; compno < s->ncomponents; compno++) { | 
		
	
		
			
			|  |  |  | Jpeg2000CodingStyle *codsty = tile->codsty + compno; | 
		
	
		
			
			|  |  |  | Jpeg2000QuantStyle *qntsty  = tile->qntsty + compno; | 
		
	
		
			
			|  |  |  | if (reslevelno < codsty->nreslevels) { | 
		
	
		
			
			|  |  |  | Jpeg2000ResLevel *rlevel = tile->comp[compno].reslevel + | 
		
	
		
			
			|  |  |  | reslevelno; | 
		
	
		
			
			|  |  |  | ok_reslevel = 1; | 
		
	
		
			
			|  |  |  | for (precno = 0; precno < rlevel->num_precincts_x * rlevel->num_precincts_y; precno++) | 
		
	
		
			
			|  |  |  | if ((ret = jpeg2000_decode_packet(s, | 
		
	
		
			
			|  |  |  | codsty, rlevel, | 
		
	
		
			
			|  |  |  | precno, layno, | 
		
	
		
			
			|  |  |  | qntsty->expn + (reslevelno ? 3 * (reslevelno - 1) + 1 : 0), | 
		
	
		
			
			|  |  |  | qntsty->nguardbits)) < 0) | 
		
	
		
			
			|  |  |  | return ret; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | break; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | case JPEG2000_PGOD_CPRL: | 
		
	
		
			
			|  |  |  | for (compno = 0; compno < s->ncomponents; compno++) { | 
		
	
		
			
			|  |  |  | Jpeg2000CodingStyle *codsty = tile->codsty + compno; | 
		
	
		
			
			|  |  |  | Jpeg2000QuantStyle *qntsty  = tile->qntsty + compno; | 
		
	
		
			
			|  |  |  | return 0; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | /* Set bit stream buffer address according to tile-part. | 
		
	
		
			
			|  |  |  | * For DCinema one tile-part per component, so can be | 
		
	
		
			
			|  |  |  | * indexed by component. */ | 
		
	
		
			
			|  |  |  | s->g = tile->tile_part[compno].tpg; | 
		
	
		
			
			|  |  |  | static int decode_pgod_cprl(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | int layno, reslevelno, compno, precno; | 
		
	
		
			
			|  |  |  | int ret, x, y; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | for (compno = 0; compno < s->ncomponents; compno++) { | 
		
	
		
			
			|  |  |  | Jpeg2000CodingStyle *codsty = tile->codsty + compno; | 
		
	
		
			
			|  |  |  | Jpeg2000QuantStyle *qntsty  = tile->qntsty + compno; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | /* Set bit stream buffer address according to tile-part. | 
		
	
		
			
			|  |  |  | * For DCinema one tile-part per component, so can be | 
		
	
		
			
			|  |  |  | * indexed by component. */ | 
		
	
		
			
			|  |  |  | s->g = tile->tile_part[compno].tpg; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | /* Position loop (y axis) | 
		
	
		
			
			|  |  |  | * TODO: Automate computing of step 256. | 
		
	
		
			
			|  |  |  | * Fixed here, but to be computed before entering here. */ | 
		
	
		
			
			|  |  |  | for (y = 0; y < s->height; y += 256) { | 
		
	
		
			
			|  |  |  | /* Position loop (y axis) | 
		
	
		
			
			|  |  |  | * TODO: Automate computing of step 256. | 
		
	
		
			
			|  |  |  | * TODO: automate computing of step 256. | 
		
	
		
			
			|  |  |  | * Fixed here, but to be computed before entering here. */ | 
		
	
		
			
			|  |  |  | for (y = 0; y < s->height; y += 256) { | 
		
	
		
			
			|  |  |  | /* Position loop (y axis) | 
		
	
		
			
			|  |  |  | * TODO: automate computing of step 256. | 
		
	
		
			
			|  |  |  | * Fixed here, but to be computed before entering here. */ | 
		
	
		
			
			|  |  |  | for (x = 0; x < s->width; x += 256) { | 
		
	
		
			
			|  |  |  | for (reslevelno = 0; reslevelno < codsty->nreslevels; reslevelno++) { | 
		
	
		
			
			|  |  |  | uint16_t prcx, prcy; | 
		
	
		
			
			|  |  |  | uint8_t reducedresno = codsty->nreslevels - 1 -reslevelno; //  ==> N_L - r | 
		
	
		
			
			|  |  |  | Jpeg2000ResLevel *rlevel = tile->comp[compno].reslevel + reslevelno; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | if (!((y % (1 << (rlevel->log2_prec_height + reducedresno)) == 0) || | 
		
	
		
			
			|  |  |  | (y == 0))) // TODO: 2nd condition simplified as try0 always =0 for dcinema | 
		
	
		
			
			|  |  |  | continue; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | if (!((x % (1 << (rlevel->log2_prec_width + reducedresno)) == 0) || | 
		
	
		
			
			|  |  |  | (x == 0))) // TODO: 2nd condition simplified as try0 always =0 for dcinema | 
		
	
		
			
			|  |  |  | continue; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | // check if a precinct exists | 
		
	
		
			
			|  |  |  | prcx   = ff_jpeg2000_ceildivpow2(x, reducedresno) >> rlevel->log2_prec_width; | 
		
	
		
			
			|  |  |  | prcy   = ff_jpeg2000_ceildivpow2(y, reducedresno) >> rlevel->log2_prec_height; | 
		
	
		
			
			|  |  |  | precno = prcx + rlevel->num_precincts_x * prcy; | 
		
	
		
			
			|  |  |  | for (layno = 0; layno < tile->codsty[0].nlayers; layno++) { | 
		
	
		
			
			|  |  |  | if ((ret = jpeg2000_decode_packet(s, codsty, rlevel, | 
		
	
		
			
			|  |  |  | precno, layno, | 
		
	
		
			
			|  |  |  | qntsty->expn + (reslevelno ? 3 * (reslevelno - 1) + 1 : 0), | 
		
	
		
			
			|  |  |  | qntsty->nguardbits)) < 0) | 
		
	
		
			
			|  |  |  | return ret; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | for (x = 0; x < s->width; x += 256) { | 
		
	
		
			
			|  |  |  | for (reslevelno = 0; reslevelno < codsty->nreslevels; reslevelno++) { | 
		
	
		
			
			|  |  |  | uint16_t prcx, prcy; | 
		
	
		
			
			|  |  |  | uint8_t reducedresno = codsty->nreslevels - 1 -reslevelno; //  ==> N_L - r | 
		
	
		
			
			|  |  |  | Jpeg2000ResLevel *rlevel = tile->comp[compno].reslevel + reslevelno; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | if (!((y % (1 << (rlevel->log2_prec_height + reducedresno)) == 0) || | 
		
	
		
			
			|  |  |  | (y == 0))) // TODO: 2nd condition simplified as try0 always =0 for dcinema | 
		
	
		
			
			|  |  |  | continue; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | if (!((x % (1 << (rlevel->log2_prec_width + reducedresno)) == 0) || | 
		
	
		
			
			|  |  |  | (x == 0))) // TODO: 2nd condition simplified as try0 always =0 for dcinema | 
		
	
		
			
			|  |  |  | continue; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | // check if a precinct exists | 
		
	
		
			
			|  |  |  | prcx   = ff_jpeg2000_ceildivpow2(x, reducedresno) >> rlevel->log2_prec_width; | 
		
	
		
			
			|  |  |  | prcy   = ff_jpeg2000_ceildivpow2(y, reducedresno) >> rlevel->log2_prec_height; | 
		
	
		
			
			|  |  |  | precno = prcx + rlevel->num_precincts_x * prcy; | 
		
	
		
			
			|  |  |  | for (layno = 0; layno < tile->codsty[0].nlayers; layno++) { | 
		
	
		
			
			|  |  |  | if ((ret = jpeg2000_decode_packet(s, codsty, rlevel, | 
		
	
		
			
			|  |  |  | precno, layno, | 
		
	
		
			
			|  |  |  | qntsty->expn + (reslevelno ? 3 * (reslevelno - 1) + 1 : 0), | 
		
	
		
			
			|  |  |  | qntsty->nguardbits)) < 0) | 
		
	
		
			
			|  |  |  | return ret; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | return 0; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | static int jpeg2000_decode_packets(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | int ret = 0; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | s->bit_index = 8; | 
		
	
		
			
			|  |  |  | switch (tile->codsty[0].prog_order) { | 
		
	
		
			
			|  |  |  | case JPEG2000_PGOD_LRCP: | 
		
	
		
			
			|  |  |  | ret = decode_pgod_lrcp(s, tile); | 
		
	
		
			
			|  |  |  | break; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | case JPEG2000_PGOD_CPRL: | 
		
	
		
			
			|  |  |  | ret = decode_pgod_cprl(s, tile); | 
		
	
		
			
			|  |  |  | break; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | case JPEG2000_PGOD_RLCP: | 
		
	
	
		
			
				|  |  | 
 |