/*
* CINELERRA
* Copyright (C) 1997-2011 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
* 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
- *
+ *
*/
-
-
+
+
#include "clip.h"
#include "interpolatevideo.h"
-#include "motionscan.h"
+#include "motioncache-hv.h"
+#include "motionscan-hv.h"
#include "opticflow.h"
#include <sys/time.h>
{
OpticFlowPackage *pkg = (OpticFlowPackage*)package;
InterpolateVideo *plugin = server->plugin;
- int w = plugin->frames[0]->get_w();
- int h = plugin->frames[0]->get_h();
+ //int w = plugin->frames[0]->get_w();
+ //int h = plugin->frames[0]->get_h();
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,
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],
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,
0,
0,
0);
+//printf("OpticFlowUnit::process_package 2\n", __LINE__);
mb->dx = motion->dx_result;
OpticFlow::OpticFlow(InterpolateVideo *plugin,
- int total_clients,
+ int total_clients,
int total_packages)
-// : LoadServer(1,
+// : LoadServer(1,
// total_packages)
- : LoadServer(total_clients,
+ : LoadServer(total_clients,
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);
}
}
int x_macroblock2 = x_macroblock + 1;
int y_macroblock2 = y_macroblock + 1;
-
+
x_macroblock2 = MIN(x_macroblock2, plugin->x_macroblocks - 1);
y_macroblock2 = MIN(y_macroblock2, plugin->y_macroblocks - 1);
-
+
float x_fraction = (float)(j - x_macroblock * macroblock_size) / macroblock_size;
float y_fraction = (float)(i - y_macroblock * macroblock_size) / macroblock_size;
Warp::Warp(InterpolateVideo *plugin,
- int total_clients,
+ int total_clients,
int total_packages)
- : LoadServer(total_clients,
+ : LoadServer(total_clients,
total_packages)
{
this->plugin = plugin;
BlendMacroblock::BlendMacroblock(InterpolateVideo *plugin,
- int total_clients,
+ int total_clients,
int total_packages)
- : LoadServer(total_clients,
+ : LoadServer(total_clients,
total_packages)
{
this->plugin = plugin;