Fix T40382: 2D stabilization uses disabled markers

This lead to unpredictable results in some cases.
This commit is contained in:
2014-06-05 19:25:21 +06:00
parent 8355955058
commit 543ce859f3

View File

@@ -59,12 +59,13 @@ static bool stabilization_median_point_get(MovieTracking *tracking, int framenr,
track = tracking->tracks.first; track = tracking->tracks.first;
while (track) { while (track) {
if (track->flag & TRACK_USE_2D_STAB) { if (track->flag & TRACK_USE_2D_STAB) {
MovieTrackingMarker *marker = BKE_tracking_marker_get(track, framenr); MovieTrackingMarker *marker = BKE_tracking_marker_get_exact(track, framenr);
if (marker != NULL && (marker->flag & MARKER_DISABLED) == 0) {
minmax_v2v2_v2(min, max, marker->pos); minmax_v2v2_v2(min, max, marker->pos);
ok = true; ok = true;
} }
}
track = track->next; track = track->next;
} }
@@ -101,12 +102,14 @@ static void stabilization_calculate_data(MovieTracking *tracking, int framenr, i
float x0 = (float)width / 2.0f, y0 = (float)height / 2.0f; float x0 = (float)width / 2.0f, y0 = (float)height / 2.0f;
float x = median[0] * width, y = median[1] * height; float x = median[0] * width, y = median[1] * height;
marker = BKE_tracking_marker_get(stab->rot_track, 1); marker = BKE_tracking_marker_get_exact(stab->rot_track, 1);
if (marker != NULL && (marker->flag & MARKER_DISABLED) == 0) {
sub_v2_v2v2(a, marker->pos, firstmedian); sub_v2_v2v2(a, marker->pos, firstmedian);
a[0] *= width; a[0] *= width;
a[1] *= height; a[1] *= height;
marker = BKE_tracking_marker_get(stab->rot_track, framenr); marker = BKE_tracking_marker_get_exact(stab->rot_track, framenr);
if (marker != NULL && (marker->flag & MARKER_DISABLED) == 0) {
sub_v2_v2v2(b, marker->pos, median); sub_v2_v2v2(b, marker->pos, median);
b[0] *= width; b[0] *= width;
b[1] *= height; b[1] *= height;
@@ -118,6 +121,8 @@ static void stabilization_calculate_data(MovieTracking *tracking, int framenr, i
translation[0] -= (x0 + (x - x0) * cosf(*angle) - (y - y0) * sinf(*angle) - x) * (*scale); translation[0] -= (x0 + (x - x0) * cosf(*angle) - (y - y0) * sinf(*angle) - x) * (*scale);
translation[1] -= (y0 + (x - x0) * sinf(*angle) + (y - y0) * cosf(*angle) - y) * (*scale); translation[1] -= (y0 + (x - x0) * sinf(*angle) + (y - y0) * cosf(*angle) - y) * (*scale);
} }
}
}
} }
/* Calculate factor of a scale, which will eliminate black areas /* Calculate factor of a scale, which will eliminate black areas
@@ -165,7 +170,9 @@ static float stabilization_calculate_autoscale_factor(MovieTracking *tracking, i
float points[4][2] = {{0.0f, 0.0f}, {0.0f, height}, {width, height}, {width, 0.0f}}; float points[4][2] = {{0.0f, 0.0f}, {0.0f, height}, {width, height}, {width, 0.0f}};
float si, co; float si, co;
stabilization_median_point_get(tracking, cfra, median); if (!stabilization_median_point_get(tracking, cfra, median)) {
break;
}
stabilization_calculate_data(tracking, cfra, width, height, firstmedian, median, translation, stabilization_calculate_data(tracking, cfra, width, height, firstmedian, median, translation,
&tmp_scale, &angle); &tmp_scale, &angle);
@@ -274,9 +281,9 @@ void BKE_tracking_stabilization_data_get(MovieTracking *tracking, int framenr, i
* However, it's still better to replace this with real first * However, it's still better to replace this with real first
* frame number at which tracks are appearing. * frame number at which tracks are appearing.
*/ */
if (stabilization_median_point_get(tracking, 1, firstmedian)) { if (stabilization_median_point_get(tracking, 1, firstmedian) &&
stabilization_median_point_get(tracking, framenr, median); stabilization_median_point_get(tracking, framenr, median))
{
if ((stab->flag & TRACKING_AUTOSCALE) == 0) if ((stab->flag & TRACKING_AUTOSCALE) == 0)
stab->scale = 1.0f; stab->scale = 1.0f;