OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <stdint.h> | 5 #include <stdint.h> |
6 | 6 |
7 #include <vector> | 7 #include <vector> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/memory/scoped_ptr.h" | 10 #include "base/memory/scoped_ptr.h" |
11 #include "base/test/simple_test_tick_clock.h" | 11 #include "base/test/simple_test_tick_clock.h" |
12 #include "media/base/video_frame.h" | 12 #include "media/base/video_frame.h" |
13 #include "media/cast/cast_environment.h" | 13 #include "media/cast/cast_environment.h" |
14 #include "media/cast/logging/simple_event_subscriber.h" | 14 #include "media/cast/logging/simple_event_subscriber.h" |
| 15 #include "media/cast/net/cast_transport_config.h" |
| 16 #include "media/cast/net/cast_transport_sender_impl.h" |
| 17 #include "media/cast/net/pacing/paced_sender.h" |
| 18 #include "media/cast/sender/video_sender.h" |
15 #include "media/cast/test/fake_single_thread_task_runner.h" | 19 #include "media/cast/test/fake_single_thread_task_runner.h" |
16 #include "media/cast/test/fake_video_encode_accelerator.h" | 20 #include "media/cast/test/fake_video_encode_accelerator.h" |
17 #include "media/cast/test/utility/default_config.h" | 21 #include "media/cast/test/utility/default_config.h" |
18 #include "media/cast/test/utility/video_utility.h" | 22 #include "media/cast/test/utility/video_utility.h" |
19 #include "media/cast/transport/cast_transport_config.h" | |
20 #include "media/cast/transport/cast_transport_sender_impl.h" | |
21 #include "media/cast/transport/pacing/paced_sender.h" | |
22 #include "media/cast/video_sender/video_sender.h" | |
23 #include "testing/gmock/include/gmock/gmock.h" | 23 #include "testing/gmock/include/gmock/gmock.h" |
24 #include "testing/gtest/include/gtest/gtest.h" | 24 #include "testing/gtest/include/gtest/gtest.h" |
25 | 25 |
26 namespace media { | 26 namespace media { |
27 namespace cast { | 27 namespace cast { |
28 | 28 |
29 namespace { | 29 namespace { |
30 static const uint8 kPixelValue = 123; | 30 static const uint8 kPixelValue = 123; |
31 static const int kWidth = 320; | 31 static const int kWidth = 320; |
32 static const int kHeight = 240; | 32 static const int kHeight = 240; |
(...skipping 11 matching lines...) Expand all Loading... |
44 void CreateSharedMemory( | 44 void CreateSharedMemory( |
45 size_t size, const ReceiveVideoEncodeMemoryCallback& callback) { | 45 size_t size, const ReceiveVideoEncodeMemoryCallback& callback) { |
46 scoped_ptr<base::SharedMemory> shm(new base::SharedMemory()); | 46 scoped_ptr<base::SharedMemory> shm(new base::SharedMemory()); |
47 if (!shm->CreateAndMapAnonymous(size)) { | 47 if (!shm->CreateAndMapAnonymous(size)) { |
48 NOTREACHED(); | 48 NOTREACHED(); |
49 return; | 49 return; |
50 } | 50 } |
51 callback.Run(shm.Pass()); | 51 callback.Run(shm.Pass()); |
52 } | 52 } |
53 | 53 |
54 class TestPacketSender : public transport::PacketSender { | 54 class TestPacketSender : public PacketSender { |
55 public: | 55 public: |
56 TestPacketSender() | 56 TestPacketSender() |
57 : number_of_rtp_packets_(0), | 57 : number_of_rtp_packets_(0), |
58 number_of_rtcp_packets_(0), | 58 number_of_rtcp_packets_(0), |
59 paused_(false) {} | 59 paused_(false) {} |
60 | 60 |
61 // A singular packet implies a RTCP packet. | 61 // A singular packet implies a RTCP packet. |
62 virtual bool SendPacket(transport::PacketRef packet, | 62 virtual bool SendPacket(PacketRef packet, |
63 const base::Closure& cb) OVERRIDE { | 63 const base::Closure& cb) OVERRIDE { |
64 if (paused_) { | 64 if (paused_) { |
65 stored_packet_ = packet; | 65 stored_packet_ = packet; |
66 callback_ = cb; | 66 callback_ = cb; |
67 return false; | 67 return false; |
68 } | 68 } |
69 if (Rtcp::IsRtcpPacket(&packet->data[0], packet->data.size())) { | 69 if (Rtcp::IsRtcpPacket(&packet->data[0], packet->data.size())) { |
70 ++number_of_rtcp_packets_; | 70 ++number_of_rtcp_packets_; |
71 } else { | 71 } else { |
72 // Check that at least one RTCP packet was sent before the first RTP | 72 // Check that at least one RTCP packet was sent before the first RTP |
(...skipping 17 matching lines...) Expand all Loading... |
90 SendPacket(stored_packet_, callback_); | 90 SendPacket(stored_packet_, callback_); |
91 callback_.Run(); | 91 callback_.Run(); |
92 } | 92 } |
93 } | 93 } |
94 | 94 |
95 private: | 95 private: |
96 int number_of_rtp_packets_; | 96 int number_of_rtp_packets_; |
97 int number_of_rtcp_packets_; | 97 int number_of_rtcp_packets_; |
98 bool paused_; | 98 bool paused_; |
99 base::Closure callback_; | 99 base::Closure callback_; |
100 transport::PacketRef stored_packet_; | 100 PacketRef stored_packet_; |
101 | 101 |
102 DISALLOW_COPY_AND_ASSIGN(TestPacketSender); | 102 DISALLOW_COPY_AND_ASSIGN(TestPacketSender); |
103 }; | 103 }; |
104 | 104 |
105 class PeerVideoSender : public VideoSender { | 105 class PeerVideoSender : public VideoSender { |
106 public: | 106 public: |
107 PeerVideoSender( | 107 PeerVideoSender( |
108 scoped_refptr<CastEnvironment> cast_environment, | 108 scoped_refptr<CastEnvironment> cast_environment, |
109 const VideoSenderConfig& video_config, | 109 const VideoSenderConfig& video_config, |
110 const CreateVideoEncodeAcceleratorCallback& create_vea_cb, | 110 const CreateVideoEncodeAcceleratorCallback& create_vea_cb, |
111 const CreateVideoEncodeMemoryCallback& create_video_encode_mem_cb, | 111 const CreateVideoEncodeMemoryCallback& create_video_encode_mem_cb, |
112 transport::CastTransportSender* const transport_sender) | 112 CastTransportSender* const transport_sender) |
113 : VideoSender(cast_environment, | 113 : VideoSender(cast_environment, |
114 video_config, | 114 video_config, |
115 create_vea_cb, | 115 create_vea_cb, |
116 create_video_encode_mem_cb, | 116 create_video_encode_mem_cb, |
117 transport_sender) {} | 117 transport_sender) {} |
118 using VideoSender::OnReceivedCastFeedback; | 118 using VideoSender::OnReceivedCastFeedback; |
119 }; | 119 }; |
120 } // namespace | 120 } // namespace |
121 | 121 |
122 class VideoSenderTest : public ::testing::Test { | 122 class VideoSenderTest : public ::testing::Test { |
123 protected: | 123 protected: |
124 VideoSenderTest() { | 124 VideoSenderTest() { |
125 testing_clock_ = new base::SimpleTestTickClock(); | 125 testing_clock_ = new base::SimpleTestTickClock(); |
126 testing_clock_->Advance(base::TimeTicks::Now() - base::TimeTicks()); | 126 testing_clock_->Advance(base::TimeTicks::Now() - base::TimeTicks()); |
127 task_runner_ = new test::FakeSingleThreadTaskRunner(testing_clock_); | 127 task_runner_ = new test::FakeSingleThreadTaskRunner(testing_clock_); |
128 cast_environment_ = | 128 cast_environment_ = |
129 new CastEnvironment(scoped_ptr<base::TickClock>(testing_clock_).Pass(), | 129 new CastEnvironment(scoped_ptr<base::TickClock>(testing_clock_).Pass(), |
130 task_runner_, | 130 task_runner_, |
131 task_runner_, | 131 task_runner_, |
132 task_runner_); | 132 task_runner_); |
133 last_pixel_value_ = kPixelValue; | 133 last_pixel_value_ = kPixelValue; |
134 net::IPEndPoint dummy_endpoint; | 134 net::IPEndPoint dummy_endpoint; |
135 transport_sender_.reset(new transport::CastTransportSenderImpl( | 135 transport_sender_.reset(new CastTransportSenderImpl( |
136 NULL, | 136 NULL, |
137 testing_clock_, | 137 testing_clock_, |
138 dummy_endpoint, | 138 dummy_endpoint, |
139 base::Bind(&UpdateCastTransportStatus), | 139 base::Bind(&UpdateCastTransportStatus), |
140 transport::BulkRawEventsCallback(), | 140 BulkRawEventsCallback(), |
141 base::TimeDelta(), | 141 base::TimeDelta(), |
142 task_runner_, | 142 task_runner_, |
143 &transport_)); | 143 &transport_)); |
144 } | 144 } |
145 | 145 |
146 virtual ~VideoSenderTest() {} | 146 virtual ~VideoSenderTest() {} |
147 | 147 |
148 virtual void TearDown() OVERRIDE { | 148 virtual void TearDown() OVERRIDE { |
149 video_sender_.reset(); | 149 video_sender_.reset(); |
150 task_runner_->RunTasks(); | 150 task_runner_->RunTasks(); |
151 } | 151 } |
152 | 152 |
153 static void UpdateCastTransportStatus(transport::CastTransportStatus status) { | 153 static void UpdateCastTransportStatus(CastTransportStatus status) { |
154 EXPECT_EQ(transport::TRANSPORT_VIDEO_INITIALIZED, status); | 154 EXPECT_EQ(TRANSPORT_VIDEO_INITIALIZED, status); |
155 } | 155 } |
156 | 156 |
157 void InitEncoder(bool external) { | 157 void InitEncoder(bool external) { |
158 VideoSenderConfig video_config; | 158 VideoSenderConfig video_config; |
159 video_config.ssrc = 1; | 159 video_config.ssrc = 1; |
160 video_config.incoming_feedback_ssrc = 2; | 160 video_config.incoming_feedback_ssrc = 2; |
161 video_config.rtcp_c_name = "video_test@10.1.1.1"; | 161 video_config.rtcp_c_name = "video_test@10.1.1.1"; |
162 video_config.rtp_payload_type = 127; | 162 video_config.rtp_payload_type = 127; |
163 video_config.use_external_encoder = external; | 163 video_config.use_external_encoder = external; |
164 video_config.width = kWidth; | 164 video_config.width = kWidth; |
165 video_config.height = kHeight; | 165 video_config.height = kHeight; |
166 video_config.max_bitrate = 5000000; | 166 video_config.max_bitrate = 5000000; |
167 video_config.min_bitrate = 1000000; | 167 video_config.min_bitrate = 1000000; |
168 video_config.start_bitrate = 1000000; | 168 video_config.start_bitrate = 1000000; |
169 video_config.max_qp = 56; | 169 video_config.max_qp = 56; |
170 video_config.min_qp = 0; | 170 video_config.min_qp = 0; |
171 video_config.max_frame_rate = 30; | 171 video_config.max_frame_rate = 30; |
172 video_config.max_number_of_video_buffers_used = 1; | 172 video_config.max_number_of_video_buffers_used = 1; |
173 video_config.codec = transport::CODEC_VIDEO_VP8; | 173 video_config.codec = CODEC_VIDEO_VP8; |
174 | 174 |
175 if (external) { | 175 if (external) { |
176 scoped_ptr<VideoEncodeAccelerator> fake_vea( | 176 scoped_ptr<VideoEncodeAccelerator> fake_vea( |
177 new test::FakeVideoEncodeAccelerator(task_runner_)); | 177 new test::FakeVideoEncodeAccelerator(task_runner_)); |
178 video_sender_.reset( | 178 video_sender_.reset( |
179 new PeerVideoSender(cast_environment_, | 179 new PeerVideoSender(cast_environment_, |
180 video_config, | 180 video_config, |
181 base::Bind(&CreateVideoEncodeAccelerator, | 181 base::Bind(&CreateVideoEncodeAccelerator, |
182 task_runner_, | 182 task_runner_, |
183 base::Passed(&fake_vea)), | 183 base::Passed(&fake_vea)), |
(...skipping 27 matching lines...) Expand all Loading... |
211 PopulateVideoFrameWithNoise(video_frame); | 211 PopulateVideoFrameWithNoise(video_frame); |
212 return video_frame; | 212 return video_frame; |
213 } | 213 } |
214 | 214 |
215 void RunTasks(int during_ms) { | 215 void RunTasks(int during_ms) { |
216 task_runner_->Sleep(base::TimeDelta::FromMilliseconds(during_ms)); | 216 task_runner_->Sleep(base::TimeDelta::FromMilliseconds(during_ms)); |
217 } | 217 } |
218 | 218 |
219 base::SimpleTestTickClock* testing_clock_; // Owned by CastEnvironment. | 219 base::SimpleTestTickClock* testing_clock_; // Owned by CastEnvironment. |
220 TestPacketSender transport_; | 220 TestPacketSender transport_; |
221 scoped_ptr<transport::CastTransportSenderImpl> transport_sender_; | 221 scoped_ptr<CastTransportSenderImpl> transport_sender_; |
222 scoped_refptr<test::FakeSingleThreadTaskRunner> task_runner_; | 222 scoped_refptr<test::FakeSingleThreadTaskRunner> task_runner_; |
223 scoped_ptr<PeerVideoSender> video_sender_; | 223 scoped_ptr<PeerVideoSender> video_sender_; |
224 scoped_refptr<CastEnvironment> cast_environment_; | 224 scoped_refptr<CastEnvironment> cast_environment_; |
225 int last_pixel_value_; | 225 int last_pixel_value_; |
226 | 226 |
227 DISALLOW_COPY_AND_ASSIGN(VideoSenderTest); | 227 DISALLOW_COPY_AND_ASSIGN(VideoSenderTest); |
228 }; | 228 }; |
229 | 229 |
230 TEST_F(VideoSenderTest, BuiltInEncoder) { | 230 TEST_F(VideoSenderTest, BuiltInEncoder) { |
231 InitEncoder(false); | 231 InitEncoder(false); |
(...skipping 284 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
516 video_sender_->OnReceivedCastFeedback(cast_feedback); | 516 video_sender_->OnReceivedCastFeedback(cast_feedback); |
517 | 517 |
518 transport_.SetPause(false); | 518 transport_.SetPause(false); |
519 RunTasks(33); | 519 RunTasks(33); |
520 // Only one packet should be retransmitted. | 520 // Only one packet should be retransmitted. |
521 EXPECT_EQ(1, transport_.number_of_rtp_packets()); | 521 EXPECT_EQ(1, transport_.number_of_rtp_packets()); |
522 } | 522 } |
523 | 523 |
524 } // namespace cast | 524 } // namespace cast |
525 } // namespace media | 525 } // namespace media |
OLD | NEW |