changeset 296:c1a8a1b4a24b libavcodec

sizeof(s->block) isnt 64*6*2 anymore bugfix mpeg12 decoding optimization
author michaelni
date Thu, 28 Mar 2002 13:41:04 +0000
parents 6622b0fd036c
children a1234c032636
files dsputil.c dsputil.h h263dec.c i386/dsputil_mmx.c mpeg12.c
diffstat 5 files changed, 32 insertions(+), 24 deletions(-) [+]
line wrap: on
line diff
--- a/dsputil.c	Thu Mar 28 04:25:35 2002 +0000
+++ b/dsputil.c	Thu Mar 28 13:41:04 2002 +0000
@@ -30,6 +30,7 @@
 void (*put_pixels_clamped)(const DCTELEM *block, UINT8 *pixels, int line_size);
 void (*add_pixels_clamped)(const DCTELEM *block, UINT8 *pixels, int line_size);
 void (*gmc1)(UINT8 *dst, UINT8 *src, int srcStride, int h, int x16, int y16, int rounder);
+void (*clear_blocks)(DCTELEM *blocks);
 
 op_pixels_abs_func pix_abs16x16;
 op_pixels_abs_func pix_abs16x16_x2;
@@ -866,6 +867,11 @@
 }
 #endif
 
+void clear_blocks_c(DCTELEM *blocks)
+{
+    memset(blocks, 0, sizeof(DCTELEM)*6*64);
+}
+
 void dsputil_init(void)
 {
     int i, j;
@@ -890,6 +896,7 @@
     put_pixels_clamped = put_pixels_clamped_c;
     add_pixels_clamped = add_pixels_clamped_c;
     gmc1= gmc1_c;
+    clear_blocks= clear_blocks_c;
 
     pix_abs16x16     = pix_abs16x16_c;
     pix_abs16x16_x2  = pix_abs16x16_x2_c;
--- a/dsputil.h	Thu Mar 28 04:25:35 2002 +0000
+++ b/dsputil.h	Thu Mar 28 13:41:04 2002 +0000
@@ -40,11 +40,13 @@
 extern void (*put_pixels_clamped)(const DCTELEM *block, UINT8 *pixels, int line_size);
 extern void (*add_pixels_clamped)(const DCTELEM *block, UINT8 *pixels, int line_size);
 extern void (*gmc1)(UINT8 *dst, UINT8 *src, int srcStride, int h, int x16, int y16, int rounder);
+extern void (*clear_blocks)(DCTELEM *blocks);
 
 
 void get_pixels_c(DCTELEM *block, const UINT8 *pixels, int line_size);
 void put_pixels_clamped_c(const DCTELEM *block, UINT8 *pixels, int line_size);
 void add_pixels_clamped_c(const DCTELEM *block, UINT8 *pixels, int line_size);
+void clear_blocks_c(DCTELEM *blocks);
 
 /* add and put pixel (decoding) */
 typedef void (*op_pixels_func)(UINT8 *block, const UINT8 *pixels, int line_size, int h);
--- a/h263dec.c	Thu Mar 28 04:25:35 2002 +0000
+++ b/h263dec.c	Thu Mar 28 13:41:04 2002 +0000
@@ -156,6 +156,7 @@
         if (s->mb_y && !s->h263_pred) {
             s->first_gob_line = h263_decode_gob_header(s);
         }
+
         s->block_index[0]= s->block_wrap[0]*(s->mb_y*2 + 1) - 1;
         s->block_index[1]= s->block_wrap[0]*(s->mb_y*2 + 1);
         s->block_index[2]= s->block_wrap[0]*(s->mb_y*2 + 2) - 1;
@@ -183,28 +184,8 @@
                 s->y_dc_scale = 8;
                 s->c_dc_scale = 8;
             }
-
-#ifdef HAVE_MMX
-            if (mm_flags & MM_MMX) {
-                asm volatile(
-			"pxor %%mm7, %%mm7		\n\t"
-			"movl $-128*6, %%eax		\n\t"
-			"1:				\n\t"
-			"movq %%mm7, (%0, %%eax)	\n\t"
-			"movq %%mm7, 8(%0, %%eax)	\n\t"
-			"movq %%mm7, 16(%0, %%eax)	\n\t"
-			"movq %%mm7, 24(%0, %%eax)	\n\t"
-			"addl $32, %%eax		\n\t"
-			" js 1b				\n\t"
-			: : "r" (((int)s->block)+128*6)
-			: "%eax"
-                );
-            }else{
-                memset(s->block, 0, sizeof(s->block));
-            }
-#else
-            memset(s->block, 0, sizeof(s->block));
-#endif
+            clear_blocks(s->block[0]);
+            
             s->mv_dir = MV_DIR_FORWARD;
             s->mv_type = MV_TYPE_16X16; 
             if (s->h263_msmpeg4) {
--- a/i386/dsputil_mmx.c	Thu Mar 28 04:25:35 2002 +0000
+++ b/i386/dsputil_mmx.c	Thu Mar 28 13:41:04 2002 +0000
@@ -1025,6 +1025,23 @@
   } while(--h);
 }
 
+static void clear_blocks_mmx(DCTELEM *blocks)
+{
+        asm volatile(
+                "pxor %%mm7, %%mm7		\n\t"
+                "movl $-128*6, %%eax		\n\t"
+                "1:				\n\t"
+                "movq %%mm7, (%0, %%eax)	\n\t"
+                "movq %%mm7, 8(%0, %%eax)	\n\t"
+                "movq %%mm7, 16(%0, %%eax)	\n\t"
+                "movq %%mm7, 24(%0, %%eax)	\n\t"
+                "addl $32, %%eax		\n\t"
+                " js 1b				\n\t"
+                : : "r" (((int)blocks)+128*6)
+                : "%eax"
+        );
+}
+
 static void just_return() { return; }
 
 void dsputil_init_mmx(void)
@@ -1049,7 +1066,8 @@
         get_pixels = get_pixels_mmx;
         put_pixels_clamped = put_pixels_clamped_mmx;
         add_pixels_clamped = add_pixels_clamped_mmx;
-        
+        clear_blocks= clear_blocks_mmx;
+       
         pix_abs16x16     = pix_abs16x16_mmx;
         pix_abs16x16_x2  = pix_abs16x16_x2_mmx;
         pix_abs16x16_y2  = pix_abs16x16_y2_mmx;
--- a/mpeg12.c	Thu Mar 28 04:25:35 2002 +0000
+++ b/mpeg12.c	Thu Mar 28 13:41:04 2002 +0000
@@ -1402,7 +1402,7 @@
     }
 
     for(;;) {
-        memset(s->block, 0, sizeof(s->block));
+        clear_blocks(s->block[0]);
         ret = mpeg_decode_mb(s, s->block);
         dprintf("ret=%d\n", ret);
         if (ret < 0)