void greyselect_apply( VJFrame *frame, int width,
		   int height, int i_angle, int r, int g,
		   int b)
{

    uint8_t *fg_cb, *fg_cr;
    int accept_angle_tg, accept_angle_ctg, one_over_kc;
    int kfgy_scale, kg;
    int cb, cr;
    float kg1, tmp, aa = 255.0f, bb = 255.0f, _y = 0;
    float angle = (float) i_angle / 100.0f;
    unsigned int pos;
    uint8_t val;
	uint8_t *Y = frame->data[0];
	uint8_t *Cb = frame->data[1];
	uint8_t *Cr = frame->data[2];
	int iy,iu,iv;
	_rgb2yuv(r,g,b,iy,iu,iv);
	_y = (float) iy;
	aa = (float) iu;
	bb = (float) iv;

    tmp = sqrt(((aa * aa) + (bb * bb)));
    cb = 255 * (aa / tmp);
    cr = 255 * (bb / tmp);
    kg1 = tmp;
    /* obtain coordinate system for cb / cr */
    accept_angle_tg = 0xf * tan(M_PI * angle / 180.0);
    accept_angle_ctg = 0xf / tan(M_PI * angle / 180.0);
    
    tmp = 1 / kg1;
    one_over_kc = 0xff * 2 * tmp - 0xff;
    kfgy_scale = 0xf * (float) (_y) / kg1;
    kg = kg1;

    /* intialize pointers */
    fg_cb = Cb;
    fg_cr = Cr;

    for (pos = (width * height); pos != 0; pos--) {
	short xx, yy;
	xx = (((fg_cb[pos]) * cb) + ((fg_cr[pos]) * cr)) >> 7;
	yy = (((fg_cr[pos]) * cb) - ((fg_cb[pos]) * cr)) >> 7;
	val = (xx * accept_angle_tg) >> 4;

	if (abs(yy) > val) {
		Cb[pos]=128;
		Cr[pos]=128;
	}
    }
}
Exemple #2
0
void dummy_rgb_apply( VJFrame *frame, int width, int height, int r,int g, int b)
{
    	const int len = frame->len;
	const int uv_len = frame->uv_len;
	int colorCb, colorCr, colorY;

 	uint8_t *Y = frame->data[0];
	uint8_t *Cb = frame->data[1];
	uint8_t *Cr = frame->data[2];

	_rgb2yuv(r,g,b,colorY,colorCb,colorCr);
  
 	veejay_memset( Y, colorY, len);
   	veejay_memset( Cb,colorCb,uv_len);
   	veejay_memset( Cr,colorCr,uv_len);
}
Exemple #3
0
void alphaselect2_apply( VJFrame *frame,int tola, int r, int g,
		   int b, int tolb,int alpha)
{
    unsigned int pos;
	const int len = frame->len;
	uint8_t *Y = frame->data[0];
	uint8_t *Cb = frame->data[1];
	uint8_t *Cr = frame->data[2];
	uint8_t *A  = frame->data[3];
	int iy=0,iu=128,iv=128;
	_rgb2yuv(r,g,b,iy,iu,iv);

	const double dtola = tola * 0.1f;
	const double dtolb = tolb * 0.1f;

	if(alpha == 0 ) {
		for (pos = len; pos != 0; pos--) {
			double d = color_distance( Cb[pos],Cr[pos],iu,iv,dtola,dtolb );
			uint8_t av = (uint8_t) (d * 255.0);
			if( av < 0xff ) {
				Cb[pos] = 128;
				Cr[pos] = 128;
			}
			else if (av == 0) {
				Cb[pos] = 128;
				Cr[pos] = 128;
				Y[pos] = pixel_Y_lo_;
			}
			A[pos] = av;
		}
		return;
	}
	
	switch(alpha)
	{
		case 1:
			for (pos = len; pos != 0; pos--) {
				double d = color_distance( Cb[pos],Cr[pos],iu,iv,dtola,dtolb );
				A[pos] = (uint8_t) (d * 255.0);
				if( A[pos] < 0xff ) {
					Y[pos] = A[pos];
					Cb[pos] = 128;
					Cr[pos] = 128;
				}
				else if( A[pos] == 0) {
					Cb[pos] = 128;
					Cr[pos] = 128;
					Y[pos] = pixel_Y_lo_;
				}
			}
			break;
		case 2:
			for (pos = len; pos != 0; pos--) {
				if(A[pos] == 0 )
					continue;
				if(A[pos] == 0xff) {
					Y[pos] = 0xff;
					Cb[pos] = 128;
					Cr[pos] = 128;
				}
				else {
					double d = color_distance( Cb[pos],Cr[pos],iu,iv,dtola,dtolb );
					A[pos] = (uint8_t) (d * 255.0);
					if( A[pos] < 0xff ) {
						Y[pos] = A[pos];
						Cb[pos] = 128;
						Cr[pos] = 128;
					}
					else if( A[pos] == 0) {
						Cb[pos] = 128;
						Cr[pos] = 128;
						Y[pos] = pixel_Y_lo_;
					}
				}
			}
			break;

	}
}
void complexopacity_apply(VJFrame *frame, int width,
			int height, int i_angle, int r, int g, int b,
			int level )
{

    uint8_t *fg_y, *fg_cb, *fg_cr;
    uint8_t *bg_y, *bg_cb, *bg_cr;
    int accept_angle_tg, accept_angle_ctg, one_over_kc;
    int kfgy_scale, kg;

    uint8_t cb, cr;
    float kg1, tmp, aa = 255.0f, bb = 255.0f, _y = 0;
    float angle = (float) i_angle / 100.0f;
    unsigned int pos;
    int matrix[5];
    uint8_t val;
	const int len = frame->len;
 	uint8_t *Y = frame->data[0];
	uint8_t *Cb = frame->data[1];
	uint8_t *Cr = frame->data[2];
	int	iy,iu,iv;
	_rgb2yuv(r,g,b,iy,iu,iv);
	_y = (float) iy;
	aa = (float) iu;
	bb = (float) iv;  
    tmp = sqrt(((aa * aa) + (bb * bb)));
    cb = 255 * (aa / tmp);
    cr = 255 * (bb / tmp);
    kg1 = tmp;

    /* obtain coordinate system for cb / cr */
    accept_angle_tg = 0xf * tan(M_PI * angle / 180.0);
    accept_angle_ctg = 0xf / tan(M_PI * angle / 180.0);

    tmp = 1 / kg1;
    one_over_kc = 0xff * 2 * tmp - 0xff;
    kfgy_scale = 0xf * (float) (_y) / kg1;
    kg = kg1;

    /* intialize pointers */
    fg_y = frame->data[0];
    fg_cb = frame->data[1];
    fg_cr = frame->data[2];

    bg_y = frame->data[0];
    bg_cb = frame->data[1];
    bg_cr = frame->data[2];

    for (pos = width + 1; pos < (len) - width - 1; pos++) {
	int i = 0;
	int smooth = 0;
	/* setup matrix 
	   [ - 0 - ] = do not accept. [ - 1 - ] = level 5 , accept only when all n = 1
	   [ 0 0 0 ]                  [ 1 1 1 ]
	   [ - 0 - ]                  [ - 1 - ]

	   [ - 0 - ] sum of all n is acceptance value for level
	   [ 1 0 1 ]                    
	   [ 0 1 0 ]
	 */
	matrix[0] = accept_ipixel(fg_cb[pos], fg_cr[pos], cb, cr, accept_angle_tg);	/* center pixel */
	matrix[1] = accept_ipixel(fg_cb[pos - 1], fg_cr[pos - 1], cb, cr, accept_angle_tg);	/* left pixel */
	matrix[2] = accept_ipixel(fg_cb[pos + 1], fg_cr[pos + 1], cb, cr, accept_angle_tg);	/* right pixel */
	matrix[3] = accept_ipixel(fg_cb[pos + width], fg_cr[pos + width], cb, cr, accept_angle_tg);	/* top pixel */
	matrix[4] = accept_ipixel(fg_cb[pos - width], fg_cr[pos - width], cb, cr, accept_angle_tg);	/* bottom pixel */
	for (i = 0; i < 5; i++) {
	    if (matrix[i] == 1)
		smooth++;
	}
	if (smooth >= level) {
	    short xx, yy;
	    /* get bg/fg pixels */
	    uint8_t p1 = (matrix[0] == 0 ? fg_y[pos] : bg_y[pos]);
	    uint8_t p2 = (matrix[1] == 0 ? fg_y[pos - 1] : bg_y[pos - 1]);
	    uint8_t p3 = (matrix[2] == 0 ? fg_y[pos + 1] : bg_y[pos + 1]);
	    uint8_t p4 =
		(matrix[3] == 0 ? fg_y[pos + width] : bg_y[pos + width]);
	    uint8_t p5 =
		(matrix[4] == 0 ? fg_y[pos - width] : bg_y[pos - width]);
	    /* and blur the pixel */
	    fg_y[pos] = (p1 + p2 + p3 + p4 + p5) / 5;

	    /* convert foreground to xz coordinates where x direction is
	       defined by key color */
	    xx = (((fg_cb[pos]) * cb) + ((fg_cr[pos]) * cr)) >> 7;
	    yy = (((fg_cr[pos]) * cb) - ((fg_cb[pos]) * cr)) >> 7;

	    val = (xx * accept_angle_tg) >> 4;
	    if (val > 127)
			val = 127;
	    /* see if pixel is within range of color and opacity it */
	    if (abs(yy) < val ) {
			Y[pos] = 255 - Y[pos];
			Cb[pos] = 255 - Cb[pos];
			Cr[pos] = 255 - Cr[pos];
	    }
	}
    }
Exemple #5
0
void chromapalette_apply(VJFrame *frame, int angle, int r, int g, int b, int color_cb, int color_cr )
{
	unsigned int i;
	const int len = frame->len;
 	uint8_t *Y = frame->data[0];
	uint8_t *Cb = frame->data[1];
	uint8_t *Cr = frame->data[2];
	uint8_t U;
	uint8_t V;
	int	y=0,u=128,v=128;
 	const float cb_mul = 0.492;
	const float cr_mul = 0.877;
	
	_rgb2yuv( r,g,b,y,u,v );

	const float aa = (const float) u;
	const float bb = (const float) v;

    float tmp = sqrt(((aa * aa) + (bb * bb)));
    const int colorKeycb = 127 * (aa / tmp);
    const int colorKeycr = 127 * (bb / tmp);
	//float angle_f = ((float)angle*0.01f);
    const int accept_angle = (int)( 15.0f * tanf(M_PI * angle / 180.0f));
	/*

				chrominance is defined as the difference between a color and a reference value luminance

				U = blue - Y
			    V = red - Y

				this effect does (on key selection)

				U = color_cb - Y
			 	V = color_cr - Y
				
			 	4:2:0 is supersampled to 4:4:4 so there is a chroma value for every Y

	*/

	if(color_cb != 0 && color_cr != 0) //both cb and cr
	{
		for( i = 0 ; i < len ; i ++ )
		{
				if( _chroma_key( Cb[i] , Cr[i], colorKeycb,colorKeycr, accept_angle))
				{
					U =  128+(int)( (float) (color_cb - Y[i]) * cb_mul );
					Cb[i] = CLAMP_UV( U );
					V =  128+(int)( (float) (color_cr - Y[i]) * cr_mul );
					Cr[i] = CLAMP_UV( V );
				}
		}
	}
	if(color_cr == 0 ) //only cr
	{
		for( i = 0 ; i < len ; i ++ )
		{
				if( _chroma_key( Cb[i], Cr[i], colorKeycb, colorKeycr, accept_angle))
				{
					V = 128+(int)( (float) (color_cr - Y[i]) * cr_mul );
					Cr[i] = CLAMP_UV( V );
				}
		}
	}
	if(color_cb == 0 ) // only cb
	{
		for( i = 0 ; i < len ; i ++ )
		{
			if( _chroma_key( Cb[i] , Cr[i], colorKeycb,colorKeycr, accept_angle))
			{
				U = 128 + (int)( (float) (color_cb - Y[i]) * cb_mul );
				Cb[i] = CLAMP_UV(U);
			}
		}
	}

 
}
void complexsaturation_apply(VJFrame *frame, int width,
		   int height, int i_angle, int r, int g,
		   int b, int adjust_v, int adjust_degrees, int i_noise)
{
//	double degrees = adjust_degrees * 0.01;
//	double dsat = adjust_v * 0.01;


	float	hue	= (adjust_degrees/180.0)*M_PI;
	float	sat	= (adjust_v / 100.0f);

	uint8_t *fg_y, *fg_cb, *fg_cr;
	uint8_t *bg_y, *bg_cb, *bg_cr;
  	int accept_angle_tg, accept_angle_ctg, one_over_kc;
    int kfgy_scale, kg;
    uint8_t cb, cr;
    int kbg, x1, y1;
    float kg1, tmp, aa = 255.0f, bb = 255.0f, _y = 0;
    float angle = (float) i_angle / 100.0f;
    float noise_level = (i_noise  / 100.0f);
    unsigned int pos;
    uint8_t val, tmp1;
    uint8_t *Y = frame->data[0];
	uint8_t *Cb= frame->data[1];
	uint8_t *Cr= frame->data[2];
	int	iy=pixel_Y_lo_,iu=128,iv=128;
	_rgb2yuv( r,g,b, iy,iu,iv );
	_y = (float) iy;
	aa = (float) iu;
	bb = (float) iv;
    tmp = sqrt(((aa * aa) + (bb * bb)));
    cb = 255 * (aa / tmp);
    cr = 255 * (bb / tmp);
    kg1 = tmp;

    /* obtain coordinate system for cb / cr */
    accept_angle_tg = 0xf * tan(M_PI * angle / 180.0);
    accept_angle_ctg = 0xf / tan(M_PI * angle / 180.0);

    tmp = 1 / kg1;
    one_over_kc = 0xff * 2 * tmp - 0xff;
    kfgy_scale = 0xf * (float) (_y) / kg1;
    kg = kg1;

    /* intialize pointers */
    fg_y = frame->data[0];
    fg_cb = frame->data[1];
    fg_cr = frame->data[2];

    bg_y = frame->data[0];
    bg_cb = frame->data[1];
    bg_cr = frame->data[2];
	const int s = (int) rint( sin(hue) * (1<<16) * sat );
	const int c = (int) rint( cos(hue) * (1<<16) * sat );
	for (pos = 0; pos < frame->len; pos++)
	{
		short xx, yy;

		xx = (((fg_cb[pos]) * cb) + ((fg_cr[pos]) * cr)) >> 7;
		yy = (((fg_cr[pos]) * cb) - ((fg_cb[pos]) * cr)) >> 7;

	/* accept angle should not be > 90 degrees 
	   reasonable results between 10 and 80 degrees.
	 */

		val = (xx * accept_angle_tg) >> 4;
		if (abs(yy) > val) { /* pixel is within selected color range,  saturate */	
			val = (yy * accept_angle_ctg) >> 4;

		    x1 = abs(val);
		    y1 = yy;
		    tmp1 = xx - x1;

		    kbg = (tmp1 * one_over_kc) >> 1;

		  	val = (tmp1 * kfgy_scale) >> 4;
			val = fg_y[pos] - val;
	   		Y[pos] = val;
 			val = ((x1 * cb) - (y1 * cr)) >> 7;
		    	Cb[pos] = val;
	    		val = ((x1 * cr) - (y1 * cb)) >> 7;
	    		Cr[pos] = val;

	    		val = (yy * yy) + (kg * kg);
	    		if (val < (noise_level * noise_level)) {
				kbg = 255;
	    		}

	   		Y[pos] = (Y[pos] + (kbg * bg_y[pos])) >> 8;
	    		Cb[pos] = (Cb[pos] + (kbg * bg_cb[pos])) >> 8;
	   		Cr[pos] = (Cr[pos] + (kbg * bg_cr[pos])) >> 8;

			int _cb = Cb[pos] - 128;
			int _cr = Cr[pos] - 128;
			if( _cb != 0 && _cr != 0)
			{
				const int u = Cb[pos] - 128;
				const int v = Cr[pos] - 128;
				int new_u = (c * u - s * v + (1<<15) + (128<<16)) >> 16;
				int new_v = (s * u + c * v + (1<<15) + (128<<16)) >> 16;
				if( new_u & 768 ) new_u = (-new_u) >> 31;
				if( new_v & 768 ) new_v = (-new_v) >> 31;
				Cb[pos] = new_u;
				Cr[pos] = new_v;
			}
    		}

	}