From 11410cf74f5de6c8f4460a8b12119fa5558153a1 Mon Sep 17 00:00:00 2001 From: lilo_booter Date: Sat, 1 May 2004 22:34:47 +0000 Subject: [PATCH] Audio read ahead and fine tuning git-svn-id: https://mlt.svn.sourceforge.net/svnroot/mlt/trunk/mlt@298 d19143bc-622f-0410-bfdd-b5b2a6649095 --- src/framework/mlt_consumer.c | 28 ++++++++++++++++++++++++++-- src/framework/mlt_frame.c | 19 +++++++++++++++---- src/modules/sdl/consumer_sdl.c | 4 ++-- 3 files changed, 43 insertions(+), 8 deletions(-) diff --git a/src/framework/mlt_consumer.c b/src/framework/mlt_consumer.c index 981a58d..aa95f91 100644 --- a/src/framework/mlt_consumer.c +++ b/src/framework/mlt_consumer.c @@ -238,8 +238,23 @@ static void *consumer_read_ahead_thread( void *arg ) int width = mlt_properties_get_int( properties, "width" ); int height = mlt_properties_get_int( properties, "height" ); + // See if video is turned off + int video_off = mlt_properties_get_int( properties, "video_off" ); + + // Get the audio settings + mlt_audio_format afmt = mlt_audio_pcm; + int counter = 0; + double fps = mlt_properties_get_double( properties, "fps" ); + int channels = mlt_properties_get_int( properties, "channels" ); + int frequency = mlt_properties_get_int( properties, "frequency" ); + int samples = 0; + int16_t *pcm = NULL; + + // See if audio is turned off + int audio_off = mlt_properties_get_int( properties, "audio_off" ); + // Get the maximum size of the buffer - int buffer = mlt_properties_get_int( properties, "buffer" ); + int buffer = mlt_properties_get_int( properties, "buffer" ) + 1; // General frame variable mlt_frame frame = NULL; @@ -294,11 +309,20 @@ static void *consumer_read_ahead_thread( void *arg ) count = 1; } + // Always process audio + if ( !audio_off ) + { + samples = mlt_sample_calculator( fps, frequency, counter++ ); + mlt_frame_get_audio( frame, &pcm, &afmt, &frequency, &channels, &samples ); + frame->get_audio = NULL; + } + // Get the image if ( ( time_frame + time_image ) / count < 40000 ) { // Get the image, mark as rendered and time it - mlt_frame_get_image( frame, &image, &this->format, &width, &height, 0 ); + if ( !video_off ) + mlt_frame_get_image( frame, &image, &this->format, &width, &height, 0 ); mlt_properties_set_int( mlt_frame_properties( frame ), "rendered", 1 ); time_image += time_difference( &ante ); diff --git a/src/framework/mlt_frame.c b/src/framework/mlt_frame.c index ba33172..f13784a 100644 --- a/src/framework/mlt_frame.c +++ b/src/framework/mlt_frame.c @@ -219,7 +219,6 @@ int mlt_frame_get_image( mlt_frame this, uint8_t **buffer, mlt_image_format *for if ( test_frame != NULL ) { mlt_properties test_properties = mlt_frame_properties( test_frame ); - mlt_properties_set( test_properties, "rescale.interp", "nearest" ); mlt_properties_set_double( test_properties, "consumer_aspect_ratio", mlt_properties_get_double( properties, "consumer_aspect_ratio" ) ); mlt_frame_get_image( test_frame, buffer, format, width, height, writable ); mlt_properties_set_data( properties, "test_card_frame", test_frame, 0, ( mlt_destructor )mlt_frame_close, NULL ); @@ -237,8 +236,8 @@ int mlt_frame_get_image( mlt_frame this, uint8_t **buffer, mlt_image_format *for } else { - uint8_t *p; - uint8_t *q; + register uint8_t *p; + register uint8_t *q; int size = 0; *width = *width == 0 ? 720 : *width; @@ -309,7 +308,14 @@ int mlt_frame_get_audio( mlt_frame this, int16_t **buffer, mlt_audio_format *for if ( this->get_audio != NULL ) { - return this->get_audio( this, buffer, format, frequency, channels, samples ); + this->get_audio( this, buffer, format, frequency, channels, samples ); + } + else if ( mlt_properties_get_data( properties, "audio", NULL ) ) + { + *buffer = mlt_properties_get_data( properties, "audio", NULL ); + *frequency = mlt_properties_get_int( properties, "audio_frequency" ); + *channels = mlt_properties_get_int( properties, "audio_channels" ); + *samples = mlt_properties_get_int( properties, "audio_samples" ); } else { @@ -324,6 +330,11 @@ int mlt_frame_get_audio( mlt_frame this, int16_t **buffer, mlt_audio_format *for mlt_properties_set_data( properties, "audio", *buffer, size, ( mlt_destructor )mlt_pool_release, NULL ); mlt_properties_set_int( properties, "test_audio", 1 ); } + + mlt_properties_set_int( properties, "audio_frequency", *frequency ); + mlt_properties_set_int( properties, "audio_channels", *channels ); + mlt_properties_set_int( properties, "audio_samples", *samples ); + return 0; } diff --git a/src/modules/sdl/consumer_sdl.c b/src/modules/sdl/consumer_sdl.c index fa1ee01..aac59c8 100644 --- a/src/modules/sdl/consumer_sdl.c +++ b/src/modules/sdl/consumer_sdl.c @@ -246,7 +246,7 @@ static void sdl_fill_audio( void *udata, uint8_t *stream, int len ) if ( this->audio_avail >= len ) { // Place in the audio buffer - SDL_MixAudio( stream, this->audio_buffer, len, ( int )( ( float )SDL_MIX_MAXVOLUME * volume ) ); + memcpy( stream, this->audio_buffer, len ); // Remove len from the audio available this->audio_avail -= len; @@ -600,7 +600,7 @@ static void *consumer_thread( void *arg ) mlt_position difference = scheduled - elapsed; // If the frame is quite some way in the future, go get another - if ( difference > 80000 && mlt_deque_count( this->queue ) < 6 ) + if ( difference >= 30000 && mlt_deque_count( this->queue ) < 10 ) break; // Smooth playback a bit -- 1.7.4.4