diff --git a/veejay-current/veejay-client/src/callback.c b/veejay-current/veejay-client/src/callback.c index 8696e76b..b20e89f8 100644 --- a/veejay-current/veejay-client/src/callback.c +++ b/veejay-current/veejay-client/src/callback.c @@ -3423,7 +3423,8 @@ void on_combobox_fonts_changed( GtkWidget *w, gpointer data ) return; gint font = gtk_combo_box_get_active( GTK_COMBO_BOX( w ) ); gint size = get_nums( "spin_text_size" ); - + if( font < 0 || size < 0 ) + return; multi_vims( VIMS_FONT_SIZE_FONT, "%d %d", font , size ); } void on_spin_text_size_value_changed( GtkWidget *w, gpointer data ) diff --git a/veejay-current/veejay-server/libsample/sampleadm.c b/veejay-current/veejay-server/libsample/sampleadm.c index 9a9fef5e..f87f0bce 100644 --- a/veejay-current/veejay-server/libsample/sampleadm.c +++ b/veejay-current/veejay-server/libsample/sampleadm.c @@ -78,7 +78,7 @@ static hash_t *SampleHash; /* hash of sample information structs */ static int avail_num[SAMPLE_MAX_SAMPLES]; /* an array of freed sample id's */ static void *sample_font_ = NULL; static int sampleadm_state = SAMPLE_PEEK; /* default state */ - +static void *sample_cache[SAMPLE_MAX_SAMPLES]; extern void tagParseStreamFX(char *file, xmlDocPtr doc, xmlNodePtr cur, void *font, void *vp); extern void tag_writeStream( char *file, int n, xmlNodePtr node, void *font, void *vp ); extern int vj_tag_size(); @@ -334,6 +334,9 @@ sample_info *sample_skeleton_new(long startFrame, long endFrame) #ifdef HAVE_FREETYPE si->dict = vpn( VEVO_ANONYMOUS_PORT ); #endif + + sample_cache[ si->sample_id ] = (void*) si; + return si; } @@ -381,10 +384,17 @@ void sample_new_simple( void *el, long start, long end ) sample_info *sample_get(int sample_id) { - hnode_t *sample_node = hash_lookup(SampleHash, (void *) sample_id); - if(!sample_node) + if( sample_id < 0 || sample_id > SAMPLE_MAX_SAMPLES) return NULL; - return (sample_info*) hnode_get(sample_node); + + if( sample_cache[sample_id] == NULL ) { + hnode_t *sample_node = hash_lookup(SampleHash, (void *) sample_id); + if(!sample_node) + return NULL; + sample_cache[sample_id] = hnode_get(sample_node); + } + + return (sample_info*) sample_cache[sample_id]; } /**************************************************************************************************** @@ -923,6 +933,8 @@ int sample_del(int sample_id) next_avail_num++; hash_delete_free(SampleHash, sample_node); + sample_cache[ sample_id ] = NULL; + return 1; } diff --git a/veejay-current/veejay-server/libstream/vj-tag.c b/veejay-current/veejay-server/libstream/vj-tag.c index 769c980b..55d2c742 100644 --- a/veejay-current/veejay-server/libstream/vj-tag.c +++ b/veejay-current/veejay-server/libstream/vj-tag.c @@ -72,6 +72,8 @@ static int video_driver_ = -1; // V4lUtils //forward decl static int no_v4l2_threads_ = 0; +static void *tag_cache[SAMPLE_MAX_SAMPLES]; + int _vj_tag_new_net(vj_tag *tag, int stream_nr, int w, int h,int f, char *host, int port, int p, int ty ); int _vj_tag_new_yuv4mpeg(vj_tag * tag, int stream_nr, int w, int h, float fps); @@ -173,13 +175,16 @@ static int int_tag_compare(const void *key1, const void *key2) vj_tag *vj_tag_get(int id) { if (id <= 0 || id > this_tag_id) { - return NULL; + return NULL; } - hnode_t *tag_node = hash_lookup(TagHash, (void *) id); - if (!tag_node) { - return NULL; + if( tag_cache[ id ] == NULL ) { + hnode_t *tag_node = hash_lookup(TagHash, (void *) id); + if (!tag_node) { + return NULL; + } + tag_cache[ id ] = hnode_get(tag_node); } - return (vj_tag *) hnode_get(tag_node); + return (vj_tag*) tag_cache[id]; } int vj_tag_put(vj_tag * tag) @@ -296,14 +301,12 @@ int vj_tag_init(int width, int height, int pix_fmt, int video_driver) _temp_buffer[1] = (uint8_t*) vj_malloc(sizeof(uint8_t)*width*height); _temp_buffer[2] = (uint8_t*) vj_malloc(sizeof(uint8_t)*width*height); - + memset( tag_cache,0,sizeof(tag_cache)); + memset( avail_tag, 0, sizeof(avail_tag)); _tmp.uv_width = width; _tmp.uv_height = height/2; _tmp.uv_len = width * (height/2); - for(i=0; i < SAMPLE_MAX_SAMPLES; i++) { - avail_tag[i] = 0; - } #ifdef HAVE_V4L v4lvideo_templ_init(); #endif @@ -1136,6 +1139,9 @@ int _vj_tag_new_unicap( vj_tag * tag, int stream_nr, int width, int height, int #ifdef HAVE_FREETYPE tag->dict = vpn(VEVO_ANONYMOUS_PORT ); #endif + + tag_cache[ tag->id ] = (void*) tag; + return (int)(tag->id); } @@ -1320,6 +1326,8 @@ int vj_tag_del(int id) avail_tag[ next_avail_tag] = id; next_avail_tag++; + tag_cache[ id ] = NULL; + return 1; } diff --git a/veejay-current/veejay-server/libvjmem/vj-x86.c b/veejay-current/veejay-server/libvjmem/vj-x86.c index 56aa353c..99d75756 100644 --- a/veejay-current/veejay-server/libvjmem/vj-x86.c +++ b/veejay-current/veejay-server/libvjmem/vj-x86.c @@ -249,3 +249,55 @@ void *vj_calloc_( size_t size ) veejay_memset(ptr,0,size); return ptr; } + +typedef struct +{ + size_t len; + void *addr; + size_t cur; +} v_simple_pool_t; + +void *vj_simple_pool_init( size_t s ) +{ + v_simple_pool_t *pool = (v_simple_pool_t*) vj_malloc( sizeof(v_simple_pool_t) ); + if(!pool) + return NULL; + void *addr = vj_calloc_( RUP8(s) ); + if(!addr) { + free(pool); + return NULL; + } + pool->addr = addr; + pool->cur = 0; + pool->len = s; + return (void*) pool; +} + +void *vj_simple_pool_alloc( void *ptr, size_t s ) +{ + v_simple_pool_t *pool = (v_simple_pool_t*) ptr; + if( s > pool->len || (pool->cur + s) > pool->len ) { + return NULL; + } + uint8_t *addr = (uint8_t*) pool->addr + RUP8(pool->cur); + + pool->cur += RUP8(s); + + return (void*) ( addr + pool->cur ); +} + +void vj_simple_pool_reset( void *ptr ) +{ + v_simple_pool_t *pool = (v_simple_pool_t*) ptr; + pool->cur = 0; +} + +void vj_simple_pool_free( void *ptr ) +{ + v_simple_pool_t *pool = (v_simple_pool_t*) ptr; + if( pool ) { + if( pool->addr ) + free(pool->addr); + free(pool); + } +} diff --git a/veejay-current/veejay-server/libvjmem/vjmem.h b/veejay-current/veejay-server/libvjmem/vjmem.h index 308647db..03bb2f10 100644 --- a/veejay-current/veejay-server/libvjmem/vjmem.h +++ b/veejay-current/veejay-server/libvjmem/vjmem.h @@ -57,4 +57,8 @@ extern void benchmark_veejay(int w, int h); extern void *vj_hmalloc(size_t sze, const char *name); extern char *vj_strdup(const char *s); extern char *vj_strndup(const char *s, size_t n ); +void vj_simple_pool_free( void *ptr ); +void *vj_simple_pool_alloc( void *ptr, size_t s ); +void *vj_simple_pool_init( size_t s ); +void vj_simple_pool_reset( void *ptr ); #endif diff --git a/veejay-current/veejay-server/libvjnet/vj-server.c b/veejay-current/veejay-server/libvjnet/vj-server.c index 39feb2d1..786d713e 100644 --- a/veejay-current/veejay-server/libvjnet/vj-server.c +++ b/veejay-current/veejay-server/libvjnet/vj-server.c @@ -51,6 +51,7 @@ typedef struct { vj_message *lin_queue; int n_queued; int n_retrieved; + void *pool; } vj_link; typedef struct @@ -62,6 +63,7 @@ typedef struct #define VJ_MAX_PENDING_MSG 768 #define RECV_SIZE (4096) +#define MSG_POOL_SIZE (VJ_MAX_PENDING_MSG * 1000) static void printbuf( FILE *f, uint8_t *buf , int len ) { int i; @@ -586,6 +588,12 @@ int _vj_server_del_client(vj_server * vje, int link_id) Link[link_id]->promote = 0; Link[link_id]->n_queued = 0; Link[link_id]->n_retrieved = 0; + + if( Link[link_id]->pool ) { + vj_simple_pool_free( Link[link_id]->pool ); + Link[link_id]->pool = NULL; + } + return 1; } @@ -656,11 +664,12 @@ int _vj_server_empty_queue(vj_server *vje, int link_id) int i; for( i = 0; i < VJ_MAX_PENDING_MSG; i ++ ) { - if( v[i]->msg ) - free(v[i]->msg); v[i]->msg = NULL; v[i]->len = 0; } + + vj_simple_pool_reset( Link[link_id]->pool ); + Link[link_id]->n_queued = 0; Link[link_id]->n_retrieved = 0; @@ -762,6 +771,14 @@ static int _vj_verify_msg(vj_server *vje,int link_id, char *buf, int buf_len ) return num_msg; } +void vj_server_init_msg_pool(vj_server *vje, int link_id ) +{ + vj_link **Link = (vj_link**) vje->link; + if( Link[link_id]->pool == NULL ) { + Link[link_id]->pool = vj_simple_pool_init( MSG_POOL_SIZE * sizeof(char) ); + } +} + static int _vj_parse_msg(vj_server *vje,int link_id, char *buf, int buf_len ) { int i = 0; @@ -789,9 +806,14 @@ static int _vj_parse_msg(vj_server *vje,int link_id, char *buf, int buf_len ) str_ptr += 4; if(netid > 0 && netid <= 600) { - v[num_msg]->msg = strndup( str_ptr, slen ); //@ '600:;' - v[num_msg]->len = slen; //@ 5 - num_msg++; + v[num_msg]->msg = vj_simple_pool_alloc( Link[link_id]->pool, slen + 1 ); + if( v[num_msg]->msg ) { + //v[num_msg]->msg = strndup( str_ptr, slen ); //@ '600:;' + veejay_memcpy( v[num_msg]->msg, str_ptr, slen ); + v[num_msg]->len = slen; //@ 5 + v[num_msg]->msg[ slen ] = '\0'; + num_msg++; + } } if(num_msg >= VJ_MAX_PENDING_MSG ) @@ -1006,12 +1028,12 @@ void vj_server_shutdown(vj_server *vje) { if(Link[i]->in_use) close(Link[i]->handle); - for( j = 0; j < VJ_MAX_PENDING_MSG; j ++ ) - { - if(Link[i]->m_queue[j]->msg ) - free( Link[i]->m_queue[j]->msg ); +// for( j = 0; j < VJ_MAX_PENDING_MSG; j ++ ) +// { +// if(Link[i]->m_queue[j]->msg ) +// free( Link[i]->m_queue[j]->msg ); //if(Link[i]->m_queue[j] ) free( Link[i]->m_queue[j] ); - } +// } if( Link[i]->lin_queue) free( Link[i]->lin_queue ); diff --git a/veejay-current/veejay-server/libvjnet/vj-server.h b/veejay-current/veejay-server/libvjnet/vj-server.h index c0722394..c85fb9ff 100644 --- a/veejay-current/veejay-server/libvjnet/vj-server.h +++ b/veejay-current/veejay-server/libvjnet/vj-server.h @@ -79,6 +79,8 @@ void vj_server_client_promote( vj_server *vje, int link_id); int vj_server_link_used(vj_server *vje , int link_id); +void vj_server_init_msg_pool(vj_server *vje, int link_id ); + int vj_server_link_can_write( vj_server *vje, int link_id ); int vj_server_link_can_read( vj_server *vje, int link_id); diff --git a/veejay-current/veejay-server/veejay/vj-event.c b/veejay-current/veejay-server/veejay/vj-event.c index 2f328f7b..2c930421 100644 --- a/veejay-current/veejay-server/veejay/vj-event.c +++ b/veejay-current/veejay-server/veejay/vj-event.c @@ -1116,7 +1116,7 @@ void vj_event_parse_bundle(veejay_t *v, char *msg ) char atomic_msg[256]; int found_end_of_msg = 0; int total_msg_len = strlen(msg); - veejay_memset( atomic_msg,0,256 ); + veejay_memset( atomic_msg,0,sizeof(atomic_msg) ); while( (offset+j) < total_msg_len) { if(msg[offset+j] == '}') @@ -1396,7 +1396,7 @@ static char *inline_str_to_str(int flags, char *msg) } else { - char str[255]; + char str[256]; veejay_memset(str,0, sizeof(str) ); if(sscanf( msg, "%s", str ) <= 0 ) return res; @@ -1456,7 +1456,7 @@ int vj_event_parse_msg( void *ptr, char *msg, int msg_len ) return 0; } - /* verify format */ + /* verify format if( msg[3] != 0x3a || msg[msg_len] != ';' ) { veejay_msg(VEEJAY_MSG_ERROR, "Syntax error in VIMS message"); @@ -1471,6 +1471,7 @@ int vj_event_parse_msg( void *ptr, char *msg, int msg_len ) return 0; } } + */ if ( net_id >= VIMS_BUNDLE_START && net_id < VIMS_BUNDLE_END ) { @@ -1519,7 +1520,7 @@ int vj_event_parse_msg( void *ptr, char *msg, int msg_len ) char *str = NULL; int fmt_offset = 1; char *arg_str = NULL; - memset( i_args, 0, sizeof(i_args) ); + veejay_memset( i_args, 0, sizeof(i_args) ); int n = 4; if( msg[msg_len-4] == ';' ) @@ -1612,7 +1613,6 @@ int vj_event_parse_msg( void *ptr, char *msg, int msg_len ) return 0; } - void vj_event_update_remote(void *ptr) { veejay_t *v = (veejay_t*)ptr; @@ -1642,8 +1642,7 @@ void vj_event_update_remote(void *ptr) char *buf = NULL; int len =0; while( ( buf = vj_server_retrieve_msg( v->vjs[VEEJAY_PORT_MAT], 0, buf,&len )) != NULL ) - { - + { vj_event_parse_msg( v, buf,len ); } } @@ -1655,6 +1654,8 @@ void vj_event_update_remote(void *ptr) { if( vj_server_link_can_read( v->vjs[VEEJAY_PORT_CMD], i ) ) { + vj_server_init_msg_pool( v->vjs[VEEJAY_PORT_CMD], i ); // ensure pool is ready + int res = vj_server_update( v->vjs[VEEJAY_PORT_CMD], i ); if(res>0) { @@ -1671,7 +1672,6 @@ void vj_event_update_remote(void *ptr) { _vj_server_del_client( v->vjs[VEEJAY_PORT_CMD], i ); _vj_server_del_client( v->vjs[VEEJAY_PORT_STA], i ); - // _vj_server_del_client( v->vjs[VEEJAY_PORT_DAT], i ); } } } @@ -1688,6 +1688,7 @@ void vj_event_update_remote(void *ptr) int n = 0; int len = 0; char *buf = NULL; + vj_server_init_msg_pool( v->vjs[VEEJAY_PORT_DAT], i ); // ensure pool is ready while( (buf= vj_server_retrieve_msg(v->vjs[VEEJAY_PORT_DAT],i,buf, &len))!= NULL ) { vj_event_parse_msg( v, buf,len ); @@ -1696,15 +1697,12 @@ void vj_event_update_remote(void *ptr) } else if( res <= 0 ) { _vj_server_del_client( v->vjs[VEEJAY_PORT_DAT], i ); - // _vj_server_del_client( v->vjs[VEEJAY_PORT_CMD], i ); - // _vj_server_del_client( v->vjs[VEEJAY_PORT_STA], i ); } } } v->settings->is_dat = 0; - //@ repeat macros if(macro_status_ == 2 && macro_port_ != NULL) { @@ -1724,14 +1722,13 @@ void vj_event_update_remote(void *ptr) void vj_event_commit_bundle( veejay_t *v, int key_num, int key_mod) { char bundle[4096]; - veejay_memset(bundle,0,4096); + veejay_memset(bundle,0,sizeof(bundle)); vj_event_create_effect_bundle(v, bundle, key_num, key_mod ); } #ifdef HAVE_SDL int vj_event_single_fire(void *ptr , SDL_Event event, int pressed) { - SDL_KeyboardEvent *key = &event.key; SDLMod mod = key->keysym.mod; veejay_t *v = (veejay_t*) ptr; @@ -1792,124 +1789,8 @@ int vj_event_single_fire(void *ptr , SDL_Event event, int pressed) } return 1; } - #endif -#ifdef HAVE_GL -void vj_event_single_gl_fire(void *ptr , int mod, int key) -{ - int vims_mod = 0; -#ifndef HAVE_SDL - return; -#else - switch( key ) - { - case 0xff0d: key = SDLK_RETURN; break; - case 0xff1b: key = SDLK_ESCAPE; break; - case 0xffbe: key = SDLK_F1; break; - case 0xffbf: key = SDLK_F2; break; - case 0xffc0: key = SDLK_F3; break; - case 0xffc1: key = SDLK_F4; break; - case 0xffc2: key = SDLK_F5; break; - case 0xffc3: key = SDLK_F6; break; - case 0xffc4: key = SDLK_F7; break; - case 0xffc5: key = SDLK_F8; break; - case 0xffc6: key = SDLK_F9; break; - case 0xffc7: key = SDLK_F10; break; - case 0xffc8: key = SDLK_F11; break; - case 0xffc9: key = SDLK_F12; break; - case 0xff63: key = SDLK_INSERT; break; - case 0xff50: key = SDLK_HOME; break; - case 0xff55: key = SDLK_PAGEUP; break; - case 0xff56: key = SDLK_PAGEDOWN; break; - case 0xff57: key = SDLK_END; break; - case 0xffff: key = SDLK_DELETE;break; - case 0xff08: key = SDLK_BACKSPACE;break; - case 0xff52: key = SDLK_UP; break; - case 0xff53: key = SDLK_RIGHT; break; - case 0xff54: key = SDLK_DOWN; break; - case 0xff51: key = SDLK_LEFT; break; - case 0xffaa: key = SDLK_KP_MULTIPLY; break; - case 0xffb0: key = SDLK_KP0; break; - case 0xffb1: case 0xff9c: key = SDLK_KP1; break; - case 0xffb2: case 0xff99: key = SDLK_KP2; break; - case 0xffb3: case 0xff9b: key = SDLK_KP3; break; - case 0xffb4: case 0xff96: key = SDLK_KP4; break; - case 0xffb5: case 0xff9d: key = SDLK_KP5; break; - case 0xffb6: case 0xff98: key = SDLK_KP6; break; - case 0xffb7: case 0xff95: key = SDLK_KP7; break; - case 0xffb8: case 0xff97: key = SDLK_KP8; break; - case 0xffb9: case 0xff9a: key = SDLK_KP9; break; - case 0xffab: key = SDLK_KP_PLUS; break; - case 0xffad: key = SDLK_KP_MINUS; break; - case 0xff8d: key = SDLK_KP_ENTER; break; - case 0xffaf: key = SDLK_KP_DIVIDE; break; - case 0xff9e: case 0xff9f: key = SDLK_KP_PERIOD; break; - case 65507: key = SDLK_s; mod = 2; break; - default: - if( key > (256+128)) - veejay_msg(VEEJAY_MSG_DEBUG, "\tUnknown key pressed %x, mod = %d", key, mod ); - break; - - } - switch( mod ) - { - case 1: - case 17: - vims_mod = VIMS_MOD_SHIFT; break; - case 4: - case 20: - vims_mod = VIMS_MOD_CTRL; break; - case 8: - case 24: - case 144: - vims_mod = VIMS_MOD_ALT; break; - default: - veejay_msg(VEEJAY_MSG_DEBUG, "\tUnknown modifier pressed %x, mod = %d", key , mod ); - break; - - } - - - int vims_key = key; - int index = vims_mod * SDLK_LAST + vims_key; - - vj_keyboard_event *ev = get_keyboard_event( index ); - if(!ev ) - { - veejay_msg(VEEJAY_MSG_ERROR,"Keyboard event %d unknown", index ); - return; - } - - // event_id is here VIMS list entry! - int event_id = ev->vims->list_id; - - if( event_id >= VIMS_BUNDLE_START && event_id < VIMS_BUNDLE_END ) - { - vj_msg_bundle *bun = vj_event_bundle_get(event_id ); - if(!bun) - { - veejay_msg(VEEJAY_MSG_DEBUG, "Requested BUNDLE %d does not exist", event_id); - return; - } - vj_event_parse_bundle( (veejay_t*) ptr, bun->bundle ); - } - else - { - char msg[100]; - if( ev->arg_len > 0 ) - { - sprintf(msg,"%03d:%s;", event_id, ev->arguments ); - } - else - sprintf(msg,"%03d:;", event_id ); - vj_event_parse_msg( (veejay_t*) ptr, msg,strlen(msg) ); - } -#endif -} - - -#endif void vj_event_none(void *ptr, const char format[], va_list ap) { veejay_msg(VEEJAY_MSG_DEBUG, "No action implemented for requested event"); @@ -2105,7 +1986,7 @@ void vj_event_xml_parse_config( veejay_t *v, xmlDocPtr doc, xmlNodePtr cur ) int c = 0; char sample_list[1024]; - veejay_memset(sample_list,0,1024); + veejay_memset(sample_list,0,sizeof(sample_list)); // todo: editlist loading ; veejay restart while( cur != NULL ) @@ -2157,7 +2038,7 @@ void vj_event_xml_new_keyb_event( void *ptr, xmlDocPtr doc, xmlNodePtr cur ) int event_id = 0; char msg[4096]; - veejay_memset(msg,0,4096); + veejay_memset(msg,0,sizeof(msg)); while( cur != NULL ) { @@ -2283,7 +2164,7 @@ void vj_event_format_xml_event( xmlNodePtr node, int event_id ) int key_id=0; int key_mod=-1; - veejay_memset( buffer,0, 4096 ); + veejay_memset( buffer,0, sizeof(buffer) ); if( event_id >= VIMS_BUNDLE_START && event_id < VIMS_BUNDLE_END) { /* its a Bundle !*/ @@ -4538,9 +4419,6 @@ void vj_event_sample_rec_start( void *ptr, const char format[], va_list ap) return; } - veejay_memset(tmp,0,255); - veejay_memset(prefix,0,150); - if( !v->seq->active ) { sample_get_description(v->uc->sample_id, prefix ); @@ -6784,7 +6662,6 @@ void vj_event_el_save_editlist(void *ptr, const char format[], va_list ap) { veejay_t *v = (veejay_t*)ptr; char str[1024]; - veejay_memset(str,0,1024); int args[2] = {0,0}; P_A(args,str,format,ap); if( STREAM_PLAYING(v) || PLAIN_PLAYING(v) ) @@ -7186,9 +7063,8 @@ void vj_event_vp_stack( void *ptr, const char format[], va_list ap ) void vj_event_vp_set_points( void *ptr, const char format[], va_list ap ) { - int args[4]; + int args[4] = { 0,0,0,0 }; veejay_t *v = (veejay_t*)ptr; - veejay_memset(args,0,sizeof(args)); char *str = NULL; P_A(args,str,format,ap); @@ -7225,16 +7101,14 @@ void vj_event_v4l_get_info(void *ptr, const char format[] , va_list ap) if(args[0]==0) args[0] = v->uc->sample_id; if(args[0]==-1) args[0] = vj_tag_size()-1; - char send_msg[33]; - char message[30]; - veejay_memset(send_msg, 0,sizeof(send_msg)); + char send_msg[64]; + char message[64]; sprintf( send_msg, "000" ); if(vj_tag_exists(args[0])) { - int values[6]; - memset(values,0,6*sizeof(int)); + int values[6] = { 0,0,0,0,0,0 }; if(vj_tag_get_v4l_properties( args[0], &values[0], &values[1], &values[2], &values[3], &values[4])) { sprintf(message, "%05d%05d%05d%05d%05d%05d", @@ -7473,7 +7347,6 @@ void vj_event_tag_set_format(void *ptr, const char format[], va_list ap) veejay_t *v = (veejay_t*) ptr; int args[2]; char str[255]; - veejay_memset(str,0,255); P_A(args,str,format,ap); if(v->settings->tag_record || v->settings->offline_record) @@ -8025,22 +7898,24 @@ void vj_event_print_tag_info(veejay_t *v, int id) void vj_event_create_effect_bundle(veejay_t * v, char *buf, int key_id, int key_mod ) { - char blob[50 * SAMPLE_MAX_EFFECTS]; char prefix[20]; int i ,y,j; int num_cmd = 0; int id = v->uc->sample_id; int event_id = 0; int bunlen=0; - veejay_memset(prefix,0,20); - veejay_memset(blob,0,50*SAMPLE_MAX_EFFECTS ); - + if(!SAMPLE_PLAYING(v) && !STREAM_PLAYING(v)) { veejay_msg(VEEJAY_MSG_ERROR, "Cannot take snapshot of Effect Chain"); return; } + char *blob = get_print_buf( 50 * SAMPLE_MAX_EFFECTS ); + if(!blob) { + return; + } + for (i = 0; i < SAMPLE_MAX_EFFECTS; i++) { y = (SAMPLE_PLAYING(v) ? sample_get_effect_any(id, i) : vj_tag_get_effect_any(id,i) ); @@ -8051,7 +7926,8 @@ void vj_event_create_effect_bundle(veejay_t * v, char *buf, int key_id, int key_ } if(num_cmd < 0) { - veejay_msg(VEEJAY_MSG_ERROR, "Effect Chain is empty." ); + veejay_msg(VEEJAY_MSG_ERROR, "Effect Chain is empty." ); + free(blob); return; } @@ -8092,6 +7968,7 @@ void vj_event_create_effect_bundle(veejay_t * v, char *buf, int key_id, int key_ if(event_id <= 0 ) { veejay_msg(VEEJAY_MSG_ERROR, "Cannot add more bundles"); + free(blob); return; } @@ -8099,10 +7976,13 @@ void vj_event_create_effect_bundle(veejay_t * v, char *buf, int key_id, int key_ if(!m) { veejay_msg(VEEJAY_MSG_ERROR, "Unable to create new Bundle"); + free(blob); return; } if(!vj_event_bundle_store(m)) veejay_msg(VEEJAY_MSG_ERROR, "Error storing Bundle %d", event_id); + + free(blob); } @@ -8295,8 +8175,6 @@ void vj_event_send_tag_list ( void *ptr, const char format[], va_list ap ) vj_tag *tag = vj_tag_get(i); char source_name[255]; char cmd[300]; - veejay_memset(source_name,0,200);veejay_memset(cmd,0,255); - veejay_memset(line,0,300); //vj_tag_get_description( i, source_name ); vj_tag_get_source_name( i, source_name ); sprintf(line,"%05d%02d%03d%03d%03d%03d%03zu%s", @@ -8702,8 +8580,6 @@ void vj_event_send_sample_list ( void *ptr, const char format[], va_list ap ) char description[SAMPLE_MAX_DESCR_LEN]; int end_frame = sample_get_endFrame(i); int start_frame = sample_get_startFrame(i); - veejay_memset(cmd,0, sizeof(cmd)); - /* format of sample: 00000 : id 000000000 : start @@ -8801,7 +8677,6 @@ void vj_event_send_chain_entry ( void *ptr, const char format[], va_list ap ) int error = 1; veejay_t *v = (veejay_t*)ptr; P_A(args,str,format,ap); - veejay_memset(fline,0,255); sprintf(line, "%03d", 0); char param[1024]; @@ -8914,8 +8789,6 @@ void vj_event_send_chain_entry_parameters ( void *ptr, const char format[], va_ int error = 1; veejay_t *v = (veejay_t*)ptr; - veejay_memset(line,0,sizeof(line)); - P_A(args,str,format,ap); sprintf(line, "%03d", 0); @@ -9251,7 +9124,6 @@ void vj_event_send_effect_list ( void *ptr, const char format[], va_list ap ) len += vj_effect_get_summary_len( i ); priv_msg = (char*) malloc(sizeof(char) * (6 + len + 4096)); - memset(priv_msg, 0, (6+len+100)); sprintf(priv_msg, "%06d", len ); char line[4096]; char fline[4096]; @@ -9386,7 +9258,6 @@ void vj_event_bundled_msg_add(void *ptr, const char format[], va_list ap) int args[2] = {0,0}; char s[1024]; - veejay_memset(s,0, 1024); P_A(args,s,format,ap); if(args[0] == 0) @@ -9471,13 +9342,10 @@ void vj_event_screenshot(void *ptr, const char format[], va_list ap) { int args[4]; char filename[1024]; - veejay_memset(filename,0,1024); P_A(args, filename, format, ap ); veejay_t *v = (veejay_t*) ptr; - char type[5]; - veejay_memset(type,0,5); - + char type[5] = { 0 }; veejay_get_file_ext( filename, type, sizeof(type)); @@ -9497,7 +9365,6 @@ void vj_event_screenshot(void *ptr, const char format[], va_list ap) { int args[4]; char filename[1024]; - veejay_memset(filename,0,1024); P_A(args, filename, format, ap ); veejay_t *v = (veejay_t*) ptr; @@ -9595,9 +9462,6 @@ void vj_event_send_sample_options ( void *ptr, const char format[], va_list ap ) id = args[0]; char options[100]; char prefix[4]; - veejay_memset(prefix,0, 4 ); - veejay_memset(options, 0,100); - char *s_print_buf = get_print_buf(128); @@ -9737,8 +9601,8 @@ void vj_event_set_shm_status( void *ptr, const char format[], va_list ap ) void vj_event_get_shm( void *ptr, const char format[], va_list ap ) { veejay_t *v = (veejay_t*)ptr; - char tmp[64]; - memset(tmp,0,sizeof(tmp)); + char tmp[32]; + veejay_memset(tmp,0,sizeof(tmp)); if(!v->shm) { snprintf(tmp,sizeof(tmp)-1,"%016d",0); SEND_MSG(v, tmp ); @@ -10098,7 +9962,6 @@ void vj_event_add_subtitle( void *ptr, const char format[], va_list ap ) return; } - veejay_memset(text,0,2048); P_A(args,text,format,ap); void *dict = select_dict( v, v->uc->sample_id ); diff --git a/veejay-current/veejay-server/veejay/vj-perform.c b/veejay-current/veejay-server/veejay/vj-perform.c index 6e8081a8..4936596b 100644 --- a/veejay-current/veejay-server/veejay/vj-perform.c +++ b/veejay-current/veejay-server/veejay/vj-perform.c @@ -522,19 +522,17 @@ static int vj_perform_increase_sample_frame(veejay_t * info, long num) static long vj_perform_alloc_row(veejay_t *info, int c, int plane_len) { - const long frame_len = RUP8( ((plane_len+helper_frame->width)/7)*8 ); - uint8_t *buf; - if(fx_chain_buffer!=NULL) { - buf = fx_chain_buffer + (c * frame_len * 3 * 3); - } - else { - buf = vj_malloc(sizeof(uint8_t) * frame_len * 3 * 3); - mlock( buf, frame_len * 3 * sizeof(uint8_t)); - } + if( fx_chain_buffer ) + return; + + size_t frame_len = RUP8( ((plane_len+helper_frame->width)/7)*8 ); + uint8_t *buf = vj_malloc(sizeof(uint8_t) * frame_len * 3 * 3); if(!buf) return 0; + mlock( buf, frame_len * 3 * 3 * sizeof(uint8_t)); + frame_buffer[c]->Y = buf; frame_buffer[c]->Cb = frame_buffer[c]->Y + frame_len; frame_buffer[c]->Cr = frame_buffer[c]->Cb + frame_len; @@ -545,14 +543,15 @@ static long vj_perform_alloc_row(veejay_t *info, int c, int plane_len) static void vj_perform_free_row(int c) { - const long frame_len = RUP8( (((helper_frame->len)+helper_frame->width)/7)*8 ); + if( fx_chain_buffer ) + return; + + size_t frame_len = RUP8( (((helper_frame->len)+helper_frame->width)/7)*8 ); if(frame_buffer[c]->Y) { - if(fx_chain_buffer == NULL ) { - munlock( frame_buffer[c]->Y, frame_len * 3 * 3 ); - free( frame_buffer[c]->Y ); - } + munlock( frame_buffer[c]->Y, frame_len * 3 * 3 * sizeof(uint8_t)); + free( frame_buffer[c]->Y ); } frame_buffer[c]->Y = NULL; frame_buffer[c]->Cb = NULL; @@ -564,12 +563,14 @@ static void vj_perform_free_row(int c) } #define vj_perform_row_used(c) ( frame_buffer[c]->Y == NULL ? 0 : 1 ) - static int vj_perform_verify_rows(veejay_t *info ) { if( pvar_.fx_status == 0 ) return 0; + if( fx_chain_buffer ) + return 1; + int c,v,has_rows = 0; const int w = info->video_output_width; const int h = info->video_output_height; @@ -724,15 +725,6 @@ int vj_perform_init(veejay_t * info) total_used += buf_len; //temp_buffer total_used += buf_len; //feedback_buffer - /* allocate space for frame_buffer pointers */ - for (c = 0; c < SAMPLE_MAX_EFFECTS; c++) { - frame_buffer[c] = (ycbcr_frame *) - vj_calloc(sizeof(ycbcr_frame)); - if(!frame_buffer[c]) return 0; - } - - vj_perform_clear_cache(); - veejay_memset( frame_info[0],0,SAMPLE_MAX_EFFECTS); helper_frame = (VJFrame*) vj_malloc(sizeof(VJFrame)); veejay_memcpy(helper_frame, info->effect_frame1, sizeof(VJFrame)); @@ -754,6 +746,25 @@ int vj_perform_init(veejay_t * info) */ } + /* allocate space for frame_buffer pointers */ + for (c = 0; c < SAMPLE_MAX_EFFECTS; c++) { + frame_buffer[c] = (ycbcr_frame *) + vj_calloc(sizeof(ycbcr_frame)); + if(!frame_buffer[c]) return 0; + + if(fx_chain_buffer != NULL ) { + uint8_t *ptr = fx_chain_buffer + (c * frame_len * 3 * 3 ); + frame_buffer[c]->Y = ptr; + frame_buffer[c]->Cb = frame_buffer[c]->Y + frame_len; + frame_buffer[c]->Cr = frame_buffer[c]->Cb + frame_len; + frame_buffer[c]->P0 = ptr + (frame_len * 3); + frame_buffer[c]->P1 = frame_buffer[c]->P0 + (frame_len*3); + } + } + + vj_perform_clear_cache(); + veejay_memset( frame_info[0],0,SAMPLE_MAX_EFFECTS); + veejay_msg(VEEJAY_MSG_INFO, "Using %.2f MB RAM in performer (memory %s paged to the swap area, %.2f MB pre-allocated for fx-chain)", ((float)total_used/1048576.0f), @@ -3421,8 +3432,8 @@ int vj_perform_queue_video_frame(veejay_t *info, const int skip_incr) cached_sample_frames[0] = info->uc->sample_id; if(vj_perform_verify_rows(info)) - vj_perform_sample_complete_buffers(info, &is444); - + vj_perform_sample_complete_buffers(info, &is444); + cur_out = vj_perform_render_magic( info, info->settings ); res = 1; @@ -3450,6 +3461,7 @@ int vj_perform_queue_video_frame(veejay_t *info, const int skip_incr) { if(vj_perform_verify_rows(info)) vj_perform_tag_complete_buffers(info, &is444); + cur_out = vj_perform_render_magic( info, info->settings ); } res = 1;