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