|
|
@@ -77,6 +77,7 @@ typedef struct Jpeg2000DecoderContext { |
|
|
|
int colour_space; |
|
|
|
uint32_t palette[256]; |
|
|
|
int8_t pal8; |
|
|
|
int cdef[4]; |
|
|
|
int tile_width, tile_height; |
|
|
|
unsigned numXtiles, numYtiles; |
|
|
|
int maxtilelen; |
|
|
@@ -1229,6 +1230,13 @@ static int jpeg2000_decode_tile(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile, |
|
|
|
if (tile->codsty[0].mct) |
|
|
|
mct_decode(s, tile); |
|
|
|
|
|
|
|
if (s->cdef[0] < 0) { |
|
|
|
for (x = 0; x < s->ncomponents; x++) |
|
|
|
s->cdef[x] = x + 1; |
|
|
|
if ((s->ncomponents & 1) == 0) |
|
|
|
s->cdef[s->ncomponents-1] = 0; |
|
|
|
} |
|
|
|
|
|
|
|
if (s->precision <= 8) { |
|
|
|
for (compno = 0; compno < s->ncomponents; compno++) { |
|
|
|
Jpeg2000Component *comp = tile->comp + compno; |
|
|
@@ -1535,6 +1543,21 @@ static int jp2_find_codestream(Jpeg2000DecoderContext *s) |
|
|
|
atom2_size -= size; |
|
|
|
bytestream2_skipu(&s->g, atom2_size); |
|
|
|
atom_size -= atom2_size; |
|
|
|
} else if (atom2 == MKBETAG('c','d','e','f') && atom2_size >= 2 && |
|
|
|
bytestream2_get_bytes_left(&s->g) >= atom2_size) { |
|
|
|
int n = bytestream2_get_be16u(&s->g); |
|
|
|
atom_size -= 2; |
|
|
|
atom2_size -= 2; |
|
|
|
for (; n>0; n--) { |
|
|
|
int cn = bytestream2_get_be16(&s->g); |
|
|
|
int typ = bytestream2_get_be16(&s->g); |
|
|
|
int asoc = bytestream2_get_be16(&s->g); |
|
|
|
if (cn < 4 || asoc < 4) |
|
|
|
s->cdef[cn] = asoc; |
|
|
|
atom_size -= 6; |
|
|
|
atom2_size -= 6; |
|
|
|
} |
|
|
|
bytestream2_skipu(&s->g, atom2_size); |
|
|
|
} else { |
|
|
|
bytestream2_skipu(&s->g, atom2_size); |
|
|
|
atom_size -= atom2_size; |
|
|
@@ -1565,6 +1588,7 @@ static int jpeg2000_decode_frame(AVCodecContext *avctx, void *data, |
|
|
|
s->avctx = avctx; |
|
|
|
bytestream2_init(&s->g, avpkt->data, avpkt->size); |
|
|
|
s->curtileno = -1; |
|
|
|
memset(s->cdef, -1, sizeof(s->cdef)); |
|
|
|
|
|
|
|
if (bytestream2_get_bytes_left(&s->g) < 2) { |
|
|
|
ret = AVERROR_INVALIDDATA; |
|
|
|