X-Git-Url: http://research.m1stereo.tv/gitweb?a=blobdiff_plain;f=src%2Fmodules%2Fcore%2Ftransition_luma.c;h=9da80b32005c8816ff8a9cffdeeb9dde177f13a3;hb=2f0388dd55922a87623b70b1cb322d6635435708;hp=f0032c131d647d74df92dff16cfd552bec7039c2;hpb=1c246bcd681406f848726ff685eddb62efd7ee83;p=melted diff --git a/src/modules/core/transition_luma.c b/src/modules/core/transition_luma.c index f0032c1..9da80b3 100644 --- a/src/modules/core/transition_luma.c +++ b/src/modules/core/transition_luma.c @@ -37,8 +37,8 @@ static float position_calculate( mlt_transition this, mlt_frame frame ) mlt_position out = mlt_transition_get_out( this ); // Get the position of the frame - char *name = mlt_properties_get( mlt_transition_properties( this ), "_unique_id" ); - mlt_position position = mlt_properties_get_position( mlt_frame_properties( frame ), name ); + char *name = mlt_properties_get( MLT_TRANSITION_PROPERTIES( this ), "_unique_id" ); + mlt_position position = mlt_properties_get_position( MLT_FRAME_PROPERTIES( frame ), name ); // Now do the calcs return ( float )( position - in ) / ( float )( out - in + 1 ); @@ -75,9 +75,16 @@ static inline int dissolve_yuv( mlt_frame this, mlt_frame that, float weight, in int32_t weigh = weight * ( 1 << 16 ); int32_t weigh_complement = ( 1 - weight ) * ( 1 << 16 ); + if ( mlt_properties_get( &this->parent, "distort" ) ) + mlt_properties_set( &that->parent, "distort", mlt_properties_get( &this->parent, "distort" ) ); + mlt_properties_set_int( &that->parent, "consumer_deinterlace", mlt_properties_get_int( &this->parent, "consumer_deinterlace" ) ); mlt_frame_get_image( this, &p_dest, &format, &width, &height, 1 ); mlt_frame_get_image( that, &p_src, &format, &width_src, &height_src, 0 ); + // Pick the lesser of two evils ;-) + width_src = width_src > width ? width : width_src; + height_src = height_src > height ? height : height_src; + p = p_dest; limit = p_dest + height_src * width_src * 2; @@ -125,9 +132,16 @@ static void luma_composite( mlt_frame a_frame, mlt_frame b_frame, int luma_width format_src = mlt_image_yuv422; format_dest = mlt_image_yuv422; + if ( mlt_properties_get( &a_frame->parent, "distort" ) ) + mlt_properties_set( &b_frame->parent, "distort", mlt_properties_get( &a_frame->parent, "distort" ) ); + mlt_properties_set_int( &b_frame->parent, "consumer_deinterlace", mlt_properties_get_int( &a_frame->parent, "consumer_deinterlace" ) ); 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 ); + // 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; + stride_src = width_src * 2; stride_dest = width_dest * 2; @@ -340,13 +354,13 @@ static int transition_get_image( mlt_frame a_frame, uint8_t **image, mlt_image_f mlt_transition transition = mlt_frame_pop_service( a_frame ); // Get the properties of the transition - mlt_properties properties = mlt_transition_properties( transition ); + mlt_properties properties = MLT_TRANSITION_PROPERTIES( transition ); // Get the properties of the a frame - mlt_properties a_props = mlt_frame_properties( a_frame ); + mlt_properties a_props = MLT_FRAME_PROPERTIES( a_frame ); // Get the properties of the b frame - mlt_properties b_props = mlt_frame_properties( b_frame ); + mlt_properties b_props = MLT_FRAME_PROPERTIES( b_frame ); // The cached luma map information int luma_width = mlt_properties_get_int( properties, "width" ); @@ -358,7 +372,15 @@ static int transition_get_image( mlt_frame a_frame, uint8_t **image, mlt_image_f if ( luma_bitmap == NULL && resource != NULL ) { - char *extension = extension = strrchr( resource, '.' ); + char temp[ 512 ]; + char *extension = strrchr( resource, '.' ); + + if ( strchr( resource, '%' ) ) + { + sprintf( temp, "%s/lumas/%s/%s", mlt_factory_prefix( ), mlt_environment( "MLT_NORMALISATION" ), strchr( resource, '%' ) + 1 ); + resource = temp; + extension = strrchr( resource, '.' ); + } // See if it is a PGM if ( extension != NULL && strcmp( extension, ".pgm" ) == 0 ) @@ -389,7 +411,7 @@ static int transition_get_image( mlt_frame a_frame, uint8_t **image, mlt_image_f if ( producer != NULL ) { // Get the producer properties - mlt_properties producer_properties = mlt_producer_properties( producer ); + mlt_properties producer_properties = MLT_PRODUCER_PROPERTIES( producer ); // Ensure that we loop mlt_properties_set( producer_properties, "eof", "loop" ); @@ -401,13 +423,13 @@ static int transition_get_image( mlt_frame a_frame, uint8_t **image, mlt_image_f mlt_frame luma_frame = NULL; // Get the luma frame - if ( mlt_service_get_frame( mlt_producer_service( producer ), &luma_frame, 0 ) == 0 ) + if ( mlt_service_get_frame( MLT_PRODUCER_SERVICE( producer ), &luma_frame, 0 ) == 0 ) { uint8_t *luma_image; mlt_image_format luma_format = mlt_image_yuv422; // Get image from the luma producer - mlt_properties_set( mlt_frame_properties( luma_frame ), "rescale.interp", "none" ); + mlt_properties_set( MLT_FRAME_PROPERTIES( luma_frame ), "rescale.interp", "none" ); mlt_frame_get_image( luma_frame, &luma_image, &luma_format, &luma_width, &luma_height, 0 ); // Generate the luma map @@ -437,12 +459,16 @@ static int transition_get_image( mlt_frame a_frame, uint8_t **image, mlt_image_f float frame_delta = delta_calculate( transition, a_frame ); float luma_softness = mlt_properties_get_double( properties, "softness" ); - int progressive = mlt_properties_get_int( a_props, "progressive" ) || - mlt_properties_get_int( a_props, "consumer_progressive" ) || + int progressive = + mlt_properties_get_int( a_props, "consumer_deinterlace" ) || mlt_properties_get_int( properties, "progressive" ) || mlt_properties_get_int( b_props, "luma.progressive" ); int top_field_first = mlt_properties_get_int( b_props, "top_field_first" ); int reverse = mlt_properties_get_int( properties, "reverse" ); + int invert = mlt_properties_get_int( properties, "invert" ); + + if ( mlt_properties_get( a_props, "rescale.interp" ) == NULL ) + mlt_properties_set( a_props, "rescale.interp", "nearest" ); // Since we are the consumer of the b_frame, we must pass along this // consumer property from the a_frame @@ -455,24 +481,27 @@ static int transition_get_image( mlt_frame a_frame, uint8_t **image, mlt_image_f if ( mix >= 1.0 ) mix -= floor( mix ); - mix = reverse ? 1 - mix : mix; - frame_delta *= reverse ? -1.0 : 1.0; + mix = reverse || invert ? 1 - mix : mix; + frame_delta *= reverse || invert ? -1.0 : 1.0; // Ensure we get scaling on the b_frame mlt_properties_set( b_props, "rescale.interp", "nearest" ); + 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( a_frame, b_frame, luma_width, luma_height, luma_bitmap, mix, frame_delta, + luma_composite( !invert ? a_frame : b_frame, !invert ? b_frame : a_frame, luma_width, luma_height, luma_bitmap, mix, frame_delta, luma_softness, progressive ? -1 : top_field_first, width, height ); else // 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( a_props, "width" ); - *height = mlt_properties_get_int( a_props, "height" ); - *image = mlt_properties_get_data( a_props, "image", NULL ); + *width = mlt_properties_get_int( !invert ? a_props : b_props, "width" ); + *height = mlt_properties_get_int( !invert ? a_props : b_props, "height" ); + *image = mlt_properties_get_data( !invert ? a_props : b_props, "image", NULL ); return 0; } @@ -484,10 +513,10 @@ static int transition_get_image( mlt_frame a_frame, uint8_t **image, mlt_image_f static mlt_frame transition_process( mlt_transition transition, mlt_frame a_frame, mlt_frame b_frame ) { // Get a unique name to store the frame position - char *name = mlt_properties_get( mlt_transition_properties( transition ), "_unique_id" ); + char *name = mlt_properties_get( MLT_TRANSITION_PROPERTIES( transition ), "_unique_id" ); // Assign the current position to the name - mlt_properties_set_position( mlt_frame_properties( a_frame ), name, mlt_frame_get_position( a_frame ) ); + mlt_properties_set_position( MLT_FRAME_PROPERTIES( a_frame ), name, mlt_frame_get_position( a_frame ) ); // Push the transition on to the frame mlt_frame_push_service( a_frame, transition ); @@ -513,11 +542,14 @@ mlt_transition transition_luma_init( char *lumafile ) transition->process = transition_process; // Default factory - mlt_properties_set( mlt_transition_properties( transition ), "factory", "fezzik" ); + mlt_properties_set( MLT_TRANSITION_PROPERTIES( transition ), "factory", "fezzik" ); // Set the main property - mlt_properties_set( mlt_transition_properties( transition ), "resource", lumafile ); + mlt_properties_set( MLT_TRANSITION_PROPERTIES( transition ), "resource", lumafile ); + // Inform apps and framework that this is a video only transition + mlt_properties_set_int( MLT_TRANSITION_PROPERTIES( transition ), "_transition_type", 1 ); + return transition; } return NULL;