fix FX Anim

This commit is contained in:
niels
2014-11-23 15:28:30 +01:00
parent 8424198af0
commit 63c563fb44
5 changed files with 51 additions and 58 deletions

View File

@@ -2084,7 +2084,7 @@ void on_curve_buttonstore_clicked(GtkWidget *widget, gpointer user_data )
int end = get_nums( "curve_spinend" ); int end = get_nums( "curve_spinend" );
int start = get_nums( "curve_spinstart" ); int start = get_nums( "curve_spinstart" );
const int length = end - start + 1; const int length = end - start;
if( (length) <= 0 || id <= 0 ) if( (length) <= 0 || id <= 0 )
@@ -2107,53 +2107,41 @@ void on_curve_buttonstore_clicked(GtkWidget *widget, gpointer user_data )
type = GTK_CURVE_TYPE_FREE; type = GTK_CURVE_TYPE_FREE;
} }
float *data = (float*) vj_calloc(sizeof(float) * length );
int *values = (int*) vj_calloc(sizeof(int) * length );
unsigned char *kkf = (unsigned char*) vj_calloc( (length*4) + 64);
unsigned char *buf = (unsigned char*) vj_calloc( (length*4) + 64 );
int min=0,max=0; int min=0,max=0;
float *data = (float*) vj_calloc( sizeof(float) * length );
unsigned char *kf = kkf; //@ reserve space for header _effect_get_minmax( id, &min, &max,j );
_effect_get_minmax( id, &min,&max,j ); get_points_from_curve( curve, length, data );
char header[34];
int msg_len = 25 + (4*length); /*K00000000 */
snprintf(header,sizeof(header), "K%08dkey%02d%02d%08d%08d%02d",msg_len,i,j,start,end,type );
char *buf = (char*) vj_calloc( sizeof(char) * msg_len + 9 );
strncpy( buf, header, sizeof(header));
char *ptr = buf + sizeof(header);
int k; int k;
get_points_from_curve( curve, length, data );
for( k = 0 ; k < length ; k++ ) { for( k = 0 ; k < length ; k++ ) {
values[k] = (int) ( (float) min + ( data[k] * ((float) max) )); int pval = (int) ( (float) min + ( data[k] * ((float) max) ));
} ptr[0] = pval & 0xff;
int row_len = 3 + 2 + 2 + 8 + 8 + 2; ptr[1] = (pval >> 8) & 0xff;
sprintf( (char*)kf, "key%02d%02d%08d%08d%02d",i,j,start,end,type ); ptr[2] = (pval >> 16) & 0xff;
unsigned char *ptr = kkf + row_len; ptr[3] = (pval >> 24) & 0xff;
int total_len = row_len;
for( k = 0; k < length; k ++ ) ptr += 4;
{ veejay_msg( VEEJAY_MSG_DEBUG, "(%d/%d) FX set value %d on frame %d",k,length,pval, start+k );
unsigned char *p = ptr + (k*4);
p[0] = values[k] & 0xff;
p[1] = (values[k] >> 8) & 0xff;
p[2] = (values[k] >> 16) & 0xff;
p[3] = (values[k] >> 24) & 0xff;
total_len += 4;
veejay_msg( VEEJAY_MSG_DEBUG, "(%d/%d) FX set value %d on frame %d",k,length,values[k], start+k );
} }
free(values); vj_client_send_buf( info->client, V_CMD, buf, msg_len + 9 );
free(data);
sprintf( buf, "K%08d", total_len );
memcpy( buf + 9 , kkf, total_len );
vj_client_send_buf( info->client, V_CMD, buf,total_len );
free(kkf);
free(buf);
vj_msg( VEEJAY_MSG_INFO, "Saved new animation for parameter %d on entry %d, start at frame %d and end at frame %d",j,i,start,end ); vj_msg( VEEJAY_MSG_INFO, "Saved new animation for parameter %d on entry %d, start at frame %d and end at frame %d",j,i,start,end );
free(buf);
free(data);
} }
void on_curve_buttonclear_clicked(GtkWidget *widget, gpointer user_data) void on_curve_buttonclear_clicked(GtkWidget *widget, gpointer user_data)

View File

@@ -49,19 +49,16 @@ int set_points_in_curve_ext( GtkWidget *curve, unsigned char *blob, int id, int
int start = 0, end =0,type=0; int start = 0, end =0,type=0;
int entry = 0; int entry = 0;
int n = sscanf( (char*) blob, "key%2d%2d%8d%8d%2d", &entry, &parameter_id, &start, &end,&type ); int n = sscanf( (char*) blob, "key%2d%2d%8d%8d%2d", &entry, &parameter_id, &start, &end,&type );
int len = end - start + 1; int len = end - start;
int i; int i;
int min = 0, max = 0; int min = 0, max = 0;
#ifdef STRICT_CHECKING #ifdef STRICT_CHECKING
assert( fx_entry == entry ); assert( fx_entry == entry );
#endif #endif
if( len <= 0 ) if(n != 5 || len <= 0 )
return -1;
if(n != 5 )
{ {
veejay_msg(0, "Error parsing KF headeR"); veejay_msg(0, "Error parsing FX Anim KF header");
return -1; return -1;
} }
@@ -69,18 +66,18 @@ int set_points_in_curve_ext( GtkWidget *curve, unsigned char *blob, int id, int
unsigned int k = 0; unsigned int k = 0;
unsigned char *in = blob + 25; unsigned char *in = blob + 25;
float *vec = (float*) vj_calloc(sizeof(float) * (len+1) ); float *vec = (float*) vj_calloc(sizeof(float) * len );
for(i = start ; i <= end; i ++ ) for(i = start ; i < end; i ++ )
{ {
unsigned char *ptr = in + (i * 4); unsigned char *ptr = in + (k * 4);
int value = int value =
( ptr[0] | (ptr[1] << 8) | (ptr[2] << 16) | (ptr[3] << 24) ); ( ptr[0] | (ptr[1] << 8) | (ptr[2] << 16) | (ptr[3] << 24) );
float top = 1.0 / (float) max; float top = 1.0 / (float) max;
float val = (float)value * top; float val = (float) min + ( (float)value * top );
veejay_msg(4, "FX position %d, value %d", i, value ); veejay_msg(4, "Load FX Anim position %d, value %f", i, val );
vec[k] = val; vec[k] = val;
k++; k++;

View File

@@ -1250,7 +1250,6 @@ int sample_get_all_effect_arg(int s1, int position, int *args, int arg_len, int
int tmp = 0; int tmp = 0;
if(!get_keyframe_value( sample->effect_chain[position]->kf, n_frame, i, &tmp ) ) { if(!get_keyframe_value( sample->effect_chain[position]->kf, n_frame, i, &tmp ) ) {
args[i] = sample->effect_chain[position]->arg[i]; args[i] = sample->effect_chain[position]->arg[i];
veejay_msg(4, "%d - FX [%d] P%d : %d", n_frame,position, i, args[i] );
} }
else { else {
args[i] = tmp; args[i] = tmp;

View File

@@ -808,6 +808,8 @@ static int _vj_verify_msg(vj_server *vje,int link_id, char *buf, int buf_len )
return 0; return 0;
} }
i += 9;
} else { } else {
veejay_msg(0, "parse error."); veejay_msg(0, "parse error.");
return 0; return 0;
@@ -890,6 +892,7 @@ static int _vj_parse_msg(vj_server *vje,int link_id, char *buf, int buf_len )
v[num_msg]->msg = (char*) vj_malloc( sizeof(char) * slen ); v[num_msg]->msg = (char*) vj_malloc( sizeof(char) * slen );
memcpy( v[num_msg]->msg, str_ptr, slen ); memcpy( v[num_msg]->msg, str_ptr, slen );
v[num_msg]->len = slen; v[num_msg]->len = slen;
num_msg++; num_msg++;
i += ( 9 + slen ); i += ( 9 + slen );

View File

@@ -98,7 +98,7 @@ unsigned char *keyframe_pack( void *port, int parameter_id, int entry_id, int *r
free(k_e); free(k_e);
free(k_t); free(k_t);
int len = end - start + 1; int len = end - start;
result = vj_calloc( (len*4) + 64 ); result = vj_calloc( (len*4) + 64 );
@@ -106,7 +106,7 @@ unsigned char *keyframe_pack( void *port, int parameter_id, int entry_id, int *r
unsigned char *out = result + 25; unsigned char *out = result + 25;
for( i = start; i <= end; i ++ ) for( i = start; i < end; i ++ )
{ {
char *key = keyframe_id( parameter_id, i ); char *key = keyframe_id( parameter_id, i );
int value = 0; int value = 0;
@@ -147,6 +147,8 @@ unsigned char *keyframe_pack( void *port, int parameter_id, int entry_id, int *r
veejay_msg(VEEJAY_MSG_DEBUG, "KF %p pack: range=%d-%d, FX entry %d, P%d, type %d", veejay_msg(VEEJAY_MSG_DEBUG, "KF %p pack: range=%d-%d, FX entry %d, P%d, type %d",
port,start,end, entry_id,parameter_id, type ); port,start,end, entry_id,parameter_id, type );
vevo_port_dump( port, 0 );
return result; return result;
} }
@@ -169,15 +171,12 @@ int keyframe_unpack( unsigned char *in, int len, int *entry, int lookup, int is
in += (25); in += (25);
unsigned char *ptr = in; unsigned char *ptr = in;
for(i = start ; i <= end; i ++ ) for(i = start ; i < end; i ++ )
{ {
int value = int value =
( ptr[0] | (ptr[1] << 8) | (ptr[2] << 16) | (ptr[3] << 24) ); ( ptr[0] | (ptr[1] << 8) | (ptr[2] << 16) | (ptr[3] << 24) );
char *key = keyframe_id( parameter_id, i ); char *key = keyframe_id( parameter_id, i );
vevo_property_set( port, key, VEVO_ATOM_TYPE_INT, 1, &value ); vevo_property_set( port, key, VEVO_ATOM_TYPE_INT, 1, &value );
#ifdef STRICT_CHECKING
veejay_msg(VEEJAY_MSG_DEBUG, "Parameter %d at pos %d has value %d", parameter_id, i, value );
#endif
ptr += 4; ptr += 4;
free(key); free(key);
} }
@@ -196,6 +195,8 @@ int keyframe_unpack( unsigned char *in, int len, int *entry, int lookup, int is
*entry = fx_entry; *entry = fx_entry;
vevo_port_dump(port, 0 );
return 1; return 1;
} }
@@ -269,7 +270,7 @@ int keyframe_xml_pack( xmlNodePtr node, void *port, int parameter_id )
snprintf(xmlbuf, 100,"%d", type ); snprintf(xmlbuf, 100,"%d", type );
xmlNewChild(node, NULL, (const xmlChar*) k_t, xmlbuf ); xmlNewChild(node, NULL, (const xmlChar*) k_t, xmlbuf );
for( i = start; i <= end; i ++ ) for( i = start; i < end; i ++ )
{ {
char *key = keyframe_id( parameter_id, i ); char *key = keyframe_id( parameter_id, i );
int value = 0; int value = 0;
@@ -376,8 +377,13 @@ int get_keyframe_value(void *port, int n_frame, int parameter_id, int *result )
char *key = keyframe_id( parameter_id, n_frame ); char *key = keyframe_id( parameter_id, n_frame );
int error = vevo_property_get( port, key, 0, result ); int error = vevo_property_get( port, key, 0, result );
if( error != VEVO_NO_ERROR ) if( error != VEVO_NO_ERROR ) {
free(key);
return 0; return 0;
}
free(key);
return 1; return 1;
} }