update baltan effect

This commit is contained in:
veejay
2023-10-04 02:40:08 +02:00
parent 3187b718c4
commit cb22d2194b

View File

@@ -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;
}