diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2015-06-26 00:14:01 +0200 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2015-06-26 01:00:17 +0200 |
commit | f1e173049ecc9de03817385ba8962d14cba779db (patch) | |
tree | 3f7b64ee98dc6804b5124d0d414bf5255b0624a5 | |
parent | 8c22143e7e006bb66bc380a874ceb609b62d8997 (diff) | |
download | ffmpeg-f1e173049ecc9de03817385ba8962d14cba779db.tar.gz |
avcodec/jpeg2000: Remove CBLK limit
This also reduces the amount of memory needed
Fixes Ticket4672
The new code seems slightly faster as well, probably due to better cache usage
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
-rw-r--r-- | libavcodec/j2kenc.c | 89 | ||||
-rw-r--r-- | libavcodec/jpeg2000.c | 26 | ||||
-rw-r--r-- | libavcodec/jpeg2000.h | 9 | ||||
-rw-r--r-- | libavcodec/jpeg2000dec.c | 67 |
4 files changed, 92 insertions, 99 deletions
diff --git a/libavcodec/j2kenc.c b/libavcodec/j2kenc.c index 293515c1ee..dcdf4112c0 100644 --- a/libavcodec/j2kenc.c +++ b/libavcodec/j2kenc.c @@ -493,18 +493,18 @@ static void encode_sigpass(Jpeg2000T1Context *t1, int width, int height, int ban for (y0 = 0; y0 < height; y0 += 4) for (x = 0; x < width; x++) for (y = y0; y < height && y < y0+4; y++){ - if (!(t1->flags[y+1][x+1] & JPEG2000_T1_SIG) && (t1->flags[y+1][x+1] & JPEG2000_T1_SIG_NB)){ - int ctxno = ff_jpeg2000_getsigctxno(t1->flags[y+1][x+1], bandno), - bit = t1->data[y][x] & mask ? 1 : 0; + if (!(t1->flags[(y+1) * t1->stride + x+1] & JPEG2000_T1_SIG) && (t1->flags[(y+1) * t1->stride + x+1] & JPEG2000_T1_SIG_NB)){ + int ctxno = ff_jpeg2000_getsigctxno(t1->flags[(y+1) * t1->stride + x+1], bandno), + bit = t1->data[(y) * t1->stride + x] & mask ? 1 : 0; ff_mqc_encode(&t1->mqc, t1->mqc.cx_states + ctxno, bit); if (bit){ int xorbit; - int ctxno = ff_jpeg2000_getsgnctxno(t1->flags[y+1][x+1], &xorbit); - ff_mqc_encode(&t1->mqc, t1->mqc.cx_states + ctxno, (t1->flags[y+1][x+1] >> 15) ^ xorbit); - *nmsedec += getnmsedec_sig(t1->data[y][x], bpno + NMSEDEC_FRACBITS); - ff_jpeg2000_set_significance(t1, x, y, t1->flags[y+1][x+1] >> 15); + int ctxno = ff_jpeg2000_getsgnctxno(t1->flags[(y+1) * t1->stride + x+1], &xorbit); + ff_mqc_encode(&t1->mqc, t1->mqc.cx_states + ctxno, (t1->flags[(y+1) * t1->stride + x+1] >> 15) ^ xorbit); + *nmsedec += getnmsedec_sig(t1->data[(y) * t1->stride + x], bpno + NMSEDEC_FRACBITS); + ff_jpeg2000_set_significance(t1, x, y, t1->flags[(y+1) * t1->stride + x+1] >> 15); } - t1->flags[y+1][x+1] |= JPEG2000_T1_VIS; + t1->flags[(y+1) * t1->stride + x+1] |= JPEG2000_T1_VIS; } } } @@ -515,11 +515,11 @@ static void encode_refpass(Jpeg2000T1Context *t1, int width, int height, int *nm for (y0 = 0; y0 < height; y0 += 4) for (x = 0; x < width; x++) for (y = y0; y < height && y < y0+4; y++) - if ((t1->flags[y+1][x+1] & (JPEG2000_T1_SIG | JPEG2000_T1_VIS)) == JPEG2000_T1_SIG){ - int ctxno = ff_jpeg2000_getrefctxno(t1->flags[y+1][x+1]); - *nmsedec += getnmsedec_ref(t1->data[y][x], bpno + NMSEDEC_FRACBITS); - ff_mqc_encode(&t1->mqc, t1->mqc.cx_states + ctxno, t1->data[y][x] & mask ? 1:0); - t1->flags[y+1][x+1] |= JPEG2000_T1_REF; + if ((t1->flags[(y+1) * t1->stride + x+1] & (JPEG2000_T1_SIG | JPEG2000_T1_VIS)) == JPEG2000_T1_SIG){ + int ctxno = ff_jpeg2000_getrefctxno(t1->flags[(y+1) * t1->stride + x+1]); + *nmsedec += getnmsedec_ref(t1->data[(y) * t1->stride + x], bpno + NMSEDEC_FRACBITS); + ff_mqc_encode(&t1->mqc, t1->mqc.cx_states + ctxno, t1->data[(y) * t1->stride + x] & mask ? 1:0); + t1->flags[(y+1) * t1->stride + x+1] |= JPEG2000_T1_REF; } } @@ -529,15 +529,15 @@ static void encode_clnpass(Jpeg2000T1Context *t1, int width, int height, int ban for (y0 = 0; y0 < height; y0 += 4) for (x = 0; x < width; x++){ if (y0 + 3 < height && !( - (t1->flags[y0+1][x+1] & (JPEG2000_T1_SIG_NB | JPEG2000_T1_VIS | JPEG2000_T1_SIG)) || - (t1->flags[y0+2][x+1] & (JPEG2000_T1_SIG_NB | JPEG2000_T1_VIS | JPEG2000_T1_SIG)) || - (t1->flags[y0+3][x+1] & (JPEG2000_T1_SIG_NB | JPEG2000_T1_VIS | JPEG2000_T1_SIG)) || - (t1->flags[y0+4][x+1] & (JPEG2000_T1_SIG_NB | JPEG2000_T1_VIS | JPEG2000_T1_SIG)))) + (t1->flags[(y0+1) * t1->stride + x+1] & (JPEG2000_T1_SIG_NB | JPEG2000_T1_VIS | JPEG2000_T1_SIG)) || + (t1->flags[(y0+2) * t1->stride + x+1] & (JPEG2000_T1_SIG_NB | JPEG2000_T1_VIS | JPEG2000_T1_SIG)) || + (t1->flags[(y0+3) * t1->stride + x+1] & (JPEG2000_T1_SIG_NB | JPEG2000_T1_VIS | JPEG2000_T1_SIG)) || + (t1->flags[(y0+4) * t1->stride + x+1] & (JPEG2000_T1_SIG_NB | JPEG2000_T1_VIS | JPEG2000_T1_SIG)))) { // aggregation mode int rlen; for (rlen = 0; rlen < 4; rlen++) - if (t1->data[y0+rlen][x] & mask) + if (t1->data[(y0+rlen) * t1->stride + x] & mask) break; ff_mqc_encode(&t1->mqc, t1->mqc.cx_states + MQC_CX_RL, rlen != 4); if (rlen == 4) @@ -545,34 +545,34 @@ static void encode_clnpass(Jpeg2000T1Context *t1, int width, int height, int ban ff_mqc_encode(&t1->mqc, t1->mqc.cx_states + MQC_CX_UNI, rlen >> 1); ff_mqc_encode(&t1->mqc, t1->mqc.cx_states + MQC_CX_UNI, rlen & 1); for (y = y0 + rlen; y < y0 + 4; y++){ - if (!(t1->flags[y+1][x+1] & (JPEG2000_T1_SIG | JPEG2000_T1_VIS))){ - int ctxno = ff_jpeg2000_getsigctxno(t1->flags[y+1][x+1], bandno); + if (!(t1->flags[(y+1) * t1->stride + x+1] & (JPEG2000_T1_SIG | JPEG2000_T1_VIS))){ + int ctxno = ff_jpeg2000_getsigctxno(t1->flags[(y+1) * t1->stride + x+1], bandno); if (y > y0 + rlen) - ff_mqc_encode(&t1->mqc, t1->mqc.cx_states + ctxno, t1->data[y][x] & mask ? 1:0); - if (t1->data[y][x] & mask){ // newly significant + ff_mqc_encode(&t1->mqc, t1->mqc.cx_states + ctxno, t1->data[(y) * t1->stride + x] & mask ? 1:0); + if (t1->data[(y) * t1->stride + x] & mask){ // newly significant int xorbit; - int ctxno = ff_jpeg2000_getsgnctxno(t1->flags[y+1][x+1], &xorbit); - *nmsedec += getnmsedec_sig(t1->data[y][x], bpno + NMSEDEC_FRACBITS); - ff_mqc_encode(&t1->mqc, t1->mqc.cx_states + ctxno, (t1->flags[y+1][x+1] >> 15) ^ xorbit); - ff_jpeg2000_set_significance(t1, x, y, t1->flags[y+1][x+1] >> 15); + int ctxno = ff_jpeg2000_getsgnctxno(t1->flags[(y+1) * t1->stride + x+1], &xorbit); + *nmsedec += getnmsedec_sig(t1->data[(y) * t1->stride + x], bpno + NMSEDEC_FRACBITS); + ff_mqc_encode(&t1->mqc, t1->mqc.cx_states + ctxno, (t1->flags[(y+1) * t1->stride + x+1] >> 15) ^ xorbit); + ff_jpeg2000_set_significance(t1, x, y, t1->flags[(y+1) * t1->stride + x+1] >> 15); } } - t1->flags[y+1][x+1] &= ~JPEG2000_T1_VIS; + t1->flags[(y+1) * t1->stride + x+1] &= ~JPEG2000_T1_VIS; } } else{ for (y = y0; y < y0 + 4 && y < height; y++){ - if (!(t1->flags[y+1][x+1] & (JPEG2000_T1_SIG | JPEG2000_T1_VIS))){ - int ctxno = ff_jpeg2000_getsigctxno(t1->flags[y+1][x+1], bandno); - ff_mqc_encode(&t1->mqc, t1->mqc.cx_states + ctxno, t1->data[y][x] & mask ? 1:0); - if (t1->data[y][x] & mask){ // newly significant + if (!(t1->flags[(y+1) * t1->stride + x+1] & (JPEG2000_T1_SIG | JPEG2000_T1_VIS))){ + int ctxno = ff_jpeg2000_getsigctxno(t1->flags[(y+1) * t1->stride + x+1], bandno); + ff_mqc_encode(&t1->mqc, t1->mqc.cx_states + ctxno, t1->data[(y) * t1->stride + x] & mask ? 1:0); + if (t1->data[(y) * t1->stride + x] & mask){ // newly significant int xorbit; - int ctxno = ff_jpeg2000_getsgnctxno(t1->flags[y+1][x+1], &xorbit); - *nmsedec += getnmsedec_sig(t1->data[y][x], bpno + NMSEDEC_FRACBITS); - ff_mqc_encode(&t1->mqc, t1->mqc.cx_states + ctxno, (t1->flags[y+1][x+1] >> 15) ^ xorbit); - ff_jpeg2000_set_significance(t1, x, y, t1->flags[y+1][x+1] >> 15); + int ctxno = ff_jpeg2000_getsgnctxno(t1->flags[(y+1) * t1->stride + x+1], &xorbit); + *nmsedec += getnmsedec_sig(t1->data[(y) * t1->stride + x], bpno + NMSEDEC_FRACBITS); + ff_mqc_encode(&t1->mqc, t1->mqc.cx_states + ctxno, (t1->flags[(y+1) * t1->stride + x+1] >> 15) ^ xorbit); + ff_jpeg2000_set_significance(t1, x, y, t1->flags[(y+1) * t1->stride + x+1] >> 15); } } - t1->flags[y+1][x+1] &= ~JPEG2000_T1_VIS; + t1->flags[(y+1) * t1->stride + x+1] &= ~JPEG2000_T1_VIS; } } } @@ -584,16 +584,15 @@ static void encode_cblk(Jpeg2000EncoderContext *s, Jpeg2000T1Context *t1, Jpeg20 int pass_t = 2, passno, x, y, max=0, nmsedec, bpno; int64_t wmsedec = 0; - for (y = 0; y < height+2; y++) - memset(t1->flags[y], 0, (width+2)*sizeof(int)); + memset(t1->flags, 0, t1->stride * (height + 2) * sizeof(*t1->flags)); for (y = 0; y < height; y++){ for (x = 0; x < width; x++){ - if (t1->data[y][x] < 0){ - t1->flags[y+1][x+1] |= JPEG2000_T1_SGN; - t1->data[y][x] = -t1->data[y][x]; + if (t1->data[(y) * t1->stride + x] < 0){ + t1->flags[(y+1) * t1->stride + x+1] |= JPEG2000_T1_SGN; + t1->data[(y) * t1->stride + x] = -t1->data[(y) * t1->stride + x]; } - max = FFMAX(max, t1->data[y][x]); + max = FFMAX(max, t1->data[(y) * t1->stride + x]); } } @@ -827,6 +826,8 @@ static int encode_tile(Jpeg2000EncoderContext *s, Jpeg2000Tile *tile, int tileno for (compno = 0; compno < s->ncomponents; compno++){ Jpeg2000Component *comp = s->tile[tileno].comp + compno; + t1.stride = (1<<codsty->log2_cblk_width) + 2; + av_log(s->avctx, AV_LOG_DEBUG,"dwt\n"); if ((ret = ff_dwt_encode(&comp->dwt, comp->i_data)) < 0) return ret; @@ -862,14 +863,14 @@ static int encode_tile(Jpeg2000EncoderContext *s, Jpeg2000Tile *tile, int tileno int y, x; if (codsty->transform == FF_DWT53){ for (y = yy0; y < yy1; y++){ - int *ptr = t1.data[y-yy0]; + int *ptr = t1.data + (y-yy0)*t1.stride; for (x = xx0; x < xx1; x++){ *ptr++ = comp->i_data[(comp->coord[0][1] - comp->coord[0][0]) * y + x] << NMSEDEC_FRACBITS; } } } else{ for (y = yy0; y < yy1; y++){ - int *ptr = t1.data[y-yy0]; + int *ptr = t1.data + (y-yy0)*t1.stride; for (x = xx0; x < xx1; x++){ *ptr = (comp->i_data[(comp->coord[0][1] - comp->coord[0][0]) * y + x]); *ptr = (int64_t)*ptr * (int64_t)(16384 * 65536 / band->i_stepsize) >> 15 - NMSEDEC_FRACBITS; diff --git a/libavcodec/jpeg2000.c b/libavcodec/jpeg2000.c index ebf8320f81..7d2b18f70a 100644 --- a/libavcodec/jpeg2000.c +++ b/libavcodec/jpeg2000.c @@ -171,22 +171,22 @@ void ff_jpeg2000_set_significance(Jpeg2000T1Context *t1, int x, int y, { x++; y++; - t1->flags[y][x] |= JPEG2000_T1_SIG; + t1->flags[(y) * t1->stride + x] |= JPEG2000_T1_SIG; if (negative) { - t1->flags[y][x + 1] |= JPEG2000_T1_SIG_W | JPEG2000_T1_SGN_W; - t1->flags[y][x - 1] |= JPEG2000_T1_SIG_E | JPEG2000_T1_SGN_E; - t1->flags[y + 1][x] |= JPEG2000_T1_SIG_N | JPEG2000_T1_SGN_N; - t1->flags[y - 1][x] |= JPEG2000_T1_SIG_S | JPEG2000_T1_SGN_S; + t1->flags[(y) * t1->stride + x + 1] |= JPEG2000_T1_SIG_W | JPEG2000_T1_SGN_W; + t1->flags[(y) * t1->stride + x - 1] |= JPEG2000_T1_SIG_E | JPEG2000_T1_SGN_E; + t1->flags[(y + 1) * t1->stride + x] |= JPEG2000_T1_SIG_N | JPEG2000_T1_SGN_N; + t1->flags[(y - 1) * t1->stride + x] |= JPEG2000_T1_SIG_S | JPEG2000_T1_SGN_S; } else { - t1->flags[y][x + 1] |= JPEG2000_T1_SIG_W; - t1->flags[y][x - 1] |= JPEG2000_T1_SIG_E; - t1->flags[y + 1][x] |= JPEG2000_T1_SIG_N; - t1->flags[y - 1][x] |= JPEG2000_T1_SIG_S; + t1->flags[(y) * t1->stride + x + 1] |= JPEG2000_T1_SIG_W; + t1->flags[(y) * t1->stride + x - 1] |= JPEG2000_T1_SIG_E; + t1->flags[(y + 1) * t1->stride + x] |= JPEG2000_T1_SIG_N; + t1->flags[(y - 1) * t1->stride + x] |= JPEG2000_T1_SIG_S; } - t1->flags[y + 1][x + 1] |= JPEG2000_T1_SIG_NW; - t1->flags[y + 1][x - 1] |= JPEG2000_T1_SIG_NE; - t1->flags[y - 1][x + 1] |= JPEG2000_T1_SIG_SW; - t1->flags[y - 1][x - 1] |= JPEG2000_T1_SIG_SE; + t1->flags[(y + 1) * t1->stride + x + 1] |= JPEG2000_T1_SIG_NW; + t1->flags[(y + 1) * t1->stride + x - 1] |= JPEG2000_T1_SIG_NE; + t1->flags[(y - 1) * t1->stride + x + 1] |= JPEG2000_T1_SIG_SW; + t1->flags[(y - 1) * t1->stride + x - 1] |= JPEG2000_T1_SIG_SE; } static const uint8_t lut_gain[2][4] = { { 0, 0, 0, 0 }, { 0, 1, 1, 2 } }; diff --git a/libavcodec/jpeg2000.h b/libavcodec/jpeg2000.h index 24395a24eb..0acad79eff 100644 --- a/libavcodec/jpeg2000.h +++ b/libavcodec/jpeg2000.h @@ -67,10 +67,6 @@ enum Jpeg2000Quantsty { // quantization style JPEG2000_QSTY_SE // scalar expounded }; -#define JPEG2000_MAX_CBLKW 128 -#define JPEG2000_MAX_CBLKH 128 - - #define JPEG2000_MAX_DECLEVELS 32 #define JPEG2000_MAX_RESLEVELS (JPEG2000_MAX_DECLEVELS + 1) @@ -123,9 +119,10 @@ enum Jpeg2000Quantsty { // quantization style #define JPEG2000_PGOD_CPRL 0x04 // Component-position-resolution level-layer progression typedef struct Jpeg2000T1Context { - int data[JPEG2000_MAX_CBLKW][JPEG2000_MAX_CBLKH]; - uint16_t flags[JPEG2000_MAX_CBLKW + 2][JPEG2000_MAX_CBLKH + 2]; + int data[6144]; + uint16_t flags[6156]; MqcState mqc; + int stride; } Jpeg2000T1Context; typedef struct Jpeg2000TgtNode { diff --git a/libavcodec/jpeg2000dec.c b/libavcodec/jpeg2000dec.c index 3d518e3c4c..1090f37b68 100644 --- a/libavcodec/jpeg2000dec.c +++ b/libavcodec/jpeg2000dec.c @@ -439,11 +439,6 @@ static int get_cox(Jpeg2000DecoderContext *s, Jpeg2000CodingStyle *c) return AVERROR_INVALIDDATA; } - if (c->log2_cblk_width > 7 || c->log2_cblk_height > 7) { - avpriv_request_sample(s->avctx, "cblk size > 128"); - return AVERROR_PATCHWELCOME; - } - c->cblk_style = bytestream2_get_byteu(&s->g); if (c->cblk_style != 0) { // cblk style av_log(s->avctx, AV_LOG_WARNING, "extra cblk styles %X\n", c->cblk_style); @@ -1233,20 +1228,20 @@ static void decode_sigpass(Jpeg2000T1Context *t1, int width, int height, int flags_mask = -1; if (vert_causal_ctx_csty_symbol && y == y0 + 3) flags_mask &= ~(JPEG2000_T1_SIG_S | JPEG2000_T1_SIG_SW | JPEG2000_T1_SIG_SE | JPEG2000_T1_SGN_S); - if ((t1->flags[y+1][x+1] & JPEG2000_T1_SIG_NB & flags_mask) - && !(t1->flags[y+1][x+1] & (JPEG2000_T1_SIG | JPEG2000_T1_VIS))) { - if (ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + ff_jpeg2000_getsigctxno(t1->flags[y+1][x+1] & flags_mask, bandno))) { - int xorbit, ctxno = ff_jpeg2000_getsgnctxno(t1->flags[y+1][x+1] & flags_mask, &xorbit); + if ((t1->flags[(y+1) * t1->stride + x+1] & JPEG2000_T1_SIG_NB & flags_mask) + && !(t1->flags[(y+1) * t1->stride + x+1] & (JPEG2000_T1_SIG | JPEG2000_T1_VIS))) { + if (ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + ff_jpeg2000_getsigctxno(t1->flags[(y+1) * t1->stride + x+1] & flags_mask, bandno))) { + int xorbit, ctxno = ff_jpeg2000_getsgnctxno(t1->flags[(y+1) * t1->stride + x+1] & flags_mask, &xorbit); if (t1->mqc.raw) - t1->data[y][x] = ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + ctxno) ? -mask : mask; + t1->data[(y) * t1->stride + x] = ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + ctxno) ? -mask : mask; else - t1->data[y][x] = (ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + ctxno) ^ xorbit) ? + t1->data[(y) * t1->stride + x] = (ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + ctxno) ^ xorbit) ? -mask : mask; ff_jpeg2000_set_significance(t1, x, y, - t1->data[y][x] < 0); + t1->data[(y) * t1->stride + x] < 0); } - t1->flags[y + 1][x + 1] |= JPEG2000_T1_VIS; + t1->flags[(y + 1) * t1->stride + x + 1] |= JPEG2000_T1_VIS; } } } @@ -1263,15 +1258,15 @@ static void decode_refpass(Jpeg2000T1Context *t1, int width, int height, for (y0 = 0; y0 < height; y0 += 4) for (x = 0; x < width; x++) for (y = y0; y < height && y < y0 + 4; y++) - if ((t1->flags[y + 1][x + 1] & (JPEG2000_T1_SIG | JPEG2000_T1_VIS)) == JPEG2000_T1_SIG) { + if ((t1->flags[(y + 1) * t1->stride + x + 1] & (JPEG2000_T1_SIG | JPEG2000_T1_VIS)) == JPEG2000_T1_SIG) { int flags_mask = (vert_causal_ctx_csty_symbol && y == y0 + 3) ? ~(JPEG2000_T1_SIG_S | JPEG2000_T1_SIG_SW | JPEG2000_T1_SIG_SE | JPEG2000_T1_SGN_S) : -1; - int ctxno = ff_jpeg2000_getrefctxno(t1->flags[y + 1][x + 1] & flags_mask); + int ctxno = ff_jpeg2000_getrefctxno(t1->flags[(y + 1) * t1->stride + x + 1] & flags_mask); int r = ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + ctxno) ? phalf : nhalf; - t1->data[y][x] += t1->data[y][x] < 0 ? -r : r; - t1->flags[y + 1][x + 1] |= JPEG2000_T1_REF; + t1->data[(y) * t1->stride + x] += t1->data[(y) * t1->stride + x] < 0 ? -r : r; + t1->flags[(y + 1) * t1->stride + x + 1] |= JPEG2000_T1_REF; } } @@ -1287,10 +1282,10 @@ static void decode_clnpass(Jpeg2000DecoderContext *s, Jpeg2000T1Context *t1, if (vert_causal_ctx_csty_symbol) flags_mask &= ~(JPEG2000_T1_SIG_S | JPEG2000_T1_SIG_SW | JPEG2000_T1_SIG_SE | JPEG2000_T1_SGN_S); if (y0 + 3 < height && - !((t1->flags[y0 + 1][x + 1] & (JPEG2000_T1_SIG_NB | JPEG2000_T1_VIS | JPEG2000_T1_SIG)) || - (t1->flags[y0 + 2][x + 1] & (JPEG2000_T1_SIG_NB | JPEG2000_T1_VIS | JPEG2000_T1_SIG)) || - (t1->flags[y0 + 3][x + 1] & (JPEG2000_T1_SIG_NB | JPEG2000_T1_VIS | JPEG2000_T1_SIG)) || - (t1->flags[y0 + 4][x + 1] & (JPEG2000_T1_SIG_NB | JPEG2000_T1_VIS | JPEG2000_T1_SIG) & flags_mask))) { + !((t1->flags[(y0 + 1) * t1->stride + x + 1] & (JPEG2000_T1_SIG_NB | JPEG2000_T1_VIS | JPEG2000_T1_SIG)) || + (t1->flags[(y0 + 2) * t1->stride + x + 1] & (JPEG2000_T1_SIG_NB | JPEG2000_T1_VIS | JPEG2000_T1_SIG)) || + (t1->flags[(y0 + 3) * t1->stride + x + 1] & (JPEG2000_T1_SIG_NB | JPEG2000_T1_VIS | JPEG2000_T1_SIG)) || + (t1->flags[(y0 + 4) * t1->stride + x + 1] & (JPEG2000_T1_SIG_NB | JPEG2000_T1_VIS | JPEG2000_T1_SIG) & flags_mask))) { if (!ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + MQC_CX_RL)) continue; runlen = ff_mqc_decode(&t1->mqc, @@ -1309,23 +1304,23 @@ static void decode_clnpass(Jpeg2000DecoderContext *s, Jpeg2000T1Context *t1, if (vert_causal_ctx_csty_symbol && y == y0 + 3) flags_mask &= ~(JPEG2000_T1_SIG_S | JPEG2000_T1_SIG_SW | JPEG2000_T1_SIG_SE | JPEG2000_T1_SGN_S); if (!dec) { - if (!(t1->flags[y+1][x+1] & (JPEG2000_T1_SIG | JPEG2000_T1_VIS))) { - dec = ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + ff_jpeg2000_getsigctxno(t1->flags[y+1][x+1] & flags_mask, + if (!(t1->flags[(y+1) * t1->stride + x+1] & (JPEG2000_T1_SIG | JPEG2000_T1_VIS))) { + dec = ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + ff_jpeg2000_getsigctxno(t1->flags[(y+1) * t1->stride + x+1] & flags_mask, bandno)); } } if (dec) { int xorbit; - int ctxno = ff_jpeg2000_getsgnctxno(t1->flags[y + 1][x + 1] & flags_mask, + int ctxno = ff_jpeg2000_getsgnctxno(t1->flags[(y + 1) * t1->stride + x + 1] & flags_mask, &xorbit); - t1->data[y][x] = (ff_mqc_decode(&t1->mqc, + t1->data[(y) * t1->stride + x] = (ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + ctxno) ^ xorbit) ? -mask : mask; - ff_jpeg2000_set_significance(t1, x, y, t1->data[y][x] < 0); + ff_jpeg2000_set_significance(t1, x, y, t1->data[(y) * t1->stride + x] < 0); } dec = 0; - t1->flags[y + 1][x + 1] &= ~JPEG2000_T1_VIS; + t1->flags[(y + 1) * t1->stride + x + 1] &= ~JPEG2000_T1_VIS; } } } @@ -1351,18 +1346,16 @@ static int decode_cblk(Jpeg2000DecoderContext *s, Jpeg2000CodingStyle *codsty, int term_cnt = 0; int coder_type; - av_assert0(width <= JPEG2000_MAX_CBLKW); - av_assert0(height <= JPEG2000_MAX_CBLKH); + av_assert0(width <= 1024U && height <= 1024U); + av_assert0(width*height <= 4096); - for (y = 0; y < height; y++) - memset(t1->data[y], 0, width * sizeof(**t1->data)); + memset(t1->data, 0, t1->stride * height * sizeof(*t1->data)); /* If code-block contains no compressed data: nothing to do. */ if (!cblk->length) return 0; - for (y = 0; y < height + 2; y++) - memset(t1->flags[y], 0, (width + 2) * sizeof(**t1->flags)); + memset(t1->flags, 0, t1->stride * (height + 2) * sizeof(*t1->flags)); cblk->data[cblk->length] = 0xff; cblk->data[cblk->length+1] = 0xff; @@ -1426,7 +1419,7 @@ static void dequantization_float(int x, int y, Jpeg2000Cblk *cblk, int w = cblk->coord[0][1] - cblk->coord[0][0]; for (j = 0; j < (cblk->coord[1][1] - cblk->coord[1][0]); ++j) { float *datap = &comp->f_data[(comp->coord[0][1] - comp->coord[0][0]) * (y + j) + x]; - int *src = t1->data[j]; + int *src = t1->data + j*t1->stride; for (i = 0; i < w; ++i) datap[i] = src[i] * band->f_stepsize; } @@ -1441,7 +1434,7 @@ static void dequantization_int(int x, int y, Jpeg2000Cblk *cblk, int w = cblk->coord[0][1] - cblk->coord[0][0]; for (j = 0; j < (cblk->coord[1][1] - cblk->coord[1][0]); ++j) { int32_t *datap = &comp->i_data[(comp->coord[0][1] - comp->coord[0][0]) * (y + j) + x]; - int *src = t1->data[j]; + int *src = t1->data + j*t1->stride; if (band->i_stepsize == 16384) { for (i = 0; i < w; ++i) datap[i] = src[i] / 2; @@ -1461,7 +1454,7 @@ static void dequantization_int_97(int x, int y, Jpeg2000Cblk *cblk, int w = cblk->coord[0][1] - cblk->coord[0][0]; for (j = 0; j < (cblk->coord[1][1] - cblk->coord[1][0]); ++j) { int32_t *datap = &comp->i_data[(comp->coord[0][1] - comp->coord[0][0]) * (y + j) + x]; - int *src = t1->data[j]; + int *src = t1->data + j*t1->stride; for (i = 0; i < w; ++i) datap[i] = (src[i] * (int64_t)band->i_stepsize + (1<<14)) >> 15; } @@ -1512,6 +1505,8 @@ static int jpeg2000_decode_tile(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile, Jpeg2000Component *comp = tile->comp + compno; Jpeg2000CodingStyle *codsty = tile->codsty + compno; + t1.stride = (1<<codsty->log2_cblk_width) + 2; + /* Loop on resolution levels */ for (reslevelno = 0; reslevelno < codsty->nreslevels2decode; reslevelno++) { Jpeg2000ResLevel *rlevel = comp->reslevel + reslevelno; |