From 9d13f04c9476a3333acfeea31bea416717461c20 Mon Sep 17 00:00:00 2001 From: niels Date: Thu, 4 Jun 2015 00:37:07 +0200 Subject: [PATCH] fix leak in EDL never beeing freed (affects samples), free memory on exit, fix default parameter value in negation fx, fixes to libvevo, drop finalize in libvevo, clean up some warnings, added some FIXMEs --- .../veejay-server/bio2jack/bio2jack.c | 1 + veejay-current/veejay-server/libel/pixbuf.c | 5 +- veejay-current/veejay-server/libel/vj-el.c | 21 ++- .../veejay-server/libplugger/plugload.c | 10 +- veejay-current/veejay-server/libvevo/pool.c | 2 +- veejay-current/veejay-server/libvevo/vevo.c | 160 +++++++----------- .../libvje/effects/complexthreshold.c | 1 - .../veejay-server/libvje/effects/negation.c | 2 +- .../veejay-server/libvjmsg/vj-common.c | 16 ++ .../veejay-server/libvjmsg/vj-msg.h | 3 + veejay-current/veejay-server/libvjnet/dummy.c | 5 +- .../veejay-server/libvjnet/vj-server.c | 16 +- .../veejay-server/veejay/liblavplayvj.c | 20 +-- veejay-current/veejay-server/veejay/veejay.c | 1 + .../veejay-server/veejay/vj-event.c | 124 ++++++++------ .../veejay-server/veejay/vj-event.h | 1 + .../veejay-server/veejay/vj-eventman.c | 8 +- veejay-current/veejay-server/veejay/vj-osc.c | 7 +- .../veejay-server/veejay/vj-perform.c | 11 +- .../veejay-server/veejay/vj-pjack.c | 1 + .../veejay-server/veejay/vj-sdl-font.c | 2 +- veejay-current/veejay-server/veejay/vj-task.c | 25 ++- veejay-current/veejay-server/veejay/vj-task.h | 1 + 23 files changed, 244 insertions(+), 199 deletions(-) diff --git a/veejay-current/veejay-server/bio2jack/bio2jack.c b/veejay-current/veejay-server/bio2jack/bio2jack.c index b648eb53..b8b0899d 100644 --- a/veejay-current/veejay-server/bio2jack/bio2jack.c +++ b/veejay-current/veejay-server/bio2jack/bio2jack.c @@ -1319,6 +1319,7 @@ int JACK_Open(int *deviceID, unsigned int bits_per_channel, unsigned long *rate, int channels) { + //FIXME: memory allocated not freed if opening jack fails (ringbuffer etc) /* we call through to JACK_OpenEx(), but default the input channels to 0 for better backwards compatibility with clients written before recording was available */ return JACK_OpenEx(deviceID, bits_per_channel, diff --git a/veejay-current/veejay-server/libel/pixbuf.c b/veejay-current/veejay-server/libel/pixbuf.c index 10605dd9..258a24d4 100644 --- a/veejay-current/veejay-server/libel/pixbuf.c +++ b/veejay-current/veejay-server/libel/pixbuf.c @@ -395,7 +395,10 @@ int vj_picture_save( void *picture, uint8_t **frame, int w, int h , int fmt ) void vj_picture_free() { - + if(pic_scaler_) { + yuv_free_swscaler( pic_scaler_ ); + pic_scaler_ = NULL; + } } #define pic_has_changed(a,b,c) ( (a == pic_data_[0] && b == pic_data_[1] && c == pic_data_[2] ) ? 0: 1) diff --git a/veejay-current/veejay-server/libel/vj-el.c b/veejay-current/veejay-server/libel/vj-el.c index 683a1e55..971800fe 100644 --- a/veejay-current/veejay-server/libel/vj-el.c +++ b/veejay-current/veejay-server/libel/vj-el.c @@ -1443,7 +1443,7 @@ editlist *vj_el_init_with_args(char **filename, int num_files, int flags, int de if(!filename[0] || filename == NULL) { veejay_msg(VEEJAY_MSG_ERROR,"\tInvalid filename given"); - vj_el_free(el); + free(el); return NULL; } @@ -1464,14 +1464,15 @@ editlist *vj_el_init_with_args(char **filename, int num_files, int flags, int de if(stat( filename[nf], &fileinfo)!= 0) { veejay_msg(VEEJAY_MSG_ERROR, "Unable to access file '%s'",filename[nf] ); - //vj_el_free(el); + vj_el_free(el); return NULL; } fd = fopen(filename[nf], "r"); if (fd <= 0) { veejay_msg(VEEJAY_MSG_ERROR,"Error opening %s:", filename[nf]); - vj_el_free(el); + fclose(fd); + vj_el_free(el); return NULL; } @@ -1485,6 +1486,7 @@ editlist *vj_el_init_with_args(char **filename, int num_files, int flags, int de if (line[0] != 'N' && line[0] != 'n' && line[0] != 'P' && line[0] != 'p' && line[0] != 's' && line[0] != 'S') { veejay_msg(VEEJAY_MSG_ERROR,"Edit list second line is not NTSC/PAL/SECAM"); + fclose(fd); vj_el_free(el); return NULL; } @@ -1494,7 +1496,7 @@ editlist *vj_el_init_with_args(char **filename, int num_files, int flags, int de } else { el->video_norm = tolower(line[0]); - } + } /* read third line: Number of files */ fgets(line, 1024, fd); @@ -1503,7 +1505,7 @@ editlist *vj_el_init_with_args(char **filename, int num_files, int flags, int de veejay_msg(VEEJAY_MSG_DEBUG, "Edit list contains %d files", num_list_files); /* read files */ - for (i = 0; i < num_list_files; i++) + for (i = 0; i < num_list_files; i++) { fgets(line, 1024, fd); n = strlen(line); @@ -1511,6 +1513,7 @@ editlist *vj_el_init_with_args(char **filename, int num_files, int flags, int de if (line[n - 1] != '\n') { veejay_msg(VEEJAY_MSG_ERROR, "Filename in edit list too long"); + fclose(fd); vj_el_free(el); return NULL; } @@ -1522,6 +1525,7 @@ editlist *vj_el_init_with_args(char **filename, int num_files, int flags, int de if(index_list[i]< 0) { + fclose(fd); vj_el_free(el); return NULL; } @@ -1530,11 +1534,12 @@ editlist *vj_el_init_with_args(char **filename, int num_files, int flags, int de if (el->frame_list==NULL) { veejay_msg(VEEJAY_MSG_ERROR, "Insufficient memory to allocate frame_list"); + fclose(fd); vj_el_free(el); return NULL; } - for (i = 0; i < el->num_frames[n]; i++) + for (i = 0; i < el->num_frames[n]; i++) { el->frame_list[el->video_frames++] = EL_ENTRY(n, i); } @@ -1553,6 +1558,7 @@ editlist *vj_el_init_with_args(char **filename, int num_files, int flags, int de if (nl < 0 || nl >= num_list_files) { veejay_msg(VEEJAY_MSG_ERROR,"Wrong file number in edit list entry"); + fclose(fd); vj_el_free(el); return NULL; } @@ -1572,6 +1578,7 @@ editlist *vj_el_init_with_args(char **filename, int num_files, int flags, int de if (el->frame_list==NULL) { veejay_msg(VEEJAY_MSG_ERROR, "Insufficient memory to allocate frame_list"); + fclose(fd); vj_el_free(el); return NULL; } @@ -1687,7 +1694,6 @@ void vj_el_free(editlist *el) } } - if( el->cache ) { free_cache( el->cache ); el->cache = NULL; @@ -1698,7 +1704,6 @@ void vj_el_free(editlist *el) } free(el); - el = NULL; } diff --git a/veejay-current/veejay-server/libplugger/plugload.c b/veejay-current/veejay-server/libplugger/plugload.c index 31ae18d2..185c1852 100644 --- a/veejay-current/veejay-server/libplugger/plugload.c +++ b/veejay-current/veejay-server/libplugger/plugload.c @@ -310,15 +310,15 @@ static void free_plugins() for( i = 0; i < index_ ; i ++ ) free_plugin( index_map_[i]); - vevo_port_recursive_free( illegal_plugins_ ); - + vpf( illegal_plugins_ ); + freeframe_destroy(); + frei0r_destroy(); + free( index_map_ ); index_ = 0; index_map_ = NULL; - - - freeframe_destroy(); } + int plug_get_idx_by_so_name( char *soname ) { int i; diff --git a/veejay-current/veejay-server/libvevo/pool.c b/veejay-current/veejay-server/libvevo/pool.c index 594f96c4..5b1451f1 100644 --- a/veejay-current/veejay-server/libvevo/pool.c +++ b/veejay-current/veejay-server/libvevo/pool.c @@ -195,7 +195,7 @@ void vevo_pool_slice_destroy( void *p ) s = n->next; free( n ); } - free( pool->space ); + //free( pool->space ); free( pool ); p = NULL; } diff --git a/veejay-current/veejay-server/libvevo/vevo.c b/veejay-current/veejay-server/libvevo/vevo.c index 3356d8b4..d00c1411 100644 --- a/veejay-current/veejay-server/libvevo/vevo.c +++ b/veejay-current/veejay-server/libvevo/vevo.c @@ -298,9 +298,7 @@ static vevo_property_t *prop_node_get(vevo_port_t * p, ukey_t key) */ static port_index_t *port_node_new(__vevo_port_t *port,const char *key, ukey_t hash_key) { - // port_index_t *i = (port_index_t *) vevo_malloc(sizeof(port_index_t)); - port_index_t *i = (port_index_t *) vevo_pool_alloc_node( - port_index_t, port->pool ); + port_index_t *i = (port_index_t *) vevo_pool_alloc_node(port_index_t, port->pool ); i->key = strdup(key); i->hash_code = hash_key; i->next = NULL; @@ -326,8 +324,7 @@ static void port_node_free(__vevo_port_t *port,port_index_t * node) \param key name of property \param hash_key calculated hash value */ -static void port_node_append(vevo_port_t * p, const char *key, - ukey_t hash_key) +static void port_node_append(vevo_port_t * p, const char *key,ukey_t hash_key) { __vevo_port_t *port = (__vevo_port_t *) p; port_index_t *node = port_node_new(p,key, hash_key); @@ -550,7 +547,6 @@ static int atom_get_value(vevo_storage_t * t, int idx, void *dst) if( t->num_elements == 0 && idx == 0 ) { - atom = t->elements.atom; return VEVO_ERROR_PROPERTY_EMPTY; } @@ -670,26 +666,23 @@ static void vevo_free_atom(__vevo_port_t *port,atom_t * atom) \param dst destination address \param atom_type type of atom */ -static atom_t *vevo_put_atom(__vevo_port_t * port, void *dst, - int atom_type) +static atom_t *vevo_put_atom(__vevo_port_t * port, void *dst, int atom_type) { atom_t *atom = NULL; - size_t atom_size = vevo_atom_size(atom_type); - if (atom_type == VEVO_ATOM_TYPE_STRING || atom_type == VEVO_ATOM_TYPE_UTF8STRING) { - char **s = (char **) dst; - char *data = (char*) *s; - atom_size = strlen(data) + 1; - atom = vevo_new_atom(port, atom_type, atom_size); + char **s = (char **) dst; + char *data = (char*) *s; + size_t atom_size = (dst == NULL || data == NULL ? 0 : strlen(data) + 1); + atom = vevo_new_atom(port, atom_type, atom_size); if (atom_size > 0) { veejay_memcpy(atom->value, data, atom_size); } } else { - - atom = vevo_new_atom(port, atom_type, atom_size); - if (!atom) - return NULL; - veejay_memcpy(atom->value, dst, atom_size); + size_t atom_size = vevo_atom_size(atom_type); + atom = vevo_new_atom(port, atom_type, atom_size); + if (!atom) + return NULL; + veejay_memcpy(atom->value, dst, atom_size); } return atom; } @@ -981,7 +974,7 @@ vevo_property_element_size(vevo_port_t * p, const char *key, const int idx ) */ vevo_port_t *vevo_port_new(int port_type) { - __vevo_port_t *port = (__vevo_port_t *) malloc(sizeof(__vevo_port_t)); + __vevo_port_t *port = (__vevo_port_t *) vj_malloc(sizeof(__vevo_port_t)); port->index = NULL; port->list = NULL; @@ -993,8 +986,7 @@ vevo_port_t *vevo_port_new(int port_type) else port->table = hash_create(HASHCOUNT_T_MAX, key_compare, int_hash); - vevo_port_finalize (port, port_type ); - + // vevo_port_finalize (port, port_type ); return (vevo_port_t *) port; } @@ -1021,14 +1013,12 @@ static void vevo_port_free_(vevo_port_t * p) __vevo_port_t *port = (__vevo_port_t *) p; if (port->table) { if (!hash_isempty((hash_t *) port->table)) { - hscan_t scan; - memset( &scan, 0, sizeof(hscan_t)); + hscan_t scan = (hscan_t) {0}; hash_scan_begin(&scan, (hash_t *) port->table); hnode_t *node = NULL; while ((node = hash_scan_next(&scan)) != NULL) { - vevo_storage_t *stor = NULL; - stor = hnode_get(node); + vevo_storage_t *stor = hnode_get(node); vevo_free_storage(port,stor); } hash_free_nodes((hash_t *) port->table); @@ -1339,7 +1329,7 @@ vv_property_set(vevo_port_t * p, storage_put_atom_value(port, src, num_elements, stor, atom_type); if (new) { - node = (void *) prop_node_append(port, hash_key, stor); + prop_node_append(port, hash_key, stor); } else { vevo_property_t *current = (vevo_property_t *) node; current->st = stor; @@ -1698,22 +1688,20 @@ int vevo_special_union_ports( void *port_a, void *port_b ) int i; int error; if(!Ea) - return 0; + return 0; + char key[64]; for( i = 0; Ea[i] != NULL; i ++ ) { void *value = NULL; - char key[64]; - int atom_type = vevo_property_atom_type( port_a, Ea[i] ); if( atom_type == VEVO_ATOM_TYPE_VOIDPTR ) { - error = vevo_property_get( port_a, Ea[i], 0, &value ); - sprintf(key, "%p", value ); - - if(!vevo_property_exists( port_b, key )) + if( vevo_property_get( port_a, Ea[i], 0, &value ) == VEVO_NO_ERROR ) { - error = vevo_property_set( port_b, key, VEVO_ATOM_TYPE_VOIDPTR,1,&value ); + snprintf(key,sizeof(key), "%p", value ); + if(!vevo_property_exists( port_b, key )) + vevo_property_set( port_b, key, VEVO_ATOM_TYPE_VOIDPTR,1,&value ); } } free( Ea[i] ); @@ -1902,8 +1890,6 @@ char *vevo_format_property( vevo_port_t *port, const char *key ) if( n_elem <= 0 ) n_elem = 1; - memset(token,0,sizeof(token)); - switch( atom_type ) { case VEVO_ATOM_TYPE_INT: @@ -1932,26 +1918,25 @@ char *vevo_format_property( vevo_port_t *port, const char *key ) token[0] = 'g'; break; } + + token[1] = '\0'; - if( token[0]) - { - int len = n_elem * strlen(token) + 1; - res = (char*) calloc(1, sizeof(char) * len ); - int i; - for( i =0; i < n_elem; i ++ ) - strncat( res,token,strlen(token) ); - } + int len = n_elem * strlen(token); + res = (char*) vj_malloc( sizeof(char) * len + 1 ); + int i; + for( i =0; i < n_elem; i ++ ) + res[i] = token[0]; + res[len] = '\0'; return res; } char *vevo_format_kind( vevo_port_t *port, const char *key ) { - char *res = NULL; char token[5]; int atom_type = vevo_property_atom_type( port, key ); - memset(token,0,sizeof(token)); + token[1] = '\0'; switch( atom_type ) { @@ -1982,13 +1967,7 @@ char *vevo_format_kind( vevo_port_t *port, const char *key ) break; } - if( token[0]) - { - res = strdup( token ); - } - - return res; - + return strdup( token ); } @@ -2119,14 +2098,17 @@ int vevo_sscanf_property( vevo_port_t *port, const char *s) int err = vevo_property_get( port, "driver", 0, &drv ); if( drv == NULL || err != VEVO_NO_ERROR ) { veejay_msg(0, "No context for property '%s'", s ); + free(format); return 0; } int32_t v; if( sscanf( value, "%d", &v ) ) { vevo_property_call( port, key, drv, v,v ); + free(format); return 1; } + free(format); return 0; } @@ -2218,6 +2200,9 @@ int vevo_sscanf_property( vevo_port_t *port, const char *s) if( error == VEVO_NO_ERROR ) done = 1; + + free(format); + return done; } @@ -2241,7 +2226,6 @@ char **vevo_sprintf_port( vevo_port_t *port ) for( i = 0; keys[i] != NULL; i ++ ) { char *buf = vevo_sprintf_property(port, keys[i]); - char *p = buf; if(buf) { res[k++] = strdup( buf ); @@ -2539,33 +2523,38 @@ int vevo_property_from_string( vevo_port_t *port, const char *s, const char *key } void *ptr = NULL; + int ret; if( n > 0 ) - switch( *format ) { - case 'd': - case 'b': - ptr = &(i32_val[0]); - break; - case 'D': - ptr = &(i64_val[0]); - break; - case 'g': - ptr = &(dbl_val[0]); - break; - case 's': - ptr = &(str_val[0]); - break; - } + switch( *format ) + { + case 'd': + case 'b': + ptr = &(i32_val[0]); + break; + case 'D': + ptr = &(i64_val[0]); + break; + case 'g': + ptr = &(dbl_val[0]); + break; + case 's': + ptr = &(str_val[0]); + break; + default: + n = 0; + break; + } + } - int error = 0; if( n == 0 ) - error = vevo_property_set( port, key, type, 0, NULL ); + ret = vevo_property_set( port, key, type, 0, NULL ); else - { - error = vevo_property_set( port, key, type, cur_elem, ptr ); - } - if( error == VEVO_NO_ERROR ) + ret = vevo_property_set( port, key, type, cur_elem, ptr ); + + if( ret == VEVO_NO_ERROR ) done = 1; + free(format); return done; } @@ -2759,15 +2748,6 @@ static struct { //@ FIXME move to specific locations, use a register to registe {0, NULL } }; -static char * vevo_identify_port( int type ) { - int i; - for( i = 0; port_types[i].name != NULL ; i ++ ) { - if( type == port_types[i].id ) - return port_types[i].name; - } - return "Illegal or unknown port type"; -} - void vevo_port_dump( void *p, int lvl ) { char **keys = vevo_list_properties(p); @@ -2789,16 +2769,6 @@ void vevo_port_dump( void *p, int lvl ) veejay_msg( VEEJAY_MSG_DEBUG, "%s%p", (tabs == NULL ? "/" : tabs ), p ); for( k = 0; keys[k] != NULL; k ++ ) { - - if( strncasecmp( keys[k], "type",4 ) == 0 ) { - int tval = 0; - err = vevo_property_get( p, keys[k],0,&tval ); - veejay_msg(VEEJAY_MSG_DEBUG, "%s %s %s", - (tabs==NULL ? "->" : tabs ), keys[k], vevo_identify_port(tval)); - free( keys[k] ); - continue; - } - int at = vevo_property_atom_type(p,keys[k]); switch(at) { case VEVO_ATOM_TYPE_PORTPTR: diff --git a/veejay-current/veejay-server/libvje/effects/complexthreshold.c b/veejay-current/veejay-server/libvje/effects/complexthreshold.c index 35a3401b..19fae657 100644 --- a/veejay-current/veejay-server/libvje/effects/complexthreshold.c +++ b/veejay-current/veejay-server/libvje/effects/complexthreshold.c @@ -135,7 +135,6 @@ void complexthreshold_apply(VJFrame *frame, VJFrame *frame2, int width, tmp = 1 / kg1; one_over_kc = 0xff * 2 * tmp - 0xff; kfgy_scale = 0xf * (float) (_y) / kg1; - kg = kg1; /* intialize pointers */ fg_y = Y2; diff --git a/veejay-current/veejay-server/libvje/effects/negation.c b/veejay-current/veejay-server/libvje/effects/negation.c index 3fdd7af8..b4dd9a8f 100644 --- a/veejay-current/veejay-server/libvje/effects/negation.c +++ b/veejay-current/veejay-server/libvje/effects/negation.c @@ -37,7 +37,7 @@ vj_effect *negation_init(int w, int h) ve->limits[1] = (int *) vj_calloc(sizeof(int) * ve->num_params); /* max */ ve->limits[0][0] = 0; ve->limits[1][0] = 255; - ve->defaults[0] = 3;// 255; + ve->defaults[0] = 255; ve->description = "Negation"; ve->sub_format = 0; ve->extra_frame = 0; diff --git a/veejay-current/veejay-server/libvjmsg/vj-common.c b/veejay-current/veejay-server/libvjmsg/vj-common.c index ef029180..ec245bcc 100644 --- a/veejay-current/veejay-server/libvjmsg/vj-common.c +++ b/veejay-current/veejay-server/libvjmsg/vj-common.c @@ -238,6 +238,22 @@ void veejay_init_msg_ring() sem_init( msg_ring->semaphore, 0, 0 ); } +void veejay_destroy_msg_ring() +{ + if(msg_ring) { + int i; + for( i = 0; i < MESSAGE_RING_SIZE; i ++ ) { + if( msg_ring->dommel[i]) { + free(msg_ring->dommel[i]); + } + } + free(msg_ring->dommel); + free(msg_ring->semaphore); + sem_destroy( msg_ring->semaphore ); + free(msg_ring); + } +} + static void veejay_msg_ringbuffer( char *line ) { uint64_t pos = __sync_fetch_and_add( &msg_ring->pos, 1) % MESSAGE_RING_SIZE; diff --git a/veejay-current/veejay-server/libvjmsg/vj-msg.h b/veejay-current/veejay-server/libvjmsg/vj-msg.h index 65b8c848..1c81a191 100644 --- a/veejay-current/veejay-server/libvjmsg/vj-msg.h +++ b/veejay-current/veejay-server/libvjmsg/vj-msg.h @@ -44,4 +44,7 @@ extern int has_env_setting( const char *env, const char *value ); extern char* veejay_msg_ringfetch(); extern int veejay_log_to_ringbuffer(); extern void veejay_toggle_osl(); +extern void veejay_init_msg_ring(); +extern void veejay_destroy_msg_ring(); #endif + diff --git a/veejay-current/veejay-server/libvjnet/dummy.c b/veejay-current/veejay-server/libvjnet/dummy.c index 60eca9e1..81073f58 100644 --- a/veejay-current/veejay-server/libvjnet/dummy.c +++ b/veejay-current/veejay-server/libvjnet/dummy.c @@ -32,6 +32,7 @@ int main( int argc, char *argv[] ) vj_server *s = vj_server_alloc( 5000, NULL, V_CMD); vj_server *k = vj_server_alloc( 5001, NULL, V_STATUS ); int frame = 0; + int tmplen = 0; veejay_set_debug_level(4); @@ -60,9 +61,9 @@ int main( int argc, char *argv[] ) { char tmp[4096]; memset(tmp,0,sizeof(tmp)); - while( vj_server_retrieve_msg(s,i, tmp ) ) + while( vj_server_retrieve_msg(s,i, tmp, &tmplen ) ) { - printf("recv [%s]\n", tmp ); + printf("recv %d [%s]\n", tmplen,tmp ); } } } diff --git a/veejay-current/veejay-server/libvjnet/vj-server.c b/veejay-current/veejay-server/libvjnet/vj-server.c index b701cf2f..8cccf44e 100644 --- a/veejay-current/veejay-server/libvjnet/vj-server.c +++ b/veejay-current/veejay-server/libvjnet/vj-server.c @@ -137,12 +137,18 @@ static int _vj_server_multicast( vj_server *v, char *group_name, int port ) if( v->server_type == V_CMD ) { proto[0]->s = mcast_new_sender( group_name ); - if(!proto[0]->s) + if(!proto[0]->s) { + free(proto); return 0; + } proto[0]->r = mcast_new_receiver( group_name , port + VJ_CMD_MCAST_IN ); - if(!proto[0]->r ) + if(!proto[0]->r ) { + free(proto[0]->s); + free(proto[0]); + free(proto); return 0; + } v->ports[0] = port + VJ_CMD_MCAST; v->ports[1] = port + VJ_CMD_MCAST_IN; @@ -154,6 +160,12 @@ static int _vj_server_multicast( vj_server *v, char *group_name, int port ) if(!link) { veejay_msg(VEEJAY_MSG_ERROR, "Out of memory"); + if(proto[0]) { + if(proto[0]->s) free(proto[0]->s); + if(proto[0]->r) free(proto[0]->r); + free(proto[0]); + free(proto); + } return 0; } diff --git a/veejay-current/veejay-server/veejay/liblavplayvj.c b/veejay-current/veejay-server/veejay/liblavplayvj.c index 5fb10db8..e73c5896 100644 --- a/veejay-current/veejay-server/veejay/liblavplayvj.c +++ b/veejay-current/veejay-server/veejay/liblavplayvj.c @@ -237,8 +237,6 @@ void veejay_change_state_save(veejay_t * info, int new_state) } int veejay_set_framedup(veejay_t *info, int n) { - video_playback_setup *settings = (video_playback_setup*) settings; - switch(info->uc->playback_mode) { case VJ_PLAYBACK_MODE_PLAIN: info->sfd = n; @@ -390,27 +388,21 @@ int veejay_free(veejay_t * info) vj_mem_threaded_stop(); - vj_event_stop(); + vj_event_destroy(); - vj_tag_free(); - //vj_el_free(info->edit_list); - vj_avcodec_free(); - - void *old = info->edit_list; + vj_tag_free(); + sample_free(info->edit_list); - if(old != info->current_edit_list ) { - vj_el_free(info->current_edit_list); - } - vj_el_free(info->edit_list); vj_el_deinit(); -// vj_tag_free(); + vj_avcodec_free(); vj_effect_shutdown(); + task_destroy(); if( info->settings->composite2 ) composite_destroy( info->composite2 ); @@ -3313,7 +3305,7 @@ int veejay_edit_addmovie_sample(veejay_t * info, char *movie, int id ) { if( !sample_usable_edl( id ) ) { - veejay_msg(0, "Sample %d has no EDL (its a picture!)", id ); + veejay_msg(0, "Sample %d is a picture ...", id ); //FIXME check if this can be removed return -1; } diff --git a/veejay-current/veejay-server/veejay/veejay.c b/veejay-current/veejay-server/veejay/veejay.c index c59b6a34..b579597f 100644 --- a/veejay-current/veejay-server/veejay/veejay.c +++ b/veejay-current/veejay-server/veejay/veejay.c @@ -827,6 +827,7 @@ int main(int argc, char **argv) veejay_busy(info); veejay_free(info); + veejay_destroy_msg_ring(); veejay_msg(VEEJAY_MSG_INFO, "Thank you for using Veejay"); diff --git a/veejay-current/veejay-server/veejay/vj-event.c b/veejay-current/veejay-server/veejay/vj-event.c index 97e37dd1..ad3c0c9b 100644 --- a/veejay-current/veejay-server/veejay/vj-event.c +++ b/veejay-current/veejay-server/veejay/vj-event.c @@ -137,8 +137,9 @@ static char *get_print_buf(int size) { char *res = (char*) vj_calloc(sizeof(char) * s ); return res; } +#define MAX_MACRO_BANKS 12 -static void *macro_bank_[12]; +static void *macro_bank_[MAX_MACRO_BANKS]; static void *macro_port_ = NULL; static int current_macro_ = 0; static int macro_status_ = 0; @@ -543,7 +544,7 @@ static void init_vims_for_macro(); static void macro_select( int slot ) { - if( slot >= 0 && slot < 12 ) + if( slot >= 0 && slot < MAX_MACRO_BANKS ) { macro_bank_[ current_macro_ ] = macro_port_; current_macro_ = slot; @@ -820,33 +821,6 @@ vj_msg_bundle *vj_event_bundle_get(int event_id) return NULL; } #ifdef HAVE_SDL -void del_all_keyb_events() -{ - if(!keyboard_events) - return; - - if(!hash_isempty( keyboard_events )) - { - hscan_t scan; - hash_scan_begin( &scan, keyboard_events ); - hnode_t *node; - while( ( node = hash_scan_next(&scan)) != NULL ) - { - vj_keyboard_event *ev = NULL; - ev = hnode_get( node ); - if(ev) - { - if(ev->arguments) free(ev->arguments); - if(ev->vims) free(ev->vims); - } - } - hash_free_nodes( keyboard_events ); - hash_destroy( keyboard_events ); - } - - veejay_memset( keyboard_event_map_, 0, sizeof(keyboard_event_map_)); -} - int del_keyboard_event(int id ) { hnode_t *node; @@ -885,6 +859,18 @@ int keyboard_event_exists(int id) return 0; } +void destroy_keyboard_event( vj_keyboard_event *ev ) +{ + if( ev ) { + if( ev->vims ) + free( ev->vims ); + + if( ev->arguments ) + free( ev->arguments ); + + free(ev); + } +} vj_keyboard_event *new_keyboard_event( int symbol, int modifier, const char *value, int event_id ) @@ -2647,8 +2633,62 @@ void vj_event_init(void *ptr) if(ptr) vj_event_load_keyboard_configuration( (veejay_t*) ptr ); #endif init_vims_for_macro(); +} +#ifdef HAVE_SDL +static void vj_event_destroy_hash( hash_t *h) +{ + if(!hash_isempty(h)) { + hscan_t s = (hscan_t) {0}; + hash_scan_begin( &s, h ); + hnode_t *node = NULL; + while((node = hash_scan_next(&s)) != NULL ) { + void *ptr = hnode_get(node); + if(ptr) destroy_keyboard_event(ptr); + } + hash_free_nodes( h ); + } + hash_destroy( h ); +} +#endif + +static void vj_event_destroy_bundles( hash_t *h ) +{ + if(!hash_isempty(h)) { + hscan_t s = (hscan_t) {0}; + hash_scan_begin( &s, h ); + hnode_t *node = NULL; + while((node = hash_scan_next(&s)) != NULL ) { + vj_msg_bundle *m = hnode_get(node); + if(m) { + if( m->bundle ) + free(m->bundle); + free(m); + } + } + hash_free_nodes( h ); + } + hash_destroy( h ); +} + +void vj_event_destroy() +{ +#ifdef HAVE_SDL + if(keyboard_events) vj_event_destroy_hash( keyboard_events ); +#endif + if(BundleHash) vj_event_destroy_bundles( BundleHash ); + vj_picture_free(); + + vj_event_vevo_free(); + + int i; + for( i = 0; i < MAX_MACRO_BANKS; i ++ ) + { + macro_port_ = macro_bank_[i]; + if(macro_port_) + reset_macro_(); + } } @@ -3021,10 +3061,13 @@ void vj_event_send_bundles(void *ptr, const char format[], va_list ap) veejay_strncat( buf, form, form_len); if(tree->arg_len) veejay_strncat( buf, tree->args, tree->arg_len ); + + void *ptr = tree; + tree = tree->next; + + free(ptr); } - if(root) - free(root); #endif if(name) free(name); @@ -10453,23 +10496,4 @@ void vj_event_set_macro_status( void *ptr, const char format[], va_list ap ) } } -void vj_event_stop() -{ - // destroy bundlehash, destroy keyboard_events -#ifdef HAVE_SDL - del_all_keyb_events(); -#endif - - vj_picture_free(); - - vj_event_vevo_free(); - - int i; - for( i = 0; i < 12; i ++ ) - { - macro_port_ = macro_bank_[i]; - if(macro_port_) - reset_macro_(); - } -} diff --git a/veejay-current/veejay-server/veejay/vj-event.h b/veejay-current/veejay-server/veejay/vj-event.h index d8314ac2..f67374a2 100644 --- a/veejay-current/veejay-server/veejay/vj-event.h +++ b/veejay-current/veejay-server/veejay/vj-event.h @@ -27,6 +27,7 @@ void vj_event_fmt_arg ( int *args, char *str, const char format[], va_list ap); void vj_event_init (void *ptr); +void vj_event_destroy(); void vj_event_print_range ( int n1, int n2); int veejay_finish_action_file(void *ptr, char *filename ); int veejay_load_action_file( void *ptr, char *filename ); diff --git a/veejay-current/veejay-server/veejay/vj-eventman.c b/veejay-current/veejay-server/veejay/vj-eventman.c index cffd1cfa..b7078bd9 100644 --- a/veejay-current/veejay-server/veejay/vj-eventman.c +++ b/veejay-current/veejay-server/veejay/vj-eventman.c @@ -351,19 +351,16 @@ void vj_event_vevo_dump(void) void vj_event_vevo_free(void) { unsigned int i; - if( !index_map_) - return; for( i = 0 ; i < MAX_INDEX ; i ++ ) - if( index_map_[i] ) vpf( index_map_[i] ); + if( index_map_[i] ) vpf( index_map_[i] ); free(index_map_); } void vj_init_vevo_events(void) { - index_map_ = (vevo_port_t*) vj_malloc(sizeof(vevo_port_t*) * MAX_INDEX ); - veejay_memset( index_map_, 0, sizeof( vevo_port_t *) * MAX_INDEX ); + index_map_ = (vevo_port_t*) vj_calloc(sizeof(vevo_port_t*) * MAX_INDEX ); index_map_[VIMS_MACRO] = _new_event( "%d %d", @@ -2913,3 +2910,4 @@ void vj_init_vevo_events(void) + diff --git a/veejay-current/veejay-server/veejay/vj-osc.c b/veejay-current/veejay-server/veejay/vj-osc.c index 2f42f514..e08fe5a6 100644 --- a/veejay-current/veejay-server/veejay/vj-osc.c +++ b/veejay-current/veejay-server/veejay/vj-osc.c @@ -627,7 +627,7 @@ static struct { NULL, -1 } }; -static char **string_tokenize( const char delim, const char *name, int *ntokens ) { +static char **string_tokenize( const char delim, const char *name, int *ntokens ) { int n = strlen(name); int i; int n_tokens = 0; @@ -679,7 +679,7 @@ static void free_token( char **arr ) { } -int vj_osc_build_cont( vj_osc *o ) +int vj_osc_build_cont( vj_osc *o ) //FIXME never freed { int i; @@ -691,6 +691,7 @@ int vj_osc_build_cont( vj_osc *o ) for( i = 0; osc_method_layout[i].name != NULL ; i ++ ) { int ntokens = 0; + //FIXME: arr never freed but should be, leaking memory here char **arr = string_tokenize( '/', osc_method_layout[i].name, &ntokens); if( arr == NULL || ntokens == 0 ) { continue; @@ -710,6 +711,7 @@ int vj_osc_build_cont( vj_osc *o ) int ntokens = 0; int exists = 0; int attach_id = 0; + //FIXME: arr never freed but should be, leaking memory here char **arr = string_tokenize( '/', osc_method_layout[i].name, &ntokens); if( arr == NULL || ntokens == 0 ) { continue; @@ -742,6 +744,7 @@ int vj_osc_build_cont( vj_osc *o ) for( i = 0; osc_method_layout[i].name != NULL ; i ++ ) { int ntokens = 0; + //FIXME: arr never freed but should be, leaking memory here char **arr = string_tokenize( '/', osc_method_layout[i].name, &ntokens); if( arr == NULL || ntokens == 0 ) continue; diff --git a/veejay-current/veejay-server/veejay/vj-perform.c b/veejay-current/veejay-server/veejay/vj-perform.c index 0ec34f34..55039f89 100644 --- a/veejay-current/veejay-server/veejay/vj-perform.c +++ b/veejay-current/veejay-server/veejay/vj-perform.c @@ -372,7 +372,7 @@ static int vj_perform_try_sequence( veejay_t *info ) static void seq_play_sample( veejay_t *info, int n) { info->seq->current = n; - int id = info->seq->samples[n]; +// int id = info->seq->samples[n]; int which_sample = 0; int offset = sample_get_first_mix_offset( info->uc->sample_id, &which_sample, info->seq->samples[info->seq->current] ); @@ -1158,7 +1158,7 @@ int vj_perform_send_primary_frame_s2(veejay_t *info, int mcast, int to_mcast_lin { char info_line[128]; int compr_ok = 0; - uint32_t planes[3]; + uint32_t planes[3] = {0}; int data_len = 44; memset(info_line, 0, sizeof(info_line) ); @@ -2893,7 +2893,6 @@ int vj_perform_queue_audio_frame(veejay_t *info) int pred_len = num_samples; int bps = el->audio_bps; uint8_t *a_buf = top_audio_buffer; - int rs = 0; if (info->audio == AUDIO_PLAY) { switch (info->uc->playback_mode) @@ -2906,12 +2905,11 @@ int vj_perform_queue_audio_frame(veejay_t *info) num_samples = pred_len; veejay_memset( a_buf, 0, num_samples * bps ); } - else - rs = 1; break; case VJ_PLAYBACK_MODE_PLAIN: if( el->has_audio ) { + int rs = 0; if (settings->current_frame_num <= settings->max_frame_num) num_samples = vj_el_get_audio_frame(el, this_frame,a_buf ); else @@ -2923,6 +2921,7 @@ int vj_perform_queue_audio_frame(veejay_t *info) } else rs = 1; + if( settings->current_playback_speed < 0 && rs ) vj_perform_reverse_audio_frame(info,num_samples,a_buf); } @@ -2936,8 +2935,6 @@ int vj_perform_queue_audio_frame(veejay_t *info) num_samples = pred_len; veejay_memset(a_buf, 0, num_samples * bps ); } - else - rs = 1; } break; } diff --git a/veejay-current/veejay-server/veejay/vj-pjack.c b/veejay-current/veejay-server/veejay/vj-pjack.c index 7d562ead..020eec54 100644 --- a/veejay-current/veejay-server/veejay/vj-pjack.c +++ b/veejay-current/veejay-server/veejay/vj-pjack.c @@ -65,6 +65,7 @@ static int _vj_jack_start(int *dri) veejay_msg(0, "Unable to find jack port"); break; } + // veejay_msg(0, "To run veejay without audio, use -a0"); return 0; } diff --git a/veejay-current/veejay-server/veejay/vj-sdl-font.c b/veejay-current/veejay-server/veejay/vj-sdl-font.c index b6304837..43c75d7a 100644 --- a/veejay-current/veejay-server/veejay/vj-sdl-font.c +++ b/veejay-current/veejay-server/veejay/vj-sdl-font.c @@ -131,7 +131,7 @@ static inline void _overlay_text_uv( uint8_t *dst, uint8_t *a, const int len, ui static void *_try_font( char *path ) { - void *res = TTF_OpenFontIndex( path, 10, 0 ); + void *res = TTF_OpenFontIndex( path, 10, 0 ); //FIXME never freed if(!res) { return NULL; } diff --git a/veejay-current/veejay-server/veejay/vj-task.c b/veejay-current/veejay-server/veejay/vj-task.c index ebb55460..0e083ab8 100644 --- a/veejay-current/veejay-server/veejay/vj-task.c +++ b/veejay-current/veejay-server/veejay/vj-task.c @@ -96,6 +96,26 @@ static int euid = 0; #define __lock() pthread_mutex_lock(&queue_mutex) #define __unlock() pthread_mutex_unlock(&queue_mutex) +static void task_allocate() +{ + unsigned int i; + for( i = 0; i < MAX_WORKERS; i ++ ) { + job_list[i] = vj_malloc(sizeof(pjob_t)); + vj_task_args[i] = vj_malloc(sizeof(vj_task_arg_t)); + p_thread_args[i] = vj_malloc( sizeof(uint8_t) ); + } +} + +void task_destroy() +{ + unsigned int i; + for( i = 0; i < MAX_WORKERS; i ++ ) { + free(job_list[i]); + free(vj_task_args[i]); + free(p_thread_args[i]); + } +} + static void task_reset() { unsigned int i; @@ -105,11 +125,8 @@ static void task_reset() memset( job_list,0,sizeof(pjob_t*) * MAX_WORKERS ); memset( &vj_task_args,0,sizeof(vj_task_arg_t*) * MAX_WORKERS ); for( i = 0; i < MAX_WORKERS; i ++ ) { - job_list[i] = vj_malloc(sizeof(pjob_t)); - vj_task_args[i] = vj_malloc(sizeof(vj_task_arg_t)); memset( job_list[i],0, sizeof(pjob_t)); memset( vj_task_args[i],0, sizeof(vj_task_arg_t)); - p_thread_args[i] = malloc( sizeof(uint8_t) ); memset( p_thread_args[i],0, sizeof(uint8_t)); memset( &(running_tasks[i]), 0, sizeof(struct task)); } @@ -206,7 +223,7 @@ static inline uint8_t task_get_workers() void task_init() { - task_reset(); + task_allocate(); int max_p = sched_get_priority_max( SCHED_FIFO ); int min_p = sched_get_priority_min( SCHED_FIFO ); diff --git a/veejay-current/veejay-server/veejay/vj-task.h b/veejay-current/veejay-server/veejay/vj-task.h index f2568a37..b8c694d1 100644 --- a/veejay-current/veejay-server/veejay/vj-task.h +++ b/veejay-current/veejay-server/veejay/vj-task.h @@ -62,6 +62,7 @@ void *vj_task_get_internal_buf(); int task_start(unsigned int max_workers); void task_stop(unsigned int max_workers); void task_init(); +void task_destroy(); int task_num_cpus(); void vj_task_set_overlap( int val ); void performer_job( uint8_t job_num );