X-Git-Url: http://research.m1stereo.tv/gitweb?a=blobdiff_plain;f=src%2Fmodules%2Favformat%2Ffilter_avcolour_space.c;h=53b6780c2c3321890a043763096112e1a10d11b4;hb=d0d02a8f3f96d1a032c880412e6b3459d07feb1b;hp=4a53e940557831cbbea31393922275199cbc706e;hpb=eccf04749681f70957f34fdd6742224774e72d15;p=melted diff --git a/src/modules/avformat/filter_avcolour_space.c b/src/modules/avformat/filter_avcolour_space.c index 4a53e94..53b6780 100644 --- a/src/modules/avformat/filter_avcolour_space.c +++ b/src/modules/avformat/filter_avcolour_space.c @@ -57,57 +57,11 @@ static inline int convert_mlt_to_av_cs( mlt_image_format format ) static inline void convert_image( uint8_t *out, uint8_t *in, int out_fmt, int in_fmt, int width, int height ) { - if ( in_fmt == PIX_FMT_YUV420P && out_fmt == PIX_FMT_YUV422 ) - { - register int i, j; - register int half = width >> 1; - register uint8_t *Y = in; - register uint8_t *U = Y + width * height; - register uint8_t *V = U + width * height / 2; - register uint8_t *d = out; - register uint8_t *y, *u, *v; - - i = height >> 1; - while ( i -- ) - { - y = Y; - u = U; - v = V; - j = half; - while ( j -- ) - { - *d ++ = *y ++; - *d ++ = *u ++; - *d ++ = *y ++; - *d ++ = *v ++; - } - - Y += width; - y = Y; - u = U; - v = V; - j = half; - while ( j -- ) - { - *d ++ = *y ++; - *d ++ = *u ++; - *d ++ = *y ++; - *d ++ = *v ++; - } - - Y += width; - U += width / 2; - V += width / 2; - } - } - else - { - AVPicture input; - AVPicture output; - avpicture_fill( &output, out, out_fmt, width, height ); - avpicture_fill( &input, in, in_fmt, width, height ); - img_convert( &output, out_fmt, &input, in_fmt, width, height ); - } + AVPicture input; + AVPicture output; + avpicture_fill( &output, out, out_fmt, width, height ); + avpicture_fill( &input, in, in_fmt, width, height ); + img_convert( &output, out_fmt, &input, in_fmt, width, height ); } /** Do it :-). @@ -133,12 +87,43 @@ static int filter_get_image( mlt_frame this, uint8_t **image, mlt_image_format * int size = avpicture_get_size( out_fmt, *width, *height ); uint8_t *output = mlt_pool_alloc( size ); convert_image( output, *image, out_fmt, in_fmt, *width, *height ); + + // Special case for alpha rgb input + if ( *format == mlt_image_rgb24a ) + { + register uint8_t *alpha = mlt_frame_get_alpha_mask( this ); + register int len = *width * *height; + register uint8_t *bits = *image; + register int n = ( len + 7 ) / 8; + + // TODO: Proper check for big endian systems + #ifndef __DARWIN__ + bits += 3; + #endif + + // Extract alpha mask from the image using Duff's Device + switch( len % 8 ) + { + case 0: do { *alpha ++ = *bits; bits += 4; + case 7: *alpha ++ = *bits; bits += 4; + case 6: *alpha ++ = *bits; bits += 4; + case 5: *alpha ++ = *bits; bits += 4; + case 4: *alpha ++ = *bits; bits += 4; + case 3: *alpha ++ = *bits; bits += 4; + case 2: *alpha ++ = *bits; bits += 4; + case 1: *alpha ++ = *bits; bits += 4; + } + while( --n ); + } + } + + // Update the output *image = output; *format = output_format; mlt_properties_set_data( properties, "image", output, size, mlt_pool_release, NULL ); mlt_properties_set_int( properties, "format", output_format ); - // Special case for alpha rgb - merge the alpha mask when it exists + // Special case for alpha rgb output if ( *format == mlt_image_rgb24a ) { // Fetch the alpha