Allow default audio receive channel to receive on any unsignalled SSRC.

BUG=webrtc:5208

Review URL: https://codereview.webrtc.org/1455923003

Cr-Commit-Position: refs/heads/master@{#10723}
This commit is contained in:
solenberg
2015-11-20 00:19:43 -08:00
committed by Commit bot
parent b0ad43baa0
commit 7e63ef0e8f
2 changed files with 79 additions and 13 deletions

View File

@ -2445,8 +2445,9 @@ void WebRtcVoiceMediaChannel::OnPacketReceived(
return;
}
if (receive_channels_.empty()) {
// Create new channel, which will be the default receive channel.
// If we don't have a default channel, and the SSRC is unknown, create a
// default channel.
if (default_recv_ssrc_ == -1 && GetReceiveChannelId(ssrc) == -1) {
StreamParams sp;
sp.ssrcs.push_back(ssrc);
LOG(LS_INFO) << "Creating default receive stream for SSRC=" << ssrc << ".";
@ -2466,7 +2467,13 @@ void WebRtcVoiceMediaChannel::OnPacketReceived(
reinterpret_cast<const uint8_t*>(packet->data()), packet->size(),
webrtc_packet_time);
if (webrtc::PacketReceiver::DELIVERY_OK != delivery_result) {
return;
// If the SSRC is unknown here, route it to the default channel, if we have
// one. See: https://bugs.chromium.org/p/webrtc/issues/detail?id=5208
if (default_recv_ssrc_ == -1) {
return;
} else {
ssrc = default_recv_ssrc_;
}
}
// Find the channel to send this packet to. It must exist since webrtc::Call

View File

@ -2424,16 +2424,15 @@ TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcAfterCreatingReceiveChannel) {
// Test that we can properly receive packets.
TEST_F(WebRtcVoiceEngineTestFake, Recv) {
EXPECT_TRUE(SetupEngine());
EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
int channel_num = voe_.GetLastChannel();
EXPECT_TRUE(voe_.CheckPacket(channel_num, kPcmuFrame,
sizeof(kPcmuFrame)));
EXPECT_TRUE(voe_.CheckPacket(channel_num, kPcmuFrame, sizeof(kPcmuFrame)));
}
// Test that we can properly receive packets on multiple streams.
TEST_F(WebRtcVoiceEngineTestFake, RecvWithMultipleStreams) {
EXPECT_TRUE(SetupEngineWithSendStream());
EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
EXPECT_TRUE(SetupEngine());
EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
int channel_num1 = voe_.GetLastChannel();
EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
@ -2449,30 +2448,90 @@ TEST_F(WebRtcVoiceEngineTestFake, RecvWithMultipleStreams) {
EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
DeliverPacket(packets[0], sizeof(packets[0]));
EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
DeliverPacket(packets[1], sizeof(packets[1]));
EXPECT_TRUE(voe_.CheckPacket(channel_num1, packets[1],
sizeof(packets[1])));
EXPECT_TRUE(voe_.CheckPacket(channel_num1, packets[1], sizeof(packets[1])));
EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
DeliverPacket(packets[2], sizeof(packets[2]));
EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
EXPECT_TRUE(voe_.CheckPacket(channel_num2, packets[2],
sizeof(packets[2])));
EXPECT_TRUE(voe_.CheckPacket(channel_num2, packets[2], sizeof(packets[2])));
EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
DeliverPacket(packets[3], sizeof(packets[3]));
EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
EXPECT_TRUE(voe_.CheckPacket(channel_num3, packets[3],
sizeof(packets[3])));
EXPECT_TRUE(voe_.CheckPacket(channel_num3, packets[3], sizeof(packets[3])));
EXPECT_TRUE(channel_->RemoveRecvStream(3));
EXPECT_TRUE(channel_->RemoveRecvStream(2));
EXPECT_TRUE(channel_->RemoveRecvStream(1));
}
// Test that receiving on an unsignalled stream works (default channel will be
// created).
TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalled) {
EXPECT_TRUE(SetupEngine());
DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
int channel_num = voe_.GetLastChannel();
EXPECT_TRUE(voe_.CheckPacket(channel_num, kPcmuFrame, sizeof(kPcmuFrame)));
}
// Test that receiving on an unsignalled stream works (default channel will be
// created), and that packets will be forwarded to the default channel
// regardless of their SSRCs.
TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledWithSsrcSwitch) {
EXPECT_TRUE(SetupEngine());
char packet[sizeof(kPcmuFrame)];
memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
// Note that the first unknown SSRC cannot be 0, because we only support
// creating receive streams for SSRC!=0.
DeliverPacket(packet, sizeof(packet));
int channel_num = voe_.GetLastChannel();
EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
// Once we have the default channel, SSRC==0 will be ok.
for (uint32_t ssrc = 0; ssrc < 10; ++ssrc) {
rtc::SetBE32(&packet[8], ssrc);
DeliverPacket(packet, sizeof(packet));
EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
}
}
// Test that a default channel is created even after a signalled stream has been
// added, and that this stream will get any packets for unknown SSRCs.
TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledAfterSignalled) {
EXPECT_TRUE(SetupEngine());
char packet[sizeof(kPcmuFrame)];
memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
// Add a known stream, send packet and verify we got it.
EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
int signalled_channel_num = voe_.GetLastChannel();
DeliverPacket(packet, sizeof(packet));
EXPECT_TRUE(voe_.CheckPacket(signalled_channel_num, packet, sizeof(packet)));
// Note that the first unknown SSRC cannot be 0, because we only support
// creating receive streams for SSRC!=0.
rtc::SetBE32(&packet[8], 7011);
DeliverPacket(packet, sizeof(packet));
int channel_num = voe_.GetLastChannel();
EXPECT_NE(channel_num, signalled_channel_num);
EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
// Once we have the default channel, SSRC==0 will be ok.
for (uint32_t ssrc = 0; ssrc < 20; ssrc += 2) {
rtc::SetBE32(&packet[8], ssrc);
DeliverPacket(packet, sizeof(packet));
EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
}
}
// Test that we properly handle failures to add a receive stream.
TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamFail) {
EXPECT_TRUE(SetupEngine());