]> git.sesse.net Git - mlt/commitdiff
Compute a shot_change_list property for motion_est.
authorDan Dennedy <dan@dennedy.org>
Sat, 20 Oct 2012 05:31:57 +0000 (22:31 -0700)
committerDan Dennedy <dan@dennedy.org>
Sat, 20 Oct 2012 05:31:57 +0000 (22:31 -0700)
src/modules/motion_est/filter_motion_est.c

index a74bec749f16168102743ff89ed32649fe32bff9..aaf550f125b7757f212adaf5ec47cef9b116ae84 100644 (file)
@@ -952,10 +952,30 @@ static int filter_get_image( mlt_frame frame, uint8_t **image, mlt_image_format
                if( c->comparison_average > 10 * c->mb_w * c->mb_h &&
                    c->comparison_average > c->previous_msad * 2 )
                {
-                       fprintf(stderr, " - SAD: %d   <<Shot change>>\n", c->comparison_average);
+                       mlt_properties properties = MLT_FILTER_PROPERTIES( filter );
+                       mlt_log_verbose( MLT_FILTER_SERVICE(filter), "shot change: %d\n", c->comparison_average);
                        mlt_properties_set_int( MLT_FRAME_PROPERTIES( frame ), "shot_change", 1);
-               //      c->former_vectors_valid = 0; // Invalidate the previous frame's predictors
                        c->shot_change = 1;
+
+                       // Add the shot change to the list
+                       mlt_geometry key_frames = mlt_properties_get_data( properties, "shot_change_list", NULL );
+                       if ( !key_frames )
+                       {
+                               key_frames = mlt_geometry_init();
+                               mlt_properties_set_data( properties, "shot_change_list", key_frames, 0,
+                                       (mlt_destructor) mlt_geometry_close, (mlt_serialiser) mlt_geometry_serialise );
+                               if ( key_frames )
+                                       mlt_geometry_set_length( key_frames, mlt_filter_get_length2( filter, frame ) );
+                       }
+                       if ( key_frames )
+                       {
+                               struct mlt_geometry_item_s item;
+                               item.frame = (int) c->current_frame_position;
+                               item.x = c->comparison_average;
+                               item.f[0] = 1;
+                               item.f[1] = item.f[2] = item.f[3] = item.f[4] = 0;
+                               mlt_geometry_insert( key_frames, &item );
+                       }
                }
                else {
                        c->former_vectors_valid = 1;