|
@@ -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();
|