OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2004 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2004 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
11 #include <algorithm> | 11 #include <algorithm> |
12 #include <map> | 12 #include <map> |
13 #include <memory> | 13 #include <memory> |
14 #include <vector> | 14 #include <vector> |
15 | 15 |
16 #include "webrtc/base/arraysize.h" | 16 #include "webrtc/base/arraysize.h" |
17 #include "webrtc/base/gunit.h" | 17 #include "webrtc/base/gunit.h" |
18 #include "webrtc/base/stringutils.h" | 18 #include "webrtc/base/stringutils.h" |
19 #include "webrtc/call/flexfec_receive_stream.h" | 19 #include "webrtc/call/flexfec_receive_stream.h" |
20 #include "webrtc/common_video/h264/profile_level_id.h" | 20 #include "webrtc/common_video/h264/profile_level_id.h" |
21 #include "webrtc/logging/rtc_event_log/rtc_event_log.h" | 21 #include "webrtc/logging/rtc_event_log/rtc_event_log.h" |
22 #include "webrtc/media/base/mediaconstants.h" | 22 #include "webrtc/media/base/mediaconstants.h" |
| 23 #include "webrtc/media/base/rtputils.h" |
23 #include "webrtc/media/base/testutils.h" | 24 #include "webrtc/media/base/testutils.h" |
24 #include "webrtc/media/base/videoengine_unittest.h" | 25 #include "webrtc/media/base/videoengine_unittest.h" |
25 #include "webrtc/media/engine/constants.h" | 26 #include "webrtc/media/engine/constants.h" |
26 #include "webrtc/media/engine/fakewebrtccall.h" | 27 #include "webrtc/media/engine/fakewebrtccall.h" |
27 #include "webrtc/media/engine/fakewebrtcvideoengine.h" | 28 #include "webrtc/media/engine/fakewebrtcvideoengine.h" |
28 #include "webrtc/media/engine/simulcast.h" | 29 #include "webrtc/media/engine/simulcast.h" |
29 #include "webrtc/media/engine/webrtcvideoengine2.h" | 30 #include "webrtc/media/engine/webrtcvideoengine2.h" |
30 #include "webrtc/media/engine/webrtcvoiceengine.h" | 31 #include "webrtc/media/engine/webrtcvoiceengine.h" |
31 #include "webrtc/test/field_trial.h" | 32 #include "webrtc/test/field_trial.h" |
32 #include "webrtc/video_encoder.h" | 33 #include "webrtc/video_encoder.h" |
33 | 34 |
34 using webrtc::RtpExtension; | 35 using webrtc::RtpExtension; |
35 | 36 |
36 namespace { | 37 namespace { |
37 static const int kDefaultQpMax = 56; | 38 static const int kDefaultQpMax = 56; |
38 | 39 |
39 static const uint8_t kRedRtxPayloadType = 125; | 40 static const uint8_t kRedRtxPayloadType = 125; |
40 | 41 |
41 static const uint32_t kSsrcs1[] = {1}; | 42 static const uint32_t kSsrcs1[] = {1}; |
42 static const uint32_t kSsrcs3[] = {1, 2, 3}; | 43 static const uint32_t kSsrcs3[] = {1, 2, 3}; |
43 static const uint32_t kRtxSsrcs1[] = {4}; | 44 static const uint32_t kRtxSsrcs1[] = {4}; |
44 static const uint32_t kFlexfecSsrc = 5; | 45 static const uint32_t kFlexfecSsrc = 5; |
45 static const uint32_t kIncomingUnsignalledSsrc = 0xC0FFEE; | 46 static const uint32_t kIncomingUnsignalledSsrc = 0xC0FFEE; |
| 47 static const uint32_t kDefaultRecvSsrc = 0; |
| 48 |
46 static const char kUnsupportedExtensionName[] = | 49 static const char kUnsupportedExtensionName[] = |
47 "urn:ietf:params:rtp-hdrext:unsupported"; | 50 "urn:ietf:params:rtp-hdrext:unsupported"; |
48 | 51 |
49 cricket::VideoCodec RemoveFeedbackParams(cricket::VideoCodec&& codec) { | 52 cricket::VideoCodec RemoveFeedbackParams(cricket::VideoCodec&& codec) { |
50 codec.feedback_params = cricket::FeedbackParams(); | 53 codec.feedback_params = cricket::FeedbackParams(); |
51 return codec; | 54 return codec; |
52 } | 55 } |
53 | 56 |
54 void VerifyCodecHasDefaultFeedbackParams(const cricket::VideoCodec& codec) { | 57 void VerifyCodecHasDefaultFeedbackParams(const cricket::VideoCodec& codec) { |
55 EXPECT_TRUE(codec.HasFeedbackParam(cricket::FeedbackParam( | 58 EXPECT_TRUE(codec.HasFeedbackParam(cricket::FeedbackParam( |
(...skipping 3691 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3747 FlexfecPacketDoesntCreateUnsignalledStream) { | 3750 FlexfecPacketDoesntCreateUnsignalledStream) { |
3748 TestReceiveUnsignaledSsrcPacket(GetEngineCodec("flexfec-03").id, | 3751 TestReceiveUnsignaledSsrcPacket(GetEngineCodec("flexfec-03").id, |
3749 false /* expect_created_receive_stream */); | 3752 false /* expect_created_receive_stream */); |
3750 } | 3753 } |
3751 | 3754 |
3752 TEST_F(WebRtcVideoChannel2Test, RedRtxPacketDoesntCreateUnsignalledStream) { | 3755 TEST_F(WebRtcVideoChannel2Test, RedRtxPacketDoesntCreateUnsignalledStream) { |
3753 TestReceiveUnsignaledSsrcPacket(kRedRtxPayloadType, | 3756 TestReceiveUnsignaledSsrcPacket(kRedRtxPayloadType, |
3754 false /* expect_created_receive_stream */); | 3757 false /* expect_created_receive_stream */); |
3755 } | 3758 } |
3756 | 3759 |
| 3760 // Test that receiving any unsignalled SSRC works even if it changes. |
| 3761 // The first unsignalled SSRC received will create a default receive stream. |
| 3762 // Any different unsignalled SSRC received will replace the default. |
| 3763 TEST_F(WebRtcVideoChannel2Test, ReceiveDifferentUnsignaledSsrc) { |
| 3764 |
| 3765 // Allow receiving VP8, VP9, H264 (if enabled). |
| 3766 cricket::VideoRecvParameters parameters; |
| 3767 parameters.codecs.push_back(GetEngineCodec("VP8")); |
| 3768 parameters.codecs.push_back(GetEngineCodec("VP9")); |
| 3769 |
| 3770 #if defined(WEBRTC_USE_H264) |
| 3771 cricket::VideoCodec H264codec(126, "H264"); |
| 3772 parameters.codecs.push_back(H264codec); |
| 3773 #endif |
| 3774 |
| 3775 EXPECT_TRUE(channel_->SetRecvParameters(parameters)); |
| 3776 // No receive streams yet. |
| 3777 ASSERT_EQ(0u, fake_call_->GetVideoReceiveStreams().size()); |
| 3778 cricket::FakeVideoRenderer renderer; |
| 3779 EXPECT_TRUE(channel_->SetSink(kDefaultRecvSsrc, &renderer)); |
| 3780 |
| 3781 // Receive VP8 packet on first SSRC. |
| 3782 uint8_t data[kMinRtpPacketLen]; |
| 3783 cricket::RtpHeader rtpHeader; |
| 3784 rtpHeader.payload_type = GetEngineCodec("VP8").id; |
| 3785 rtpHeader.seq_num = rtpHeader.timestamp = 0; |
| 3786 rtpHeader.ssrc = kIncomingUnsignalledSsrc+1; |
| 3787 cricket::SetRtpHeader(data, sizeof(data), rtpHeader); |
| 3788 rtc::CopyOnWriteBuffer packet(data, sizeof(data)); |
| 3789 rtc::PacketTime packet_time; |
| 3790 channel_->OnPacketReceived(&packet, packet_time); |
| 3791 // VP8 packet should create default receive stream. |
| 3792 ASSERT_EQ(1u, fake_call_->GetVideoReceiveStreams().size()); |
| 3793 FakeVideoReceiveStream* recv_stream = |
| 3794 fake_call_->GetVideoReceiveStreams()[0]; |
| 3795 EXPECT_EQ(rtpHeader.ssrc, recv_stream->GetConfig().rtp.remote_ssrc); |
| 3796 // Verify that the receive stream sinks to a renderer. |
| 3797 webrtc::VideoFrame video_frame(CreateBlackFrameBuffer(4, 4), 100, 0, |
| 3798 webrtc::kVideoRotation_0); |
| 3799 recv_stream->InjectFrame(video_frame); |
| 3800 EXPECT_EQ(1, renderer.num_rendered_frames()); |
| 3801 |
| 3802 // Receive VP9 packet on second SSRC. |
| 3803 rtpHeader.payload_type = GetEngineCodec("VP9").id; |
| 3804 rtpHeader.ssrc = kIncomingUnsignalledSsrc+2; |
| 3805 cricket::SetRtpHeader(data, sizeof(data), rtpHeader); |
| 3806 rtc::CopyOnWriteBuffer packet2(data, sizeof(data)); |
| 3807 channel_->OnPacketReceived(&packet2, packet_time); |
| 3808 // VP9 packet should replace the default receive SSRC. |
| 3809 ASSERT_EQ(1u, fake_call_->GetVideoReceiveStreams().size()); |
| 3810 recv_stream = fake_call_->GetVideoReceiveStreams()[0]; |
| 3811 EXPECT_EQ(rtpHeader.ssrc, recv_stream->GetConfig().rtp.remote_ssrc); |
| 3812 // Verify that the receive stream sinks to a renderer. |
| 3813 webrtc::VideoFrame video_frame2(CreateBlackFrameBuffer(4, 4), 200, 0, |
| 3814 webrtc::kVideoRotation_0); |
| 3815 recv_stream->InjectFrame(video_frame2); |
| 3816 EXPECT_EQ(2, renderer.num_rendered_frames()); |
| 3817 |
| 3818 #if defined(WEBRTC_USE_H264) |
| 3819 // Receive H264 packet on third SSRC. |
| 3820 rtpHeader.payload_type = 126; |
| 3821 rtpHeader.ssrc = kIncomingUnsignalledSsrc+3; |
| 3822 cricket::SetRtpHeader(data, sizeof(data), rtpHeader); |
| 3823 rtc::CopyOnWriteBuffer packet3(data, sizeof(data)); |
| 3824 channel_->OnPacketReceived(&packet3, packet_time); |
| 3825 // H264 packet should replace the default receive SSRC. |
| 3826 ASSERT_EQ(1u, fake_call_->GetVideoReceiveStreams().size()); |
| 3827 recv_stream = fake_call_->GetVideoReceiveStreams()[0]; |
| 3828 EXPECT_EQ(rtpHeader.ssrc, recv_stream->GetConfig().rtp.remote_ssrc); |
| 3829 // Verify that the receive stream sinks to a renderer. |
| 3830 webrtc::VideoFrame video_frame3(CreateBlackFrameBuffer(4, 4), 300, 0, |
| 3831 webrtc::kVideoRotation_0); |
| 3832 recv_stream->InjectFrame(video_frame3); |
| 3833 EXPECT_EQ(3, renderer.num_rendered_frames()); |
| 3834 #endif |
| 3835 } |
| 3836 |
3757 TEST_F(WebRtcVideoChannel2Test, CanSentMaxBitrateForExistingStream) { | 3837 TEST_F(WebRtcVideoChannel2Test, CanSentMaxBitrateForExistingStream) { |
3758 AddSendStream(); | 3838 AddSendStream(); |
3759 | 3839 |
3760 cricket::FakeVideoCapturer capturer; | 3840 cricket::FakeVideoCapturer capturer; |
3761 EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, true, nullptr, &capturer)); | 3841 EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, true, nullptr, &capturer)); |
3762 cricket::VideoFormat capture_format_hd = | 3842 cricket::VideoFormat capture_format_hd = |
3763 capturer.GetSupportedFormats()->front(); | 3843 capturer.GetSupportedFormats()->front(); |
3764 EXPECT_EQ(1280, capture_format_hd.width); | 3844 EXPECT_EQ(1280, capture_format_hd.width); |
3765 EXPECT_EQ(720, capture_format_hd.height); | 3845 EXPECT_EQ(720, capture_format_hd.height); |
3766 EXPECT_EQ(cricket::CS_RUNNING, capturer.Start(capture_format_hd)); | 3846 EXPECT_EQ(cricket::CS_RUNNING, capturer.Start(capture_format_hd)); |
(...skipping 488 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4255 } | 4335 } |
4256 | 4336 |
4257 TEST_F(WebRtcVideoChannel2SimulcastTest, SetSendCodecsForSimulcastScreenshare) { | 4337 TEST_F(WebRtcVideoChannel2SimulcastTest, SetSendCodecsForSimulcastScreenshare) { |
4258 webrtc::test::ScopedFieldTrials override_field_trials_( | 4338 webrtc::test::ScopedFieldTrials override_field_trials_( |
4259 "WebRTC-SimulcastScreenshare/Enabled/"); | 4339 "WebRTC-SimulcastScreenshare/Enabled/"); |
4260 VerifySimulcastSettings(cricket::VideoCodec("VP8"), 1280, 720, 3, 2, true, | 4340 VerifySimulcastSettings(cricket::VideoCodec("VP8"), 1280, 720, 3, 2, true, |
4261 true); | 4341 true); |
4262 } | 4342 } |
4263 | 4343 |
4264 } // namespace cricket | 4344 } // namespace cricket |
OLD | NEW |