X-Git-Url: http://research.m1stereo.tv/gitweb?a=blobdiff_plain;f=src%2Fmodules%2Fffmpeg%2Ffilter_ffmpeg_dub.c;h=0d678af208ea9720e96eca0499af70f085002eb5;hb=9410dbbb99a6736f4bc043b390cddd43fdfd48ea;hp=3ba9932fe0ac1db93318fb107e10774b3780e844;hpb=35aa3217c6ad838d1612875e3efdb0c99e4fd639;p=melted diff --git a/src/modules/ffmpeg/filter_ffmpeg_dub.c b/src/modules/ffmpeg/filter_ffmpeg_dub.c index 3ba9932..0d678af 100644 --- a/src/modules/ffmpeg/filter_ffmpeg_dub.c +++ b/src/modules/ffmpeg/filter_ffmpeg_dub.c @@ -38,22 +38,25 @@ static int filter_get_audio( mlt_frame frame, int16_t **buffer, mlt_audio_format mlt_properties producer_properties = mlt_producer_properties( producer ); // Get the original get_audio - int ( *get_audio )( mlt_frame, int16_t **, mlt_audio_format *, int *, int *, int * ) = mlt_properties_get_data( frame_properties, "get_audio", NULL ); + frame->get_audio = mlt_properties_get_data( frame_properties, "get_audio", NULL ); // Call the original get_audio - get_audio( frame, buffer, format, frequency, channels, samples ); + mlt_frame_get_audio( frame, buffer, format, frequency, channels, samples ); // Now if our producer is still producing, override the audio if ( !mlt_properties_get_int( producer_properties, "end_of_clip" ) ) { // Get the position - double position = mlt_properties_get_double( producer_properties, "dub_position" ); + mlt_position position = mlt_properties_get_position( producer_properties, "dub_position" ); // We need a frame from the producer mlt_frame producer_frame; + // Set the FPS + mlt_properties_set_double( producer_properties, "fps", mlt_properties_get_double( frame_properties, "fps" ) ); + // Seek to the position - mlt_producer_seek_frame( producer, ( int64_t )position ); + mlt_producer_seek( producer, position ); // Get the next frame producer->get_frame( producer, &producer_frame, 0 ); @@ -67,7 +70,7 @@ static int filter_get_audio( mlt_frame frame, int16_t **buffer, mlt_audio_format mlt_properties_set_data( frame_properties, "ffmpeg_dub_frame", producer_frame, 0, ( mlt_destructor )mlt_frame_close, NULL ); // Incrment the position - mlt_properties_set_double( producer_properties, "dub_position", position + 1 ); + mlt_properties_set_position( producer_properties, "dub_position", position + 1 ); } } @@ -88,14 +91,22 @@ static mlt_frame filter_process( mlt_filter this, mlt_frame frame ) // Obtain the frame properties mlt_properties frame_properties = mlt_frame_properties( frame ); - // Backup the original get_audio (it's still needed) - mlt_properties_set_data( frame_properties, "get_audio", frame->get_audio, 0, NULL, NULL ); + // Get the producer properties + mlt_properties producer_properties = mlt_producer_properties( producer ); - // Pass the producer on the frame - mlt_properties_set_data( frame_properties, "producer", producer, 0, NULL, NULL ); + // Only do this if we have not reached end of clip and ffmpeg_dub has not already been done + if ( !mlt_properties_get_int( producer_properties, "end_of_clip" ) && + mlt_properties_get_data( frame_properties, "get_audio", NULL ) == NULL ) + { + // Backup the original get_audio (it's still needed) + mlt_properties_set_data( frame_properties, "get_audio", frame->get_audio, 0, NULL, NULL ); + + // Pass the producer on the frame + mlt_properties_set_data( frame_properties, "producer", producer, 0, NULL, NULL ); - // Override the get_audio method - frame->get_audio = filter_get_audio; + // Override the get_audio method + frame->get_audio = filter_get_audio; + } return frame; } @@ -124,7 +135,7 @@ mlt_filter filter_ffmpeg_dub_init( char *file ) mlt_properties_set_data( properties, "producer", producer, 0, ( mlt_destructor )mlt_producer_close, NULL ); // Initialise the audio frame position - mlt_properties_set_double( properties, "dub_position", 0 ); + mlt_properties_set_position( properties, "dub_position", 0 ); return this; }