aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLuca Barbato <lu_zero@gentoo.org>2015-09-11 04:29:49 +0200
committerLuca Barbato <lu_zero@gentoo.org>2015-09-14 14:31:25 +0200
commit1b709f23fb5f505c834d4c855703225795def01d (patch)
treeb46f6cfc5b890bb03a52a3cfe9e778e64922f719
parent29b00f880faa404aa1d0d6820310c510c5996479 (diff)
downloadffmpeg-1b709f23fb5f505c834d4c855703225795def01d.tar.gz
jpeg2000: Refactor decode_packets
Move the packet-specific parsers in separate functions.
-rw-r--r--libavcodec/jpeg2000dec.c148
1 files changed, 83 insertions, 65 deletions
diff --git a/libavcodec/jpeg2000dec.c b/libavcodec/jpeg2000dec.c
index 28085daf94..6f74eefc89 100644
--- a/libavcodec/jpeg2000dec.c
+++ b/libavcodec/jpeg2000dec.c
@@ -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: