[Mplayer-cvslog] CVS: main/libmpcodecs vf_sab.c,NONE,1.1 vf.c,1.59,1.60 Makefile,1.74,1.75

Michael Niedermayer CVS michael at mplayerhq.hu
Mon Nov 4 17:42:19 CET 2002


Update of /cvsroot/mplayer/main/libmpcodecs
In directory mail:/var/tmp.root/cvs-serv811/libmpcodecs

Modified Files:
	vf.c Makefile 
Added Files:
	vf_sab.c 
Log Message:
shape adaptive blur (slightly slow though)


--- NEW FILE ---
/*
    Copyright (C) 2002 Michael Niedermayer <michaelni at gmx.at>

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <inttypes.h>
#include <assert.h>

#include "../config.h"
#include "../mp_msg.h"

#ifdef HAVE_MALLOC_H
#include <malloc.h>
#endif

#include "img_format.h"
#include "mp_image.h"
#include "vf.h"
#include "../libvo/fastmemcpy.h"
#include "../postproc/swscale.h"


//===========================================================================//

typedef struct FilterParam{
	float radius;
	float preFilterRadius;
	float strength;
	float quality;
	SwsContext *preFilterContext;
	uint8_t *preFilterBuf;
	int preFilterStride;
	int distWidth;
	int distStride;
	int *distCoeff;
	int colorDiffCoeff[512];
}FilterParam;

struct vf_priv_s {
	FilterParam luma;
	FilterParam chroma;
};


/***************************************************************************/

//FIXME stupid code duplication
static void getSubSampleFactors(int *h, int *v, int format){
	switch(format){
	case IMGFMT_YV12:
	case IMGFMT_I420:
		*h=1;
		*v=1;
		break;
	case IMGFMT_YVU9:
		*h=2;
		*v=2;
		break;
	case IMGFMT_444P:
		*h=0;
		*v=0;
		break;
	case IMGFMT_422P:
		*h=1;
		*v=0;
		break;
	case IMGFMT_411P:
		*h=2;
		*v=0;
		break;
	}
}

static int allocStuff(FilterParam *f, int width, int height){
	int stride= (width+7)&~7;
	SwsVector *vec;
	SwsFilter swsF;
	int i,x,y;
	f->preFilterBuf= (uint8_t*)memalign(8, stride*height);
	f->preFilterStride= stride;

	vec = getGaussianVec(f->preFilterRadius, f->quality);
	swsF.lumH= swsF.lumV= vec;
	swsF.chrH= swsF.chrV= NULL;
	f->preFilterContext= getSwsContext(
		width, height, IMGFMT_Y8, width, height, IMGFMT_Y8, 0, &swsF, NULL);
	
	freeVec(vec);
	vec = getGaussianVec(f->strength, 5.0);
	for(i=0; i<512; i++){
		double d;
		int index= i-256 + vec->length/2;
		
		if(index<0 || index>=vec->length) 	d= 0.0;
		else					d= vec->coeff[index];
		
		f->colorDiffCoeff[i]= (int)(d/vec->coeff[vec->length/2]*(1<<12) + 0.5);
	}
	freeVec(vec);
	vec = getGaussianVec(f->radius, f->quality);
	f->distWidth= vec->length;
	f->distStride= (vec->length+7)&~7;
	f->distCoeff= (int32_t*)memalign(8, f->distWidth*f->distStride*sizeof(int32_t));

	for(y=0; y<vec->length; y++){
		for(x=0; x<vec->length; x++){
			double d= vec->coeff[x] * vec->coeff[y];
			
			f->distCoeff[x + y*f->distStride]= (int)(d*(1<<10) + 0.5);
//			if(y==vec->length/2)
//				printf("%6d ", f->distCoeff[x + y*f->distStride]);
		}
	}
	freeVec(vec);
	
	return 0;
}

static int config(struct vf_instance_s* vf,
        int width, int height, int d_width, int d_height,
	unsigned int flags, unsigned int outfmt){
	
	int sw, sh;
//asm volatile("emms\n\t");
	allocStuff(&vf->priv->luma, width, height);
	
	getSubSampleFactors(&sw, &sh, outfmt);
	allocStuff(&vf->priv->chroma, width>>sw, height>>sh);

	return vf_next_config(vf,width,height,d_width,d_height,flags,outfmt);
}

static void freeBuffers(FilterParam *f){
	if(f->preFilterContext) freeSwsContext(f->preFilterContext);
	f->preFilterContext=NULL;
	
	if(f->preFilterBuf) free(f->preFilterBuf);
	f->preFilterBuf=NULL;
	
	if(f->distCoeff) free(f->distCoeff);
	f->distCoeff=NULL;
}

static void uninit(struct vf_instance_s* vf){
	if(!vf->priv) return;

	freeBuffers(&vf->priv->luma);
	freeBuffers(&vf->priv->chroma);

	free(vf->priv);
	vf->priv=NULL;
}

static inline void blur(uint8_t *dst, uint8_t *src, int w, int h, int dstStride, int srcStride, FilterParam *fp){
	int x, y;
	FilterParam f= *fp;
	const int radius= f.distWidth/2;
	uint8_t *srcArray[3]= {src, NULL, NULL};
	uint8_t *dstArray[3]= {f.preFilterBuf, NULL, NULL};
	int srcStrideArray[3]= {srcStride, 0, 0};
	int dstStrideArray[3]= {f.preFilterStride, 0, 0};

	f.preFilterContext->swScale(f.preFilterContext, srcArray, srcStrideArray, 0, h, dstArray, dstStrideArray);
	
	for(y=0; y<h; y++){
		for(x=0; x<w; x++){
			int sum=0;
			int div=0;
			int dy;
			const int preVal= f.preFilterBuf[x + y*f.preFilterStride];
#if 0
			const int srcVal= src[x + y*srcStride];
if((x/32)&1){
    dst[x + y*dstStride]= srcVal;
    if(y%32==0) dst[x + y*dstStride]= 0;
    continue;
}
#endif
			if(x >= radius && x < w - radius){
				for(dy=0; dy<radius*2+1; dy++){
					int dx;
					int iy= y+dy - radius;
					if     (iy<0)  iy=  -iy;
					else if(iy>=h) iy= h-iy-1;

					for(dx=0; dx<radius*2+1; dx++){
						const int ix= x+dx - radius;
						int factor;

						factor= f.colorDiffCoeff[256+preVal - f.preFilterBuf[ix + iy*f.preFilterStride] ]
							*f.distCoeff[dx + dy*f.distStride];
						sum+= src[ix + iy*srcStride] *factor;
						div+= factor;
					}
				}
			}else{
				for(dy=0; dy<radius*2+1; dy++){
					int dx;
					int iy= y+dy - radius;
					if     (iy<0)  iy=  -iy;
					else if(iy>=h) iy= h-iy-1;

					for(dx=0; dx<radius*2+1; dx++){
						int ix= x+dx - radius;
						int factor;
						if     (ix<0)  ix=  -ix;
						else if(ix>=w) ix= w-ix-1;

						factor= f.colorDiffCoeff[256+preVal - f.preFilterBuf[ix + iy*f.preFilterStride] ]
							*f.distCoeff[dx + dy*f.distStride];
						sum+= src[ix + iy*srcStride] *factor;
						div+= factor;
					}
				}
			}
			dst[x + y*dstStride]= (sum + div/2)/div;
		}
	}
}

static int put_image(struct vf_instance_s* vf, mp_image_t *mpi){
	int cw= mpi->w >> mpi->chroma_x_shift;
	int ch= mpi->h >> mpi->chroma_y_shift;

	mp_image_t *dmpi=vf_get_image(vf->next,mpi->imgfmt,
		MP_IMGTYPE_TEMP, MP_IMGFLAG_ACCEPT_STRIDE,
		mpi->w,mpi->h);

	assert(mpi->flags&MP_IMGFLAG_PLANAR);
	
	blur(dmpi->planes[0], mpi->planes[0], mpi->w,mpi->h, dmpi->stride[0], mpi->stride[0], &vf->priv->luma);
	blur(dmpi->planes[1], mpi->planes[1], cw    , ch   , dmpi->stride[1], mpi->stride[1], &vf->priv->chroma);
	blur(dmpi->planes[2], mpi->planes[2], cw    , ch   , dmpi->stride[2], mpi->stride[2], &vf->priv->chroma);
    
	return vf_next_put_image(vf,dmpi);
}

//===========================================================================//

static int query_format(struct vf_instance_s* vf, unsigned int fmt){
	switch(fmt)
	{
	case IMGFMT_YV12:
	case IMGFMT_I420:
	case IMGFMT_IYUV:
	case IMGFMT_YVU9:
	case IMGFMT_444P:
	case IMGFMT_422P:
	case IMGFMT_411P:
		return vf_next_query_format(vf, fmt);
	}
	return 0;
}

static int open(vf_instance_t *vf, char* args){
	int e;

	vf->config=config;
	vf->put_image=put_image;
//	vf->get_image=get_image;
	vf->query_format=query_format;
	vf->uninit=uninit;
	vf->priv=malloc(sizeof(struct vf_priv_s));
	memset(vf->priv, 0, sizeof(struct vf_priv_s));

	if(args==NULL) return 0;
	
	e=sscanf(args, "%f:%f:%f:%f:%f:%f",
		&vf->priv->luma.radius,
		&vf->priv->luma.preFilterRadius,
		&vf->priv->luma.strength,
		&vf->priv->chroma.radius,
		&vf->priv->chroma.preFilterRadius,
		&vf->priv->chroma.strength
		);

	vf->priv->luma.quality = vf->priv->chroma.quality= 3.0;
	
	if(e==3){
		vf->priv->chroma.radius= vf->priv->luma.radius;
		vf->priv->chroma.preFilterRadius = vf->priv->luma.preFilterRadius;
		vf->priv->chroma.strength= vf->priv->luma.strength;
	}else if(e!=6)
		return 0;

//	if(vf->priv->luma.radius < 0) return 0;
//	if(vf->priv->chroma.radius < 0) return 0;
		
	return 1;
}

vf_info_t vf_info_sab = {
    "shape adaptive blur",
    "sab",
    "Michael Niedermayer",
    "",
    open
};

//===========================================================================//

Index: vf.c
===================================================================
RCS file: /cvsroot/mplayer/main/libmpcodecs/vf.c,v
retrieving revision 1.59
retrieving revision 1.60
diff -u -r1.59 -r1.60
--- vf.c	31 Oct 2002 23:26:11 -0000	1.59
+++ vf.c	4 Nov 2002 16:41:59 -0000	1.60
@@ -49,6 +49,7 @@
 extern vf_info_t vf_info_swapuv;
 extern vf_info_t vf_info_il;
 extern vf_info_t vf_info_boxblur;
+extern vf_info_t vf_info_sab;
 
 char** vo_plugin_args=(char**) NULL;
 
@@ -91,6 +92,7 @@
     &vf_info_swapuv,
     &vf_info_il,
     &vf_info_boxblur,
+    &vf_info_sab,
     NULL
 };
 

Index: Makefile
===================================================================
RCS file: /cvsroot/mplayer/main/libmpcodecs/Makefile,v
retrieving revision 1.74
retrieving revision 1.75
diff -u -r1.74 -r1.75
--- Makefile	1 Nov 2002 16:38:50 -0000	1.74
+++ Makefile	4 Nov 2002 16:41:59 -0000	1.75
@@ -14,7 +14,7 @@
 VIDEO_SRCS_OPT=vd_realvid.c vd_ffmpeg.c vd_dshow.c vd_vfw.c vd_vfwex.c vd_odivx.c vd_divx4.c vd_xanim.c vd_xvid.c vd_libdv.c
 VIDEO_SRCS=dec_video.c vd.c $(VIDEO_SRCS_NAT) $(VIDEO_SRCS_LIB) $(VIDEO_SRCS_OPT)
 
-VFILTER_SRCS=vf.c vf_vo.c vf_crop.c vf_expand.c vf_pp.c vf_scale.c vf_format.c vf_yuy2.c vf_flip.c vf_rgb2bgr.c vf_rotate.c vf_mirror.c vf_palette.c vf_lavc.c vf_dvbscale.c vf_cropdetect.c vf_test.c vf_noise.c vf_yvu9.c vf_rectangle.c vf_lavcdeint.c vf_eq.c vf_eq2.c vf_halfpack.c vf_dint.c vf_1bpp.c vf_bmovl.c vf_2xsai.c vf_unsharp.c vf_swapuv.c vf_il.c vf_boxblur.c
+VFILTER_SRCS=vf.c vf_vo.c vf_crop.c vf_expand.c vf_pp.c vf_scale.c vf_format.c vf_yuy2.c vf_flip.c vf_rgb2bgr.c vf_rotate.c vf_mirror.c vf_palette.c vf_lavc.c vf_dvbscale.c vf_cropdetect.c vf_test.c vf_noise.c vf_yvu9.c vf_rectangle.c vf_lavcdeint.c vf_eq.c vf_eq2.c vf_halfpack.c vf_dint.c vf_1bpp.c vf_bmovl.c vf_2xsai.c vf_unsharp.c vf_swapuv.c vf_il.c vf_boxblur.c vf_sab.c
 ENCODER_SRCS=ve.c ve_divx4.c ve_lavc.c ve_vfw.c ve_rawrgb.c ve_libdv.c ve_xvid.c
 
 NATIVE_SRCS=native/RTjpegN.c native/cinepak.c native/cyuv.c native/fli.c native/minilzo.c native/msvidc.c native/nuppelvideo.c native/qtrle.c native/qtrpza.c native/qtsmc.c native/roqav.c native/xa_gsm.c native/svq1.c




More information about the MPlayer-cvslog mailing list