/********************************************************************************* * recordMyDesktop * ********************************************************************************** * * * Copyright (C) 2006 John Varouhakis * * * * * * 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 * * * * * * * * For further information contact me at biocrasher@gmail.com * **********************************************************************************/ #include void XImageToYUV(XImage *imgz,yuv_buffer *yuv,int no_quick_subsample){ unsigned char *dtap=(unsigned char *)imgz->data; unsigned char avg2,avg1,avg0; int i,k,j=0; for(k=0;k<(imgz->width*imgz->height);k++){ yuv->y[k]=Yr[dtap[(k*4)+2]] + Yg[dtap[(k*4)+1]] + Yb[dtap[(k*4)]]; } if(!no_quick_subsample){ for(i=0;i<(imgz->height);i+=2){ for(k=0;k<(imgz->width);k+=2){ yuv->u[j]=Ur[dtap[i*imgz->bytes_per_line+k*4+2]] + Ug[dtap[i*imgz->bytes_per_line+k*4+1]] + Ub[dtap[i*imgz->bytes_per_line+k*4]]; yuv->v[j]=Vr[dtap[i*imgz->bytes_per_line+k*4+2]] + Vg[dtap[i*imgz->bytes_per_line+k*4+1]] + Vb[dtap[i*imgz->bytes_per_line+k*4]] ; j++; } } } else{ for(i=0;i<(imgz->height);i+=2){ for(k=0;k<(imgz->width);k+=2){ avg2=AVG_4_PIXELS(dtap,(imgz->width),i,k,2); avg1=AVG_4_PIXELS(dtap,(imgz->width),i,k,1); avg0=AVG_4_PIXELS(dtap,(imgz->width),i,k,0); yuv->u[j]=Ur[avg2] + Ug[avg1] + Ub[avg0]; yuv->v[j]=Vr[avg2] + Vg[avg1] + Vb[avg0] ; j++; } } } } void MakeMatrices(){ int i; for(i=0;i<256;i++) Yr[i]=0.299*i; for(i=0;i<256;i++) Yg[i]=0.587*i; for(i=0;i<256;i++) Yb[i]=0.114*i; for(i=0;i<256;i++) Ur[i]=43.1-0.169*i; for(i=0;i<256;i++) Ug[i]=84.41-0.331*i; for(i=0;i<256;i++) Ub[i]=0.5*i; for(i=0;i<256;i++) Vr[i]=0.5*i; for(i=0;i<256;i++) Vg[i]=107-0.419*i; for(i=0;i<256;i++) Vb[i]=21-0.081*i; }