X-Git-Url: http://research.m1stereo.tv/gitweb?a=blobdiff_plain;f=src%2Fframework%2Fmlt_frame.c;h=3221f40b69c781da6f2edaeb0c44494dbd1da6da;hb=2af8bb9f6a61f6510aab8f45abf5f26e9e619c78;hp=a62ed7ac59fbb9622fc14a5f413d5e4acd83b66a;hpb=94dce1aea965163f8dcd2f97271f2652abb0e62d;p=melted diff --git a/src/framework/mlt_frame.c b/src/framework/mlt_frame.c index a62ed7a..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 ); @@ -212,7 +220,6 @@ int mlt_frame_get_image( mlt_frame this, uint8_t **buffer, mlt_image_format *for } else { - void *release = NULL; uint8_t *p; uint8_t *q; int size = 0; @@ -233,21 +240,21 @@ int mlt_frame_get_image( mlt_frame this, uint8_t **buffer, mlt_image_format *for case mlt_image_rgb24: size *= 3; size += *width * 3; - *buffer = mlt_pool_allocate( size, &release ); + *buffer = mlt_pool_alloc( size ); if ( *buffer ) memset( *buffer, 255, size ); break; case mlt_image_rgb24a: size *= 4; size += *width * 4; - *buffer = mlt_pool_allocate( size, &release ); + *buffer = mlt_pool_alloc( size ); if ( *buffer ) memset( *buffer, 255, size ); break; case mlt_image_yuv422: size *= 2; size += *width * 2; - *buffer = mlt_pool_allocate( size, &release ); + *buffer = mlt_pool_alloc( size ); p = *buffer; q = p + size; while ( p != NULL && p != q ) @@ -258,14 +265,13 @@ int mlt_frame_get_image( mlt_frame this, uint8_t **buffer, mlt_image_format *for break; case mlt_image_yuv420p: size = size * 3 / 2; - *buffer = mlt_pool_allocate( size, &release ); + *buffer = mlt_pool_alloc( size ); if ( *buffer ) memset( *buffer, 255, size ); break; } - mlt_properties_set_data( properties, "image_release", release, 0, ( mlt_destructor )mlt_pool_release, NULL ); - mlt_properties_set_data( properties, "image", *buffer, size, NULL, NULL ); + mlt_properties_set_data( properties, "image", *buffer, size, ( mlt_destructor )mlt_pool_release, NULL ); mlt_properties_set_int( properties, "test_image", 1 ); } @@ -290,16 +296,14 @@ int mlt_frame_get_audio( mlt_frame this, int16_t **buffer, mlt_audio_format *for else { int size = 0; - void *release = NULL; *samples = *samples <= 0 ? 1920 : *samples; *channels = *channels <= 0 ? 2 : *channels; *frequency = *frequency <= 0 ? 48000 : *frequency; size = *samples * *channels * sizeof( int16_t ); - *buffer = mlt_pool_allocate( size, &release ); + *buffer = mlt_pool_alloc( size ); if ( *buffer != NULL ) memset( *buffer, 0, size ); - mlt_properties_set_data( properties, "audio_release", release, 0, ( mlt_destructor )mlt_pool_release, NULL ); - mlt_properties_set_data( properties, "audio", *buffer, size, NULL, NULL ); + mlt_properties_set_data( properties, "audio", *buffer, size, ( mlt_destructor )mlt_pool_release, NULL ); mlt_properties_set_int( properties, "test_audio", 1 ); } return 0; @@ -307,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 *****/ @@ -465,7 +475,6 @@ void mlt_resize_yuv422( uint8_t *output, int owidth, int oheight, uint8_t *input uint8_t *in_middle = input + istride * ( iheight / 2 ) + ( iwidth / 2 ) * 2; int in_line = - in_y_range * istride - in_x_range * 2; - uint8_t black[ 2 ] = { 0, 128 }; int elements; // Fill whole section with black @@ -474,8 +483,8 @@ void mlt_resize_yuv422( uint8_t *output, int owidth, int oheight, uint8_t *input elements = blank_elements; while ( elements -- ) { - *out_line ++ = black[ 0 ]; - *out_line ++ = black[ 1 ]; + *out_line ++ = 0; + *out_line ++ = 128; } int active_width = 2 * iwidth; @@ -491,8 +500,8 @@ void mlt_resize_yuv422( uint8_t *output, int owidth, int oheight, uint8_t *input elements = inactive_width; while ( elements -- ) { - *out_ptr ++ = black[ 0 ]; - *out_ptr ++ = black[ 1 ]; + *out_ptr ++ = 0; + *out_ptr ++ = 128; } // We're in the input range for this row. @@ -503,8 +512,8 @@ void mlt_resize_yuv422( uint8_t *output, int owidth, int oheight, uint8_t *input elements = inactive_width; while ( elements -- ) { - *out_ptr ++ = black[ 0 ]; - *out_ptr ++ = black[ 1 ]; + *out_ptr ++ = 0; + *out_ptr ++ = 128; } // Move to next input line @@ -518,8 +527,8 @@ void mlt_resize_yuv422( uint8_t *output, int owidth, int oheight, uint8_t *input elements = blank_elements; while ( elements -- ) { - *out_line ++ = black[ 0 ]; - *out_line ++ = black[ 1 ]; + *out_line ++ = 0; + *out_line ++ = 128; } } @@ -541,15 +550,13 @@ uint8_t *mlt_frame_resize_yuv422( mlt_frame this, int owidth, int oheight ) if ( iwidth != owidth || iheight != oheight ) { // Create the output image - void *release = NULL; - uint8_t *output = mlt_pool_allocate( owidth * ( oheight + 1 ) * 2, &release ); + uint8_t *output = mlt_pool_alloc( owidth * ( oheight + 1 ) * 2 ); // Call the generic resize mlt_resize_yuv422( output, owidth, oheight, input, iwidth, iheight ); // Now update the frame - mlt_properties_set_data( properties, "image_release", release, 0, ( mlt_destructor )mlt_pool_release, NULL ); - mlt_properties_set_data( properties, "image", output, owidth * ( oheight + 1 ) * 2, NULL, NULL ); + mlt_properties_set_data( properties, "image", output, owidth * ( oheight + 1 ) * 2, ( mlt_destructor )mlt_pool_release, NULL ); mlt_properties_set_int( properties, "width", owidth ); mlt_properties_set_int( properties, "height", oheight ); @@ -578,8 +585,7 @@ uint8_t *mlt_frame_rescale_yuv422( mlt_frame this, int owidth, int oheight ) if ( iwidth != owidth || iheight != oheight ) { // Create the output image - void *release = NULL; - uint8_t *output = mlt_pool_allocate( owidth * ( oheight + 1 ) * 2, &release ); + uint8_t *output = mlt_pool_alloc( owidth * ( oheight + 1 ) * 2 ); // Calculate strides int istride = iwidth * 2; @@ -587,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; @@ -600,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 @@ -642,8 +648,7 @@ uint8_t *mlt_frame_rescale_yuv422( mlt_frame this, int owidth, int oheight ) } // Now update the frame - mlt_properties_set_data( properties, "image_release", release, 0, ( mlt_destructor )mlt_pool_release, NULL ); - mlt_properties_set_data( properties, "image", output, owidth * ( oheight + 1 ) * 2, NULL, NULL ); + mlt_properties_set_data( properties, "image", output, owidth * ( oheight + 1 ) * 2, ( mlt_destructor )mlt_pool_release, NULL ); mlt_properties_set_int( properties, "width", owidth ); mlt_properties_set_int( properties, "height", oheight );