diff options
author | Justin Ruggles <justin.ruggles@gmail.com> | 2012-01-02 15:17:12 -0500 |
---|---|---|
committer | Justin Ruggles <justin.ruggles@gmail.com> | 2012-01-13 17:11:41 -0500 |
commit | faaebcdf6bd67880f50e7ec180f24870e7bd8cef (patch) | |
tree | c853b264fe39093a3f50296c8dd8c4b35ec9010f /libavcodec/targa.c | |
parent | e1a7af6f290489812ed47359eaff0edac2f5df95 (diff) | |
download | ffmpeg-faaebcdf6bd67880f50e7ec180f24870e7bd8cef.tar.gz |
targa: add support for rgb555 palette
Diffstat (limited to 'libavcodec/targa.c')
-rw-r--r-- | libavcodec/targa.c | 39 |
1 files changed, 29 insertions, 10 deletions
diff --git a/libavcodec/targa.c b/libavcodec/targa.c index b821d74f8d..00da7587d0 100644 --- a/libavcodec/targa.c +++ b/libavcodec/targa.c @@ -22,6 +22,7 @@ #include "libavutil/intreadwrite.h" #include "libavutil/imgutils.h" #include "avcodec.h" +#include "bytestream.h" #include "targa.h" typedef struct TargaContext { @@ -172,27 +173,45 @@ static int decode_frame(AVCodecContext *avctx, } if(colors){ - size_t pal_size; + int pal_size, pal_sample_size; if((colors + first_clr) > 256){ av_log(avctx, AV_LOG_ERROR, "Incorrect palette: %i colors with offset %i\n", colors, first_clr); return -1; } - if(csize != 24){ + switch (csize) { + case 24: pal_sample_size = 3; break; + case 16: + case 15: pal_sample_size = 2; break; + default: av_log(avctx, AV_LOG_ERROR, "Palette entry size %i bits is not supported\n", csize); return -1; } - pal_size = colors * ((csize + 1) >> 3); + pal_size = colors * pal_sample_size; CHECK_BUFFER_SIZE(buf, buf_end, pal_size, "color table"); if(avctx->pix_fmt != PIX_FMT_PAL8)//should not occur but skip palette anyway buf += pal_size; else{ - int r, g, b, t; - int32_t *pal = ((int32_t*)p->data[1]) + first_clr; - for(t = 0; t < colors; t++){ - r = *buf++; - g = *buf++; - b = *buf++; - *pal++ = (b << 16) | (g << 8) | r; + int t; + uint32_t *pal = ((uint32_t *)p->data[1]) + first_clr; + + switch (pal_sample_size) { + case 3: + /* RGB24 */ + for (t = 0; t < colors; t++) + *pal++ = bytestream_get_le24(&buf); + break; + case 2: + /* RGB555 */ + for (t = 0; t < colors; t++) { + uint32_t v = bytestream_get_le16(&buf); + v = ((v & 0x7C00) << 9) | + ((v & 0x03E0) << 6) | + ((v & 0x001F) << 3); + /* left bit replication */ + v |= (v & 0xE0E0E0U) >> 5; + *pal++ = v; + } + break; } p->palette_has_changed = 1; } |