From 2858cf622a721dd0e806553a45215d0d5109a9f3 Mon Sep 17 00:00:00 2001
From: Sebastian Hahta <joseha@utu.fi>
Date: Thu, 29 Aug 2019 14:44:25 +0300
Subject: [PATCH] Place all channels to same Frame class.

Simplifies StereoVideoSource::swap() method.
---
 components/rgbd-sources/src/stereovideo.cpp | 51 +++++++++------------
 components/rgbd-sources/src/stereovideo.hpp | 36 ++++++++++++---
 2 files changed, 51 insertions(+), 36 deletions(-)

diff --git a/components/rgbd-sources/src/stereovideo.cpp b/components/rgbd-sources/src/stereovideo.cpp
index 57e57fbbd..6e9d4fe09 100644
--- a/components/rgbd-sources/src/stereovideo.cpp
+++ b/components/rgbd-sources/src/stereovideo.cpp
@@ -31,7 +31,10 @@ StereoVideoSource::~StereoVideoSource() {
 	delete lsrc_;
 }
 
-void StereoVideoSource::init(const string &file) {
+void StereoVideoSource::init(const string &file)
+{
+	frames_ = std::vector<Frame>(2);
+
 	capabilities_ = kCapVideo | kCapStereo;
 
 	if (ftl::is_video(file)) {
@@ -160,49 +163,39 @@ bool StereoVideoSource::capture(int64_t ts) {
 }
 
 bool StereoVideoSource::retrieve() {
-	lsrc_->get(cap_left_, cap_right_, calib_, stream2_);
+	auto frame = frames_[0];
+	frame.reset();
+	lsrc_->get(frame.left, frame.right, calib_, stream2_);
 	stream2_.waitForCompletion();
 	return true;
 }
 
 void StereoVideoSource::swap() {
-	cv::cuda::GpuMat tmp;
-	tmp = left_;
-	left_ = cap_left_;
-	cap_left_ = tmp;
-	tmp = right_;
-	right_ = cap_right_;
-	cap_right_ = tmp;
+	auto tmp = frames_[0];
+	frames_[0] = frames_[1];
+	frames_[1] = tmp;
 }
 
-bool StereoVideoSource::compute(int n, int b) {	
+bool StereoVideoSource::compute(int n, int b) {
+	auto &frame = frames_[1];
 	const ftl::rgbd::channel_t chan = host_->getChannel();
-
-	if (left_.empty() || right_.empty()) return false;
+	if (frame.left.empty() || frame.right.empty()) return false;
 
 	if (chan == ftl::rgbd::kChanDepth) {
-		//lsrc_->get(left_, right_, stream_);
-		if (depth_tmp_.empty()) depth_tmp_ = cv::cuda::GpuMat(left_.size(), CV_32FC1);
-		if (disp_tmp_.empty()) disp_tmp_ = cv::cuda::GpuMat(left_.size(), CV_32FC1);
-		//calib_->rectifyStereo(left_, right_, stream_);
-		disp_->compute(left_, right_, disp_tmp_, stream_);
-		ftl::cuda::disparity_to_depth(disp_tmp_, depth_tmp_, params_, stream_);
-		left_.download(rgb_, stream_);
-		//rgb_ = lsrc_->cachedLeft();
-		depth_tmp_.download(depth_, stream_);
+		if (frame.depth.empty()) frame.depth = cv::cuda::GpuMat(frame.left.size(), CV_32FC1);
+		if (frame.disp.empty()) frame.disp = cv::cuda::GpuMat(frame.left.size(), CV_32FC1);
+		disp_->compute(frame.left, frame.right, frame.disp, stream_);
+		ftl::cuda::disparity_to_depth(frame.disp, frame.depth, params_, stream_);
+		frame.left.download(rgb_, stream_);
+		frame.depth.download(depth_, stream_);
 
 		stream_.waitForCompletion();  // TODO:(Nick) Move to getFrames
 	} else if (chan == ftl::rgbd::kChanRight) {
-		//lsrc_->get(left_, right_, stream_);
-		//calib_->rectifyStereo(left_, right_, stream_);
-		left_.download(rgb_, stream_);
-		right_.download(depth_, stream_);
+		frame.left.download(rgb_, stream_);
+		frame.right.download(depth_, stream_);
 		stream_.waitForCompletion();  // TODO:(Nick) Move to getFrames
 	} else {
-		//lsrc_->get(left_, right_, stream_);
-		//calib_->rectifyStereo(left_, right_, stream_);
-		//rgb_ = lsrc_->cachedLeft();
-		left_.download(rgb_, stream_);
+		frame.left.download(rgb_, stream_);
 		stream_.waitForCompletion();  // TODO:(Nick) Move to getFrames
 	}
 
diff --git a/components/rgbd-sources/src/stereovideo.hpp b/components/rgbd-sources/src/stereovideo.hpp
index 88b71a068..bd470a743 100644
--- a/components/rgbd-sources/src/stereovideo.hpp
+++ b/components/rgbd-sources/src/stereovideo.hpp
@@ -45,13 +45,35 @@ class StereoVideoSource : public detail::Source {
 	cv::cuda::Stream stream_;
 	cv::cuda::Stream stream2_;
 
-	cv::cuda::GpuMat left_;
-	cv::cuda::GpuMat right_;
-	cv::cuda::GpuMat cap_left_;
-	cv::cuda::GpuMat cap_right_;
-	cv::cuda::GpuMat disp_tmp_;
-	cv::cuda::GpuMat depth_tmp_;
-	
+	// possibly should be made available for other users as well
+	// (should be called StereoVideoFrame)
+	class Frame {
+	public:
+		bool left_gray_ready;
+		bool right_gray_ready;
+		bool optflow_ready;
+
+		cv::cuda::GpuMat left;
+		cv::cuda::GpuMat right;
+		cv::cuda::GpuMat left_gray;
+		cv::cuda::GpuMat right_gray;
+		cv::cuda::GpuMat disp;
+		cv::cuda::GpuMat depth;
+		cv::cuda::GpuMat optflow;
+		cv::cuda::GpuMat optflow_; // original lower res optical flow
+
+		Frame() { reset(); }
+
+		void reset()
+		{
+			left_gray_ready = false;
+			right_gray_ready = false;
+			optflow_ready = false;
+		}
+	};
+
+	std::vector<Frame> frames_;
+
 	cv::Mat mask_l_;
 
 	void init(const std::string &);
-- 
GitLab