diff --git a/veejay-1.0/veejay-server/veejay/liblavplayvj.c b/veejay-1.0/veejay-server/veejay/liblavplayvj.c index ffc3adc7..607c2064 100644 --- a/veejay-1.0/veejay-server/veejay/liblavplayvj.c +++ b/veejay-1.0/veejay-server/veejay/liblavplayvj.c @@ -522,6 +522,15 @@ int veejay_set_frame(veejay_t * info, long framenum) return 1; } +int veejay_composite_active( veejay_t *info ) +{ + return info->settings->composite; +} + +void veejay_composite_transform_points( veejay_t *info, int *in_x, int *in_y, int points, int blob_id ) +{ + composite_transform_points( info->composite, in_x, in_y, points, blob_id); +} void veejay_auto_loop(veejay_t *info) { @@ -905,7 +914,7 @@ static int veejay_screen_update(veejay_t * info ) video_playback_setup *settings = info->settings; - if(settings->composite) + if(settings->composite==1) { if(!vj_sdl_lock( info->sdl[0] ) ) return 0; diff --git a/veejay-1.0/veejay-server/veejay/libveejay.h b/veejay-1.0/veejay-server/veejay/libveejay.h index 469caed8..cc2c4329 100644 --- a/veejay-1.0/veejay-server/veejay/libveejay.h +++ b/veejay-1.0/veejay-server/veejay/libveejay.h @@ -64,6 +64,11 @@ void veejay_busy(veejay_t *info); int veejay_increase_frame(veejay_t * info, long numframes); +void veejay_composite_transform_points( veejay_t *info, int *in_x, int *in_y, int points, int blob_id ); + +int veejay_composite_active( veejay_t *info ); + + int veejay_create_tag(veejay_t * info, int type, char *filename, int index, int palette, int channel); diff --git a/veejay-1.0/veejay-server/veejay/veejay.c b/veejay-1.0/veejay-server/veejay/veejay.c index bf53390a..c35d6028 100644 --- a/veejay-1.0/veejay-server/veejay/veejay.c +++ b/veejay-1.0/veejay-server/veejay/veejay.c @@ -695,6 +695,17 @@ static void donothing(int sig) veejay_msg(VEEJAY_MSG_INFO,"Received signal %x ",sig); veejay_handle_signal( info, sig ); } + +int vj_composite_active() +{ + return veejay_composite_active( info ); +} + +void vj_composite_transform( int *in_x, int *in_y, int points, int blob_id) +{ + veejay_composite_transform_points( info, in_x, in_y, points, blob_id ); +} + int main(int argc, char **argv) { video_playback_setup *settings; diff --git a/veejay-1.0/veejay-server/veejay/vj-composite.c b/veejay-1.0/veejay-server/veejay/vj-composite.c index 08e361e2..c6a72082 100644 --- a/veejay-1.0/veejay-server/veejay/vj-composite.c +++ b/veejay-1.0/veejay-server/veejay/vj-composite.c @@ -271,7 +271,11 @@ void composite_process( void *compiz, uint8_t *img_dat[3], VJFrame *input, int } } } - +void composite_transform_points( void *compiz, int *in_x, int *in_y, int n, int blob_id ) +{ + composite_t *c = (composite_t*) compiz; + viewport_transform_coords( c->vp1, in_x, in_y, n , blob_id); +} void composite_blit( void *compiz, uint8_t *yuyv ) { composite_t *c = (composite_t*) compiz; diff --git a/veejay-1.0/veejay-server/veejay/vj-composite.h b/veejay-1.0/veejay-server/veejay/vj-composite.h index 002620b1..6ee69e25 100644 --- a/veejay-1.0/veejay-server/veejay/vj-composite.h +++ b/veejay-1.0/veejay-server/veejay/vj-composite.h @@ -27,4 +27,5 @@ void composite_process( void *compiz, uint8_t *in[3], VJFrame *input, int vp_ void composite_blit( void *compiz,uint8_t *yuyv ); void composite_get_blit_buffer( void *compiz, uint8_t *buf[3] ); void *composite_get_vp( void *data ); +void composite_transform_points( void *compiz, int *in_x, int *in_y, int n, int blob_id ); #endif diff --git a/veejay-1.0/veejay-server/veejay/vj-viewport.c b/veejay-1.0/veejay-server/veejay/vj-viewport.c index fa7b0888..e41e9e35 100644 --- a/veejay-1.0/veejay-server/veejay/vj-viewport.c +++ b/veejay-1.0/veejay-server/veejay/vj-viewport.c @@ -118,6 +118,7 @@ typedef struct int32_t tx1,tx2,ty1,ty2; int32_t ttx1,ttx2,tty1,tty2; int mode; + int32_t *buf; } viewport_t; typedef struct @@ -1194,6 +1195,7 @@ void viewport_destroy( void *data ) if( v->map ) free( v->map ); if( v->help ) free( v->help ); if( v->homedir) free(v->homedir); + if( v->buf ) free(v->buf); free(v); } v = NULL; @@ -1331,6 +1333,8 @@ void *viewport_init(int x0, int y0, int w0, int h0, int w, int h, const char *ho // calculate initial view viewport_process( v ); + v->buf = vj_calloc( sizeof(int32_t) * 5000 ); + return (void*)v; } @@ -1561,10 +1565,19 @@ void viewport_projection_inc( void *data, int incr, int screen_width, int screen p[5] = v->y3; p[7] = v->y4; - v->x0 += incr; - v->y0 += incr; - v->w0 += incr; - v->h0 += incr; + if( incr == -1 ) + { + v->x0 ++; + v->y0 ++; + v->w0 -= 2; + v->h0 -= 2; + } else + { + v->x0 --; + v->y0 --; + v->w0 +=2; + v->h0 +=2; + } matrix_t *tmp = viewport_matrix(); matrix_t *im = viewport_invert_matrix( v->M, tmp ); @@ -1589,6 +1602,52 @@ void viewport_projection_inc( void *data, int incr, int screen_width, int screen viewport_update_perspective(v, p); } +#ifdef ANIMAX +#include +static void *sender_ = NULL; +#define GROUP 227.0.0.17 +#define PORT 1234 +#endif + +void viewport_transform_coords( void *data, int *in_x, int *in_y, int n, int blob_id ) +{ + viewport_t *v = (viewport_t*) data; + matrix_t *tmp = viewport_matrix(); + matrix_t *im = viewport_invert_matrix( v->M, tmp ); + int i,j=2; + + v->buf[0] = blob_id; + v->buf[1] = n; + + for( i = 0; i < n; i ++ ) + { + float dx1 ,dy1; + point_map( im, in_x[i], in_y[i], &dx1, &dy1); + v->buf[j+0] = dx1 / (v->w / 1000.0f); + v->buf[j+1] = dy1 / (v->h / 1000.0f); + j+=2; + } + + //@ send out coordinates + + /* + protocol: blob_id (4 bytes) | numer of points (4 bytes) | points 0..n (4 byte per point) + */ + +#ifdef ANIMAX + if(! sender_ ) + sender_ = mcast_new_sender( GROUP ); + if(mcast_send( sender_, v->buf, (n+2) * sizeof(int32_t), PORT_NUM )<=0) + { + veejay_msg(0, "Cannot send contour over mcast %s:%d", GROUP,PORT_NUM ); + mcast_close_sender( sender_ ); + sender_ = NULL; + } +#endif + free(im); + free(tmp); +} + void viewport_external_mouse( void *data, uint8_t *img[3], int sx, int sy, int button, int frontback, int screen_width, int screen_height ) { viewport_t *v = (viewport_t*) data; @@ -1712,6 +1771,9 @@ void viewport_external_mouse( void *data, uint8_t *img[3], int sx, int sy, int b point_map( im, v->x0, v->y0 + v->h0, &dx3, &dy3 ); point_map( im, v->x0 + v->w0, v->y0 + v->h0, &dx4, &dy4 ); + veejay_msg(2, "Rect x0=%d, y0=%d, w0=%d, h0=%d", + v->x0,v->y0, v->w0, v->h0 ); + v->x1 = dx1 / (screen_width / 100.0f); v->y1 = dy1 / (screen_height / 100.0f); v->x2 = dx2 / (screen_width / 100.0f); @@ -1768,7 +1830,9 @@ void viewport_external_mouse( void *data, uint8_t *img[3], int sx, int sy, int b point_map( im, v->x0 + v->w0, v->y0, &dx2, &dy2 ); point_map( im, v->x0, v->y0 + v->h0, &dx3, &dy3 ); point_map( im, v->x0 + v->w0, v->y0 + v->h0, &dx4, &dy4 ); - + veejay_msg(2, "Rect x0=%d, y0=%d, w0=%d, h0=%d", + v->x0,v->y0, v->w0, v->h0 ); + v->x1 = dx1 / (screen_width / 100.0f); v->y1 = dy1 / (screen_height / 100.0f); v->x2 = dx2 / (screen_width / 100.0f); diff --git a/veejay-1.0/veejay-server/veejay/vj-viewport.h b/veejay-1.0/veejay-server/veejay/vj-viewport.h index c7e86df4..79f97072 100644 --- a/veejay-1.0/veejay-server/veejay/vj-viewport.h +++ b/veejay-1.0/veejay-server/veejay/vj-viewport.h @@ -42,4 +42,5 @@ void viewport_produce_full_img_yuyv( void *vdata, uint8_t *img[3], uint8_t *out_ void viewport_draw_interface_color( void *vdata, uint8_t *img[3] ); void viewport_set_marker( void *vdata, int status ); void viewport_projection_inc( void *data, int incr , int w, int h ); +void viewport_transform_coords( void *data, int *in_x, int *in_y, int n, int blob_id ); #endif