Optimize decodeplane32().
[ffmpeg.git] / libavcodec / iff.c
index 901c8f4..b77d3dc 100644 (file)
@@ -79,6 +79,37 @@ static const uint64_t plane8_lut[8][256] = {
     LUT8(4), LUT8(5), LUT8(6), LUT8(7),
 };
 
+#define LUT32(plane) {                                \
+             0,          0,          0,          0,   \
+             0,          0,          0, 1 << plane,   \
+             0,          0, 1 << plane,          0,   \
+             0,          0, 1 << plane, 1 << plane,   \
+             0, 1 << plane,          0,          0,   \
+             0, 1 << plane,          0, 1 << plane,   \
+             0, 1 << plane, 1 << plane,          0,   \
+             0, 1 << plane, 1 << plane, 1 << plane,   \
+    1 << plane,          0,          0,          0,   \
+    1 << plane,          0,          0, 1 << plane,   \
+    1 << plane,          0, 1 << plane,          0,   \
+    1 << plane,          0, 1 << plane, 1 << plane,   \
+    1 << plane, 1 << plane,          0,          0,   \
+    1 << plane, 1 << plane,          0, 1 << plane,   \
+    1 << plane, 1 << plane, 1 << plane,          0,   \
+    1 << plane, 1 << plane, 1 << plane, 1 << plane,   \
+}
+
+// 32 planes * 4-bit mask * 4 lookup tables each
+static const uint32_t plane32_lut[32][16*4] = {
+    LUT32( 0), LUT32( 1), LUT32( 2), LUT32( 3),
+    LUT32( 4), LUT32( 5), LUT32( 6), LUT32( 7),
+    LUT32( 8), LUT32( 9), LUT32(10), LUT32(11),
+    LUT32(12), LUT32(13), LUT32(14), LUT32(15),
+    LUT32(16), LUT32(17), LUT32(18), LUT32(19),
+    LUT32(20), LUT32(21), LUT32(22), LUT32(23),
+    LUT32(24), LUT32(25), LUT32(26), LUT32(27),
+    LUT32(28), LUT32(29), LUT32(30), LUT32(31),
+};
+
 /**
  * Convert CMAP buffer (stored in extradata) to lavc palette format
  */
@@ -156,15 +187,22 @@ static void decodeplane8(uint8_t *dst, const uint8_t *buf, int buf_size, int pla
  * @param buf_size
  * @param plane plane number to decode as
  */
-static void decodeplane32(uint32_t *dst, const uint8_t *const buf, int buf_size, int plane)
+static void decodeplane32(uint32_t *dst, const uint8_t *buf, int buf_size, int plane)
 {
-    GetBitContext gb;
-    int i;
-    const int b = buf_size * 8;
-    init_get_bits(&gb, buf, buf_size * 8);
-    for(i = 0; i < b; i++) {
-        dst[i] |= get_bits1(&gb) << plane;
-    }
+    const uint32_t *lut = plane32_lut[plane];
+    do {
+        unsigned mask = (*buf >> 2) & ~3;
+        dst[0] |= lut[mask++];
+        dst[1] |= lut[mask++];
+        dst[2] |= lut[mask++];
+        dst[3] |= lut[mask];
+        mask = (*buf++ << 2) & 0x3F;
+        dst[4] |= lut[mask++];
+        dst[5] |= lut[mask++];
+        dst[6] |= lut[mask++];
+        dst[7] |= lut[mask];
+        dst += 8;
+    } while (--buf_size);
 }
 
 static int decode_frame_ilbm(AVCodecContext *avctx,