- // Get properties
- mlt_properties properties = mlt_frame_properties( this );
-
- // Get the input image, width and height
- uint8_t *input = mlt_properties_get_data( properties, "image", NULL );
- int iwidth = mlt_properties_get_int( properties, "width" );
- int iheight = mlt_properties_get_int( properties, "height" );
-
- // If width and height are correct, don't do anything
- if ( iwidth != owidth || iheight != oheight )
- {
- // Create the output image
- uint8_t *output = malloc( owidth * oheight * 2 );
-
- // Calculate strides
- int istride = iwidth * 2;
- int ostride = owidth * 2;
-
- iwidth = iwidth - ( iwidth % 4 );
-
- // Coordinates (0,0 is middle of output)
- int y, x;
-
- // Derived coordinates
- int dy, dx;
-
- // Calculate ranges
- int out_x_range = owidth / 2;
- int out_y_range = oheight / 2;
- int in_x_range = iwidth / 2;
- int in_y_range = iheight / 2;
-
- // Output pointers
- uint8_t *out_line = output;
- 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
- float scale_width = ( float )iwidth / ( float )owidth;
- float scale_height = ( float )iheight / ( float )oheight;
-
- // Loop for the entirety of our output height.
- for ( y = - out_y_range; y < out_y_range ; y ++ )
- {
- // Calculate the derived y value
- dy = scale_height * y;
-
- // 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;
-
- // Loop for the entirety of our output row.
- for ( x = - out_x_range; x < out_x_range; x += 1 )
- {
- // Calculated the derived x
- dx = scale_width * x;
-
- // Check if x and y are in the valid input range.
- if ( abs( dx ) < in_x_range && abs( dy ) < in_y_range )
- {
- // We're in the input range for this row.
- in_ptr = in_line + ( dx >> 1 ) * 4 + 2 * ( x & 1 );
- *out_ptr ++ = *in_ptr ++;
- *out_ptr ++ = *in_ptr ++;
- }
- else
- {
- // We're not in the input range for this row.
- *out_ptr ++ = 16;
- *out_ptr ++ = 128;
- }
- }
-
- // Move to next output line
- out_line += ostride;
- }
-
- // Now update the frame
- mlt_properties_set_data( properties, "image", output, owidth * oheight * 2, free, NULL );
- mlt_properties_set_int( properties, "width", owidth );
- mlt_properties_set_int( properties, "height", oheight );
-
- // Return the output
- return output;
- }
-
- // No change, return input
- return input;