X-Git-Url: http://research.m1stereo.tv/gitweb?a=blobdiff_plain;f=src%2Fmodules%2Fcore%2Ftransition_luma.c;h=9da80b32005c8816ff8a9cffdeeb9dde177f13a3;hb=6ad443b3ffd53b2e8be119df6fb7d3f2da1c4cec;hp=024397421e919877ac9313b666c250d7fd510b22;hpb=f4fef6a77643c2ec85e00f0afc28d88fe0fbd4a9;p=melted diff --git a/src/modules/core/transition_luma.c b/src/modules/core/transition_luma.c index 0243974..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,6 +75,9 @@ 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 ); @@ -129,6 +132,9 @@ 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 ); @@ -348,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" ); @@ -366,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 ) @@ -397,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" ); @@ -409,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 @@ -446,11 +460,15 @@ static int transition_get_image( mlt_frame a_frame, uint8_t **image, mlt_image_f float luma_softness = mlt_properties_get_double( properties, "softness" ); int progressive = - mlt_properties_get_int( a_props, "consumer_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 @@ -463,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; } @@ -492,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 ); @@ -521,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;