|
@@ -670,50 +670,64 @@ void PeerConnection::forwardMedia(message_ptr message) {
|
|
|
|
|
|
// Browsers like to compound their packets with a random SSRC.
|
|
|
// we have to do this monstrosity to distribute the report blocks
|
|
|
-// std::optional<string> mid;
|
|
|
std::optional<unsigned int> mediaLine;
|
|
|
if (message->type == Message::Control) {
|
|
|
unsigned int offset = 0;
|
|
|
std::vector<SSRC> ssrcsFound;
|
|
|
bool hasFound = false;
|
|
|
|
|
|
- while ((sizeof(rtc::RTCP_HEADER) + offset) < message->size()) {
|
|
|
+ while ((sizeof(rtc::RTCP_HEADER) + offset) <= message->size()) {
|
|
|
auto header = (rtc::RTCP_HEADER *) (message->data() + offset);
|
|
|
if (header->lengthInBytes() > message->size() - offset) {
|
|
|
PLOG_WARNING << "Packet was truncated";
|
|
|
break;
|
|
|
- } else {
|
|
|
- if (header->payloadType() == 205 || header->payloadType() == 206) {
|
|
|
- auto rtcpfb = (RTCP_FB_HEADER *) header;
|
|
|
- auto ssrc = rtcpfb->getPacketSenderSSRC();
|
|
|
- if (std::find(ssrcsFound.begin(), ssrcsFound.end(), ssrc) != ssrcsFound.end()) {
|
|
|
- mediaLine = getMLineFromSSRC(ssrc);
|
|
|
- if (mediaLine.has_value()) {
|
|
|
- hasFound = true;
|
|
|
- std::shared_lock lock(mTracksMutex); // read-only
|
|
|
- if (auto track = mTrackLines[*mediaLine].lock()) {
|
|
|
- track->incoming(message);
|
|
|
- }
|
|
|
- ssrcsFound.emplace_back(ssrc);
|
|
|
+ }
|
|
|
+ offset += header->lengthInBytes();
|
|
|
+ if (header->payloadType() == 205 || header->payloadType() == 206) {
|
|
|
+ auto rtcpfb = (RTCP_FB_HEADER *) header;
|
|
|
+ auto ssrc = rtcpfb->getPacketSenderSSRC();
|
|
|
+ if (std::find(ssrcsFound.begin(), ssrcsFound.end(), ssrc) == ssrcsFound.end()) {
|
|
|
+ mediaLine = getMLineFromSSRC(ssrc);
|
|
|
+ if (mediaLine.has_value()) {
|
|
|
+ hasFound = true;
|
|
|
+ std::shared_lock lock(mTracksMutex); // read-only
|
|
|
+ if (auto track = mTrackLines[*mediaLine].lock()) {
|
|
|
+ track->incoming(message);
|
|
|
}
|
|
|
+ ssrcsFound.emplace_back(ssrc);
|
|
|
}
|
|
|
+ }
|
|
|
|
|
|
- ssrc = rtcpfb->getMediaSourceSSRC();
|
|
|
- if (std::find(ssrcsFound.begin(), ssrcsFound.end(), ssrc) != ssrcsFound.end()) {
|
|
|
- mediaLine = getMLineFromSSRC(ssrc);
|
|
|
- if (mediaLine.has_value()) {
|
|
|
- hasFound = true;
|
|
|
- std::shared_lock lock(mTracksMutex); // read-only
|
|
|
- if (auto track = mTrackLines[*mediaLine].lock()) {
|
|
|
- track->incoming(message);
|
|
|
- }
|
|
|
- ssrcsFound.emplace_back(ssrc);
|
|
|
+ ssrc = rtcpfb->getMediaSourceSSRC();
|
|
|
+ if (std::find(ssrcsFound.begin(), ssrcsFound.end(), ssrc) == ssrcsFound.end()) {
|
|
|
+ mediaLine = getMLineFromSSRC(ssrc);
|
|
|
+ if (mediaLine.has_value()) {
|
|
|
+ hasFound = true;
|
|
|
+ std::shared_lock lock(mTracksMutex); // read-only
|
|
|
+ if (auto track = mTrackLines[*mediaLine].lock()) {
|
|
|
+ track->incoming(message);
|
|
|
}
|
|
|
+ ssrcsFound.emplace_back(ssrc);
|
|
|
}
|
|
|
- }else if (header->payloadType() == 200 || header->payloadType() == 201) {
|
|
|
- auto rtcpsr = (RTCP_SR*) header;
|
|
|
- auto ssrc = rtcpsr->senderSSRC();
|
|
|
- if (std::find(ssrcsFound.begin(), ssrcsFound.end(), ssrc) != ssrcsFound.end()) {
|
|
|
+ }
|
|
|
+ }else if (header->payloadType() == 200 || header->payloadType() == 201) {
|
|
|
+ auto rtcpsr = (RTCP_SR*) header;
|
|
|
+ auto ssrc = rtcpsr->senderSSRC();
|
|
|
+ if (std::find(ssrcsFound.begin(), ssrcsFound.end(), ssrc) == ssrcsFound.end()) {
|
|
|
+ mediaLine = getMLineFromSSRC(ssrc);
|
|
|
+ if (mediaLine.has_value()) {
|
|
|
+ hasFound = true;
|
|
|
+ std::shared_lock lock(mTracksMutex); // read-only
|
|
|
+ if (auto track = mTrackLines[*mediaLine].lock()) {
|
|
|
+ track->incoming(message);
|
|
|
+ }
|
|
|
+ ssrcsFound.emplace_back(ssrc);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ for (int i = 0; i < rtcpsr->header.reportCount(); i++) {
|
|
|
+ auto block = rtcpsr->getReportBlock(i);
|
|
|
+ ssrc = block->getSSRC();
|
|
|
+ if (std::find(ssrcsFound.begin(), ssrcsFound.end(), ssrc) == ssrcsFound.end()) {
|
|
|
mediaLine = getMLineFromSSRC(ssrc);
|
|
|
if (mediaLine.has_value()) {
|
|
|
hasFound = true;
|
|
@@ -724,27 +738,11 @@ void PeerConnection::forwardMedia(message_ptr message) {
|
|
|
ssrcsFound.emplace_back(ssrc);
|
|
|
}
|
|
|
}
|
|
|
- for (int i = 0; i < rtcpsr->header.reportCount(); i++) {
|
|
|
- auto block = rtcpsr->getReportBlock(i);
|
|
|
- ssrc = block->getSSRC();
|
|
|
- if (std::find(ssrcsFound.begin(), ssrcsFound.end(), ssrc) != ssrcsFound.end()) {
|
|
|
- mediaLine = getMLineFromSSRC(ssrc);
|
|
|
- if (mediaLine.has_value()) {
|
|
|
- hasFound = true;
|
|
|
- std::shared_lock lock(mTracksMutex); // read-only
|
|
|
- if (auto track = mTrackLines[*mediaLine].lock()) {
|
|
|
- track->incoming(message);
|
|
|
- }
|
|
|
- ssrcsFound.emplace_back(ssrc);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }else {
|
|
|
- // This warning is commonly thrown with SDES PT=202
|
|
|
- // PLOG_WARNING << "Unknown packet type: " << (int) header->payloadType();
|
|
|
}
|
|
|
+ }else {
|
|
|
+ // This warning is commonly thrown with SDES PT=202
|
|
|
+ // PLOG_WARNING << "Unknown packet type: " << (int) header->payloadType();
|
|
|
}
|
|
|
- offset += header->lengthInBytes();
|
|
|
}
|
|
|
|
|
|
if (hasFound)
|
|
@@ -761,7 +759,7 @@ void PeerConnection::forwardMedia(message_ptr message) {
|
|
|
* Therefore, it is expected that we don't know where to forward packets.
|
|
|
* Is this ideal? No! Do I know how to fix it? No!
|
|
|
*/
|
|
|
- //PLOG_WARNING << "Track not found for SSRC " << ssrc << ", dropping";
|
|
|
+ PLOG_WARNING << "Track not found for SSRC " << ssrc << ", dropping";
|
|
|
return;
|
|
|
}
|
|
|
|