diff --git a/veejay-current/veejay-server/libvje/effects/baltantv.c b/veejay-current/veejay-server/libvje/effects/baltantv.c index 74abd691..eadcc7c5 100644 --- a/veejay-current/veejay-server/libvje/effects/baltantv.c +++ b/veejay-current/veejay-server/libvje/effects/baltantv.c @@ -29,6 +29,8 @@ #define PLANES 50 + +//Inspired by BaltanTV vj_effect *baltantv_init(int w, int h) { vj_effect *ve = (vj_effect *) vj_calloc(sizeof(vj_effect)); @@ -39,21 +41,14 @@ vj_effect *baltantv_init(int w, int h) ve->limits[0][0] = 2; ve->limits[1][0] = PLANES; ve->limits[0][1] = 0; - ve->limits[1][1] = 1; - ve->defaults[0] = 8; - ve->defaults[1] = 0; + ve->limits[1][1] = PLANES/2; + ve->defaults[0] = 4; + ve->defaults[1] = 1; ve->description = "BaltanTV (EffecTV)"; ve->sub_format = -1; ve->extra_frame = 0; ve->has_user = 0; - ve->param_description = vje_build_param_list( ve->num_params, "Stride", "Mode" ); - - - ve->hints = vje_init_value_hint_list( ve->num_params ); - - vje_build_value_hint_list( ve->hints, ve->limits[1][1], 1, "Decaying", "Normal" ); - - + ve->param_description = vje_build_param_list( ve->num_params, "Stride", "Shift" ); return ve; } @@ -63,6 +58,12 @@ typedef struct { uint8_t *planetableY_; int8_t *planetableU_; int8_t *planetableV_; + + uint8_t *currentY; + int8_t *currentU; + int8_t *currentV; + + int stride; } baltantv_t; void *baltantv_malloc(int w, int h) @@ -87,11 +88,16 @@ void *baltantv_malloc(int w, int h) if(!b->planetableV_) { free(b->planetableY_); free(b->planetableU_); + free(b); return NULL; } - veejay_memset( b->planetableU_, 0, PLANES * (w*h)); - veejay_memset( b->planetableV_, 0, PLANES * (w*h)); + b->currentY = (uint8_t*) vj_calloc(sizeof(uint8_t) * w * h ); + b->currentU = (int8_t*) vj_malloc(sizeof(int8_t) * w * h ); + b->currentV = (int8_t*) vj_malloc(sizeof(int8_t) * w * h ); + + veejay_memset( b->planetableU_, 128, w * h ); + veejay_memset( b->planetableV_, 128, w * h ); return (void*) b; } @@ -102,12 +108,15 @@ void baltantv_free(void *ptr) free(b->planetableY_); free(b->planetableU_); free(b->planetableV_); + free(b->currentY); + free(b->currentU); + free(b->currentV); free(b); } void baltantv_apply( void *ptr, VJFrame *frame, int *args) { int stride = args[0]; - int mode = args[1]; + int shift = args[1]; unsigned int i,cf; const int len = frame->len; @@ -121,95 +130,61 @@ void baltantv_apply( void *ptr, VJFrame *frame, int *args) { uint8_t *pDstY = b->planetableY_ + (b->plane_ * len); int8_t *pDstU = b->planetableU_ + (b->plane_ * uv_len); int8_t *pDstV = b->planetableV_ + (b->plane_ * uv_len); + + uint8_t *cY = b->currentY; + int8_t *cU = b->currentU; + int8_t *cV = b->currentV; + uint32_t y; int32_t u,v; + + if( b->stride != stride ) { + b->plane_ = 0; + b->stride = stride; + } + for( i = 0; i < len ; i ++ ) { - pDstY[i] = (Y[i] >> 2 ); + pDstY[i] = Y[i]; + cY[i] = Y[i]; } for( i = 0; i < uv_len; i ++ ) { - pDstU[i] = ((U[i]-128)) >> 2; - pDstV[i] = ((V[i]-128)) >> 2; + pDstU[i] = (U[i]-128); + pDstV[i] = (V[i]-128); } - cf = b->plane_ & (stride-1); + uint8_t *pSrcY[4]; + int8_t *pSrcU[4]; + int8_t *pSrcV[4]; + for (int i = 0; i < 4; ++i) { + int offset = (b->plane_ - i + stride) % PLANES; + offset = (offset + PLANES) % PLANES; + pSrcY[i] = b->planetableY_ + (offset * len); + pSrcU[i] = b->planetableU_ + (offset * uv_len); + pSrcV[i] = b->planetableV_ + (offset * uv_len); + } + + uint32_t ySum, uSum, vSum; + for (int i = 0; i < len; ++i) { + ySum = cY[i] + pSrcY[0][i] + pSrcY[1][i] + pSrcY[2][i] + pSrcY[3][i]; + Y[i] = (uint8_t)(ySum / 5); - uint8_t *pSrcY[4] = { - b->planetableY_ + (cf * len), - b->planetableY_ + ((cf+stride) * len), - b->planetableY_ + ((cf+stride*2) * len), - b->planetableY_ + ((cf+stride*3) * len) - }; - int8_t *pSrcU[4] = { - b->planetableU_ + (cf * uv_len), - b->planetableU_ + ((cf+stride) * uv_len), - b->planetableU_ + ((cf+stride*2) * uv_len), - b->planetableU_ + ((cf+stride*3) * uv_len) - }; - int8_t *pSrcV[4] = { - b->planetableV_ + (cf * uv_len), - b->planetableV_ + ((cf+stride) * uv_len), - b->planetableV_ + ((cf+stride*2) * uv_len), - b->planetableV_ + ((cf+stride*3) * uv_len) - }; + uSum = pSrcU[0][i] + pSrcU[1][i] + pSrcU[2][i] + pSrcU[3][i]; + U[i] = 128 + (uSum / 4); - - if( mode == 0 ) - { - for( i = 0; i < len; i ++ ) - { - y = pSrcY[0][i] + - pSrcY[1][i] + - pSrcY[2][i] + - pSrcY[3][i]; - Y[i] = (y>>2); - pDstY[i] = (y >> 2 ); - } - for( i = 0; i < uv_len; i ++ ) - { - u = pSrcU[0][i] + - pSrcU[1][i] + - pSrcU[2][i] + - pSrcU[3][i]; - U[i] = 128 + (u>>2); - pDstU[i] = (u >> 2 ); - } - for( i = 0; i < uv_len; i ++ ) - { - v = pSrcV[0][i] + - pSrcV[1][i] + - pSrcV[2][i] + - pSrcV[3][i]; - V[i] =128 + (v>>2); - pDstV[i] = (v >> 2 ); - } + vSum = pSrcV[0][i] + pSrcV[1][i] + pSrcV[2][i] + pSrcV[3][i]; + V[i] = 128 + (vSum / 4); } - else - { - for( i = 0; i < len ; i++ ) - { - Y[i] = (pSrcY[0][i] + - pSrcY[1][i] + - pSrcY[2][i] + - pSrcY[3][i]) >> 2; - } - for( i = 0; i < uv_len ; i++ ) - { - U[i] = 128 +( (pSrcU[0][i] + - pSrcU[1][i] + - pSrcU[2][i] + - pSrcU[3][i]) >> 2); - } - for( i = 0; i < uv_len ; i++ ) - { - V[i] = 128 + ((pSrcV[0][i] + - pSrcV[1][i] + - pSrcV[2][i] + - pSrcV[3][i]) >> 2); - } - } + int offset = (b->plane_ + shift + PLANES) % PLANES; + for (int i = 0; i < len; ++i) { + b->planetableY_[offset * len + i] = Y[i]; + } + for (int i = 0; i < uv_len; ++i) { + b->planetableU_[offset * uv_len + i] = U[i] - 128; + b->planetableV_[offset * uv_len + i] = V[i] - 128; + } + b->plane_ ++; - - b->plane_ = b->plane_ & (PLANES-1); + b->plane_ = b->plane_ % stride; }