add xvid/flv formats, add motion plugin varients + save file, fix build bug
[goodguy/history.git] / cinelerra-5.1 / plugins / motion / motionscan.h
index 72c52980bcb7c6a7eff6e0f5514a9c1736a2d17f..8e756ee38e2297f6839943453651284e4d15afbf 100644 (file)
@@ -1,29 +1,30 @@
 
 /*
  * CINELERRA
- * Copyright (C) 2016 Adam Williams <broadcast at earthling dot net>
- *
+ * Copyright (C) 2008 Adam Williams <broadcast at earthling dot net>
+ * 
  * 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 <stdint.h>
@@ -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<MotionScanCache*> 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<MotionScanCache*> cache;
+       Mutex *cache_lock;
+//     DownSampleServer *downsample;
 };