diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2017-12-15 14:51:53 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2017-12-15 14:51:53 +0300 |
commit | 6b62f1dcb93d1a4a4ec2b7ed29afc6c0be6d3c21 (patch) | |
tree | 119bab1f748d614368dcce5ec11015db6f890289 /source/blender/blenkernel/intern/tracking_auto.c | |
parent | 4895bd6aceec57a08b471b6be9a0cabef30f7aa7 (diff) |
Tracking: Pass all markers to autotrack at once
This solves delay before tracking actually starts.
The issue is reported by Sebastian over IRC, thanks!
Diffstat (limited to 'source/blender/blenkernel/intern/tracking_auto.c')
-rw-r--r-- | source/blender/blenkernel/intern/tracking_auto.c | 49 |
1 files changed, 38 insertions, 11 deletions
diff --git a/source/blender/blenkernel/intern/tracking_auto.c b/source/blender/blenkernel/intern/tracking_auto.c index 28e2882a37f..ccff86e4258 100644 --- a/source/blender/blenkernel/intern/tracking_auto.c +++ b/source/blender/blenkernel/intern/tracking_auto.c @@ -288,7 +288,29 @@ static void fill_autotrack_tracks(const int frame_width, const bool backwards, struct libmv_AutoTrack *autotrack) { - int track_index = 0; + /* Count number of markers to be put to a context. */ + size_t num_trackable_marekrs = 0; + for (MovieTrackingTrack *track = tracksbase->first; + track != NULL; + track = track->next) + { + for (int i = 0; i < track->markersnr; ++i) { + const MovieTrackingMarker *marker = track->markers + i; + if ((marker->flag & MARKER_DISABLED) == 0) { + num_trackable_marekrs++; + } + } + } + /* Early output if we don't have any markers. */ + if (num_trackable_marekrs == 0) { + return; + } + /* Allocate memory for all the markers. */ + libmv_Marker *libmv_markers = MEM_mallocN( + sizeof(libmv_Marker) * num_trackable_marekrs, + "libmv markers array"); + /* Fill in markers array. */ + int track_index = 0, num_filled_libmv_markers = 0; for (MovieTrackingTrack *track = tracksbase->first; track != NULL; track = track->next) @@ -298,19 +320,24 @@ static void fill_autotrack_tracks(const int frame_width, if ((marker->flag & MARKER_DISABLED) != 0) { continue; } - libmv_Marker libmv_marker; - dna_marker_to_libmv_marker(track, - marker, - 0, - track_index, - frame_width, - frame_height, - backwards, - &libmv_marker); - libmv_autoTrackAddMarker(autotrack, &libmv_marker); + dna_marker_to_libmv_marker( + track, + marker, + 0, + track_index, + frame_width, frame_height, + backwards, + &libmv_markers[num_filled_libmv_markers++]); } + /* Put all markers to autotrack at once. */ track_index++; } + /* Add all markers to autotrack. */ + libmv_autoTrackSetMarkers(autotrack, + libmv_markers, + num_trackable_marekrs); + /* Free temporary memory. */ + MEM_freeN(libmv_markers); } static void create_per_track_tracking_options(const MovieClip *clip, |