X-Git-Url: https://git.cinelerra-gg.org/git/?a=blobdiff_plain;f=cinelerra-5.1%2Fplugins%2Fmotion%2Fmotionscan.h;h=8e756ee38e2297f6839943453651284e4d15afbf;hb=1e154071bd323f756625f8172ef67133a561450a;hp=72c52980bcb7c6a7eff6e0f5514a9c1736a2d17f;hpb=3c944af1216990dd2d963a6b0231f94df0af7947;p=goodguy%2Fhistory.git diff --git a/cinelerra-5.1/plugins/motion/motionscan.h b/cinelerra-5.1/plugins/motion/motionscan.h index 72c52980..8e756ee3 100644 --- a/cinelerra-5.1/plugins/motion/motionscan.h +++ b/cinelerra-5.1/plugins/motion/motionscan.h @@ -1,29 +1,30 @@ /* * CINELERRA - * Copyright (C) 2016 Adam Williams - * + * Copyright (C) 2008 Adam Williams + * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * + * */ #ifndef MOTIONSCAN_H #define MOTIONSCAN_H -#include "affine.inc" +#include "arraylist.h" +//#include "../downsample/downsampleengine.inc" #include "loadbalance.h" #include "vframe.inc" #include @@ -32,7 +33,6 @@ class MotionScan; #define OVERSAMPLE 4 #define MOTION_FILE "/tmp/m" -#define ROTATION_FILE "/tmp/r" class MotionScanPackage : public LoadPackage { @@ -40,11 +40,10 @@ public: MotionScanPackage(); // For multiple blocks -// Position of stationary block after downsampling +// Position of stationary block int block_x1, block_y1, block_x2, block_y2; -// index of rotated frame - int angle_step; - +// Range of positions to scan + int scan_x1, scan_y1, scan_x2, scan_y2; int dx; int dy; int64_t max_difference; @@ -52,9 +51,11 @@ public: int64_t min_pixel; int is_border; int valid; +// For single block + int step; int64_t difference1; int64_t difference2; -// Search position of current package to nearest pixel with downsampling +// Search position to nearest pixel int search_x; int search_y; // Subpixel of search position @@ -62,6 +63,14 @@ public: int sub_y; }; +class MotionScanCache +{ +public: + MotionScanCache(int x, int y, int64_t difference); + int x, y; + int64_t difference; +}; + class MotionScanUnit : public LoadClient { public: @@ -69,16 +78,19 @@ public: ~MotionScanUnit(); void process_package(LoadPackage *package); - void subpixel(MotionScanPackage *pkg); - void single_pixel(MotionScanPackage *pkg); + int64_t get_cache(int x, int y); + void put_cache(int x, int y, int64_t difference); MotionScan *server; + + ArrayList cache; + Mutex *cache_lock; }; class MotionScan : public LoadServer { public: - MotionScan(int total_clients, + MotionScan(int total_clients, int total_packages); ~MotionScan(); @@ -93,27 +105,27 @@ public: // Invoke the motion engine for a search // Frame before motion void scan_frame(VFrame *previous_frame, +// Frame after motion VFrame *current_frame, - int global_range_w, // in pixels + int global_range_w, int global_range_h, - int global_block_w, // in pixels + int global_block_w, int global_block_h, - int block_x, // in pixels - int block_y, + double block_x, + double block_y, int frame_type, int tracking_type, int action_type, int horizontal_only, int vertical_only, int source_position, - int total_dx, // in pixels * OVERSAMPLE + int total_steps, + int total_dx, int total_dy, - int global_origin_x, // in pixels - int global_origin_y, - int do_motion, - int do_rotate, - double rotation_center, // in deg - double rotation_range); + int global_origin_x, + int global_origin_y); + int64_t get_cache(int x, int y); + void put_cache(int x, int y, int64_t difference); static int64_t abs_diff(unsigned char *prev_ptr, unsigned char *current_ptr, @@ -131,8 +143,8 @@ public: int sub_y); - static void clamp_scan(int w, - int h, + static void clamp_scan(int w, + int h, int *block_x1, int *block_y1, int *block_x2, @@ -143,11 +155,10 @@ public: int *scan_y2, int use_absolute); -// Change between previous frame and current frame multiplied by +// Change between previous frame and current frame multiplied by // OVERSAMPLE int dx_result; int dy_result; - float dr_result; enum { @@ -158,7 +169,7 @@ public: STABILIZE_PIXEL, NOTHING }; - + enum { // tracking_type @@ -167,7 +178,7 @@ public: LOAD, NO_CALCULATE }; - + enum { // frame_type @@ -177,27 +188,6 @@ public: }; private: - void downsample_frame(VFrame *dst, - VFrame *src, - int downsample); - void pixel_search(int &x_result, int &y_result, double &r_result); - void subpixel_search(int &x_result, int &y_result); - double step_to_angle(int step, double center); - -// double calculate_variance(unsigned char *current_ptr, -// int row_bytes, -// int w, -// int h, -// int color_model); - double calculate_range(unsigned char *current_ptr, - int row_bytes, - int w, - int h, - int color_model); - - - - AffineEngine *rotater; // Pointer to downsampled frame before motion VFrame *previous_frame; // Pointer to downsampled frame after motion @@ -208,49 +198,33 @@ private: // Downsampled frames VFrame *downsampled_previous; VFrame *downsampled_current; -// rotated versions of current_frame - VFrame **rotated_current; -// allocation of rotated_current array, a copy of angle_steps - int total_rotated; // Test for identical frames before processing // Faster to skip it if the frames are usually different int test_match; int skip; -// macroblocks didn't have enough data - int failed; // For single block int block_x1; int block_x2; int block_y1; int block_y2; - int scan_w; - int scan_h; int scan_x1; int scan_y1; int scan_x2; int scan_y2; - double scan_angle1, scan_angle2; + int total_pixels; + int total_steps; + int edge_steps; int y_steps; int x_steps; - int angle_steps; -// in deg - double angle_step; int subpixel; int horizontal_only; int vertical_only; int global_origin_x; int global_origin_y; - int action_type; - int current_downsample; - int downsampled_w; - int downsampled_h; - int total_steps; - int do_motion; - int do_rotate; - int rotation_pass; -// in deg - double rotation_center; - double rotation_range; + + ArrayList cache; + Mutex *cache_lock; +// DownSampleServer *downsample; };