From 1927cd41e087bf751d20bfb395addc1fd93bad29 Mon Sep 17 00:00:00 2001 From: Mike Melanson Date: Sun, 12 Feb 2006 16:56:06 +0000 Subject: [PATCH] make TSCC endian-safe, PPC testing courtesy of Diego B. Originally committed as revision 5007 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavcodec/tscc.c | 52 +++++++++++++++++++++++++++++++---------------- 1 file changed, 34 insertions(+), 18 deletions(-) diff --git a/libavcodec/tscc.c b/libavcodec/tscc.c index 8bc53bf890..19edf3b2ed 100644 --- a/libavcodec/tscc.c +++ b/libavcodec/tscc.c @@ -77,6 +77,8 @@ static int decode_rle(CamtasiaContext *c, unsigned int srcsize) unsigned char *src = c->decomp_buf; unsigned char *output, *output_end; int p1, p2, line=c->height, pos=0, i; + uint16_t pix16; + uint32_t pix32; output = c->pic.data[0] + (c->height - 1) * c->pic.linesize[0]; output_end = c->pic.data[0] + (c->height) * c->pic.linesize[0]; @@ -107,12 +109,28 @@ static int decode_rle(CamtasiaContext *c, unsigned int srcsize) src += p2 * (c->bpp / 8); continue; } - for(i = 0; i < p2 * (c->bpp / 8); i++) { - *output++ = *src++; - } - // RLE8 copy is actually padded - and runs are not! - if(c->bpp == 8 && (p2 & 1)) { - src++; + if ((c->bpp == 8) || (c->bpp == 24)) { + for(i = 0; i < p2 * (c->bpp / 8); i++) { + *output++ = *src++; + } + // RLE8 copy is actually padded - and runs are not! + if(c->bpp == 8 && (p2 & 1)) { + src++; + } + } else if (c->bpp == 16) { + for(i = 0; i < p2; i++) { + pix16 = LE_16(src); + src += 2; + *(uint16_t*)output = pix16; + output += 2; + } + } else if (c->bpp == 32) { + for(i = 0; i < p2; i++) { + pix32 = LE_32(src); + src += 4; + *(uint32_t*)output = pix32; + output += 4; + } } pos += p2; } else { //Run of pixels @@ -120,17 +138,17 @@ static int decode_rle(CamtasiaContext *c, unsigned int srcsize) switch(c->bpp){ case 8: pix[0] = *src++; break; - case 16: pix[0] = *src++; - pix[1] = *src++; + case 16: pix16 = LE_16(src); + src += 2; + *(uint16_t*)pix = pix16; break; case 24: pix[0] = *src++; pix[1] = *src++; pix[2] = *src++; break; - case 32: pix[0] = *src++; - pix[1] = *src++; - pix[2] = *src++; - pix[3] = *src++; + case 32: pix32 = LE_32(src); + src += 4; + *(uint32_t*)pix = pix32; break; } if (output + p1 * (c->bpp / 8) > output_end) @@ -139,17 +157,15 @@ static int decode_rle(CamtasiaContext *c, unsigned int srcsize) switch(c->bpp){ case 8: *output++ = pix[0]; break; - case 16: *output++ = pix[0]; - *output++ = pix[1]; + case 16: *(uint16_t*)output = pix16; + output += 2; break; case 24: *output++ = pix[0]; *output++ = pix[1]; *output++ = pix[2]; break; - case 32: *output++ = pix[0]; - *output++ = pix[1]; - *output++ = pix[2]; - *output++ = pix[3]; + case 32: *(uint32_t*)output = pix32; + output += 4; break; } }