Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2017-12-15 14:35:41 +0300
committerSergey Sharybin <sergey.vfx@gmail.com>2017-12-15 14:37:23 +0300
commite50442418adf4377a86a102f213e836c6d155445 (patch)
tree7828c5a234b07599d606a176b4fb79693b9c8984 /source/blender/blenkernel/intern/tracking_auto.c
parent4cc0f09881174467f63f33ed16a5c6d6dfadeed3 (diff)
Tracking: Cleanup, make autotrack context creation code more granular
Diffstat (limited to 'source/blender/blenkernel/intern/tracking_auto.c')
-rw-r--r--source/blender/blenkernel/intern/tracking_auto.c156
1 files changed, 90 insertions, 66 deletions
diff --git a/source/blender/blenkernel/intern/tracking_auto.c b/source/blender/blenkernel/intern/tracking_auto.c
index 2120e730eab..28e2882a37f 100644
--- a/source/blender/blenkernel/intern/tracking_auto.c
+++ b/source/blender/blenkernel/intern/tracking_auto.c
@@ -281,6 +281,81 @@ static bool tracking_check_marker_margin(libmv_Marker *libmv_marker,
return true;
}
+/* Provide Libmv side of auto track all information about given tracks. */
+static void fill_autotrack_tracks(const int frame_width,
+ const int frame_height,
+ const ListBase *tracksbase,
+ const bool backwards,
+ struct libmv_AutoTrack *autotrack)
+{
+ int track_index = 0;
+ for (MovieTrackingTrack *track = tracksbase->first;
+ track != NULL;
+ track = track->next)
+ {
+ for (int i = 0; i < track->markersnr; ++i) {
+ MovieTrackingMarker *marker = track->markers + i;
+ 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);
+ }
+ track_index++;
+ }
+}
+
+static void create_per_track_tracking_options(const MovieClip *clip,
+ const MovieClipUser *user,
+ const ListBase *tracksbase,
+ AutoTrackContext *context)
+{
+ /* Count number of trackable tracks. */
+ for (MovieTrackingTrack *track = tracksbase->first;
+ track != NULL;
+ track = track->next)
+ {
+ if (check_track_trackable(clip, track, user)) {
+ context->num_tracks++;
+ }
+ }
+ /* Allocate required memory. */
+ context->options =
+ MEM_callocN(sizeof(AutoTrackOptions) * context->num_tracks,
+ "auto track options");
+ /* Fill in all the settings. */
+ int i = 0, track_index = 0;
+ for (MovieTrackingTrack *track = tracksbase->first;
+ track != NULL;
+ track = track->next)
+ {
+ if (!check_track_trackable(clip, track, user)) {
+ ++track_index;
+ continue;
+ }
+ AutoTrackOptions *options = &context->options[i++];
+ /* TODO(sergey): Single clip only for now. */
+ options->clip_index = 0;
+ options->track_index = track_index;
+ options->track = track;
+ tracking_configure_tracker(track,
+ NULL,
+ &options->track_region_options);
+ options->use_keyframe_match =
+ track->pattern_match == TRACK_MATCH_KEYFRAME;
+ context->tracks[track_index] = track;
+ ++track_index;
+ }
+}
+
AutoTrackContext *BKE_autotrack_context_new(MovieClip *clip,
MovieClipUser *user,
const bool backwards,
@@ -289,16 +364,13 @@ AutoTrackContext *BKE_autotrack_context_new(MovieClip *clip,
AutoTrackContext *context = MEM_callocN(sizeof(AutoTrackContext),
"autotrack context");
MovieTracking *tracking = &clip->tracking;
- MovieTrackingTrack *track;
ListBase *tracksbase = BKE_tracking_get_active_tracks(tracking);
- int i, track_index, frame_width, frame_height;
-
+ int frame_width, frame_height;
+ /* get size of frame to convert normalized coordinates to a picture ones. */
BKE_movieclip_get_size(clip, user, &frame_width, &frame_height);
-
/* TODO(sergey): Currently using only a single clip. */
context->clips[0] = clip;
context->num_clips = 1;
-
context->user = *user;
context->user.render_size = MCLIP_PROXY_RENDER_SIZE_FULL;
context->user.render_flag = 0;
@@ -309,75 +381,27 @@ AutoTrackContext *BKE_autotrack_context_new(MovieClip *clip,
context->first_frame = user->framenr;
context->sync_frame = user->framenr;
context->first_sync = true;
-
BLI_spin_init(&context->spin_lock);
-
- int num_total_tracks = BLI_listbase_count(tracksbase);
+ const int num_total_tracks = BLI_listbase_count(tracksbase);
context->tracks =
- MEM_callocN(sizeof(MovieTrackingTrack *) * num_total_tracks,
- "auto track pointers");
-
+ MEM_callocN(sizeof(MovieTrackingTrack *) * num_total_tracks,
+ "auto track pointers");
+ /* Initialize image accessor. */
context->image_accessor =
tracking_image_accessor_new(context->clips, 1,
context->tracks, num_total_tracks,
user->framenr);
+ /* Initialize auto track context and provide all information about currently
+ * tracked markers.
+ */
context->autotrack =
- libmv_autoTrackNew(context->image_accessor->libmv_accessor);
-
- /* Fill in Autotrack with all markers we know. */
- track_index = 0;
- for (track = tracksbase->first;
- track;
- track = track->next)
- {
- if (check_track_trackable(clip, track, user)) {
- context->num_tracks++;
- }
-
- for (i = 0; i < track->markersnr; ++i) {
- MovieTrackingMarker *marker = track->markers + i;
- if ((marker->flag & MARKER_DISABLED) == 0) {
- libmv_Marker libmv_marker;
- dna_marker_to_libmv_marker(track,
- marker,
- 0,
- track_index,
- frame_width,
- frame_height,
- backwards,
- &libmv_marker);
- libmv_autoTrackAddMarker(context->autotrack,
- &libmv_marker);
- }
- }
- track_index++;
- }
-
+ libmv_autoTrackNew(context->image_accessor->libmv_accessor);
+ fill_autotrack_tracks(frame_width, frame_height,
+ tracksbase,
+ backwards,
+ context->autotrack);
/* Create per-track tracking options. */
- context->options =
- MEM_callocN(sizeof(AutoTrackOptions) * context->num_tracks,
- "auto track options");
- i = track_index = 0;
- for (track = tracksbase->first;
- track;
- track = track->next)
- {
- if (check_track_trackable(clip, track, user)) {
- AutoTrackOptions *options = &context->options[i++];
- /* TODO(sergey): Single clip only for now. */
- options->clip_index = 0;
- options->track_index = track_index;
- options->track = track;
- tracking_configure_tracker(track,
- NULL,
- &options->track_region_options);
- options->use_keyframe_match =
- track->pattern_match == TRACK_MATCH_KEYFRAME;
- }
- context->tracks[track_index] = track;
- ++track_index;
- }
-
+ create_per_track_tracking_options(clip, user, tracksbase, context);
return context;
}