diff --git a/components/renderers/cpp/src/CUDARender.cpp b/components/renderers/cpp/src/CUDARender.cpp index 3b5a6adc403a05975cdb634467e270cc48f5a243..dab897d5696f78ebffbec097485778bebd57c03b 100644 --- a/components/renderers/cpp/src/CUDARender.cpp +++ b/components/renderers/cpp/src/CUDARender.cpp @@ -250,6 +250,9 @@ void CUDARender::_mesh(ftl::rgbd::Frame &out, const Eigen::Matrix4d &t, cudaStre int valid_count = 0; + // FIXME: Is it possible to remember previously if there should be depth? + bool use_depth = scene_->anyHasChannel(Channel::Depth) || scene_->anyHasChannel(Channel::GroundTruth); + // For each source depth map for (size_t i=0; i < scene_->frames.size(); ++i) { //if (!scene_->hasFrame(i)) continue; @@ -261,6 +264,11 @@ void CUDARender::_mesh(ftl::rgbd::Frame &out, const Eigen::Matrix4d &t, cudaStre continue; } + // We have the needed depth data? + if (use_depth && !f.hasOwn(Channel::Depth) && !f.hasOwn(Channel::GroundTruth)) { + continue; + } + ++valid_count; //auto pose = MatrixConversion::toCUDA(t.cast<float>() * f.getPose().cast<float>()); @@ -273,20 +281,22 @@ void CUDARender::_mesh(ftl::rgbd::Frame &out, const Eigen::Matrix4d &t, cudaStre auto &screenbuffer = _getScreenBuffer(bufsize); // Calculate and save virtual view screen position of each source pixel - if (f.hasChannel(Channel::Depth)) { - ftl::cuda::screen_coord( - f.createTexture<float>(Channel::Depth), - depthbuffer, - screenbuffer, - params_, transform, f.getLeftCamera(), stream - ); - } else if (f.hasChannel(Channel::GroundTruth)) { - ftl::cuda::screen_coord( - f.createTexture<float>(Channel::GroundTruth), - depthbuffer, - screenbuffer, - params_, transform, f.getLeftCamera(), stream - ); + if (use_depth) { + if (f.hasChannel(Channel::Depth)) { + ftl::cuda::screen_coord( + f.createTexture<float>(Channel::Depth), + depthbuffer, + screenbuffer, + params_, transform, f.getLeftCamera(), stream + ); + } else if (f.hasChannel(Channel::GroundTruth)) { + ftl::cuda::screen_coord( + f.createTexture<float>(Channel::GroundTruth), + depthbuffer, + screenbuffer, + params_, transform, f.getLeftCamera(), stream + ); + } } else { // Constant depth version ftl::cuda::screen_coord( diff --git a/components/streams/src/feed.cpp b/components/streams/src/feed.cpp index 695cf8cfd9138642862d10abda5cfa6114a899fc..6822813cb30c7bddb12c39c6384ad89ac130913f 100644 --- a/components/streams/src/feed.cpp +++ b/components/streams/src/feed.cpp @@ -192,7 +192,10 @@ Feed::Feed(nlohmann::json &config, ftl::net::Universe*net) : }); if (!did_pipe) { - LOG(WARNING) << "GUI Pipeline dropped"; + LOG(WARNING) << "Feed Pipeline dropped"; + ftl::pool.push([this,fs](int id) { + _dispatch(fs); + }); } } else { _dispatch(fs); diff --git a/components/streams/src/sender.cpp b/components/streams/src/sender.cpp index 44aadc932f563b82059a3e634ec7b11efcb9d783..b4d9d409323cb7a1e8d66d46c4e0e8458398eaf5 100644 --- a/components/streams/src/sender.cpp +++ b/components/streams/src/sender.cpp @@ -490,19 +490,12 @@ void Sender::_encodeVideoChannel(ftl::data::FrameSet &fs, Channel c, bool reset) int encoder_number = 0; while (offset < fs.frames.size()) { Channel cc = c; - //if ((cc == Channel::Colour) && fs.firstFrame().hasChannel(Channel::ColourHighRes)) { - // cc = Channel::ColourHighRes; - //} - - //if ((cc == Channel::Right) && fs.firstFrame().hasChannel(Channel::RightHighRes)) { - // cc = Channel::RightHighRes; - // fs.frames[offset].upload(cc); - //} - if (!fs.frames[offset].hasChannel(cc)) { - offset++; - continue; - } + // FIXME: Don't change tile layout when channel temporarily drops. + //if (!fs.frames[offset].hasChannel(cc)) { + // offset++; + // continue; + //} StreamPacket spkt; spkt.version = 5; @@ -545,9 +538,6 @@ void Sender::_encodeVideoChannel(ftl::data::FrameSet &fs, Channel c, bool reset) break; } - //cudaSafeCall(cudaStreamSynchronize(enc->stream())); - //enc->stream().waitForCompletion(); - if (enc) { if (reset) enc->reset(); @@ -644,8 +634,6 @@ void Sender::_encodeAudioChannel(ftl::data::FrameSet &fs, Channel c, bool reset) } void Sender::_encodeDataChannel(ftl::data::FrameSet &fs, Channel c, bool reset) { - int i=0; - // TODO: Pack all frames into a single packet for (auto &f : fs.frames) { StreamPacket spkt; diff --git a/components/structures/include/ftl/data/new_frameset.hpp b/components/structures/include/ftl/data/new_frameset.hpp index 8dcc4b3b27f332139e5c18b9d42312cc2af9ccba..6eafe9cb59a4c7d0f53033ba8e903c6ed9e55207 100644 --- a/components/structures/include/ftl/data/new_frameset.hpp +++ b/components/structures/include/ftl/data/new_frameset.hpp @@ -134,6 +134,8 @@ class FrameSet : public ftl::data::Frame { */ bool hasAnyChanged(ftl::codecs::Channel) const; + bool anyHasChannel(ftl::codecs::Channel) const; + private: std::atomic<int> flags_; }; diff --git a/components/structures/src/frameset.cpp b/components/structures/src/frameset.cpp index cba77a2136cb6222f6fea9f2d6f77a2debb5eb2a..e8cfd9404535e1fdfe410596fc92cf35a83e39ec 100644 --- a/components/structures/src/frameset.cpp +++ b/components/structures/src/frameset.cpp @@ -78,6 +78,13 @@ bool ftl::data::FrameSet::hasAnyChanged(ftl::codecs::Channel c) const { return false; } +bool ftl::data::FrameSet::anyHasChannel(ftl::codecs::Channel c) const { + for (size_t i=0; i<frames.size(); ++i) { + if (frames[i].hasOwn(c)) return true; + } + return false; +} + void FrameSet::store() { if (status() != ftl::data::FrameStatus::CREATED) throw FTL_Error("Cannot store frameset multiple times");