From ea5a99801c87b693dc627998de3cb53736443816 Mon Sep 17 00:00:00 2001 From: iovar Date: Tue, 7 Nov 2006 08:32:25 +0000 Subject: UPDATE_YUV_BUFFER_SH_AVG and UPDATE_YUV_BUFFER_IM_AVG fixed to traverse the pixels, using register-stored incrementing pointers, instead of simple arrays. Also, values are read as integers to minimize memory accesses git-svn-id: https://recordmydesktop.svn.sourceforge.net/svnroot/recordmydesktop/trunk@148 f606c939-3180-4ac9-a4b8-4b8779d57d0a --- rMD-exp/include/recordmydesktop.h | 125 +++++++++++++++++++++++++++----------- 1 file changed, 91 insertions(+), 34 deletions(-) (limited to 'rMD-exp') diff --git a/rMD-exp/include/recordmydesktop.h b/rMD-exp/include/recordmydesktop.h index dd7925e..bd67869 100644 --- a/rMD-exp/include/recordmydesktop.h +++ b/rMD-exp/include/recordmydesktop.h @@ -477,26 +477,57 @@ int capture_busy, } #define UPDATE_YUV_BUFFER_SH_AVG(yuv,data,x_tm,y_tm,width_tm,height_tm){\ - int i,k;\ - unsigned char avg0,avg1,avg2;\ - for(k=y_tm;ky[i+k*yuv->y_width]=Yr[data[(i+k*yuv->y_width)*4+__RBYTE]] + Yg[data[(i+k*yuv->y_width)*4+__GBYTE]] + Yb[data[(i+k*yuv->y_width)*4+__BBYTE]];\ - if((k%2)&&(i%2)){\ - avg2=AVG_4_PIXELS(data,(yuv->y_width),k,i,__RBYTE);\ - avg1=AVG_4_PIXELS(data,(yuv->y_width),k,i,__GBYTE);\ - avg0=AVG_4_PIXELS(data,(yuv->y_width),k,i,__BBYTE);\ - yuv->u[i/2+k/2*yuv->uv_width]=Ur[avg2] +\ - Ug[avg1] +\ - Ub[avg0] ;\ - yuv->v[i/2+k/2*yuv->uv_width]=Vr[avg2] +\ - Vg[avg1] +\ - Vb[avg0] ;\ - }\ + int k,i;\ + register unsigned int t_val;\ + register unsigned int *datapi=(unsigned int*)data+x_tm+y_tm*yuv->y_width,\ + *datapi_next=(unsigned int*)data+x_tm+(y_tm+1)*yuv->y_width;\ + register unsigned char *yuv_y=yuv->y+x_tm+y_tm*yuv->y_width,\ + *yuv_u=yuv->u+x_tm/2+(y_tm*yuv->uv_width)/2,\ + *yuv_v=yuv->v+x_tm/2+(y_tm*yuv->uv_width)/2,\ + *_yr=Yr,*_yg=Yg,*_yb=Yb,\ + *_ur=Ur,*_ug=Ug,*_ub=Ub,\ + *_vr=Vr,*_vg=Vg,*_vb=Vb;\ +\ + for(k=0;ky_width-width_tm;\ + datapi+=yuv->y_width-width_tm;\ + }\ + datapi=(unsigned int*)data+x_tm+y_tm*yuv->y_width;\ + for(k=0;ky_width-width_tm)/2;\ + yuv_v+=(yuv->y_width-width_tm)/2;\ + datapi+=(2*yuv->y_width-width_tm);\ + datapi_next+=(2*yuv->y_width-width_tm);\ }\ } + + #define UPDATE_YUV_BUFFER_IM(yuv,data,x_tm,y_tm,width_tm,height_tm){\ int k,i;\ register unsigned int t_val;\ @@ -535,31 +566,57 @@ int capture_busy, }\ } - #define UPDATE_YUV_BUFFER_IM_AVG(yuv,data,x_tm,y_tm,width_tm,height_tm){\ - int i,k,j=0;\ - unsigned char avg0,avg1,avg2;\ - int x_2=x_tm/2,y_2=y_tm/2;\ + int k,i;\ + register unsigned int t_val;\ + register unsigned int *datapi=(unsigned int*)data,\ + *datapi_next=(unsigned int*)data+width_tm;\ + register unsigned char *yuv_y=yuv->y+x_tm+y_tm*yuv->y_width,\ + *yuv_u=yuv->u+x_tm/2+(y_tm*yuv->uv_width)/2,\ + *yuv_v=yuv->v+x_tm/2+(y_tm*yuv->uv_width)/2,\ + *_yr=Yr,*_yg=Yg,*_yb=Yb,\ + *_ur=Ur,*_ug=Ug,*_ub=Ub,\ + *_vr=Vr,*_vg=Vg,*_vb=Vb;\ +\ for(k=0;ky[x_tm+i+(k+y_tm)*yuv->y_width]=Yr[data[(j*4)+__RBYTE]] + Yg[data[(j*4)+__GBYTE]] + Yb[data[(j*4)+__BBYTE]] ;\ - if((k%2)&&(i%2)){\ - avg2=AVG_4_PIXELS(data,width_tm,k,i,__RBYTE);\ - avg1=AVG_4_PIXELS(data,width_tm,k,i,__GBYTE);\ - avg0=AVG_4_PIXELS(data,width_tm,k,i,__BBYTE);\ - yuv->u[x_2+i/2+(k/2+y_2)*yuv->uv_width]=\ - Ur[avg2] + Ug[avg1] +\ - Ub[avg0];\ - yuv->v[x_2+i/2+(k/2+y_2)*yuv->uv_width]=\ - Vr[avg2] + Vg[avg1] +\ - Vb[avg0];\ - }\ - \ - j++;\ + t_val=*datapi;\ + *yuv_y=_yr[__RVALUE(t_val)] + _yg[__GVALUE(t_val)] + _yb[__BVALUE(t_val)] ;\ + datapi++;\ + yuv_y++;\ + }\ + yuv_y+=yuv->y_width-width_tm;\ + }\ + datapi=(unsigned int*)data;\ + for(k=0;ky_width-width_tm)/2;\ + yuv_v+=(yuv->y_width-width_tm)/2;\ + datapi+=width_tm;\ + datapi_next+=width_tm;\ }\ } + + #define XFIXES_POINTER_TO_YUV(yuv,data,x_tm,y_tm,width_tm,height_tm,column_discard_stride){\ int i,k,j=0;\ unsigned char avg0,avg1,avg2,avg3;\ -- cgit v1.2.1