producer_framebuffer.c: Fix aspect ratio with slowmotion producer
[melted] / src / modules / kdenlive / producer_framebuffer.c
index 9e6ba2d..0a24269 100644 (file)
@@ -18,7 +18,6 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 
-#include "producer_framebuffer.h"
 #include <framework/mlt.h>
 
 #include <stdio.h>
@@ -50,20 +49,23 @@ static int framebuffer_get_image( mlt_frame this, uint8_t **image, mlt_image_for
        *width = mlt_properties_get_int( frame_properties, "width" );
        *height = mlt_properties_get_int( frame_properties, "height" );
 
-       // image stride
-       int size, xstride, ystride;
-       switch( *format ){
-               case mlt_image_yuv422:
-                       size = *width * *height * 2;
-                       xstride = 2;
-                       ystride = 2 * *width;
+       int size;
+       switch ( *format )
+       {
+               case mlt_image_yuv420p:
+                       size = *width * 3 * ( *height + 1 ) / 2;
+                       break;
+               case mlt_image_rgb24:
+                       size = *width * ( *height + 1 ) * 3;
                        break;
                default:
-                       fprintf(stderr, "Unsupported image format\n");
-                       return -1;
+                       *format = mlt_image_yuv422;
+                       size = *width * ( *height + 1 ) * 2;
+                       break;
        }
 
-       uint8_t *output = mlt_properties_get_data( producer_properties, "output_buffer", 0 );
+       uint8_t *output = mlt_properties_get_data( producer_properties, "output_buffer", NULL );
+
        if( output == NULL )
        {
                output = mlt_pool_alloc( size );
@@ -80,6 +82,11 @@ static int framebuffer_get_image( mlt_frame this, uint8_t **image, mlt_image_for
 
        if( first_image == NULL )
        {
+               mlt_properties props = MLT_FRAME_PROPERTIES( this );
+               mlt_properties test_properties = MLT_FRAME_PROPERTIES( first_frame );
+               mlt_properties_set_double( test_properties, "consumer_aspect_ratio", mlt_properties_get_double( props, "consumer_aspect_ratio" ) );
+               mlt_properties_set( test_properties, "rescale.interp", mlt_properties_get( props, "rescale.interp" ) );
+
                error = mlt_frame_get_image( first_frame, &first_image, format, width, height, writable );
 
                if( error != 0 ) {
@@ -106,8 +113,8 @@ static int framebuffer_get_image( mlt_frame this, uint8_t **image, mlt_image_for
 static int producer_get_frame( mlt_producer this, mlt_frame_ptr frame, int index )
 {
        // Construct a new frame
-       *frame = mlt_frame_init( );
-       mlt_properties properties = MLT_PRODUCER_PROPERTIES(this);
+       *frame = mlt_frame_init( MLT_PRODUCER_SERVICE( this ) );
+       mlt_properties properties = MLT_PRODUCER_PROPERTIES( this );
 
        if( frame != NULL )
        {
@@ -164,8 +171,6 @@ static int producer_get_frame( mlt_producer this, mlt_frame_ptr frame, int index
 
                        // Get the frame
                        mlt_service_get_frame( MLT_PRODUCER_SERVICE( real_producer ), &first_frame, index );
-
-                       double ratio = (double) mlt_properties_get_int( MLT_FRAME_PROPERTIES( first_frame ), "width" ) / (double) mlt_properties_get_int( MLT_FRAME_PROPERTIES( first_frame ), "height" ) / ( (double) mlt_properties_get_int(MLT_FRAME_PROPERTIES( *frame ), "width" ) / (double) mlt_properties_get_int( MLT_FRAME_PROPERTIES( *frame ), "height" ));
                }
 
                // Make sure things are in their place
@@ -181,19 +186,18 @@ static int producer_get_frame( mlt_producer this, mlt_frame_ptr frame, int index
 
                // Give the returned frame temporal identity
                mlt_frame_set_position( *frame, mlt_producer_position( this ) );
-               mlt_properties_set_double( MLT_FRAME_PROPERTIES(*frame), "aspect_ratio", mlt_properties_get_double( properties, "ratio_fix" ));
        }
 
        return 0;
 }
 
 
-mlt_producer producer_framebuffer_init( char *arg )
+mlt_producer producer_framebuffer_init( mlt_profile profile, mlt_service_type type, const char *id, char *arg )
 {
 
        mlt_producer this = NULL;
        this = calloc( 1, sizeof( struct mlt_producer_s ) );
-        mlt_producer_init( this, NULL );
+       mlt_producer_init( this, NULL );
 
        // Wrap fezzik
        mlt_producer real_producer;
@@ -222,7 +226,7 @@ mlt_producer producer_framebuffer_init( char *arg )
        count = strcspn( ptr, ":" );
        ptr[count] = '\0';
 
-       real_producer = mlt_factory_producer( "fezzik", props );
+       real_producer = mlt_factory_producer( profile, "fezzik", props );
 
        ptr += count + 1;
        ptr += strspn( ptr, ":" );