OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2012 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 | 11 |
12 // This file includes unit tests for EncoderStateFeedback. | 12 // This file includes unit tests for EncoderStateFeedback. |
13 #include "webrtc/video/encoder_state_feedback.h" | 13 #include "webrtc/video/encoder_state_feedback.h" |
14 | 14 |
15 #include "testing/gmock/include/gmock/gmock.h" | 15 #include "testing/gmock/include/gmock/gmock.h" |
16 #include "testing/gtest/include/gtest/gtest.h" | 16 #include "testing/gtest/include/gtest/gtest.h" |
17 | 17 |
18 #include "webrtc/base/scoped_ptr.h" | |
19 #include "webrtc/modules/bitrate_controller/include/bitrate_controller.h" | 18 #include "webrtc/modules/bitrate_controller/include/bitrate_controller.h" |
20 #include "webrtc/modules/pacing/paced_sender.h" | 19 #include "webrtc/modules/pacing/paced_sender.h" |
21 #include "webrtc/modules/pacing/packet_router.h" | 20 #include "webrtc/modules/pacing/packet_router.h" |
22 #include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h" | |
23 #include "webrtc/modules/utility/include/mock/mock_process_thread.h" | 21 #include "webrtc/modules/utility/include/mock/mock_process_thread.h" |
24 #include "webrtc/video/payload_router.h" | |
25 #include "webrtc/video/vie_encoder.h" | 22 #include "webrtc/video/vie_encoder.h" |
26 | 23 |
27 using ::testing::NiceMock; | 24 using ::testing::NiceMock; |
28 | 25 |
29 namespace webrtc { | 26 namespace webrtc { |
30 | 27 |
31 class MockVieEncoder : public ViEEncoder { | 28 class MockVieEncoder : public ViEEncoder { |
32 public: | 29 public: |
33 explicit MockVieEncoder(ProcessThread* process_thread, PacedSender* pacer) | 30 explicit MockVieEncoder(ProcessThread* process_thread, PacedSender* pacer) |
34 : ViEEncoder(1, | 31 : ViEEncoder(1, |
35 process_thread, | 32 process_thread, |
36 nullptr, | 33 nullptr, |
37 nullptr, | 34 nullptr, |
38 nullptr, | 35 nullptr, |
39 pacer, | 36 pacer, |
40 nullptr, | 37 nullptr, |
41 nullptr) {} | 38 nullptr) {} |
42 ~MockVieEncoder() {} | 39 ~MockVieEncoder() {} |
43 | 40 |
44 MOCK_METHOD1(OnReceivedIntraFrameRequest, | 41 MOCK_METHOD1(OnReceivedIntraFrameRequest, |
45 void(uint32_t)); | 42 void(uint32_t)); |
46 MOCK_METHOD2(OnReceivedSLI, | 43 MOCK_METHOD2(OnReceivedSLI, |
47 void(uint32_t ssrc, uint8_t picture_id)); | 44 void(uint32_t ssrc, uint8_t picture_id)); |
48 MOCK_METHOD2(OnReceivedRPSI, | 45 MOCK_METHOD2(OnReceivedRPSI, |
49 void(uint32_t ssrc, uint64_t picture_id)); | 46 void(uint32_t ssrc, uint64_t picture_id)); |
50 MOCK_METHOD2(OnLocalSsrcChanged, | 47 MOCK_METHOD2(OnLocalSsrcChanged, |
51 void(uint32_t old_ssrc, uint32_t new_ssrc)); | 48 void(uint32_t old_ssrc, uint32_t new_ssrc)); |
52 }; | 49 }; |
53 | 50 |
54 class VieKeyRequestTest : public ::testing::Test { | 51 TEST(VieKeyRequestTest, CreateAndTriggerRequests) { |
55 protected: | 52 static const uint32_t kSsrc = 1234; |
56 VieKeyRequestTest() | 53 NiceMock<MockProcessThread> process_thread; |
57 : pacer_(Clock::GetRealTimeClock(), | 54 PacketRouter router; |
58 &router_, | 55 PacedSender pacer(Clock::GetRealTimeClock(), &router, |
59 BitrateController::kDefaultStartBitrateKbps, | 56 BitrateController::kDefaultStartBitrateKbps, |
60 PacedSender::kDefaultPaceMultiplier * | 57 PacedSender::kDefaultPaceMultiplier * |
61 BitrateController::kDefaultStartBitrateKbps, | 58 BitrateController::kDefaultStartBitrateKbps, |
62 0) {} | 59 0); |
63 virtual void SetUp() { | 60 MockVieEncoder encoder(&process_thread, &pacer); |
64 process_thread_.reset(new NiceMock<MockProcessThread>); | |
65 encoder_state_feedback_.reset(new EncoderStateFeedback()); | |
66 } | |
67 rtc::scoped_ptr<MockProcessThread> process_thread_; | |
68 rtc::scoped_ptr<EncoderStateFeedback> encoder_state_feedback_; | |
69 PacketRouter router_; | |
70 PacedSender pacer_; | |
71 }; | |
72 | 61 |
73 TEST_F(VieKeyRequestTest, CreateAndTriggerRequests) { | 62 EncoderStateFeedback encoder_state_feedback; |
74 const int ssrc = 1234; | 63 encoder_state_feedback.Init(std::vector<uint32_t>(1, kSsrc), &encoder); |
75 MockVieEncoder encoder(process_thread_.get(), &pacer_); | |
76 encoder_state_feedback_->AddEncoder(std::vector<uint32_t>(1, ssrc), &encoder); | |
77 | 64 |
78 EXPECT_CALL(encoder, OnReceivedIntraFrameRequest(ssrc)) | 65 EXPECT_CALL(encoder, OnReceivedIntraFrameRequest(kSsrc)) |
79 .Times(1); | 66 .Times(1); |
80 encoder_state_feedback_->GetRtcpIntraFrameObserver()-> | 67 encoder_state_feedback.OnReceivedIntraFrameRequest(kSsrc); |
81 OnReceivedIntraFrameRequest(ssrc); | |
82 | 68 |
83 const uint8_t sli_picture_id = 3; | 69 const uint8_t sli_picture_id = 3; |
84 EXPECT_CALL(encoder, OnReceivedSLI(ssrc, sli_picture_id)) | 70 EXPECT_CALL(encoder, OnReceivedSLI(kSsrc, sli_picture_id)) |
85 .Times(1); | 71 .Times(1); |
86 encoder_state_feedback_->GetRtcpIntraFrameObserver()->OnReceivedSLI( | 72 encoder_state_feedback.OnReceivedSLI(kSsrc, sli_picture_id); |
87 ssrc, sli_picture_id); | |
88 | 73 |
89 const uint64_t rpsi_picture_id = 9; | 74 const uint64_t rpsi_picture_id = 9; |
90 EXPECT_CALL(encoder, OnReceivedRPSI(ssrc, rpsi_picture_id)) | 75 EXPECT_CALL(encoder, OnReceivedRPSI(kSsrc, rpsi_picture_id)) |
91 .Times(1); | 76 .Times(1); |
92 encoder_state_feedback_->GetRtcpIntraFrameObserver()->OnReceivedRPSI( | 77 encoder_state_feedback.OnReceivedRPSI(kSsrc, rpsi_picture_id); |
93 ssrc, rpsi_picture_id); | |
94 | |
95 encoder_state_feedback_->RemoveEncoder(&encoder); | |
96 } | |
97 | |
98 // Register multiple encoders and make sure the request is relayed to correct | |
99 // ViEEncoder. | |
100 TEST_F(VieKeyRequestTest, MultipleEncoders) { | |
101 const int ssrc_1 = 1234; | |
102 const int ssrc_2 = 5678; | |
103 MockVieEncoder encoder_1(process_thread_.get(), &pacer_); | |
104 MockVieEncoder encoder_2(process_thread_.get(), &pacer_); | |
105 encoder_state_feedback_->AddEncoder(std::vector<uint32_t>(1, ssrc_1), | |
106 &encoder_1); | |
107 encoder_state_feedback_->AddEncoder(std::vector<uint32_t>(1, ssrc_2), | |
108 &encoder_2); | |
109 | |
110 EXPECT_CALL(encoder_1, OnReceivedIntraFrameRequest(ssrc_1)) | |
111 .Times(1); | |
112 EXPECT_CALL(encoder_2, OnReceivedIntraFrameRequest(ssrc_2)) | |
113 .Times(1); | |
114 encoder_state_feedback_->GetRtcpIntraFrameObserver()-> | |
115 OnReceivedIntraFrameRequest(ssrc_1); | |
116 encoder_state_feedback_->GetRtcpIntraFrameObserver()-> | |
117 OnReceivedIntraFrameRequest(ssrc_2); | |
118 | |
119 const uint8_t sli_pid_1 = 3; | |
120 const uint8_t sli_pid_2 = 4; | |
121 EXPECT_CALL(encoder_1, OnReceivedSLI(ssrc_1, sli_pid_1)) | |
122 .Times(1); | |
123 EXPECT_CALL(encoder_2, OnReceivedSLI(ssrc_2, sli_pid_2)) | |
124 .Times(1); | |
125 encoder_state_feedback_->GetRtcpIntraFrameObserver()->OnReceivedSLI( | |
126 ssrc_1, sli_pid_1); | |
127 encoder_state_feedback_->GetRtcpIntraFrameObserver()->OnReceivedSLI( | |
128 ssrc_2, sli_pid_2); | |
129 | |
130 const uint64_t rpsi_pid_1 = 9; | |
131 const uint64_t rpsi_pid_2 = 10; | |
132 EXPECT_CALL(encoder_1, OnReceivedRPSI(ssrc_1, rpsi_pid_1)) | |
133 .Times(1); | |
134 EXPECT_CALL(encoder_2, OnReceivedRPSI(ssrc_2, rpsi_pid_2)) | |
135 .Times(1); | |
136 encoder_state_feedback_->GetRtcpIntraFrameObserver()->OnReceivedRPSI( | |
137 ssrc_1, rpsi_pid_1); | |
138 encoder_state_feedback_->GetRtcpIntraFrameObserver()->OnReceivedRPSI( | |
139 ssrc_2, rpsi_pid_2); | |
140 | |
141 encoder_state_feedback_->RemoveEncoder(&encoder_1); | |
142 EXPECT_CALL(encoder_2, OnReceivedIntraFrameRequest(ssrc_2)) | |
143 .Times(1); | |
144 encoder_state_feedback_->GetRtcpIntraFrameObserver()-> | |
145 OnReceivedIntraFrameRequest(ssrc_2); | |
146 encoder_state_feedback_->RemoveEncoder(&encoder_2); | |
147 } | 78 } |
148 | 79 |
149 } // namespace webrtc | 80 } // namespace webrtc |
OLD | NEW |