changeset 34:2733a4c1c693 libavcodec

added block permutation functions
author glantau
date Tue, 07 Aug 2001 22:43:19 +0000
parents 7cf705a32d1c
children c77207dc78f4
files dsputil.c dsputil.h
diffstat 2 files changed, 85 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/dsputil.c	Tue Aug 07 22:42:45 2001 +0000
+++ b/dsputil.c	Tue Aug 07 22:43:19 2001 +0000
@@ -34,6 +34,42 @@
 static UINT8 cropTbl[256 + 2 * MAX_NEG_CROP];
 UINT32 squareTbl[512];
 
+extern UINT16 default_intra_matrix[64];
+extern UINT16 default_non_intra_matrix[64];
+
+UINT8 zigzag_direct[64] = {
+    0, 1, 8, 16, 9, 2, 3, 10,
+    17, 24, 32, 25, 18, 11, 4, 5,
+    12, 19, 26, 33, 40, 48, 41, 34,
+    27, 20, 13, 6, 7, 14, 21, 28,
+    35, 42, 49, 56, 57, 50, 43, 36,
+    29, 22, 15, 23, 30, 37, 44, 51,
+    58, 59, 52, 45, 38, 31, 39, 46,
+    53, 60, 61, 54, 47, 55, 62, 63
+};
+
+UINT8 ff_alternate_horizontal_scan[64] = {
+    0,  1,  2,  3,  8,  9, 16, 17, 
+    10, 11,  4,  5,  6,  7, 15, 14,
+    13, 12, 19, 18, 24, 25, 32, 33, 
+    26, 27, 20, 21, 22, 23, 28, 29,
+    30, 31, 34, 35, 40, 41, 48, 49, 
+    42, 43, 36, 37, 38, 39, 44, 45,
+    46, 47, 50, 51, 56, 57, 58, 59, 
+    52, 53, 54, 55, 60, 61, 62, 63,
+};
+
+UINT8 ff_alternate_vertical_scan[64] = {
+    0,  8, 16, 24,  1,  9,  2, 10, 
+    17, 25, 32, 40, 48, 56, 57, 49,
+    41, 33, 26, 18,  3, 11,  4, 12, 
+    19, 27, 34, 42, 50, 58, 35, 43,
+    51, 59, 20, 28,  5, 13,  6, 14, 
+    21, 29, 36, 44, 52, 60, 37, 45,
+    53, 61, 22, 30,  7, 15, 23, 31, 
+    38, 46, 54, 62, 39, 47, 55, 63,
+};
+
 void get_pixels_c(DCTELEM *block, const UINT8 *pixels, int line_size)
 {
     DCTELEM *p;
@@ -350,9 +386,33 @@
     return s;
 }
 
+/* permute block according so that it corresponds to the MMX idct
+   order */
+void block_permute(INT16 *block)
+{
+    int tmp1, tmp2, tmp3, tmp4, tmp5, tmp6;
+    int i;
+
+    for(i=0;i<8;i++) {
+        tmp1 = block[1];
+        tmp2 = block[2];
+        tmp3 = block[3];
+        tmp4 = block[4];
+        tmp5 = block[5];
+        tmp6 = block[6];
+        block[1] = tmp2;
+        block[2] = tmp4;
+        block[3] = tmp6;
+        block[4] = tmp1;
+        block[5] = tmp3;
+        block[6] = tmp5;
+        block += 8;
+    }
+}
+
 void dsputil_init(void)
 {
-    int i;
+    int i, j;
 
     for(i=0;i<256;i++) cropTbl[i + MAX_NEG_CROP] = i;
     for(i=0;i<MAX_NEG_CROP;i++) {
@@ -375,6 +435,18 @@
     pix_abs16x16_xy2 = pix_abs16x16_xy2_c;
     av_fdct = jpeg_fdct_ifast;
 
+    /* permute for IDCT */
+    for(i=0;i<64;i++) {
+        j = zigzag_direct[i];
+        zigzag_direct[i] = block_permute_op(j);
+        j = ff_alternate_horizontal_scan[i];
+        ff_alternate_horizontal_scan[i] = block_permute_op(j);
+        j = ff_alternate_vertical_scan[i];
+        ff_alternate_vertical_scan[i] = block_permute_op(j);
+    }
+    block_permute(default_intra_matrix);
+    block_permute(default_non_intra_matrix);
+
 #ifdef HAVE_MMX
     dsputil_init_mmx();
 #endif
--- a/dsputil.h	Tue Aug 07 22:42:45 2001 +0000
+++ b/dsputil.h	Tue Aug 07 22:43:19 2001 +0000
@@ -15,6 +15,11 @@
 
 void (*av_fdct)(DCTELEM *block);
 
+/* encoding scans */
+extern UINT8 ff_alternate_horizontal_scan[64];
+extern UINT8 ff_alternate_vertical_scan[64];
+extern UINT8 zigzag_direct[64];
+
 /* pixel operations */
 #define MAX_NEG_CROP 384
 
@@ -62,6 +67,13 @@
 int pix_abs16x16_y2_c(UINT8 *blk1, UINT8 *blk2, int lx, int h);
 int pix_abs16x16_xy2_c(UINT8 *blk1, UINT8 *blk2, int lx, int h);
 
+static inline int block_permute_op(int j)
+{
+    return (j & 0x38) | ((j & 6) >> 1) | ((j & 1) << 2);
+}
+
+void block_permute(INT16 *block);
+
 #ifdef HAVE_MMX
 
 #define MM_MMX    0x0001 /* standard MMX */