From: Carl Eugen Hoyos Date: Sat, 3 Dec 2011 11:22:12 +0000 (+0100) Subject: Support decoding right-to-left targa files. X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=88bbabcc006edf7fb4c8ba339d4a64a8b5b8c3d8;p=ffmpeg Support decoding right-to-left targa files. Fixes ticket #698. --- diff --git a/libavcodec/targa.c b/libavcodec/targa.c index 884bae6cc94..f60524dc843 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);