merged hv7 mod
[goodguy/history.git] / cinelerra-5.1 / plugins / interpolatevideo / opticflow.C
index bf8a6762f1c50bff78b7e4421e9bf333459939ea..83414c07115f62db3c316d28634ed152f2de8444 100644 (file)
@@ -24,6 +24,7 @@
 
 #include "clip.h"
 #include "interpolatevideo.h"
+#include "motioncache-hv.h"
 #include "motionscan-hv.h"
 #include "opticflow.h"
 
@@ -92,9 +93,11 @@ void OpticFlowUnit::process_package(LoadPackage *package)
        struct timeval start_time;
        gettimeofday(&start_time, 0);
 
-       if(!motion) motion = new MotionScan(1, 1);
+       if(!motion) motion = new MotionHVScan(1, 1);
 
        motion->set_test_match(0);
+       motion->set_cache(server->downsample_cache);
+       
 // printf("OpticFlowUnit::process_package %d %d %d\n",
 // __LINE__,
 // pkg->macroblock0,
@@ -103,6 +106,7 @@ void OpticFlowUnit::process_package(LoadPackage *package)
        for(int i = pkg->macroblock0; i < pkg->macroblock1; i++)
        {
                OpticFlowMacroblock *mb = plugin->macroblocks.get(i);
+//printf("OpticFlowUnit::process_package %d i=%d x=%d y=%d\n", __LINE__, i, mb->x, mb->y);
                motion->scan_frame(plugin->frames[0],
 // Frame after motion
                        plugin->frames[1],
@@ -112,10 +116,10 @@ void OpticFlowUnit::process_package(LoadPackage *package)
                        plugin->config.macroblock_size,
                        mb->x,
                        mb->y,
-                       MotionScan::TRACK_PREVIOUS,
-                       MotionScan::CALCULATE,
+                       MotionHVScan::TRACK_PREVIOUS,
+                       MotionHVScan::CALCULATE,
 // Get it to do the subpixel step
-                       MotionScan::STABILIZE,
+                       MotionHVScan::STABILIZE,
                        0,
                        0,
                        0,
@@ -127,6 +131,7 @@ void OpticFlowUnit::process_package(LoadPackage *package)
                        0,
                        0,
                        0);
+//printf("OpticFlowUnit::process_package 2\n", __LINE__);
 
 
                mb->dx = motion->dx_result;
@@ -157,21 +162,39 @@ OpticFlow::OpticFlow(InterpolateVideo *plugin,
        total_packages)
 {
        this->plugin = plugin;
+       downsample_cache = 0;
 }
 
 
 OpticFlow::~OpticFlow()
 {
+       if(downsample_cache)
+       {
+//printf("OpticFlow::~OpticFlow %d %p\n", __LINE__, downsample_cache);
+               delete downsample_cache;
+       }
 }
 
 void OpticFlow::init_packages()
 {
-//printf("OpticFlow::init_packages %d %d\n", __LINE__, get_total_packages());
+       if(!downsample_cache)
+       {
+               downsample_cache = new MotionHVCache();
+       }
+       
+       downsample_cache->clear();
+
        for(int i = 0; i < get_total_packages(); i++)
        {
                OpticFlowPackage *pkg = (OpticFlowPackage*)get_package(i);
                pkg->macroblock0 = plugin->total_macroblocks * i / get_total_packages();
                pkg->macroblock1 = plugin->total_macroblocks * (i + 1) / get_total_packages();
+// printf("OpticFlow::init_packages %d %d %d %d %d\n", 
+// __LINE__, 
+// plugin->total_macroblocks,
+// get_total_packages(),
+// pkg->macroblock0,
+// pkg->macroblock1);
        }
 }