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