diff options
author | Carl Eugen Hoyos | 2011-12-03 12:22:12 +0100 |
---|---|---|
committer | Carl Eugen Hoyos | 2011-12-03 12:22:12 +0100 |
commit | 88bbabcc006edf7fb4c8ba339d4a64a8b5b8c3d8 (patch) | |
tree | aa76fbb41be52cad6e64fb198ccd12616353e4d1 /libavcodec/targa.c | |
parent | 90bfd511c4b6098d247341227059bdd714fb62ba (diff) |
Support decoding right-to-left targa files.
Fixes ticket #698.
Diffstat (limited to 'libavcodec/targa.c')
-rw-r--r-- | libavcodec/targa.c | 23 |
1 files changed, 23 insertions, 0 deletions
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); |