changeset 9273:42c63846b321 libavcodec

Replace many tiny loops in the interplayvideo decoder by memset, memcpy or initializers.
author reimar
date Sun, 29 Mar 2009 17:23:40 +0000
parents bb2fa003a336
children b0dcca654e18
files interplayvideo.c
diffstat 1 files changed, 30 insertions(+), 39 deletions(-) [+]
line wrap: on
line diff
--- a/interplayvideo.c	Sun Mar 29 17:15:42 2009 +0000
+++ b/interplayvideo.c	Sun Mar 29 17:23:40 2009 +0000
@@ -483,8 +483,8 @@
     /* 4-color encoding */
     CHECK_STREAM_PTR(4);
 
-    for (y = 0; y < 4; y++)
-        P[y] = *s->stream_ptr++;
+    memcpy(P, s->stream_ptr, 4);
+    s->stream_ptr += 4;
 
     if ((P[0] <= P[1]) && (P[2] <= P[3])) {
 
@@ -577,21 +577,21 @@
      * either top and bottom or left and right halves */
     CHECK_STREAM_PTR(4);
 
-    for (y = 0; y < 4; y++)
-        P[y] = *s->stream_ptr++;
+    memcpy(P, s->stream_ptr, 4);
+    s->stream_ptr += 4;
 
     if (P[0] <= P[1]) {
 
         /* 4-color encoding for each quadrant; need 28 more bytes */
         CHECK_STREAM_PTR(28);
 
-        for (y = 0; y < 4; y++)
-            B[y] = *s->stream_ptr++;
+        memcpy(B, s->stream_ptr, 4);
+        s->stream_ptr += 4;
         for (y = 4; y < 16; y += 4) {
-            for (x = y; x < y + 4; x++)
-                P[x] = *s->stream_ptr++;
-            for (x = y; x < y + 4; x++)
-                B[x] = *s->stream_ptr++;
+            memcpy(P + y, s->stream_ptr, 4);
+            s->stream_ptr += 4;
+            memcpy(B + y, s->stream_ptr, 4);
+            s->stream_ptr += 4;
         }
 
         for (y = 0; y < 8; y++) {
@@ -614,12 +614,12 @@
          * halves; need 20 more bytes */
         CHECK_STREAM_PTR(20);
 
-        for (y = 0; y < 8; y++)
-            B[y] = *s->stream_ptr++;
-        for (y = 4; y < 8; y++)
-            P[y] = *s->stream_ptr++;
-        for (y = 8; y < 16; y++)
-            B[y] = *s->stream_ptr++;
+        memcpy(B, s->stream_ptr, 8);
+        s->stream_ptr += 8;
+        memcpy(P + 4, s->stream_ptr, 4);
+        s->stream_ptr += 4;
+        memcpy(B + 8, s->stream_ptr, 8);
+        s->stream_ptr += 8;
 
         if (P[4] <= P[5]) {
 
@@ -662,16 +662,15 @@
 
 static int ipvideo_decode_block_opcode_0xB(IpvideoContext *s)
 {
-    int x, y;
+    int y;
 
     /* 64-color encoding (each pixel in block is a different color) */
     CHECK_STREAM_PTR(64);
 
     for (y = 0; y < 8; y++) {
-        for (x = 0; x < 8; x++) {
-            *s->pixel_ptr++ = *s->stream_ptr++;
-        }
-        s->pixel_ptr += s->line_inc;
+        memcpy(s->pixel_ptr, s->stream_ptr, 8);
+        s->stream_ptr += 8;
+        s->pixel_ptr  += s->stride;
     }
 
     /* report success */
@@ -703,15 +702,15 @@
 
 static int ipvideo_decode_block_opcode_0xD(IpvideoContext *s)
 {
-    int x, y;
+    int y;
     unsigned char P[4];
     unsigned char index = 0;
 
     /* 4-color block encoding: each 4x4 block is a different color */
     CHECK_STREAM_PTR(4);
 
-    for (y = 0; y < 4; y++)
-        P[y] = *s->stream_ptr++;
+    memcpy(P, s->stream_ptr, 4);
+    s->stream_ptr += 4;
 
     for (y = 0; y < 8; y++) {
         if (y < 4)
@@ -719,12 +718,9 @@
         else
             index = 2;
 
-        for (x = 0; x < 8; x++) {
-            if (x == 4)
-                index++;
-            *s->pixel_ptr++ = P[index];
-        }
-        s->pixel_ptr += s->line_inc;
+        memset(s->pixel_ptr    , P[index    ], 4);
+        memset(s->pixel_ptr + 4, P[index + 1], 4);
+        s->pixel_ptr += s->stride;
     }
 
     /* report success */
@@ -733,7 +729,7 @@
 
 static int ipvideo_decode_block_opcode_0xE(IpvideoContext *s)
 {
-    int x, y;
+    int y;
     unsigned char pix;
 
     /* 1-color encoding: the whole block is 1 solid color */
@@ -741,10 +737,8 @@
     pix = *s->stream_ptr++;
 
     for (y = 0; y < 8; y++) {
-        for (x = 0; x < 8; x++) {
-            *s->pixel_ptr++ = pix;
-        }
-        s->pixel_ptr += s->line_inc;
+        memset(s->pixel_ptr, pix, 8);
+        s->pixel_ptr += s->stride;
     }
 
     /* report success */
@@ -795,15 +789,12 @@
     int index = 0;
     unsigned char opcode;
     int ret;
-    int code_counts[16];
+    int code_counts[16] = {0};
     static int frame = 0;
 
     debug_interplay("------------------ frame %d\n", frame);
     frame++;
 
-    for (x = 0; x < 16; x++)
-        code_counts[x] = 0;
-
     /* this is PAL8, so make the palette available */
     memcpy(s->current_frame.data[1], s->avctx->palctrl->palette, PALETTE_COUNT * 4);