diff --git a/components/rgbd-sources/include/ftl/rgbd/streamer.hpp b/components/rgbd-sources/include/ftl/rgbd/streamer.hpp index 47048c946da2ff792b7c41dfc21cf4bf6099ed5b..642add6dc0e39ab496fec560cd3a5b0d77dbfb53 100644 --- a/components/rgbd-sources/include/ftl/rgbd/streamer.hpp +++ b/components/rgbd-sources/include/ftl/rgbd/streamer.hpp @@ -158,11 +158,17 @@ class Streamer : public ftl::Configurable { ftl::codecs::device_t hq_devices_; + enum class Quality { + High, + Low, + Any + }; + void _process(ftl::rgbd::FrameSet &); void _cleanUp(); void _addClient(const std::string &source, int N, int rate, const ftl::UUID &peer, const std::string &dest); - void _transmitPacket(detail::StreamSource *src, const ftl::codecs::Packet &pkt, int chan, bool hasChan2, bool hqonly); - void _transmitPacket(detail::StreamSource *src, const ftl::codecs::StreamPacket &spkt, const ftl::codecs::Packet &pkt, bool hqonly); + void _transmitPacket(detail::StreamSource *src, const ftl::codecs::Packet &pkt, int chan, bool hasChan2, Quality q); + void _transmitPacket(detail::StreamSource *src, const ftl::codecs::StreamPacket &spkt, const ftl::codecs::Packet &pkt, Quality q); //void _encodeHQAndTransmit(detail::StreamSource *src, const cv::Mat &, const cv::Mat &, int chunk); //void _encodeLQAndTransmit(detail::StreamSource *src, const cv::Mat &, const cv::Mat &, int chunk); diff --git a/components/rgbd-sources/src/streamer.cpp b/components/rgbd-sources/src/streamer.cpp index e197c2bb754e362b594ef94872cc25b37f4777ee..4290a289027062e19f931cca87f32749b875bedc 100644 --- a/components/rgbd-sources/src/streamer.cpp +++ b/components/rgbd-sources/src/streamer.cpp @@ -195,7 +195,7 @@ void Streamer::add(ftl::rgbd::Group *grp) { src->addRawCallback([this,s](Source *src, const ftl::codecs::StreamPacket &spkt, const ftl::codecs::Packet &pkt) { //LOG(INFO) << "RAW CALLBACK"; - _transmitPacket(s, spkt, pkt, false); + _transmitPacket(s, spkt, pkt, Quality::Any); }); } @@ -423,7 +423,7 @@ void Streamer::_process(ftl::rgbd::FrameSet &fs) { // TODO: Each encode could be done in own thread if (hasChan2) { enc2->encode(fs.frames[j].get<cv::Mat>(fs.sources[j]->getChannel()), src->hq_bitrate, [this,src,hasChan2](const ftl::codecs::Packet &blk){ - _transmitPacket(src, blk, 1, hasChan2, true); + _transmitPacket(src, blk, 1, hasChan2, Quality::High); }); } else { if (enc2) enc2->reset(); @@ -431,7 +431,7 @@ void Streamer::_process(ftl::rgbd::FrameSet &fs) { if (fs.timestamp % (10*ftl::timer::getInterval()) == 0) enc1->reset(); enc1->encode(fs.frames[j].get<cv::Mat>(Channel::Colour), src->hq_bitrate, [this,src,hasChan2](const ftl::codecs::Packet &blk){ - _transmitPacket(src, blk, 0, hasChan2, true); + _transmitPacket(src, blk, 0, hasChan2, Quality::High); }); } } @@ -452,14 +452,14 @@ void Streamer::_process(ftl::rgbd::FrameSet &fs) { // Receiver only waits for channel 1 by default if (hasChan2) { enc2->encode(fs.frames[j].get<cv::Mat>(fs.sources[j]->getChannel()), src->lq_bitrate, [this,src,hasChan2](const ftl::codecs::Packet &blk){ - _transmitPacket(src, blk, 1, hasChan2, false); + _transmitPacket(src, blk, 1, hasChan2, Quality::Low); }); } else { if (enc2) enc2->reset(); } enc1->encode(fs.frames[j].get<cv::Mat>(Channel::Colour), src->lq_bitrate, [this,src,hasChan2](const ftl::codecs::Packet &blk){ - _transmitPacket(src, blk, 0, hasChan2, false); + _transmitPacket(src, blk, 0, hasChan2, Quality::Low); }); } } @@ -525,25 +525,25 @@ void Streamer::_process(ftl::rgbd::FrameSet &fs) { } else _cleanUp(); } -void Streamer::_transmitPacket(StreamSource *src, const ftl::codecs::Packet &pkt, int chan, bool hasChan2, bool hqonly) { +void Streamer::_transmitPacket(StreamSource *src, const ftl::codecs::Packet &pkt, int chan, bool hasChan2, Quality q) { ftl::codecs::StreamPacket spkt = { frame_no_, static_cast<uint8_t>((chan & 0x1) | ((hasChan2) ? 0x2 : 0x0)) }; - _transmitPacket(src, spkt, pkt, hqonly); + _transmitPacket(src, spkt, pkt, q); } -void Streamer::_transmitPacket(StreamSource *src, const ftl::codecs::StreamPacket &spkt, const ftl::codecs::Packet &pkt, bool hqonly) { +void Streamer::_transmitPacket(StreamSource *src, const ftl::codecs::StreamPacket &spkt, const ftl::codecs::Packet &pkt, Quality q) { // Lock to prevent clients being added / removed //SHARED_LOCK(src->mutex,lk); auto c = src->clients.begin(); while (c != src->clients.end()) { const ftl::codecs::preset_t b = (*c).preset; - if ((hqonly && b >= kQualityThreshold) || (!hqonly && b < kQualityThreshold)) { - //++c; + if ((q == Quality::High && b >= kQualityThreshold) || (q == Quality::Low && b < kQualityThreshold)) { + ++c; LOG(INFO) << "INCORRECT QUALITY"; - //continue; + continue; } try {