From 54b856b21c6e7a3d5dbfd2b0e56efb739431971a Mon Sep 17 00:00:00 2001
From: Nicolas Pope <nwpope@utu.fi>
Date: Sun, 5 Jul 2020 20:55:13 +0300
Subject: [PATCH] WIP fix aggregate bug

---
 applications/tools/simple_viewer/main.cpp |  3 ++-
 components/audio/src/software_decoder.cpp |  3 +++
 components/audio/src/software_encoder.cpp |  2 +-
 components/streams/src/receiver.cpp       | 26 ++++++++++++++---------
 components/structures/src/new_frame.cpp   |  3 +++
 5 files changed, 25 insertions(+), 12 deletions(-)

diff --git a/applications/tools/simple_viewer/main.cpp b/applications/tools/simple_viewer/main.cpp
index d9d79dd13..80a591b3c 100644
--- a/applications/tools/simple_viewer/main.cpp
+++ b/applications/tools/simple_viewer/main.cpp
@@ -154,7 +154,8 @@ static void run(ftl::Configurable *root) {
 				}
 
 				if (f.has(Channel::AudioStereo)) {
-					LOG(INFO) << "Got stereo";
+					const auto &audio = f.get<std::list<ftl::audio::Audio>>(Channel::AudioStereo).front();
+					LOG(INFO) << "Got stereo: " << audio.data().size();
 				}
 			}
 
diff --git a/components/audio/src/software_decoder.cpp b/components/audio/src/software_decoder.cpp
index c5516fa26..8dd11bda1 100644
--- a/components/audio/src/software_decoder.cpp
+++ b/components/audio/src/software_decoder.cpp
@@ -78,6 +78,9 @@ bool SoftwareDecoder::_decodeOpus(const ftl::codecs::Packet &pkt, std::vector<sh
 
 	for (size_t i=0; i<pkt.data.size(); ) {
 		const short *len = (const short*)inptr;
+		LOG(INFO) << "LENGTH = " << *len;
+		if (*len == 0) break;
+
 		inptr += 2;
 		i += (*len)+2;
 		int samples = opus_multistream_decode(opus_decoder_, inptr, *len, outptr, FRAME_SIZE, 0);
diff --git a/components/audio/src/software_encoder.cpp b/components/audio/src/software_encoder.cpp
index 054bb886f..6eeda3dbb 100644
--- a/components/audio/src/software_encoder.cpp
+++ b/components/audio/src/software_encoder.cpp
@@ -105,7 +105,7 @@ bool SoftwareEncoder::_encodeOpus(const std::vector<short> &in, ftl::codecs::Pac
 		short *len = (short*)outptr;
 		outptr += 2;
 		int nbBytes = opus_multistream_encode(opus_encoder_, &in.data()[i], FRAME_SIZE, outptr, MAX_PACKET_SIZE);
-		//LOG(INFO) << "Opus encode: " << nbBytes << ", " << (in.size()-i);
+		LOG(INFO) << "Opus encode: " << nbBytes << ", " << (in.size()-i);
 		if (nbBytes <= 0) return false;
 
 		//if (nbBytes > 32000) LOG(WARNING) << "Packet exceeds size limit";
diff --git a/components/streams/src/receiver.cpp b/components/streams/src/receiver.cpp
index c3c59f06a..24c2a54f2 100644
--- a/components/streams/src/receiver.cpp
+++ b/components/streams/src/receiver.cpp
@@ -168,17 +168,23 @@ ftl::audio::Decoder *Receiver::_createAudioDecoder(InternalAudioStates &frame, c
 
 void Receiver::_processAudio(const StreamPacket &spkt, const Packet &pkt) {
 	// Audio Data
-	/*InternalAudioStates &frame = _getAudioFrame(spkt);
+	InternalAudioStates &state = _getAudioFrame(spkt);
+
+	//frame.frame.reset();
+	state.timestamp = spkt.timestamp;
+
+	auto fs = builder(spkt.streamID).get(spkt.timestamp, spkt.frame_number+pkt.frame_count-1);
+	auto &frame = fs->frames[0];
+
+	auto &audiolist = frame.createChange<std::list<ftl::audio::Audio>>(spkt.channel, ftl::data::ChangeType::FOREIGN, pkt);
+	auto &audio = audiolist.emplace_back();
 
-	frame.frame.reset();
-	frame.timestamp = spkt.timestamp;
-	auto &audio = frame.frame.create<ftl::audio::Audio>(spkt.channel);
 	//size_t size = pkt.data.size()/sizeof(short);
 	//audio.data().resize(size);
 	//auto *ptr = (short*)pkt.data.data();
 	//for (size_t i=0; i<size; i++) audio.data()[i] = ptr[i];
 
-	ftl::audio::Decoder *dec = _createAudioDecoder(frame, pkt);
+	ftl::audio::Decoder *dec = _createAudioDecoder(state, pkt);
 	if (!dec) {
 		LOG(ERROR) << "Could get an audio decoder";
 		return;
@@ -189,7 +195,7 @@ void Receiver::_processAudio(const StreamPacket &spkt, const Packet &pkt) {
 	}
 
 	// Generate settings from packet data
-	ftl::audio::AudioSettings settings;
+	/*ftl::audio::AudioSettings settings;
 	settings.channels = (spkt.channel == Channel::AudioStereo) ? 2 : 1;
 	settings.frame_size = 960;
 
@@ -197,12 +203,12 @@ void Receiver::_processAudio(const StreamPacket &spkt, const Packet &pkt) {
 	case definition_t::hz48000		: settings.sample_rate = 48000; break;
 	case definition_t::hz44100		: settings.sample_rate = 44100; break;
 	default: settings.sample_rate = 48000; break;
-	}
+	}*/
 
-	frame.state.setLeft(settings);
-	frame.frame.setOrigin(&frame.state);
+	//frame.state.setLeft(settings);
+	//frame.frame.setOrigin(&frame.state);
 
-	if (audio_cb_) {
+	/*if (audio_cb_) {
 		// Create an audio frameset wrapper.
 		ftl::audio::FrameSet fs;
 		fs.id = 0;
diff --git a/components/structures/src/new_frame.cpp b/components/structures/src/new_frame.cpp
index c5a146ff4..3ce0238b1 100644
--- a/components/structures/src/new_frame.cpp
+++ b/components/structures/src/new_frame.cpp
@@ -328,6 +328,9 @@ void Frame::reset() {
 	for (auto &d : data_) {
 		d.second.status = ChannelStatus::INVALID;
 		d.second.encoded.clear();
+
+		// Note: Aggregate channels cannot memory pool and must be cleared.
+		if (ftl::data::isAggregate(d.first)) d.second.data.reset();
 	}
 	changed_.clear();
 	status_ = FrameStatus::CREATED;
-- 
GitLab