| OLD | NEW | 
|---|
| 1 /* | 1 /* | 
| 2  *  Copyright (c) 2014 The WebRTC project authors. All Rights Reserved. | 2  *  Copyright (c) 2014 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 #include <stdio.h> | 11 #include <stdio.h> | 
| 12 | 12 | 
| 13 #include <map> | 13 #include <map> | 
|  | 14 #include <memory> | 
| 14 #include <sstream> | 15 #include <sstream> | 
| 15 | 16 | 
| 16 #include "gflags/gflags.h" | 17 #include "gflags/gflags.h" | 
| 17 #include "testing/gtest/include/gtest/gtest.h" | 18 #include "testing/gtest/include/gtest/gtest.h" | 
| 18 | 19 | 
| 19 #include "webrtc/base/checks.h" | 20 #include "webrtc/base/checks.h" | 
| 20 #include "webrtc/base/scoped_ptr.h" |  | 
| 21 #include "webrtc/call.h" | 21 #include "webrtc/call.h" | 
| 22 #include "webrtc/common_video/libyuv/include/webrtc_libyuv.h" | 22 #include "webrtc/common_video/libyuv/include/webrtc_libyuv.h" | 
| 23 #include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.h" | 23 #include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.h" | 
| 24 #include "webrtc/system_wrappers/include/clock.h" | 24 #include "webrtc/system_wrappers/include/clock.h" | 
| 25 #include "webrtc/system_wrappers/include/sleep.h" | 25 #include "webrtc/system_wrappers/include/sleep.h" | 
| 26 #include "webrtc/test/encoder_settings.h" | 26 #include "webrtc/test/encoder_settings.h" | 
| 27 #include "webrtc/test/null_transport.h" | 27 #include "webrtc/test/null_transport.h" | 
| 28 #include "webrtc/test/fake_decoder.h" | 28 #include "webrtc/test/fake_decoder.h" | 
| 29 #include "webrtc/test/rtp_file_reader.h" | 29 #include "webrtc/test/rtp_file_reader.h" | 
| 30 #include "webrtc/test/run_loop.h" | 30 #include "webrtc/test/run_loop.h" | 
| (...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 202 | 202 | 
| 203   virtual void EncodedFrameCallback(const EncodedFrame& encoded_frame) { | 203   virtual void EncodedFrameCallback(const EncodedFrame& encoded_frame) { | 
| 204     fwrite(encoded_frame.data_, 1, encoded_frame.length_, file_); | 204     fwrite(encoded_frame.data_, 1, encoded_frame.length_, file_); | 
| 205   } | 205   } | 
| 206 | 206 | 
| 207  private: | 207  private: | 
| 208   FILE* file_; | 208   FILE* file_; | 
| 209 }; | 209 }; | 
| 210 | 210 | 
| 211 void RtpReplay() { | 211 void RtpReplay() { | 
| 212   rtc::scoped_ptr<test::VideoRenderer> playback_video( | 212   std::unique_ptr<test::VideoRenderer> playback_video( | 
| 213       test::VideoRenderer::Create("Playback Video", 640, 480)); | 213       test::VideoRenderer::Create("Playback Video", 640, 480)); | 
| 214   FileRenderPassthrough file_passthrough(flags::OutBase(), | 214   FileRenderPassthrough file_passthrough(flags::OutBase(), | 
| 215                                          playback_video.get()); | 215                                          playback_video.get()); | 
| 216 | 216 | 
| 217   rtc::scoped_ptr<Call> call(Call::Create(Call::Config())); | 217   std::unique_ptr<Call> call(Call::Create(Call::Config())); | 
| 218 | 218 | 
| 219   test::NullTransport transport; | 219   test::NullTransport transport; | 
| 220   VideoReceiveStream::Config receive_config(&transport); | 220   VideoReceiveStream::Config receive_config(&transport); | 
| 221   receive_config.rtp.remote_ssrc = flags::Ssrc(); | 221   receive_config.rtp.remote_ssrc = flags::Ssrc(); | 
| 222   receive_config.rtp.local_ssrc = kReceiverLocalSsrc; | 222   receive_config.rtp.local_ssrc = kReceiverLocalSsrc; | 
| 223   receive_config.rtp.fec.ulpfec_payload_type = flags::FecPayloadType(); | 223   receive_config.rtp.fec.ulpfec_payload_type = flags::FecPayloadType(); | 
| 224   receive_config.rtp.fec.red_payload_type = flags::RedPayloadType(); | 224   receive_config.rtp.fec.red_payload_type = flags::RedPayloadType(); | 
| 225   receive_config.rtp.nack.rtp_history_ms = 1000; | 225   receive_config.rtp.nack.rtp_history_ms = 1000; | 
| 226   if (flags::TransmissionOffsetId() != -1) { | 226   if (flags::TransmissionOffsetId() != -1) { | 
| 227     receive_config.rtp.extensions.push_back( | 227     receive_config.rtp.extensions.push_back( | 
| 228         RtpExtension(RtpExtension::kTOffset, flags::TransmissionOffsetId())); | 228         RtpExtension(RtpExtension::kTOffset, flags::TransmissionOffsetId())); | 
| 229   } | 229   } | 
| 230   if (flags::AbsSendTimeId() != -1) { | 230   if (flags::AbsSendTimeId() != -1) { | 
| 231     receive_config.rtp.extensions.push_back( | 231     receive_config.rtp.extensions.push_back( | 
| 232         RtpExtension(RtpExtension::kAbsSendTime, flags::AbsSendTimeId())); | 232         RtpExtension(RtpExtension::kAbsSendTime, flags::AbsSendTimeId())); | 
| 233   } | 233   } | 
| 234   receive_config.renderer = &file_passthrough; | 234   receive_config.renderer = &file_passthrough; | 
| 235 | 235 | 
| 236   VideoSendStream::Config::EncoderSettings encoder_settings; | 236   VideoSendStream::Config::EncoderSettings encoder_settings; | 
| 237   encoder_settings.payload_name = flags::Codec(); | 237   encoder_settings.payload_name = flags::Codec(); | 
| 238   encoder_settings.payload_type = flags::PayloadType(); | 238   encoder_settings.payload_type = flags::PayloadType(); | 
| 239   VideoReceiveStream::Decoder decoder; | 239   VideoReceiveStream::Decoder decoder; | 
| 240   rtc::scoped_ptr<DecoderBitstreamFileWriter> bitstream_writer; | 240   std::unique_ptr<DecoderBitstreamFileWriter> bitstream_writer; | 
| 241   if (!flags::DecoderBitstreamFilename().empty()) { | 241   if (!flags::DecoderBitstreamFilename().empty()) { | 
| 242     bitstream_writer.reset(new DecoderBitstreamFileWriter( | 242     bitstream_writer.reset(new DecoderBitstreamFileWriter( | 
| 243         flags::DecoderBitstreamFilename().c_str())); | 243         flags::DecoderBitstreamFilename().c_str())); | 
| 244     receive_config.pre_decode_callback = bitstream_writer.get(); | 244     receive_config.pre_decode_callback = bitstream_writer.get(); | 
| 245   } | 245   } | 
| 246   decoder = test::CreateMatchingDecoder(encoder_settings); | 246   decoder = test::CreateMatchingDecoder(encoder_settings); | 
| 247   if (!flags::DecoderBitstreamFilename().empty()) { | 247   if (!flags::DecoderBitstreamFilename().empty()) { | 
| 248     // Replace with a null decoder if we're writing the bitstream to a file | 248     // Replace with a null decoder if we're writing the bitstream to a file | 
| 249     // instead. | 249     // instead. | 
| 250     delete decoder.decoder; | 250     delete decoder.decoder; | 
| 251     decoder.decoder = new test::FakeNullDecoder(); | 251     decoder.decoder = new test::FakeNullDecoder(); | 
| 252   } | 252   } | 
| 253   receive_config.decoders.push_back(decoder); | 253   receive_config.decoders.push_back(decoder); | 
| 254 | 254 | 
| 255   VideoReceiveStream* receive_stream = | 255   VideoReceiveStream* receive_stream = | 
| 256       call->CreateVideoReceiveStream(receive_config); | 256       call->CreateVideoReceiveStream(receive_config); | 
| 257 | 257 | 
| 258   rtc::scoped_ptr<test::RtpFileReader> rtp_reader(test::RtpFileReader::Create( | 258   std::unique_ptr<test::RtpFileReader> rtp_reader(test::RtpFileReader::Create( | 
| 259       test::RtpFileReader::kRtpDump, flags::InputFile())); | 259       test::RtpFileReader::kRtpDump, flags::InputFile())); | 
| 260   if (rtp_reader.get() == nullptr) { | 260   if (rtp_reader.get() == nullptr) { | 
| 261     rtp_reader.reset(test::RtpFileReader::Create(test::RtpFileReader::kPcap, | 261     rtp_reader.reset(test::RtpFileReader::Create(test::RtpFileReader::kPcap, | 
| 262                                                  flags::InputFile())); | 262                                                  flags::InputFile())); | 
| 263     if (rtp_reader.get() == nullptr) { | 263     if (rtp_reader.get() == nullptr) { | 
| 264       fprintf(stderr, | 264       fprintf(stderr, | 
| 265               "Couldn't open input file as either a rtpdump or .pcap. Note " | 265               "Couldn't open input file as either a rtpdump or .pcap. Note " | 
| 266               "that .pcapng is not supported.\nTrying to interpret the file as " | 266               "that .pcapng is not supported.\nTrying to interpret the file as " | 
| 267               "length/packet interleaved.\n"); | 267               "length/packet interleaved.\n"); | 
| 268       rtp_reader.reset(test::RtpFileReader::Create( | 268       rtp_reader.reset(test::RtpFileReader::Create( | 
| (...skipping 14 matching lines...) Expand all  Loading... | 
| 283     test::RtpPacket packet; | 283     test::RtpPacket packet; | 
| 284     if (!rtp_reader->NextPacket(&packet)) | 284     if (!rtp_reader->NextPacket(&packet)) | 
| 285       break; | 285       break; | 
| 286     ++num_packets; | 286     ++num_packets; | 
| 287     switch (call->Receiver()->DeliverPacket(webrtc::MediaType::ANY, packet.data, | 287     switch (call->Receiver()->DeliverPacket(webrtc::MediaType::ANY, packet.data, | 
| 288                                             packet.length, PacketTime())) { | 288                                             packet.length, PacketTime())) { | 
| 289       case PacketReceiver::DELIVERY_OK: | 289       case PacketReceiver::DELIVERY_OK: | 
| 290         break; | 290         break; | 
| 291       case PacketReceiver::DELIVERY_UNKNOWN_SSRC: { | 291       case PacketReceiver::DELIVERY_UNKNOWN_SSRC: { | 
| 292         RTPHeader header; | 292         RTPHeader header; | 
| 293         rtc::scoped_ptr<RtpHeaderParser> parser(RtpHeaderParser::Create()); | 293         std::unique_ptr<RtpHeaderParser> parser(RtpHeaderParser::Create()); | 
| 294         parser->Parse(packet.data, packet.length, &header); | 294         parser->Parse(packet.data, packet.length, &header); | 
| 295         if (unknown_packets[header.ssrc] == 0) | 295         if (unknown_packets[header.ssrc] == 0) | 
| 296           fprintf(stderr, "Unknown SSRC: %u!\n", header.ssrc); | 296           fprintf(stderr, "Unknown SSRC: %u!\n", header.ssrc); | 
| 297         ++unknown_packets[header.ssrc]; | 297         ++unknown_packets[header.ssrc]; | 
| 298         break; | 298         break; | 
| 299       } | 299       } | 
| 300       case PacketReceiver::DELIVERY_PACKET_ERROR: | 300       case PacketReceiver::DELIVERY_PACKET_ERROR: | 
| 301         fprintf(stderr, "Packet error, corrupt packets or incorrect setup?\n"); | 301         fprintf(stderr, "Packet error, corrupt packets or incorrect setup?\n"); | 
| 302         break; | 302         break; | 
| 303     } | 303     } | 
| (...skipping 17 matching lines...) Expand all  Loading... | 
| 321 } | 321 } | 
| 322 }  // namespace webrtc | 322 }  // namespace webrtc | 
| 323 | 323 | 
| 324 int main(int argc, char* argv[]) { | 324 int main(int argc, char* argv[]) { | 
| 325   ::testing::InitGoogleTest(&argc, argv); | 325   ::testing::InitGoogleTest(&argc, argv); | 
| 326   google::ParseCommandLineFlags(&argc, &argv, true); | 326   google::ParseCommandLineFlags(&argc, &argv, true); | 
| 327 | 327 | 
| 328   webrtc::test::RunTest(webrtc::RtpReplay); | 328   webrtc::test::RunTest(webrtc::RtpReplay); | 
| 329   return 0; | 329   return 0; | 
| 330 } | 330 } | 
| OLD | NEW | 
|---|