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