]> git.sesse.net Git - mlt/blobdiff - src/modules/core/transition_luma.c
Refactor to mlt_filter_get_progress().
[mlt] / src / modules / core / transition_luma.c
index f08d84f76bfc8c1050f236389107081b323c3fad..27e42837a0ef0ecde729b5116b313776ce1c5ebb 100644 (file)
@@ -137,9 +137,6 @@ static void luma_composite( mlt_frame a_frame, mlt_frame b_frame, int luma_width
        int stride_dest;
        uint16_t weight = 0;
 
-       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" ) );
@@ -348,12 +345,6 @@ static void luma_read_yuv422( uint8_t *image, uint16_t **map, int width, int hei
                *p++ = ( image[ i ] - 16 ) * 299; // 299 = 65535 / 219
 }
 
-/** Generate a luma map from a YUV image.
-*/
-static void luma_read_rgb24( uint8_t *image, uint16_t **map, int width, int height )
-{
-}
-
 /** Get the image.
 */
 
@@ -377,6 +368,8 @@ static int transition_get_image( mlt_frame a_frame, uint8_t **image, mlt_image_f
        // This compositer is yuv422 only
        *format = mlt_image_yuv422;
 
+       mlt_service_lock( MLT_TRANSITION_SERVICE( transition ) );
+
        // The cached luma map information
        int luma_width = mlt_properties_get_int( properties, "width" );
        int luma_height = mlt_properties_get_int( properties, "height" );
@@ -389,14 +382,15 @@ static int transition_get_image( mlt_frame a_frame, uint8_t **image, mlt_image_f
        // Correct width/height if not specified
        if ( luma_width == 0 || luma_height == 0 )
        {
-               luma_width = mlt_properties_get_int( a_props, "width" );
-               luma_height = mlt_properties_get_int( a_props, "height" );
+               luma_width = *width;
+               luma_height = *height;
        }
                
-       if ( resource != current_resource )
+       if ( resource && ( !current_resource || strcmp( resource, current_resource ) ) )
        {
                char temp[ 512 ];
                char *extension = strrchr( resource, '.' );
+               char *orig_resource = resource;
 
                if ( strchr( resource, '%' ) )
                {
@@ -425,7 +419,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( properties, "_resource", orig_resource );
                                mlt_properties_set_data( properties, "bitmap", luma_bitmap, luma_width * luma_height * 2, mlt_pool_release, NULL );
                        }
                }
@@ -470,16 +464,13 @@ static int transition_get_image( mlt_frame a_frame, uint8_t **image, mlt_image_f
                                        mlt_frame_get_image( luma_frame, &luma_image, &luma_format, &luma_width, &luma_height, 0 );
 
                                        // Generate the luma map
-                                       if ( luma_image != NULL && luma_format == mlt_image_yuv422 )
+                                       if ( luma_image != NULL )
                                                luma_read_yuv422( luma_image, &luma_bitmap, luma_width, luma_height );
-                                               
-                                       else if ( luma_image != NULL && luma_format == mlt_image_rgb24 )
-                                               luma_read_rgb24( luma_image, &luma_bitmap, luma_width, luma_height );
                                        
                                        // 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( properties, "_resource", orig_resource);
                                        mlt_properties_set_data( properties, "bitmap", luma_bitmap, luma_width * luma_height * 2, mlt_pool_release, NULL );
 
                                        // Cleanup the luma frame
@@ -495,7 +486,6 @@ static int transition_get_image( mlt_frame a_frame, uint8_t **image, mlt_image_f
        // Arbitrary composite defaults
        float mix = position_calculate( transition, a_frame );
        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, "consumer_deinterlace" ) ||
@@ -520,23 +510,34 @@ static int transition_get_image( mlt_frame a_frame, uint8_t **image, mlt_image_f
        if ( mix >= 1.0 )
                mix -= floor( mix );
 
-       mix = reverse || invert ? 1 - mix : mix;
-       frame_delta *= reverse || invert ? -1.0 : 1.0;
-
        // Ensure we get scaling on the b_frame
        if ( mlt_properties_get( b_props, "rescale.interp" ) == NULL || !strcmp( mlt_properties_get( b_props, "rescale.interp" ), "none" ) )
-               mlt_properties_set( b_props, "rescale.interp", "nearest" );
+               mlt_properties_set( b_props, "rescale.interp", mlt_properties_get( a_props, "rescale.interp" ) );
+       
+       if ( invert )
+               mlt_properties_set_int( b_props, "consumer_deinterlace", mlt_properties_get_int( a_props, "consumer_deinterlace") );
 
        if ( mlt_properties_get( properties, "fixed" ) )
                mix = mlt_properties_get_double( properties, "fixed" );
 
        if ( luma_width > 0 && luma_height > 0 && luma_bitmap != NULL )
+       {
+               reverse = invert ? !reverse : reverse;
+               mix = reverse ? 1 - mix : mix;
+               frame_delta *= reverse ? -1.0 : 1.0;
                // 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,
                        luma_softness, progressive ? -1 : top_field_first, width, height );
+       }
        else
+       {
+               mix = ( reverse || invert ) ? 1 - mix : mix;
+               invert = 0;
                // Dissolve the frames using the time offset for mix value
                dissolve_yuv( a_frame, b_frame, mix, *width, *height );
+       }
+       
+       mlt_service_unlock( MLT_TRANSITION_SERVICE( transition ) );
 
        // Extract the a_frame image info
        *width = mlt_properties_get_int( !invert ? a_props : b_props, "width" );
@@ -582,7 +583,7 @@ mlt_transition transition_luma_init( mlt_profile profile, mlt_service_type type,
                transition->process = transition_process;
                
                // Default factory
-               mlt_properties_set( MLT_TRANSITION_PROPERTIES( transition ), "factory", "fezzik" );
+               mlt_properties_set( MLT_TRANSITION_PROPERTIES( transition ), "factory", mlt_environment( "MLT_PRODUCER" ) );
 
                // Set the main property
                mlt_properties_set( MLT_TRANSITION_PROPERTIES( transition ), "resource", lumafile );