uint8_t properties[4];
Jpeg2000CodingStyle codsty[4];
Jpeg2000QuantStyle qntsty[4];
- Jpeg2000TilePart tile_part[6];
+ Jpeg2000TilePart tile_part[256];
uint16_t tp_idx; // Tile-part index
} Jpeg2000Tile;
Jpeg2000TgtNode *stack[30];
int sp = -1, curval = 0;
- if (!node)
+ if (!node) {
+ av_log(s->avctx, AV_LOG_ERROR, "missing node\n");
return AVERROR_INVALIDDATA;
+ }
while (node && !node->vis) {
stack[++sp] = node;
const enum AVPixelFormat *possible_fmts = NULL;
int possible_fmts_nb = 0;
- if (bytestream2_get_bytes_left(&s->g) < 36)
+ if (bytestream2_get_bytes_left(&s->g) < 36) {
+ av_log(s->avctx, AV_LOG_ERROR, "Insufficient space for SIZ\n");
return AVERROR_INVALIDDATA;
+ }
s->avctx->profile = bytestream2_get_be16u(&s->g); // Rsiz
s->width = bytestream2_get_be32u(&s->g); // Width
return AVERROR_INVALIDDATA;
}
- if (bytestream2_get_bytes_left(&s->g) < 3 * s->ncomponents)
+ if (bytestream2_get_bytes_left(&s->g) < 3 * s->ncomponents) {
+ av_log(s->avctx, AV_LOG_ERROR, "Insufficient space for %d components in SIZ\n", s->ncomponents);
return AVERROR_INVALIDDATA;
+ }
for (i = 0; i < s->ncomponents; i++) { // Ssiz_i XRsiz_i, YRsiz_i
uint8_t x = bytestream2_get_byteu(&s->g);
break;
}
}
+
+ if (i == possible_fmts_nb) {
+ if (ncomponents == 4 &&
+ s->cdy[0] == 1 && s->cdx[0] == 1 &&
+ s->cdy[1] == 1 && s->cdx[1] == 1 &&
+ s->cdy[2] == s->cdy[3] && s->cdx[2] == s->cdx[3]) {
+ if (s->precision == 8 && s->cdy[2] == 2 && s->cdx[2] == 2 && !s->pal8) {
+ s->avctx->pix_fmt = AV_PIX_FMT_YUVA420P;
+ s->cdef[0] = 0;
+ s->cdef[1] = 1;
+ s->cdef[2] = 2;
+ s->cdef[3] = 3;
+ i = 0;
+ }
+ }
+ }
+
+
if (i == possible_fmts_nb) {
av_log(s->avctx, AV_LOG_ERROR,
"Unknown pix_fmt, profile: %d, colour_space: %d, "
- "components: %d, precision: %d, "
- "cdx[1]: %d, cdy[1]: %d, cdx[2]: %d, cdy[2]: %d\n",
+ "components: %d, precision: %d\n"
+ "cdx[0]: %d, cdy[0]: %d\n"
+ "cdx[1]: %d, cdy[1]: %d\n"
+ "cdx[2]: %d, cdy[2]: %d\n"
+ "cdx[3]: %d, cdy[3]: %d\n",
s->avctx->profile, s->colour_space, ncomponents, s->precision,
- ncomponents > 2 ? s->cdx[1] : 0,
- ncomponents > 2 ? s->cdy[1] : 0,
+ s->cdx[0],
+ s->cdy[0],
+ ncomponents > 1 ? s->cdx[1] : 0,
+ ncomponents > 1 ? s->cdy[1] : 0,
ncomponents > 2 ? s->cdx[2] : 0,
- ncomponents > 2 ? s->cdy[2] : 0);
+ ncomponents > 2 ? s->cdy[2] : 0,
+ ncomponents > 3 ? s->cdx[3] : 0,
+ ncomponents > 3 ? s->cdy[3] : 0);
return AVERROR_PATCHWELCOME;
}
s->avctx->bits_per_raw_sample = s->precision;
{
uint8_t byte;
- if (bytestream2_get_bytes_left(&s->g) < 5)
+ if (bytestream2_get_bytes_left(&s->g) < 5) {
+ av_log(s->avctx, AV_LOG_ERROR, "Insufficient space for COX\n");
return AVERROR_INVALIDDATA;
+ }
/* nreslevels = number of resolution levels
= number of decomposition level +1 */
Jpeg2000CodingStyle tmp;
int compno, ret;
- if (bytestream2_get_bytes_left(&s->g) < 5)
+ if (bytestream2_get_bytes_left(&s->g) < 5) {
+ av_log(s->avctx, AV_LOG_ERROR, "Insufficient space for COD\n");
return AVERROR_INVALIDDATA;
+ }
tmp.csty = bytestream2_get_byteu(&s->g);
{
int compno, ret;
- if (bytestream2_get_bytes_left(&s->g) < 2)
+ if (bytestream2_get_bytes_left(&s->g) < 2) {
+ av_log(s->avctx, AV_LOG_ERROR, "Insufficient space for COC\n");
return AVERROR_INVALIDDATA;
+ }
compno = bytestream2_get_byteu(&s->g);
Jpeg2000TilePart *tp;
uint16_t Isot;
uint32_t Psot;
- uint8_t TPsot;
+ unsigned TPsot;
if (bytestream2_get_bytes_left(&s->g) < 8)
return AVERROR_INVALIDDATA;
return AVERROR_INVALIDDATA;
}
- if (TPsot >= FF_ARRAY_ELEMS(s->tile[Isot].tile_part)) {
- avpriv_request_sample(s->avctx, "Support for %"PRIu8" components", TPsot);
- return AVERROR_PATCHWELCOME;
- }
+ av_assert0(TPsot < FF_ARRAY_ELEMS(s->tile[Isot].tile_part));
s->tile[Isot].tp_idx = TPsot;
tp = s->tile[Isot].tile_part + TPsot;
}
}
+ if (bytestream2_peek_be32(&s->g) == JPEG2000_SOP_FIXED_BYTES)
+ bytestream2_skip(&s->g, JPEG2000_SOP_BYTE_LENGTH);
+
if (!(ret = get_bits(s, 1))) {
jpeg2000_flush(s);
return 0;
|| sizeof(cblk->data) < cblk->length + cblk->lengthinc[cwsno] + 4
) {
av_log(s->avctx, AV_LOG_ERROR,
- "Block length %"PRIu16" or lengthinc %d is too large\n",
- cblk->length, cblk->lengthinc[cwsno]);
+ "Block length %"PRIu16" or lengthinc %d is too large, left %d\n",
+ cblk->length, cblk->lengthinc[cwsno], bytestream2_get_bytes_left(&s->g));
return AVERROR_INVALIDDATA;
}
int layno, reslevelno, compno, precno, ok_reslevel;
int x, y;
int tp_index = 0;
+ int step_x, step_y;
s->bit_index = 8;
switch (tile->codsty[0].prog_order) {
break;
case JPEG2000_PGOD_LRCP:
+ av_log(s->avctx, AV_LOG_DEBUG, "Progression order LRCP\n");
for (layno = 0; layno < tile->codsty[0].nlayers; layno++) {
ok_reslevel = 1;
for (reslevelno = 0; ok_reslevel; reslevelno++) {
break;
case JPEG2000_PGOD_CPRL:
+ av_log(s->avctx, AV_LOG_DEBUG, "Progression order CPRL\n");
for (compno = 0; compno < s->ncomponents; compno++) {
Jpeg2000Component *comp = tile->comp + compno;
Jpeg2000CodingStyle *codsty = tile->codsty + compno;
Jpeg2000QuantStyle *qntsty = tile->qntsty + compno;
- int step_x = 32;
- int step_y = 32;
int maxlogstep_x = 0;
int maxlogstep_y = 0;
+ int start_x, start_y;
+ step_x = 32;
+ step_y = 32;
for (reslevelno = 0; reslevelno < codsty->nreslevels; reslevelno++) {
uint8_t reducedresno = codsty->nreslevels - 1 -reslevelno; // ==> N_L - r
step_x = 1<<step_x;
step_y = 1<<step_y;
- y = comp->coord_o[1][0] >> maxlogstep_y << maxlogstep_y;
- for (; y < comp->coord_o[1][1]; y += step_y) {
- x = comp->coord_o[0][0] >> maxlogstep_x << maxlogstep_x;
- for (; x < comp->coord_o[0][1]; x += step_x) {
+ start_y = comp->coord_o[1][0] >> maxlogstep_y << maxlogstep_y;
+ start_x = comp->coord_o[0][0] >> maxlogstep_x << maxlogstep_x;
+ for (y = start_y; y < comp->coord_o[1][1]; y += step_y) {
+ for (x = start_x; x < comp->coord_o[0][1]; x += step_x) {
for (reslevelno = 0; reslevelno < codsty->nreslevels; reslevelno++) {
- uint16_t prcx, prcy;
+ unsigned prcx, prcy;
uint8_t reducedresno = codsty->nreslevels - 1 -reslevelno; // ==> N_L - r
Jpeg2000ResLevel *rlevel = comp->reslevel + reslevelno;
- if (!((y % (1 << (rlevel->log2_prec_height + reducedresno)) == 0) ||
- (y == 0))) // TODO: 2nd condition simplified as try0 always =0 for dcinema
+ if (y % (1 << (rlevel->log2_prec_height + reducedresno)))
continue;
- if (!((x % (1 << (rlevel->log2_prec_width + reducedresno)) == 0) ||
- (x == 0))) // TODO: 2nd condition simplified as try0 always =0 for dcinema
+ if (x % (1 << (rlevel->log2_prec_width + reducedresno)))
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;
+ prcx -= ff_jpeg2000_ceildivpow2(comp->coord_o[0][0], reducedresno) >> rlevel->log2_prec_width;
+ prcy -= ff_jpeg2000_ceildivpow2(comp->coord_o[1][0], reducedresno) >> rlevel->log2_prec_height;
+
precno = prcx + rlevel->num_precincts_x * prcy;
if (prcx >= rlevel->num_precincts_x || prcy >= rlevel->num_precincts_y) {
break;
case JPEG2000_PGOD_RPCL:
- avpriv_request_sample(s->avctx, "Progression order RPCL");
- ret = AVERROR_PATCHWELCOME;
+ av_log(s->avctx, AV_LOG_WARNING, "Progression order RPCL\n");
+ ok_reslevel = 1;
+ for (reslevelno = 0; ok_reslevel; reslevelno++) {
+ ok_reslevel = 0;
+
+ step_x = 32;
+ step_y = 32;
+ for (compno = 0; compno < s->ncomponents; compno++) {
+ Jpeg2000Component *comp = tile->comp + compno;
+ Jpeg2000CodingStyle *codsty = tile->codsty + compno;
+
+ if (reslevelno < codsty->nreslevels) {
+ uint8_t reducedresno = codsty->nreslevels - 1 -reslevelno; // ==> N_L - r
+ Jpeg2000ResLevel *rlevel = comp->reslevel + reslevelno;
+ step_x = FFMIN(step_x, rlevel->log2_prec_width + reducedresno);
+ step_y = FFMIN(step_y, rlevel->log2_prec_height + reducedresno);
+ }
+ }
+ step_x = 1<<step_x;
+ step_y = 1<<step_y;
+
+ //FIXME we could iterate over less than the whole image
+ for (y = 0; y < s->height; y += step_y) {
+ for (x = 0; x < s->width; x += step_x) {
+ for (compno = 0; compno < s->ncomponents; compno++) {
+ Jpeg2000Component *comp = tile->comp + compno;
+ Jpeg2000CodingStyle *codsty = tile->codsty + compno;
+ Jpeg2000QuantStyle *qntsty = tile->qntsty + compno;
+ uint8_t reducedresno = codsty->nreslevels - 1 -reslevelno; // ==> N_L - r
+ Jpeg2000ResLevel *rlevel = comp->reslevel + reslevelno;
+ unsigned prcx, prcy;
+
+ int xc = x / s->cdx[compno];
+ int yc = y / s->cdy[compno];
+
+ if (reslevelno >= codsty->nreslevels)
+ continue;
+
+ if (yc % (1 << (rlevel->log2_prec_height + reducedresno)))
+ continue;
+
+ if (xc % (1 << (rlevel->log2_prec_width + reducedresno)))
+ continue;
+
+ // check if a precinct exists
+ prcx = ff_jpeg2000_ceildivpow2(xc, reducedresno) >> rlevel->log2_prec_width;
+ prcy = ff_jpeg2000_ceildivpow2(yc, reducedresno) >> rlevel->log2_prec_height;
+ prcx -= ff_jpeg2000_ceildivpow2(comp->coord_o[0][0], reducedresno) >> rlevel->log2_prec_width;
+ prcy -= ff_jpeg2000_ceildivpow2(comp->coord_o[1][0], reducedresno) >> rlevel->log2_prec_height;
+
+ precno = prcx + rlevel->num_precincts_x * prcy;
+
+ ok_reslevel = 1;
+ if (prcx >= rlevel->num_precincts_x || prcy >= rlevel->num_precincts_y) {
+ av_log(s->avctx, AV_LOG_WARNING, "prc %d %d outside limits %d %d\n",
+ prcx, prcy, rlevel->num_precincts_x, rlevel->num_precincts_y);
+ continue;
+ }
+
+ for (layno = 0; layno < tile->codsty[0].nlayers; layno++) {
+ if ((ret = jpeg2000_decode_packet(s, tile, &tp_index,
+ codsty, rlevel,
+ precno, layno,
+ qntsty->expn + (reslevelno ? 3 * (reslevelno - 1) + 1 : 0),
+ qntsty->nguardbits)) < 0)
+ return ret;
+ }
+ }
+ }
+ }
+ }
break;
case JPEG2000_PGOD_PCRL:
- avpriv_request_sample(s->avctx, "Progression order PCRL");
- ret = AVERROR_PATCHWELCOME;
+ av_log(s->avctx, AV_LOG_WARNING, "Progression order PCRL");
+ step_x = 32;
+ step_y = 32;
+ for (compno = 0; compno < s->ncomponents; compno++) {
+ Jpeg2000Component *comp = tile->comp + compno;
+ Jpeg2000CodingStyle *codsty = tile->codsty + compno;
+ Jpeg2000QuantStyle *qntsty = tile->qntsty + compno;
+
+ for (reslevelno = 0; reslevelno < codsty->nreslevels; reslevelno++) {
+ uint8_t reducedresno = codsty->nreslevels - 1 -reslevelno; // ==> N_L - r
+ Jpeg2000ResLevel *rlevel = comp->reslevel + reslevelno;
+ step_x = FFMIN(step_x, rlevel->log2_prec_width + reducedresno);
+ step_y = FFMIN(step_y, rlevel->log2_prec_height + reducedresno);
+ }
+ }
+ step_x = 1<<step_x;
+ step_y = 1<<step_y;
+
+ //FIXME we could iterate over less than the whole image
+ for (y = 0; y < s->height; y += step_y) {
+ for (x = 0; x < s->width; x += step_x) {
+ for (compno = 0; compno < s->ncomponents; compno++) {
+ Jpeg2000Component *comp = tile->comp + compno;
+ Jpeg2000CodingStyle *codsty = tile->codsty + compno;
+ Jpeg2000QuantStyle *qntsty = tile->qntsty + compno;
+ int xc = x / s->cdx[compno];
+ int yc = y / s->cdy[compno];
+
+ for (reslevelno = 0; reslevelno < codsty->nreslevels; reslevelno++) {
+ unsigned prcx, prcy;
+ uint8_t reducedresno = codsty->nreslevels - 1 -reslevelno; // ==> N_L - r
+ Jpeg2000ResLevel *rlevel = comp->reslevel + reslevelno;
+
+ if (yc % (1 << (rlevel->log2_prec_height + reducedresno)))
+ continue;
+
+ if (xc % (1 << (rlevel->log2_prec_width + reducedresno)))
+ continue;
+
+ // check if a precinct exists
+ prcx = ff_jpeg2000_ceildivpow2(xc, reducedresno) >> rlevel->log2_prec_width;
+ prcy = ff_jpeg2000_ceildivpow2(yc, reducedresno) >> rlevel->log2_prec_height;
+ prcx -= ff_jpeg2000_ceildivpow2(comp->coord_o[0][0], reducedresno) >> rlevel->log2_prec_width;
+ prcy -= ff_jpeg2000_ceildivpow2(comp->coord_o[1][0], reducedresno) >> rlevel->log2_prec_height;
+
+ precno = prcx + rlevel->num_precincts_x * prcy;
+
+ if (prcx >= rlevel->num_precincts_x || prcy >= rlevel->num_precincts_y) {
+ av_log(s->avctx, AV_LOG_WARNING, "prc %d %d outside limits %d %d\n",
+ prcx, prcy, rlevel->num_precincts_x, rlevel->num_precincts_y);
+ continue;
+ }
+
+ for (layno = 0; layno < tile->codsty[0].nlayers; layno++) {
+ if ((ret = jpeg2000_decode_packet(s, tile, &tp_index, codsty, rlevel,
+ precno, layno,
+ qntsty->expn + (reslevelno ? 3 * (reslevelno - 1) + 1 : 0),
+ qntsty->nguardbits)) < 0)
+ return ret;
+ }
+ }
+ }
+ }
+ }
break;
default:
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_NB)
+ 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))) {
- 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);
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], &xorbit);
+ int xorbit, ctxno = ff_jpeg2000_getsgnctxno(t1->flags[y+1][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;
else
}
static void decode_refpass(Jpeg2000T1Context *t1, int width, int height,
- int bpno)
+ int bpno, int vert_causal_ctx_csty_symbol)
{
int phalf, nhalf;
int y0, x, y;
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]);
+ 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 r = ff_mqc_decode(&t1->mqc,
t1->mqc.cx_states + ctxno)
? phalf : nhalf;
for (y0 = 0; y0 < height; y0 += 4) {
for (x = 0; x < width; x++) {
+ int flags_mask = -1;
+ 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)))) {
+ (t1->flags[y0 + 4][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,
}
for (y = y0 + runlen; y < y0 + 4 && y < height; y++) {
+ 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 (!dec) {
if (!(t1->flags[y+1][x+1] & (JPEG2000_T1_SIG | JPEG2000_T1_VIS))) {
- 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);
dec = ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + ff_jpeg2000_getsigctxno(t1->flags[y+1][x+1] & flags_mask,
bandno));
}
}
if (dec) {
int xorbit;
- int ctxno = ff_jpeg2000_getsgnctxno(t1->flags[y + 1][x + 1],
+ int ctxno = ff_jpeg2000_getsgnctxno(t1->flags[y + 1][x + 1] & flags_mask,
&xorbit);
t1->data[y][x] = (ff_mqc_decode(&t1->mqc,
t1->mqc.cx_states + ctxno) ^
vert_causal_ctx_csty_symbol);
break;
case 1:
- decode_refpass(t1, width, height, bpno + 1);
+ decode_refpass(t1, width, height, bpno + 1, vert_causal_ctx_csty_symbol);
break;
case 2:
av_assert2(!t1->mqc.raw);
vert_causal_ctx_csty_symbol);
break;
}
- if ((coder_type = needs_termination(codsty->cblk_style, pass_cnt))) {
+ if (codsty->cblk_style & JPEG2000_CBLK_RESET) // XXX no testcase for just this
+ ff_mqc_init_contexts(&t1->mqc);
+
+ if (passno && (coder_type = needs_termination(codsty->cblk_style, pass_cnt))) {
if (term_cnt >= cblk->nb_terminations) {
av_log(s->avctx, AV_LOG_ERROR, "Missing needed termination \n");
return AVERROR_INVALIDDATA;
}
pass_cnt ++;
}
+
+ if (cblk->data + cblk->length - 2*(term_cnt < cblk->nb_terminations) != t1->mqc.bp) {
+ av_log(s->avctx, AV_LOG_WARNING, "End mismatch %"PTRDIFF_SPECIFIER"\n",
+ cblk->data + cblk->length - 2*(term_cnt < cblk->nb_terminations) - t1->mqc.bp);
+ }
+
return 0;
}
cblk->coord[1][1] - cblk->coord[1][0],
bandpos);
- x = cblk->coord[0][0];
- y = cblk->coord[1][0];
+ x = cblk->coord[0][0] - band->coord[0][0];
+ y = cblk->coord[1][0] - band->coord[1][0];
if (codsty->transform == FF_DWT97)
dequantization_float(x, y, cblk, comp, &t1, band);
break;
len = bytestream2_get_be16(&s->g);
- if (len < 2 || bytestream2_get_bytes_left(&s->g) < len - 2)
+ if (len < 2 || bytestream2_get_bytes_left(&s->g) < len - 2) {
+ av_log(s->avctx, AV_LOG_ERROR, "Invalid len %d left=%d\n", len, bytestream2_get_bytes_left(&s->g));
return AVERROR_INVALIDDATA;
+ }
switch (marker) {
case JPEG2000_SIZ:
for (tileno = 0; tileno < s->numXtiles * s->numYtiles; tileno++) {
Jpeg2000Tile *tile = s->tile + tileno;
- if (ret = init_tile(s, tileno))
+ if ((ret = init_tile(s, tileno)) < 0)
return ret;
s->g = tile->tile_part[0].tpg;
- if (ret = jpeg2000_decode_packets(s, tile))
+ if ((ret = jpeg2000_decode_packets(s, tile)) < 0)
return ret;
}