return ret;
}
+/** A resizing function for yuv422 frames - this does not rescale, but simply
+ resizes. It assumes yuv422 images available on the frame so use with care.
+*/
+
+uint8_t *mlt_frame_resize_yuv422( mlt_frame this, int owidth, int oheight )
+{
+ // 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;
+
+ // Coordinates (0,0 is middle of output)
+ int y, x;
+
+ // 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 and possibly invalid pointer in the input
+ uint8_t *in_middle = input + istride * in_y_range + in_x_range * 2;
+ int in_line = - out_y_range * istride - out_x_range * 2;
+ int in_ptr;
+
+ // Loop for the entirety of our output height.
+ for ( y = - out_y_range; y < out_y_range ; y ++ )
+ {
+ // Start at the beginning of the line
+ out_ptr = out_line;
+
+ // Point the start of the current input line (NB: can be out of range)
+ in_ptr = in_line;
+
+ // Loop for the entirety of our output row.
+ for ( x = - out_x_range; x < out_x_range; x ++ )
+ {
+ // Check if x and y are in the valid input range.
+ if ( abs( x ) < in_x_range && abs( y ) < in_y_range )
+ {
+ // We're in the input range for this row.
+ *out_ptr ++ = *( in_middle + in_ptr ++ );
+ *out_ptr ++ = *( in_middle + in_ptr ++ );
+ }
+ else
+ {
+ // We're not in the input range for this row.
+ *out_ptr ++ = 16;
+ *out_ptr ++ = 128;
+ in_ptr += 2;
+ }
+ }
+
+ // Move to next output line
+ out_line += ostride;
+
+ // Move to next input line
+ in_line += istride;
+ }
+
+ // 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;
+}
+
+/** A rescaling function for yuv422 frames - low quality, and provided for testing
+ only. It assumes yuv422 images available on the frame so use with care.
+*/
+
+uint8_t *mlt_frame_rescale_yuv422( mlt_frame this, int owidth, int oheight )
+{
+ // 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;
+
+ // 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 += 2 )
+ {
+ // 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;
+ *out_ptr ++ = *in_ptr ++;
+ *out_ptr ++ = *in_ptr ++;
+ *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;
+ *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;
+}
+
extern int mlt_convert_rgb24a_to_yuv422( uint8_t *rgba, int width, int height, int stride, uint8_t *yuv, uint8_t *alpha );
extern int mlt_convert_rgb24_to_yuv422( uint8_t *rgb, int width, int height, int stride, uint8_t *yuv );
extern int mlt_frame_composite_yuv( mlt_frame this, mlt_frame that, int x, int y, float weight );
-
+extern uint8_t *mlt_frame_resize_yuv422( mlt_frame this, int owidth, int oheight );
+extern uint8_t *mlt_frame_rescale_yuv422( mlt_frame this, int owidth, int oheight );
+
#endif
done
dist-clean:
- rm -f consumers.dat filters.dat producers.dat transitions.dat *.so; \
+ rm -f consumers.dat filters.dat producers.dat transitions.dat; \
list='$(SUBDIRS)'; \
for subdir in $$list; do \
if [ -f $$subdir/Makefile ] ; \
#include <framework/mlt.h>
#include <stdio.h>
+#include <string.h>
-int main( int argc, char **argv )
+mlt_producer create_producer( char *file )
{
- char temp[ 132 ];
- char *file1 = NULL;
- char *file2 = NULL;
-
- mlt_factory_init( "../modules" );
+ mlt_producer result = NULL;
+
+ // 1st Line preferences
+ if ( strstr( file, ".mpg" ) )
+ result = mlt_factory_producer( "mcmpeg", file );
+ else if ( strstr( file, ".mpeg" ) )
+ result = mlt_factory_producer( "mcmpeg", file );
+ else if ( strstr( file, ".dv" ) )
+ result = mlt_factory_producer( "mcdv", file );
+ else if ( strstr( file, ".jpg" ) )
+ result = mlt_factory_producer( "pixbuf", file );
+ else if ( strstr( file, ".png" ) )
+ result = mlt_factory_producer( "pixbuf", file );
+
+ // 2nd Line fallbacks
+ if ( result == NULL && strstr( file, ".dv" ) )
+ result = mlt_factory_producer( "libdv", file );
+
+ return result;
+}
- if ( argc >= 2 )
- file1 = argv[ 1 ];
- if ( argc >= 3 )
- file2 = argv[ 2 ];
+mlt_consumer create_consumer( char *id )
+{
+ return mlt_factory_consumer( id, NULL );
+}
- // Start the consumer...
- mlt_consumer sdl_out = mlt_factory_consumer( "sdl", NULL );
+void set_properties( mlt_service service, char *namevalue )
+{
+ mlt_properties properties = mlt_service_properties( service );
+ mlt_properties_parse( properties, namevalue );
+}
+void transport( mlt_producer producer )
+{
+ char temp[ 132 ];
fprintf( stderr, "Press return to continue\n" );
fgets( temp, 132, stdin );
+}
+
+int main( int argc, char **argv )
+{
+ int i;
+ mlt_service service = NULL;
+ mlt_consumer consumer = NULL;
+ mlt_producer producer = NULL;
+ mlt_factory_init( "../modules" );
+
+ // Parse the arguments
+ for ( i = 1; i < argc; i ++ )
+ {
+ if ( !strcmp( argv[ i ], "-vo" ) )
+ {
+ consumer = create_consumer( argv[ ++ i ] );
+ service = mlt_consumer_service( consumer );
+ }
+ else if ( strstr( argv[ i ], "=" ) )
+ {
+ set_properties( service, argv[ i ] );
+ }
+ else
+ {
+ producer = create_producer( argv[ i ] );
+ service = mlt_producer_service( producer );
+ }
+ }
+
+ // If we have no consumer, default to sdl
+ if ( consumer == NULL )
+ consumer= mlt_factory_consumer( "sdl", NULL );
+
+ // Connect producer to consumer
+ mlt_consumer_connect( consumer, mlt_producer_service( producer ) );
+
+ // Transport functionality
+ transport( producer );
+
+/*
// Create the producer(s)
- mlt_producer dv1 = mlt_factory_producer( "libdv", file1 );
- mlt_producer dv2 = mlt_factory_producer( "libdv", file2 );
+ mlt_producer dv1 = mlt_factory_producer( "mcmpeg", file1 );
+ mlt_producer dv2 = mlt_factory_producer( "mcmpeg", file2 );
//mlt_producer dv1 = producer_ppm_init( NULL );
//mlt_producer dv2 = producer_ppm_init( NULL );
mlt_consumer_connect( sdl_out, mlt_tractor_service( tractor ) );
// Do stuff until we're told otherwise...
- fprintf( stderr, "Press return to continue\n" );
- fgets( temp, 132, stdin );
// Close everything...
//mlt_consumer_close( sdl_out );
//mlt_multitrack_close( multitrack );
//mlt_producer_close( dv1 );
//mlt_producer_close( dv2 );
+*/
mlt_factory_close( );
--- /dev/null
+export LD_LIBRARY_PATH=`pwd`/../framework:\
+`pwd`/../modules/bluefish:\
+`pwd`/../../../bluefish/lib:\
+`pwd`/../../../mpeg_sdk_demo/bin:\
+`pwd`/../../../dv_sdk
return ret;
}
+/** A resizing function for yuv422 frames - this does not rescale, but simply
+ resizes. It assumes yuv422 images available on the frame so use with care.
+*/
+
+uint8_t *mlt_frame_resize_yuv422( mlt_frame this, int owidth, int oheight )
+{
+ // 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;
+
+ // Coordinates (0,0 is middle of output)
+ int y, x;
+
+ // 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 and possibly invalid pointer in the input
+ uint8_t *in_middle = input + istride * in_y_range + in_x_range * 2;
+ int in_line = - out_y_range * istride - out_x_range * 2;
+ int in_ptr;
+
+ // Loop for the entirety of our output height.
+ for ( y = - out_y_range; y < out_y_range ; y ++ )
+ {
+ // Start at the beginning of the line
+ out_ptr = out_line;
+
+ // Point the start of the current input line (NB: can be out of range)
+ in_ptr = in_line;
+
+ // Loop for the entirety of our output row.
+ for ( x = - out_x_range; x < out_x_range; x ++ )
+ {
+ // Check if x and y are in the valid input range.
+ if ( abs( x ) < in_x_range && abs( y ) < in_y_range )
+ {
+ // We're in the input range for this row.
+ *out_ptr ++ = *( in_middle + in_ptr ++ );
+ *out_ptr ++ = *( in_middle + in_ptr ++ );
+ }
+ else
+ {
+ // We're not in the input range for this row.
+ *out_ptr ++ = 16;
+ *out_ptr ++ = 128;
+ in_ptr += 2;
+ }
+ }
+
+ // Move to next output line
+ out_line += ostride;
+
+ // Move to next input line
+ in_line += istride;
+ }
+
+ // 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;
+}
+
+/** A rescaling function for yuv422 frames - low quality, and provided for testing
+ only. It assumes yuv422 images available on the frame so use with care.
+*/
+
+uint8_t *mlt_frame_rescale_yuv422( mlt_frame this, int owidth, int oheight )
+{
+ // 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;
+
+ // 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 += 2 )
+ {
+ // 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;
+ *out_ptr ++ = *in_ptr ++;
+ *out_ptr ++ = *in_ptr ++;
+ *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;
+ *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;
+}
+
extern int mlt_convert_rgb24a_to_yuv422( uint8_t *rgba, int width, int height, int stride, uint8_t *yuv, uint8_t *alpha );
extern int mlt_convert_rgb24_to_yuv422( uint8_t *rgb, int width, int height, int stride, uint8_t *yuv );
extern int mlt_frame_composite_yuv( mlt_frame this, mlt_frame that, int x, int y, float weight );
-
+extern uint8_t *mlt_frame_resize_yuv422( mlt_frame this, int owidth, int oheight );
+extern uint8_t *mlt_frame_rescale_yuv422( mlt_frame this, int owidth, int oheight );
+
#endif
done
dist-clean:
- rm -f consumers.dat filters.dat producers.dat transitions.dat *.so; \
+ rm -f consumers.dat filters.dat producers.dat transitions.dat; \
list='$(SUBDIRS)'; \
for subdir in $$list; do \
if [ -f $$subdir/Makefile ] ; \
#include <framework/mlt.h>
#include <stdio.h>
+#include <string.h>
-int main( int argc, char **argv )
+mlt_producer create_producer( char *file )
{
- char temp[ 132 ];
- char *file1 = NULL;
- char *file2 = NULL;
-
- mlt_factory_init( "../modules" );
+ mlt_producer result = NULL;
+
+ // 1st Line preferences
+ if ( strstr( file, ".mpg" ) )
+ result = mlt_factory_producer( "mcmpeg", file );
+ else if ( strstr( file, ".mpeg" ) )
+ result = mlt_factory_producer( "mcmpeg", file );
+ else if ( strstr( file, ".dv" ) )
+ result = mlt_factory_producer( "mcdv", file );
+ else if ( strstr( file, ".jpg" ) )
+ result = mlt_factory_producer( "pixbuf", file );
+ else if ( strstr( file, ".png" ) )
+ result = mlt_factory_producer( "pixbuf", file );
+
+ // 2nd Line fallbacks
+ if ( result == NULL && strstr( file, ".dv" ) )
+ result = mlt_factory_producer( "libdv", file );
+
+ return result;
+}
- if ( argc >= 2 )
- file1 = argv[ 1 ];
- if ( argc >= 3 )
- file2 = argv[ 2 ];
+mlt_consumer create_consumer( char *id )
+{
+ return mlt_factory_consumer( id, NULL );
+}
- // Start the consumer...
- mlt_consumer sdl_out = mlt_factory_consumer( "sdl", NULL );
+void set_properties( mlt_service service, char *namevalue )
+{
+ mlt_properties properties = mlt_service_properties( service );
+ mlt_properties_parse( properties, namevalue );
+}
+void transport( mlt_producer producer )
+{
+ char temp[ 132 ];
fprintf( stderr, "Press return to continue\n" );
fgets( temp, 132, stdin );
+}
+
+int main( int argc, char **argv )
+{
+ int i;
+ mlt_service service = NULL;
+ mlt_consumer consumer = NULL;
+ mlt_producer producer = NULL;
+ mlt_factory_init( "../modules" );
+
+ // Parse the arguments
+ for ( i = 1; i < argc; i ++ )
+ {
+ if ( !strcmp( argv[ i ], "-vo" ) )
+ {
+ consumer = create_consumer( argv[ ++ i ] );
+ service = mlt_consumer_service( consumer );
+ }
+ else if ( strstr( argv[ i ], "=" ) )
+ {
+ set_properties( service, argv[ i ] );
+ }
+ else
+ {
+ producer = create_producer( argv[ i ] );
+ service = mlt_producer_service( producer );
+ }
+ }
+
+ // If we have no consumer, default to sdl
+ if ( consumer == NULL )
+ consumer= mlt_factory_consumer( "sdl", NULL );
+
+ // Connect producer to consumer
+ mlt_consumer_connect( consumer, mlt_producer_service( producer ) );
+
+ // Transport functionality
+ transport( producer );
+
+/*
// Create the producer(s)
- mlt_producer dv1 = mlt_factory_producer( "libdv", file1 );
- mlt_producer dv2 = mlt_factory_producer( "libdv", file2 );
+ mlt_producer dv1 = mlt_factory_producer( "mcmpeg", file1 );
+ mlt_producer dv2 = mlt_factory_producer( "mcmpeg", file2 );
//mlt_producer dv1 = producer_ppm_init( NULL );
//mlt_producer dv2 = producer_ppm_init( NULL );
mlt_consumer_connect( sdl_out, mlt_tractor_service( tractor ) );
// Do stuff until we're told otherwise...
- fprintf( stderr, "Press return to continue\n" );
- fgets( temp, 132, stdin );
// Close everything...
//mlt_consumer_close( sdl_out );
//mlt_multitrack_close( multitrack );
//mlt_producer_close( dv1 );
//mlt_producer_close( dv2 );
+*/
mlt_factory_close( );
--- /dev/null
+export LD_LIBRARY_PATH=`pwd`/../framework:\
+`pwd`/../modules/bluefish:\
+`pwd`/../../../bluefish/lib:\
+`pwd`/../../../mpeg_sdk_demo/bin:\
+`pwd`/../../../dv_sdk