X-Git-Url: http://research.m1stereo.tv/gitweb?a=blobdiff_plain;f=src%2Fmodules%2Fcore%2Ftransition_luma.c;h=f08d84f76bfc8c1050f236389107081b323c3fad;hb=7e17e31f4c57e6a3560d3d5a29594f3d08edfd46;hp=a553836c14216bda80e8825f471663e39b1aa1e7;hpb=d33f444d4ef4c7bc4074d07a49eca0ab7d108394;p=melted diff --git a/src/modules/core/transition_luma.c b/src/modules/core/transition_luma.c index a553836..f08d84f 100644 --- a/src/modules/core/transition_luma.c +++ b/src/modules/core/transition_luma.c @@ -146,6 +146,9 @@ static void luma_composite( mlt_frame a_frame, mlt_frame b_frame, int luma_width mlt_frame_get_image( a_frame, &p_dest, &format_dest, &width_dest, &height_dest, 1 ); mlt_frame_get_image( b_frame, &p_src, &format_src, &width_src, &height_src, 0 ); + if ( *width == 0 || *height == 0 ) + return; + // Pick the lesser of two evils ;-) width_src = width_src > width_dest ? width_dest : width_src; height_src = height_src > height_dest ? height_dest : height_src; @@ -378,6 +381,7 @@ static int transition_get_image( mlt_frame a_frame, uint8_t **image, mlt_image_f int luma_width = mlt_properties_get_int( properties, "width" ); int luma_height = mlt_properties_get_int( properties, "height" ); uint16_t *luma_bitmap = mlt_properties_get_data( properties, "bitmap", NULL ); + char *current_resource = mlt_properties_get( properties, "_resource" ); // If the filename property changed, reload the map char *resource = mlt_properties_get( properties, "resource" ); @@ -389,7 +393,7 @@ static int transition_get_image( mlt_frame a_frame, uint8_t **image, mlt_image_f luma_height = mlt_properties_get_int( a_props, "height" ); } - if ( luma_bitmap == NULL && resource != NULL ) + if ( resource != current_resource ) { char temp[ 512 ]; char *extension = strrchr( resource, '.' ); @@ -397,7 +401,7 @@ static int transition_get_image( mlt_frame a_frame, uint8_t **image, mlt_image_f if ( strchr( resource, '%' ) ) { FILE *test; - sprintf( temp, "%s/lumas/%s/%s", mlt_factory_prefix( ), mlt_environment( "MLT_NORMALISATION" ), strchr( resource, '%' ) + 1 ); + sprintf( temp, "%s/lumas/%s/%s", mlt_environment( "MLT_DATA" ), mlt_environment( "MLT_NORMALISATION" ), strchr( resource, '%' ) + 1 ); test = fopen( temp, "r" ); if ( test == NULL ) strcat( temp, ".png" ); @@ -421,9 +425,16 @@ static int transition_get_image( mlt_frame a_frame, uint8_t **image, mlt_image_f // Set the transition properties mlt_properties_set_int( properties, "width", luma_width ); mlt_properties_set_int( properties, "height", luma_height ); + mlt_properties_set( properties, "_resource", resource ); mlt_properties_set_data( properties, "bitmap", luma_bitmap, luma_width * luma_height * 2, mlt_pool_release, NULL ); } } + else if (!*resource) + { + luma_bitmap = NULL; + mlt_properties_set( properties, "_resource", NULL ); + mlt_properties_set_data( properties, "bitmap", luma_bitmap, 0, mlt_pool_release, NULL ); + } else { // Get the factory producer service @@ -468,6 +479,7 @@ static int transition_get_image( mlt_frame a_frame, uint8_t **image, mlt_image_f // Set the transition properties mlt_properties_set_int( properties, "width", luma_width ); mlt_properties_set_int( properties, "height", luma_height ); + mlt_properties_set( properties, "_resource", resource); mlt_properties_set_data( properties, "bitmap", luma_bitmap, luma_width * luma_height * 2, mlt_pool_release, NULL ); // Cleanup the luma frame @@ -518,7 +530,6 @@ static int transition_get_image( mlt_frame a_frame, uint8_t **image, mlt_image_f if ( mlt_properties_get( properties, "fixed" ) ) mix = mlt_properties_get_double( properties, "fixed" ); - if ( luma_width > 0 && luma_height > 0 && luma_bitmap != NULL ) // Composite the frames using a luma map luma_composite( !invert ? a_frame : b_frame, !invert ? b_frame : a_frame, luma_width, luma_height, luma_bitmap, mix, frame_delta, @@ -527,7 +538,6 @@ static int transition_get_image( mlt_frame a_frame, uint8_t **image, mlt_image_f // Dissolve the frames using the time offset for mix value dissolve_yuv( a_frame, b_frame, mix, *width, *height ); - // Extract the a_frame image info *width = mlt_properties_get_int( !invert ? a_props : b_props, "width" ); *height = mlt_properties_get_int( !invert ? a_props : b_props, "height" );