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 start = get_nums( "curve_spinstart" );
const int length = end - start + 1;
const int length = end - start;
if( (length) <= 0 || id <= 0 )
@@ -2107,53 +2107,41 @@ void on_curve_buttonstore_clicked(GtkWidget *widget, gpointer user_data )
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;
unsigned char *kf = kkf; //@ reserve space for header
_effect_get_minmax( id, &min,&max,j );
float *data = (float*) vj_calloc( sizeof(float) * length );
_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;
get_points_from_curve( curve, length, data );
for( k = 0 ; k < length ; k++ ) {
values[k] = (int) ( (float) min + ( data[k] * ((float) max) ));
}
int row_len = 3 + 2 + 2 + 8 + 8 + 2;
sprintf( (char*)kf, "key%02d%02d%08d%08d%02d",i,j,start,end,type );
unsigned char *ptr = kkf + row_len;
int total_len = row_len;
int pval = (int) ( (float) min + ( data[k] * ((float) max) ));
ptr[0] = pval & 0xff;
ptr[1] = (pval >> 8) & 0xff;
ptr[2] = (pval >> 16) & 0xff;
ptr[3] = (pval >> 24) & 0xff;
for( k = 0; k < length; 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 );
ptr += 4;
veejay_msg( VEEJAY_MSG_DEBUG, "(%d/%d) FX set value %d on frame %d",k,length,pval, start+k );
}
free(values);
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_client_send_buf( info->client, V_CMD, buf, msg_len + 9 );
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)

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 entry = 0;
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 min = 0, max = 0;
#ifdef STRICT_CHECKING
assert( fx_entry == entry );
#endif
if( len <= 0 )
return -1;
if(n != 5 )
if(n != 5 || len <= 0 )
{
veejay_msg(0, "Error parsing KF headeR");
veejay_msg(0, "Error parsing FX Anim KF header");
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 char *in = blob + 25;
float *vec = (float*) vj_calloc(sizeof(float) * (len+1) );
for(i = start ; i <= end; i ++ )
float *vec = (float*) vj_calloc(sizeof(float) * len );
for(i = start ; i < end; i ++ )
{
unsigned char *ptr = in + (i * 4);
unsigned char *ptr = in + (k * 4);
int value =
( ptr[0] | (ptr[1] << 8) | (ptr[2] << 16) | (ptr[3] << 24) );
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;
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;
if(!get_keyframe_value( sample->effect_chain[position]->kf, n_frame, i, &tmp ) ) {
args[i] = sample->effect_chain[position]->arg[i];
veejay_msg(4, "%d - FX [%d] P%d : %d", n_frame,position, i, args[i] );
}
else {
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;
}
i += 9;
} else {
veejay_msg(0, "parse error.");
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 );
memcpy( v[num_msg]->msg, str_ptr, slen );
v[num_msg]->len = slen;
num_msg++;
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_t);
int len = end - start + 1;
int len = end - start;
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;
for( i = start; i <= end; i ++ )
for( i = start; i < end; i ++ )
{
char *key = keyframe_id( parameter_id, i );
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",
port,start,end, entry_id,parameter_id, type );
vevo_port_dump( port, 0 );
return result;
}
@@ -169,15 +171,12 @@ int keyframe_unpack( unsigned char *in, int len, int *entry, int lookup, int is
in += (25);
unsigned char *ptr = in;
for(i = start ; i <= end; i ++ )
for(i = start ; i < end; i ++ )
{
int value =
( ptr[0] | (ptr[1] << 8) | (ptr[2] << 16) | (ptr[3] << 24) );
char *key = keyframe_id( parameter_id, i );
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;
free(key);
}
@@ -196,6 +195,8 @@ int keyframe_unpack( unsigned char *in, int len, int *entry, int lookup, int is
*entry = fx_entry;
vevo_port_dump(port, 0 );
return 1;
}
@@ -269,7 +270,7 @@ int keyframe_xml_pack( xmlNodePtr node, void *port, int parameter_id )
snprintf(xmlbuf, 100,"%d", type );
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 );
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 );
int error = vevo_property_get( port, key, 0, result );
if( error != VEVO_NO_ERROR )
if( error != VEVO_NO_ERROR ) {
free(key);
return 0;
}
free(key);
return 1;
}