diff options
author | Mike Melanson <mike@multimedia.cx> | 2002-10-18 23:43:25 +0000 |
---|---|---|
committer | Mike Melanson <mike@multimedia.cx> | 2002-10-18 23:43:25 +0000 |
commit | 6faab586f7d56366404ffcd55797a6224134fc51 (patch) | |
tree | c559252f8374e6b96a61a13b2b4046bfe02fa134 | |
parent | 8d74c5ee062c63f770d2ecf879f00b31492cb13c (diff) | |
download | xine-lib-6faab586f7d56366404ffcd55797a6224134fc51.tar.gz xine-lib-6faab586f7d56366404ffcd55797a6224134fc51.tar.bz2 |
added support for little-used RGB palette mode
CVS patchset: 2855
CVS date: 2002/10/18 23:43:25
-rw-r--r-- | src/libxinevdec/cinepak.c | 50 |
1 files changed, 43 insertions, 7 deletions
diff --git a/src/libxinevdec/cinepak.c b/src/libxinevdec/cinepak.c index 14e931644..baa0c83ae 100644 --- a/src/libxinevdec/cinepak.c +++ b/src/libxinevdec/cinepak.c @@ -22,7 +22,7 @@ * based on overview of Cinepak algorithm and example decoder * by Tim Ferguson: http://www.csse.monash.edu.au/~timf/ * - * $Id: cinepak.c,v 1.14 2002/09/05 22:19:02 mroi Exp $ + * $Id: cinepak.c,v 1.15 2002/10/18 23:43:25 tmmm Exp $ */ #include <stdlib.h> @@ -69,6 +69,7 @@ typedef struct cvid_decoder_s { cvid_strip_t strips[MAX_STRIPS]; } cvid_decoder_t; +static unsigned char yuv_palette[256 * 4]; static void cinepak_decode_codebook (cvid_codebook_t *codebook, int chunk_id, int size, uint8_t *data) @@ -95,12 +96,30 @@ static void cinepak_decode_codebook (cvid_codebook_t *codebook, if ((data + n) > eod) break; - codebook[i].y0 = *data++; - codebook[i].y1 = *data++; - codebook[i].y2 = *data++; - codebook[i].y3 = *data++; - codebook[i].u = 128 + ((n == 4) ? 0 : *data++); - codebook[i].v = 128 + ((n == 4) ? 0 : *data++); + if (n == 6) { + codebook[i].y0 = *data++; + codebook[i].y1 = *data++; + codebook[i].y2 = *data++; + codebook[i].y3 = *data++; + codebook[i].u = 128 + *data++; + codebook[i].v = 128 + *data++; + } else { + codebook[i].y0 = yuv_palette[*(data + 0) * 4]; + codebook[i].y1 = yuv_palette[*(data + 1) * 4]; + codebook[i].y2 = yuv_palette[*(data + 2) * 4]; + codebook[i].y3 = yuv_palette[*(data + 3) * 4]; + codebook[i].u = + (yuv_palette[*(data + 0) * 4 + 1] + + yuv_palette[*(data + 1) * 4 + 1] + + yuv_palette[*(data + 2) * 4 + 1] + + yuv_palette[*(data + 3) * 4 + 1]) / 4; + codebook[i].v = + (yuv_palette[*(data + 0) * 4 + 2] + + yuv_palette[*(data + 1) * 4 + 2] + + yuv_palette[*(data + 2) * 4 + 2] + + yuv_palette[*(data + 3) * 4 + 2]) / 4; + data += 4; + } } } } @@ -301,9 +320,26 @@ static void cvid_init (video_decoder_t *this_gen, vo_instance_t *video_out) { static void cvid_decode_data (video_decoder_t *this_gen, buf_element_t *buf) { cvid_decoder_t *this = (cvid_decoder_t *) this_gen; + palette_entry_t *palette; + int i; + if (buf->decoder_flags & BUF_FLAG_PREVIEW) return; + /* convert the RGB palette to a YUV palette */ + if ((buf->decoder_flags & BUF_FLAG_SPECIAL) && + (buf->decoder_info[1] == BUF_SPECIAL_PALETTE)) { + palette = (palette_entry_t *)buf->decoder_info[3]; + for (i = 0; i < buf->decoder_info[2]; i++) { + yuv_palette[i * 4 + 0] = + COMPUTE_Y(palette[i].r, palette[i].g, palette[i].b); + yuv_palette[i * 4 + 1] = + COMPUTE_U(palette[i].r, palette[i].g, palette[i].b); + yuv_palette[i * 4 + 2] = + COMPUTE_V(palette[i].r, palette[i].g, palette[i].b); + } + } + if (buf->decoder_flags & BUF_FLAG_HEADER) { xine_bmiheader *bih; |