]> git.sesse.net Git - mlt/blobdiff - src/modules/kdenlive/producer_framebuffer.c
make mlt_position type double
[mlt] / src / modules / kdenlive / producer_framebuffer.c
index d7bd900730645e12af81731b187e6f7db82ec782..e4780721ec99688275c9d3e972e2a0bb01d039a3 100644 (file)
@@ -74,7 +74,7 @@ static int framebuffer_get_image( mlt_frame frame, uint8_t **image, mlt_image_fo
                {
                        // Strobe effect wanted, calculate frame position
                        need_first = floor( actual_position );
-                       need_first -= need_first % strobe;
+                       need_first -= MLT_POSITION_MOD(need_first, strobe);
                }
                if ( freeze )
                {
@@ -157,7 +157,8 @@ static int framebuffer_get_image( mlt_frame frame, uint8_t **image, mlt_image_fo
                int error = mlt_frame_get_image( first_frame, &first_image, format, width, height, writable );
 
                if ( error != 0 ) {
-                       mlt_log_error( MLT_PRODUCER_SERVICE( producer ), "first_image == NULL get image died\n" );
+                       mlt_log_warning( MLT_PRODUCER_SERVICE( producer ), "first_image == NULL get image died\n" );
+                       mlt_properties_set_data( properties, "first_frame", NULL, 0, NULL, NULL );
                        mlt_service_unlock( MLT_PRODUCER_SERVICE( producer ) );
                        return error;
                }
@@ -321,6 +322,28 @@ mlt_producer producer_framebuffer_init( mlt_profile profile, mlt_service_type ty
                {
                        double real_length = ( (double)  mlt_producer_get_length( real_producer ) ) / speed;
                        mlt_properties_set_position( properties, "length", real_length );
+                       mlt_properties real_properties = MLT_PRODUCER_PROPERTIES( real_producer );
+                       const char* service = mlt_properties_get( real_properties, "mlt_service" );
+                       if ( service && !strcmp( service, "avformat" ) )
+                       {
+                               int n = mlt_properties_count( real_properties );
+                               int i;
+                               for ( i = 0; i < n; i++ )
+                               {
+                                       if ( strstr( mlt_properties_get_name( real_properties, i ), "stream.frame_rate" ) )
+                                       {
+                                               double source_fps = mlt_properties_get_double( real_properties, mlt_properties_get_name( real_properties, i ) );
+                                               if ( source_fps > mlt_profile_fps( profile ) )
+                                               {
+                                                       mlt_properties_set_double( real_properties, "force_fps", source_fps * speed );
+                                                       mlt_properties_set_position( real_properties, "length", real_length );
+                                                       mlt_properties_set_position( real_properties, "out", real_length - 1 );
+                                                       speed = 1.0;
+                                               }
+                                               break;
+                                       }
+                               }
+                       }
                }
                mlt_properties_set_position( properties, "out", mlt_producer_get_length( producer ) - 1 );