X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fmodules%2Fvorbis%2Fproducer_vorbis.c;h=72f38917daa70332b7cb088c59b418c7697b85c5;hb=facc6328e46eb0c973c6293390a14258abf071d4;hp=30c718fe4aead2a33cb3ed5b675a4c10c3c3a20d;hpb=61402e4d8f01fe64b4cc86482d7c982f28a683de;p=mlt diff --git a/src/modules/vorbis/producer_vorbis.c b/src/modules/vorbis/producer_vorbis.c index 30c718fe..72f38917 100644 --- a/src/modules/vorbis/producer_vorbis.c +++ b/src/modules/vorbis/producer_vorbis.c @@ -21,6 +21,7 @@ // MLT Header files #include #include +#include // vorbis Header files #include @@ -123,7 +124,7 @@ static void producer_file_close( void *file ) static int producer_open( mlt_producer this, mlt_profile profile, char *file ) { // FILE pointer for file - FILE *input = fopen( file, "r" ); + FILE *input = fopen( file, "rb" ); // Error code to return int error = input == NULL; @@ -151,8 +152,14 @@ static int producer_open( mlt_producer this, mlt_profile profile, char *file ) char **ptr = ov_comment(ov, -1)->user_comments; while(*ptr) { metadata = vorbis_metadata_from_str (*ptr); - if (metadata != NULL) + if (metadata != NULL) { mlt_properties_set(properties, metadata->name, metadata->content); + if (metadata->name) + free(metadata->name); + if (metadata->content) + free(metadata->content); + free(metadata); + } ++ptr; } @@ -170,8 +177,8 @@ static int producer_open( mlt_producer this, mlt_profile profile, char *file ) // Get the vorbis info vorbis_info *vi = ov_info( ov, -1 ); - mlt_properties_set_int( properties, "frequency", (int) vi->rate ); - mlt_properties_set_int( properties, "channels", vi->channels ); + mlt_properties_set_int( properties, "audio_frequency", (int) vi->rate ); + mlt_properties_set_int( properties, "audio_channels", vi->channels ); // Set some media metadata mlt_properties_set_int( properties, "meta.media.nb_streams", 1 ); @@ -205,13 +212,10 @@ static double producer_time_of_frame( mlt_producer this, mlt_position position ) /** Get the audio from a frame. */ -static int producer_get_audio( mlt_frame frame, int16_t **buffer, mlt_audio_format *format, int *frequency, int *channels, int *samples ) +static int producer_get_audio( mlt_frame frame, void **buffer, mlt_audio_format *format, int *frequency, int *channels, int *samples ) { - // Get the properties from the frame - mlt_properties frame_properties = MLT_FRAME_PROPERTIES( frame ); - // Obtain the frame number of this frame - mlt_position position = mlt_properties_get_position( frame_properties, "vorbis_position" ); + mlt_position position = mlt_frame_original_position( frame ); // Get the producer mlt_producer this = mlt_frame_pop_audio( frame ); @@ -219,6 +223,8 @@ static int producer_get_audio( mlt_frame frame, int16_t **buffer, mlt_audio_form // Get the producer properties mlt_properties properties = MLT_PRODUCER_PROPERTIES( this ); + mlt_service_lock( MLT_PRODUCER_SERVICE( this ) ); + // Get the ogg vorbis file OggVorbis_File *ov = mlt_properties_get_data( properties, "ogg_vorbis_file", NULL ); @@ -305,7 +311,7 @@ static int producer_get_audio( mlt_frame frame, int16_t **buffer, mlt_audio_form { ignore --; audio_used -= *samples; - memmove( audio_buffer, &audio_buffer[ *samples * *channels ], audio_used * sizeof( int16_t ) ); + memmove( audio_buffer, &audio_buffer[ *samples * *channels ], audio_used * sizeof( int16_t ) * *channels ); *samples = mlt_sample_calculator( fps, *frequency, expected ++ ); } } @@ -313,11 +319,14 @@ static int producer_get_audio( mlt_frame frame, int16_t **buffer, mlt_audio_form // Now handle the audio if we have enough if ( audio_used >= *samples ) { - *buffer = mlt_pool_alloc( *samples * *channels * sizeof( int16_t ) ); - memcpy( *buffer, audio_buffer, *samples * *channels * sizeof( int16_t ) ); + int size = *samples * *channels * sizeof( int16_t ); + + *format = mlt_audio_s16; + *buffer = mlt_pool_alloc( size ); + memcpy( *buffer, audio_buffer, size ); audio_used -= *samples; memmove( audio_buffer, &audio_buffer[ *samples * *channels ], audio_used * *channels * sizeof( int16_t ) ); - mlt_properties_set_data( frame_properties, "audio", *buffer, 0, mlt_pool_release, NULL ); + mlt_frame_set_audio( frame, *buffer, *format, size, mlt_pool_release ); } else { @@ -338,6 +347,8 @@ static int producer_get_audio( mlt_frame frame, int16_t **buffer, mlt_audio_form // Regardless of speed, we expect to get the next frame (cos we ain't too bright) mlt_properties_set_position( properties, "audio_expected", position + 1 ); + mlt_service_unlock( MLT_PRODUCER_SERVICE( this ) ); + return 0; } @@ -352,16 +363,12 @@ static int producer_get_frame( mlt_producer this, mlt_frame_ptr frame, int index // Update timecode on the frame we're creating mlt_frame_set_position( *frame, mlt_producer_position( this ) ); - // Set the position of this producer - mlt_properties frame_properties = MLT_FRAME_PROPERTIES( *frame ); - mlt_properties_set_position( frame_properties, "vorbis_position", mlt_producer_frame( this ) ); - // Set up the audio mlt_frame_push_audio( *frame, this ); mlt_frame_push_audio( *frame, producer_get_audio ); // Pass audio properties to the frame - mlt_properties_pass_list( frame_properties, MLT_PRODUCER_PROPERTIES( this ), "frequency, channels" ); + mlt_properties_pass_list( MLT_FRAME_PROPERTIES(*frame), MLT_PRODUCER_PROPERTIES( this ), "frequency, channels" ); // Calculate the next timecode mlt_producer_prepare_next( this );