transition region
[melted] / src / framework / mlt_consumer.c
index 67578e6..51298bd 100644 (file)
@@ -42,7 +42,7 @@ int mlt_consumer_init( mlt_consumer this, void *child )
                mlt_properties properties = mlt_service_properties( &this->parent );
 
                // Get the normalisation preference
-               char *normalisation = getenv( "MLT_NORMALISATION" );
+               char *normalisation = mlt_environment( "MLT_NORMALISATION" );
 
                // Deal with normalisation
                if ( normalisation == NULL || strcmp( normalisation, "NTSC" ) )
@@ -51,6 +51,7 @@ int mlt_consumer_init( mlt_consumer this, void *child )
                        mlt_properties_set_double( properties, "fps", 25.0 );
                        mlt_properties_set_int( properties, "width", 720 );
                        mlt_properties_set_int( properties, "height", 576 );
+                       mlt_properties_set_int( properties, "progressive", 0 );
                }
                else
                {
@@ -58,7 +59,9 @@ int mlt_consumer_init( mlt_consumer this, void *child )
                        mlt_properties_set_double( properties, "fps", 30000.0 / 1001.0 );
                        mlt_properties_set_int( properties, "width", 720 );
                        mlt_properties_set_int( properties, "height", 480 );
+                       mlt_properties_set_int( properties, "progressive", 0 );
                }
+               mlt_properties_set_double( properties, "aspect_ratio", 4.0 / 3.0 );
 
                // Default rescaler for all consumers
                mlt_properties_set( properties, "rescale", "bilinear" );
@@ -104,16 +107,32 @@ int mlt_consumer_start( mlt_consumer this )
        // Deal with it now.
        if ( test_card != NULL )
        {
-               // Create a test card producer
-               mlt_producer producer = mlt_factory_producer( "fezzik", test_card );
-
-               // Do we have a producer
-               if ( producer != NULL )
+               if ( mlt_properties_get_data( properties, "test_card_producer", NULL ) == NULL )
                {
-                       // Set the test card on the consumer
-                       mlt_properties_set_data( properties, "test_card_producer", producer, 0, ( mlt_destructor )mlt_producer_close, NULL );
+                       // Create a test card producer
+                       // TODO: do we want to use fezzik here?
+                       mlt_producer producer = mlt_factory_producer( "fezzik", test_card );
+
+                       // Do we have a producer
+                       if ( producer != NULL )
+                       {
+                               // Test card should loop I guess...
+                               mlt_properties_set( mlt_producer_properties( producer ), "eof", "loop" );
+
+                               // Set the test card on the consumer
+                               mlt_properties_set_data( properties, "test_card_producer", producer, 0, ( mlt_destructor )mlt_producer_close, NULL );
+                       }
+
+                       // Check and run an ante command
+                       if ( mlt_properties_get( properties, "ante" ) )
+                               system( mlt_properties_get( properties, "ante" ) );
                }
        }
+       else
+       {
+               // Allow the hash table to speed things up
+               mlt_properties_set_data( properties, "test_card_producer", NULL, 0, NULL, NULL );
+       }
 
        // Start the service
        if ( this->start != NULL )
@@ -142,15 +161,20 @@ mlt_frame mlt_consumer_get_frame( mlt_consumer this )
                // Get the frame properties
                mlt_properties frame_properties = mlt_frame_properties( frame );
 
-               // Attach the test frame producer to it.
+               // Get the test card producer
                mlt_producer test_card = mlt_properties_get_data( properties, "test_card_producer", NULL );
-               mlt_properties_set_data( frame_properties, "test_card_producer", test_card, 0, NULL, NULL );
+
+               // Attach the test frame producer to it.
+               if ( test_card != NULL )
+                       mlt_properties_set_data( frame_properties, "test_card_producer", test_card, 0, NULL, NULL );
 
                // Attach the rescale property
-               if ( mlt_properties_get( properties, "rescale" ) != NULL )
-                       mlt_properties_set( frame_properties, "rescale.interp", mlt_properties_get( properties, "rescale" ) );
+               mlt_properties_set( frame_properties, "rescale.interp", mlt_properties_get( properties, "rescale" ) );
 
-               // TODO: Aspect ratio and other jiggery pokery
+               // Aspect ratio and other jiggery pokery
+               mlt_properties_set_double( frame_properties, "consumer_aspect_ratio", mlt_properties_get_double( properties, "aspect_ratio" ) );
+               mlt_properties_set_int( frame_properties, "consumer_progressive", mlt_properties_get_int( properties, "progressive" ) );
+               mlt_properties_set_int( frame_properties, "consumer_deinterlace", mlt_properties_get_int( properties, "deinterlace" ) );
        }
 
        // Return the frame
@@ -167,11 +191,15 @@ int mlt_consumer_stop( mlt_consumer this )
 
        // Stop the consumer
        if ( this->stop != NULL )
-               return this->stop( this );
+               this->stop( this );
 
        // Kill the test card
        mlt_properties_set_data( properties, "test_card_producer", NULL, 0, NULL, NULL );
 
+       // Check and run a post command
+       if ( mlt_properties_get( properties, "post" ) )
+               system( mlt_properties_get( properties, "post" ) );
+
        return 0;
 }
 
@@ -180,7 +208,7 @@ int mlt_consumer_stop( mlt_consumer this )
 
 int mlt_consumer_is_stopped( mlt_consumer this )
 {
-       // Stop the consumer
+       // Check if the consumer is stopped
        if ( this->is_stopped != NULL )
                return this->is_stopped( this );