diff options
author | Michael Niedermayer <michael@niedermayer.cc> | 2017-03-13 00:18:04 +0100 |
---|---|---|
committer | Michael Niedermayer <michael@niedermayer.cc> | 2017-03-14 02:23:50 +0100 |
commit | acdacb108d98e42bb631de0d3859958662aa2019 (patch) | |
tree | 2b4ba153a335d3cdd3ea00c08471828b7fc039f9 /libavcodec/targa.c | |
parent | 1467143a6ebf08a16ec0b833ae462f88345828bd (diff) | |
download | ffmpeg-acdacb108d98e42bb631de0d3859958662aa2019.tar.gz |
avcodec/targa: Skip hflip on blank images
Fixes: timeout with 810/clusterfuzz-testcase-5249282825256960
Found-by: continuous fuzzing process https://github.com/google/oss-fuzz/tree/master/targets/ffmpeg
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
Diffstat (limited to 'libavcodec/targa.c')
-rw-r--r-- | libavcodec/targa.c | 41 |
1 files changed, 21 insertions, 20 deletions
diff --git a/libavcodec/targa.c b/libavcodec/targa.c index 215c0f51f6..93e0ef7905 100644 --- a/libavcodec/targa.c +++ b/libavcodec/targa.c @@ -265,32 +265,33 @@ static int decode_frame(AVCodecContext *avctx, line = advance_line(dst, line, stride, &y, h, interleave); } while (line); } - } - if (flags & TGA_RIGHTTOLEFT) { // right-to-left, needs horizontal flip - int x; - for (y = 0; y < h; y++) { - void *line = &p->data[0][y * p->linesize[0]]; - for (x = 0; x < w >> 1; x++) { - switch (bpp) { - case 32: - FFSWAP(uint32_t, ((uint32_t *)line)[x], ((uint32_t *)line)[w - x - 1]); - break; - case 24: - FFSWAP(uint8_t, ((uint8_t *)line)[3 * x ], ((uint8_t *)line)[3 * w - 3 * x - 3]); - FFSWAP(uint8_t, ((uint8_t *)line)[3 * x + 1], ((uint8_t *)line)[3 * w - 3 * x - 2]); - FFSWAP(uint8_t, ((uint8_t *)line)[3 * x + 2], ((uint8_t *)line)[3 * w - 3 * x - 1]); - break; - case 16: - FFSWAP(uint16_t, ((uint16_t *)line)[x], ((uint16_t *)line)[w - x - 1]); - break; - case 8: - FFSWAP(uint8_t, ((uint8_t *)line)[x], ((uint8_t *)line)[w - x - 1]); + if (flags & TGA_RIGHTTOLEFT) { // right-to-left, needs horizontal flip + int x; + for (y = 0; y < h; y++) { + void *line = &p->data[0][y * p->linesize[0]]; + for (x = 0; x < w >> 1; x++) { + switch (bpp) { + case 32: + FFSWAP(uint32_t, ((uint32_t *)line)[x], ((uint32_t *)line)[w - x - 1]); + break; + case 24: + FFSWAP(uint8_t, ((uint8_t *)line)[3 * x ], ((uint8_t *)line)[3 * w - 3 * x - 3]); + FFSWAP(uint8_t, ((uint8_t *)line)[3 * x + 1], ((uint8_t *)line)[3 * w - 3 * x - 2]); + FFSWAP(uint8_t, ((uint8_t *)line)[3 * x + 2], ((uint8_t *)line)[3 * w - 3 * x - 1]); + break; + case 16: + FFSWAP(uint16_t, ((uint16_t *)line)[x], ((uint16_t *)line)[w - x - 1]); + break; + case 8: + FFSWAP(uint8_t, ((uint8_t *)line)[x], ((uint8_t *)line)[w - x - 1]); + } } } } } + *got_frame = 1; return avpkt->size; |