[Mplayer-cvslog] CVS: main/libmpcodecs vf_eq.c,1.1,1.2

Arpi arpi at thot.banki.hu
Thu Aug 22 11:24:38 CEST 2002


Hi,

add #ifdef ARCH_X86 etc ASAP
it won't compile on non-x86-unix systems


> Update of /cvsroot/mplayer/main/libmpcodecs
> In directory mail:/var/tmp.root/cvs-serv5850/libmpcodecs
> 
> Modified Files:
> 	vf_eq.c 
> Log Message:
> MMX optimized code for soft equalizer filter
> 
> 
> Index: vf_eq.c
> ===================================================================
> RCS file: /cvsroot/mplayer/main/libmpcodecs/vf_eq.c,v
> retrieving revision 1.1
> retrieving revision 1.2
> diff -u -r1.1 -r1.2
> --- vf_eq.c	21 Aug 2002 23:08:20 -0000	1.1
> +++ vf_eq.c	22 Aug 2002 04:59:45 -0000	1.2
> @@ -5,6 +5,7 @@
>  
>  #include "../config.h"
>  #include "../mp_msg.h"
> +#include "../cpudetect.h"
>  
>  #include "img_format.h"
>  #include "mp_image.h"
> @@ -20,30 +21,91 @@
>  	int contrast;
>  };
>  
> -static void process(unsigned char *dest, int dstride, unsigned char *src, int sstride,
> +#ifdef HAVE_MMX
> +static void process_MMX(unsigned char *dest, int dstride, unsigned char *src, int sstride,
>  		    int w, int h, int brightness, int contrast)
>  {
>  	int i;
>  	int pel;
>  	int dstep = dstride-w;
>  	int sstep = sstride-w;
> +	short brvec[4];
> +	short contvec[4];
> +	short centvec[4] = { -128, -128, -128, -128 };
>  
>  	brightness = ((brightness+100)*511)/200-128;
> -	contrast = ((contrast+100)*512)/200;
> +	contrast = ((contrast+100)*256)/200;
>  
> +	brvec[0] = brvec[1] = brvec[2] = brvec[3] = brightness;
> +	contvec[0] = contvec[1] = contvec[2] = contvec[3] = contrast;
> +		
>  	while (h--) {
> -		for (i = w; i; i--)
> +		asm (
> +			"movq (%5), %%mm3 \n\t"
> +			"movq (%6), %%mm4 \n\t"
> +			"movq (%7), %%mm5 \n\t"
> +			"pxor %%mm0, %%mm0 \n\t"
> +			".align 16 \n\t"
> +			"1: \n\t"
> +			"movq (%0), %%mm1 \n\t"
> +			"movq (%0), %%mm2 \n\t"
> +			"punpcklbw %%mm0, %%mm1 \n\t"
> +			"punpckhbw %%mm0, %%mm2 \n\t"
> +			"paddw %%mm5, %%mm1 \n\t"
> +			"paddw %%mm5, %%mm2 \n\t"
> +			"pmullw %%mm4, %%mm1 \n\t"
> +			"pmullw %%mm4, %%mm2 \n\t"
> +			"psraw $7, %%mm1 \n\t"
> +			"psraw $7, %%mm2 \n\t"
> +			"paddsw %%mm3, %%mm1 \n\t"
> +			"paddsw %%mm3, %%mm2 \n\t"
> +			"packuswb %%mm2, %%mm1 \n\t"
> +			"addl $8, %0 \n\t"
> +			"movq %%mm1, (%1) \n\t"
> +			"addl $8, %1 \n\t"
> +			"decl %4 \n\t"
> +			"jnz 1b \n\t"
> +			: "=r" (src), "=r" (dest)
> +			: "0" (src), "1" (dest), "r" (w/8), "r" (brvec), "r" (contvec), "r" (centvec)
> +		);
> +		for (i = w&7; i; i--)
>  		{
> -			/* slow */
>  			pel = ((*src++ - 128) * contrast)/256 + brightness;
>  			*dest++ = pel > 255 ? 255 : (pel < 0 ? 0 : pel);
>  		}
>  		src += sstep;
>  		dest += dstep;
>  	}
> +	asm volatile ( "emms \n\t" ::: "memory" );
>  }
> +#endif
> +
> +static void process_C(unsigned char *dest, int dstride, unsigned char *src, int sstride,
> +		    int w, int h, int brightness, int contrast)
> +{
> +	int i;
> +	int pel;
> +	int dstep = dstride-w;
> +	int sstep = sstride-w;
>  
> -/* FIXME: add packed yuv version of process, and optimized code! */
> +	brightness = ((brightness+100)*511)/200-128;
> +	contrast = ((contrast+100)*256)/200;
> +
> +	while (h--) {
> +		for (i = w; i; i--)
> +		{
> +			pel = ((*src++ - 128) * contrast)/128 + brightness;
> +			*dest++ = pel > 255 ? 255 : (pel < 0 ? 0 : pel);
> +		}
> +		src += sstep;
> +		dest += dstep;
> +	}
> +}
> +
> +static void (*process)(unsigned char *dest, int dstride, unsigned char *src, int sstride,
> +		       int w, int h, int brightness, int contrast);
> +
> +/* FIXME: add packed yuv version of process */
>  
>  static void put_image(struct vf_instance_s* vf, mp_image_t *mpi)
>  {
> @@ -141,6 +203,12 @@
>  	vf->priv = malloc(sizeof(struct vf_priv_s));
>  	memset(vf->priv, 0, sizeof(struct vf_priv_s));
>  	if (args) sscanf(args, "%d:%d", &vf->priv->brightness, &vf->priv->contrast);
> +
> +	process = process_C;
> +#ifdef HAVE_MMX
> +	if(gCpuCaps.hasMMX) process = process_MMX;
> +#endif
> +	
>  	return 1;
>  }
>  
> 
> _______________________________________________
> Mplayer-cvslog mailing list
> Mplayer-cvslog at mplayerhq.hu
> http://mplayerhq.hu/mailman/listinfo/mplayer-cvslog
> 
> 


A'rpi / Astral & ESP-team

--
Developer of MPlayer, the Movie Player for Linux - http://www.MPlayerHQ.hu



More information about the MPlayer-cvslog mailing list