]> git.sesse.net Git - mlt/blobdiff - src/modules/core/producer_noise.c
Minor corrections with alpha and affines
[mlt] / src / modules / core / producer_noise.c
index 9c586c1046a34176baaaf922d233506ad90f518f..8bc21c30e6ed422669bb4107234033fde857b2b5 100644 (file)
@@ -42,6 +42,7 @@ static unsigned inline int fast_rand( )
 
 // Foward declarations
 static int producer_get_frame( mlt_producer this, mlt_frame_ptr frame, int index );
+static void producer_close( mlt_producer this );
 
 /** Initialise.
 */
@@ -54,8 +55,14 @@ mlt_producer producer_noise_init( void *arg )
        // Initialise the producer
        if ( this != NULL )
        {
+               int is_pal = mlt_properties_get_int( MLT_PRODUCER_PROPERTIES( this ), "normalised_height" ) == 576;
+
+               // Synthetic - aspect ratio of 1
+               mlt_properties_set_double( MLT_PRODUCER_PROPERTIES( this ), "aspect_ratio", is_pal ? 59.0/54.0 : 10.0/11.0 );
+
                // Callback registration
                this->get_frame = producer_get_frame;
+               this->close = ( mlt_destructor )producer_close;
        }
 
        return this;
@@ -64,7 +71,7 @@ mlt_producer producer_noise_init( void *arg )
 static int producer_get_image( mlt_frame frame, uint8_t **buffer, mlt_image_format *format, int *width, int *height, int writable )
 {
        // Obtain properties of frame
-       mlt_properties properties = mlt_frame_properties( frame );
+       mlt_properties properties = MLT_FRAME_PROPERTIES( frame );
 
        // Calculate the size of the image
        int size = *width * *height * 2;
@@ -92,11 +99,9 @@ static int producer_get_image( mlt_frame frame, uint8_t **buffer, mlt_image_form
                // Generate random noise
                while ( p != *buffer )
                {
-                       value = fast_rand( );
+                       value = fast_rand( ) & 0xff;
                        *( -- p ) = 128;
-                       *( -- p ) = value & 0xff;
-                       *( -- p ) = 128;
-                       *( -- p ) = ( ( value & 0xff00 ) >> 8 ) & 0xf0;
+                       *( -- p ) = value < 16 ? 16 : value > 240 ? 240 : value;
                }
        }
 
@@ -106,7 +111,7 @@ static int producer_get_image( mlt_frame frame, uint8_t **buffer, mlt_image_form
 static int producer_get_audio( mlt_frame frame, int16_t **buffer, mlt_audio_format *format, int *frequency, int *channels, int *samples )
 {
        // Get the frame properties
-       mlt_properties properties = mlt_frame_properties( frame );
+       mlt_properties properties = MLT_FRAME_PROPERTIES( frame );
 
        int size = 0;
 
@@ -126,7 +131,7 @@ static int producer_get_audio( mlt_frame frame, int16_t **buffer, mlt_audio_form
        {
                int16_t *p = *buffer + size / 2;
                while ( p != *buffer ) 
-                       *( -- p ) = fast_rand( ) & 0xff;
+                       *( -- p ) = fast_rand( ) & 0x0f00;
        }
 
        // Set the buffer for destruction
@@ -144,10 +149,16 @@ static int producer_get_frame( mlt_producer this, mlt_frame_ptr frame, int index
        if ( *frame != NULL )
        {
                // Obtain properties of frame
-               mlt_properties properties = mlt_frame_properties( *frame );
+               mlt_properties properties = MLT_FRAME_PROPERTIES( *frame );
+
+               // Obtain properties of producer
+               mlt_properties producer_props = MLT_PRODUCER_PROPERTIES( this );
+
+               // Determine if we're producing PAL or NTSC
+               int is_pal = mlt_properties_get_double( producer_props, "fps" ) == 25.0;
 
                // Aspect ratio is 1?
-               mlt_properties_set_double( properties, "aspect_ratio", 1.0 );
+               mlt_properties_set_double( properties, "aspect_ratio", is_pal ? 59.0/54.0 : 10.0/11.0 );
 
                // Set producer-specific frame properties
                mlt_properties_set_int( properties, "progressive", 1 );
@@ -159,7 +170,7 @@ static int producer_get_frame( mlt_producer this, mlt_frame_ptr frame, int index
                mlt_frame_push_get_image( *frame, producer_get_image );
 
                // Specify the audio
-               ( *frame )->get_audio = producer_get_audio;
+               mlt_frame_push_audio( *frame, producer_get_audio );
        }
 
        // Calculate the next timecode
@@ -168,4 +179,10 @@ static int producer_get_frame( mlt_producer this, mlt_frame_ptr frame, int index
        return 0;
 }
 
+static void producer_close( mlt_producer this )
+{
+       this->close = NULL;
+       mlt_producer_close( this );
+       free( this );
+}