+ }
+ if(pkg->difference1 > max_difference || max_difference == -1)
+ {
+ max_difference = pkg->difference1;
+ }
+//printf("MotionScan::scan_frame %d pkg=%d search_x=%d search_y=%d diff=%ld min_diff=%ld max_diff=%ld\n",
+//__LINE__, i, pkg->search_x, pkg->search_y, pkg->difference1, min_difference, max_difference);
+ }
+// Determine noise level (not active on pass 2)
+ noiselev = min_difference+(max_difference-min_difference)*plugin->config.noise_level/100;
+ if (passno == 2) noiselev = min_difference;
+//printf("MotionScan::scan_frame min_diff=%ld max_diff=%ld noiselev=%ld\n", min_difference, max_difference, noiselev);
+ for(int i = 0; i < get_total_packages(); i++)
+ {
+ MotionScanPackage *pkg = (MotionScanPackage*)get_package(i);
+// Already found as the best search, not necessary to memorize
+ if(x_result == pkg->search_x && y_result == pkg->search_y) continue;
+// Above noise level - a definitely bad search, skip
+ if(pkg->difference1 > noiselev) continue;
+ radius = hypot((double)(block_x1-pkg->search_x),(double)(block_y1-pkg->search_y));
+ best_radius = hypot((double)(block_x1-x_result),(double)(block_y1-y_result));
+// Below noise level but bigger translation, skip
+ if(radius > best_radius) continue;
+// Below noise level and smaller translation, memorize
+ if(radius < best_radius)
+ {
+ min_difference = pkg->difference1;
+ x_result = pkg->search_x;
+ y_result = pkg->search_y;
+//printf("MotionScan::scan_frame %d search override=%d search_x=%d search_y=%d diff=%ld min_diff=%ld\n",
+//__LINE__, i, pkg->search_x, pkg->search_y, pkg->difference1, min_difference);
+ continue;
+ }
+// Equal translations, memorize search with min difference
+ if(pkg->difference1 < min_difference)
+ {
+ min_difference = pkg->difference1;
+ x_result = pkg->search_x;
+ y_result = pkg->search_y;
+//printf("MotionScan::scan_frame %d difference override=%d search_x=%d search_y=%d diff=%ld min_diff=%ld\n",
+//__LINE__, i, pkg->search_x, pkg->search_y, pkg->difference1, min_difference);
+ continue;
+ }
+ }
+ int rad_x = 0, rad_y = 0;
+ for(int i = 0; i < get_total_packages(); i++)
+ {
+ MotionScanPackage *pkg = (MotionScanPackage*)get_package(i);
+// Above noise level - skip this radius
+ if(pkg->difference1 > noiselev) continue;
+// Below noise level - measure max distance from the best position
+ if(rad_x < abs(x_result-pkg->search_x))
+ {
+ rad_x = abs(x_result-pkg->search_x);
+//printf("MotionScan::scan_frame %d X-radius override=%d search_x=%d radius=%d\n",
+//__LINE__, i, pkg->search_x, rad_x);
+ }
+ if(rad_y < abs(y_result-pkg->search_y))
+ {
+ rad_y = abs(y_result-pkg->search_y);
+//printf("MotionScan::scan_frame %d Y-radius override=%d search_y=%d radius=%d\n",
+//__LINE__, i, pkg->search_y, rad_y);