From 8608a526fc6088b875b6273b0874c99d0f39fd33 Mon Sep 17 00:00:00 2001 From: Nicolas Pope <nwpope@utu.fi> Date: Tue, 7 Jul 2020 09:07:03 +0300 Subject: [PATCH] Receiver marks channel availability --- components/streams/src/receiver.cpp | 13 +++- components/streams/src/sender.cpp | 69 ++++--------------- .../structures/include/ftl/data/new_frame.hpp | 2 + 3 files changed, 24 insertions(+), 60 deletions(-) diff --git a/components/streams/src/receiver.cpp b/components/streams/src/receiver.cpp index 24c2a54f2..9287dad97 100644 --- a/components/streams/src/receiver.cpp +++ b/components/streams/src/receiver.cpp @@ -352,7 +352,7 @@ void Receiver::_processVideo(const StreamPacket &spkt, const Packet &pkt) { // Complete if all requested channels are found //if ((frame.getChannels() & sel) == sel) { - if (frame.hasAll(sel)) { + if (frame.availableAll(sel)) { timestamp_ = spkt.timestamp; //frame.reset.clear(); @@ -388,8 +388,15 @@ void Receiver::setStream(ftl::stream::Stream *s) { handle_ = s->onPacket([this](const StreamPacket &spkt, const Packet &pkt) { const unsigned int channum = (unsigned int)spkt.channel; - // Dummy no data packet. - if (pkt.data.size() == 0) return true; + // No data packet means channel is only available. + if (pkt.data.size() == 0) { + if (spkt.streamID < 255 && spkt.frame_number < 255) { + // Get the frameset + auto fs = builder(spkt.streamID).get(spkt.timestamp, spkt.frame_number+pkt.frame_count-1); + fs->frames[spkt.frame_number].markAvailable(spkt.channel); + } + return true; + } //LOG(INFO) << "PACKET: " << spkt.timestamp << ", " << (int)spkt.channel << ", " << (int)pkt.codec << ", " << (int)pkt.definition; diff --git a/components/streams/src/sender.cpp b/components/streams/src/sender.cpp index 98895217d..26e1b1d6a 100644 --- a/components/streams/src/sender.cpp +++ b/components/streams/src/sender.cpp @@ -78,60 +78,6 @@ ftl::audio::Encoder *Sender::_getAudioEncoder(int fsid, int sid, ftl::codecs::Ch return state.encoder; } -/*void Sender::post(const ftl::audio::FrameSet &fs) { - if (!stream_) return; - - //if (fs.stale) return; - //fs.stale = true; - - for (size_t i=0; i<fs.frames.size(); ++i) { - if (!(fs.frames[i].hasChannel(Channel::AudioMono) || fs.frames[i].hasChannel(Channel::AudioStereo))) continue; - - auto &data = (fs.frames[i].hasChannel(Channel::AudioStereo)) ? - fs.frames[i].get<ftl::audio::Audio>(Channel::AudioStereo) : - fs.frames[i].get<ftl::audio::Audio>(Channel::AudioMono); - - //auto &settings = fs.frames[i].getSettings(); - - StreamPacket spkt; - spkt.version = 4; - spkt.timestamp = fs.timestamp(); - spkt.streamID = fs.frameset(); - spkt.frame_number = i; - spkt.channel = (fs.frames[i].hasChannel(Channel::AudioStereo)) ? Channel::AudioStereo : Channel::AudioMono; - - ftl::codecs::Packet pkt; - pkt.codec = ftl::codecs::codec_t::OPUS; - //pkt.definition = ftl::codecs::definition_t::Any; - - - - pkt.definition = ftl::codecs::definition_t::hz48000; - - pkt.frame_count = 1; - pkt.flags = (fs.frames[i].hasChannel(Channel::AudioStereo)) ? ftl::codecs::kFlagStereo : 0; - pkt.bitrate = 180; - - // Find encoder here ... - ftl::audio::Encoder *enc = _getAudioEncoder(fs.id(), i, spkt.channel, pkt); - - // Do encoding into pkt.data - if (!enc) { - LOG(ERROR) << "Could not find audio encoder"; - return; - } - - if (!enc->encode(data.data(), pkt)) { - LOG(ERROR) << "Could not encode audio"; - return; - } - - stream_->post(spkt, pkt); - - //LOG(INFO) << "SENT AUDIO: " << fs.timestamp << " - " << pkt.data.size(); - } -}*/ - template <typename T> static void writeValue(std::vector<unsigned char> &data, T value) { unsigned char *pvalue_start = (unsigned char*)&value; @@ -163,7 +109,8 @@ static void mergeNALUnits(const std::list<ftl::codecs::Packet> &pkts, ftl::codec void Sender::post(ftl::data::FrameSet &fs, ftl::codecs::Channel c) { if (!stream_) return; - //if (stream_->size() > 0) selected = stream_->selected(0); + std::unordered_set<ftl::codecs::Channel> selected; + if (stream_->size() > 0) selected = stream_->selected(fs.frameset()); bool do_inject = !do_inject_.test_and_set(); if (do_inject) injection_timestamp_ = fs.timestamp(); @@ -235,7 +182,7 @@ void Sender::post(ftl::data::FrameSet &fs, ftl::codecs::Channel c) { //for (auto ic : frame.changed()) { //auto c = ic.first; - if (true) { //if (selected.has(c)) { + if (selected.find(c) != selected.end() || (int)c >= 64) { // FIXME: Sends high res colour, but receive end currently broken //auto cc = (c == Channel::Colour && frame.hasChannel(Channel::ColourHighRes)) ? Channel::ColourHighRes : c; auto cc = c; @@ -264,6 +211,7 @@ void Sender::post(ftl::data::FrameSet &fs, ftl::codecs::Channel c) { } } } else { + needs_encoding = false; available = true; } //} @@ -286,9 +234,16 @@ void Sender::post(ftl::data::FrameSet &fs, ftl::codecs::Channel c) { stream_->post(spkt, pkt); } + Channel sec_chan = Channel::Right; + if (needs_encoding) { // TODO: One thread per channel. - _encodeChannel(fs, c, do_iframe); + if ((int)c >= 32 || c == Channel::Colour || c == sec_chan) { + LOG(INFO) << "ENCODING " << (int)c; + _encodeChannel(fs, c, do_iframe); + } else { + LOG(WARNING) << "Not encoding channel: " << (int)c; + } } //do_inject_ = false; diff --git a/components/structures/include/ftl/data/new_frame.hpp b/components/structures/include/ftl/data/new_frame.hpp index a0488cadb..73af702f1 100644 --- a/components/structures/include/ftl/data/new_frame.hpp +++ b/components/structures/include/ftl/data/new_frame.hpp @@ -185,10 +185,12 @@ class Frame { T *getMutable(ftl::codecs::Channel c); inline void touch(ftl::codecs::Channel c) { + markAvailable(c); changed_[c] = (mode_ == FrameMode::PRIMARY) ? ChangeType::PRIMARY : ChangeType::RESPONSE; } inline void touch(ftl::codecs::Channel c, ChangeType type) { + markAvailable(c); changed_[c] = type; } -- GitLab