bug fixes
[melted] / src / modules / sdl / consumer_sdl.c
index 4fd2068..3e5d28e 100644 (file)
@@ -98,32 +98,23 @@ mlt_consumer consumer_sdl_init( char *arg )
                pthread_mutex_init( &this->audio_mutex, NULL );
                pthread_cond_init( &this->audio_cond, NULL);
                
-               // Default fps
-               mlt_properties_set_double( this->properties, "fps", 25 );
+               // Default scaler (for now we'll use nearest)
+               mlt_properties_set( this->properties, "rescale", "nearest" );
 
+               // Get aspect ratio
+               this->aspect_ratio = mlt_properties_get_double( this->properties, "aspect_ratio" );
+               
                // process actual param
-               if ( arg == NULL || !strcmp( arg, "PAL" ) )
-               {
-                       this->width = 720;
-                       this->height = 576;
-               }
-               else if ( !strcmp( arg, "NTSC" ) )
+               if ( arg == NULL || sscanf( arg, "%dx%d", &this->width, &this->height ) != 2 )
                {
-                       this->width = 720;
-                       this->height = 480;
-                       mlt_properties_set_double( this->properties, "fps", 29.97 );
-               }
-               else if ( sscanf( arg, "%dx%d", &this->width, &this->height ) != 2 )
-               {
-                       this->width = 720;
-                       this->height = 576;
+                       this->width = mlt_properties_get_int( this->properties, "width" );
+                       this->height = mlt_properties_get_int( this->properties, "height" );
                }
 
-               // Default window size and aspect ratio
-               this->aspect_ratio = 4.0 / 3.0;
+               // Default window size
                this->window_width = (int)( (float)this->height * this->aspect_ratio ) + 1;
                this->window_height = this->height;
-
+               
                // Set the sdl flags
                this->sdl_flags = SDL_HWSURFACE | SDL_DOUBLEBUF | SDL_HWACCEL | SDL_RESIZABLE;
 
@@ -303,7 +294,7 @@ static int consumer_play_audio( consumer_sdl this, mlt_frame frame, int init_aud
                while ( bytes > ( sizeof( this->audio_buffer) - this->audio_avail ) )
                        pthread_cond_wait( &this->audio_cond, &this->audio_mutex );
                mlt_properties properties = mlt_frame_properties( frame );
-               if ( mlt_properties_get_double( properties, "speed" ) == 1 )
+               if ( mlt_properties_get_double( properties, "_speed" ) == 1 )
                        memcpy( &this->audio_buffer[ this->audio_avail ], pcm, bytes );
                else
                        memset( &this->audio_buffer[ this->audio_avail ], 0, bytes );
@@ -469,7 +460,12 @@ static int consumer_play_video( consumer_sdl this, mlt_frame frame )
                mlt_frame_close( frame );
 
        if ( this->count )
+       {
+               // Tell the producers about our scale relative to the normalisation
+               mlt_properties_set_double( mlt_frame_properties( this->queue[ this->count - 1 ] ), "consumer_scale",
+                       ( double )height / mlt_properties_get_double( properties, "height" ) );
                mlt_frame_get_image( this->queue[ this->count - 1 ], &image, &vfmt, &width, &height, 0 );
+       }
 
        return 0;
 }
@@ -485,12 +481,6 @@ static void *consumer_thread( void *arg )
        // Get the consumer
        mlt_consumer consumer = &this->parent;
 
-       // Get the service assoicated to the consumer
-       mlt_service service = mlt_consumer_service( consumer );
-
-       // Define a frame pointer
-       mlt_frame frame;
-
        // internal intialization
        int init_audio = 1;
 
@@ -503,9 +493,16 @@ static void *consumer_thread( void *arg )
        // Loop until told not to
        while( this->running )
        {
-               // Get a frame from the service (should never return anything other than 0)
-               if ( mlt_service_get_frame( service, &frame, 0 ) == 0 )
+               // Get a frame from the attached producer
+               mlt_frame frame = mlt_consumer_get_frame( consumer );
+
+               // Ensure that we have a frame
+               if ( frame != NULL )
                {
+                       // SDL adapts display aspect, but set this so pixel aspect can be normalised
+//                     mlt_properties_set_double( mlt_frame_properties( frame ), "consumer_aspect_ratio",
+//                             mlt_frame_get_aspect_ratio( frame ) );
+                       
                        init_audio = consumer_play_audio( this, frame, init_audio );
                        consumer_play_video( this, frame );
                }