X-Git-Url: http://research.m1stereo.tv/gitweb?a=blobdiff_plain;f=src%2Fframework%2Fmlt_frame.c;h=60dfb2817c7cf0c8182aec1e6b38d924f001122c;hb=00db7ed91dfa61f9e144b6d5548350a5954deb61;hp=5a2eaad78176db2e53dbc572ea32b9bd095f2cb6;hpb=8a3795b090723264c973d274eedc28da480e76fd;p=melted diff --git a/src/framework/mlt_frame.c b/src/framework/mlt_frame.c index 5a2eaad..60dfb28 100644 --- a/src/framework/mlt_frame.c +++ b/src/framework/mlt_frame.c @@ -65,8 +65,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 +135,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 +143,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 +151,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 +159,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 +206,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 ); @@ -230,26 +237,23 @@ int mlt_frame_get_image( mlt_frame this, uint8_t **buffer, mlt_image_format *for *buffer = NULL; break; case mlt_image_rgb24: - // IRRIGATE ME size *= 3; size += *width * 3; - *buffer = malloc( size ); + *buffer = mlt_pool_alloc( size ); if ( *buffer ) memset( *buffer, 255, size ); break; case mlt_image_rgb24a: - // IRRIGATE ME size *= 4; size += *width * 4; - *buffer = malloc( size ); + *buffer = mlt_pool_alloc( size ); if ( *buffer ) memset( *buffer, 255, size ); break; case mlt_image_yuv422: - // IRRIGATE ME size *= 2; size += *width * 2; - *buffer = malloc( size ); + *buffer = mlt_pool_alloc( size ); p = *buffer; q = p + size; while ( p != NULL && p != q ) @@ -260,13 +264,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 = malloc( size ); - if ( *buffer ) + *buffer = mlt_pool_alloc( size ); + if ( *buffer ) memset( *buffer, 255, size ); break; } - mlt_properties_set_data( properties, "image", *buffer, size, free, NULL ); + mlt_properties_set_data( properties, "image", *buffer, size, ( mlt_destructor )mlt_pool_release, NULL ); mlt_properties_set_int( properties, "test_image", 1 ); } @@ -295,10 +299,10 @@ int mlt_frame_get_audio( mlt_frame this, int16_t **buffer, mlt_audio_format *for *channels = *channels <= 0 ? 2 : *channels; *frequency = *frequency <= 0 ? 48000 : *frequency; size = *samples * *channels * sizeof( int16_t ); - *buffer = malloc( size ); + *buffer = mlt_pool_alloc( size ); if ( *buffer != NULL ) memset( *buffer, 0, size ); - mlt_properties_set_data( properties, "audio", *buffer, size, free, 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; @@ -306,8 +310,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 *****/ @@ -464,7 +474,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 @@ -473,8 +482,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; @@ -490,8 +499,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. @@ -502,8 +511,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 @@ -517,8 +526,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; } } @@ -540,14 +549,13 @@ uint8_t *mlt_frame_resize_yuv422( mlt_frame this, int owidth, int oheight ) if ( iwidth != owidth || iheight != oheight ) { // Create the output image - // IRRIGATE ME - uint8_t *output = malloc( owidth * ( oheight + 1 ) * 2 ); + 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", output, owidth * ( oheight + 1 ) * 2, free, 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 ); @@ -576,8 +584,7 @@ uint8_t *mlt_frame_rescale_yuv422( mlt_frame this, int owidth, int oheight ) if ( iwidth != owidth || iheight != oheight ) { // Create the output image - // IRRIGATE ME - uint8_t *output = malloc( owidth * ( oheight + 1 ) * 2 ); + uint8_t *output = mlt_pool_alloc( owidth * ( oheight + 1 ) * 2 ); // Calculate strides int istride = iwidth * 2; @@ -585,9 +592,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; @@ -598,41 +602,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 @@ -640,7 +647,7 @@ uint8_t *mlt_frame_rescale_yuv422( mlt_frame this, int owidth, int oheight ) } // Now update the frame - mlt_properties_set_data( properties, "image", output, owidth * oheight * 2, free, 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 );