vj_effect *lumablend_init(int w, int h) { vj_effect *ve = (vj_effect *) vj_calloc(sizeof(vj_effect)); ve->num_params = 4; ve->defaults = (int *) vj_calloc(sizeof(int) * ve->num_params); /* default values */ ve->limits[0] = (int *) vj_calloc(sizeof(int) * ve->num_params); /* min */ ve->limits[1] = (int *) vj_calloc(sizeof(int) * ve->num_params); /* max */ ve->limits[0][0] = 0; /* type */ ve->limits[1][0] = 2; if(vj_task_available() ) ve->limits[1][0] = 1; /* no blur */ ve->limits[0][1] = 0; /* threshold 1 */ ve->limits[1][1] = 255; ve->limits[0][2] = 0; /* threshold 2 */ ve->limits[1][2] = 255; ve->limits[0][3] = 0; /*opacity */ ve->limits[1][3] = 255; ve->defaults[0] = 1; ve->defaults[1] = 0; ve->defaults[2] = 35; ve->defaults[3] = 150; ve->description = "Opacity by Threshold"; ve->extra_frame = 1; ve->parallel = 0; ve->sub_format = 1; ve->parallel = 1; ve->has_user = 0; ve->param_description = vje_build_param_list(ve->num_params, "Mode", "Threshold A", "Threshold B", "Opacity" ); return ve; }
void average_blend_blend_apply( uint8_t *src1[3], uint8_t *src2[3], int len, int uv_len, int average_blend ) { if( vj_task_available() ) { vj_task_set_from_args( len,uv_len ); vj_task_set_param( average_blend,0 ); vj_task_run( src1, src2, NULL, NULL, 3, (performer_job_routine) &average_blend_apply_job ); } else { average_blend_blend_apply1( src1,src2,len,uv_len,average_blend ); } }
void average_blend_applyN( VJFrame *frame, VJFrame *frame2,int average_blend) { if( vj_task_available() ) { vj_task_set_from_frame( frame ); vj_task_set_param( average_blend,0 ); vj_task_run( frame->data, frame2->data, NULL, NULL, 3, (performer_job_routine) &average_blend_apply_job ); } else { average_blend_apply1( frame,frame2,average_blend ); } }
void alpha_transition_apply( VJFrame *frame, uint8_t *B[4], int time_index ) { if(vj_task_available() ) { vj_task_set_from_frame( frame ); vj_task_set_param( time_index,0 ); vj_task_run( frame->data, B, NULL, NULL, 4, (performer_job_routine) &alpha_transition_apply_job ); } else { alpha_blend_transition( frame->data[0],frame->data[1],frame->data[2], frame->data[3], B[0],B[1],B[2],B[3], frame->len, frame->width, time_index, SMOOTH_DEFAULT, USE_FROM_A ); } }
void motionmap_apply( VJFrame *frame, int threshold, int limit1, int draw, int history, int decay, int interpol, int last_act_level, int act_decay ) { unsigned int i; const unsigned int width = frame->width; const unsigned int height = frame->height; const int len = frame->len; uint8_t *Cb = frame->data[1]; uint8_t *Cr = frame->data[2]; const int limit = limit1 * 10; if(!have_bg) { veejay_msg(VEEJAY_MSG_ERROR,"Motion Mapping: Snap the background frame with VIMS 339 or mask button in reloaded"); return; } if( act_decay != last_act_decay ) { last_act_decay = act_decay; activity_decay = act_decay; } // run difference algorithm over multiple threads if( vj_task_available() ) { VJFrame task; task.stride[0] = len; // plane length task.stride[1] = len; task.stride[2] = len; task.stride[3] = 0; task.data[0] = bg_image; // plane 0 = background image task.data[1] = frame->data[0]; // plane 1 = luminance channel task.data[2] = prev_img; // plane 2 = luminance channel of previous frame task.data[3] = NULL; task.ssm = 1; // all planes are the same size task.format = frame->format; // not important, but cannot be 0 task.shift_v = 0; task.shift_h = 0; task.uv_width = width; task.uv_height = height; task.width = width; // dimensions task.height = height; uint8_t *dst[4] = { binary_img, diff_img, diff_img + RUP8(len), NULL }; vj_task_set_from_frame( &task ); vj_task_set_param( threshold, 0 ); vj_task_run( task.data, dst, NULL,NULL,4, (performer_job_routine) &motionmap_find_diff_job ); } else { motionmap_calc_diff( (const uint8_t*) bg_image, prev_img, (const uint8_t*) frame->data[0], diff_img, diff_img + RUP8(len), binary_img, len, threshold ); } if( draw ) { vj_frame_clear1( Cb, 128, len ); vj_frame_clear1( Cr, 128, len ); vj_frame_copy1( binary_img, frame->data[0], len ); running = 0; stored_frame = 0; scale_lock = 0; return; } int32_t activity_level = motionmap_activity_level( binary_img, width, height ); int32_t avg_actlvl = 0; int32_t min = INT_MAX; int32_t local_max = 0; current_his_len = history; current_decay = decay; histogram_[ (nframe_%current_his_len) ] = activity_level; for( i = 0; i < current_his_len; i ++ ) { avg_actlvl += histogram_[i]; if(histogram_[i] > max ) max = histogram_[i]; if(histogram_[i] < min ) min = histogram_[i]; if(histogram_[i] > local_max) local_max = histogram_[i]; } avg_actlvl = avg_actlvl / current_his_len; if( avg_actlvl < limit ) { avg_actlvl = 0; } nframe_ ++; switch( last_act_level ) { case 0: if( (nframe_ % current_his_len)==0 ) { key1_ = min; key2_ = max; keyp_ = keyv_; keyv_ = avg_actlvl; global_max = max; } break; case 1: key1_ = min; key2_ = max; keyv_ = local_max; global_max = local_max; break; case 2: key1_ = min; key2_ = max; keyp_ = keyv_; keyv_ = avg_actlvl; global_max = max; break; case 3: if( (nframe_ % current_his_len)==0 ) { key1_ = min; key2_ = max; keyp_ = keyv_; keyv_ = avg_actlvl; global_max = max; } if( avg_actlvl == 0 ) scale_lock = 1; else scale_lock = 0; //reset to normal after "acitivity_decay" ticks if( scale_lock && act_decay > 0) { activity_decay --; if( activity_decay == 0 ) { last_act_decay = 0; scale_lock = 0; } } break; } running = 1; do_interpolation = interpol; }