mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
jpeg2000: Refactor decode_packets
Move the packet-specific parsers in separate functions.
This commit is contained in:
parent
29b00f880f
commit
1b709f23fb
@ -732,85 +732,103 @@ static int jpeg2000_decode_packet(Jpeg2000DecoderContext *s,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int decode_pgod_lrcp(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile)
|
||||
{
|
||||
int layno, reslevelno, compno, precno, ok_reslevel;
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
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.
|
||||
* 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int jpeg2000_decode_packets(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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
ret = decode_pgod_lrcp(s, tile);
|
||||
break;
|
||||
|
||||
case JPEG2000_PGOD_CPRL:
|
||||
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.
|
||||
* 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
ret = decode_pgod_cprl(s, tile);
|
||||
break;
|
||||
|
||||
case JPEG2000_PGOD_RLCP:
|
||||
|
Loading…
Reference in New Issue
Block a user