Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/FFmpeg/FFmpeg.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2013-07-08 02:57:32 +0400
committerMichael Niedermayer <michaelni@gmx.at>2013-07-18 23:43:42 +0400
commit99de97cabf35c035b628943b865ab991583a6ea5 (patch)
tree72911968565b452462537c4b7599525bc90fb65b /libavcodec/jpeg2000dec.c
parented8c34a7666a2ad7a528492c3aeed00decb0c35e (diff)
jpeg2000dec: parse CDEF
Signed-off-by: Michael Niedermayer <michaelni@gmx.at> Conflicts: libavcodec/jpeg2000dec.c Reviewed-by: Paul B Mahol <onemda@gmail.com> Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavcodec/jpeg2000dec.c')
-rw-r--r--libavcodec/jpeg2000dec.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/libavcodec/jpeg2000dec.c b/libavcodec/jpeg2000dec.c
index 7f94cad4a9..5118e7b4f1 100644
--- a/libavcodec/jpeg2000dec.c
+++ b/libavcodec/jpeg2000dec.c
@@ -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;