diff --git a/applications/gui/src/src_window.cpp b/applications/gui/src/src_window.cpp index d445f08484e352a9883c2208e2c2be7997635950..b829b76dc65fef03895e2f06f62e081188699699 100644 --- a/applications/gui/src/src_window.cpp +++ b/applications/gui/src/src_window.cpp @@ -155,6 +155,11 @@ SourceWindow::SourceWindow(ftl::gui::Screen *screen) } else if (path.rfind("device:", 0) == 0) { ftl::URI uri(path); uri.to_json(screen->root()->getConfig()["sources"].emplace_back()); + } else { + ftl::URI uri(path); + if (uri.getScheme() == ftl::URI::SCHEME_TCP) { + screen->net()->connect(path); + } } } @@ -325,19 +330,35 @@ void SourceWindow::_updateCameras(const vector<string> &netcams) { if (netcams.size() == 0) return; for (auto s : netcams) { + LOG(INFO) << "ADDING CAMERA: " << s; + + if (available_.count(s) == 0) { + auto *stream = ftl::create<ftl::stream::Net>(screen_->root(), string("netstream")+std::to_string(available_.size()-1), screen_->net()); + available_[s] = stream; + stream->set("uri", s); + bool isspecial = (stream->get<std::string>("uri") == screen_->root()->value("data_stream",std::string(""))); + stream_->add(stream, (isspecial) ? 1 : 0); + + LOG(INFO) << "Add Stream: " << stream->value("uri", std::string("NONE")); + } + // FIXME: Check for already existing... //if (streams_.find(s) == cameras_.end()) { - available_.push_back(s); - json_t srcjson; - srcjson["uri"] = s; - screen_->root()->getConfig()["streams"].push_back(srcjson); + //available_.push_back(s); + //json_t srcjson; + //srcjson["uri"] = s; + //screen_->root()->getConfig()["streams"].push_back(srcjson); + //screen_->root()->getConfig()["receivers"].push_back(json_t{}); //} } - std::vector<ftl::stream::Net*> strms = ftl::createArray<ftl::stream::Net>(screen_->root(), "streams", screen_->net()); + //stream_->reset(); + stream_->begin(); + + //std::vector<ftl::stream::Net*> strms = ftl::createArray<ftl::stream::Net>(screen_->root(), "streams", screen_->net()); - for (int i=0; i<strms.size(); ++i) { + /*for (int i=0; i<strms.size(); ++i) { auto *stream = strms[i]; bool isspecial = (stream->get<std::string>("uri") == screen_->root()->value("data_stream",std::string(""))); if (isspecial) LOG(INFO) << "Adding special stream"; @@ -348,18 +369,8 @@ void SourceWindow::_updateCameras(const vector<string> &netcams) { //Scene *scene = new Scene(receiver); //scenes_.push_back(scene); - /*if (.find(src->getURI()) == cameras_.end()) { - LOG(INFO) << "Making camera: " << src->getURI(); - // TODO: Need to have GUI wrapper for an entire stream... which - // manages a set of cameras. - - auto *cam = new ftl::gui::Camera(screen_, src); - cameras_[src->getURI()] = cam; - } else { - //LOG(INFO) << "Camera already exists: " << s; - }*/ - } + }*/ //refresh_thumbs_ = true; //if (thumbs_.size() != available_.size()) { diff --git a/applications/gui/src/src_window.hpp b/applications/gui/src/src_window.hpp index 165143c14d7ce2f9f52614aa798f3c09ea4be488..c420c0e7cbafde19e5670ed99bc75d6cf8ccae8b 100644 --- a/applications/gui/src/src_window.hpp +++ b/applications/gui/src/src_window.hpp @@ -9,6 +9,7 @@ #include <ftl/threads.hpp> #include <vector> #include <map> +#include <unordered_map> #include <string> #include "gltexture.hpp" @@ -66,7 +67,7 @@ class SourceWindow : public nanogui::Window { ftl::stream::Intercept *interceptor_; ftl::stream::File *recorder_; ftl::stream::Receiver *receiver_; - std::vector<std::string> available_; + std::unordered_map<std::string, ftl::stream::Stream*> available_; std::vector<GLTexture> thumbs_; bool refresh_thumbs_; nanogui::Widget *ipanel_; diff --git a/components/streams/src/netstream.cpp b/components/streams/src/netstream.cpp index 72d435fb57ebe3c26d747e2a124e4b6405fc4057..e50b494d24928991c430665d7ac09ce245d46ac2 100644 --- a/components/streams/src/netstream.cpp +++ b/components/streams/src/netstream.cpp @@ -133,6 +133,7 @@ bool Net::post(const ftl::codecs::StreamPacket &spkt, const ftl::codecs::Packet } bool Net::begin() { + if (active_) return true; if (!get<string>("uri")) return false; active_ = true;