changeset 206:994aa8623443 libavcodec

(commit by michael) draw_edges_mmx()
author arpi_esp
date Tue, 15 Jan 2002 04:07:29 +0000
parents ccf36af385f3
children 6954f2830e4a
files i386/mpegvideo_mmx.c mpegvideo.c
diffstat 2 files changed, 98 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/i386/mpegvideo_mmx.c	Mon Jan 14 04:39:59 2002 +0000
+++ b/i386/mpegvideo_mmx.c	Tue Jan 15 04:07:29 2002 +0000
@@ -24,6 +24,7 @@
 #include "../mpegvideo.h"
 
 extern UINT8 zigzag_end[64];
+extern void (*draw_edges)(UINT8 *buf, int wrap, int width, int height, int w);
 
 #if 0
 
@@ -322,6 +323,95 @@
     }
 }
 
+/* draw the edges of width 'w' of an image of size width, height 
+   this mmx version can only handle w==8 || w==16 */
+static void draw_edges_mmx(UINT8 *buf, int wrap, int width, int height, int w)
+{
+    UINT8 *ptr, *last_line;
+    int i;
+
+    last_line = buf + (height - 1) * wrap;
+    /* left and right */
+    ptr = buf;
+    if(w==8)
+    {
+	asm volatile(
+		"1:				\n\t"
+		"movd (%0), %%mm0		\n\t"
+		"punpcklbw %%mm0, %%mm0		\n\t" 
+		"punpcklwd %%mm0, %%mm0		\n\t"
+		"punpckldq %%mm0, %%mm0		\n\t"
+		"movq %%mm0, -8(%0)		\n\t"
+		"movq -8(%0, %2), %%mm1		\n\t"
+		"punpckhbw %%mm1, %%mm1		\n\t"
+		"punpckhwd %%mm1, %%mm1		\n\t"
+		"punpckhdq %%mm1, %%mm1		\n\t"
+		"movq %%mm1, (%0, %2)		\n\t"
+		"addl %1, %0			\n\t"
+		"cmpl %3, %0			\n\t"
+		" jb 1b				\n\t"
+		: "+r" (ptr)
+		: "r" (wrap), "r" (width), "r" (ptr + wrap*height)
+	);
+    }
+    else
+    {
+	asm volatile(
+		"1:				\n\t"
+		"movd (%0), %%mm0		\n\t"
+		"punpcklbw %%mm0, %%mm0		\n\t" 
+		"punpcklwd %%mm0, %%mm0		\n\t"
+		"punpckldq %%mm0, %%mm0		\n\t"
+		"movq %%mm0, -8(%0)		\n\t"
+		"movq %%mm0, -16(%0)		\n\t"
+		"movq -8(%0, %2), %%mm1		\n\t"
+		"punpckhbw %%mm1, %%mm1		\n\t"
+		"punpckhwd %%mm1, %%mm1		\n\t"
+		"punpckhdq %%mm1, %%mm1		\n\t"
+		"movq %%mm1, (%0, %2)		\n\t"
+		"movq %%mm1, 8(%0, %2)		\n\t"
+		"addl %1, %0			\n\t"
+		"cmpl %3, %0			\n\t"
+		" jb 1b				\n\t"		
+		: "+r" (ptr)
+		: "r" (wrap), "r" (width), "r" (ptr + wrap*height)
+	);
+    }
+    
+    for(i=0;i<w;i+=4) {
+        /* top and bottom (and hopefully also the corners) */
+	ptr= buf - (i + 1) * wrap - w;
+	asm volatile(
+		"1:				\n\t"
+		"movq (%1, %0), %%mm0		\n\t"
+		"movq %%mm0, (%0)		\n\t"
+		"movq %%mm0, (%0, %2)		\n\t"
+		"movq %%mm0, (%0, %2, 2)	\n\t"
+		"movq %%mm0, (%0, %3)		\n\t"
+		"addl $8, %0			\n\t"
+		"cmpl %4, %0			\n\t"
+		" jb 1b				\n\t"
+		: "+r" (ptr)
+		: "r" ((int)buf - (int)ptr - w), "r" (-wrap), "r" (-wrap*3), "r" (ptr+width+2*w)
+	);
+	ptr= last_line + (i + 1) * wrap - w;
+	asm volatile(
+		"1:				\n\t"
+		"movq (%1, %0), %%mm0		\n\t"
+		"movq %%mm0, (%0)		\n\t"
+		"movq %%mm0, (%0, %2)		\n\t"
+		"movq %%mm0, (%0, %2, 2)	\n\t"
+		"movq %%mm0, (%0, %3)		\n\t"
+		"addl $8, %0			\n\t"
+		"cmpl %4, %0			\n\t"
+		" jb 1b				\n\t"
+		: "+r" (ptr)
+		: "r" ((int)last_line - (int)ptr - w), "r" (wrap), "r" (wrap*3), "r" (ptr+width+2*w)
+	);
+    }
+}
+
+
 void MPV_common_init_mmx(MpegEncContext *s)
 {
     if (mm_flags & MM_MMX) {
@@ -329,5 +419,7 @@
         	s->dct_unquantize = dct_unquantize_h263_mmx;
 	else
         	s->dct_unquantize = dct_unquantize_mpeg1_mmx;
+	
+	draw_edges = draw_edges_mmx;
     }
 }
--- a/mpegvideo.c	Mon Jan 14 04:39:59 2002 +0000
+++ b/mpegvideo.c	Tue Jan 15 04:07:29 2002 +0000
@@ -39,6 +39,10 @@
 static int dct_quantize_mmx(MpegEncContext *s, 
                             DCTELEM *block, int n,
                             int qscale);
+static void draw_edges_c(UINT8 *buf, int wrap, int width, int height, int w);
+
+void (*draw_edges)(UINT8 *buf, int wrap, int width, int height, int w)= draw_edges_c;
+
 #define EDGE_WIDTH 16
 
 /* enable all paranoid tests for rounding, overflows, etc... */
@@ -361,7 +365,7 @@
 }
 
 /* draw the edges of width 'w' of an image of size width, height */
-static void draw_edges(UINT8 *buf, int wrap, int width, int height, int w)
+static void draw_edges_c(UINT8 *buf, int wrap, int width, int height, int w)
 {
     UINT8 *ptr, *last_line;
     int i;
@@ -676,7 +680,7 @@
 {
     if (s->block_last_index[i] >= 0) {
         if (!s->mpeg2)
-            if(s->encoding || s->avctx==NULL || s->avctx->codec->id!=CODEC_ID_MSMPEG4)
+            if(s->encoding || (!s->h263_msmpeg4))
                 s->dct_unquantize(s, block, i, s->qscale);
         ff_idct (block);
         add_pixels_clamped(block, dest, line_size);