From c6868cd8b896cf684d92f3d49e25241554447171 Mon Sep 17 00:00:00 2001 From: Niels Elburg Date: Tue, 24 Oct 2006 23:02:59 +0000 Subject: [PATCH] gveejayreloaded bugfix set, fixed unicast streaming git-svn-id: svn://code.dyne.org/veejay/trunk@678 eb8d1916-c9e9-0310-b8de-cf0c9472ead5 --- veejay-current/gveejay-reloaded/multitrack.c | 159 +++-- veejay-current/gveejay-reloaded/sequence.c | 56 +- .../gveejay-reloaded/tracksources.c | 49 +- veejay-current/gveejay-reloaded/vj-api.c | 25 +- veejay-current/libel/pixbuf.c | 20 +- veejay-current/libstream/vj-net.c | 86 ++- veejay-current/libstream/vj-tag.c | 10 +- veejay-current/libvjnet/vj-client.c | 3 +- veejay-current/libvjnet/vj-server.c | 2 +- veejay-current/share/gveejay.reloaded.glade | 605 +++++++++--------- veejay-current/veejay/vj-event.c | 2 +- veejay-current/veejay/vj-perform.c | 4 +- 12 files changed, 596 insertions(+), 425 deletions(-) diff --git a/veejay-current/gveejay-reloaded/multitrack.c b/veejay-current/gveejay-reloaded/multitrack.c index 84da3363..d374d177 100644 --- a/veejay-current/gveejay-reloaded/multitrack.c +++ b/veejay-current/gveejay-reloaded/multitrack.c @@ -44,6 +44,9 @@ G_LOCK_DEFINE(mt_lock); +extern int _Xdebug; + + #define __MAX_TRACKS 64 typedef struct { @@ -131,6 +134,8 @@ static GdkPixbuf *logo_img_ = NULL; static float logo_step_ = 0.1; static float logo_value_ = 1.0; +static void update_pos( mt_priv_t *p, gint total, gint current ); + static void gtk_image_set_from_pixbuf__( GtkImage *w, GdkPixbuf *p, const char *f, int l ) { veejay_msg(0, "%s called by %s: %d" , __FUNCTION__, f, l ); @@ -155,6 +160,9 @@ static void gtk_widget_set_sensitive__( GtkWidget *w, gboolean state, const char #define gtk_widget_set_sensitive_( w,p ) gtk_widget_set_sensitive(w,p) #endif +static int restore__[32]; + + void multitrack_preview_master(void *data, int status) { G_LOCK( mt_lock); @@ -169,6 +177,8 @@ void multitrack_preview_master(void *data, int status) } last->preview = status; + restore__[LAST_TRACK] = status; + int n = find_track( mt, last->hostname, last->port_num ); if ( n >= 0 ) { @@ -229,7 +239,11 @@ void multitrack_sync_simple_cmd(void *data, int vims_id, int value) G_UNLOCK(mt_lock); } - +int sequence_get_track_id(void *priv) +{ + mt_priv_t *p = (mt_priv_t*) priv; + return p->num; +} int * sequence_get_track_status(void *priv) { @@ -237,7 +251,7 @@ int * sequence_get_track_status(void *priv) multitracker_t *mt = (multitracker_t*) p->backlink; all_priv_t *a = (all_priv_t*) mt->data; gint i; - int *result = (int*) malloc(sizeof(int) * MAX_TRACKS ); + int *result = (int*) vj_calloc(sizeof(int) * MAX_TRACKS ); for( i = 0;i < MAX_TRACKS ; i ++ ) { @@ -256,6 +270,8 @@ int * sequence_get_track_status(void *priv) int port_num = 0; char *str = p->tracks[j]; int tag_id = 0; + veejay_msg(0, "%s\t'%s' : '%s' :%d", + __FUNCTION__,str,q->hostname,q->port_num ); if(sscanf(str, "%s %d %d", hostname, &port_num, &tag_id )) { if(strncasecmp( hostname, q->hostname,strlen(hostname)) == 0 && port_num == @@ -427,19 +443,12 @@ static void add_buttons2( mt_priv_t *p, sequence_view_t *seqv , GtkWidget *w) // gtk_widget_set_sensitive_( w, FALSE ); } -static void update_timeline( mt_priv_t *p, gint total, gint current ) +static void update_pos( mt_priv_t *p, gint total, gint current ) { - timeline_set_length( GTK_WIDGET(p->view->timeline_), - (gdouble) total, - (gdouble) current ); -//@ READ FPS FROM EDL !!!! FIXME - char *tot = format_time( total,25.0f ); - gtk_label_set_text( p->view->labels_[1], tot ); - g_free(tot); -} -static void update_pos( mt_priv_t *p, gint current ) -{ - timeline_set_pos( p->view->timeline_, current ); +// timeline_set_pos( p->view->timeline_, current ); + gtk_adjustment_set_value( + GTK_ADJUSTMENT(GTK_RANGE(p->view->timeline_)->adjustment), 1.0 / (gdouble) total * current ); + char *now = format_time( current ,25.0f); gtk_label_set_text( p->view->labels_[0], now ); g_free(now); @@ -531,10 +540,8 @@ static void update_widgets(int *status, mt_priv_t *p, int pm) if( pm == MODE_SAMPLE || pm == MODE_PLAIN ) { - // if( h[TOTAL_FRAMES] != status[TOTAL_FRAMES] ) - // update_timeline( p, status[TOTAL_FRAMES], status[FRAME_NUM] ); if( h[FRAME_NUM] != status[FRAME_NUM] ) - update_pos( p, status[FRAME_NUM] ); + update_pos( p, status[TOTAL_FRAMES],status[FRAME_NUM] ); if( h[SAMPLE_SPEED] != status[SAMPLE_SPEED] ) update_speed( p, status[SAMPLE_SPEED] ); } @@ -550,16 +557,22 @@ static void update_widgets(int *status, mt_priv_t *p, int pm) static gboolean update_sequence_widgets( gpointer data ) { mt_priv_t *p = (mt_priv_t*) data; - char status[100]; - int array[20]; + char status[108]; + int array[101]; + + if( !p->active ) + return TRUE; + p->status_lock = 1; veejay_get_status( p->sequence, status ); int n = status_to_arr( status, array ); if( n<= 0 ) + { + p->status_lock = 0; return TRUE; + } #ifdef STRICT_CHECKING assert( n == 18 ); #endif - p->status_lock = 1; int pm = array[PLAY_MODE]; int i; @@ -660,7 +673,7 @@ static int mt_new_connection_dialog(multitracker_t *mt, char *hostname,int len, { GtkWidget *dialog = gtk_dialog_new_with_buttons( "New Track", - GTK_WINDOW( mt->main_window ), + GTK_WINDOW( mt->main_box ), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, @@ -737,6 +750,9 @@ void *multitrack_new( multitracker_t *mt = NULL; all_priv_t *pt = NULL; + _Xdebug = 1; + + logo_img_ = load_logo_image(); mt = (multitracker_t*) malloc(sizeof(multitracker_t)); @@ -759,8 +775,15 @@ void *multitrack_new( #endif mt->scroll = gtk_scrolled_window_new(NULL,NULL); + + GtkRequisition req; + gtk_widget_size_request( mt->main_window, &req ); + veejay_msg(0, "%dx%d", req.width,req.height); - gtk_widget_set_size_request(mt->scroll,50 + max_w*MAX_TRACKS,20 +max_h); + if(get_skin() == 0 ) + gtk_widget_set_size_request(mt->scroll,max_w/2 + 30, req.height); + else + gtk_widget_set_size_request(mt->scroll, max_w * MAX_TRACKS / 2 , max_h/2 ); gtk_container_set_border_width(GTK_CONTAINER(mt->scroll),2); gtk_scrolled_window_set_policy( GTK_SCROLLED_WINDOW(mt->scroll),GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS ); GtkWidget *table = gtk_table_new( 1, MAX_TRACKS, FALSE ); @@ -777,7 +800,11 @@ void *multitrack_new( p->backlink = (void*) mt; p->tracks[c] = NULL; pt->pt[c] = p; - gtk_table_attach_defaults( table, p->view->event_box, c, c+1, 0, 1 ); +// gtk_table_attach_defaults( table, p->view->event_box, c, c+1, 0, 1 ); + gtk_table_attach_defaults( table, p->view->event_box, 0, 1, c, c+1 ); + + restore__[c] = 0; + } max_w = 352; @@ -811,25 +838,44 @@ void *multitrack_new( return (void*) mt; } + void multitrack_open(void *data) { multitracker_t *mt = (multitracker_t*) data; + all_priv_t *a = (all_priv_t*)mt->data; + G_LOCK(mt_lock); mt->sensitive = 1; + int i; + for( i = 0; i < MAX_TRACKS ; i ++ ) + { + mt_priv_t *p = a->pt[i]; + p->preview = restore__[i]; + } + G_UNLOCK(mt_lock); } void multitrack_close( void *data ) { multitracker_t *mt = (multitracker_t*) data; + all_priv_t *a = (all_priv_t*)mt->data; + G_LOCK(mt_lock); mt->sensitive = 0; + int i; + for( i = 0; i < MAX_TRACKS ; i ++ ) + { + mt_priv_t *p = a->pt[i]; + restore__[i] = p->preview; + } G_UNLOCK(mt_lock); } void multitrack_quit( void *data ) { multitracker_t *mt = (multitracker_t*) data; + G_LOCK(mt_lock); mt->quit = 1; G_UNLOCK(mt_lock); @@ -899,10 +945,9 @@ int multitrack_add_track( void *data ) G_UNLOCK( mt_lock ); return 0; } - pt->pt[track]->timeout = gtk_timeout_add( 300, update_sequence_widgets, (gpointer*) pt->pt[track] ); - + veejay_msg(0, "Configure sequence %d x %d, init with %d x %d ",preview_width_,preview_height_, + mpreview_width_, mpreview_height_); veejay_configure_sequence( seq, preview_width_, preview_height_ ); - pt->pt[track]->sequence = seq; pt->pt[track]->active = 1; pt->pt[track]->used = 1; @@ -911,6 +956,9 @@ int multitrack_add_track( void *data ) // gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( p->view->toggle ), 1 ); status_print( mt, "Track %d: Connection established with '%s' port %d\n", track, hostname, port_num ); + pt->pt[track]->timeout = + gtk_timeout_add( 300, update_sequence_widgets, (gpointer*) pt->pt[track] ); + gtk_widget_set_sensitive_( GTK_WIDGET(p->view->panel),TRUE); res = 1; } @@ -1120,7 +1168,7 @@ void multitrack_bind_track( void *data, int id, int bind_this ) // connect q to p veejay_sequence_send( p->sequence, VIMS_STREAM_NEW_UNICAST, "%d %s", q->port_num,q->hostname ); - + G_UNLOCK(mt_lock); status_print(mt, "Veejay '%s:%d' retrieving frames from Veejay '%s:%d", @@ -1183,7 +1231,9 @@ static gboolean seqv_mouse_press_event ( GtkWidget *w, GdkEventButton *event, gp { mt_priv_t *p = (mt_priv_t*) user_data; multitracker_t *mt = (multitracker_t*) p->backlink; - if( p == NULL ) + all_priv_t *a = (all_priv_t*) mt->data; + + if( p == NULL) { status_print((multitracker_t*)p->backlink,"Track %d is empty\n", p->num); return FALSE; @@ -1194,16 +1244,32 @@ static gboolean seqv_mouse_press_event ( GtkWidget *w, GdkEventButton *event, gp "Already connecting to Track %d", mt->selected ); return FALSE; } - + if( !p->active || !p->hostname || !p->port_num ) + { + status_print((multitracker_t*)p->backlink,"Track %d is not active\n", p->num); + return FALSE; + } // mt->selected = p->num; if(event->type == GDK_2BUTTON_PRESS) { mt->selected = p->num; +G_LOCK(mt_lock); + int tmp[MAX_TRACKS],i; + for( i = 0; i < MAX_TRACKS ; i ++ ) + { + mt_priv_t *p = a->pt[i]; + tmp[i] = p->preview; + p->preview = 0; + } +G_UNLOCK(mt_lock); + + gui_cb( 0, strdup(p->hostname), p->port_num ); G_LOCK(mt_lock); - multitrack_set_current( (void*) mt, p->hostname, p->port_num ,mpreview_width_,mpreview_height_ ); + + multitrack_set_current( (void*) mt, p->hostname, p->port_num ,mpreview_width_,mpreview_height_ ); /* all_priv_t *a = (all_priv_t*) mt->data; mt_priv_t *last_track = a->pt[LAST_TRACK]; @@ -1212,7 +1278,11 @@ G_LOCK(mt_lock); last_track->sequence = p->sequence; assert( last_track->sequence != NULL ); veejay_configure_sequence( last_track->sequence, 352, 288 );*/ - + for( i = 0; i < MAX_TRACKS ; i ++ ) + { + mt_priv_t *p = a->pt[i]; + p->preview = tmp[i]; + } G_UNLOCK(mt_lock); } @@ -1227,8 +1297,9 @@ G_UNLOCK(mt_lock); static void sequence_preview_cb(GtkWidget *widget, gpointer user_data) { mt_priv_t *p = (mt_priv_t*) user_data; - veejay_toggle_image_loader( p->sequence, - gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget))); + gint status = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)); + veejay_toggle_image_loader( p->sequence, status ); + p->preview = status; } static gint seqv_image_expose( GtkWidget *w, gpointer user_data ) @@ -1242,8 +1313,10 @@ static void sequence_set_current_frame(GtkWidget *w, gpointer user_data) mt_priv_t *p = (mt_priv_t*) user_data; if(!p->status_lock) { - gdouble pos = timeline_get_pos( TIMELINE_SELECTION(w) ); - veejay_sequence_send(p->sequence, VIMS_VIDEO_SET_FRAME, "%d" , (gint) pos); + // gdouble pos = timeline_get_pos( TIMELINE_SELECTION(w) ); + gdouble pos = GTK_ADJUSTMENT(GTK_RANGE(w)->adjustment)->value; + gint frame = pos * p->status_cache[TOTAL_FRAMES]; + veejay_sequence_send(p->sequence, VIMS_VIDEO_SET_FRAME, "%d" , frame); } } @@ -1323,14 +1396,16 @@ static sequence_view_t *new_sequence_view( mt_priv_t *p,gint w, gint h, gint las gtk_widget_show(vvbox); GtkWidget *box = gtk_vbox_new(FALSE,0); - seqv->timeline_ = timeline_new(); - gtk_widget_set_size_request( seqv->panel, 180 ,14); + // seqv->timeline_ = timeline_new(); + seqv->timeline_ = gtk_hscale_new_with_range( 0.0,1.0,0.1 ); + gtk_scale_set_draw_value( seqv->timeline_, FALSE ); + gtk_widget_set_size_request( seqv->panel,preview_width_ ,14); gtk_widget_show( seqv->panel ); gtk_box_pack_start( GTK_BOX( box ), seqv->timeline_, FALSE,FALSE, 0 ); //gtk_container_add( GTK_CONTAINER(seqv->panel), box ); gtk_box_pack_start( GTK_BOX( vvbox ), box , FALSE,FALSE,0); gtk_widget_show(seqv->timeline_); - g_signal_connect( seqv->timeline_, "pos_changed", + g_signal_connect( seqv->timeline_, "value_changed", (GCallback) sequence_set_current_frame, (gpointer*) p ); /* tree */ @@ -1456,8 +1531,9 @@ void *mt_preview( gpointer user_data ) int ref = find_sequence( a ); - if( mt->sensitive && lt->preview) - for( i = 0; i < MAX_TRACKS ; i ++ ) + if( mt->sensitive) + { + for( i = 0; i < MAX_TRACKS ; i ++ ) { mt_priv_t *p = a->pt[i]; if( p->active && ref != i && p->preview) @@ -1469,7 +1545,7 @@ void *mt_preview( gpointer user_data ) cache[i] = 0; } } - + } //@ scale image if( ref >= 0 && lt->preview && cache[LAST_TRACK] ) @@ -1501,7 +1577,6 @@ void *mt_preview( gpointer user_data ) { GtkImage *image = GTK_IMAGE( p->view->area ); gtk_image_set_from_pixbuf_( image, cache[i] ); - // gtk_widget_queue_draw( image ); } } diff --git a/veejay-current/gveejay-reloaded/sequence.c b/veejay-current/gveejay-reloaded/sequence.c index 2a795cbe..4eba2a8a 100644 --- a/veejay-current/gveejay-reloaded/sequence.c +++ b/veejay-current/gveejay-reloaded/sequence.c @@ -76,7 +76,7 @@ int veejay_sequence_send( void *data , int vims_id, const char format[], ... ) { veejay_sequence_t *v = (veejay_sequence_t*) data; - if(!v) return 0; + if(!v || !v->active) return 0; g_mutex_lock( v->mutex ); gint ret = 0; @@ -105,7 +105,7 @@ int veejay_sequence_send( void *data , int vims_id, const char format[], ... ) gchar *veejay_sequence_get_track_list( void *data, int slen, int *bytes_written ) { veejay_sequence_t *v = (veejay_sequence_t*) data; - if(!v) return NULL; + if(!v || !v->active) return NULL; g_mutex_lock( v->mutex ); char message[10]; @@ -230,6 +230,9 @@ static int veejay_process_status( veejay_sequence_t *v ) static int veejay_get_image_data(veejay_sequence_t *v ) { + if(!v->active ) + return 0; + gint res = veejay_ipc_send( v, VIMS_RGB24_IMAGE, "%d %d", v->width,v->height ); if( res <= 0 ) return 0; @@ -244,6 +247,8 @@ static int veejay_get_image_data(veejay_sequence_t *v ) void veejay_get_status( void *data, guchar *dst ) { veejay_sequence_t *v = (veejay_sequence_t*) data; + if(!v->active) + return; bzero(dst,100); g_mutex_lock( v->serialize ); memcpy( dst, v->serialized, 100); @@ -253,7 +258,7 @@ void veejay_get_status( void *data, guchar *dst ) GdkPixbuf *veejay_get_image( void *data, gint *error) { veejay_sequence_t *v = (veejay_sequence_t*) data; - if(!v) return NULL; + if(!v || !v->active) return NULL; gint ret = 0; g_mutex_lock( v->mutex ); @@ -318,7 +323,6 @@ void veejay_configure_sequence( void *data, gint w, gint h ) v->width = w; v->height = h; // } - g_mutex_unlock( v->mutex ); } @@ -328,7 +332,9 @@ static int veejay_process_data( veejay_sequence_t *v ) gint ret = 0; g_mutex_lock( v->mutex ); - if( v->width <= 0 || v->height <= 0 || v->preview == 0) +// veejay_msg(0, "%s: %p , %d x %d (%d)", __FUNCTION__,v, v->width,v->height,v->preview); + + if( v->width <= 0 || v->height <= 0 || v->preview == 0 || v->active == 0) { g_mutex_unlock( v->mutex ); return 1; @@ -358,33 +364,37 @@ void *veejay_sequence_thread(gpointer data) { veejay_sequence_t *v = (veejay_sequence_t*) data; if(!v) return; - + unsigned long time_now = 0; unsigned long tn = vj_get_timer() + v->preview_delay; for ( ;; ) { - unsigned long time_now = vj_get_timer(); + time_now = vj_get_timer(); if( v->abort ) + { + veejay_msg(0, "Thread aborted"); return NULL; - + } if( vj_client_poll( v->fd, V_STATUS )) { if( veejay_process_status( v ) == 0 ) { - //printf("Abort, status error\n"); - // return NULL; + veejay_msg(0, "Error reading status from track"); + v->active = 0; + return NULL; } - if( time_now > tn ) + } + if( time_now > tn ) + { + if ( veejay_process_data( v ) == 0 ) { - if ( veejay_process_data( v ) == 0 ) - { - printf("Abort, data error\n"); - return NULL; - } - tn = time_now + v->preview_delay; + veejay_msg(0, "Abort, data error"); + v->active = 0; + return NULL; } - } - g_usleep(20000); + tn = time_now + v->preview_delay; + } + g_usleep(10000); } return NULL; @@ -393,7 +403,7 @@ void *veejay_sequence_thread(gpointer data) void veejay_abort_sequence( void *data ) { veejay_sequence_t *v = (veejay_sequence_t*) data; - if(!v) return; + if(!v || !v->active) return; g_mutex_lock(v->mutex); v->abort = 1; @@ -406,6 +416,8 @@ void veejay_toggle_image_loader( void *data, gint state ) { veejay_sequence_t *v = (veejay_sequence_t*) data; if(!v) return; + if(!v->active) + return; g_mutex_lock(v->mutex); v->preview = state; g_mutex_unlock(v->mutex); @@ -459,6 +471,7 @@ void *veejay_sequence_init(int port, char *hostname, gint max_width, gint max_he v->preview_delay = 40000; v->mutex = g_mutex_new(); v->serialize = g_mutex_new(); + v->active = 1; v->cond = g_cond_new(); v->thread = g_thread_create( (GThreadFunc) veejay_sequence_thread, @@ -471,7 +484,8 @@ void *veejay_sequence_init(int port, char *hostname, gint max_width, gint max_he if(v) free(v); return NULL; } - + veejay_msg(2, "New connection with %s, %d (max %d x %d), lock %p", + hostname,port,max_width,max_height, v->serialize ); return v; } diff --git a/veejay-current/gveejay-reloaded/tracksources.c b/veejay-current/gveejay-reloaded/tracksources.c index 089b9bd7..a6a01216 100644 --- a/veejay-current/gveejay-reloaded/tracksources.c +++ b/veejay-current/gveejay-reloaded/tracksources.c @@ -79,34 +79,58 @@ void update_track_view( int n_tracks, GtkWidget *widget, void *user_data ) GtkTreeView *view = GTK_TREE_VIEW(widget); GtkTreeModel *model = gtk_tree_view_get_model( view ); GtkListStore *store = GTK_LIST_STORE( model ); - g_object_ref( model ); - gtk_tree_view_set_model( GTK_TREE_VIEW( view ) , NULL ); - GtkTreeIter *iter; - gboolean valid; - - int *tmp = sequence_get_track_status( user_data ); - if(!tmp) + + gtk_list_store_clear( GTK_LIST_STORE( model ) ); + + if(!widget) + { + veejay_msg(0, "%s: %d tracks, widget invalid!", __FUNCTION__, + n_tracks ); return; - - int index = 0; + } + gboolean valid; + int i; + int *tmp = sequence_get_track_status( user_data ); + +/* int index = 0; valid = gtk_tree_model_get_iter_first( GTK_TREE_MODEL( store ), &iter ); while(valid) { gtk_list_store_set( store, &iter, 1, tmp[index], -1 ); index ++; valid = gtk_tree_model_iter_next( GTK_TREE_MODEL(store), &iter ); + + }*/ + for( i = 0; i < n_tracks; i ++ ) + { + int id = sequence_get_track_id( user_data ); + if(id != i) + { + char name[12]; + sprintf(name,"Track %d", i); + gtk_list_store_append( store, &iter ); + gtk_list_store_set( + store, &iter, + 0, name, + 1, tmp[i], + -1 ); + } } + + free(tmp); - gtk_tree_view_set_model( GTK_TREE_VIEW( view ), model ); - g_object_unref( model ); + gtk_tree_view_set_model( GTK_TREE_VIEW( widget ), model ); +// g_object_unref( model ); } GtkWidget *get_track_tree( void *data) { track_view_t *t = (track_view_t*) data; + veejay_msg(0 , "%s: get track tree %d, tree:%p",__FUNCTION__, + t->track_id,t->view ); return t->view; } @@ -174,6 +198,9 @@ void *create_track_view(int track_id, int ref_tracks, void *user_data) my_view->track_id = track_id; my_view->view = view; + g_assert( GTK_IS_TREE_VIEW( view ) ); + veejay_msg(0, "CREATED TRACK %d TREE %p", track_id, view ); + model = GTK_TREE_MODEL( store ); gtk_tree_view_set_model ( GTK_TREE_VIEW( view ), model ); g_signal_connect( wrenderer, "toggled", diff --git a/veejay-current/gveejay-reloaded/vj-api.c b/veejay-current/gveejay-reloaded/vj-api.c index 39061523..ee408ed6 100644 --- a/veejay-current/gveejay-reloaded/vj-api.c +++ b/veejay-current/gveejay-reloaded/vj-api.c @@ -251,7 +251,7 @@ static int NUM_SAMPLES_PER_ROW = 6; static vims_t vj_event_list[VIMS_MAX]; static vims_keys_t vims_keys_list[VIMS_MAX]; - +static int preview_change_ = 0; static int vims_verbosity = 0; #define livido_port_t vevo_port_t @@ -1098,6 +1098,10 @@ int _effect_get_mix(int effect_id) return 0; } +int get_skin() +{ + return skin__; +} int _effect_get_rgb(int effect_id) @@ -1819,6 +1823,7 @@ static void free_slot( sample_slot_t *slot ) del_chain( slot->ec ); free(slot); } + slot = NULL; } /* Allocate some memory and create a temporary slot */ @@ -2887,6 +2892,8 @@ static void update_current_slot(int pm) info->uc.reload_hint[HINT_ENTRY] == 1 ) { info->uc.selected_chain_entry = info->status_tokens[CURRENT_ENTRY]; + if(info->uc.selected_chain_entry < 0 || info->uc.selected_chain_entry > 19 ) + info->uc.selected_chain_entry = 0; info->uc.reload_hint[HINT_ENTRY] = 1; load_parameter_info(); info->uc.reload_hint[HINT_KF] = 1; @@ -3291,6 +3298,8 @@ static void process_reload_hints(void) } if( info->uc.reload_hint[HINT_SLIST] == 1 ) { + veejay_msg(0, "reload sample list"); + //load_samplelist_info(TRUE); load_samplelist_info(FALSE); info->uc.expected_slots = info->status_tokens[TOTAL_SLOTS]; } @@ -4522,8 +4531,10 @@ static void load_samplelist_info(gboolean with_reset_slotselection) bzero( source, 255 ); strncpy( line, fxtext + offset, len ); - int values[4]; - + int values[10]; + + memset(values,0, 10 * sizeof(int)); + sscanf( line, "%05d%02d%03d%03d%03d%03d%03d%03d", &values[0], &values[1], &values[2], &values[3], &values[4], &values[5], @@ -4550,7 +4561,7 @@ static void load_samplelist_info(gboolean with_reset_slotselection) int bank_page = 0; int poke_slot = 0; int full = verify_bank_capacity( &bank_page , &poke_slot, values[0], 1); - if(bank_page >= 0 && full == 0 ) + if(bank_page >= 0) { if( info->sample_banks[bank_page]->slot[poke_slot] <= 0 ) { @@ -6729,6 +6740,7 @@ void vj_gui_disable() info->sensitive = 0; enable_widget ("vs_box" ); + preview_change_ = is_button_toggled( "previewtoggle"); set_toggle_button( "previewtoggle", 0 ); } @@ -6753,6 +6765,7 @@ void vj_gui_enable() info->sensitive = 1; disable_widget( "vs_box" ); + set_toggle_button( "previewtoggle", preview_change_ ); } /* @@ -7015,8 +7028,12 @@ void free_samplebank(void) // if(gslot->frame ) g_object_unref( gslot->frame ); if(gslot) free(gslot); + info->sample_banks[i]->slot[j] = NULL; + info->sample_banks[i]->gui_slot[j] = NULL; } free(info->sample_banks[i]); + info->sample_banks[i] = NULL; + } } memset( info->sample_banks, 0, sizeof(sample_bank_t*) * NUM_BANKS ); diff --git a/veejay-current/libel/pixbuf.c b/veejay-current/libel/pixbuf.c index 8208238b..0f3f19d6 100644 --- a/veejay-current/libel/pixbuf.c +++ b/veejay-current/libel/pixbuf.c @@ -29,6 +29,7 @@ #include #include #include +#include typedef struct { char *filename; @@ -372,6 +373,21 @@ int vj_picture_save( void *picture, uint8_t **frame, int w, int h , int fmt ) return ret; } +static inline int get_shift_size(int fmt) +{ + switch(fmt) + { + case FMT_420: + case FMT_420F: + return 1; + case FMT_422: + case FMT_422F: + return 1; + default: + break; + } + return 0; +} veejay_image_t *vj_picture_save_to_memory( uint8_t **frame, int w, int h , int out_w, int out_h, int fmt ) { @@ -389,8 +405,8 @@ veejay_image_t *vj_picture_save_to_memory( uint8_t **frame, int w, int h , int o pict1.data[1] = frame[1]; pict1.data[2] = frame[2]; pict1.linesize[0] = w; - pict1.linesize[1] = w >> get_ffmpeg_shift_size(fmt); - pict1.linesize[2] = w >> get_ffmpeg_shift_size(fmt); + pict1.linesize[1] = w >> get_shift_size(fmt); + pict1.linesize[2] = w >> get_shift_size(fmt); image->image = (void*)gdk_pixbuf_new( GDK_COLORSPACE_RGB, FALSE, 8, w, h ); if(!image->image) diff --git a/veejay-current/libstream/vj-net.c b/veejay-current/libstream/vj-net.c index 1ee51171..70e37310 100644 --- a/veejay-current/libstream/vj-net.c +++ b/veejay-current/libstream/vj-net.c @@ -30,15 +30,16 @@ typedef struct { - pthread_mutex_t mutex; - pthread_t thread; +// pthread_mutex_t mutex; +// pthread_t thread; vj_client *remote; int state; int error; } threaded_t; - +/* #define STOP 0 #define PLAY 1 + static void lock_(threaded_t *t, const char *f, int line) { // veejay_msg(0,"lock thread by %s, line %d",f,line); @@ -49,11 +50,11 @@ static void unlock_(threaded_t *t, const char *f, int line) { // veejay_msg(0,"unlock thread by %s, line %d",f,line); pthread_mutex_unlock( &(t->mutex )); -} +}*/ #define lock( t ) lock_( t, __FUNCTION__, __LINE__ ) #define unlock( t ) unlock_( t, __FUNCTION__ , __LINE__ ) - +/* void *reader_thread(void *data) { vj_tag *tag = (vj_tag*) data; @@ -81,7 +82,6 @@ void *reader_thread(void *data) vj_client_flush ( v, V_STATUS); } ret = vj_client_send( v, V_CMD, buf ); - if( ret <= 0 ) error = 1; } @@ -95,19 +95,23 @@ void *reader_thread(void *data) if( error ) { + veejay_msg(VEEJAY_MSG_ERROR, + "Error retrieving frame from remote veejay,"); t->error = THREAD_STOP; - t->state = 0; + t->state = STOP; } unlock(t); + g_sleep( 25000 ); } -} + return NULL; +}*/ void *net_threader( ) { - threaded_t *t = (threaded_t*) vj_malloc(sizeof(threaded_t)); - pthread_mutex_init( &(t->mutex), NULL ); + threaded_t *t = (threaded_t*) vj_calloc(sizeof(threaded_t)); +// pthread_mutex_init( &(t->mutex), NULL ); return (void*) t; } @@ -119,22 +123,22 @@ void net_thread_remote( void *p, void *r ) void net_thread_exit(vj_tag *tag) { - threaded_t *t = tag->private; +/* threaded_t *t = tag->private; lock(t); - +*/ if(tag->socket_frame) free(tag->socket_frame); - unlock(t); +/* unlock(t); pthread_mutex_destroy( &(t->mutex)); - +*/ } int net_thread_get_frame( vj_tag *tag, uint8_t *buffer[3], vj_client *v ) { - threaded_t *t = (threaded_t*) tag->private; +/* threaded_t *t = (threaded_t*) tag->private; lock(t); if( t->state == 0 || t->error ) { @@ -147,7 +151,28 @@ int net_thread_get_frame( vj_tag *tag, uint8_t *buffer[3], vj_client *v ) veejay_memcpy( buffer[2], tag->socket_frame + v->planes[0] + v->planes[1] , v->planes[2] ); unlock(t); - return 1; + return 1;*/ + char buf[16]; + sprintf(buf, "%03d:;", VIMS_GET_FRAME); + + + if( vj_client_poll(v, V_STATUS ) ) + { + vj_client_flush ( v, V_STATUS); + } + int ret = vj_client_send( v, V_CMD, buf ); + if( ret <= 0 ) + return 0; + + ret = vj_client_read_i ( v, tag->socket_frame ); + if( ret <= 0 ) + return 0; + + veejay_memcpy( buffer[0], tag->socket_frame, v->planes[0] ); + veejay_memcpy( buffer[1], tag->socket_frame + v->planes[0], v->planes[1] ); + veejay_memcpy( buffer[2], tag->socket_frame + v->planes[0] + v->planes[1] , v->planes[2] ); + + return ret; } int net_thread_start(vj_client *v, vj_tag *tag) @@ -163,13 +188,14 @@ int net_thread_start(vj_client *v, vj_tag *tag) { veejay_msg(VEEJAY_MSG_ERROR, "Unable to establish connection with %s on port %d", tag->source_name, tag->video_channel ); + return 0; } - threaded_t *t = (threaded_t*)tag->private; +/* threaded_t *t = (threaded_t*)tag->private; t->error = 0; t->state = 1; - +*/ if( tag->source_type == VJ_TAG_TYPE_MCAST ) { char start_mcast[6]; @@ -187,16 +213,16 @@ int net_thread_start(vj_client *v, vj_tag *tag) return 0; } } - int p_err = pthread_create( &(t->thread), NULL, &reader_thread, (void*) tag ); +/* int p_err = pthread_create( &(t->thread), NULL, &reader_thread, (void*) tag ); if( p_err ==0) - { - veejay_msg(VEEJAY_MSG_INFO, "Created new %s stream", - tag->source_type == VJ_TAG_TYPE_MCAST ? - "multicast" : "unicast"); - return 1; - } - return 0; + {*/ + veejay_msg(VEEJAY_MSG_INFO, "Created new %s stream", + tag->source_type == VJ_TAG_TYPE_MCAST ? + "multicast" : "unicast"); + return 1; +// } +// return 0; } void net_thread_stop(vj_client *v , vj_tag *tag) @@ -204,7 +230,7 @@ void net_thread_stop(vj_client *v , vj_tag *tag) char mcast_stop[6]; threaded_t *t = (threaded_t*)tag->private; int ret = 0; - lock(t); +// lock(t); if(tag->source_type == VJ_TAG_TYPE_MCAST) { @@ -217,10 +243,10 @@ void net_thread_stop(vj_client *v , vj_tag *tag) ret = vj_client_send( v, V_CMD, mcast_stop); } - t->state = STOP; +// t->state = STOP; - unlock(t); - pthread_join( &(t->thread), (void*) tag ); +// unlock(t); +// pthread_join( &(t->thread), (void*) tag ); vj_client_close( v ); diff --git a/veejay-current/libstream/vj-tag.c b/veejay-current/libstream/vj-tag.c index 07b93051..34e833ff 100644 --- a/veejay-current/libstream/vj-tag.c +++ b/veejay-current/libstream/vj-tag.c @@ -267,8 +267,11 @@ int _vj_tag_new_net(vj_tag *tag, int stream_nr, int w, int h,int f, char *host, // if(!vj_client_test(host,port)) // return 0; + + v->planes[0] = w * h; - if( p == VIDEO_PALETTE_YUV420P ) + int fmt= vj_tag_input->pix_fmt; + if( fmt == FMT_420 || fmt == FMT_420F ) { v->planes[1] = v->planes[0] / 4; v->planes[2] = v->planes[0] / 4; @@ -278,7 +281,6 @@ int _vj_tag_new_net(vj_tag *tag, int stream_nr, int w, int h,int f, char *host, v->planes[1] = v->planes[0] / 2; v->planes[2] = v->planes[0] / 2; } - if( tag->socket_ready == 0 ) { tag->socket_frame = (uint8_t*) vj_malloc(sizeof(uint8_t) * v->planes[0] * 4); @@ -292,8 +294,6 @@ int _vj_tag_new_net(vj_tag *tag, int stream_nr, int w, int h,int f, char *host, } net_thread_remote( tag->private, v ); - - return 1; } @@ -2253,8 +2253,6 @@ int vj_tag_sprint_status( int tag_id,int cache, int pfps,int frame, int mode,int tag->selected_entry, ts, cache); - - return 0; } diff --git a/veejay-current/libvjnet/vj-client.c b/veejay-current/libvjnet/vj-client.c index 3ab1b10b..5a52743e 100644 --- a/veejay-current/libvjnet/vj-client.c +++ b/veejay-current/libvjnet/vj-client.c @@ -196,6 +196,7 @@ int vj_client_read_i( vj_client *v, uint8_t *dst ) // veejay_msg(VEEJAY_MSG_DEBUG, "Frame not ready"); // return 0; // } + if( v->c[0]->type == VSOCK_C ) plen = sock_t_recv_w( v->c[0]->fd, line, 11 ); @@ -212,7 +213,7 @@ int vj_client_read_i( vj_client *v, uint8_t *dst ) } if( v->cur_width != p[0] || v->cur_height != p[1] || v->cur_fmt != p[2]) { - veejay_msg(VEEJAY_MSG_ERROR, "Frame contents invalid"); + veejay_msg(VEEJAY_MSG_ERROR, "Frame contents invalid (video dimension or internal format did not match)"); return -1; } if( v->c[0]->type == VSOCK_C) diff --git a/veejay-current/libvjnet/vj-server.c b/veejay-current/libvjnet/vj-server.c index 38daaef1..2f076f6b 100644 --- a/veejay-current/libvjnet/vj-server.c +++ b/veejay-current/libvjnet/vj-server.c @@ -257,7 +257,7 @@ int vj_server_send( vj_server *vje, int link_id, uint8_t *buf, int len ) vj_link **Link = (vj_link**) vje->link; if (len <= 0 || Link[link_id]->in_use==0) { -veejay_msg(VEEJAY_MSG_ERROR, "Nothing to send or link %d is inactive", link_id); + veejay_msg(VEEJAY_MSG_ERROR, "Nothing to send or link %d is inactive", link_id); return 0; } diff --git a/veejay-current/share/gveejay.reloaded.glade b/veejay-current/share/gveejay.reloaded.glade index f2520774..ca419039 100644 --- a/veejay-current/share/gveejay.reloaded.glade +++ b/veejay-current/share/gveejay.reloaded.glade @@ -14395,321 +14395,317 @@ Quicktime-MJPEG - + True 0 0.5 GTK_SHADOW_NONE - 0.5 - 0.5 - 1 - True - + + True + 0.5 + 0.5 + 1 + 1 + 0 + 0 + 12 + 0 + + + + True + False + 0 + + + + True + False + 0 + + + + True + True + GTK_RELIEF_NORMAL + True + + + + + True + button_gotostart.png + 0.5 + 0.5 + 0 + 0 + + + + + 0 + False + False + + + + + + True + True + GTK_RELIEF_NORMAL + True + + + + + True + button_reverse.png + 0.5 + 0.5 + 0 + 0 + + + + + 0 + False + False + + + + + + True + True + GTK_RELIEF_NORMAL + True + + + + + True + button_pause.png + 0.5 + 0.5 + 0 + 0 + + + + + 0 + False + False + + + + + + True + True + GTK_RELIEF_NORMAL + True + + + + + True + button_play.png + 0.5 + 0.5 + 0 + 0 + + + + + 0 + False + False + + + + + + True + True + GTK_RELIEF_NORMAL + True + + + + + True + button_skip.png + 0.5 + 0.5 + 0 + 0 + + + + + 0 + False + False + + + + + 0 + True + True + + + + + + True + False + 0 + + + + True + True + GTK_RELIEF_NORMAL + True + + + + + True + button_gotoend.png + 0.5 + 0.5 + 0 + 0 + + + + + 0 + False + False + + + + + + True + True + GTK_RELIEF_NORMAL + True + + + + + True + button_dec.png + 0.5 + 0.5 + 0 + 0 + + + + + 0 + False + False + + + + + + True + True + GTK_RELIEF_NORMAL + True + + + + + True + button_inc.png + 0.5 + 0.5 + 0 + 0 + + + + + 0 + False + False + + + + + + True + True + GTK_RELIEF_NORMAL + True + + + + + True + button_prev.png + 0.5 + 0.5 + 0 + 0 + + + + + 0 + False + False + + + + + 0 + True + True + + + + + + + + + True False 0 - + True - 0 - 0.5 - GTK_SHADOW_NONE - - - - True - 0.5 - 0.5 - 1 - 1 - 0 - 0 - 12 - 0 - - - - True - 0.5 - 0.5 - 1 - 1 - 0 - 0 - 12 - 0 - - - - True - False - 0 - - - - True - True - GTK_RELIEF_NORMAL - True - - - - - True - button_gotostart.png - 0.5 - 0.5 - 0 - 0 - - - - - 0 - False - False - - - - - - True - True - GTK_RELIEF_NORMAL - True - - - - - True - button_reverse.png - 0.5 - 0.5 - 0 - 0 - - - - - 0 - False - False - - - - - - True - True - GTK_RELIEF_NORMAL - True - - - - - True - button_pause.png - 0.5 - 0.5 - 0 - 0 - - - - - 0 - False - False - - - - - - True - True - GTK_RELIEF_NORMAL - True - - - - - True - button_play.png - 0.5 - 0.5 - 0 - 0 - - - - - 0 - False - False - - - - - - True - True - GTK_RELIEF_NORMAL - True - - - - - True - button_gotoend.png - 0.5 - 0.5 - 0 - 0 - - - - - 0 - False - False - - - - - - True - True - GTK_RELIEF_NORMAL - True - - - - - True - button_dec.png - 0.5 - 0.5 - 0 - 0 - - - - - 0 - False - False - - - - - - True - True - GTK_RELIEF_NORMAL - True - - - - - True - button_inc.png - 0.5 - 0.5 - 0 - 0 - - - - - 0 - False - False - - - - - - True - True - GTK_RELIEF_NORMAL - True - - - - - True - button_prev.png - 0.5 - 0.5 - 0 - 0 - - - - - 0 - False - False - - - - - - True - True - GTK_RELIEF_NORMAL - True - - - - - True - button_skip.png - 0.5 - 0.5 - 0 - 0 - - - - - 0 - False - False - - - - - - - - - - - - True - <b>synchronous control</b> - False - True - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - label_item - - + <b>Synchronous control</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 0 @@ -14744,6 +14740,9 @@ Quicktime-MJPEG + + label_item + diff --git a/veejay-current/veejay/vj-event.c b/veejay-current/veejay/vj-event.c index 7189ebda..ef803452 100644 --- a/veejay-current/veejay/vj-event.c +++ b/veejay-current/veejay/vj-event.c @@ -7079,7 +7079,7 @@ void vj_event_get_scaled_image ( void *ptr, const char format[], va_list ap ) v->edit_list->video_height, args[0], args[1], - (v->video_out == 4 ? 4 : v->edit_list->pixel_format )); + (v->video_out == 4 ? 4 : v->pixel_format )); // pix_fmt ); // v->edit_list->pixel_format ); diff --git a/veejay-current/veejay/vj-perform.c b/veejay-current/veejay/vj-perform.c index 602b4a6b..4f94b359 100644 --- a/veejay-current/veejay/vj-perform.c +++ b/veejay-current/veejay/vj-perform.c @@ -955,7 +955,6 @@ static int __global_frame = 0; static int __socket_len = 0; int vj_perform_send_primary_frame_s(veejay_t *info, int mcast) { - // if(!info->settings->use_vims_mcast) // return 1; @@ -965,7 +964,6 @@ int vj_perform_send_primary_frame_s(veejay_t *info, int mcast) /* dont send frames if nobody is interested */ return 1; } - // info->settings->links[ info->uc->current_link ] = 1; if(!mcast && __global_frame) @@ -1002,7 +1000,7 @@ int vj_perform_send_primary_frame_s(veejay_t *info, int mcast) */ // mcast frame sender = info->vjs[2] ?? - if(vj_server_send_frame( info->vjs[id], 0, socket_buffer, __socket_len, + if(vj_server_send_frame( info->vjs[id], info->uc->current_link, socket_buffer, __socket_len, helper_frame, info->effect_frame_info, info->real_fps )<=0) { /* frame send error handling */