X-Git-Url: http://git.cinelerra-gg.org/git/?a=blobdiff_plain;f=cinelerra-5.1%2Fplugins%2Fmotion%2Fmotion.h;h=493aeeef0f735a1f913ab8404181bd7ffe033d51;hb=c9bbecdcb49b2dc8fdefd017104fd4d052edb8a3;hp=5b359f4b19ab6daf0e5cda0d122bbe89f3c5df56;hpb=21c2e6b36d6a96c2f662a89459d607b5a387f4eb;p=goodguy%2Fhistory.git diff --git a/cinelerra-5.1/plugins/motion/motion.h b/cinelerra-5.1/plugins/motion/motion.h index 5b359f4b..493aeeef 100644 --- a/cinelerra-5.1/plugins/motion/motion.h +++ b/cinelerra-5.1/plugins/motion/motion.h @@ -1,7 +1,7 @@ /* * 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 @@ -35,13 +35,12 @@ #include "motionwindow.inc" #include "overlayframe.inc" #include "pluginvclient.h" -#include "rotatescan.inc" +#include "rotateframe.inc" #include "vframe.inc" class MotionMain; class MotionWindow; - - +class RotateScan; // Limits of global range in percent @@ -63,6 +62,7 @@ class MotionWindow; // Precision of rotation #define MIN_ANGLE 0.0001 +#define TRACKING_FILE "/tmp/motion" class MotionConfig { @@ -71,11 +71,8 @@ public: int equivalent(MotionConfig &that); void copy_from(MotionConfig &that); - void interpolate(MotionConfig &prev, - MotionConfig &next, - int64_t prev_frame, - int64_t next_frame, - int64_t current_frame); + void interpolate(MotionConfig &prev, MotionConfig &next, + int64_t prev_frame, int64_t next_frame, int64_t current_frame); void boundaries(); int block_count; @@ -96,8 +93,8 @@ public: // int rotation_block_w; // int rotation_block_h; // Number of search positions in each refinement of the log search -// int global_positions; -// int rotate_positions; + int global_positions; + int rotate_positions; // Block position in percentage 0 - 100 double block_x; double block_y; @@ -106,6 +103,8 @@ public: int vertical_only; int global; int rotate; + int addtrackedframeoffset; + char tracking_file[BCTEXTLEN]; // Track or stabilize, single pixel, scan only, or nothing int action_type; // Recalculate, no calculate, save, or load coordinates from disk @@ -113,28 +112,6 @@ public: // Track a single frame, previous frame, or previous frame same block int tracking_object; -#if 0 - enum - { -// action_type - TRACK, - STABILIZE, - TRACK_PIXEL, - STABILIZE_PIXEL, - NOTHING, -// mode2 - RECALCULATE, - SAVE, - LOAD, - NO_CALCULATE, -// tracking_object - TRACK_SINGLE, - TRACK_PREVIOUS, - PREVIOUS_SAME_BLOCK - }; -#endif - - // Number of single frame to track relative to timeline start int64_t track_frame; // Master layer @@ -142,17 +119,13 @@ public: }; - - class MotionMain : public PluginVClient { public: MotionMain(PluginServer *server); ~MotionMain(); - int process_buffer(VFrame **frame, - int64_t start_position, - double frame_rate); + int process_buffer(VFrame **frame, int64_t start_position, double frame_rate); void process_global(); void process_rotation(); void draw_vectors(VFrame *frame); @@ -167,7 +140,6 @@ public: PLUGIN_CLASS_MEMBERS2(MotionConfig) - static void draw_pixel(VFrame *frame, int x, int y); static void draw_line(VFrame *frame, int x1, int y1, int x2, int y2); void draw_arrow(VFrame *frame, int x1, int y1, int x2, int y2); @@ -178,7 +150,7 @@ public: // It is moved to compensate for motion and copied to the previous_frame. VFrame *temp_frame; MotionScan *engine; -// RotateScan *motion_rotate; + RotateScan *motion_rotate; OverlayFrame *overlayer; AffineEngine *rotate_engine; @@ -195,7 +167,25 @@ public: int current_dy; float current_angle; - + char cache_file[BCTEXTLEN]; + FILE *cache_fp, *active_fp; + void reset_cache_file(); + int open_cache_file(); + void close_cache_file(); + int load_cache_line(); + int locate_cache_line(int64_t key); + int get_cache_line(int64_t key); + int put_cache_line(const char *line); + char cache_line[BCSTRLEN]; + int64_t cache_key, active_key; +// add constant frame offset values + int dx_offset, dy_offset; + int64_t tracking_frame; +// save/load result values + int load_ok; + int save_dx, load_dx; + int save_dy, load_dy; + float save_dt, load_dt; // Oversampled current frame for motion estimation int32_t *search_area; @@ -235,19 +225,92 @@ public: }; +class RotateScanPackage : public LoadPackage +{ +public: + RotateScanPackage(); + float angle; + int64_t difference; +}; +class RotateScanCache +{ +public: + RotateScanCache(float angle, int64_t difference); + float angle; + int64_t difference; +}; +class RotateScanUnit : public LoadClient +{ +public: + RotateScanUnit(RotateScan *server, MotionMain *plugin); + ~RotateScanUnit(); + void process_package(LoadPackage *package); + RotateScan *server; + MotionMain *plugin; + AffineEngine *rotater; + VFrame *temp; +}; - - - +class RotateScan : public LoadServer +{ +public: + RotateScan(MotionMain *plugin, + int total_clients, + int total_packages); + ~RotateScan(); + + friend class RotateScanUnit; + + void init_packages(); + LoadClient* new_client(); + LoadPackage* new_package(); + +// Invoke the motion engine for a search +// Frame before rotation + float scan_frame(VFrame *previous_frame, +// Frame after rotation + VFrame *current_frame, +// Pivot + int block_x, + int block_y); + int64_t get_cache(float angle); + void put_cache(float angle, int64_t difference); + + +// Angle result + float result; + +private: + VFrame *previous_frame; +// Frame after motion + VFrame *current_frame; + + MotionMain *plugin; + int skip; + +// Pivot + int block_x; + int block_y; +// Block to rotate + int block_x1; + int block_x2; + int block_y1; + int block_y2; +// Area to compare + int scan_x; + int scan_y; + int scan_w; + int scan_h; +// Range of angles to compare + float scan_angle1, scan_angle2; + int total_steps; + + ArrayList cache; + Mutex *cache_lock; +}; #endif - - - - - -