]> git.sesse.net Git - mlt/blobdiff - src/modules/core/producer_loader.c
add framerate adaption to consumer producer
[mlt] / src / modules / core / producer_loader.c
index 4092bd1efca2aa517294f10e81657e0e8ade7047..2600b62cc46b6374ea85a9fc916dd2b3921051d8 100644 (file)
@@ -53,7 +53,8 @@ static mlt_producer create_producer( mlt_profile profile, char *file )
        mlt_producer result = NULL;
 
        // 1st Line - check for service:resource handling
-       if ( strchr( file, ':' ) )
+       // And ignore drive letters on Win32 - no single char services supported.
+       if ( strchr( file, ':' ) > file + 1 )
        {
                char *temp = strdup( file );
                char *service = temp;
@@ -70,6 +71,9 @@ static mlt_producer create_producer( mlt_profile profile, char *file )
                char *lookup = strdup( file );
                char *p = lookup;
 
+               // Make backup of profile for determining if we need to use 'consumer' producer.
+               mlt_profile backup_profile = mlt_profile_clone( profile );
+
                // We only need to load the dictionary once
                if ( dictionary == NULL )
                {
@@ -92,8 +96,34 @@ static mlt_producer create_producer( mlt_profile profile, char *file )
                        char *name = mlt_properties_get_name( dictionary, i );
                        if ( fnmatch( name, lookup, 0 ) == 0 )
                                result = create_from( profile, file, mlt_properties_get_value( dictionary, i ) );
+               }       
+
+               // Check if the producer changed the profile - xml does this.
+               // The consumer producer does not handle frame rate differences.
+               if ( result && backup_profile->is_explicit && (
+                    profile->width != backup_profile->width ||
+                    profile->height != backup_profile->height ||
+                    profile->sample_aspect_num != backup_profile->sample_aspect_num ||
+                    profile->sample_aspect_den != backup_profile->sample_aspect_den ||
+                    profile->colorspace != backup_profile->colorspace ) )
+               {
+                       // Restore the original profile attributes.
+                       profile->display_aspect_den = backup_profile->display_aspect_den;
+                       profile->display_aspect_num = backup_profile->display_aspect_num;
+                       profile->frame_rate_den = backup_profile->frame_rate_den;
+                       profile->frame_rate_num = backup_profile->frame_rate_num;
+                       profile->height = backup_profile->height;
+                       profile->progressive = backup_profile->progressive;
+                       profile->sample_aspect_den = backup_profile->sample_aspect_den;
+                       profile->sample_aspect_num = backup_profile->sample_aspect_num;
+                       profile->width = backup_profile->width;
+
+                       // Use the 'consumer' producer.
+                       mlt_producer_close( result );
+                       result = mlt_factory_producer( profile, "consumer", file );
                }
 
+               mlt_profile_close( backup_profile );
                free( lookup );
        }