summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Melanson <mike@multimedia.cx>2002-10-18 23:43:25 +0000
committerMike Melanson <mike@multimedia.cx>2002-10-18 23:43:25 +0000
commit6faab586f7d56366404ffcd55797a6224134fc51 (patch)
treec559252f8374e6b96a61a13b2b4046bfe02fa134
parent8d74c5ee062c63f770d2ecf879f00b31492cb13c (diff)
downloadxine-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.c50
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;