summaryrefslogtreecommitdiff
path: root/libavcodec/tscc.c
diff options
context:
space:
mode:
authorMike Melanson <mike@multimedia.cx>2006-02-12 16:56:06 +0000
committerMike Melanson <mike@multimedia.cx>2006-02-12 16:56:06 +0000
commit1927cd41e087bf751d20bfb395addc1fd93bad29 (patch)
tree47d8bcff3b023a5dc33e37a0dd463e2f8fbf8993 /libavcodec/tscc.c
parent75b5b631792e19985cec89528a19a48d2162e28c (diff)
downloadffmpeg-1927cd41e087bf751d20bfb395addc1fd93bad29.tar.gz
make TSCC endian-safe, PPC testing courtesy of Diego B.
Originally committed as revision 5007 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/tscc.c')
-rw-r--r--libavcodec/tscc.c52
1 files 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;
}
}