X-Git-Url: http://research.m1stereo.tv/gitweb?a=blobdiff_plain;f=src%2Fframework%2Fmlt_frame.c;h=3221f40b69c781da6f2edaeb0c44494dbd1da6da;hb=2af8bb9f6a61f6510aab8f45abf5f26e9e619c78;hp=d0e08e38af9b5f2dea7301dc0b5b5f8240a38cd8;hpb=0b288164cbeb9a3c98107d439d86844be13ba910;p=melted diff --git a/src/framework/mlt_frame.c b/src/framework/mlt_frame.c index d0e08e3..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; @@ -65,8 +66,12 @@ mlt_frame mlt_frame_init( ) mlt_properties_set_data( properties, "audio", NULL, 0, NULL, NULL ); mlt_properties_set_data( properties, "alpha", NULL, 0, NULL, NULL ); - + // 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; } @@ -131,10 +136,7 @@ int mlt_frame_set_position( mlt_frame this, mlt_position value ) int mlt_frame_push_get_image( mlt_frame this, mlt_get_image get_image ) { - int ret = this->stack_get_image_size >= 10; - if ( ret == 0 ) - this->stack_get_image[ this->stack_get_image_size ++ ] = get_image; - return ret; + return mlt_deque_push_back( this->stack_get_image, get_image ); } /** Pop a get_image callback. @@ -142,10 +144,7 @@ int mlt_frame_push_get_image( mlt_frame this, mlt_get_image get_image ) mlt_get_image mlt_frame_pop_get_image( mlt_frame this ) { - mlt_get_image result = NULL; - if ( this->stack_get_image_size > 0 ) - result = this->stack_get_image[ -- this->stack_get_image_size ]; - return result; + return mlt_deque_pop_back( this->stack_get_image ); } /** Push a frame. @@ -153,10 +152,7 @@ mlt_get_image mlt_frame_pop_get_image( mlt_frame this ) int mlt_frame_push_frame( mlt_frame this, mlt_frame that ) { - int ret = this->stack_frame_size >= 10; - if ( ret == 0 ) - this->stack_frame[ this->stack_frame_size ++ ] = that; - return ret; + return mlt_deque_push_back( this->stack_frame, that ); } /** Pop a frame. @@ -164,10 +160,23 @@ int mlt_frame_push_frame( mlt_frame this, mlt_frame that ) mlt_frame mlt_frame_pop_frame( mlt_frame this ) { - mlt_frame result = NULL; - if ( this->stack_frame_size > 0 ) - result = this->stack_frame[ -- this->stack_frame_size ]; - return result; + 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 ) @@ -198,7 +207,6 @@ int mlt_frame_get_image( mlt_frame this, uint8_t **buffer, mlt_image_format *for mlt_properties_set_double( test_properties, "consumer_scale", mlt_properties_get_double( properties, "consumer_scale" ) ); mlt_properties_set( test_properties, "rescale.interp", "nearest" ); mlt_frame_get_image( test_frame, buffer, format, width, height, writable ); - mlt_properties_inherit( properties, test_properties ); mlt_properties_set_data( properties, "test_card_frame", test_frame, 0, ( mlt_destructor )mlt_frame_close, NULL ); mlt_properties_set_data( properties, "image", *buffer, *width * *height * 2, NULL, NULL ); mlt_properties_set_int( properties, "width", *width ); @@ -303,8 +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_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 *****/ @@ -579,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; @@ -592,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