From 88bbabcc006edf7fb4c8ba339d4a64a8b5b8c3d8 Mon Sep 17 00:00:00 2001 From: Carl Eugen Hoyos Date: Sat, 3 Dec 2011 12:22:12 +0100 Subject: [PATCH] Support decoding right-to-left targa files. Fixes ticket #698. --- libavcodec/targa.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/libavcodec/targa.c b/libavcodec/targa.c index 884bae6cc9..f60524dc84 100644 --- a/libavcodec/targa.c +++ b/libavcodec/targa.c @@ -231,6 +231,29 @@ static int decode_frame(AVCodecContext *avctx, } } } + if(flags & 0x10){ // right-to-left, needs horizontal flip + int x; + for(y = 0; y < s->height; y++){ + void *line = &p->data[0][y * p->linesize[0]]; + for(x = 0; x < s->width >> 1; x++){ + switch(s->bpp){ + case 32: + FFSWAP(uint32_t, ((uint32_t *)line)[x], ((uint32_t *)line)[s->width - x]); + break; + case 24: + FFSWAP(uint8_t, ((uint8_t *)line)[3 * x ], ((uint8_t *)line)[3 * s->width - 3 * x ]); + FFSWAP(uint8_t, ((uint8_t *)line)[3 * x + 1], ((uint8_t *)line)[3 * s->width - 3 * x + 1]); + FFSWAP(uint8_t, ((uint8_t *)line)[3 * x + 2], ((uint8_t *)line)[3 * s->width - 3 * x + 2]); + break; + case 16: + FFSWAP(uint16_t, ((uint16_t *)line)[x], ((uint16_t *)line)[s->width - x]); + break; + case 8: + FFSWAP(uint8_t, ((uint8_t *)line)[x], ((uint8_t *)line)[s->width - x]); + } + } + } + } *picture= *(AVFrame*)&s->picture; *data_size = sizeof(AVPicture);