]> git.sesse.net Git - mlt/commitdiff
Audio read ahead and fine tuning
authorlilo_booter <lilo_booter@d19143bc-622f-0410-bfdd-b5b2a6649095>
Sat, 1 May 2004 22:34:47 +0000 (22:34 +0000)
committerlilo_booter <lilo_booter@d19143bc-622f-0410-bfdd-b5b2a6649095>
Sat, 1 May 2004 22:34:47 +0000 (22:34 +0000)
git-svn-id: https://mlt.svn.sourceforge.net/svnroot/mlt/trunk/mlt@298 d19143bc-622f-0410-bfdd-b5b2a6649095

src/framework/mlt_consumer.c
src/framework/mlt_frame.c
src/modules/sdl/consumer_sdl.c

index 981a58d360d36bba153afafab42850f00836eb69..aa95f91acbac343157976175b4176d6140b3ffc3 100644 (file)
@@ -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 );
 
index ba33172728a976a7c5cb21888ba2871a63e1964d..f13784a9381059c5d1ad5fcda349f2743c0e7ff0 100644 (file)
@@ -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;
 }
 
index fa1ee019858c9dca1dd4cb06b09444027a0ad4b6..aac59c887db54491e8b199b8bc319f27e0a4c0ab 100644 (file)
@@ -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