Explorar o código

Merge pull request #1426 from mickel8/test-sending-rtp

Test sending and receiving RTP packets
Paul-Louis Ageneau hai 1 mes
pai
achega
9baaaa473e
Modificáronse 1 ficheiros con 41 adicións e 3 borrados
  1. 41 3
      test/track.cpp

+ 41 - 3
test/track.cpp

@@ -7,9 +7,11 @@
  */
 
 #include "rtc/rtc.hpp"
+#include "rtc/rtp.hpp"
 
 #include <atomic>
-#include <chrono>
+#include <cstring>
+#include <future>
 #include <iostream>
 #include <memory>
 #include <thread>
@@ -71,7 +73,8 @@ void test_track() {
 
 	shared_ptr<Track> t2;
 	string newTrackMid;
-	pc2.onTrack([&t2, &newTrackMid](shared_ptr<Track> t) {
+	std::promise<rtc::binary> recvRtpPromise;
+	pc2.onTrack([&t2, &newTrackMid, &recvRtpPromise](shared_ptr<Track> t) {
 		string mid = t->mid();
 		cout << "Track 2: Received track with mid \"" << mid << "\"" << endl;
 		if (mid != newTrackMid) {
@@ -84,6 +87,13 @@ void test_track() {
 		t->onClosed(
 		    [mid]() { cout << "Track 2: Track with mid \"" << mid << "\" is closed" << endl; });
 
+		t->onMessage(
+		    [&recvRtpPromise](rtc::binary message) {
+			    // This is an RTP packet
+			    recvRtpPromise.set_value(message);
+		    },
+		    nullptr);
+
 		std::atomic_store(&t2, t);
 	});
 
@@ -140,7 +150,35 @@ void test_track() {
 	if (!at2 || !at2->isOpen() || !t1->isOpen())
 		throw runtime_error("Renegotiated track is not open");
 
-	// TODO: Test sending RTP packets in track
+	std::vector<std::byte> payload = {std::byte{0}, std::byte{1}, std::byte{2}, std::byte{3}};
+	std::vector<std::byte> rtpRaw(sizeof(RtpHeader) + payload.size());
+	auto *rtp = reinterpret_cast<RtpHeader *>(rtpRaw.data());
+	rtp->setPayloadType(96);
+	rtp->setSeqNumber(1);
+	rtp->setTimestamp(3000);
+	rtp->setSsrc(2468);
+	rtp->preparePacket();
+	std::memcpy(rtpRaw.data() + sizeof(RtpHeader), payload.data(), payload.size());
+
+	if (!t1->send(rtpRaw.data(), rtpRaw.size())) {
+		throw runtime_error("Couldn't send RTP packet");
+	}
+
+	// wait for an RTP packet to be received
+	auto future = recvRtpPromise.get_future();
+	if (future.wait_for(5s) == std::future_status::timeout) {
+		throw runtime_error("Didn't receive RTP packet on pc2");
+	}
+
+	auto receivedRtpRaw = future.get();
+	if (receivedRtpRaw.empty()) {
+		throw runtime_error("Didn't receive RTP packet on pc2");
+	}
+
+	if (receivedRtpRaw.size() != rtpRaw.size() ||
+	    memcmp(receivedRtpRaw.data(), rtpRaw.data(), rtpRaw.size()) != 0) {
+		throw runtime_error("Received RTP packet is different than the packet that was sent");
+	}
 
 	// Delay close of peer 2 to check closing works properly
 	pc1.close();