146f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org/* 246f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. 346f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org * 446f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org * Use of this source code is governed by a BSD-style license 546f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org * that can be found in the LICENSE file in the root of the source 646f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org * tree. An additional intellectual property rights grant can be found 746f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org * in the file PATENTS. All contributing project authors may 846f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org * be found in the AUTHORS file in the root of the source tree. 946f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org */ 1046f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org#include <functional> 1146f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org#include <list> 1246f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org#include <string> 1346f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org 1446f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org#include "testing/gtest/include/gtest/gtest.h" 1546f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org 16d54aa969545bd9c5ccc0077dd6645e742bf11418pbos@webrtc.org#include "webrtc/base/thread_annotations.h" 1746f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org#include "webrtc/call.h" 1846f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org#include "webrtc/system_wrappers/interface/critical_section_wrapper.h" 1946f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org#include "webrtc/system_wrappers/interface/event_wrapper.h" 2046f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org#include "webrtc/system_wrappers/interface/scoped_ptr.h" 21ff4e2105ba8ceef51a91ac9ed9722ca275a33d53solenberg@webrtc.org#include "webrtc/system_wrappers/interface/trace.h" 22eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org#include "webrtc/test/call_test.h" 2346f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org#include "webrtc/test/direct_transport.h" 24e2a7a77646b23fb3704d267e6079e04bde493543pbos@webrtc.org#include "webrtc/test/encoder_settings.h" 2546f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org#include "webrtc/test/fake_decoder.h" 2646f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org#include "webrtc/test/fake_encoder.h" 2746f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org#include "webrtc/test/frame_generator_capturer.h" 2846f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org 2946f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.orgnamespace webrtc { 3038ac0326115edf78abce97e111aab7985636f907andresp@webrtc.orgnamespace { 3138ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org// Note: consider to write tests that don't depend on the trace system instead 3238ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org// of re-using this class. 3338ac0326115edf78abce97e111aab7985636f907andresp@webrtc.orgclass TraceObserver { 3438ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org public: 3538ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org TraceObserver() { 3638ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org Trace::set_level_filter(kTraceTerseInfo); 3738ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org 3838ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org Trace::CreateTrace(); 3938ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org Trace::SetTraceCallback(&callback_); 4038ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org 4138ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org // Call webrtc trace to initialize the tracer that would otherwise trigger a 4238ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org // data-race if left to be initialized by multiple threads (i.e. threads 4338ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org // spawned by test::DirectTransport members in BitrateEstimatorTest). 4438ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org WEBRTC_TRACE(kTraceStateInfo, 4538ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org kTraceUtility, 4638ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org -1, 4738ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org "Instantiate without data races."); 4838ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org } 4938ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org 5038ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org ~TraceObserver() { 5138ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org Trace::SetTraceCallback(NULL); 5238ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org Trace::ReturnTrace(); 5338ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org } 5438ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org 5538ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org void PushExpectedLogLine(const std::string& expected_log_line) { 5638ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org callback_.PushExpectedLogLine(expected_log_line); 5738ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org } 5838ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org 5938ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org EventTypeWrapper Wait() { 6038ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org return callback_.Wait(); 6138ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org } 6238ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org 6338ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org private: 6438ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org class Callback : public TraceCallback { 6538ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org public: 6638ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org Callback() 6738ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org : crit_sect_(CriticalSectionWrapper::CreateCriticalSection()), 6838ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org done_(EventWrapper::Create()) {} 6938ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org 7038ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org virtual void Print(TraceLevel level, 7138ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org const char* message, 7238ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org int length) OVERRIDE { 7338ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org CriticalSectionScoped lock(crit_sect_.get()); 7438ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org std::string msg(message); 7538ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org if (msg.find("BitrateEstimator") != std::string::npos) { 7638ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org received_log_lines_.push_back(msg); 7738ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org } 7838ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org int num_popped = 0; 7938ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org while (!received_log_lines_.empty() && !expected_log_lines_.empty()) { 8038ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org std::string a = received_log_lines_.front(); 8138ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org std::string b = expected_log_lines_.front(); 8238ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org received_log_lines_.pop_front(); 8338ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org expected_log_lines_.pop_front(); 8438ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org num_popped++; 8538ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org EXPECT_TRUE(a.find(b) != std::string::npos); 8638ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org } 8738ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org if (expected_log_lines_.size() <= 0) { 8838ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org if (num_popped > 0) { 8938ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org done_->Set(); 9038ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org } 9138ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org return; 9238ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org } 9338ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org } 9438ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org 9538ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org EventTypeWrapper Wait() { 9638ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org return done_->Wait(test::CallTest::kDefaultTimeoutMs); 9738ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org } 9838ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org 9938ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org void PushExpectedLogLine(const std::string& expected_log_line) { 10038ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org CriticalSectionScoped lock(crit_sect_.get()); 10138ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org expected_log_lines_.push_back(expected_log_line); 10238ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org } 10338ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org 10438ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org private: 10538ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org typedef std::list<std::string> Strings; 10638ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org const scoped_ptr<CriticalSectionWrapper> crit_sect_; 10738ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org Strings received_log_lines_ GUARDED_BY(crit_sect_); 10838ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org Strings expected_log_lines_ GUARDED_BY(crit_sect_); 10938ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org scoped_ptr<EventWrapper> done_; 11038ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org }; 11138ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org 11238ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org Callback callback_; 11338ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org}; 11438ac0326115edf78abce97e111aab7985636f907andresp@webrtc.org} // namespace 11546f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org 11646f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.orgstatic const int kTOFExtensionId = 4; 11746f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.orgstatic const int kASTExtensionId = 5; 11846f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org 119eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.orgclass BitrateEstimatorTest : public test::CallTest { 12046f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org public: 12146f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org BitrateEstimatorTest() 12246f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org : receiver_trace_(), 12346f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org send_transport_(), 12446f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org receive_transport_(), 12546f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org sender_call_(), 12646f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org receiver_call_(), 12746f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org receive_config_(), 12846f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org streams_() { 12946f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org } 13046f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org 13146f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org virtual ~BitrateEstimatorTest() { 13246f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org EXPECT_TRUE(streams_.empty()); 13346f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org } 13446f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org 13546f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org virtual void SetUp() { 13646f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org Call::Config receiver_call_config(&receive_transport_); 13746f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org receiver_call_.reset(Call::Create(receiver_call_config)); 13846f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org 13946f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org Call::Config sender_call_config(&send_transport_); 14046f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org sender_call_.reset(Call::Create(sender_call_config)); 14146f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org 14246f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org send_transport_.SetReceiver(receiver_call_->Receiver()); 14346f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org receive_transport_.SetReceiver(sender_call_->Receiver()); 14446f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org 1457f0b309745ae589ded2bec817c390249fdb10ad3pbos@webrtc.org send_config_ = VideoSendStream::Config(); 146eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org send_config_.rtp.ssrcs.push_back(kSendSsrcs[0]); 147e2a7a77646b23fb3704d267e6079e04bde493543pbos@webrtc.org // Encoders will be set separately per stream. 148bdfcddf7091e92134143e9a2d9ccce908e43979epbos@webrtc.org send_config_.encoder_settings.encoder = NULL; 149bdfcddf7091e92134143e9a2d9ccce908e43979epbos@webrtc.org send_config_.encoder_settings.payload_name = "FAKE"; 150eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org send_config_.encoder_settings.payload_type = kFakeSendPayloadType; 15158b5140b7535ae66c618cc64b0a955b8d47cc86cpbos@webrtc.org encoder_config_.streams = test::CreateVideoStreams(1); 15246f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org 1537f0b309745ae589ded2bec817c390249fdb10ad3pbos@webrtc.org receive_config_ = VideoReceiveStream::Config(); 154e2a7a77646b23fb3704d267e6079e04bde493543pbos@webrtc.org assert(receive_config_.codecs.empty()); 155e2a7a77646b23fb3704d267e6079e04bde493543pbos@webrtc.org VideoCodec codec = 156e2a7a77646b23fb3704d267e6079e04bde493543pbos@webrtc.org test::CreateDecoderVideoCodec(send_config_.encoder_settings); 157e2a7a77646b23fb3704d267e6079e04bde493543pbos@webrtc.org receive_config_.codecs.push_back(codec); 15846f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org // receive_config_.external_decoders will be set by every stream separately. 15946f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org receive_config_.rtp.remote_ssrc = send_config_.rtp.ssrcs[0]; 16046f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org receive_config_.rtp.local_ssrc = kReceiverLocalSsrc; 16146f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org receive_config_.rtp.extensions.push_back( 16246f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org RtpExtension(RtpExtension::kTOffset, kTOFExtensionId)); 16346f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org receive_config_.rtp.extensions.push_back( 16446f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org RtpExtension(RtpExtension::kAbsSendTime, kASTExtensionId)); 16546f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org } 16646f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org 16746f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org virtual void TearDown() { 16846f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org std::for_each(streams_.begin(), streams_.end(), 16946f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org std::mem_fun(&Stream::StopSending)); 17046f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org 17146f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org send_transport_.StopSending(); 17246f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org receive_transport_.StopSending(); 17346f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org 17446f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org while (!streams_.empty()) { 17546f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org delete streams_.back(); 17646f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org streams_.pop_back(); 17746f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org } 17846f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org 17946f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org receiver_call_.reset(); 18046f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org } 18146f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org 18246f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org protected: 18346f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org friend class Stream; 18446f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org 18546f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org class Stream { 18646f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org public: 18746f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org explicit Stream(BitrateEstimatorTest* test) 18846f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org : test_(test), 18946f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org is_sending_receiving_(false), 19046f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org send_stream_(NULL), 19146f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org receive_stream_(NULL), 19246f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org frame_generator_capturer_(), 19346f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org fake_encoder_(Clock::GetRealTimeClock()), 19446f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org fake_decoder_() { 19546f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org test_->send_config_.rtp.ssrcs[0]++; 196e2a7a77646b23fb3704d267e6079e04bde493543pbos@webrtc.org test_->send_config_.encoder_settings.encoder = &fake_encoder_; 197bdfcddf7091e92134143e9a2d9ccce908e43979epbos@webrtc.org send_stream_ = test_->sender_call_->CreateVideoSendStream( 19858b5140b7535ae66c618cc64b0a955b8d47cc86cpbos@webrtc.org test_->send_config_, test_->encoder_config_); 19958b5140b7535ae66c618cc64b0a955b8d47cc86cpbos@webrtc.org assert(test_->encoder_config_.streams.size() == 1); 20058b5140b7535ae66c618cc64b0a955b8d47cc86cpbos@webrtc.org frame_generator_capturer_.reset(test::FrameGeneratorCapturer::Create( 20158b5140b7535ae66c618cc64b0a955b8d47cc86cpbos@webrtc.org send_stream_->Input(), 20258b5140b7535ae66c618cc64b0a955b8d47cc86cpbos@webrtc.org test_->encoder_config_.streams[0].width, 20358b5140b7535ae66c618cc64b0a955b8d47cc86cpbos@webrtc.org test_->encoder_config_.streams[0].height, 20458b5140b7535ae66c618cc64b0a955b8d47cc86cpbos@webrtc.org 30, 20558b5140b7535ae66c618cc64b0a955b8d47cc86cpbos@webrtc.org Clock::GetRealTimeClock())); 20616a058a180164c32a13f3406d35cc3ef1ad569c4pbos@webrtc.org send_stream_->Start(); 20746f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org frame_generator_capturer_->Start(); 20846f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org 20946f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org ExternalVideoDecoder decoder; 21046f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org decoder.decoder = &fake_decoder_; 211e2a7a77646b23fb3704d267e6079e04bde493543pbos@webrtc.org decoder.payload_type = test_->send_config_.encoder_settings.payload_type; 21246f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org test_->receive_config_.rtp.remote_ssrc = test_->send_config_.rtp.ssrcs[0]; 21346f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org test_->receive_config_.rtp.local_ssrc++; 21446f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org test_->receive_config_.external_decoders.push_back(decoder); 21546f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org receive_stream_ = test_->receiver_call_->CreateVideoReceiveStream( 21646f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org test_->receive_config_); 21716a058a180164c32a13f3406d35cc3ef1ad569c4pbos@webrtc.org receive_stream_->Start(); 21846f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org 21946f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org is_sending_receiving_ = true; 22046f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org } 22146f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org 22246f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org ~Stream() { 22346f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org frame_generator_capturer_.reset(NULL); 22446f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org test_->sender_call_->DestroyVideoSendStream(send_stream_); 22546f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org send_stream_ = NULL; 22646f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org test_->receiver_call_->DestroyVideoReceiveStream(receive_stream_); 22746f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org receive_stream_ = NULL; 22846f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org } 22946f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org 23046f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org void StopSending() { 23146f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org if (is_sending_receiving_) { 23246f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org frame_generator_capturer_->Stop(); 23316a058a180164c32a13f3406d35cc3ef1ad569c4pbos@webrtc.org send_stream_->Stop(); 23416a058a180164c32a13f3406d35cc3ef1ad569c4pbos@webrtc.org receive_stream_->Stop(); 23546f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org is_sending_receiving_ = false; 23646f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org } 23746f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org } 23846f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org 23946f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org private: 24046f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org BitrateEstimatorTest* test_; 24146f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org bool is_sending_receiving_; 24246f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org VideoSendStream* send_stream_; 24346f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org VideoReceiveStream* receive_stream_; 24446f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org scoped_ptr<test::FrameGeneratorCapturer> frame_generator_capturer_; 24546f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org test::FakeEncoder fake_encoder_; 24646f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org test::FakeDecoder fake_decoder_; 24746f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org }; 24846f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org 24946f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org TraceObserver receiver_trace_; 25046f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org test::DirectTransport send_transport_; 25146f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org test::DirectTransport receive_transport_; 25246f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org scoped_ptr<Call> sender_call_; 25346f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org scoped_ptr<Call> receiver_call_; 25446f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org VideoReceiveStream::Config receive_config_; 25546f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org std::vector<Stream*> streams_; 25646f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org}; 25746f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org 258ff4e2105ba8ceef51a91ac9ed9722ca275a33d53solenberg@webrtc.orgTEST_F(BitrateEstimatorTest, InstantiatesTOFPerDefault) { 25946f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org send_config_.rtp.extensions.push_back( 26046f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org RtpExtension(RtpExtension::kTOffset, kTOFExtensionId)); 26146f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org receiver_trace_.PushExpectedLogLine( 26246f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org "RemoteBitrateEstimatorFactory: Instantiating."); 26346f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org receiver_trace_.PushExpectedLogLine( 26446f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org "RemoteBitrateEstimatorFactory: Instantiating."); 26546f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org streams_.push_back(new Stream(this)); 26646f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org EXPECT_EQ(kEventSignaled, receiver_trace_.Wait()); 26746f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org} 26846f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org 269ff4e2105ba8ceef51a91ac9ed9722ca275a33d53solenberg@webrtc.orgTEST_F(BitrateEstimatorTest, ImmediatelySwitchToAST) { 2700b9d7ced44cffcae24d881e167c61fe38c5b4985solenberg@webrtc.org send_config_.rtp.extensions.push_back( 2710b9d7ced44cffcae24d881e167c61fe38c5b4985solenberg@webrtc.org RtpExtension(RtpExtension::kAbsSendTime, kASTExtensionId)); 2720b9d7ced44cffcae24d881e167c61fe38c5b4985solenberg@webrtc.org receiver_trace_.PushExpectedLogLine( 2730b9d7ced44cffcae24d881e167c61fe38c5b4985solenberg@webrtc.org "RemoteBitrateEstimatorFactory: Instantiating."); 2740b9d7ced44cffcae24d881e167c61fe38c5b4985solenberg@webrtc.org receiver_trace_.PushExpectedLogLine( 2750b9d7ced44cffcae24d881e167c61fe38c5b4985solenberg@webrtc.org "RemoteBitrateEstimatorFactory: Instantiating."); 2760b9d7ced44cffcae24d881e167c61fe38c5b4985solenberg@webrtc.org receiver_trace_.PushExpectedLogLine("Switching to absolute send time RBE."); 2770b9d7ced44cffcae24d881e167c61fe38c5b4985solenberg@webrtc.org receiver_trace_.PushExpectedLogLine( 2780b9d7ced44cffcae24d881e167c61fe38c5b4985solenberg@webrtc.org "AbsoluteSendTimeRemoteBitrateEstimatorFactory: Instantiating."); 2790b9d7ced44cffcae24d881e167c61fe38c5b4985solenberg@webrtc.org streams_.push_back(new Stream(this)); 2800b9d7ced44cffcae24d881e167c61fe38c5b4985solenberg@webrtc.org EXPECT_EQ(kEventSignaled, receiver_trace_.Wait()); 2810b9d7ced44cffcae24d881e167c61fe38c5b4985solenberg@webrtc.org} 2820b9d7ced44cffcae24d881e167c61fe38c5b4985solenberg@webrtc.org 283ff4e2105ba8ceef51a91ac9ed9722ca275a33d53solenberg@webrtc.orgTEST_F(BitrateEstimatorTest, SwitchesToAST) { 28446f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org send_config_.rtp.extensions.push_back( 28546f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org RtpExtension(RtpExtension::kTOffset, kTOFExtensionId)); 28646f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org receiver_trace_.PushExpectedLogLine( 28746f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org "RemoteBitrateEstimatorFactory: Instantiating."); 28846f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org receiver_trace_.PushExpectedLogLine( 28946f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org "RemoteBitrateEstimatorFactory: Instantiating."); 29046f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org streams_.push_back(new Stream(this)); 29146f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org EXPECT_EQ(kEventSignaled, receiver_trace_.Wait()); 29246f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org 29346f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org send_config_.rtp.extensions[0] = 29446f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org RtpExtension(RtpExtension::kAbsSendTime, kASTExtensionId); 29546f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org receiver_trace_.PushExpectedLogLine("Switching to absolute send time RBE."); 29646f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org receiver_trace_.PushExpectedLogLine( 29746f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org "AbsoluteSendTimeRemoteBitrateEstimatorFactory: Instantiating."); 29846f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org streams_.push_back(new Stream(this)); 29946f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org EXPECT_EQ(kEventSignaled, receiver_trace_.Wait()); 30046f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org} 30146f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org 302ff4e2105ba8ceef51a91ac9ed9722ca275a33d53solenberg@webrtc.orgTEST_F(BitrateEstimatorTest, SwitchesToASTThenBackToTOF) { 30346f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org send_config_.rtp.extensions.push_back( 30446f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org RtpExtension(RtpExtension::kTOffset, kTOFExtensionId)); 30546f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org receiver_trace_.PushExpectedLogLine( 30646f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org "RemoteBitrateEstimatorFactory: Instantiating."); 30746f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org receiver_trace_.PushExpectedLogLine( 30846f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org "RemoteBitrateEstimatorFactory: Instantiating."); 30946f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org streams_.push_back(new Stream(this)); 31046f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org EXPECT_EQ(kEventSignaled, receiver_trace_.Wait()); 31146f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org 31246f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org send_config_.rtp.extensions[0] = 31346f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org RtpExtension(RtpExtension::kAbsSendTime, kASTExtensionId); 31446f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org receiver_trace_.PushExpectedLogLine("Switching to absolute send time RBE."); 31546f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org receiver_trace_.PushExpectedLogLine( 31646f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org "AbsoluteSendTimeRemoteBitrateEstimatorFactory: Instantiating."); 31746f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org streams_.push_back(new Stream(this)); 31846f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org EXPECT_EQ(kEventSignaled, receiver_trace_.Wait()); 31946f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org 32046f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org send_config_.rtp.extensions[0] = 32146f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org RtpExtension(RtpExtension::kTOffset, kTOFExtensionId); 32246f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org receiver_trace_.PushExpectedLogLine( 32346f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org "WrappingBitrateEstimator: Switching to transmission time offset RBE."); 32446f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org receiver_trace_.PushExpectedLogLine( 32546f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org "RemoteBitrateEstimatorFactory: Instantiating."); 32646f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org streams_.push_back(new Stream(this)); 32746f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org streams_[0]->StopSending(); 32846f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org streams_[1]->StopSending(); 32946f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org EXPECT_EQ(kEventSignaled, receiver_trace_.Wait()); 33046f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org} 33146f72884ad5c4078fa324626aa69e4860e4d4ae2pbos@webrtc.org} // namespace webrtc 332