Chromium Code Reviews| 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 // This test generate synthetic data. For audio it's a sinusoid waveform with | 5 // This test generate synthetic data. For audio it's a sinusoid waveform with |
| 6 // frequency kSoundFrequency and different amplitudes. For video it's a pattern | 6 // frequency kSoundFrequency and different amplitudes. For video it's a pattern |
| 7 // that is shifting by one pixel per frame, each pixels neighbors right and down | 7 // that is shifting by one pixel per frame, each pixels neighbors right and down |
| 8 // is this pixels value +1, since the pixel value is 8 bit it will wrap | 8 // is this pixels value +1, since the pixel value is 8 bit it will wrap |
| 9 // frequently within the image. Visually this will create diagonally color bands | 9 // frequently within the image. Visually this will create diagonally color bands |
| 10 // that moves across the screen | 10 // that moves across the screen |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 47 namespace { | 47 namespace { |
| 48 | 48 |
| 49 static const int64 kStartMillisecond = INT64_C(1245); | 49 static const int64 kStartMillisecond = INT64_C(1245); |
| 50 static const int kAudioChannels = 2; | 50 static const int kAudioChannels = 2; |
| 51 static const double kSoundFrequency = 314.15926535897; // Freq of sine wave. | 51 static const double kSoundFrequency = 314.15926535897; // Freq of sine wave. |
| 52 static const float kSoundVolume = 0.5f; | 52 static const float kSoundVolume = 0.5f; |
| 53 static const int kVideoHdWidth = 1280; | 53 static const int kVideoHdWidth = 1280; |
| 54 static const int kVideoHdHeight = 720; | 54 static const int kVideoHdHeight = 720; |
| 55 static const int kVideoQcifWidth = 176; | 55 static const int kVideoQcifWidth = 176; |
| 56 static const int kVideoQcifHeight = 144; | 56 static const int kVideoQcifHeight = 144; |
| 57 static const int kCommonRtpHeaderLength = 12; | |
| 58 static const uint8 kCastReferenceFrameIdBitReset = 0xDF; // Mask is 0x40. | |
| 59 | 57 |
| 60 // Since the video encoded and decoded an error will be introduced; when | 58 // Since the video encoded and decoded an error will be introduced; when |
| 61 // comparing individual pixels the error can be quite large; we allow a PSNR of | 59 // comparing individual pixels the error can be quite large; we allow a PSNR of |
| 62 // at least |kVideoAcceptedPSNR|. | 60 // at least |kVideoAcceptedPSNR|. |
| 63 static const double kVideoAcceptedPSNR = 38.0; | 61 static const double kVideoAcceptedPSNR = 38.0; |
| 64 | 62 |
| 65 // The tests are commonly implemented with |kFrameTimerMs| RunTask function; | 63 // The tests are commonly implemented with |kFrameTimerMs| RunTask function; |
| 66 // a normal video is 30 fps hence the 33 ms between frames. | 64 // a normal video is 30 fps hence the 33 ms between frames. |
| 67 static const int kFrameTimerMs = 33; | 65 static const int kFrameTimerMs = 33; |
| 68 | 66 |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 184 transport::PacketReceiverCallback packet_receiver_; | 182 transport::PacketReceiverCallback packet_receiver_; |
| 185 }; | 183 }; |
| 186 | 184 |
| 187 // Class that sends the packet direct from sender into the receiver with the | 185 // Class that sends the packet direct from sender into the receiver with the |
| 188 // ability to drop packets between the two. | 186 // ability to drop packets between the two. |
| 189 class LoopBackTransport : public transport::PacketSender { | 187 class LoopBackTransport : public transport::PacketSender { |
| 190 public: | 188 public: |
| 191 explicit LoopBackTransport(scoped_refptr<CastEnvironment> cast_environment) | 189 explicit LoopBackTransport(scoped_refptr<CastEnvironment> cast_environment) |
| 192 : send_packets_(true), | 190 : send_packets_(true), |
| 193 drop_packets_belonging_to_odd_frames_(false), | 191 drop_packets_belonging_to_odd_frames_(false), |
| 194 reset_reference_frame_id_(false), | |
| 195 cast_environment_(cast_environment) {} | 192 cast_environment_(cast_environment) {} |
| 196 | 193 |
| 197 void SetPacketReceiver( | 194 void SetPacketReceiver( |
| 198 const transport::PacketReceiverCallback& packet_receiver) { | 195 const transport::PacketReceiverCallback& packet_receiver) { |
| 199 scoped_ptr<test::PacketPipe> loopback_pipe( | 196 scoped_ptr<test::PacketPipe> loopback_pipe( |
| 200 new LoopBackPacketPipe(packet_receiver)); | 197 new LoopBackPacketPipe(packet_receiver)); |
| 201 if (packet_pipe_) { | 198 if (packet_pipe_) { |
| 202 packet_pipe_->AppendToPipe(loopback_pipe.Pass()); | 199 packet_pipe_->AppendToPipe(loopback_pipe.Pass()); |
| 203 } else { | 200 } else { |
| 204 packet_pipe_ = loopback_pipe.Pass(); | 201 packet_pipe_ = loopback_pipe.Pass(); |
| 205 } | 202 } |
| 206 } | 203 } |
| 207 | 204 |
| 208 virtual bool SendPacket(transport::PacketRef packet, | 205 virtual bool SendPacket(transport::PacketRef packet, |
| 209 const base::Closure& cb) OVERRIDE { | 206 const base::Closure& cb) OVERRIDE { |
| 210 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); | 207 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); |
| 211 if (!send_packets_) | 208 if (!send_packets_) |
| 212 return false; | 209 return false; |
| 213 | 210 |
| 214 if (drop_packets_belonging_to_odd_frames_) { | 211 if (drop_packets_belonging_to_odd_frames_) { |
| 215 uint32 frame_id = packet->data[13]; | 212 uint32 frame_id = packet->data[13]; |
| 216 if (frame_id % 2 == 1) | 213 if (frame_id % 2 == 1) |
| 217 return true; | 214 return true; |
| 218 } | 215 } |
| 219 | 216 |
| 220 scoped_ptr<Packet> packet_copy(new Packet(packet->data)); | 217 scoped_ptr<Packet> packet_copy(new Packet(packet->data)); |
| 221 if (reset_reference_frame_id_) { | |
| 222 // Reset the is_reference bit in the cast header. | |
| 223 (*packet_copy)[kCommonRtpHeaderLength] &= kCastReferenceFrameIdBitReset; | |
| 224 } | |
| 225 packet_pipe_->Send(packet_copy.Pass()); | 218 packet_pipe_->Send(packet_copy.Pass()); |
| 226 return true; | 219 return true; |
| 227 } | 220 } |
| 228 | 221 |
| 229 void SetSendPackets(bool send_packets) { send_packets_ = send_packets; } | 222 void SetSendPackets(bool send_packets) { send_packets_ = send_packets; } |
| 230 | 223 |
| 231 void DropAllPacketsBelongingToOddFrames() { | 224 void DropAllPacketsBelongingToOddFrames() { |
| 232 drop_packets_belonging_to_odd_frames_ = true; | 225 drop_packets_belonging_to_odd_frames_ = true; |
| 233 } | 226 } |
| 234 | 227 |
| 235 void AlwaysResetReferenceFrameId() { reset_reference_frame_id_ = true; } | |
| 236 | |
| 237 void SetPacketPipe(scoped_ptr<test::PacketPipe> pipe) { | 228 void SetPacketPipe(scoped_ptr<test::PacketPipe> pipe) { |
| 238 // Append the loopback pipe to the end. | 229 // Append the loopback pipe to the end. |
| 239 pipe->AppendToPipe(packet_pipe_.Pass()); | 230 pipe->AppendToPipe(packet_pipe_.Pass()); |
| 240 packet_pipe_ = pipe.Pass(); | 231 packet_pipe_ = pipe.Pass(); |
| 241 } | 232 } |
| 242 | 233 |
| 243 private: | 234 private: |
| 244 bool send_packets_; | 235 bool send_packets_; |
| 245 bool drop_packets_belonging_to_odd_frames_; | 236 bool drop_packets_belonging_to_odd_frames_; |
| 246 bool reset_reference_frame_id_; | |
| 247 scoped_refptr<CastEnvironment> cast_environment_; | 237 scoped_refptr<CastEnvironment> cast_environment_; |
| 248 scoped_ptr<test::PacketPipe> packet_pipe_; | 238 scoped_ptr<test::PacketPipe> packet_pipe_; |
| 249 }; | 239 }; |
| 250 | 240 |
| 251 // Class that verifies the audio frames coming out of the receiver. | 241 // Class that verifies the audio frames coming out of the receiver. |
| 252 class TestReceiverAudioCallback | 242 class TestReceiverAudioCallback |
| 253 : public base::RefCountedThreadSafe<TestReceiverAudioCallback> { | 243 : public base::RefCountedThreadSafe<TestReceiverAudioCallback> { |
| 254 public: | 244 public: |
| 255 struct ExpectedAudioFrame { | 245 struct ExpectedAudioFrame { |
| 256 scoped_ptr<AudioBus> audio_bus; | 246 scoped_ptr<AudioBus> audio_bus; |
| (...skipping 725 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 982 test_receiver_video_callback_)); | 972 test_receiver_video_callback_)); |
| 983 } | 973 } |
| 984 RunTasks(kFrameTimerMs); | 974 RunTasks(kFrameTimerMs); |
| 985 video_start++; | 975 video_start++; |
| 986 } | 976 } |
| 987 | 977 |
| 988 RunTasks(2 * kFrameTimerMs + 1); // Empty the pipeline. | 978 RunTasks(2 * kFrameTimerMs + 1); // Empty the pipeline. |
| 989 EXPECT_EQ(i / 2, test_receiver_video_callback_->number_times_called()); | 979 EXPECT_EQ(i / 2, test_receiver_video_callback_->number_times_called()); |
| 990 } | 980 } |
| 991 | 981 |
| 992 TEST_F(End2EndTest, ResetReferenceFrameId) { | |
|
miu
2014/04/23 23:41:58
I removed this test because it's not a good test:
| |
| 993 Configure(transport::kVp8, transport::kOpus, kDefaultAudioSamplingRate, | |
| 994 false, 3); | |
| 995 video_sender_config_.rtp_config.max_delay_ms = 67; | |
| 996 video_receiver_config_.rtp_max_delay_ms = 67; | |
| 997 Create(); | |
| 998 sender_to_receiver_.AlwaysResetReferenceFrameId(); | |
| 999 | |
| 1000 int frames_counter = 0; | |
| 1001 for (; frames_counter < 10; ++frames_counter) { | |
| 1002 const base::TimeTicks send_time = testing_clock_sender_->NowTicks(); | |
| 1003 SendVideoFrame(frames_counter, send_time); | |
| 1004 | |
| 1005 test_receiver_video_callback_->AddExpectedResult( | |
| 1006 frames_counter, | |
| 1007 video_sender_config_.width, | |
| 1008 video_sender_config_.height, | |
| 1009 send_time, | |
| 1010 true); | |
| 1011 | |
| 1012 // GetRawVideoFrame will not return the frame until we are close to the | |
| 1013 // time in which we should render the frame. | |
| 1014 frame_receiver_->GetRawVideoFrame( | |
| 1015 base::Bind(&TestReceiverVideoCallback::CheckVideoFrame, | |
| 1016 test_receiver_video_callback_)); | |
| 1017 RunTasks(kFrameTimerMs); | |
| 1018 } | |
| 1019 RunTasks(2 * kFrameTimerMs + 1); // Empty the pipeline. | |
| 1020 EXPECT_EQ(frames_counter, | |
| 1021 test_receiver_video_callback_->number_times_called()); | |
| 1022 } | |
| 1023 | |
| 1024 TEST_F(End2EndTest, CryptoVideo) { | 982 TEST_F(End2EndTest, CryptoVideo) { |
| 1025 Configure(transport::kVp8, transport::kPcm16, 32000, false, 1); | 983 Configure(transport::kVp8, transport::kPcm16, 32000, false, 1); |
| 1026 | 984 |
| 1027 transport_video_config_.base.aes_iv_mask = | 985 transport_video_config_.base.aes_iv_mask = |
| 1028 ConvertFromBase16String("1234567890abcdeffedcba0987654321"); | 986 ConvertFromBase16String("1234567890abcdeffedcba0987654321"); |
| 1029 transport_video_config_.base.aes_key = | 987 transport_video_config_.base.aes_key = |
| 1030 ConvertFromBase16String("deadbeefcafeb0b0b0b0cafedeadbeef"); | 988 ConvertFromBase16String("deadbeefcafeb0b0b0b0cafedeadbeef"); |
| 1031 | 989 |
| 1032 video_receiver_config_.aes_iv_mask = transport_video_config_.base.aes_iv_mask; | 990 video_receiver_config_.aes_iv_mask = transport_video_config_.base.aes_iv_mask; |
| 1033 video_receiver_config_.aes_key = transport_video_config_.base.aes_key; | 991 video_receiver_config_.aes_key = transport_video_config_.base.aes_key; |
| (...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1253 event_counter_for_frame.begin(); | 1211 event_counter_for_frame.begin(); |
| 1254 it != event_counter_for_frame.end(); | 1212 it != event_counter_for_frame.end(); |
| 1255 ++it) { | 1213 ++it) { |
| 1256 received_count += it->second.counter[kAudioFrameReceived]; | 1214 received_count += it->second.counter[kAudioFrameReceived]; |
| 1257 encoded_count += it->second.counter[kAudioFrameEncoded]; | 1215 encoded_count += it->second.counter[kAudioFrameEncoded]; |
| 1258 } | 1216 } |
| 1259 | 1217 |
| 1260 EXPECT_EQ(num_audio_frames_requested, received_count); | 1218 EXPECT_EQ(num_audio_frames_requested, received_count); |
| 1261 EXPECT_EQ(num_audio_frames_requested, encoded_count); | 1219 EXPECT_EQ(num_audio_frames_requested, encoded_count); |
| 1262 | 1220 |
| 1263 std::map<RtpTimestamp, LoggingEventCounts>::iterator map_it = | 1221 // Verify that each frame have the expected types of events logged. |
| 1264 event_counter_for_frame.begin(); | 1222 for (std::map<RtpTimestamp, LoggingEventCounts>::const_iterator map_it = |
| 1223 event_counter_for_frame.begin(); | |
| 1224 map_it != event_counter_for_frame.end(); ++map_it) { | |
| 1225 int total_event_count_for_frame = 0; | |
| 1226 for (int j = 0; j < kNumOfLoggingEvents; ++j) | |
| 1227 total_event_count_for_frame += map_it->second.counter[j]; | |
| 1265 | 1228 |
| 1266 // Verify that each frame have the expected types of events logged. | 1229 int expected_event_count_for_frame = 0; |
|
miu
2014/04/23 23:41:58
imcheng: Looks like this isn't broken anymore. In
| |
| 1267 // TODO(imcheng): This only checks the first frame. This doesn't work | |
| 1268 // properly for all frames because: | |
| 1269 // 1. kAudioPlayoutDelay and kAudioFrameDecoded RTP timestamps aren't | |
| 1270 // exactly aligned with those of kAudioFrameReceived and kAudioFrameEncoded. | |
| 1271 // Note that these RTP timestamps are output from webrtc::AudioCodingModule | |
| 1272 // which are different from RTP timestamps that the cast library generates | |
| 1273 // during the encode step (and which are sent to receiver). The first frame | |
| 1274 // just happen to be aligned. | |
| 1275 // 2. Currently, kAudioFrameDecoded and kAudioPlayoutDelay are logged per | |
| 1276 // audio bus. | |
| 1277 // Both 1 and 2 may change since we are currently refactoring audio_decoder. | |
| 1278 // 3. There is no guarantee that exactly one kAudioAckSent is sent per frame. | |
| 1279 int total_event_count_for_frame = 0; | |
| 1280 for (int j = 0; j < kNumOfLoggingEvents; ++j) | |
| 1281 total_event_count_for_frame += map_it->second.counter[j]; | |
| 1282 | 1230 |
| 1283 int expected_event_count_for_frame = 0; | 1231 EXPECT_EQ(1, map_it->second.counter[kAudioFrameReceived]); |
| 1232 expected_event_count_for_frame += | |
| 1233 map_it->second.counter[kAudioFrameReceived]; | |
| 1284 | 1234 |
| 1285 EXPECT_EQ(1, map_it->second.counter[kAudioFrameReceived]); | 1235 EXPECT_EQ(1, map_it->second.counter[kAudioFrameEncoded]); |
| 1286 expected_event_count_for_frame += map_it->second.counter[kAudioFrameReceived]; | 1236 expected_event_count_for_frame += |
| 1237 map_it->second.counter[kAudioFrameEncoded]; | |
| 1287 | 1238 |
| 1288 EXPECT_EQ(1, map_it->second.counter[kAudioFrameEncoded]); | 1239 EXPECT_EQ(1, map_it->second.counter[kAudioPlayoutDelay]); |
| 1289 expected_event_count_for_frame += map_it->second.counter[kAudioFrameEncoded]; | 1240 expected_event_count_for_frame += |
| 1241 map_it->second.counter[kAudioPlayoutDelay]; | |
| 1290 | 1242 |
| 1291 EXPECT_EQ(1, map_it->second.counter[kAudioPlayoutDelay]); | 1243 EXPECT_EQ(1, map_it->second.counter[kAudioFrameDecoded]); |
| 1292 expected_event_count_for_frame += map_it->second.counter[kAudioPlayoutDelay]; | 1244 expected_event_count_for_frame += |
| 1245 map_it->second.counter[kAudioFrameDecoded]; | |
| 1293 | 1246 |
| 1294 EXPECT_EQ(1, map_it->second.counter[kAudioFrameDecoded]); | 1247 EXPECT_GT(map_it->second.counter[kAudioAckSent], 0); |
| 1295 expected_event_count_for_frame += map_it->second.counter[kAudioFrameDecoded]; | 1248 expected_event_count_for_frame += map_it->second.counter[kAudioAckSent]; |
| 1296 | 1249 |
| 1297 EXPECT_GT(map_it->second.counter[kAudioAckSent], 0); | 1250 // Verify that there were no other events logged with respect to this frame. |
| 1298 expected_event_count_for_frame += map_it->second.counter[kAudioAckSent]; | 1251 // (i.e. Total event count = expected event count) |
| 1299 | 1252 EXPECT_EQ(total_event_count_for_frame, expected_event_count_for_frame); |
| 1300 // Verify that there were no other events logged with respect to this frame. | 1253 } |
| 1301 // (i.e. Total event count = expected event count) | |
| 1302 EXPECT_EQ(total_event_count_for_frame, expected_event_count_for_frame); | |
| 1303 } | 1254 } |
| 1304 | 1255 |
| 1305 TEST_F(End2EndTest, BasicFakeSoftwareVideo) { | 1256 TEST_F(End2EndTest, BasicFakeSoftwareVideo) { |
| 1306 Configure(transport::kFakeSoftwareVideo, transport::kPcm16, 32000, false, 1); | 1257 Configure(transport::kFakeSoftwareVideo, transport::kPcm16, 32000, false, 1); |
| 1307 Create(); | 1258 Create(); |
| 1308 | 1259 |
| 1309 int frames_counter = 0; | 1260 int frames_counter = 0; |
| 1310 int received_counter = 0; | 1261 int received_counter = 0; |
| 1311 for (; frames_counter < 1000; ++frames_counter) { | 1262 for (; frames_counter < 1000; ++frames_counter) { |
| 1312 SendFakeVideoFrame(testing_clock_sender_->NowTicks()); | 1263 SendFakeVideoFrame(testing_clock_sender_->NowTicks()); |
| 1313 frame_receiver_->GetRawVideoFrame( | 1264 frame_receiver_->GetRawVideoFrame( |
| 1314 base::Bind(&CountVideoFrame, &received_counter)); | 1265 base::Bind(&CountVideoFrame, &received_counter)); |
| 1315 RunTasks(kFrameTimerMs); | 1266 RunTasks(kFrameTimerMs); |
| 1316 } | 1267 } |
| 1317 RunTasks(2 * kFrameTimerMs + 1); // Empty the pipeline. | 1268 RunTasks(2 * kFrameTimerMs + 1); // Empty the pipeline. |
| 1318 EXPECT_EQ(1000, received_counter); | 1269 EXPECT_EQ(1000, received_counter); |
| 1319 } | 1270 } |
| 1320 | 1271 |
| 1321 // TODO(pwestin): Add repeatable packet loss test. | 1272 // TODO(pwestin): Add repeatable packet loss test. |
| 1322 // TODO(pwestin): Add test for misaligned send get calls. | 1273 // TODO(pwestin): Add test for misaligned send get calls. |
| 1323 // TODO(pwestin): Add more tests that does not resample. | 1274 // TODO(pwestin): Add more tests that does not resample. |
| 1324 // TODO(pwestin): Add test when we have starvation for our RunTask. | 1275 // TODO(pwestin): Add test when we have starvation for our RunTask. |
| 1325 | 1276 |
| 1326 } // namespace cast | 1277 } // namespace cast |
| 1327 } // namespace media | 1278 } // namespace media |
| OLD | NEW |