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>
This commit is contained in:
parent
8c22143e7e
commit
f1e173049e
@ -493,18 +493,18 @@ static void encode_sigpass(Jpeg2000T1Context *t1, int width, int height, int ban
|
|||||||
for (y0 = 0; y0 < height; y0 += 4)
|
for (y0 = 0; y0 < height; y0 += 4)
|
||||||
for (x = 0; x < width; x++)
|
for (x = 0; x < width; x++)
|
||||||
for (y = y0; y < height && y < y0+4; y++){
|
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)){
|
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][x+1], bandno),
|
int ctxno = ff_jpeg2000_getsigctxno(t1->flags[(y+1) * t1->stride + x+1], bandno),
|
||||||
bit = t1->data[y][x] & mask ? 1 : 0;
|
bit = t1->data[(y) * t1->stride + x] & mask ? 1 : 0;
|
||||||
ff_mqc_encode(&t1->mqc, t1->mqc.cx_states + ctxno, bit);
|
ff_mqc_encode(&t1->mqc, t1->mqc.cx_states + ctxno, bit);
|
||||||
if (bit){
|
if (bit){
|
||||||
int xorbit;
|
int xorbit;
|
||||||
int ctxno = ff_jpeg2000_getsgnctxno(t1->flags[y+1][x+1], &xorbit);
|
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][x+1] >> 15) ^ 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][x], bpno + NMSEDEC_FRACBITS);
|
*nmsedec += getnmsedec_sig(t1->data[(y) * t1->stride + x], bpno + NMSEDEC_FRACBITS);
|
||||||
ff_jpeg2000_set_significance(t1, x, y, t1->flags[y+1][x+1] >> 15);
|
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 (y0 = 0; y0 < height; y0 += 4)
|
||||||
for (x = 0; x < width; x++)
|
for (x = 0; x < width; x++)
|
||||||
for (y = y0; y < height && y < y0+4; y++)
|
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 ctxno = ff_jpeg2000_getrefctxno(t1->flags[y+1][x+1]);
|
int ctxno = ff_jpeg2000_getrefctxno(t1->flags[(y+1) * t1->stride + x+1]);
|
||||||
*nmsedec += getnmsedec_ref(t1->data[y][x], bpno + NMSEDEC_FRACBITS);
|
*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][x] & mask ? 1:0);
|
ff_mqc_encode(&t1->mqc, t1->mqc.cx_states + ctxno, t1->data[(y) * t1->stride + x] & mask ? 1:0);
|
||||||
t1->flags[y+1][x+1] |= JPEG2000_T1_REF;
|
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 (y0 = 0; y0 < height; y0 += 4)
|
||||||
for (x = 0; x < width; x++){
|
for (x = 0; x < width; x++){
|
||||||
if (y0 + 3 < height && !(
|
if (y0 + 3 < height && !(
|
||||||
(t1->flags[y0+1][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][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][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][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
|
// aggregation mode
|
||||||
int rlen;
|
int rlen;
|
||||||
for (rlen = 0; rlen < 4; rlen++)
|
for (rlen = 0; rlen < 4; rlen++)
|
||||||
if (t1->data[y0+rlen][x] & mask)
|
if (t1->data[(y0+rlen) * t1->stride + x] & mask)
|
||||||
break;
|
break;
|
||||||
ff_mqc_encode(&t1->mqc, t1->mqc.cx_states + MQC_CX_RL, rlen != 4);
|
ff_mqc_encode(&t1->mqc, t1->mqc.cx_states + MQC_CX_RL, rlen != 4);
|
||||||
if (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);
|
||||||
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++){
|
for (y = y0 + rlen; y < y0 + 4; y++){
|
||||||
if (!(t1->flags[y+1][x+1] & (JPEG2000_T1_SIG | JPEG2000_T1_VIS))){
|
if (!(t1->flags[(y+1) * t1->stride + x+1] & (JPEG2000_T1_SIG | JPEG2000_T1_VIS))){
|
||||||
int ctxno = ff_jpeg2000_getsigctxno(t1->flags[y+1][x+1], bandno);
|
int ctxno = ff_jpeg2000_getsigctxno(t1->flags[(y+1) * t1->stride + x+1], bandno);
|
||||||
if (y > y0 + rlen)
|
if (y > y0 + rlen)
|
||||||
ff_mqc_encode(&t1->mqc, t1->mqc.cx_states + ctxno, t1->data[y][x] & mask ? 1:0);
|
ff_mqc_encode(&t1->mqc, t1->mqc.cx_states + ctxno, t1->data[(y) * t1->stride + x] & mask ? 1:0);
|
||||||
if (t1->data[y][x] & mask){ // newly significant
|
if (t1->data[(y) * t1->stride + x] & mask){ // newly significant
|
||||||
int xorbit;
|
int xorbit;
|
||||||
int ctxno = ff_jpeg2000_getsgnctxno(t1->flags[y+1][x+1], &xorbit);
|
int ctxno = ff_jpeg2000_getsgnctxno(t1->flags[(y+1) * t1->stride + x+1], &xorbit);
|
||||||
*nmsedec += getnmsedec_sig(t1->data[y][x], bpno + NMSEDEC_FRACBITS);
|
*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][x+1] >> 15) ^ xorbit);
|
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][x+1] >> 15);
|
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{
|
} else{
|
||||||
for (y = y0; y < y0 + 4 && y < height; y++){
|
for (y = y0; y < y0 + 4 && y < height; y++){
|
||||||
if (!(t1->flags[y+1][x+1] & (JPEG2000_T1_SIG | JPEG2000_T1_VIS))){
|
if (!(t1->flags[(y+1) * t1->stride + x+1] & (JPEG2000_T1_SIG | JPEG2000_T1_VIS))){
|
||||||
int ctxno = ff_jpeg2000_getsigctxno(t1->flags[y+1][x+1], bandno);
|
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][x] & mask ? 1:0);
|
ff_mqc_encode(&t1->mqc, t1->mqc.cx_states + ctxno, t1->data[(y) * t1->stride + x] & mask ? 1:0);
|
||||||
if (t1->data[y][x] & mask){ // newly significant
|
if (t1->data[(y) * t1->stride + x] & mask){ // newly significant
|
||||||
int xorbit;
|
int xorbit;
|
||||||
int ctxno = ff_jpeg2000_getsgnctxno(t1->flags[y+1][x+1], &xorbit);
|
int ctxno = ff_jpeg2000_getsgnctxno(t1->flags[(y+1) * t1->stride + x+1], &xorbit);
|
||||||
*nmsedec += getnmsedec_sig(t1->data[y][x], bpno + NMSEDEC_FRACBITS);
|
*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][x+1] >> 15) ^ xorbit);
|
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][x+1] >> 15);
|
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;
|
int pass_t = 2, passno, x, y, max=0, nmsedec, bpno;
|
||||||
int64_t wmsedec = 0;
|
int64_t wmsedec = 0;
|
||||||
|
|
||||||
for (y = 0; y < height+2; y++)
|
memset(t1->flags, 0, t1->stride * (height + 2) * sizeof(*t1->flags));
|
||||||
memset(t1->flags[y], 0, (width+2)*sizeof(int));
|
|
||||||
|
|
||||||
for (y = 0; y < height; y++){
|
for (y = 0; y < height; y++){
|
||||||
for (x = 0; x < width; x++){
|
for (x = 0; x < width; x++){
|
||||||
if (t1->data[y][x] < 0){
|
if (t1->data[(y) * t1->stride + x] < 0){
|
||||||
t1->flags[y+1][x+1] |= JPEG2000_T1_SGN;
|
t1->flags[(y+1) * t1->stride + x+1] |= JPEG2000_T1_SGN;
|
||||||
t1->data[y][x] = -t1->data[y][x];
|
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++){
|
for (compno = 0; compno < s->ncomponents; compno++){
|
||||||
Jpeg2000Component *comp = s->tile[tileno].comp + 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");
|
av_log(s->avctx, AV_LOG_DEBUG,"dwt\n");
|
||||||
if ((ret = ff_dwt_encode(&comp->dwt, comp->i_data)) < 0)
|
if ((ret = ff_dwt_encode(&comp->dwt, comp->i_data)) < 0)
|
||||||
return ret;
|
return ret;
|
||||||
@ -862,14 +863,14 @@ static int encode_tile(Jpeg2000EncoderContext *s, Jpeg2000Tile *tile, int tileno
|
|||||||
int y, x;
|
int y, x;
|
||||||
if (codsty->transform == FF_DWT53){
|
if (codsty->transform == FF_DWT53){
|
||||||
for (y = yy0; y < yy1; y++){
|
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++){
|
for (x = xx0; x < xx1; x++){
|
||||||
*ptr++ = comp->i_data[(comp->coord[0][1] - comp->coord[0][0]) * y + x] << NMSEDEC_FRACBITS;
|
*ptr++ = comp->i_data[(comp->coord[0][1] - comp->coord[0][0]) * y + x] << NMSEDEC_FRACBITS;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else{
|
} else{
|
||||||
for (y = yy0; y < yy1; y++){
|
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++){
|
for (x = xx0; x < xx1; x++){
|
||||||
*ptr = (comp->i_data[(comp->coord[0][1] - comp->coord[0][0]) * y + 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;
|
*ptr = (int64_t)*ptr * (int64_t)(16384 * 65536 / band->i_stepsize) >> 15 - NMSEDEC_FRACBITS;
|
||||||
|
@ -171,22 +171,22 @@ void ff_jpeg2000_set_significance(Jpeg2000T1Context *t1, int x, int y,
|
|||||||
{
|
{
|
||||||
x++;
|
x++;
|
||||||
y++;
|
y++;
|
||||||
t1->flags[y][x] |= JPEG2000_T1_SIG;
|
t1->flags[(y) * t1->stride + x] |= JPEG2000_T1_SIG;
|
||||||
if (negative) {
|
if (negative) {
|
||||||
t1->flags[y][x + 1] |= JPEG2000_T1_SIG_W | JPEG2000_T1_SGN_W;
|
t1->flags[(y) * t1->stride + 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) * t1->stride + 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) * t1->stride + 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 - 1) * t1->stride + x] |= JPEG2000_T1_SIG_S | JPEG2000_T1_SGN_S;
|
||||||
} else {
|
} else {
|
||||||
t1->flags[y][x + 1] |= JPEG2000_T1_SIG_W;
|
t1->flags[(y) * t1->stride + x + 1] |= JPEG2000_T1_SIG_W;
|
||||||
t1->flags[y][x - 1] |= JPEG2000_T1_SIG_E;
|
t1->flags[(y) * t1->stride + x - 1] |= JPEG2000_T1_SIG_E;
|
||||||
t1->flags[y + 1][x] |= JPEG2000_T1_SIG_N;
|
t1->flags[(y + 1) * t1->stride + x] |= JPEG2000_T1_SIG_N;
|
||||||
t1->flags[y - 1][x] |= JPEG2000_T1_SIG_S;
|
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) * t1->stride + x + 1] |= JPEG2000_T1_SIG_NW;
|
||||||
t1->flags[y + 1][x - 1] |= JPEG2000_T1_SIG_NE;
|
t1->flags[(y + 1) * t1->stride + x - 1] |= JPEG2000_T1_SIG_NE;
|
||||||
t1->flags[y - 1][x + 1] |= JPEG2000_T1_SIG_SW;
|
t1->flags[(y - 1) * t1->stride + 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_SE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const uint8_t lut_gain[2][4] = { { 0, 0, 0, 0 }, { 0, 1, 1, 2 } };
|
static const uint8_t lut_gain[2][4] = { { 0, 0, 0, 0 }, { 0, 1, 1, 2 } };
|
||||||
|
@ -67,10 +67,6 @@ enum Jpeg2000Quantsty { // quantization style
|
|||||||
JPEG2000_QSTY_SE // scalar expounded
|
JPEG2000_QSTY_SE // scalar expounded
|
||||||
};
|
};
|
||||||
|
|
||||||
#define JPEG2000_MAX_CBLKW 128
|
|
||||||
#define JPEG2000_MAX_CBLKH 128
|
|
||||||
|
|
||||||
|
|
||||||
#define JPEG2000_MAX_DECLEVELS 32
|
#define JPEG2000_MAX_DECLEVELS 32
|
||||||
#define JPEG2000_MAX_RESLEVELS (JPEG2000_MAX_DECLEVELS + 1)
|
#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
|
#define JPEG2000_PGOD_CPRL 0x04 // Component-position-resolution level-layer progression
|
||||||
|
|
||||||
typedef struct Jpeg2000T1Context {
|
typedef struct Jpeg2000T1Context {
|
||||||
int data[JPEG2000_MAX_CBLKW][JPEG2000_MAX_CBLKH];
|
int data[6144];
|
||||||
uint16_t flags[JPEG2000_MAX_CBLKW + 2][JPEG2000_MAX_CBLKH + 2];
|
uint16_t flags[6156];
|
||||||
MqcState mqc;
|
MqcState mqc;
|
||||||
|
int stride;
|
||||||
} Jpeg2000T1Context;
|
} Jpeg2000T1Context;
|
||||||
|
|
||||||
typedef struct Jpeg2000TgtNode {
|
typedef struct Jpeg2000TgtNode {
|
||||||
|
@ -439,11 +439,6 @@ static int get_cox(Jpeg2000DecoderContext *s, Jpeg2000CodingStyle *c)
|
|||||||
return AVERROR_INVALIDDATA;
|
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);
|
c->cblk_style = bytestream2_get_byteu(&s->g);
|
||||||
if (c->cblk_style != 0) { // cblk style
|
if (c->cblk_style != 0) { // cblk style
|
||||||
av_log(s->avctx, AV_LOG_WARNING, "extra cblk styles %X\n", c->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;
|
int flags_mask = -1;
|
||||||
if (vert_causal_ctx_csty_symbol && y == y0 + 3)
|
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);
|
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)
|
if ((t1->flags[(y+1) * t1->stride + x+1] & JPEG2000_T1_SIG_NB & flags_mask)
|
||||||
&& !(t1->flags[y+1][x+1] & (JPEG2000_T1_SIG | JPEG2000_T1_VIS))) {
|
&& !(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][x+1] & flags_mask, bandno))) {
|
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][x+1] & flags_mask, &xorbit);
|
int xorbit, ctxno = ff_jpeg2000_getsgnctxno(t1->flags[(y+1) * t1->stride + x+1] & flags_mask, &xorbit);
|
||||||
if (t1->mqc.raw)
|
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
|
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;
|
-mask : mask;
|
||||||
|
|
||||||
ff_jpeg2000_set_significance(t1, x, y,
|
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 (y0 = 0; y0 < height; y0 += 4)
|
||||||
for (x = 0; x < width; x++)
|
for (x = 0; x < width; x++)
|
||||||
for (y = y0; y < height && y < y0 + 4; y++)
|
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) ?
|
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;
|
~(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,
|
int r = ff_mqc_decode(&t1->mqc,
|
||||||
t1->mqc.cx_states + ctxno)
|
t1->mqc.cx_states + ctxno)
|
||||||
? phalf : nhalf;
|
? phalf : nhalf;
|
||||||
t1->data[y][x] += t1->data[y][x] < 0 ? -r : r;
|
t1->data[(y) * t1->stride + x] += t1->data[(y) * t1->stride + x] < 0 ? -r : r;
|
||||||
t1->flags[y + 1][x + 1] |= JPEG2000_T1_REF;
|
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)
|
if (vert_causal_ctx_csty_symbol)
|
||||||
flags_mask &= ~(JPEG2000_T1_SIG_S | JPEG2000_T1_SIG_SW | JPEG2000_T1_SIG_SE | JPEG2000_T1_SGN_S);
|
flags_mask &= ~(JPEG2000_T1_SIG_S | JPEG2000_T1_SIG_SW | JPEG2000_T1_SIG_SE | JPEG2000_T1_SGN_S);
|
||||||
if (y0 + 3 < height &&
|
if (y0 + 3 < height &&
|
||||||
!((t1->flags[y0 + 1][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][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][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][x + 1] & (JPEG2000_T1_SIG_NB | JPEG2000_T1_VIS | JPEG2000_T1_SIG) & flags_mask))) {
|
(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))
|
if (!ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + MQC_CX_RL))
|
||||||
continue;
|
continue;
|
||||||
runlen = ff_mqc_decode(&t1->mqc,
|
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)
|
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);
|
flags_mask &= ~(JPEG2000_T1_SIG_S | JPEG2000_T1_SIG_SW | JPEG2000_T1_SIG_SE | JPEG2000_T1_SGN_S);
|
||||||
if (!dec) {
|
if (!dec) {
|
||||||
if (!(t1->flags[y+1][x+1] & (JPEG2000_T1_SIG | JPEG2000_T1_VIS))) {
|
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][x+1] & flags_mask,
|
dec = ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + ff_jpeg2000_getsigctxno(t1->flags[(y+1) * t1->stride + x+1] & flags_mask,
|
||||||
bandno));
|
bandno));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (dec) {
|
if (dec) {
|
||||||
int xorbit;
|
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);
|
&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) ^
|
t1->mqc.cx_states + ctxno) ^
|
||||||
xorbit)
|
xorbit)
|
||||||
? -mask : mask;
|
? -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;
|
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 term_cnt = 0;
|
||||||
int coder_type;
|
int coder_type;
|
||||||
|
|
||||||
av_assert0(width <= JPEG2000_MAX_CBLKW);
|
av_assert0(width <= 1024U && height <= 1024U);
|
||||||
av_assert0(height <= JPEG2000_MAX_CBLKH);
|
av_assert0(width*height <= 4096);
|
||||||
|
|
||||||
for (y = 0; y < height; y++)
|
memset(t1->data, 0, t1->stride * height * sizeof(*t1->data));
|
||||||
memset(t1->data[y], 0, width * sizeof(**t1->data));
|
|
||||||
|
|
||||||
/* If code-block contains no compressed data: nothing to do. */
|
/* If code-block contains no compressed data: nothing to do. */
|
||||||
if (!cblk->length)
|
if (!cblk->length)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
for (y = 0; y < height + 2; y++)
|
memset(t1->flags, 0, t1->stride * (height + 2) * sizeof(*t1->flags));
|
||||||
memset(t1->flags[y], 0, (width + 2) * sizeof(**t1->flags));
|
|
||||||
|
|
||||||
cblk->data[cblk->length] = 0xff;
|
cblk->data[cblk->length] = 0xff;
|
||||||
cblk->data[cblk->length+1] = 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];
|
int w = cblk->coord[0][1] - cblk->coord[0][0];
|
||||||
for (j = 0; j < (cblk->coord[1][1] - cblk->coord[1][0]); ++j) {
|
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];
|
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)
|
for (i = 0; i < w; ++i)
|
||||||
datap[i] = src[i] * band->f_stepsize;
|
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];
|
int w = cblk->coord[0][1] - cblk->coord[0][0];
|
||||||
for (j = 0; j < (cblk->coord[1][1] - cblk->coord[1][0]); ++j) {
|
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];
|
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) {
|
if (band->i_stepsize == 16384) {
|
||||||
for (i = 0; i < w; ++i)
|
for (i = 0; i < w; ++i)
|
||||||
datap[i] = src[i] / 2;
|
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];
|
int w = cblk->coord[0][1] - cblk->coord[0][0];
|
||||||
for (j = 0; j < (cblk->coord[1][1] - cblk->coord[1][0]); ++j) {
|
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];
|
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)
|
for (i = 0; i < w; ++i)
|
||||||
datap[i] = (src[i] * (int64_t)band->i_stepsize + (1<<14)) >> 15;
|
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;
|
Jpeg2000Component *comp = tile->comp + compno;
|
||||||
Jpeg2000CodingStyle *codsty = tile->codsty + compno;
|
Jpeg2000CodingStyle *codsty = tile->codsty + compno;
|
||||||
|
|
||||||
|
t1.stride = (1<<codsty->log2_cblk_width) + 2;
|
||||||
|
|
||||||
/* Loop on resolution levels */
|
/* Loop on resolution levels */
|
||||||
for (reslevelno = 0; reslevelno < codsty->nreslevels2decode; reslevelno++) {
|
for (reslevelno = 0; reslevelno < codsty->nreslevels2decode; reslevelno++) {
|
||||||
Jpeg2000ResLevel *rlevel = comp->reslevel + reslevelno;
|
Jpeg2000ResLevel *rlevel = comp->reslevel + reslevelno;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user