| 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 |