X-Git-Url: http://research.m1stereo.tv/gitweb?a=blobdiff_plain;f=src%2Fmodules%2Fcore%2Ftransition_composite.c;h=5c3e7afd1a3b1b16819ea08c557a4cacc7d146c4;hb=72815200c65ff4587df5e8da908b9281e044f1ca;hp=54ad00e621da7227a07679f81708186f2718bb2c;hpb=cb4fd5834c4ada53bbe723a9a035b64e180a05ad;p=melted diff --git a/src/modules/core/transition_composite.c b/src/modules/core/transition_composite.c index 54ad00e..5c3e7af 100644 --- a/src/modules/core/transition_composite.c +++ b/src/modules/core/transition_composite.c @@ -27,7 +27,7 @@ #include #include -typedef void ( *composite_line_fn )( uint8_t *dest, uint8_t *src, int width_src, uint8_t *alpha, int weight, uint16_t *luma, int softness ); +typedef void ( *composite_line_fn )( uint8_t *dest, uint8_t *src, int width_src, uint8_t *alpha, uint8_t *full_alpha, int weight, uint16_t *luma, int softness ); /* mmx function declarations */ #ifdef USE_MMX @@ -381,7 +381,7 @@ static void luma_read_yuv422( uint8_t *image, uint16_t **map, int width, int hei */ static inline -void composite_line_yuv( uint8_t *dest, uint8_t *src, int width_src, uint8_t *alpha, int weight, uint16_t *luma, int softness ) +void composite_line_yuv( uint8_t *dest, uint8_t *src, int width_src, uint8_t *alpha, uint8_t *full_alpha, int weight, uint16_t *luma, int softness ) { register int j; int a, mix; @@ -395,13 +395,15 @@ void composite_line_yuv( uint8_t *dest, uint8_t *src, int width_src, uint8_t *al dest++; *dest = ( *src++ * mix + *dest * ( ( 1 << 16 ) - mix ) ) >> 16; dest++; + if ( full_alpha && *full_alpha == 0 ) { *full_alpha = a; } + full_alpha ++; } } /** Composite function. */ -static int composite_yuv( uint8_t *p_dest, int width_dest, int height_dest, uint8_t *p_src, int width_src, int height_src, uint8_t *p_alpha, struct geometry_s geometry, int field, uint16_t *p_luma, int32_t softness, composite_line_fn line_fn ) +static int composite_yuv( uint8_t *p_dest, int width_dest, int height_dest, uint8_t *p_src, int width_src, int height_src, uint8_t *p_alpha, uint8_t *full_alpha, struct geometry_s geometry, int field, uint16_t *p_luma, int32_t softness, composite_line_fn line_fn ) { int ret = 0; int i; @@ -458,6 +460,9 @@ static int composite_yuv( uint8_t *p_dest, int width_dest, int height_dest, uint if ( p_alpha ) p_alpha += x_src + y_src * stride_src / bpp; + if ( full_alpha ) + full_alpha += x + y * stride_dest / bpp; + // offset pointer into luma channel based upon cropping if ( p_luma ) p_luma += x_src + y_src * stride_src / bpp; @@ -480,18 +485,22 @@ static int composite_yuv( uint8_t *p_dest, int width_dest, int height_dest, uint p_src += stride_src; if ( p_alpha ) p_alpha += stride_src / bpp; + if ( full_alpha ) + full_alpha += stride_dest / bpp; height_src--; } stride_src *= step; stride_dest *= step; int alpha_stride = stride_src / bpp; + int full_alpha_stride = stride_dest / bpp; // Make sure than x and w are even if ( x_uneven ) { p_src += 2; width_src --; + full_alpha ++; } // now do the compositing only to cropped extents @@ -499,12 +508,14 @@ static int composite_yuv( uint8_t *p_dest, int width_dest, int height_dest, uint { for ( i = 0; i < height_src; i += step ) { - line_fn( p_dest, p_src, width_src, p_alpha, weight, p_luma, softness ); + line_fn( p_dest, p_src, width_src, p_alpha, full_alpha, weight, p_luma, softness ); p_src += stride_src; p_dest += stride_dest; if ( p_alpha ) p_alpha += alpha_stride; + if ( full_alpha ) + full_alpha += full_alpha_stride; if ( p_luma ) p_luma += alpha_stride; } @@ -513,12 +524,14 @@ static int composite_yuv( uint8_t *p_dest, int width_dest, int height_dest, uint { for ( i = 0; i < height_src; i += step ) { - composite_line_yuv( p_dest, p_src, width_src, p_alpha, weight, p_luma, softness ); + composite_line_yuv( p_dest, p_src, width_src, p_alpha, full_alpha, weight, p_luma, softness ); p_src += stride_src; p_dest += stride_dest; if ( p_alpha ) p_alpha += alpha_stride; + if ( full_alpha ) + full_alpha += full_alpha_stride; if ( p_luma ) p_luma += alpha_stride; } @@ -566,9 +579,22 @@ static uint16_t* get_luma( mlt_properties properties, int width, int height ) char temp[ 512 ]; + if ( luma_width == 0 || luma_height == 0 ) + { + luma_width = width; + luma_height = height; + } + if ( resource != NULL && strchr( resource, '%' ) ) { + // TODO: Clean up quick and dirty compressed/existence check + FILE *test; sprintf( temp, "%s/lumas/%s/%s", mlt_factory_prefix( ), mlt_environment( "MLT_NORMALISATION" ), strchr( resource, '%' ) + 1 ); + test = fopen( temp, "r" ); + if ( test == NULL ) + strcat( temp, ".png" ); + else + fclose( test ); resource = temp; } @@ -581,7 +607,7 @@ static uint16_t* get_luma( mlt_properties properties, int width, int height ) // Load the original luma once if ( orig_bitmap == NULL ) { - char *extension = extension = strrchr( resource, '.' ); + char *extension = strrchr( resource, '.' ); // See if it is a PGM if ( extension != NULL && strcmp( extension, ".pgm" ) == 0 ) @@ -738,7 +764,7 @@ static int get_b_frame_image( mlt_transition this, mlt_frame b_frame, uint8_t ** ret = mlt_frame_get_image( b_frame, image, &format, width, height, 1 ); - return ret; + return ret && image != NULL; } @@ -1016,6 +1042,7 @@ static int transition_get_image( mlt_frame a_frame, uint8_t **image, mlt_image_f uint8_t *dest = *image; uint8_t *src = image_b; uint8_t *alpha = mlt_frame_get_alpha_mask( b_frame ); + uint8_t *full_alpha = mlt_frame_get_alpha_mask( a_frame ); int progressive = mlt_properties_get_int( a_props, "consumer_deinterlace" ) || mlt_properties_get_int( properties, "progressive" ); @@ -1026,6 +1053,14 @@ static int transition_get_image( mlt_frame a_frame, uint8_t **image, mlt_image_f //composite_line_fn line_fn = mlt_properties_get_int( properties, "_MMX" ) ? composite_line_yuv_mmx : NULL; composite_line_fn line_fn = NULL; + if ( full_alpha == NULL ) + { + full_alpha = mlt_pool_alloc( *width * *height ); + memset( full_alpha, 255, *width * *height ); + a_frame->get_alpha_mask = NULL; + mlt_properties_set_data( a_props, "alpha", full_alpha, 0, mlt_pool_release, NULL ); + } + for ( field = 0; field < ( progressive ? 1 : 2 ); field++ ) { // Assume lower field (0) first @@ -1048,7 +1083,7 @@ static int transition_get_image( mlt_frame a_frame, uint8_t **image, mlt_image_f alignment_calculate( &result ); // Composite the b_frame on the a_frame - composite_yuv( dest, *width, *height, src, width_b, height_b, alpha, result, progressive ? -1 : field, luma_bitmap, luma_softness, line_fn ); + composite_yuv( dest, *width, *height, src, width_b, height_b, alpha, full_alpha, result, progressive ? -1 : field, luma_bitmap, luma_softness, line_fn ); } } } @@ -1085,7 +1120,7 @@ static mlt_frame composite_process( mlt_transition this, mlt_frame a_frame, mlt_ mlt_properties props = mlt_properties_get_data( MLT_FRAME_PROPERTIES( b_frame ), "_producer", NULL ); mlt_frame_push_service_int( a_frame, mlt_properties_get_int( props, "in" ) ); mlt_frame_push_service_int( a_frame, mlt_properties_get_int( props, "out" ) ); - mlt_properties_set_int( MLT_FRAME_PROPERTIES( b_frame ), "relative_position", mlt_properties_get_int( props, "_frame" ) ); + mlt_properties_set_int( MLT_FRAME_PROPERTIES( b_frame ), "relative_position", mlt_properties_get_int( props, "_frame" ) - mlt_properties_get_int( props, "in" ) ); // Assign the current position to the name mlt_properties_set_position( MLT_FRAME_PROPERTIES( a_frame ), name, mlt_properties_get_position( MLT_FRAME_PROPERTIES( b_frame ), "relative_position" ) );