X-Git-Url: http://research.m1stereo.tv/gitweb?a=blobdiff_plain;f=src%2Fframework%2Fmlt_frame.c;h=3221f40b69c781da6f2edaeb0c44494dbd1da6da;hb=2af8bb9f6a61f6510aab8f45abf5f26e9e619c78;hp=6c367e9335e79778f38386855afc4524f90b3b22;hpb=efe08354d45db7bf5478ffa17c35330a3e0d415c;p=melted diff --git a/src/framework/mlt_frame.c b/src/framework/mlt_frame.c index 6c367e9..3221f40 100644 --- a/src/framework/mlt_frame.c +++ b/src/framework/mlt_frame.c @@ -21,6 +21,7 @@ #include "config.h" #include "mlt_frame.h" #include "mlt_producer.h" +#include "mlt_factory.h" #include #include #include @@ -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 ); @@ -293,10 +311,14 @@ int mlt_frame_get_audio( mlt_frame this, int16_t **buffer, mlt_audio_format *for void mlt_frame_close( mlt_frame this ) { - mlt_deque_close( this->stack_get_image ); - mlt_deque_close( this->stack_frame ); - mlt_properties_close( &this->parent ); - free( this ); + if ( this != NULL ) + { + 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 ); + } } /***** convenience functions *****/ @@ -571,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; @@ -584,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