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