sdl hacks
[melted] / src / framework / mlt_frame.c
index 04bc9ba..3221f40 100644 (file)
@@ -21,6 +21,7 @@
 #include "config.h"
 #include "mlt_frame.h"
 #include "mlt_producer.h"
+#include "mlt_factory.h"
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -36,7 +37,7 @@ mlt_frame mlt_frame_init( )
        if ( this != NULL )
        {
                // Get the normalisation
-               char *normalisation = getenv( "MLT_NORMALISATION" );
+               char *normalisation = mlt_environment( "MLT_NORMALISATION" );
 
                // Initialise the properties
                mlt_properties properties = &this->parent;
@@ -68,6 +69,7 @@ mlt_frame mlt_frame_init( )
                // Construct stacks for frames and methods
                this->stack_get_image = mlt_deque_init( );
                this->stack_frame = mlt_deque_init( );
+               this->stack_service = mlt_deque_init( );
        }
 
        return this;
@@ -161,6 +163,22 @@ mlt_frame mlt_frame_pop_frame( mlt_frame this )
        return mlt_deque_pop_back( this->stack_frame );
 }
 
+/** Push a service.
+*/
+
+int mlt_frame_push_service( mlt_frame this, void *that )
+{
+       return mlt_deque_push_back( this->stack_service, that );
+}
+
+/** Pop a service.
+*/
+
+void *mlt_frame_pop_service( mlt_frame this )
+{
+       return mlt_deque_pop_back( this->stack_service );
+}
+
 int mlt_frame_get_image( mlt_frame this, uint8_t **buffer, mlt_image_format *format, int *width, int *height, int writable )
 {
        mlt_properties properties = mlt_frame_properties( this );
@@ -297,6 +315,7 @@ void mlt_frame_close( mlt_frame this )
        {
                mlt_deque_close( this->stack_get_image );
                mlt_deque_close( this->stack_frame );
+               mlt_deque_close( this->stack_service );
                mlt_properties_close( &this->parent );
                free( this );
        }
@@ -574,9 +593,6 @@ uint8_t *mlt_frame_rescale_yuv422( mlt_frame this, int owidth, int oheight )
 
                iwidth = iwidth - ( iwidth % 4 );
 
-       // Coordinates (0,0 is middle of output)
-       int y, x;
-
                // Derived coordinates
                int dy, dx;
 
@@ -587,41 +603,44 @@ uint8_t *mlt_frame_rescale_yuv422( mlt_frame this, int owidth, int oheight )
        int in_y_range = iheight / 2;
 
        // Output pointers
-       uint8_t *out_line = output;
-       uint8_t *out_ptr;
+       register uint8_t *out_line = output;
+       register uint8_t *out_ptr;
 
        // Calculate a middle pointer
        uint8_t *in_middle = input + istride * in_y_range + in_x_range * 2;
        uint8_t *in_line;
-               uint8_t *in_ptr;
 
                // Generate the affine transform scaling values
-               int scale_width = ( iwidth << 16 ) / owidth;
-               int scale_height = ( iheight << 16 ) / oheight;
+               register int scale_width = ( iwidth << 16 ) / owidth;
+               register int scale_height = ( iheight << 16 ) / oheight;
+               register int base = 0;
+
+               int outer = out_x_range * scale_width;
+               int bottom = out_y_range * scale_height;
 
        // Loop for the entirety of our output height.
-       for ( y = - out_y_range; y < out_y_range ; y ++ )
+       for ( dy = - bottom; dy < bottom; dy += scale_height )
        {
-                       // Calculate the derived y value
-                       dy = ( scale_height * y ) >> 16;
-
                // Start at the beginning of the line
                out_ptr = out_line;
        
                // Pointer to the middle of the input line
-               in_line = in_middle + dy * istride;
-       
+               in_line = in_middle + ( dy >> 16 ) * istride;
+
                // Loop for the entirety of our output row.
-               for ( x = - out_x_range; x < out_x_range; x += 1 )
+               for ( dx = - outer; dx < outer; dx += scale_width )
                {
-                               // Calculated the derived x
-                               dx = ( scale_width * x ) >> 16;
-
-                       // We're in the input range for this row.
-                               in_ptr = in_line + ( dx << 1 );
-                       *out_ptr ++ = *in_ptr ++;
-                               in_ptr = in_line + ( ( dx >> 1 ) << 2 ) + ( ( x & 1 ) << 1 ) + 1;
-                       *out_ptr ++ = *in_ptr;
+                               base = dx >> 15;
+                               base &= 0xfffffffe;
+                               *out_ptr ++ = *( in_line + base );
+                               base &= 0xfffffffc;
+                               *out_ptr ++ = *( in_line + base + 1 );
+                               dx += scale_width;
+                               base = dx >> 15;
+                               base &= 0xfffffffe;
+                               *out_ptr ++ = *( in_line + base );
+                               base &= 0xfffffffc;
+                               *out_ptr ++ = *( in_line + base + 3 );
                }
 
                // Move to next output line