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; } } }
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); }
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]; } } }
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; } } }