struct mlt_transition_s parent;
char *filename;
int width;
- int height;
+ int height;
double *bitmap;
}
transition_luma;
return 0;
}
+static int transition_get_audio( mlt_frame frame, int16_t **buffer, mlt_audio_format *format, int *frequency, int *channels, int *samples )
+{
+ // Get the properties of the a frame
+ mlt_properties a_props = mlt_frame_properties( frame );
+
+ // Get the b frame from the stack
+ mlt_frame b_frame = mlt_frame_pop_frame( frame );
+
+ // Get the properties of the b frame
+ mlt_properties b_props = mlt_frame_properties( b_frame );
+
+ // Restore the original get_audio
+ frame->get_audio = mlt_properties_get_data( a_props, "get_audio", NULL );
+
+ double mix = 0;
+ if ( mlt_properties_get( b_props, "mix" ) != NULL )
+ mix = mlt_properties_get_double( b_props, "mix" );
+ mlt_frame_mix_audio( frame, b_frame, mix, buffer, format, frequency, channels, samples );
+
+ // Push the b_frame back on for get_image
+ mlt_frame_push_frame( frame, b_frame );
+
+ return 0;
+}
+
/** Load the luma map from PGM stream.
*/
// If the filename property changed, reload the map
char *luma_file = mlt_properties_get( properties, "filename" );
- if ( luma_file != NULL && luma_file != this->filename )
+ if ( luma_file != NULL && ( this->filename == NULL || ( this->filename && strcmp( luma_file, this->filename ) ) ) )
{
int width = mlt_properties_get_int( b_props, "width" );
int height = mlt_properties_get_int( b_props, "height" );
char command[ 512 ];
- char *ext = strrchr( luma_file, '.' );
FILE *pipe;
command[ 511 ] = '\0';
- this->filename = luma_file;
+ if ( this->filename )
+ free( this->filename );
+ this->filename = strdup( luma_file );
snprintf( command, 511, "anytopnm %s | pnmscale -width %d -height %d", luma_file, width, height );
- pipe = popen( command, "r" );
+ //pipe = popen( command, "r" );
+ pipe = fopen( luma_file, "r" );
if ( pipe != NULL )
{
+ if ( this->bitmap )
+ free( this->bitmap );
luma_read_pgm( pipe, &this->bitmap, &this->width, &this->height );
- pclose( pipe );
+ //pclose( pipe );
+ fclose( pipe );
}
}
// Determine the time position of this frame in the transition duration
- mlt_timecode in = mlt_transition_get_in( transition );
- mlt_timecode out = mlt_transition_get_out( transition );
- mlt_timecode time = mlt_frame_get_timecode( b_frame );
- double pos = ( time - in ) / ( out - in );
+ mlt_position in = mlt_transition_get_in( transition );
+ mlt_position out = mlt_transition_get_out( transition );
+ mlt_position time = mlt_frame_get_position( b_frame );
+ double pos = ( (double)time - (double)in ) / ( (double)out - (double)in + 1 );
// Set the b frame properties
mlt_properties_set_double( b_props, "mix", pos );
mlt_frame_push_get_image( a_frame, transition_get_image );
mlt_frame_push_frame( a_frame, b_frame );
+
+/************************ AUDIO ***************************/
+#if 1
+ // Backup the original get_audio (it's still needed)
+ mlt_properties_set_data( mlt_frame_properties( a_frame ), "get_audio", a_frame->get_audio, 0, NULL, NULL );
+
+ // Override the get_audio method
+ a_frame->get_audio = transition_get_audio;
+#endif
return a_frame;
}
if ( this->bitmap )
free( this->bitmap );
- parent->close = NULL;
- mlt_transition_close( parent );
+ if ( this->filename )
+ free( this->filename );
+
free( this );
}