X-Git-Url: http://research.m1stereo.tv/gitweb?a=blobdiff_plain;f=src%2Fmodules%2Fcore%2Ffilter_resize.c;h=f9f80dfe4875bf6ccfc3d5224b13171f0fa27b10;hb=af570ac8e6d5601fc2e84a6955c94b4ff9194bd7;hp=c82423aa11cdd3cfc22d3f7502bc56d766c59344;hpb=c974f8e87e0bd3de851fb638660f502092b1425e;p=melted diff --git a/src/modules/core/filter_resize.c b/src/modules/core/filter_resize.c index c82423a..f9f80df 100644 --- a/src/modules/core/filter_resize.c +++ b/src/modules/core/filter_resize.c @@ -27,6 +27,16 @@ #include #include +/** Swapbytes inline. +*/ + +static inline void swap_bytes( uint8_t *upper, uint8_t *lower ) +{ + uint8_t t = *lower; + *lower = *upper; + *upper = t; +} + /** Do it :-). */ @@ -110,27 +120,31 @@ static int filter_get_image( mlt_frame this, uint8_t **image, mlt_image_format * char *op = mlt_properties_get( MLT_FILTER_PROPERTIES( filter ), "scale" ); // Correct field order if needed - if ( mlt_properties_get_int( properties, "top_field_first" ) == 1 ) + if ( mlt_properties_get_int( properties, "top_field_first" ) == 1 || mlt_properties_get_int( properties, "meta.top_field_first" ) == 1 ) { // Get the input image, width and height int size; uint8_t *image = mlt_properties_get_data( properties, "image", &size ); - - // Keep the original image around to be destroyed on frame close - mlt_properties_rename( properties, "image", "original_image" ); - - // Duplicate the last line in the field to avoid artifact - memcpy( image + oheight * owidth * 2, image + oheight * owidth * 2 - owidth * 4, owidth * 2 ); - - // Offset the image pointer by one line - image += owidth * 2; - size -= owidth * 2; - - // Set the new image pointer with no destructor - mlt_properties_set_data( properties, "image", image, size, NULL, NULL ); + uint8_t *ptr = image + owidth * 2; + int h = oheight / 2; + int w = owidth; + + // Swap the lines around + while( h -- ) + { + w = owidth; + while( w -- ) + { + swap_bytes( image ++, ptr ++ ); + swap_bytes( image ++, ptr ++ ); + } + image += owidth * 2; + ptr += owidth * 2; + } // Set the normalised field order mlt_properties_set_int( properties, "top_field_first", 0 ); + mlt_properties_set_int( properties, "meta.top_field_first", 0 ); } if ( !strcmp( op, "affine" ) )