make TSCC endian-safe, PPC testing courtesy of Diego B.
authorMike Melanson <mike@multimedia.cx>
Sun, 12 Feb 2006 16:56:06 +0000 (16:56 +0000)
committerMike Melanson <mike@multimedia.cx>
Sun, 12 Feb 2006 16:56:06 +0000 (16:56 +0000)
Originally committed as revision 5007 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavcodec/tscc.c

index 8bc53bf..19edf3b 100644 (file)
@@ -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;
     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];
 
     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;
             }
                 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
             }
             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;
             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;
                      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)
                      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;
                 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;
                          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;
                 }
             }
                          break;
                 }
             }