diff options
author | Michael Niedermayer <michael@niedermayer.cc> | 2018-12-02 00:35:49 +0100 |
---|---|---|
committer | Michael Niedermayer <michael@niedermayer.cc> | 2018-12-08 17:01:03 +0100 |
commit | fe0416f8a1be660ef9a38cb378a593598d74a448 (patch) | |
tree | 2d401fa51e0c92accd4282d6d4ca4aad4aae4ddd | |
parent | 2bc3811c0d6b34e43a55a7541722761f548628d0 (diff) | |
download | ffmpeg-fe0416f8a1be660ef9a38cb378a593598d74a448.tar.gz |
avcodec/jpeg2000dec: Skip DWT if nothing is coded
Improves speed in uncommon case
Fixes: Timeout
Fixes: 10964/clusterfuzz-testcase-minimized-ffmpeg_AV_CODEC_ID_JPEG2000_fuzzer-5132066034286592
Found-by: continuous fuzzing process https://github.com/google/oss-fuzz/tree/master/projects/ffmpeg
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
-rw-r--r-- | libavcodec/jpeg2000dec.c | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/libavcodec/jpeg2000dec.c b/libavcodec/jpeg2000dec.c index 5b07f07aa9..a4291bc06b 100644 --- a/libavcodec/jpeg2000dec.c +++ b/libavcodec/jpeg2000dec.c @@ -1597,7 +1597,7 @@ static int decode_cblk(Jpeg2000DecoderContext *s, Jpeg2000CodingStyle *codsty, cblk->data + cblk->length - 2*(term_cnt < cblk->nb_terminations) - t1->mqc.bp); } - return 0; + return 1; } /* TODO: Verify dequantization for lossless case @@ -1694,6 +1694,7 @@ static inline void tile_codeblocks(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile for (compno = 0; compno < s->ncomponents; compno++) { Jpeg2000Component *comp = tile->comp + compno; Jpeg2000CodingStyle *codsty = tile->codsty + compno; + int coded = 0; t1.stride = (1<<codsty->log2_cblk_width) + 2; @@ -1723,11 +1724,12 @@ static inline void tile_codeblocks(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile cblkno++) { int x, y; Jpeg2000Cblk *cblk = prec->cblk + cblkno; - decode_cblk(s, codsty, &t1, cblk, + int ret = decode_cblk(s, codsty, &t1, cblk, cblk->coord[0][1] - cblk->coord[0][0], cblk->coord[1][1] - cblk->coord[1][0], bandpos); - + if (ret) + coded = 1; x = cblk->coord[0][0] - band->coord[0][0]; y = cblk->coord[1][0] - band->coord[1][0]; @@ -1743,7 +1745,9 @@ static inline void tile_codeblocks(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile } /* end reslevel */ /* inverse DWT */ - ff_dwt_decode(&comp->dwt, codsty->transform == FF_DWT97 ? (void*)comp->f_data : (void*)comp->i_data); + if (coded) + ff_dwt_decode(&comp->dwt, codsty->transform == FF_DWT97 ? (void*)comp->f_data : (void*)comp->i_data); + } /*end comp */ } |