[Bf-blender-cvs] [d919218] master: Tracking: Fix wrong behavior of refining with previous frame matching
Sergey Sharybin
noreply at git.blender.org
Thu Sep 11 16:44:04 CEST 2014
Commit: d9192184821f0a5a67672a76be4f048969361c30
Author: Sergey Sharybin
Date: Thu Sep 11 20:43:41 2014 +0600
Branches: master
https://developer.blender.org/rBd9192184821f0a5a67672a76be4f048969361c30
Tracking: Fix wrong behavior of refining with previous frame matching
===================================================================
M source/blender/blenkernel/intern/tracking_region_tracker.c
===================================================================
diff --git a/source/blender/blenkernel/intern/tracking_region_tracker.c b/source/blender/blenkernel/intern/tracking_region_tracker.c
index 6300e29..c41106f 100644
--- a/source/blender/blenkernel/intern/tracking_region_tracker.c
+++ b/source/blender/blenkernel/intern/tracking_region_tracker.c
@@ -725,6 +725,35 @@ void BKE_tracking_context_finish(MovieTrackingContext *context)
}
}
+static bool refine_marker_reference_frame_get(MovieTrackingTrack *track,
+ MovieTrackingMarker *marker,
+ bool backwards,
+ int *reference_framenr)
+{
+ const MovieTrackingMarker *first_marker = track->markers;
+ const MovieTrackingMarker *last_marker = track->markers + track->markersnr - 1;
+ MovieTrackingMarker *reference = backwards ? marker + 1 : marker - 1;
+
+ while (reference >= first_marker &&
+ reference <= last_marker &&
+ (reference->flag & MARKER_DISABLED) != 0)
+ {
+ if (backwards)
+ reference++;
+ else
+ reference--;
+ }
+
+ if (reference < first_marker ||
+ reference > last_marker)
+ {
+ return false;
+ }
+
+ *reference_framenr = reference->framenr;
+ return (reference->flag & MARKER_DISABLED) == 0;
+}
+
/* Refine marker's position using previously known keyframe.
* Direction of searching for a keyframe depends on backwards flag,
* which means if backwards is false, previous keyframe will be as
@@ -748,14 +777,15 @@ void BKE_tracking_refine_marker(MovieClip *clip, MovieTrackingTrack *track, Movi
BKE_movieclip_get_size(clip, &user, &frame_width, &frame_height);
- /* Get an image buffer for reference frame, also gets reference marker.
- *
- * Usually tracking_context_get_reference_ibuf will return current frame
- * if marker is keyframed, which is correct for normal tracking. But here
- * we'll want to have next/previous frame in such cases. So let's use small
- * magic with original frame number used to get reference frame for.
- */
- reference_framenr = backwards ? marker->framenr + 1 : marker->framenr - 1;
+ /* Get an image buffer for reference frame, also gets reference marker. */
+ if (!refine_marker_reference_frame_get(track,
+ marker,
+ backwards,
+ &reference_framenr))
+ {
+ return;
+ }
+
reference_ibuf = tracking_context_get_reference_ibuf(clip, &user, clip_flag, track, reference_framenr,
backwards, &reference_marker);
if (reference_ibuf == NULL) {
More information about the Bf-blender-cvs
mailing list