summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTorne (Richard Coles) <torne@google.com>2014-11-12 17:59:59 +0000
committerTorne (Richard Coles) <torne@google.com>2014-11-12 17:59:59 +0000
commit5d04ee7f9fa65f7abe7b1cd18e35335c59047e5b (patch)
tree32949f5ca19925bf1049834f417a80d9462d0b95
parent77155b05052120107f7496d7c424ee24e6420550 (diff)
parent361320edab39c39820a61c753b14555c603423a7 (diff)
downloadwebrtc-5d04ee7f9fa65f7abe7b1cd18e35335c59047e5b.tar.gz
Merge from Chromium at DEPS revision 03655fd3f6d7
This commit was generated by merge_to_master.py. Change-Id: I659bdd3b127bb83ee982b3e6117a93ad4fa68d54
-rw-r--r--base/helpers.cc25
-rw-r--r--base/openssladapter.cc10
-rw-r--r--base/opensslstreamadapter.cc11
-rw-r--r--base/safe_conversions_impl.h2
-rw-r--r--call.h18
-rw-r--r--common_types.h4
-rw-r--r--config.cc12
-rw-r--r--config.h11
-rw-r--r--modules/audio_coding/main/acm2/acm_isac.cc1
-rw-r--r--modules/audio_coding/neteq/audio_decoder.cc6
-rw-r--r--modules/audio_coding/neteq/audio_decoder_impl.cc100
-rw-r--r--modules/audio_coding/neteq/audio_decoder_impl.h30
-rw-r--r--modules/audio_coding/neteq/comfort_noise.cc4
-rw-r--r--modules/audio_coding/neteq/interface/audio_decoder.h9
-rw-r--r--modules/audio_coding/neteq/normal.cc4
-rw-r--r--modules/audio_device/android/opensles_input.cc18
-rw-r--r--modules/audio_device/android/opensles_output.cc18
-rw-r--r--modules/bitrate_controller/send_side_bandwidth_estimation.cc31
-rw-r--r--modules/bitrate_controller/send_side_bandwidth_estimation.h7
-rw-r--r--modules/pacing/bitrate_prober.cc10
-rw-r--r--modules/pacing/bitrate_prober_unittest.cc14
-rw-r--r--modules/pacing/paced_sender_unittest.cc7
-rw-r--r--modules/rtp_rtcp/source/rtp_format.h6
-rw-r--r--modules/rtp_rtcp/source/rtp_format_h264.cc35
-rw-r--r--modules/rtp_rtcp/source/rtp_format_h264_unittest.cc75
-rw-r--r--modules/rtp_rtcp/source/rtp_format_video_generic.cc8
-rw-r--r--modules/rtp_rtcp/source/rtp_format_vp8.cc44
-rw-r--r--modules/rtp_rtcp/source/rtp_format_vp8_unittest.cc123
-rw-r--r--modules/rtp_rtcp/source/rtp_receiver_video.cc6
-rw-r--r--modules/rtp_rtcp/source/rtp_sender.cc80
-rw-r--r--modules/rtp_rtcp/source/rtp_sender.h10
-rw-r--r--modules/rtp_rtcp/source/rtp_sender_unittest.cc22
-rw-r--r--modules/video_coding/codecs/test/videoprocessor_integrationtest.cc12
-rw-r--r--modules/video_coding/codecs/vp9/vp9_impl.cc7
-rw-r--r--modules/video_coding/main/source/media_optimization.cc2
-rw-r--r--modules/video_render/android/video_render_android_native_opengl2.h4
-rw-r--r--p2p/base/basicpacketsocketfactory.cc7
-rw-r--r--p2p/base/basicpacketsocketfactory.h33
-rw-r--r--p2p/base/packetsocketfactory.h16
-rw-r--r--p2p/base/port.cc19
-rw-r--r--p2p/base/port.h27
-rw-r--r--p2p/base/port_unittest.cc40
-rw-r--r--p2p/base/relayport.cc13
-rw-r--r--p2p/base/relayport.h20
-rw-r--r--p2p/base/stunport.cc10
-rw-r--r--p2p/base/stunport.h69
-rw-r--r--p2p/base/tcpport.cc10
-rw-r--r--p2p/base/tcpport.h21
-rw-r--r--p2p/base/turnport.cc3
-rw-r--r--p2p/base/turnport.h11
-rw-r--r--system_wrappers/source/trace_impl.cc9
-rw-r--r--system_wrappers/source/trace_impl.h1
-rw-r--r--system_wrappers/source/trace_posix.cc20
-rw-r--r--system_wrappers/source/trace_posix.h1
-rw-r--r--system_wrappers/source/trace_win.cc21
-rw-r--r--system_wrappers/source/trace_win.h1
-rw-r--r--test/BUILD.gn3
-rw-r--r--test/encoder_settings.cc2
-rw-r--r--test/fake_encoder.cc10
-rw-r--r--test/test.gyp16
-rw-r--r--test/testsupport/android/root_path_android.cc26
-rw-r--r--test/testsupport/android/root_path_android_chromium.cc34
-rw-r--r--test/testsupport/fileutils.cc39
-rw-r--r--test/testsupport/fileutils_unittest.cc7
-rw-r--r--video/call.cc33
-rw-r--r--video/call_perf_tests.cc3
-rw-r--r--video/end_to_end_tests.cc58
-rw-r--r--video/loopback.cc2
-rw-r--r--video/receive_statistics_proxy.cc4
-rw-r--r--video/receive_statistics_proxy.h2
-rw-r--r--video/send_statistics_proxy.cc21
-rw-r--r--video/send_statistics_proxy.h6
-rw-r--r--video/send_statistics_proxy_unittest.cc68
-rw-r--r--video/video_send_stream.cc7
-rw-r--r--video/video_send_stream.h2
-rw-r--r--video/video_send_stream_tests.cc24
-rw-r--r--video_decoder.h1
-rw-r--r--video_engine/vie_base_impl.cc20
-rw-r--r--video_engine/vie_base_impl.h5
-rw-r--r--video_engine/vie_channel.h6
-rw-r--r--video_engine/vie_defines.h17
-rw-r--r--video_receive_stream.h2
-rw-r--r--video_send_stream.h4
-rw-r--r--voice_engine/voe_base_impl.cc14
-rw-r--r--voice_engine/voe_base_impl.h1
-rw-r--r--voice_engine/voice_engine_defines.h20
86 files changed, 831 insertions, 764 deletions
diff --git a/base/helpers.cc b/base/helpers.cc
index 8b14cdfd..84d1c93b 100644
--- a/base/helpers.cc
+++ b/base/helpers.cc
@@ -47,36 +47,17 @@ class RandomGenerator {
};
#if defined(SSL_USE_OPENSSL)
-// The OpenSSL RNG. Need to make sure it doesn't run out of entropy.
+// The OpenSSL RNG.
class SecureRandomGenerator : public RandomGenerator {
public:
- SecureRandomGenerator() : inited_(false) {
- }
- ~SecureRandomGenerator() {
- }
+ SecureRandomGenerator() {}
+ ~SecureRandomGenerator() {}
virtual bool Init(const void* seed, size_t len) {
- // By default, seed from the system state.
- if (!inited_) {
- if (RAND_poll() <= 0) {
- return false;
- }
- inited_ = true;
- }
- // Allow app data to be mixed in, if provided.
- if (seed) {
- RAND_seed(seed, len);
- }
return true;
}
virtual bool Generate(void* buf, size_t len) {
- if (!inited_ && !Init(NULL, 0)) {
- return false;
- }
return (RAND_bytes(reinterpret_cast<unsigned char*>(buf), len) > 0);
}
-
- private:
- bool inited_;
};
#elif defined(SSL_USE_NSS_RNG)
diff --git a/base/openssladapter.cc b/base/openssladapter.cc
index 68a1fcb1..feb01d36 100644
--- a/base/openssladapter.cc
+++ b/base/openssladapter.cc
@@ -34,6 +34,7 @@
#include "webrtc/base/common.h"
#include "webrtc/base/logging.h"
#include "webrtc/base/openssl.h"
+#include "webrtc/base/safe_conversions.h"
#include "webrtc/base/sslroots.h"
#include "webrtc/base/stringutils.h"
@@ -141,7 +142,7 @@ static int socket_write(BIO* b, const char* in, int inl) {
}
static int socket_puts(BIO* b, const char* str) {
- return socket_write(b, str, strlen(str));
+ return socket_write(b, str, rtc::checked_cast<int>(strlen(str)));
}
static long socket_ctrl(BIO* b, int cmd, long num, void* ptr) {
@@ -448,7 +449,7 @@ OpenSSLAdapter::Send(const void* pv, size_t cb) {
ssl_write_needs_read_ = false;
- int code = SSL_write(ssl_, pv, cb);
+ int code = SSL_write(ssl_, pv, checked_cast<int>(cb));
switch (SSL_get_error(ssl_, code)) {
case SSL_ERROR_NONE:
//LOG(LS_INFO) << " -- success";
@@ -503,7 +504,7 @@ OpenSSLAdapter::Recv(void* pv, size_t cb) {
ssl_read_needs_write_ = false;
- int code = SSL_read(ssl_, pv, cb);
+ int code = SSL_read(ssl_, pv, checked_cast<int>(cb));
switch (SSL_get_error(ssl_, code)) {
case SSL_ERROR_NONE:
//LOG(LS_INFO) << " -- success";
@@ -843,7 +844,8 @@ bool OpenSSLAdapter::ConfigureTrustedRootCertificates(SSL_CTX* ctx) {
for (int i = 0; i < ARRAY_SIZE(kSSLCertCertificateList); i++) {
const unsigned char* cert_buffer = kSSLCertCertificateList[i];
size_t cert_buffer_len = kSSLCertCertificateSizeList[i];
- X509* cert = d2i_X509(NULL, &cert_buffer, cert_buffer_len);
+ X509* cert = d2i_X509(NULL, &cert_buffer,
+ checked_cast<long>(cert_buffer_len));
if (cert) {
int return_value = X509_STORE_add_cert(SSL_CTX_get_cert_store(ctx), cert);
if (return_value == 0) {
diff --git a/base/opensslstreamadapter.cc b/base/opensslstreamadapter.cc
index 133eb72b..d790e4e8 100644
--- a/base/opensslstreamadapter.cc
+++ b/base/opensslstreamadapter.cc
@@ -26,6 +26,7 @@
#include "webrtc/base/common.h"
#include "webrtc/base/logging.h"
+#include "webrtc/base/safe_conversions.h"
#include "webrtc/base/stream.h"
#include "webrtc/base/openssl.h"
#include "webrtc/base/openssladapter.h"
@@ -114,7 +115,7 @@ static int stream_read(BIO* b, char* out, int outl) {
int error;
StreamResult result = stream->Read(out, outl, &read, &error);
if (result == SR_SUCCESS) {
- return read;
+ return checked_cast<int>(read);
} else if (result == SR_EOS) {
b->num = 1;
} else if (result == SR_BLOCK) {
@@ -132,7 +133,7 @@ static int stream_write(BIO* b, const char* in, int inl) {
int error;
StreamResult result = stream->Write(in, inl, &written, &error);
if (result == SR_SUCCESS) {
- return written;
+ return checked_cast<int>(written);
} else if (result == SR_BLOCK) {
BIO_set_retry_write(b);
}
@@ -140,7 +141,7 @@ static int stream_write(BIO* b, const char* in, int inl) {
}
static int stream_puts(BIO* b, const char* str) {
- return stream_write(b, str, strlen(str));
+ return stream_write(b, str, checked_cast<int>(strlen(str)));
}
static long stream_ctrl(BIO* b, int cmd, long num, void* ptr) {
@@ -364,7 +365,7 @@ StreamResult OpenSSLStreamAdapter::Write(const void* data, size_t data_len,
ssl_write_needs_read_ = false;
- int code = SSL_write(ssl_, data, data_len);
+ int code = SSL_write(ssl_, data, checked_cast<int>(data_len));
int ssl_error = SSL_get_error(ssl_, code);
switch (ssl_error) {
case SSL_ERROR_NONE:
@@ -425,7 +426,7 @@ StreamResult OpenSSLStreamAdapter::Read(void* data, size_t data_len,
ssl_read_needs_write_ = false;
- int code = SSL_read(ssl_, data, data_len);
+ int code = SSL_read(ssl_, data, checked_cast<int>(data_len));
int ssl_error = SSL_get_error(ssl_, code);
switch (ssl_error) {
case SSL_ERROR_NONE:
diff --git a/base/safe_conversions_impl.h b/base/safe_conversions_impl.h
index 2950f970..77b053a8 100644
--- a/base/safe_conversions_impl.h
+++ b/base/safe_conversions_impl.h
@@ -15,6 +15,8 @@
#include <limits>
+#include "webrtc/base/compile_assert.h"
+
namespace rtc {
namespace internal {
diff --git a/call.h b/call.h
index f21425fb..c6596f86 100644
--- a/call.h
+++ b/call.h
@@ -88,6 +88,14 @@ class Call {
int stream_start_bitrate_bps;
};
+ struct Stats {
+ Stats() : send_bandwidth_bps(0), recv_bandwidth_bps(0), pacer_delay_ms(0) {}
+
+ int send_bandwidth_bps;
+ int recv_bandwidth_bps;
+ int pacer_delay_ms;
+ };
+
static Call* Create(const Call::Config& config);
static Call* Create(const Call::Config& config,
@@ -109,13 +117,9 @@ class Call {
// Call instance exists.
virtual PacketReceiver* Receiver() = 0;
- // Returns the estimated total send bandwidth. Note: this can differ from the
- // actual encoded bitrate.
- virtual uint32_t SendBitrateEstimate() = 0;
-
- // Returns the total estimated receive bandwidth for the call. Note: this can
- // differ from the actual receive bitrate.
- virtual uint32_t ReceiveBitrateEstimate() = 0;
+ // Returns the call statistics, such as estimated send and receive bandwidth,
+ // pacing delay, etc.
+ virtual Stats GetStats() const = 0;
virtual void SignalNetworkState(NetworkState state) = 0;
diff --git a/common_types.h b/common_types.h
index 7bcfd6d4..0b4af26e 100644
--- a/common_types.h
+++ b/common_types.h
@@ -271,7 +271,9 @@ class BitrateStatisticsObserver {
public:
virtual ~BitrateStatisticsObserver() {}
- virtual void Notify(const BitrateStatistics& stats, uint32_t ssrc) = 0;
+ virtual void Notify(const BitrateStatistics& total_stats,
+ const BitrateStatistics& retransmit_stats,
+ uint32_t ssrc) = 0;
};
// Callback, used to notify an observer whenever frame counts have been updated
diff --git a/config.cc b/config.cc
index 70bd8706..357f6367 100644
--- a/config.cc
+++ b/config.cc
@@ -39,13 +39,13 @@ std::string VideoStream::ToString() const {
ss << ", max_bitrate_bps:" << max_bitrate_bps;
ss << ", max_qp: " << max_qp;
- ss << ", temporal_layer_thresholds_bps: {";
+ ss << ", temporal_layer_thresholds_bps: [";
for (size_t i = 0; i < temporal_layer_thresholds_bps.size(); ++i) {
ss << temporal_layer_thresholds_bps[i];
if (i != temporal_layer_thresholds_bps.size() - 1)
- ss << "}, {";
+ ss << ", ";
}
- ss << '}';
+ ss << ']';
ss << '}';
return ss.str();
@@ -54,13 +54,13 @@ std::string VideoStream::ToString() const {
std::string VideoEncoderConfig::ToString() const {
std::stringstream ss;
- ss << "{streams: {";
+ ss << "{streams: [";
for (size_t i = 0; i < streams.size(); ++i) {
ss << streams[i].ToString();
if (i != streams.size() - 1)
- ss << "}, {";
+ ss << ", ";
}
- ss << '}';
+ ss << ']';
ss << ", content_type: ";
switch (content_type) {
case kRealtimeVideo:
diff --git a/config.h b/config.h
index 8ea28288..ee1097fc 100644
--- a/config.h
+++ b/config.h
@@ -33,16 +33,19 @@ struct RtpStatistics {
int extended_max_sequence_number;
};
-struct StreamStats {
- StreamStats()
+struct SsrcStats {
+ SsrcStats()
: key_frames(0),
delta_frames(0),
- bitrate_bps(0),
+ total_bitrate_bps(0),
+ retransmit_bitrate_bps(0),
avg_delay_ms(0),
max_delay_ms(0) {}
uint32_t key_frames;
uint32_t delta_frames;
- int32_t bitrate_bps;
+ // TODO(holmer): Move bitrate_bps out to the webrtc::Call layer.
+ int total_bitrate_bps;
+ int retransmit_bitrate_bps;
int avg_delay_ms;
int max_delay_ms;
StreamDataCounters rtp_stats;
diff --git a/modules/audio_coding/main/acm2/acm_isac.cc b/modules/audio_coding/main/acm2/acm_isac.cc
index bc20c961..8fa96e50 100644
--- a/modules/audio_coding/main/acm2/acm_isac.cc
+++ b/modules/audio_coding/main/acm2/acm_isac.cc
@@ -277,7 +277,6 @@ ACMISAC::ACMISAC(int16_t codec_id)
return;
}
codec_inst_ptr_->inst = NULL;
- state_ = codec_inst_ptr_;
}
ACMISAC::~ACMISAC() {
diff --git a/modules/audio_coding/neteq/audio_decoder.cc b/modules/audio_coding/neteq/audio_decoder.cc
index 04a74eef..d5a27628 100644
--- a/modules/audio_coding/neteq/audio_decoder.cc
+++ b/modules/audio_coding/neteq/audio_decoder.cc
@@ -12,6 +12,7 @@
#include <assert.h>
+#include "webrtc/base/checks.h"
#include "webrtc/modules/audio_coding/neteq/audio_decoder_impl.h"
namespace webrtc {
@@ -51,6 +52,11 @@ bool AudioDecoder::PacketHasFec(const uint8_t* encoded,
return false;
}
+CNG_dec_inst* AudioDecoder::CngDecoderInstance() {
+ FATAL() << "Not a CNG decoder";
+ return NULL;
+}
+
bool AudioDecoder::CodecSupported(NetEqDecoder codec_type) {
switch (codec_type) {
case kDecoderPCMu:
diff --git a/modules/audio_coding/neteq/audio_decoder_impl.cc b/modules/audio_coding/neteq/audio_decoder_impl.cc
index 07b1b4be..eb078234 100644
--- a/modules/audio_coding/neteq/audio_decoder_impl.cc
+++ b/modules/audio_coding/neteq/audio_decoder_impl.cc
@@ -103,17 +103,17 @@ AudioDecoderPcm16BMultiCh::AudioDecoderPcm16BMultiCh(int num_channels) {
// iLBC
#ifdef WEBRTC_CODEC_ILBC
AudioDecoderIlbc::AudioDecoderIlbc() {
- WebRtcIlbcfix_DecoderCreate(reinterpret_cast<iLBC_decinst_t**>(&state_));
+ WebRtcIlbcfix_DecoderCreate(&dec_state_);
}
AudioDecoderIlbc::~AudioDecoderIlbc() {
- WebRtcIlbcfix_DecoderFree(static_cast<iLBC_decinst_t*>(state_));
+ WebRtcIlbcfix_DecoderFree(dec_state_);
}
int AudioDecoderIlbc::Decode(const uint8_t* encoded, size_t encoded_len,
int16_t* decoded, SpeechType* speech_type) {
int16_t temp_type = 1; // Default is speech.
- int16_t ret = WebRtcIlbcfix_Decode(static_cast<iLBC_decinst_t*>(state_),
+ int16_t ret = WebRtcIlbcfix_Decode(dec_state_,
reinterpret_cast<const int16_t*>(encoded),
static_cast<int16_t>(encoded_len), decoded,
&temp_type);
@@ -122,12 +122,11 @@ int AudioDecoderIlbc::Decode(const uint8_t* encoded, size_t encoded_len,
}
int AudioDecoderIlbc::DecodePlc(int num_frames, int16_t* decoded) {
- return WebRtcIlbcfix_NetEqPlc(static_cast<iLBC_decinst_t*>(state_),
- decoded, num_frames);
+ return WebRtcIlbcfix_NetEqPlc(dec_state_, decoded, num_frames);
}
int AudioDecoderIlbc::Init() {
- return WebRtcIlbcfix_Decoderinit30Ms(static_cast<iLBC_decinst_t*>(state_));
+ return WebRtcIlbcfix_Decoderinit30Ms(dec_state_);
}
#endif
@@ -135,19 +134,18 @@ int AudioDecoderIlbc::Init() {
#ifdef WEBRTC_CODEC_ISAC
AudioDecoderIsac::AudioDecoderIsac(int decode_sample_rate_hz) {
DCHECK(decode_sample_rate_hz == 16000 || decode_sample_rate_hz == 32000);
- WebRtcIsac_Create(reinterpret_cast<ISACStruct**>(&state_));
- WebRtcIsac_SetDecSampRate(static_cast<ISACStruct*>(state_),
- decode_sample_rate_hz);
+ WebRtcIsac_Create(&isac_state_);
+ WebRtcIsac_SetDecSampRate(isac_state_, decode_sample_rate_hz);
}
AudioDecoderIsac::~AudioDecoderIsac() {
- WebRtcIsac_Free(static_cast<ISACStruct*>(state_));
+ WebRtcIsac_Free(isac_state_);
}
int AudioDecoderIsac::Decode(const uint8_t* encoded, size_t encoded_len,
int16_t* decoded, SpeechType* speech_type) {
int16_t temp_type = 1; // Default is speech.
- int16_t ret = WebRtcIsac_Decode(static_cast<ISACStruct*>(state_),
+ int16_t ret = WebRtcIsac_Decode(isac_state_,
encoded,
static_cast<int16_t>(encoded_len), decoded,
&temp_type);
@@ -159,7 +157,7 @@ int AudioDecoderIsac::DecodeRedundant(const uint8_t* encoded,
size_t encoded_len, int16_t* decoded,
SpeechType* speech_type) {
int16_t temp_type = 1; // Default is speech.
- int16_t ret = WebRtcIsac_DecodeRcu(static_cast<ISACStruct*>(state_),
+ int16_t ret = WebRtcIsac_DecodeRcu(isac_state_,
encoded,
static_cast<int16_t>(encoded_len), decoded,
&temp_type);
@@ -168,12 +166,11 @@ int AudioDecoderIsac::DecodeRedundant(const uint8_t* encoded,
}
int AudioDecoderIsac::DecodePlc(int num_frames, int16_t* decoded) {
- return WebRtcIsac_DecodePlc(static_cast<ISACStruct*>(state_),
- decoded, num_frames);
+ return WebRtcIsac_DecodePlc(isac_state_, decoded, num_frames);
}
int AudioDecoderIsac::Init() {
- return WebRtcIsac_DecoderInit(static_cast<ISACStruct*>(state_));
+ return WebRtcIsac_DecoderInit(isac_state_);
}
int AudioDecoderIsac::IncomingPacket(const uint8_t* payload,
@@ -181,7 +178,7 @@ int AudioDecoderIsac::IncomingPacket(const uint8_t* payload,
uint16_t rtp_sequence_number,
uint32_t rtp_timestamp,
uint32_t arrival_timestamp) {
- return WebRtcIsac_UpdateBwEstimate(static_cast<ISACStruct*>(state_),
+ return WebRtcIsac_UpdateBwEstimate(isac_state_,
payload,
static_cast<int32_t>(payload_len),
rtp_sequence_number,
@@ -190,24 +187,24 @@ int AudioDecoderIsac::IncomingPacket(const uint8_t* payload,
}
int AudioDecoderIsac::ErrorCode() {
- return WebRtcIsac_GetErrorCode(static_cast<ISACStruct*>(state_));
+ return WebRtcIsac_GetErrorCode(isac_state_);
}
#endif
// iSAC fix
#ifdef WEBRTC_CODEC_ISACFX
AudioDecoderIsacFix::AudioDecoderIsacFix() {
- WebRtcIsacfix_Create(reinterpret_cast<ISACFIX_MainStruct**>(&state_));
+ WebRtcIsacfix_Create(&isac_state_);
}
AudioDecoderIsacFix::~AudioDecoderIsacFix() {
- WebRtcIsacfix_Free(static_cast<ISACFIX_MainStruct*>(state_));
+ WebRtcIsacfix_Free(isac_state_);
}
int AudioDecoderIsacFix::Decode(const uint8_t* encoded, size_t encoded_len,
int16_t* decoded, SpeechType* speech_type) {
int16_t temp_type = 1; // Default is speech.
- int16_t ret = WebRtcIsacfix_Decode(static_cast<ISACFIX_MainStruct*>(state_),
+ int16_t ret = WebRtcIsacfix_Decode(isac_state_,
encoded,
static_cast<int16_t>(encoded_len), decoded,
&temp_type);
@@ -216,7 +213,7 @@ int AudioDecoderIsacFix::Decode(const uint8_t* encoded, size_t encoded_len,
}
int AudioDecoderIsacFix::Init() {
- return WebRtcIsacfix_DecoderInit(static_cast<ISACFIX_MainStruct*>(state_));
+ return WebRtcIsacfix_DecoderInit(isac_state_);
}
int AudioDecoderIsacFix::IncomingPacket(const uint8_t* payload,
@@ -225,32 +222,32 @@ int AudioDecoderIsacFix::IncomingPacket(const uint8_t* payload,
uint32_t rtp_timestamp,
uint32_t arrival_timestamp) {
return WebRtcIsacfix_UpdateBwEstimate(
- static_cast<ISACFIX_MainStruct*>(state_),
+ isac_state_,
payload,
static_cast<int32_t>(payload_len),
rtp_sequence_number, rtp_timestamp, arrival_timestamp);
}
int AudioDecoderIsacFix::ErrorCode() {
- return WebRtcIsacfix_GetErrorCode(static_cast<ISACFIX_MainStruct*>(state_));
+ return WebRtcIsacfix_GetErrorCode(isac_state_);
}
#endif
// G.722
#ifdef WEBRTC_CODEC_G722
AudioDecoderG722::AudioDecoderG722() {
- WebRtcG722_CreateDecoder(reinterpret_cast<G722DecInst**>(&state_));
+ WebRtcG722_CreateDecoder(&dec_state_);
}
AudioDecoderG722::~AudioDecoderG722() {
- WebRtcG722_FreeDecoder(static_cast<G722DecInst*>(state_));
+ WebRtcG722_FreeDecoder(dec_state_);
}
int AudioDecoderG722::Decode(const uint8_t* encoded, size_t encoded_len,
int16_t* decoded, SpeechType* speech_type) {
int16_t temp_type = 1; // Default is speech.
int16_t ret = WebRtcG722_Decode(
- static_cast<G722DecInst*>(state_),
+ dec_state_,
const_cast<int16_t*>(reinterpret_cast<const int16_t*>(encoded)),
static_cast<int16_t>(encoded_len), decoded, &temp_type);
*speech_type = ConvertSpeechType(temp_type);
@@ -258,7 +255,7 @@ int AudioDecoderG722::Decode(const uint8_t* encoded, size_t encoded_len,
}
int AudioDecoderG722::Init() {
- return WebRtcG722_DecoderInit(static_cast<G722DecInst*>(state_));
+ return WebRtcG722_DecoderInit(dec_state_);
}
int AudioDecoderG722::PacketDuration(const uint8_t* encoded,
@@ -267,18 +264,15 @@ int AudioDecoderG722::PacketDuration(const uint8_t* encoded,
return static_cast<int>(2 * encoded_len / channels_);
}
-AudioDecoderG722Stereo::AudioDecoderG722Stereo()
- : AudioDecoderG722(),
- state_left_(state_), // Base member |state_| is used for left channel.
- state_right_(NULL) {
+AudioDecoderG722Stereo::AudioDecoderG722Stereo() {
channels_ = 2;
- // |state_left_| already created by the base class AudioDecoderG722.
- WebRtcG722_CreateDecoder(reinterpret_cast<G722DecInst**>(&state_right_));
+ WebRtcG722_CreateDecoder(&dec_state_left_);
+ WebRtcG722_CreateDecoder(&dec_state_right_);
}
AudioDecoderG722Stereo::~AudioDecoderG722Stereo() {
- // |state_left_| will be freed by the base class AudioDecoderG722.
- WebRtcG722_FreeDecoder(static_cast<G722DecInst*>(state_right_));
+ WebRtcG722_FreeDecoder(dec_state_left_);
+ WebRtcG722_FreeDecoder(dec_state_right_);
}
int AudioDecoderG722Stereo::Decode(const uint8_t* encoded, size_t encoded_len,
@@ -289,13 +283,13 @@ int AudioDecoderG722Stereo::Decode(const uint8_t* encoded, size_t encoded_len,
SplitStereoPacket(encoded, encoded_len, encoded_deinterleaved);
// Decode left and right.
int16_t ret = WebRtcG722_Decode(
- static_cast<G722DecInst*>(state_left_),
+ dec_state_left_,
reinterpret_cast<int16_t*>(encoded_deinterleaved),
static_cast<int16_t>(encoded_len / 2), decoded, &temp_type);
if (ret >= 0) {
int decoded_len = ret;
ret = WebRtcG722_Decode(
- static_cast<G722DecInst*>(state_right_),
+ dec_state_right_,
reinterpret_cast<int16_t*>(&encoded_deinterleaved[encoded_len / 2]),
static_cast<int16_t>(encoded_len / 2), &decoded[decoded_len], &temp_type);
if (ret == decoded_len) {
@@ -317,11 +311,10 @@ int AudioDecoderG722Stereo::Decode(const uint8_t* encoded, size_t encoded_len,
}
int AudioDecoderG722Stereo::Init() {
- int ret = WebRtcG722_DecoderInit(static_cast<G722DecInst*>(state_right_));
- if (ret != 0) {
- return ret;
- }
- return AudioDecoderG722::Init();
+ int r = WebRtcG722_DecoderInit(dec_state_left_);
+ if (r != 0)
+ return r;
+ return WebRtcG722_DecoderInit(dec_state_right_);
}
// Split the stereo packet and place left and right channel after each other
@@ -401,18 +394,17 @@ int AudioDecoderCelt::DecodePlc(int num_frames, int16_t* decoded) {
AudioDecoderOpus::AudioDecoderOpus(int num_channels) {
DCHECK(num_channels == 1 || num_channels == 2);
channels_ = num_channels;
- WebRtcOpus_DecoderCreate(reinterpret_cast<OpusDecInst**>(&state_),
- static_cast<int>(channels_));
+ WebRtcOpus_DecoderCreate(&dec_state_, static_cast<int>(channels_));
}
AudioDecoderOpus::~AudioDecoderOpus() {
- WebRtcOpus_DecoderFree(static_cast<OpusDecInst*>(state_));
+ WebRtcOpus_DecoderFree(dec_state_);
}
int AudioDecoderOpus::Decode(const uint8_t* encoded, size_t encoded_len,
int16_t* decoded, SpeechType* speech_type) {
int16_t temp_type = 1; // Default is speech.
- int16_t ret = WebRtcOpus_DecodeNew(static_cast<OpusDecInst*>(state_), encoded,
+ int16_t ret = WebRtcOpus_DecodeNew(dec_state_, encoded,
static_cast<int16_t>(encoded_len), decoded,
&temp_type);
if (ret > 0)
@@ -425,7 +417,7 @@ int AudioDecoderOpus::DecodeRedundant(const uint8_t* encoded,
size_t encoded_len, int16_t* decoded,
SpeechType* speech_type) {
int16_t temp_type = 1; // Default is speech.
- int16_t ret = WebRtcOpus_DecodeFec(static_cast<OpusDecInst*>(state_), encoded,
+ int16_t ret = WebRtcOpus_DecodeFec(dec_state_, encoded,
static_cast<int16_t>(encoded_len), decoded,
&temp_type);
if (ret > 0)
@@ -435,12 +427,12 @@ int AudioDecoderOpus::DecodeRedundant(const uint8_t* encoded,
}
int AudioDecoderOpus::Init() {
- return WebRtcOpus_DecoderInitNew(static_cast<OpusDecInst*>(state_));
+ return WebRtcOpus_DecoderInitNew(dec_state_);
}
int AudioDecoderOpus::PacketDuration(const uint8_t* encoded,
size_t encoded_len) {
- return WebRtcOpus_DurationEst(static_cast<OpusDecInst*>(state_),
+ return WebRtcOpus_DurationEst(dec_state_,
encoded, static_cast<int>(encoded_len));
}
@@ -458,19 +450,15 @@ bool AudioDecoderOpus::PacketHasFec(const uint8_t* encoded,
#endif
AudioDecoderCng::AudioDecoderCng() {
- WebRtcCng_CreateDec(reinterpret_cast<CNG_dec_inst**>(&state_));
- assert(state_);
+ CHECK_EQ(0, WebRtcCng_CreateDec(&dec_state_));
}
AudioDecoderCng::~AudioDecoderCng() {
- if (state_) {
- WebRtcCng_FreeDec(static_cast<CNG_dec_inst*>(state_));
- }
+ WebRtcCng_FreeDec(dec_state_);
}
int AudioDecoderCng::Init() {
- assert(state_);
- return WebRtcCng_InitDec(static_cast<CNG_dec_inst*>(state_));
+ return WebRtcCng_InitDec(dec_state_);
}
} // namespace webrtc
diff --git a/modules/audio_coding/neteq/audio_decoder_impl.h b/modules/audio_coding/neteq/audio_decoder_impl.h
index 214392e7..b30331f3 100644
--- a/modules/audio_coding/neteq/audio_decoder_impl.h
+++ b/modules/audio_coding/neteq/audio_decoder_impl.h
@@ -19,6 +19,22 @@
#include "webrtc/engine_configurations.h"
#endif
#include "webrtc/base/constructormagic.h"
+#include "webrtc/modules/audio_coding/codecs/cng/include/webrtc_cng.h"
+#ifdef WEBRTC_CODEC_G722
+#include "webrtc/modules/audio_coding/codecs/g722/include/g722_interface.h"
+#endif
+#ifdef WEBRTC_CODEC_ILBC
+#include "webrtc/modules/audio_coding/codecs/ilbc/interface/ilbc.h"
+#endif
+#ifdef WEBRTC_CODEC_ISACFX
+#include "webrtc/modules/audio_coding/codecs/isac/fix/interface/isacfix.h"
+#endif
+#ifdef WEBRTC_CODEC_ISAC
+#include "webrtc/modules/audio_coding/codecs/isac/main/interface/isac.h"
+#endif
+#ifdef WEBRTC_CODEC_OPUS
+#include "webrtc/modules/audio_coding/codecs/opus/interface/opus_interface.h"
+#endif
#include "webrtc/modules/audio_coding/neteq/interface/audio_decoder.h"
#include "webrtc/typedefs.h"
@@ -109,6 +125,7 @@ class AudioDecoderIlbc : public AudioDecoder {
virtual int Init();
private:
+ iLBC_decinst_t* dec_state_;
DISALLOW_COPY_AND_ASSIGN(AudioDecoderIlbc);
};
#endif
@@ -133,6 +150,7 @@ class AudioDecoderIsac : public AudioDecoder {
virtual int ErrorCode();
private:
+ ISACStruct* isac_state_;
DISALLOW_COPY_AND_ASSIGN(AudioDecoderIsac);
};
#endif
@@ -153,6 +171,7 @@ class AudioDecoderIsacFix : public AudioDecoder {
virtual int ErrorCode();
private:
+ ISACFIX_MainStruct* isac_state_;
DISALLOW_COPY_AND_ASSIGN(AudioDecoderIsacFix);
};
#endif
@@ -169,10 +188,11 @@ class AudioDecoderG722 : public AudioDecoder {
virtual int PacketDuration(const uint8_t* encoded, size_t encoded_len);
private:
+ G722DecInst* dec_state_;
DISALLOW_COPY_AND_ASSIGN(AudioDecoderG722);
};
-class AudioDecoderG722Stereo : public AudioDecoderG722 {
+class AudioDecoderG722Stereo : public AudioDecoder {
public:
AudioDecoderG722Stereo();
virtual ~AudioDecoderG722Stereo();
@@ -189,8 +209,8 @@ class AudioDecoderG722Stereo : public AudioDecoderG722 {
void SplitStereoPacket(const uint8_t* encoded, size_t encoded_len,
uint8_t* encoded_deinterleaved);
- void* const state_left_;
- void* state_right_;
+ G722DecInst* dec_state_left_;
+ G722DecInst* dec_state_right_;
DISALLOW_COPY_AND_ASSIGN(AudioDecoderG722Stereo);
};
@@ -229,6 +249,7 @@ class AudioDecoderOpus : public AudioDecoder {
virtual bool PacketHasFec(const uint8_t* encoded, size_t encoded_len) const;
private:
+ OpusDecInst* dec_state_;
DISALLOW_COPY_AND_ASSIGN(AudioDecoderOpus);
};
#endif
@@ -252,7 +273,10 @@ class AudioDecoderCng : public AudioDecoder {
uint32_t rtp_timestamp,
uint32_t arrival_timestamp) { return -1; }
+ virtual CNG_dec_inst* CngDecoderInstance() OVERRIDE { return dec_state_; }
+
private:
+ CNG_dec_inst* dec_state_;
DISALLOW_COPY_AND_ASSIGN(AudioDecoderCng);
};
diff --git a/modules/audio_coding/neteq/comfort_noise.cc b/modules/audio_coding/neteq/comfort_noise.cc
index 31bb40c9..e2be066e 100644
--- a/modules/audio_coding/neteq/comfort_noise.cc
+++ b/modules/audio_coding/neteq/comfort_noise.cc
@@ -36,7 +36,7 @@ int ComfortNoise::UpdateParameters(Packet* packet) {
return kUnknownPayloadType;
}
decoder_database_->SetActiveCngDecoder(packet->header.payloadType);
- CNG_dec_inst* cng_inst = static_cast<CNG_dec_inst*>(cng_decoder->state());
+ CNG_dec_inst* cng_inst = cng_decoder->CngDecoderInstance();
int16_t ret = WebRtcCng_UpdateSid(cng_inst,
packet->payload,
packet->payload_length);
@@ -72,7 +72,7 @@ int ComfortNoise::Generate(size_t requested_length,
if (!cng_decoder) {
return kUnknownPayloadType;
}
- CNG_dec_inst* cng_inst = static_cast<CNG_dec_inst*>(cng_decoder->state());
+ CNG_dec_inst* cng_inst = cng_decoder->CngDecoderInstance();
// The expression &(*output)[0][0] is a pointer to the first element in
// the first channel.
if (WebRtcCng_Generate(cng_inst, &(*output)[0][0],
diff --git a/modules/audio_coding/neteq/interface/audio_decoder.h b/modules/audio_coding/neteq/interface/audio_decoder.h
index 16d78c9e..be85c4dd 100644
--- a/modules/audio_coding/neteq/interface/audio_decoder.h
+++ b/modules/audio_coding/neteq/interface/audio_decoder.h
@@ -14,6 +14,7 @@
#include <stdlib.h> // NULL
#include "webrtc/base/constructormagic.h"
+#include "webrtc/modules/audio_coding/codecs/cng/include/webrtc_cng.h"
#include "webrtc/typedefs.h"
namespace webrtc {
@@ -63,7 +64,7 @@ class AudioDecoder {
// Used by PacketDuration below. Save the value -1 for errors.
enum { kNotImplemented = -2 };
- AudioDecoder() : channels_(1), state_(NULL) {}
+ AudioDecoder() : channels_(1) {}
virtual ~AudioDecoder() {}
// Decodes |encode_len| bytes from |encoded| and writes the result in
@@ -114,8 +115,9 @@ class AudioDecoder {
// Returns true if the packet has FEC and false otherwise.
virtual bool PacketHasFec(const uint8_t* encoded, size_t encoded_len) const;
- // Returns the underlying decoder state.
- void* state() { return state_; }
+ // If this is a CNG decoder, return the underlying CNG_dec_inst*. If this
+ // isn't a CNG decoder, don't call this method.
+ virtual CNG_dec_inst* CngDecoderInstance();
// Returns true if |codec_type| is supported.
static bool CodecSupported(NetEqDecoder codec_type);
@@ -134,7 +136,6 @@ class AudioDecoder {
static SpeechType ConvertSpeechType(int16_t type);
size_t channels_;
- void* state_;
private:
DISALLOW_COPY_AND_ASSIGN(AudioDecoder);
diff --git a/modules/audio_coding/neteq/normal.cc b/modules/audio_coding/neteq/normal.cc
index 46d03fb8..ca2c1ee5 100644
--- a/modules/audio_coding/neteq/normal.cc
+++ b/modules/audio_coding/neteq/normal.cc
@@ -147,9 +147,9 @@ int Normal::Process(const int16_t* input,
AudioDecoder* cng_decoder = decoder_database_->GetActiveCngDecoder();
if (cng_decoder) {
- CNG_dec_inst* cng_inst = static_cast<CNG_dec_inst*>(cng_decoder->state());
// Generate long enough for 32kHz.
- if (WebRtcCng_Generate(cng_inst, cng_output, kCngLength, 0) < 0) {
+ if (WebRtcCng_Generate(cng_decoder->CngDecoderInstance(), cng_output,
+ kCngLength, 0) < 0) {
// Error returned; set return vector to all zeros.
memset(cng_output, 0, sizeof(cng_output));
}
diff --git a/modules/audio_device/android/opensles_input.cc b/modules/audio_device/android/opensles_input.cc
index f22d8bf7..e68a6aa2 100644
--- a/modules/audio_device/android/opensles_input.cc
+++ b/modules/audio_device/android/opensles_input.cc
@@ -360,6 +360,24 @@ bool OpenSlesInput::CreateAudioRecorder() {
req),
false);
+ SLAndroidConfigurationItf recorder_config;
+ OPENSL_RETURN_ON_FAILURE(
+ (*sles_recorder_)->GetInterface(sles_recorder_,
+ SL_IID_ANDROIDCONFIGURATION,
+ &recorder_config),
+ false);
+
+ // Set audio recorder configuration to
+ // SL_ANDROID_RECORDING_PRESET_VOICE_COMMUNICATION which ensures that we
+ // use the main microphone tuned for audio communications.
+ SLint32 stream_type = SL_ANDROID_RECORDING_PRESET_VOICE_COMMUNICATION;
+ OPENSL_RETURN_ON_FAILURE(
+ (*recorder_config)->SetConfiguration(recorder_config,
+ SL_ANDROID_KEY_RECORDING_PRESET,
+ &stream_type,
+ sizeof(SLint32)),
+ false);
+
// Realize the recorder in synchronous mode.
OPENSL_RETURN_ON_FAILURE((*sles_recorder_)->Realize(sles_recorder_,
SL_BOOLEAN_FALSE),
diff --git a/modules/audio_device/android/opensles_output.cc b/modules/audio_device/android/opensles_output.cc
index 377789b2..487e2840 100644
--- a/modules/audio_device/android/opensles_output.cc
+++ b/modules/audio_device/android/opensles_output.cc
@@ -407,6 +407,24 @@ bool OpenSlesOutput::CreateAudioPlayer() {
&audio_source, &audio_sink,
kNumInterfaces, ids, req),
false);
+
+ SLAndroidConfigurationItf player_config;
+ OPENSL_RETURN_ON_FAILURE(
+ (*sles_player_)->GetInterface(sles_player_,
+ SL_IID_ANDROIDCONFIGURATION,
+ &player_config),
+ false);
+
+ // Set audio player configuration to SL_ANDROID_STREAM_VOICE which corresponds
+ // to android.media.AudioManager.STREAM_VOICE_CALL.
+ SLint32 stream_type = SL_ANDROID_STREAM_VOICE;
+ OPENSL_RETURN_ON_FAILURE(
+ (*player_config)->SetConfiguration(player_config,
+ SL_ANDROID_KEY_STREAM_TYPE,
+ &stream_type,
+ sizeof(SLint32)),
+ false);
+
// Realize the player in synchronous mode.
OPENSL_RETURN_ON_FAILURE((*sles_player_)->Realize(sles_player_,
SL_BOOLEAN_FALSE),
diff --git a/modules/bitrate_controller/send_side_bandwidth_estimation.cc b/modules/bitrate_controller/send_side_bandwidth_estimation.cc
index 47a79ad2..9b55dad7 100644
--- a/modules/bitrate_controller/send_side_bandwidth_estimation.cc
+++ b/modules/bitrate_controller/send_side_bandwidth_estimation.cc
@@ -22,6 +22,7 @@ enum { kBweDecreaseIntervalMs = 300 };
enum { kLimitNumPackets = 20 };
enum { kAvgPacketSizeBytes = 1000 };
enum { kStartPhaseMs = 2000 };
+enum { kBweConverganceTimeMs = 20000 };
// Calculate the rate that TCP-Friendly Rate Control (TFRC) would apply.
// The formula in RFC 3448, Section 3.1, is used.
@@ -61,7 +62,8 @@ SendSideBandwidthEstimation::SendSideBandwidthEstimation()
time_last_decrease_ms_(0),
first_report_time_ms_(-1),
initially_lost_packets_(0),
- uma_updated_(false) {
+ bitrate_at_2_seconds_kbps_(0),
+ uma_update_state_(kNoUpdate) {
}
SendSideBandwidthEstimation::~SendSideBandwidthEstimation() {}
@@ -130,18 +132,35 @@ void SendSideBandwidthEstimation::UpdateReceiverBlock(uint8_t fraction_loss,
if (first_report_time_ms_ == -1) {
first_report_time_ms_ = now_ms;
- } else if (IsInStartPhase(now_ms)) {
- initially_lost_packets_ += (fraction_loss * number_of_packets) >> 8;
- } else if (!uma_updated_) {
- uma_updated_ = true;
+ } else {
+ UpdateUmaStats(now_ms, rtt, (fraction_loss * number_of_packets) >> 8);
+ }
+}
+
+void SendSideBandwidthEstimation::UpdateUmaStats(int64_t now_ms,
+ int rtt,
+ int lost_packets) {
+ if (IsInStartPhase(now_ms)) {
+ initially_lost_packets_ += lost_packets;
+ } else if (uma_update_state_ == kNoUpdate) {
+ uma_update_state_ = kFirstDone;
+ bitrate_at_2_seconds_kbps_ = (bitrate_ + 500) / 1000;
RTC_HISTOGRAM_COUNTS(
"WebRTC.BWE.InitiallyLostPackets", initially_lost_packets_, 0, 100, 50);
RTC_HISTOGRAM_COUNTS("WebRTC.BWE.InitialRtt", rtt, 0, 2000, 50);
RTC_HISTOGRAM_COUNTS("WebRTC.BWE.InitialBandwidthEstimate",
- (bitrate_ + 500) / 1000,
+ bitrate_at_2_seconds_kbps_,
0,
2000,
50);
+ } else if (uma_update_state_ == kFirstDone &&
+ now_ms - first_report_time_ms_ >= kBweConverganceTimeMs) {
+ uma_update_state_ = kDone;
+ int bitrate_diff_kbps = std::max(
+ bitrate_at_2_seconds_kbps_ - static_cast<int>((bitrate_ + 500) / 1000),
+ 0);
+ RTC_HISTOGRAM_COUNTS(
+ "WebRTC.BWE.InitialVsConvergedDiff", bitrate_diff_kbps, 0, 2000, 50);
}
}
diff --git a/modules/bitrate_controller/send_side_bandwidth_estimation.h b/modules/bitrate_controller/send_side_bandwidth_estimation.h
index 0fe3ae67..3361904b 100644
--- a/modules/bitrate_controller/send_side_bandwidth_estimation.h
+++ b/modules/bitrate_controller/send_side_bandwidth_estimation.h
@@ -43,8 +43,12 @@ class SendSideBandwidthEstimation {
void SetMinBitrate(uint32_t min_bitrate);
private:
+ enum UmaState { kNoUpdate, kFirstDone, kDone };
+
bool IsInStartPhase(int64_t now_ms) const;
+ void UpdateUmaStats(int64_t now_ms, int rtt, int lost_packets);
+
// Returns the input bitrate capped to the thresholds defined by the max,
// min and incoming bandwidth.
uint32_t CapBitrateToThresholds(uint32_t bitrate);
@@ -72,7 +76,8 @@ class SendSideBandwidthEstimation {
uint32_t time_last_decrease_ms_;
int64_t first_report_time_ms_;
int initially_lost_packets_;
- bool uma_updated_;
+ int bitrate_at_2_seconds_kbps_;
+ UmaState uma_update_state_;
};
} // namespace webrtc
#endif // WEBRTC_MODULES_BITRATE_CONTROLLER_SEND_SIDE_BANDWIDTH_ESTIMATION_H_
diff --git a/modules/pacing/bitrate_prober.cc b/modules/pacing/bitrate_prober.cc
index 04e71c5c..51c87fb2 100644
--- a/modules/pacing/bitrate_prober.cc
+++ b/modules/pacing/bitrate_prober.cc
@@ -55,16 +55,18 @@ void BitrateProber::MaybeInitializeProbe(int bitrate_bps) {
return;
probe_bitrates_.clear();
// Max number of packets used for probing.
- const int kMaxProbeLength = 15;
- const int kMaxNumProbes = 3;
- const int kPacketsPerProbe = kMaxProbeLength / kMaxNumProbes;
- const float kProbeBitrateMultipliers[kMaxNumProbes] = {2.5, 4, 6};
+ const int kMaxNumProbes = 2;
+ const int kPacketsPerProbe = 5;
+ const float kProbeBitrateMultipliers[kMaxNumProbes] = {3, 6};
int bitrates_bps[kMaxNumProbes];
std::stringstream bitrate_log;
bitrate_log << "Start probing for bandwidth, bitrates:";
for (int i = 0; i < kMaxNumProbes; ++i) {
bitrates_bps[i] = kProbeBitrateMultipliers[i] * bitrate_bps;
bitrate_log << " " << bitrates_bps[i];
+ // We need one extra to get 5 deltas for the first probe.
+ if (i == 0)
+ probe_bitrates_.push_back(bitrates_bps[i]);
for (int j = 0; j < kPacketsPerProbe; ++j)
probe_bitrates_.push_back(bitrates_bps[i]);
}
diff --git a/modules/pacing/bitrate_prober_unittest.cc b/modules/pacing/bitrate_prober_unittest.cc
index 15b1cc58..fac6a721 100644
--- a/modules/pacing/bitrate_prober_unittest.cc
+++ b/modules/pacing/bitrate_prober_unittest.cc
@@ -30,17 +30,11 @@ TEST(BitrateProberTest, VerifyStatesAndTimeBetweenProbes) {
EXPECT_EQ(0, prober.TimeUntilNextProbe(now_ms));
prober.PacketSent(now_ms, 1000);
- for (int i = 0; i < 4; ++i) {
- EXPECT_EQ(10, prober.TimeUntilNextProbe(now_ms));
- now_ms += 5;
- EXPECT_EQ(5, prober.TimeUntilNextProbe(now_ms));
- now_ms += 5;
- EXPECT_EQ(0, prober.TimeUntilNextProbe(now_ms));
- prober.PacketSent(now_ms, 1000);
- }
for (int i = 0; i < 5; ++i) {
- EXPECT_EQ(6, prober.TimeUntilNextProbe(now_ms));
- now_ms += 6;
+ EXPECT_EQ(8, prober.TimeUntilNextProbe(now_ms));
+ now_ms += 4;
+ EXPECT_EQ(4, prober.TimeUntilNextProbe(now_ms));
+ now_ms += 4;
EXPECT_EQ(0, prober.TimeUntilNextProbe(now_ms));
prober.PacketSent(now_ms, 1000);
}
diff --git a/modules/pacing/paced_sender_unittest.cc b/modules/pacing/paced_sender_unittest.cc
index 34787d16..fe16008c 100644
--- a/modules/pacing/paced_sender_unittest.cc
+++ b/modules/pacing/paced_sender_unittest.cc
@@ -711,13 +711,14 @@ class ProbingPacedSender : public PacedSender {
};
TEST_F(PacedSenderTest, ProbingWithInitialFrame) {
- const int kNumPackets = 15;
+ const int kNumPackets = 11;
+ const int kNumDeltas = kNumPackets - 1;
const int kPacketSize = 1200;
const int kInitialBitrateKbps = 300;
uint32_t ssrc = 12346;
uint16_t sequence_number = 1234;
- const int expected_deltas[kNumPackets - 1] = {
- 12, 12, 12, 12, 8, 8, 8, 8, 8, 5, 5, 5, 5, 5};
+ const int expected_deltas[kNumDeltas] = {
+ 10, 10, 10, 10, 10, 5, 5, 5, 5, 5};
std::list<int> expected_deltas_list(expected_deltas,
expected_deltas + kNumPackets - 1);
PacedSenderProbing callback(expected_deltas_list, &clock_);
diff --git a/modules/rtp_rtcp/source/rtp_format.h b/modules/rtp_rtcp/source/rtp_format.h
index faef7a0b..18225f9b 100644
--- a/modules/rtp_rtcp/source/rtp_format.h
+++ b/modules/rtp_rtcp/source/rtp_format.h
@@ -53,12 +53,10 @@ class RtpPacketizer {
class RtpDepacketizer {
public:
struct ParsedPayload {
- explicit ParsedPayload(WebRtcRTPHeader* rtp_header)
- : payload(NULL), payload_length(0), header(rtp_header) {}
-
const uint8_t* payload;
size_t payload_length;
- WebRtcRTPHeader* header;
+ FrameType frame_type;
+ RTPTypeHeader type;
};
static RtpDepacketizer* Create(RtpVideoCodecTypes type);
diff --git a/modules/rtp_rtcp/source/rtp_format_h264.cc b/modules/rtp_rtcp/source/rtp_format_h264.cc
index b6af1ada..0d20b301 100644
--- a/modules/rtp_rtcp/source/rtp_format_h264.cc
+++ b/modules/rtp_rtcp/source/rtp_format_h264.cc
@@ -37,12 +37,15 @@ enum NalDefs { kFBit = 0x80, kNriMask = 0x60, kTypeMask = 0x1F };
// Bit masks for FU (A and B) headers.
enum FuDefs { kSBit = 0x80, kEBit = 0x40, kRBit = 0x20 };
-void ParseSingleNalu(WebRtcRTPHeader* rtp_header,
+void ParseSingleNalu(RtpDepacketizer::ParsedPayload* parsed_payload,
const uint8_t* payload_data,
size_t payload_data_length) {
- rtp_header->type.Video.codec = kRtpVideoH264;
- rtp_header->type.Video.isFirstPacket = true;
- RTPVideoHeaderH264* h264_header = &rtp_header->type.Video.codecHeader.H264;
+ parsed_payload->type.Video.width = 0;
+ parsed_payload->type.Video.height = 0;
+ parsed_payload->type.Video.codec = kRtpVideoH264;
+ parsed_payload->type.Video.isFirstPacket = true;
+ RTPVideoHeaderH264* h264_header =
+ &parsed_payload->type.Video.codecHeader.H264;
h264_header->single_nalu = true;
h264_header->stap_a = false;
@@ -56,15 +59,15 @@ void ParseSingleNalu(WebRtcRTPHeader* rtp_header,
case kSps:
case kPps:
case kIdr:
- rtp_header->frameType = kVideoFrameKey;
+ parsed_payload->frame_type = kVideoFrameKey;
break;
default:
- rtp_header->frameType = kVideoFrameDelta;
+ parsed_payload->frame_type = kVideoFrameDelta;
break;
}
}
-void ParseFuaNalu(WebRtcRTPHeader* rtp_header,
+void ParseFuaNalu(RtpDepacketizer::ParsedPayload* parsed_payload,
const uint8_t* payload_data,
size_t payload_data_length,
size_t* offset) {
@@ -82,13 +85,16 @@ void ParseFuaNalu(WebRtcRTPHeader* rtp_header,
}
if (original_nal_type == kIdr) {
- rtp_header->frameType = kVideoFrameKey;
+ parsed_payload->frame_type = kVideoFrameKey;
} else {
- rtp_header->frameType = kVideoFrameDelta;
+ parsed_payload->frame_type = kVideoFrameDelta;
}
- rtp_header->type.Video.codec = kRtpVideoH264;
- rtp_header->type.Video.isFirstPacket = first_fragment;
- RTPVideoHeaderH264* h264_header = &rtp_header->type.Video.codecHeader.H264;
+ parsed_payload->type.Video.width = 0;
+ parsed_payload->type.Video.height = 0;
+ parsed_payload->type.Video.codec = kRtpVideoH264;
+ parsed_payload->type.Video.isFirstPacket = first_fragment;
+ RTPVideoHeaderH264* h264_header =
+ &parsed_payload->type.Video.codecHeader.H264;
h264_header->single_nalu = false;
h264_header->stap_a = false;
}
@@ -298,12 +304,11 @@ bool RtpDepacketizerH264::Parse(ParsedPayload* parsed_payload,
size_t offset = 0;
if (nal_type == kFuA) {
// Fragmented NAL units (FU-A).
- ParseFuaNalu(
- parsed_payload->header, payload_data, payload_data_length, &offset);
+ ParseFuaNalu(parsed_payload, payload_data, payload_data_length, &offset);
} else {
// We handle STAP-A and single NALU's the same way here. The jitter buffer
// will depacketize the STAP-A into NAL units later.
- ParseSingleNalu(parsed_payload->header, payload_data, payload_data_length);
+ ParseSingleNalu(parsed_payload, payload_data, payload_data_length);
}
parsed_payload->payload = payload_data + offset;
diff --git a/modules/rtp_rtcp/source/rtp_format_h264_unittest.cc b/modules/rtp_rtcp/source/rtp_format_h264_unittest.cc
index fb29b5a6..eb690ea8 100644
--- a/modules/rtp_rtcp/source/rtp_format_h264_unittest.cc
+++ b/modules/rtp_rtcp/source/rtp_format_h264_unittest.cc
@@ -399,17 +399,15 @@ class RtpDepacketizerH264Test : public ::testing::Test {
TEST_F(RtpDepacketizerH264Test, TestSingleNalu) {
uint8_t packet[2] = {0x05, 0xFF}; // F=0, NRI=0, Type=5.
-
- WebRtcRTPHeader expected_header;
- memset(&expected_header, 0, sizeof(expected_header));
- RtpDepacketizer::ParsedPayload payload(&expected_header);
+ RtpDepacketizer::ParsedPayload payload;
ASSERT_TRUE(depacketizer_->Parse(&payload, packet, sizeof(packet)));
ExpectPacket(&payload, packet, sizeof(packet));
- EXPECT_EQ(kVideoFrameKey, payload.header->frameType);
- EXPECT_TRUE(payload.header->type.Video.isFirstPacket);
- EXPECT_TRUE(payload.header->type.Video.codecHeader.H264.single_nalu);
- EXPECT_FALSE(payload.header->type.Video.codecHeader.H264.stap_a);
+ EXPECT_EQ(kVideoFrameKey, payload.frame_type);
+ EXPECT_EQ(kRtpVideoH264, payload.type.Video.codec);
+ EXPECT_TRUE(payload.type.Video.isFirstPacket);
+ EXPECT_TRUE(payload.type.Video.codecHeader.H264.single_nalu);
+ EXPECT_FALSE(payload.type.Video.codecHeader.H264.stap_a);
}
TEST_F(RtpDepacketizerH264Test, TestStapAKey) {
@@ -417,17 +415,15 @@ TEST_F(RtpDepacketizerH264Test, TestStapAKey) {
// Length, nal header, payload.
0, 0x02, kIdr, 0xFF, 0, 0x03, kIdr, 0xFF,
0x00, 0, 0x04, kIdr, 0xFF, 0x00, 0x11};
-
- WebRtcRTPHeader expected_header;
- memset(&expected_header, 0, sizeof(expected_header));
- RtpDepacketizer::ParsedPayload payload(&expected_header);
+ RtpDepacketizer::ParsedPayload payload;
ASSERT_TRUE(depacketizer_->Parse(&payload, packet, sizeof(packet)));
ExpectPacket(&payload, packet, sizeof(packet));
- EXPECT_EQ(kVideoFrameKey, payload.header->frameType);
- EXPECT_TRUE(payload.header->type.Video.isFirstPacket);
- EXPECT_TRUE(payload.header->type.Video.codecHeader.H264.single_nalu);
- EXPECT_TRUE(payload.header->type.Video.codecHeader.H264.stap_a);
+ EXPECT_EQ(kVideoFrameKey, payload.frame_type);
+ EXPECT_EQ(kRtpVideoH264, payload.type.Video.codec);
+ EXPECT_TRUE(payload.type.Video.isFirstPacket);
+ EXPECT_TRUE(payload.type.Video.codecHeader.H264.single_nalu);
+ EXPECT_TRUE(payload.type.Video.codecHeader.H264.stap_a);
}
TEST_F(RtpDepacketizerH264Test, TestStapADelta) {
@@ -435,17 +431,15 @@ TEST_F(RtpDepacketizerH264Test, TestStapADelta) {
// Length, nal header, payload.
0, 0x02, kSlice, 0xFF, 0, 0x03, kSlice, 0xFF,
0x00, 0, 0x04, kSlice, 0xFF, 0x00, 0x11};
-
- WebRtcRTPHeader expected_header;
- memset(&expected_header, 0, sizeof(expected_header));
- RtpDepacketizer::ParsedPayload payload(&expected_header);
+ RtpDepacketizer::ParsedPayload payload;
ASSERT_TRUE(depacketizer_->Parse(&payload, packet, sizeof(packet)));
ExpectPacket(&payload, packet, sizeof(packet));
- EXPECT_EQ(kVideoFrameDelta, payload.header->frameType);
- EXPECT_TRUE(payload.header->type.Video.isFirstPacket);
- EXPECT_TRUE(payload.header->type.Video.codecHeader.H264.single_nalu);
- EXPECT_TRUE(payload.header->type.Video.codecHeader.H264.stap_a);
+ EXPECT_EQ(kVideoFrameDelta, payload.frame_type);
+ EXPECT_EQ(kRtpVideoH264, payload.type.Video.codec);
+ EXPECT_TRUE(payload.type.Video.isFirstPacket);
+ EXPECT_TRUE(payload.type.Video.codecHeader.H264.single_nalu);
+ EXPECT_TRUE(payload.type.Video.codecHeader.H264.stap_a);
}
TEST_F(RtpDepacketizerH264Test, TestFuA) {
@@ -470,33 +464,36 @@ TEST_F(RtpDepacketizerH264Test, TestFuA) {
};
const uint8_t kExpected3[1] = {0x03};
- WebRtcRTPHeader expected_header;
- memset(&expected_header, 0, sizeof(expected_header));
- RtpDepacketizer::ParsedPayload payload(&expected_header);
+ RtpDepacketizer::ParsedPayload payload;
// We expect that the first packet is one byte shorter since the FU-A header
// has been replaced by the original nal header.
ASSERT_TRUE(depacketizer_->Parse(&payload, packet1, sizeof(packet1)));
ExpectPacket(&payload, kExpected1, sizeof(kExpected1));
- EXPECT_EQ(kVideoFrameKey, payload.header->frameType);
- EXPECT_TRUE(payload.header->type.Video.isFirstPacket);
- EXPECT_FALSE(payload.header->type.Video.codecHeader.H264.single_nalu);
- EXPECT_FALSE(payload.header->type.Video.codecHeader.H264.stap_a);
+ EXPECT_EQ(kVideoFrameKey, payload.frame_type);
+ EXPECT_EQ(kRtpVideoH264, payload.type.Video.codec);
+ EXPECT_TRUE(payload.type.Video.isFirstPacket);
+ EXPECT_FALSE(payload.type.Video.codecHeader.H264.single_nalu);
+ EXPECT_FALSE(payload.type.Video.codecHeader.H264.stap_a);
// Following packets will be 2 bytes shorter since they will only be appended
// onto the first packet.
+ payload = RtpDepacketizer::ParsedPayload();
ASSERT_TRUE(depacketizer_->Parse(&payload, packet2, sizeof(packet2)));
ExpectPacket(&payload, kExpected2, sizeof(kExpected2));
- EXPECT_EQ(kVideoFrameKey, payload.header->frameType);
- EXPECT_FALSE(payload.header->type.Video.isFirstPacket);
- EXPECT_FALSE(payload.header->type.Video.codecHeader.H264.single_nalu);
- EXPECT_FALSE(payload.header->type.Video.codecHeader.H264.stap_a);
+ EXPECT_EQ(kVideoFrameKey, payload.frame_type);
+ EXPECT_EQ(kRtpVideoH264, payload.type.Video.codec);
+ EXPECT_FALSE(payload.type.Video.isFirstPacket);
+ EXPECT_FALSE(payload.type.Video.codecHeader.H264.single_nalu);
+ EXPECT_FALSE(payload.type.Video.codecHeader.H264.stap_a);
+ payload = RtpDepacketizer::ParsedPayload();
ASSERT_TRUE(depacketizer_->Parse(&payload, packet3, sizeof(packet3)));
ExpectPacket(&payload, kExpected3, sizeof(kExpected3));
- EXPECT_EQ(kVideoFrameKey, payload.header->frameType);
- EXPECT_FALSE(payload.header->type.Video.isFirstPacket);
- EXPECT_FALSE(payload.header->type.Video.codecHeader.H264.single_nalu);
- EXPECT_FALSE(payload.header->type.Video.codecHeader.H264.stap_a);
+ EXPECT_EQ(kVideoFrameKey, payload.frame_type);
+ EXPECT_EQ(kRtpVideoH264, payload.type.Video.codec);
+ EXPECT_FALSE(payload.type.Video.isFirstPacket);
+ EXPECT_FALSE(payload.type.Video.codecHeader.H264.single_nalu);
+ EXPECT_FALSE(payload.type.Video.codecHeader.H264.stap_a);
}
} // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtp_format_video_generic.cc b/modules/rtp_rtcp/source/rtp_format_video_generic.cc
index 4907846f..ab210ecb 100644
--- a/modules/rtp_rtcp/source/rtp_format_video_generic.cc
+++ b/modules/rtp_rtcp/source/rtp_format_video_generic.cc
@@ -90,17 +90,19 @@ bool RtpDepacketizerGeneric::Parse(ParsedPayload* parsed_payload,
const uint8_t* payload_data,
size_t payload_data_length) {
assert(parsed_payload != NULL);
- assert(parsed_payload->header != NULL);
uint8_t generic_header = *payload_data++;
--payload_data_length;
- parsed_payload->header->frameType =
+ parsed_payload->frame_type =
((generic_header & RtpFormatVideoGeneric::kKeyFrameBit) != 0)
? kVideoFrameKey
: kVideoFrameDelta;
- parsed_payload->header->type.Video.isFirstPacket =
+ parsed_payload->type.Video.isFirstPacket =
(generic_header & RtpFormatVideoGeneric::kFirstPacketBit) != 0;
+ parsed_payload->type.Video.codec = kRtpVideoGeneric;
+ parsed_payload->type.Video.width = 0;
+ parsed_payload->type.Video.height = 0;
parsed_payload->payload = payload_data;
parsed_payload->payload_length = payload_data_length;
diff --git a/modules/rtp_rtcp/source/rtp_format_vp8.cc b/modules/rtp_rtcp/source/rtp_format_vp8.cc
index 86bdd8bd..d74e04f8 100644
--- a/modules/rtp_rtcp/source/rtp_format_vp8.cc
+++ b/modules/rtp_rtcp/source/rtp_format_vp8.cc
@@ -121,11 +121,11 @@ int ParseVP8Extension(RTPVideoHeaderVP8* vp8,
return parsed_bytes;
}
-int ParseVP8FrameSize(WebRtcRTPHeader* rtp_header,
+int ParseVP8FrameSize(RtpDepacketizer::ParsedPayload* parsed_payload,
const uint8_t* data,
int data_length) {
- assert(rtp_header != NULL);
- if (rtp_header->frameType != kVideoFrameKey) {
+ assert(parsed_payload != NULL);
+ if (parsed_payload->frame_type != kVideoFrameKey) {
// Included in payload header for I-frames.
return 0;
}
@@ -134,8 +134,8 @@ int ParseVP8FrameSize(WebRtcRTPHeader* rtp_header,
// in the beginning of the partition.
return -1;
}
- rtp_header->type.Video.width = ((data[7] << 8) + data[6]) & 0x3FFF;
- rtp_header->type.Video.height = ((data[9] << 8) + data[8]) & 0x3FFF;
+ parsed_payload->type.Video.width = ((data[7] << 8) + data[6]) & 0x3FFF;
+ parsed_payload->type.Video.height = ((data[9] << 8) + data[8]) & 0x3FFF;
return 0;
}
} // namespace
@@ -664,27 +664,27 @@ bool RtpDepacketizerVp8::Parse(ParsedPayload* parsed_payload,
const uint8_t* payload_data,
size_t payload_data_length) {
assert(parsed_payload != NULL);
- assert(parsed_payload->header != NULL);
// Parse mandatory first byte of payload descriptor.
bool extension = (*payload_data & 0x80) ? true : false; // X bit
bool beginning_of_partition = (*payload_data & 0x10) ? true : false; // S bit
int partition_id = (*payload_data & 0x0F); // PartID field
- parsed_payload->header->type.Video.isFirstPacket =
+ parsed_payload->type.Video.width = 0;
+ parsed_payload->type.Video.height = 0;
+ parsed_payload->type.Video.isFirstPacket =
beginning_of_partition && (partition_id == 0);
-
- parsed_payload->header->type.Video.codecHeader.VP8.nonReference =
+ parsed_payload->type.Video.codec = kRtpVideoVp8;
+ parsed_payload->type.Video.codecHeader.VP8.nonReference =
(*payload_data & 0x20) ? true : false; // N bit
- parsed_payload->header->type.Video.codecHeader.VP8.partitionId = partition_id;
- parsed_payload->header->type.Video.codecHeader.VP8.beginningOfPartition =
+ parsed_payload->type.Video.codecHeader.VP8.partitionId = partition_id;
+ parsed_payload->type.Video.codecHeader.VP8.beginningOfPartition =
beginning_of_partition;
- parsed_payload->header->type.Video.codecHeader.VP8.pictureId = kNoPictureId;
- parsed_payload->header->type.Video.codecHeader.VP8.tl0PicIdx = kNoTl0PicIdx;
- parsed_payload->header->type.Video.codecHeader.VP8.temporalIdx =
- kNoTemporalIdx;
- parsed_payload->header->type.Video.codecHeader.VP8.layerSync = false;
- parsed_payload->header->type.Video.codecHeader.VP8.keyIdx = kNoKeyIdx;
+ parsed_payload->type.Video.codecHeader.VP8.pictureId = kNoPictureId;
+ parsed_payload->type.Video.codecHeader.VP8.tl0PicIdx = kNoTl0PicIdx;
+ parsed_payload->type.Video.codecHeader.VP8.temporalIdx = kNoTemporalIdx;
+ parsed_payload->type.Video.codecHeader.VP8.layerSync = false;
+ parsed_payload->type.Video.codecHeader.VP8.keyIdx = kNoKeyIdx;
if (partition_id > 8) {
// Weak check for corrupt payload_data: PartID MUST NOT be larger than 8.
@@ -697,7 +697,7 @@ bool RtpDepacketizerVp8::Parse(ParsedPayload* parsed_payload,
if (extension) {
const int parsed_bytes =
- ParseVP8Extension(&parsed_payload->header->type.Video.codecHeader.VP8,
+ ParseVP8Extension(&parsed_payload->type.Video.codecHeader.VP8,
payload_data,
payload_data_length);
if (parsed_bytes < 0)
@@ -713,14 +713,14 @@ bool RtpDepacketizerVp8::Parse(ParsedPayload* parsed_payload,
// Read P bit from payload header (only at beginning of first partition).
if (payload_data_length > 0 && beginning_of_partition && partition_id == 0) {
- parsed_payload->header->frameType =
+ parsed_payload->frame_type =
(*payload_data & 0x01) ? kVideoFrameDelta : kVideoFrameKey;
} else {
- parsed_payload->header->frameType = kVideoFrameDelta;
+ parsed_payload->frame_type = kVideoFrameDelta;
}
- if (0 != ParseVP8FrameSize(
- parsed_payload->header, payload_data, payload_data_length)) {
+ if (ParseVP8FrameSize(parsed_payload, payload_data, payload_data_length) !=
+ 0) {
return false;
}
diff --git a/modules/rtp_rtcp/source/rtp_format_vp8_unittest.cc b/modules/rtp_rtcp/source/rtp_format_vp8_unittest.cc
index b13f8793..4382ac2c 100644
--- a/modules/rtp_rtcp/source/rtp_format_vp8_unittest.cc
+++ b/modules/rtp_rtcp/source/rtp_format_vp8_unittest.cc
@@ -56,24 +56,23 @@ namespace {
// | padding |
// : :
// +-+-+-+-+-+-+-+-+
-
-void VerifyBasicHeader(WebRtcRTPHeader* header, bool N, bool S, int part_id) {
- ASSERT_TRUE(header != NULL);
- EXPECT_EQ(N, header->type.Video.codecHeader.VP8.nonReference);
- EXPECT_EQ(S, header->type.Video.codecHeader.VP8.beginningOfPartition);
- EXPECT_EQ(part_id, header->type.Video.codecHeader.VP8.partitionId);
+void VerifyBasicHeader(RTPTypeHeader* type, bool N, bool S, int part_id) {
+ ASSERT_TRUE(type != NULL);
+ EXPECT_EQ(N, type->Video.codecHeader.VP8.nonReference);
+ EXPECT_EQ(S, type->Video.codecHeader.VP8.beginningOfPartition);
+ EXPECT_EQ(part_id, type->Video.codecHeader.VP8.partitionId);
}
-void VerifyExtensions(WebRtcRTPHeader* header,
+void VerifyExtensions(RTPTypeHeader* type,
int16_t picture_id, /* I */
int16_t tl0_pic_idx, /* L */
uint8_t temporal_idx, /* T */
int key_idx /* K */) {
- ASSERT_TRUE(header != NULL);
- EXPECT_EQ(picture_id, header->type.Video.codecHeader.VP8.pictureId);
- EXPECT_EQ(tl0_pic_idx, header->type.Video.codecHeader.VP8.tl0PicIdx);
- EXPECT_EQ(temporal_idx, header->type.Video.codecHeader.VP8.temporalIdx);
- EXPECT_EQ(key_idx, header->type.Video.codecHeader.VP8.keyIdx);
+ ASSERT_TRUE(type != NULL);
+ EXPECT_EQ(picture_id, type->Video.codecHeader.VP8.pictureId);
+ EXPECT_EQ(tl0_pic_idx, type->Video.codecHeader.VP8.tl0PicIdx);
+ EXPECT_EQ(temporal_idx, type->Video.codecHeader.VP8.temporalIdx);
+ EXPECT_EQ(key_idx, type->Video.codecHeader.VP8.keyIdx);
}
} // namespace
@@ -405,18 +404,16 @@ TEST_F(RtpDepacketizerVp8Test, BasicHeader) {
uint8_t packet[4] = {0};
packet[0] = 0x14; // Binary 0001 0100; S = 1, PartID = 4.
packet[1] = 0x01; // P frame.
-
- WebRtcRTPHeader rtp_header;
- memset(&rtp_header, 0, sizeof(rtp_header));
- RtpDepacketizer::ParsedPayload payload(&rtp_header);
+ RtpDepacketizer::ParsedPayload payload;
ASSERT_TRUE(depacketizer_->Parse(&payload, packet, sizeof(packet)));
ExpectPacket(
&payload, packet + kHeaderLength, sizeof(packet) - kHeaderLength);
- EXPECT_EQ(kVideoFrameDelta, payload.header->frameType);
- VerifyBasicHeader(payload.header, 0, 1, 4);
+ EXPECT_EQ(kVideoFrameDelta, payload.frame_type);
+ EXPECT_EQ(kRtpVideoVp8, payload.type.Video.codec);
+ VerifyBasicHeader(&payload.type, 0, 1, 4);
VerifyExtensions(
- payload.header, kNoPictureId, kNoTl0PicIdx, kNoTemporalIdx, kNoKeyIdx);
+ &payload.type, kNoPictureId, kNoTl0PicIdx, kNoTemporalIdx, kNoKeyIdx);
}
TEST_F(RtpDepacketizerVp8Test, PictureID) {
@@ -427,29 +424,27 @@ TEST_F(RtpDepacketizerVp8Test, PictureID) {
packet[0] = 0xA0;
packet[1] = 0x80;
packet[2] = kPictureId;
-
- WebRtcRTPHeader rtp_header;
- memset(&rtp_header, 0, sizeof(rtp_header));
- RtpDepacketizer::ParsedPayload payload(&rtp_header);
+ RtpDepacketizer::ParsedPayload payload;
ASSERT_TRUE(depacketizer_->Parse(&payload, packet, sizeof(packet)));
ExpectPacket(
&payload, packet + kHeaderLength1, sizeof(packet) - kHeaderLength1);
- EXPECT_EQ(kVideoFrameDelta, payload.header->frameType);
- VerifyBasicHeader(payload.header, 1, 0, 0);
+ EXPECT_EQ(kVideoFrameDelta, payload.frame_type);
+ EXPECT_EQ(kRtpVideoVp8, payload.type.Video.codec);
+ VerifyBasicHeader(&payload.type, 1, 0, 0);
VerifyExtensions(
- payload.header, kPictureId, kNoTl0PicIdx, kNoTemporalIdx, kNoKeyIdx);
+ &payload.type, kPictureId, kNoTl0PicIdx, kNoTemporalIdx, kNoKeyIdx);
// Re-use packet, but change to long PictureID.
packet[2] = 0x80 | kPictureId;
packet[3] = kPictureId;
- memset(payload.header, 0, sizeof(rtp_header));
+ payload = RtpDepacketizer::ParsedPayload();
ASSERT_TRUE(depacketizer_->Parse(&payload, packet, sizeof(packet)));
ExpectPacket(
&payload, packet + kHeaderLength2, sizeof(packet) - kHeaderLength2);
- VerifyBasicHeader(payload.header, 1, 0, 0);
- VerifyExtensions(payload.header,
+ VerifyBasicHeader(&payload.type, 1, 0, 0);
+ VerifyExtensions(&payload.type,
(kPictureId << 8) + kPictureId,
kNoTl0PicIdx,
kNoTemporalIdx,
@@ -463,18 +458,16 @@ TEST_F(RtpDepacketizerVp8Test, Tl0PicIdx) {
packet[0] = 0x90;
packet[1] = 0x40;
packet[2] = kTl0PicIdx;
-
- WebRtcRTPHeader rtp_header;
- memset(&rtp_header, 0, sizeof(rtp_header));
- RtpDepacketizer::ParsedPayload payload(&rtp_header);
+ RtpDepacketizer::ParsedPayload payload;
ASSERT_TRUE(depacketizer_->Parse(&payload, packet, sizeof(packet)));
ExpectPacket(
&payload, packet + kHeaderLength, sizeof(packet) - kHeaderLength);
- EXPECT_EQ(kVideoFrameKey, payload.header->frameType);
- VerifyBasicHeader(payload.header, 0, 1, 0);
+ EXPECT_EQ(kVideoFrameKey, payload.frame_type);
+ EXPECT_EQ(kRtpVideoVp8, payload.type.Video.codec);
+ VerifyBasicHeader(&payload.type, 0, 1, 0);
VerifyExtensions(
- payload.header, kNoPictureId, kTl0PicIdx, kNoTemporalIdx, kNoKeyIdx);
+ &payload.type, kNoPictureId, kTl0PicIdx, kNoTemporalIdx, kNoKeyIdx);
}
TEST_F(RtpDepacketizerVp8Test, TIDAndLayerSync) {
@@ -483,18 +476,16 @@ TEST_F(RtpDepacketizerVp8Test, TIDAndLayerSync) {
packet[0] = 0x88;
packet[1] = 0x20;
packet[2] = 0x80; // TID(2) + LayerSync(false)
-
- WebRtcRTPHeader rtp_header;
- memset(&rtp_header, 0, sizeof(rtp_header));
- RtpDepacketizer::ParsedPayload payload(&rtp_header);
+ RtpDepacketizer::ParsedPayload payload;
ASSERT_TRUE(depacketizer_->Parse(&payload, packet, sizeof(packet)));
ExpectPacket(
&payload, packet + kHeaderLength, sizeof(packet) - kHeaderLength);
- EXPECT_EQ(kVideoFrameDelta, payload.header->frameType);
- VerifyBasicHeader(payload.header, 0, 0, 8);
- VerifyExtensions(payload.header, kNoPictureId, kNoTl0PicIdx, 2, kNoKeyIdx);
- EXPECT_FALSE(payload.header->type.Video.codecHeader.VP8.layerSync);
+ EXPECT_EQ(kVideoFrameDelta, payload.frame_type);
+ EXPECT_EQ(kRtpVideoVp8, payload.type.Video.codec);
+ VerifyBasicHeader(&payload.type, 0, 0, 8);
+ VerifyExtensions(&payload.type, kNoPictureId, kNoTl0PicIdx, 2, kNoKeyIdx);
+ EXPECT_FALSE(payload.type.Video.codecHeader.VP8.layerSync);
}
TEST_F(RtpDepacketizerVp8Test, KeyIdx) {
@@ -504,18 +495,16 @@ TEST_F(RtpDepacketizerVp8Test, KeyIdx) {
packet[0] = 0x88;
packet[1] = 0x10; // K = 1.
packet[2] = kKeyIdx;
-
- WebRtcRTPHeader rtp_header;
- memset(&rtp_header, 0, sizeof(rtp_header));
- RtpDepacketizer::ParsedPayload payload(&rtp_header);
+ RtpDepacketizer::ParsedPayload payload;
ASSERT_TRUE(depacketizer_->Parse(&payload, packet, sizeof(packet)));
ExpectPacket(
&payload, packet + kHeaderLength, sizeof(packet) - kHeaderLength);
- EXPECT_EQ(kVideoFrameDelta, payload.header->frameType);
- VerifyBasicHeader(payload.header, 0, 0, 8);
+ EXPECT_EQ(kVideoFrameDelta, payload.frame_type);
+ EXPECT_EQ(kRtpVideoVp8, payload.type.Video.codec);
+ VerifyBasicHeader(&payload.type, 0, 0, 8);
VerifyExtensions(
- payload.header, kNoPictureId, kNoTl0PicIdx, kNoTemporalIdx, kKeyIdx);
+ &payload.type, kNoPictureId, kNoTl0PicIdx, kNoTemporalIdx, kKeyIdx);
}
TEST_F(RtpDepacketizerVp8Test, MultipleExtensions) {
@@ -527,17 +516,15 @@ TEST_F(RtpDepacketizerVp8Test, MultipleExtensions) {
packet[3] = 17; // PictureID, low 8 bits.
packet[4] = 42; // Tl0PicIdx.
packet[5] = 0x40 | 0x20 | 0x11; // TID(1) + LayerSync(true) + KEYIDX(17).
-
- WebRtcRTPHeader rtp_header;
- memset(&rtp_header, 0, sizeof(rtp_header));
- RtpDepacketizer::ParsedPayload payload(&rtp_header);
+ RtpDepacketizer::ParsedPayload payload;
ASSERT_TRUE(depacketizer_->Parse(&payload, packet, sizeof(packet)));
ExpectPacket(
&payload, packet + kHeaderLength, sizeof(packet) - kHeaderLength);
- EXPECT_EQ(kVideoFrameDelta, payload.header->frameType);
- VerifyBasicHeader(payload.header, 0, 0, 8);
- VerifyExtensions(payload.header, (17 << 8) + 17, 42, 1, 17);
+ EXPECT_EQ(kVideoFrameDelta, payload.frame_type);
+ EXPECT_EQ(kRtpVideoVp8, payload.type.Video.codec);
+ VerifyBasicHeader(&payload.type, 0, 0, 8);
+ VerifyExtensions(&payload.type, (17 << 8) + 17, 42, 1, 17);
}
TEST_F(RtpDepacketizerVp8Test, TooShortHeader) {
@@ -546,10 +533,7 @@ TEST_F(RtpDepacketizerVp8Test, TooShortHeader) {
packet[1] = 0x80 | 0x40 | 0x20 | 0x10; // All extensions are enabled...
packet[2] = 0x80 | 17; // ... but only 2 bytes PictureID is provided.
packet[3] = 17; // PictureID, low 8 bits.
-
- WebRtcRTPHeader rtp_header;
- memset(&rtp_header, 0, sizeof(rtp_header));
- RtpDepacketizer::ParsedPayload payload(&rtp_header);
+ RtpDepacketizer::ParsedPayload payload;
EXPECT_FALSE(depacketizer_->Parse(&payload, packet, sizeof(packet)));
}
@@ -571,23 +555,20 @@ TEST_F(RtpDepacketizerVp8Test, TestWithPacketizer) {
size_t send_bytes;
ASSERT_TRUE(packetizer.NextPacket(packet, &send_bytes, &last));
ASSERT_TRUE(last);
-
- WebRtcRTPHeader rtp_header;
- memset(&rtp_header, 0, sizeof(rtp_header));
- RtpDepacketizer::ParsedPayload payload(&rtp_header);
+ RtpDepacketizer::ParsedPayload payload;
ASSERT_TRUE(depacketizer_->Parse(&payload, packet, sizeof(packet)));
ExpectPacket(
&payload, packet + kHeaderLength, sizeof(packet) - kHeaderLength);
- EXPECT_EQ(kVideoFrameKey, payload.header->frameType);
- VerifyBasicHeader(payload.header, 1, 1, 0);
- VerifyExtensions(payload.header,
+ EXPECT_EQ(kVideoFrameKey, payload.frame_type);
+ EXPECT_EQ(kRtpVideoVp8, payload.type.Video.codec);
+ VerifyBasicHeader(&payload.type, 1, 1, 0);
+ VerifyExtensions(&payload.type,
input_header.pictureId,
input_header.tl0PicIdx,
input_header.temporalIdx,
input_header.keyIdx);
- EXPECT_EQ(payload.header->type.Video.codecHeader.VP8.layerSync,
+ EXPECT_EQ(payload.type.Video.codecHeader.VP8.layerSync,
input_header.layerSync);
}
-
} // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtp_receiver_video.cc b/modules/rtp_rtcp/source/rtp_receiver_video.cc
index dfbf35ae..6f6d6470 100644
--- a/modules/rtp_rtcp/source/rtp_receiver_video.cc
+++ b/modules/rtp_rtcp/source/rtp_receiver_video.cc
@@ -79,13 +79,15 @@ int32_t RTPReceiverVideo::ParseRtpPacket(WebRtcRTPHeader* rtp_header,
}
rtp_header->type.Video.isFirstPacket = is_first_packet;
- RtpDepacketizer::ParsedPayload parsed_payload(rtp_header);
+ RtpDepacketizer::ParsedPayload parsed_payload;
if (!depacketizer->Parse(&parsed_payload, payload, payload_data_length))
return -1;
+ rtp_header->frameType = parsed_payload.frame_type;
+ rtp_header->type = parsed_payload.type;
return data_callback_->OnReceivedPayloadData(parsed_payload.payload,
parsed_payload.payload_length,
- parsed_payload.header) == 0
+ rtp_header) == 0
? 0
: -1;
}
diff --git a/modules/rtp_rtcp/source/rtp_sender.cc b/modules/rtp_rtcp/source/rtp_sender.cc
index 0438b9f7..677f3fc4 100644
--- a/modules/rtp_rtcp/source/rtp_sender.cc
+++ b/modules/rtp_rtcp/source/rtp_sender.cc
@@ -40,6 +40,57 @@ const char* FrameTypeToString(const FrameType frame_type) {
} // namespace
+class BitrateAggregator {
+ public:
+ explicit BitrateAggregator(BitrateStatisticsObserver* bitrate_callback)
+ : callback_(bitrate_callback),
+ total_bitrate_observer_(*this),
+ retransmit_bitrate_observer_(*this),
+ ssrc_(0) {}
+
+ void OnStatsUpdated() const {
+ if (callback_)
+ callback_->Notify(total_bitrate_observer_.statistics(),
+ retransmit_bitrate_observer_.statistics(),
+ ssrc_);
+ }
+
+ Bitrate::Observer* total_bitrate_observer() {
+ return &total_bitrate_observer_;
+ }
+ Bitrate::Observer* retransmit_bitrate_observer() {
+ return &retransmit_bitrate_observer_;
+ }
+
+ void set_ssrc(uint32_t ssrc) { ssrc_ = ssrc; }
+
+ private:
+ // We assume that these observers are called on the same thread, which is
+ // true for RtpSender as they are called on the Process thread.
+ class BitrateObserver : public Bitrate::Observer {
+ public:
+ explicit BitrateObserver(const BitrateAggregator& aggregator)
+ : aggregator_(aggregator) {}
+
+ // Implements Bitrate::Observer.
+ virtual void BitrateUpdated(const BitrateStatistics& stats) OVERRIDE {
+ statistics_ = stats;
+ aggregator_.OnStatsUpdated();
+ }
+
+ BitrateStatistics statistics() const { return statistics_; }
+
+ private:
+ BitrateStatistics statistics_;
+ const BitrateAggregator& aggregator_;
+ };
+
+ BitrateStatisticsObserver* const callback_;
+ BitrateObserver total_bitrate_observer_;
+ BitrateObserver retransmit_bitrate_observer_;
+ uint32_t ssrc_;
+};
+
RTPSender::RTPSender(const int32_t id,
const bool audio,
Clock* clock,
@@ -54,7 +105,8 @@ RTPSender::RTPSender(const int32_t id,
// TickTime.
clock_delta_ms_(clock_->TimeInMilliseconds() -
TickTime::MillisecondTimestamp()),
- bitrate_sent_(clock, this),
+ bitrates_(new BitrateAggregator(bitrate_callback)),
+ total_bitrate_sent_(clock, bitrates_->total_bitrate_observer()),
id_(id),
audio_configured_(audio),
audio_(NULL),
@@ -74,12 +126,11 @@ RTPSender::RTPSender(const int32_t id,
// NACK.
nack_byte_count_times_(),
nack_byte_count_(),
- nack_bitrate_(clock, NULL),
+ nack_bitrate_(clock, bitrates_->retransmit_bitrate_observer()),
packet_history_(clock),
// Statistics
statistics_crit_(CriticalSectionWrapper::CreateCriticalSection()),
rtp_stats_callback_(NULL),
- bitrate_callback_(bitrate_callback),
frame_count_observer_(frame_count_observer),
send_side_delay_observer_(send_side_delay_observer),
// RTP variables
@@ -108,6 +159,7 @@ RTPSender::RTPSender(const int32_t id,
srand(static_cast<uint32_t>(clock_->TimeInMilliseconds()));
ssrc_ = ssrc_db_.CreateSSRC(); // Can't be 0.
ssrc_rtx_ = ssrc_db_.CreateSSRC(); // Can't be 0.
+ bitrates_->set_ssrc(ssrc_);
// Random start, 16 bits. Can't be 0.
sequence_number_rtx_ = static_cast<uint16_t>(rand() + 1) & 0x7FFF;
sequence_number_ = static_cast<uint16_t>(rand() + 1) & 0x7FFF;
@@ -149,7 +201,7 @@ uint32_t RTPSender::GetTargetBitrate() {
}
uint16_t RTPSender::ActualSendBitrateKbit() const {
- return (uint16_t)(bitrate_sent_.BitrateNow() / 1000);
+ return (uint16_t)(total_bitrate_sent_.BitrateNow() / 1000);
}
uint32_t RTPSender::VideoBitrateSent() const {
@@ -864,7 +916,7 @@ void RTPSender::UpdateRtpStats(const uint8_t* buffer,
counters = &rtp_stats_;
}
- bitrate_sent_.Update(size);
+ total_bitrate_sent_.Update(size);
++counters->packets;
if (IsFecPacket(buffer, header)) {
++counters->fec_packets;
@@ -997,7 +1049,7 @@ void RTPSender::UpdateDelayStatistics(int64_t capture_time_ms, int64_t now_ms) {
void RTPSender::ProcessBitrate() {
CriticalSectionScoped cs(send_critsect_);
- bitrate_sent_.Process();
+ total_bitrate_sent_.Process();
nack_bitrate_.Process();
if (audio_configured_) {
return;
@@ -1420,6 +1472,7 @@ void RTPSender::SetSendingStatus(bool enabled) {
// Generate a new SSRC.
ssrc_db_.ReturnSSRC(ssrc_);
ssrc_ = ssrc_db_.CreateSSRC(); // Can't be 0.
+ bitrates_->set_ssrc(ssrc_);
}
// Don't initialize seq number if SSRC passed externally.
if (!sequence_number_forced_ && !ssrc_forced_) {
@@ -1470,6 +1523,7 @@ uint32_t RTPSender::GenerateNewSSRC() {
return 0;
}
ssrc_ = ssrc_db_.CreateSSRC(); // Can't be 0.
+ bitrates_->set_ssrc(ssrc_);
return ssrc_;
}
@@ -1484,6 +1538,7 @@ void RTPSender::SetSSRC(uint32_t ssrc) {
ssrc_db_.ReturnSSRC(ssrc_);
ssrc_db_.RegisterSSRC(ssrc);
ssrc_ = ssrc;
+ bitrates_->set_ssrc(ssrc_);
if (!sequence_number_forced_) {
sequence_number_ =
rand() / (RAND_MAX / MAX_INIT_RTP_SEQ_NUMBER); // NOLINT
@@ -1681,17 +1736,8 @@ StreamDataCountersCallback* RTPSender::GetRtpStatisticsCallback() const {
return rtp_stats_callback_;
}
-uint32_t RTPSender::BitrateSent() const { return bitrate_sent_.BitrateLast(); }
-
-void RTPSender::BitrateUpdated(const BitrateStatistics& stats) {
- uint32_t ssrc;
- {
- CriticalSectionScoped ssrc_lock(send_critsect_);
- ssrc = ssrc_;
- }
- if (bitrate_callback_) {
- bitrate_callback_->Notify(stats, ssrc);
- }
+uint32_t RTPSender::BitrateSent() const {
+ return total_bitrate_sent_.BitrateLast();
}
void RTPSender::SetRtpState(const RtpState& rtp_state) {
diff --git a/modules/rtp_rtcp/source/rtp_sender.h b/modules/rtp_rtcp/source/rtp_sender.h
index 780baa1f..6564d47b 100644
--- a/modules/rtp_rtcp/source/rtp_sender.h
+++ b/modules/rtp_rtcp/source/rtp_sender.h
@@ -31,6 +31,7 @@
namespace webrtc {
+class BitrateAggregator;
class CriticalSectionWrapper;
class RTPSenderAudio;
class RTPSenderVideo;
@@ -65,7 +66,7 @@ class RTPSenderInterface {
PacedSender::Priority priority) = 0;
};
-class RTPSender : public RTPSenderInterface, public Bitrate::Observer {
+class RTPSender : public RTPSenderInterface {
public:
RTPSender(const int32_t id, const bool audio, Clock *clock,
Transport *transport, RtpAudioFeedback *audio_feedback,
@@ -276,8 +277,6 @@ class RTPSender : public RTPSenderInterface, public Bitrate::Observer {
uint32_t BitrateSent() const;
- virtual void BitrateUpdated(const BitrateStatistics& stats) OVERRIDE;
-
void SetRtpState(const RtpState& rtp_state);
RtpState GetRtpState() const;
void SetRtxRtpState(const RtpState& rtp_state);
@@ -337,7 +336,9 @@ class RTPSender : public RTPSenderInterface, public Bitrate::Observer {
Clock* clock_;
int64_t clock_delta_ms_;
- Bitrate bitrate_sent_;
+
+ scoped_ptr<BitrateAggregator> bitrates_;
+ Bitrate total_bitrate_sent_;
int32_t id_;
const bool audio_configured_;
@@ -375,7 +376,6 @@ class RTPSender : public RTPSenderInterface, public Bitrate::Observer {
StreamDataCounters rtp_stats_ GUARDED_BY(statistics_crit_);
StreamDataCounters rtx_rtp_stats_ GUARDED_BY(statistics_crit_);
StreamDataCountersCallback* rtp_stats_callback_ GUARDED_BY(statistics_crit_);
- BitrateStatisticsObserver* const bitrate_callback_;
FrameCountObserver* const frame_count_observer_;
SendSideDelayObserver* const send_side_delay_observer_;
diff --git a/modules/rtp_rtcp/source/rtp_sender_unittest.cc b/modules/rtp_rtcp/source/rtp_sender_unittest.cc
index 9c6a7207..2a494778 100644
--- a/modules/rtp_rtcp/source/rtp_sender_unittest.cc
+++ b/modules/rtp_rtcp/source/rtp_sender_unittest.cc
@@ -855,20 +855,22 @@ TEST_F(RtpSenderTest, FrameCountCallbacks) {
TEST_F(RtpSenderTest, BitrateCallbacks) {
class TestCallback : public BitrateStatisticsObserver {
public:
- TestCallback()
- : BitrateStatisticsObserver(), num_calls_(0), ssrc_(0), bitrate_() {}
+ TestCallback() : BitrateStatisticsObserver(), num_calls_(0), ssrc_(0) {}
virtual ~TestCallback() {}
- virtual void Notify(const BitrateStatistics& stats,
+ virtual void Notify(const BitrateStatistics& total_stats,
+ const BitrateStatistics& retransmit_stats,
uint32_t ssrc) OVERRIDE {
++num_calls_;
ssrc_ = ssrc;
- bitrate_ = stats;
+ total_stats_ = total_stats;
+ retransmit_stats_ = retransmit_stats;
}
uint32_t num_calls_;
uint32_t ssrc_;
- BitrateStatistics bitrate_;
+ BitrateStatistics total_stats_;
+ BitrateStatistics retransmit_stats_;
} callback;
rtp_sender_.reset(new RTPSender(0, false, &fake_clock_, &transport_, NULL,
&mock_paced_sender_, &callback, NULL, NULL));
@@ -909,13 +911,15 @@ TEST_F(RtpSenderTest, BitrateCallbacks) {
const uint32_t expected_packet_rate = 1000 / kPacketInterval;
- EXPECT_EQ(1U, callback.num_calls_);
+ // We get one call for every stats updated, thus two calls since both the
+ // stream stats and the retransmit stats are updated once.
+ EXPECT_EQ(2u, callback.num_calls_);
EXPECT_EQ(ssrc, callback.ssrc_);
EXPECT_EQ(start_time + (kNumPackets * kPacketInterval),
- callback.bitrate_.timestamp_ms);
- EXPECT_EQ(expected_packet_rate, callback.bitrate_.packet_rate);
+ callback.total_stats_.timestamp_ms);
+ EXPECT_EQ(expected_packet_rate, callback.total_stats_.packet_rate);
EXPECT_EQ((kPacketOverhead + sizeof(payload)) * 8 * expected_packet_rate,
- callback.bitrate_.bitrate_bps);
+ callback.total_stats_.bitrate_bps);
rtp_sender_.reset();
}
diff --git a/modules/video_coding/codecs/test/videoprocessor_integrationtest.cc b/modules/video_coding/codecs/test/videoprocessor_integrationtest.cc
index 73f774d6..420ef595 100644
--- a/modules/video_coding/codecs/test/videoprocessor_integrationtest.cc
+++ b/modules/video_coding/codecs/test/videoprocessor_integrationtest.cc
@@ -604,7 +604,7 @@ TEST_F(VideoProcessorIntegrationTest, Process0PercentPacketLossVP9) {
false, true, false);
// Metrics for expected quality.
QualityMetrics quality_metrics;
- SetQualityMetrics(&quality_metrics, 37.5, 36.0, 0.94, 0.93);
+ SetQualityMetrics(&quality_metrics, 37.0, 36.0, 0.93, 0.92);
// Metrics for rate control.
RateControlMetrics rc_metrics[1];
SetRateControlMetrics(rc_metrics, 0, 0, 40, 20, 10, 15, 0);
@@ -657,12 +657,12 @@ TEST_F(VideoProcessorIntegrationTest, ProcessNoLossChangeBitRateVP9) {
false, true, false);
// Metrics for expected quality.
QualityMetrics quality_metrics;
- SetQualityMetrics(&quality_metrics, 36.0, 32.0, 0.90, 0.85);
+ SetQualityMetrics(&quality_metrics, 36.0, 31.8, 0.90, 0.85);
// Metrics for rate control.
RateControlMetrics rc_metrics[3];
SetRateControlMetrics(rc_metrics, 0, 0, 30, 20, 20, 20, 0);
SetRateControlMetrics(rc_metrics, 1, 2, 0, 20, 20, 60, 0);
- SetRateControlMetrics(rc_metrics, 2, 0, 0, 20, 20, 30, 0);
+ SetRateControlMetrics(rc_metrics, 2, 0, 0, 20, 20, 40, 0);
ProcessFramesAndVerify(quality_metrics,
rate_profile,
process_settings,
@@ -692,11 +692,11 @@ TEST_F(VideoProcessorIntegrationTest,
false, true, false);
// Metrics for expected quality.
QualityMetrics quality_metrics;
- SetQualityMetrics(&quality_metrics, 30.0, 18.0, 0.80, 0.40);
+ SetQualityMetrics(&quality_metrics, 29.0, 17.0, 0.80, 0.40);
// Metrics for rate control.
RateControlMetrics rc_metrics[3];
- SetRateControlMetrics(rc_metrics, 0, 35, 55, 70, 15, 40, 0);
- SetRateControlMetrics(rc_metrics, 1, 15, 0, 50, 10, 30, 0);
+ SetRateControlMetrics(rc_metrics, 0, 50, 60, 100, 15, 45, 0);
+ SetRateControlMetrics(rc_metrics, 1, 30, 0, 65, 10, 35, 0);
SetRateControlMetrics(rc_metrics, 2, 5, 0, 38, 10, 30, 0);
ProcessFramesAndVerify(quality_metrics,
rate_profile,
diff --git a/modules/video_coding/codecs/vp9/vp9_impl.cc b/modules/video_coding/codecs/vp9/vp9_impl.cc
index 33f11a37..734e73d2 100644
--- a/modules/video_coding/codecs/vp9/vp9_impl.cc
+++ b/modules/video_coding/codecs/vp9/vp9_impl.cc
@@ -189,11 +189,8 @@ int VP9EncoderImpl::InitAndSetControlSettings(const VideoCodec* inst) {
return WEBRTC_VIDEO_CODEC_UNINITIALIZED;
}
// Only positive speeds, currently: 0 - 7.
- // O means slowest/best quality, 7 means fastest/lowest quality.
- // TODO(marpan): Speeds 5-7 are speed settings for real-time mode, on desktop.
- // Currently set to 5, update to 6 (for faster encoding) after some subjective
- // quality tests.
- cpu_speed_ = 5;
+ // O means slowest/best quality, 7 means fastest/lower quality.
+ cpu_speed_ = 6;
// Note: some of these codec controls still use "VP8" in the control name.
// TODO(marpan): Update this in the next/future libvpx version.
vpx_codec_control(encoder_, VP8E_SET_CPUUSED, cpu_speed_);
diff --git a/modules/video_coding/main/source/media_optimization.cc b/modules/video_coding/main/source/media_optimization.cc
index 0d9a4bdf..57894807 100644
--- a/modules/video_coding/main/source/media_optimization.cc
+++ b/modules/video_coding/main/source/media_optimization.cc
@@ -542,7 +542,7 @@ void MediaOptimization::UpdateSentBitrate(int64_t now_ms) {
now_ms - encoded_frame_samples_.front().time_complete_ms);
if (denom >= 1.0f) {
avg_sent_bit_rate_bps_ =
- static_cast<uint32_t>(framesize_sum * 8 * 1000 / denom + 0.5f);
+ static_cast<uint32_t>(framesize_sum * 8.0f * 1000.0f / denom + 0.5f);
} else {
avg_sent_bit_rate_bps_ = framesize_sum * 8;
}
diff --git a/modules/video_render/android/video_render_android_native_opengl2.h b/modules/video_render/android/video_render_android_native_opengl2.h
index 66c53641..f5e5b57e 100644
--- a/modules/video_render/android/video_render_android_native_opengl2.h
+++ b/modules/video_render/android/video_render_android_native_opengl2.h
@@ -41,7 +41,7 @@ class AndroidNativeOpenGl2Channel: public AndroidStream {
virtual void DeliverFrame(JNIEnv* jniEnv);
private:
- static jint CreateOpenGLNativeStatic(
+ static jint JNICALL CreateOpenGLNativeStatic(
JNIEnv * env,
jobject,
jlong context,
@@ -49,7 +49,7 @@ class AndroidNativeOpenGl2Channel: public AndroidStream {
jint height);
jint CreateOpenGLNative(int width, int height);
- static void DrawNativeStatic(JNIEnv * env,jobject, jlong context);
+ static void JNICALL DrawNativeStatic(JNIEnv * env,jobject, jlong context);
void DrawNative();
uint32_t _id;
CriticalSectionWrapper& _renderCritSect;
diff --git a/p2p/base/basicpacketsocketfactory.cc b/p2p/base/basicpacketsocketfactory.cc
index 06dfe76e..9b12e78d 100644
--- a/p2p/base/basicpacketsocketfactory.cc
+++ b/p2p/base/basicpacketsocketfactory.cc
@@ -44,7 +44,7 @@ BasicPacketSocketFactory::~BasicPacketSocketFactory() {
}
AsyncPacketSocket* BasicPacketSocketFactory::CreateUdpSocket(
- const SocketAddress& address, int min_port, int max_port) {
+ const SocketAddress& address, uint16 min_port, uint16 max_port) {
// UDP sockets are simple.
rtc::AsyncSocket* socket =
socket_factory()->CreateAsyncSocket(
@@ -62,7 +62,8 @@ AsyncPacketSocket* BasicPacketSocketFactory::CreateUdpSocket(
}
AsyncPacketSocket* BasicPacketSocketFactory::CreateServerTcpSocket(
- const SocketAddress& local_address, int min_port, int max_port, int opts) {
+ const SocketAddress& local_address, uint16 min_port, uint16 max_port,
+ int opts) {
// Fail if TLS is required.
if (opts & PacketSocketFactory::OPT_TLS) {
@@ -177,7 +178,7 @@ AsyncResolverInterface* BasicPacketSocketFactory::CreateAsyncResolver() {
int BasicPacketSocketFactory::BindSocket(
AsyncSocket* socket, const SocketAddress& local_address,
- int min_port, int max_port) {
+ uint16 min_port, uint16 max_port) {
int ret = -1;
if (min_port == 0 && max_port == 0) {
// If there's no port range, let the OS pick a port for us.
diff --git a/p2p/base/basicpacketsocketfactory.h b/p2p/base/basicpacketsocketfactory.h
index fb3a5269..b23a6772 100644
--- a/p2p/base/basicpacketsocketfactory.h
+++ b/p2p/base/basicpacketsocketfactory.h
@@ -24,21 +24,28 @@ class BasicPacketSocketFactory : public PacketSocketFactory {
BasicPacketSocketFactory();
explicit BasicPacketSocketFactory(Thread* thread);
explicit BasicPacketSocketFactory(SocketFactory* socket_factory);
- virtual ~BasicPacketSocketFactory();
-
- virtual AsyncPacketSocket* CreateUdpSocket(
- const SocketAddress& local_address, int min_port, int max_port);
- virtual AsyncPacketSocket* CreateServerTcpSocket(
- const SocketAddress& local_address, int min_port, int max_port, int opts);
- virtual AsyncPacketSocket* CreateClientTcpSocket(
- const SocketAddress& local_address, const SocketAddress& remote_address,
- const ProxyInfo& proxy_info, const std::string& user_agent, int opts);
-
- virtual AsyncResolverInterface* CreateAsyncResolver();
+ ~BasicPacketSocketFactory() override;
+
+ AsyncPacketSocket* CreateUdpSocket(const SocketAddress& local_address,
+ uint16 min_port,
+ uint16 max_port) override;
+ AsyncPacketSocket* CreateServerTcpSocket(const SocketAddress& local_address,
+ uint16 min_port,
+ uint16 max_port,
+ int opts) override;
+ AsyncPacketSocket* CreateClientTcpSocket(const SocketAddress& local_address,
+ const SocketAddress& remote_address,
+ const ProxyInfo& proxy_info,
+ const std::string& user_agent,
+ int opts) override;
+
+ AsyncResolverInterface* CreateAsyncResolver() override;
private:
- int BindSocket(AsyncSocket* socket, const SocketAddress& local_address,
- int min_port, int max_port);
+ int BindSocket(AsyncSocket* socket,
+ const SocketAddress& local_address,
+ uint16 min_port,
+ uint16 max_port);
SocketFactory* socket_factory();
diff --git a/p2p/base/packetsocketfactory.h b/p2p/base/packetsocketfactory.h
index 1f45feca..d2d7b1b1 100644
--- a/p2p/base/packetsocketfactory.h
+++ b/p2p/base/packetsocketfactory.h
@@ -29,17 +29,23 @@ class PacketSocketFactory {
PacketSocketFactory() { }
virtual ~PacketSocketFactory() { }
- virtual AsyncPacketSocket* CreateUdpSocket(
- const SocketAddress& address, int min_port, int max_port) = 0;
+ virtual AsyncPacketSocket* CreateUdpSocket(const SocketAddress& address,
+ uint16 min_port,
+ uint16 max_port) = 0;
virtual AsyncPacketSocket* CreateServerTcpSocket(
- const SocketAddress& local_address, int min_port, int max_port,
+ const SocketAddress& local_address,
+ uint16 min_port,
+ uint16 max_port,
int opts) = 0;
// TODO: |proxy_info| and |user_agent| should be set
// per-factory and not when socket is created.
virtual AsyncPacketSocket* CreateClientTcpSocket(
- const SocketAddress& local_address, const SocketAddress& remote_address,
- const ProxyInfo& proxy_info, const std::string& user_agent, int opts) = 0;
+ const SocketAddress& local_address,
+ const SocketAddress& remote_address,
+ const ProxyInfo& proxy_info,
+ const std::string& user_agent,
+ int opts) = 0;
virtual AsyncResolverInterface* CreateAsyncResolver() = 0;
diff --git a/p2p/base/port.cc b/p2p/base/port.cc
index f569d9f5..a8357ad6 100644
--- a/p2p/base/port.cc
+++ b/p2p/base/port.cc
@@ -152,9 +152,12 @@ static std::string ComputeFoundation(
return rtc::ToString<uint32>(rtc::ComputeCrc32(ost.str()));
}
-Port::Port(rtc::Thread* thread, rtc::PacketSocketFactory* factory,
- rtc::Network* network, const rtc::IPAddress& ip,
- const std::string& username_fragment, const std::string& password)
+Port::Port(rtc::Thread* thread,
+ rtc::PacketSocketFactory* factory,
+ rtc::Network* network,
+ const rtc::IPAddress& ip,
+ const std::string& username_fragment,
+ const std::string& password)
: thread_(thread),
factory_(factory),
send_retransmit_count_attribute_(false),
@@ -176,10 +179,14 @@ Port::Port(rtc::Thread* thread, rtc::PacketSocketFactory* factory,
Construct();
}
-Port::Port(rtc::Thread* thread, const std::string& type,
+Port::Port(rtc::Thread* thread,
+ const std::string& type,
rtc::PacketSocketFactory* factory,
- rtc::Network* network, const rtc::IPAddress& ip,
- int min_port, int max_port, const std::string& username_fragment,
+ rtc::Network* network,
+ const rtc::IPAddress& ip,
+ uint16 min_port,
+ uint16 max_port,
+ const std::string& username_fragment,
const std::string& password)
: thread_(thread),
factory_(factory),
diff --git a/p2p/base/port.h b/p2p/base/port.h
index 48b85302..87072e67 100644
--- a/p2p/base/port.h
+++ b/p2p/base/port.h
@@ -107,13 +107,20 @@ typedef std::set<rtc::SocketAddress> ServerAddresses;
class Port : public PortInterface, public rtc::MessageHandler,
public sigslot::has_slots<> {
public:
- Port(rtc::Thread* thread, rtc::PacketSocketFactory* factory,
- rtc::Network* network, const rtc::IPAddress& ip,
- const std::string& username_fragment, const std::string& password);
- Port(rtc::Thread* thread, const std::string& type,
+ Port(rtc::Thread* thread,
rtc::PacketSocketFactory* factory,
- rtc::Network* network, const rtc::IPAddress& ip,
- int min_port, int max_port, const std::string& username_fragment,
+ rtc::Network* network,
+ const rtc::IPAddress& ip,
+ const std::string& username_fragment,
+ const std::string& password);
+ Port(rtc::Thread* thread,
+ const std::string& type,
+ rtc::PacketSocketFactory* factory,
+ rtc::Network* network,
+ const rtc::IPAddress& ip,
+ uint16 min_port,
+ uint16 max_port,
+ const std::string& username_fragment,
const std::string& password);
virtual ~Port();
@@ -256,8 +263,8 @@ class Port : public PortInterface, public rtc::MessageHandler,
// Debugging description of this port
virtual std::string ToString() const;
rtc::IPAddress& ip() { return ip_; }
- int min_port() { return min_port_; }
- int max_port() { return max_port_; }
+ uint16 min_port() { return min_port_; }
+ uint16 max_port() { return max_port_; }
// Timeout shortening function to speed up unit tests.
void set_timeout_delay(int delay) { timeout_delay_ = delay; }
@@ -354,8 +361,8 @@ class Port : public PortInterface, public rtc::MessageHandler,
bool send_retransmit_count_attribute_;
rtc::Network* network_;
rtc::IPAddress ip_;
- int min_port_;
- int max_port_;
+ uint16 min_port_;
+ uint16 max_port_;
std::string content_name_;
int component_;
uint32 generation_;
diff --git a/p2p/base/port_unittest.cc b/p2p/base/port_unittest.cc
index 8805709a..f09db284 100644
--- a/p2p/base/port_unittest.cc
+++ b/p2p/base/port_unittest.cc
@@ -100,12 +100,17 @@ static bool WriteStunMessage(const StunMessage* msg, ByteBuffer* buf) {
// Stub port class for testing STUN generation and processing.
class TestPort : public Port {
public:
- TestPort(rtc::Thread* thread, const std::string& type,
- rtc::PacketSocketFactory* factory, rtc::Network* network,
- const rtc::IPAddress& ip, int min_port, int max_port,
- const std::string& username_fragment, const std::string& password)
- : Port(thread, type, factory, network, ip,
- min_port, max_port, username_fragment, password) {
+ TestPort(rtc::Thread* thread,
+ const std::string& type,
+ rtc::PacketSocketFactory* factory,
+ rtc::Network* network,
+ const rtc::IPAddress& ip,
+ uint16 min_port,
+ uint16 max_port,
+ const std::string& username_fragment,
+ const std::string& password)
+ : Port(thread, type, factory, network, ip, min_port, max_port,
+ username_fragment, password) {
}
~TestPort() {}
@@ -762,19 +767,21 @@ class FakePacketSocketFactory : public rtc::PacketSocketFactory {
next_server_tcp_socket_(NULL),
next_client_tcp_socket_(NULL) {
}
- virtual ~FakePacketSocketFactory() { }
+ ~FakePacketSocketFactory() override { }
- virtual AsyncPacketSocket* CreateUdpSocket(
- const SocketAddress& address, int min_port, int max_port) {
+ AsyncPacketSocket* CreateUdpSocket(const SocketAddress& address,
+ uint16 min_port,
+ uint16 max_port) override {
EXPECT_TRUE(next_udp_socket_ != NULL);
AsyncPacketSocket* result = next_udp_socket_;
next_udp_socket_ = NULL;
return result;
}
- virtual AsyncPacketSocket* CreateServerTcpSocket(
- const SocketAddress& local_address, int min_port, int max_port,
- int opts) {
+ AsyncPacketSocket* CreateServerTcpSocket(const SocketAddress& local_address,
+ uint16 min_port,
+ uint16 max_port,
+ int opts) override {
EXPECT_TRUE(next_server_tcp_socket_ != NULL);
AsyncPacketSocket* result = next_server_tcp_socket_;
next_server_tcp_socket_ = NULL;
@@ -783,10 +790,11 @@ class FakePacketSocketFactory : public rtc::PacketSocketFactory {
// TODO: |proxy_info| and |user_agent| should be set
// per-factory and not when socket is created.
- virtual AsyncPacketSocket* CreateClientTcpSocket(
- const SocketAddress& local_address, const SocketAddress& remote_address,
- const rtc::ProxyInfo& proxy_info,
- const std::string& user_agent, int opts) {
+ AsyncPacketSocket* CreateClientTcpSocket(const SocketAddress& local_address,
+ const SocketAddress& remote_address,
+ const rtc::ProxyInfo& proxy_info,
+ const std::string& user_agent,
+ int opts) override {
EXPECT_TRUE(next_client_tcp_socket_ != NULL);
AsyncPacketSocket* result = next_client_tcp_socket_;
next_client_tcp_socket_ = NULL;
diff --git a/p2p/base/relayport.cc b/p2p/base/relayport.cc
index 4c40b3da..1a07f8fe 100644
--- a/p2p/base/relayport.cc
+++ b/p2p/base/relayport.cc
@@ -172,11 +172,14 @@ class AllocateRequest : public StunRequest {
uint32 start_time_;
};
-RelayPort::RelayPort(
- rtc::Thread* thread, rtc::PacketSocketFactory* factory,
- rtc::Network* network, const rtc::IPAddress& ip,
- int min_port, int max_port, const std::string& username,
- const std::string& password)
+RelayPort::RelayPort(rtc::Thread* thread,
+ rtc::PacketSocketFactory* factory,
+ rtc::Network* network,
+ const rtc::IPAddress& ip,
+ uint16 min_port,
+ uint16 max_port,
+ const std::string& username,
+ const std::string& password)
: Port(thread, RELAY_PORT_TYPE, factory, network, ip, min_port, max_port,
username, password),
ready_(false),
diff --git a/p2p/base/relayport.h b/p2p/base/relayport.h
index 3d9538da..62971426 100644
--- a/p2p/base/relayport.h
+++ b/p2p/base/relayport.h
@@ -36,9 +36,13 @@ class RelayPort : public Port {
// RelayPort doesn't yet do anything fancy in the ctor.
static RelayPort* Create(
- rtc::Thread* thread, rtc::PacketSocketFactory* factory,
- rtc::Network* network, const rtc::IPAddress& ip,
- int min_port, int max_port, const std::string& username,
+ rtc::Thread* thread,
+ rtc::PacketSocketFactory* factory,
+ rtc::Network* network,
+ const rtc::IPAddress& ip,
+ uint16 min_port,
+ uint16 max_port,
+ const std::string& username,
const std::string& password) {
return new RelayPort(thread, factory, network, ip, min_port, max_port,
username, password);
@@ -66,9 +70,13 @@ class RelayPort : public Port {
sigslot::signal1<const ProtocolAddress*> SignalSoftTimeout;
protected:
- RelayPort(rtc::Thread* thread, rtc::PacketSocketFactory* factory,
- rtc::Network*, const rtc::IPAddress& ip,
- int min_port, int max_port, const std::string& username,
+ RelayPort(rtc::Thread* thread,
+ rtc::PacketSocketFactory* factory,
+ rtc::Network*,
+ const rtc::IPAddress& ip,
+ uint16 min_port,
+ uint16 max_port,
+ const std::string& username,
const std::string& password);
bool Init();
diff --git a/p2p/base/stunport.cc b/p2p/base/stunport.cc
index ec6232a6..5ef9e9ea 100644
--- a/p2p/base/stunport.cc
+++ b/p2p/base/stunport.cc
@@ -162,7 +162,8 @@ UDPPort::UDPPort(rtc::Thread* thread,
rtc::PacketSocketFactory* factory,
rtc::Network* network,
rtc::AsyncPacketSocket* socket,
- const std::string& username, const std::string& password)
+ const std::string& username,
+ const std::string& password)
: Port(thread, factory, network, socket->GetLocalAddress().ipaddr(),
username, password),
requests_(thread),
@@ -175,8 +176,11 @@ UDPPort::UDPPort(rtc::Thread* thread,
UDPPort::UDPPort(rtc::Thread* thread,
rtc::PacketSocketFactory* factory,
rtc::Network* network,
- const rtc::IPAddress& ip, int min_port, int max_port,
- const std::string& username, const std::string& password)
+ const rtc::IPAddress& ip,
+ uint16 min_port,
+ uint16 max_port,
+ const std::string& username,
+ const std::string& password)
: Port(thread, LOCAL_PORT_TYPE, factory, network, ip, min_port, max_port,
username, password),
requests_(thread),
diff --git a/p2p/base/stunport.h b/p2p/base/stunport.h
index eda7bb90..9ca60462 100644
--- a/p2p/base/stunport.h
+++ b/p2p/base/stunport.h
@@ -34,8 +34,8 @@ class UDPPort : public Port {
rtc::AsyncPacketSocket* socket,
const std::string& username,
const std::string& password) {
- UDPPort* port = new UDPPort(thread, factory, network, socket,
- username, password);
+ UDPPort* port =
+ new UDPPort(thread, factory, network, socket, username, password);
if (!port->Init()) {
delete port;
port = NULL;
@@ -47,12 +47,12 @@ class UDPPort : public Port {
rtc::PacketSocketFactory* factory,
rtc::Network* network,
const rtc::IPAddress& ip,
- int min_port, int max_port,
+ uint16 min_port,
+ uint16 max_port,
const std::string& username,
const std::string& password) {
- UDPPort* port = new UDPPort(thread, factory, network,
- ip, min_port, max_port,
- username, password);
+ UDPPort* port = new UDPPort(thread, factory, network, ip, min_port,
+ max_port, username, password);
if (!port->Init()) {
delete port;
port = NULL;
@@ -98,14 +98,21 @@ class UDPPort : public Port {
}
protected:
- UDPPort(rtc::Thread* thread, rtc::PacketSocketFactory* factory,
- rtc::Network* network, const rtc::IPAddress& ip,
- int min_port, int max_port,
- const std::string& username, const std::string& password);
-
- UDPPort(rtc::Thread* thread, rtc::PacketSocketFactory* factory,
- rtc::Network* network, rtc::AsyncPacketSocket* socket,
- const std::string& username, const std::string& password);
+ UDPPort(rtc::Thread* thread,
+ rtc::PacketSocketFactory* factory,
+ rtc::Network* network,
+ const rtc::IPAddress& ip,
+ uint16 min_port,
+ uint16 max_port,
+ const std::string& username,
+ const std::string& password);
+
+ UDPPort(rtc::Thread* thread,
+ rtc::PacketSocketFactory* factory,
+ rtc::Network* network,
+ rtc::AsyncPacketSocket* socket,
+ const std::string& username,
+ const std::string& password);
bool Init();
@@ -194,18 +201,16 @@ class UDPPort : public Port {
class StunPort : public UDPPort {
public:
- static StunPort* Create(
- rtc::Thread* thread,
- rtc::PacketSocketFactory* factory,
- rtc::Network* network,
- const rtc::IPAddress& ip,
- int min_port, int max_port,
- const std::string& username,
- const std::string& password,
- const ServerAddresses& servers) {
- StunPort* port = new StunPort(thread, factory, network,
- ip, min_port, max_port,
- username, password, servers);
+ static StunPort* Create(rtc::Thread* thread,
+ rtc::PacketSocketFactory* factory,
+ rtc::Network* network,
+ const rtc::IPAddress& ip,
+ uint16 min_port, uint16 max_port,
+ const std::string& username,
+ const std::string& password,
+ const ServerAddresses& servers) {
+ StunPort* port = new StunPort(thread, factory, network, ip, min_port,
+ max_port, username, password, servers);
if (!port->Init()) {
delete port;
port = NULL;
@@ -220,10 +225,14 @@ class StunPort : public UDPPort {
}
protected:
- StunPort(rtc::Thread* thread, rtc::PacketSocketFactory* factory,
- rtc::Network* network, const rtc::IPAddress& ip,
- int min_port, int max_port,
- const std::string& username, const std::string& password,
+ StunPort(rtc::Thread* thread,
+ rtc::PacketSocketFactory* factory,
+ rtc::Network* network,
+ const rtc::IPAddress& ip,
+ uint16 min_port,
+ uint16 max_port,
+ const std::string& username,
+ const std::string& password,
const ServerAddresses& servers)
: UDPPort(thread, factory, network, ip, min_port, max_port, username,
password) {
diff --git a/p2p/base/tcpport.cc b/p2p/base/tcpport.cc
index be3068be..b37f4d3f 100644
--- a/p2p/base/tcpport.cc
+++ b/p2p/base/tcpport.cc
@@ -18,9 +18,13 @@ namespace cricket {
TCPPort::TCPPort(rtc::Thread* thread,
rtc::PacketSocketFactory* factory,
- rtc::Network* network, const rtc::IPAddress& ip,
- int min_port, int max_port, const std::string& username,
- const std::string& password, bool allow_listen)
+ rtc::Network* network,
+ const rtc::IPAddress& ip,
+ uint16 min_port,
+ uint16 max_port,
+ const std::string& username,
+ const std::string& password,
+ bool allow_listen)
: Port(thread, LOCAL_PORT_TYPE, factory, network, ip, min_port, max_port,
username, password),
incoming_only_(false),
diff --git a/p2p/base/tcpport.h b/p2p/base/tcpport.h
index 43e49366..b3655a80 100644
--- a/p2p/base/tcpport.h
+++ b/p2p/base/tcpport.h
@@ -32,13 +32,13 @@ class TCPPort : public Port {
rtc::PacketSocketFactory* factory,
rtc::Network* network,
const rtc::IPAddress& ip,
- int min_port, int max_port,
+ uint16 min_port,
+ uint16 max_port,
const std::string& username,
const std::string& password,
bool allow_listen) {
- TCPPort* port = new TCPPort(thread, factory, network,
- ip, min_port, max_port,
- username, password, allow_listen);
+ TCPPort* port = new TCPPort(thread, factory, network, ip, min_port,
+ max_port, username, password, allow_listen);
if (!port->Init()) {
delete port;
port = NULL;
@@ -57,10 +57,15 @@ class TCPPort : public Port {
virtual int GetError();
protected:
- TCPPort(rtc::Thread* thread, rtc::PacketSocketFactory* factory,
- rtc::Network* network, const rtc::IPAddress& ip,
- int min_port, int max_port, const std::string& username,
- const std::string& password, bool allow_listen);
+ TCPPort(rtc::Thread* thread,
+ rtc::PacketSocketFactory* factory,
+ rtc::Network* network,
+ const rtc::IPAddress& ip,
+ uint16 min_port,
+ uint16 max_port,
+ const std::string& username,
+ const std::string& password,
+ bool allow_listen);
bool Init();
// Handles sending using the local TCP socket.
diff --git a/p2p/base/turnport.cc b/p2p/base/turnport.cc
index e7626fe0..fbdcfeb6 100644
--- a/p2p/base/turnport.cc
+++ b/p2p/base/turnport.cc
@@ -184,7 +184,8 @@ TurnPort::TurnPort(rtc::Thread* thread,
rtc::PacketSocketFactory* factory,
rtc::Network* network,
const rtc::IPAddress& ip,
- int min_port, int max_port,
+ uint16 min_port,
+ uint16 max_port,
const std::string& username,
const std::string& password,
const ProtocolAddress& server_address,
diff --git a/p2p/base/turnport.h b/p2p/base/turnport.h
index 17fad176..4ed77a0c 100644
--- a/p2p/base/turnport.h
+++ b/p2p/base/turnport.h
@@ -42,16 +42,16 @@ class TurnPort : public Port {
const ProtocolAddress& server_address,
const RelayCredentials& credentials,
int server_priority) {
- return new TurnPort(thread, factory, network, socket,
- username, password, server_address,
- credentials, server_priority);
+ return new TurnPort(thread, factory, network, socket, username, password,
+ server_address, credentials, server_priority);
}
static TurnPort* Create(rtc::Thread* thread,
rtc::PacketSocketFactory* factory,
rtc::Network* network,
const rtc::IPAddress& ip,
- int min_port, int max_port,
+ uint16 min_port,
+ uint16 max_port,
const std::string& username, // ice username.
const std::string& password, // ice password.
const ProtocolAddress& server_address,
@@ -135,7 +135,8 @@ class TurnPort : public Port {
rtc::PacketSocketFactory* factory,
rtc::Network* network,
const rtc::IPAddress& ip,
- int min_port, int max_port,
+ uint16 min_port,
+ uint16 max_port,
const std::string& username,
const std::string& password,
const ProtocolAddress& server_address,
diff --git a/system_wrappers/source/trace_impl.cc b/system_wrappers/source/trace_impl.cc
index 13c63acf..d05b928a 100644
--- a/system_wrappers/source/trace_impl.cc
+++ b/system_wrappers/source/trace_impl.cc
@@ -553,15 +553,6 @@ void TraceImpl::WriteToFile() {
trace_file_.Write(message, length);
row_count_text_++;
}
- length = AddBuildInfo(message);
- if (length != -1) {
- message[length + 1] = 0;
- message[length] = '\n';
- message[length - 1] = '\n';
- trace_file_.Write(message, length + 1);
- row_count_text_++;
- row_count_text_++;
- }
}
uint16_t length = length_[local_queue_active][idx];
message_queue_[local_queue_active][idx][length] = 0;
diff --git a/system_wrappers/source/trace_impl.h b/system_wrappers/source/trace_impl.h
index 5548e984..5fa6ce38 100644
--- a/system_wrappers/source/trace_impl.h
+++ b/system_wrappers/source/trace_impl.h
@@ -72,7 +72,6 @@ class TraceImpl : public Trace {
virtual int32_t AddTime(char* trace_message,
const TraceLevel level) const = 0;
- virtual int32_t AddBuildInfo(char* trace_message) const = 0;
virtual int32_t AddDateTimeInfo(char* trace_message) const = 0;
static bool Run(void* obj);
diff --git a/system_wrappers/source/trace_posix.cc b/system_wrappers/source/trace_posix.cc
index d14704b6..1e0e1c81 100644
--- a/system_wrappers/source/trace_posix.cc
+++ b/system_wrappers/source/trace_posix.cc
@@ -17,20 +17,6 @@
#include <sys/time.h>
#include <time.h>
-#if defined(_DEBUG)
-#define BUILDMODE "d"
-#elif defined(DEBUG)
-#define BUILDMODE "d"
-#elif defined(NDEBUG)
-#define BUILDMODE "r"
-#else
-#define BUILDMODE "?"
-#endif
-#define BUILDTIME __TIME__
-#define BUILDDATE __DATE__
-// example: "Oct 10 2002 12:05:30 r"
-#define BUILDINFO BUILDDATE " " BUILDTIME " " BUILDMODE
-
namespace webrtc {
TracePosix::TracePosix()
@@ -86,12 +72,6 @@ int32_t TracePosix::AddTime(char* trace_message, const TraceLevel level) const {
return 22;
}
-int32_t TracePosix::AddBuildInfo(char* trace_message) const {
- sprintf(trace_message, "Build info: %s", BUILDINFO);
- // Include NULL termination (hence + 1).
- return strlen(trace_message) + 1;
-}
-
int32_t TracePosix::AddDateTimeInfo(char* trace_message) const {
time_t t;
time(&t);
diff --git a/system_wrappers/source/trace_posix.h b/system_wrappers/source/trace_posix.h
index 2056c704..2f0abc6e 100644
--- a/system_wrappers/source/trace_posix.h
+++ b/system_wrappers/source/trace_posix.h
@@ -26,7 +26,6 @@ class TracePosix : public TraceImpl {
virtual int32_t AddTime(char* trace_message, const TraceLevel level) const
OVERRIDE;
- virtual int32_t AddBuildInfo(char* trace_message) const OVERRIDE;
virtual int32_t AddDateTimeInfo(char* trace_message) const OVERRIDE;
private:
diff --git a/system_wrappers/source/trace_win.cc b/system_wrappers/source/trace_win.cc
index f1a03a54..3752659c 100644
--- a/system_wrappers/source/trace_win.cc
+++ b/system_wrappers/source/trace_win.cc
@@ -15,20 +15,6 @@
#include "Mmsystem.h"
-#if defined(_DEBUG)
-#define BUILDMODE "d"
-#elif defined(DEBUG)
-#define BUILDMODE "d"
-#elif defined(NDEBUG)
-#define BUILDMODE "r"
-#else
-#define BUILDMODE "?"
-#endif
-#define BUILDTIME __TIME__
-#define BUILDDATE __DATE__
-// Example: "Oct 10 2002 12:05:30 r"
-#define BUILDINFO BUILDDATE " " BUILDTIME " " BUILDMODE
-
namespace webrtc {
TraceWindows::TraceWindows()
: prev_api_tick_count_(0),
@@ -84,13 +70,6 @@ int32_t TraceWindows::AddTime(char* trace_message,
return 22;
}
-int32_t TraceWindows::AddBuildInfo(char* trace_message) const {
- // write data and time to text file
- sprintf(trace_message, "Build info: %s", BUILDINFO);
- // Include NULL termination (hence + 1).
- return static_cast<int32_t>(strlen(trace_message) + 1);
-}
-
int32_t TraceWindows::AddDateTimeInfo(char* trace_message) const {
prev_api_tick_count_ = timeGetTime();
prev_tick_count_ = prev_api_tick_count_;
diff --git a/system_wrappers/source/trace_win.h b/system_wrappers/source/trace_win.h
index 1a871074..1311b23c 100644
--- a/system_wrappers/source/trace_win.h
+++ b/system_wrappers/source/trace_win.h
@@ -25,7 +25,6 @@ class TraceWindows : public TraceImpl {
virtual int32_t AddTime(char* trace_message, const TraceLevel level) const;
- virtual int32_t AddBuildInfo(char* trace_message) const;
virtual int32_t AddDateTimeInfo(char* trace_message) const;
private:
volatile mutable uint32_t prev_api_tick_count_;
diff --git a/test/BUILD.gn b/test/BUILD.gn
index db17c31e..870404e7 100644
--- a/test/BUILD.gn
+++ b/test/BUILD.gn
@@ -67,10 +67,7 @@ source_set("test_support") {
]
if (is_android) {
- sources += [ "testsupport/android/root_path_android_chromium.cc" ]
deps += [ "//base:base" ]
- } else {
- sources += [ "testsupport/android/root_path_android.cc" ]
}
configs += [ "..:common_config" ]
diff --git a/test/encoder_settings.cc b/test/encoder_settings.cc
index db064bb8..bae13505 100644
--- a/test/encoder_settings.cc
+++ b/test/encoder_settings.cc
@@ -60,6 +60,8 @@ VideoReceiveStream::Decoder CreateMatchingDecoder(
decoder.payload_name = encoder_settings.payload_name;
if (encoder_settings.payload_name == "VP8") {
decoder.decoder = VideoDecoder::Create(VideoDecoder::kVp8);
+ } else if (encoder_settings.payload_name == "VP9") {
+ decoder.decoder = VideoDecoder::Create(VideoDecoder::kVp9);
} else {
decoder.decoder = new FakeDecoder();
}
diff --git a/test/fake_encoder.cc b/test/fake_encoder.cc
index 9551c820..0573c8af 100644
--- a/test/fake_encoder.cc
+++ b/test/fake_encoder.cc
@@ -51,7 +51,8 @@ int32_t FakeEncoder::Encode(
assert(config_.maxFramerate > 0);
int time_since_last_encode_ms = 1000 / config_.maxFramerate;
int64_t time_now_ms = clock_->TimeInMilliseconds();
- if (last_encode_time_ms_ > 0) {
+ const bool first_encode = last_encode_time_ms_ == 0;
+ if (!first_encode) {
// For all frames but the first we can estimate the display time by looking
// at the display time of the previous frame.
time_since_last_encode_ms = time_now_ms - last_encode_time_ms_;
@@ -80,6 +81,12 @@ int32_t FakeEncoder::Encode(
int stream_bits = (bits_available > max_stream_bits) ? max_stream_bits :
bits_available;
int stream_bytes = (stream_bits + 7) / 8;
+ if (first_encode) {
+ // The first frame is a key frame and should be larger.
+ // TODO(holmer): The FakeEncoder should store the bits_available between
+ // encodes so that it can compensate for oversized frames.
+ stream_bytes *= 10;
+ }
if (static_cast<size_t>(stream_bytes) > sizeof(encoded_buffer_))
stream_bytes = sizeof(encoded_buffer_);
@@ -96,7 +103,6 @@ int32_t FakeEncoder::Encode(
assert(callback_ != NULL);
if (callback_->Encoded(encoded, &specifics, NULL) != 0)
return -1;
-
bits_available -= encoded._length * 8;
}
return 0;
diff --git a/test/test.gyp b/test/test.gyp
index 5c959b9e..7aba2f57 100644
--- a/test/test.gyp
+++ b/test/test.gyp
@@ -98,8 +98,6 @@
'<(webrtc_root)/system_wrappers/source/system_wrappers.gyp:system_wrappers',
],
'sources': [
- 'testsupport/android/root_path_android.cc',
- 'testsupport/android/root_path_android_chromium.cc',
'testsupport/fileutils.cc',
'testsupport/fileutils.h',
'testsupport/frame_reader.cc',
@@ -117,20 +115,6 @@
'testsupport/trace_to_stderr.cc',
'testsupport/trace_to_stderr.h',
],
- 'conditions': [
- ['OS=="android"', {
- 'dependencies': [
- '<(DEPTH)/base/base.gyp:base',
- ],
- 'sources!': [
- 'testsupport/android/root_path_android.cc',
- ],
- }, {
- 'sources!': [
- 'testsupport/android/root_path_android_chromium.cc',
- ],
- }],
- ],
},
{
# Depend on this target when you want to have test_support but also the
diff --git a/test/testsupport/android/root_path_android.cc b/test/testsupport/android/root_path_android.cc
deleted file mode 100644
index 6eca5f57..00000000
--- a/test/testsupport/android/root_path_android.cc
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#include <string>
-
-namespace webrtc {
-namespace test {
-
-static const char* kRootDirName = "/sdcard/";
-std::string ProjectRootPathAndroid() {
- return kRootDirName;
-}
-
-std::string OutputPathAndroid() {
- return kRootDirName;
-}
-
-} // namespace test
-} // namespace webrtc
diff --git a/test/testsupport/android/root_path_android_chromium.cc b/test/testsupport/android/root_path_android_chromium.cc
deleted file mode 100644
index f8e65f4f..00000000
--- a/test/testsupport/android/root_path_android_chromium.cc
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#include "base/android/path_utils.h"
-#include "base/files/file_path.h"
-
-namespace webrtc {
-namespace test {
-
-std::string OutputPathImpl();
-
-// This file is only compiled when running WebRTC tests in a Chromium workspace.
-// The Android testing framework will push files relative to the root path of
-// the Chromium workspace. The root path for webrtc is one directory up from
-// trunk/webrtc (in standalone) or src/third_party/webrtc (in Chromium).
-std::string ProjectRootPathAndroid() {
- base::FilePath root_path;
- base::android::GetExternalStorageDirectory(&root_path);
- return root_path.value() + "/";
-}
-
-std::string OutputPathAndroid() {
- return OutputPathImpl();
-}
-
-} // namespace test
-} // namespace webrtc
diff --git a/test/testsupport/fileutils.cc b/test/testsupport/fileutils.cc
index a3e66201..36ca391c 100644
--- a/test/testsupport/fileutils.cc
+++ b/test/testsupport/fileutils.cc
@@ -50,15 +50,15 @@ const char* kPathDelimiter = "/";
#endif
#ifdef WEBRTC_ANDROID
-const char* kResourcesDirName = "resources";
+const char* kRootDirName = "/sdcard/";
#else
// The file we're looking for to identify the project root dir.
const char* kProjectRootFileName = "DEPS";
-const char* kResourcesDirName = "resources";
+const char* kOutputDirName = "out";
+const char* kFallbackPath = "./";
#endif
+const char* kResourcesDirName = "resources";
-const char* kFallbackPath = "./";
-const char* kOutputDirName = "out";
char relative_dir_path[FILENAME_MAX];
bool relative_dir_path_set = false;
@@ -66,9 +66,6 @@ bool relative_dir_path_set = false;
const char* kCannotFindProjectRootDir = "ERROR_CANNOT_FIND_PROJECT_ROOT_DIR";
-std::string OutputPathAndroid();
-std::string ProjectRootPathAndroid();
-
void SetExecutablePath(const std::string& path) {
std::string working_dir = WorkingDir();
std::string temp_path = path;
@@ -95,30 +92,18 @@ bool FileExists(std::string& file_name) {
return stat(file_name.c_str(), &file_info) == 0;
}
-std::string OutputPathImpl() {
- std::string path = ProjectRootPath();
- if (path == kCannotFindProjectRootDir) {
- return kFallbackPath;
- }
- path += kOutputDirName;
- if (!CreateDir(path)) {
- return kFallbackPath;
- }
- return path + kPathDelimiter;
-}
-
#ifdef WEBRTC_ANDROID
std::string ProjectRootPath() {
- return ProjectRootPathAndroid();
+ return kRootDirName;
}
std::string OutputPath() {
- return OutputPathAndroid();
+ return kRootDirName;
}
std::string WorkingDir() {
- return ProjectRootPath();
+ return kRootDirName;
}
#else // WEBRTC_ANDROID
@@ -148,7 +133,15 @@ std::string ProjectRootPath() {
}
std::string OutputPath() {
- return OutputPathImpl();
+ std::string path = ProjectRootPath();
+ if (path == kCannotFindProjectRootDir) {
+ return kFallbackPath;
+ }
+ path += kOutputDirName;
+ if (!CreateDir(path)) {
+ return kFallbackPath;
+ }
+ return path + kPathDelimiter;
}
std::string WorkingDir() {
diff --git a/test/testsupport/fileutils_unittest.cc b/test/testsupport/fileutils_unittest.cc
index 114f1083..dff7f224 100644
--- a/test/testsupport/fileutils_unittest.cc
+++ b/test/testsupport/fileutils_unittest.cc
@@ -66,7 +66,7 @@ TEST_F(FileUtilsTest, ProjectRootPath) {
}
// Similar to the above test, but for the output dir
-TEST_F(FileUtilsTest, OutputPathFromUnchangedWorkingDir) {
+TEST_F(FileUtilsTest, DISABLED_ON_ANDROID(OutputPathFromUnchangedWorkingDir)) {
std::string path = webrtc::test::OutputPath();
std::string expected_end = "out";
expected_end = kPathDelimiter + expected_end + kPathDelimiter;
@@ -80,10 +80,11 @@ TEST_F(FileUtilsTest, DISABLED_ON_ANDROID(OutputPathFromRootWorkingDir)) {
ASSERT_EQ("./", webrtc::test::OutputPath());
}
-TEST_F(FileUtilsTest, DISABLED_ON_ANDROID(TempFilename)) {
+TEST_F(FileUtilsTest, TempFilename) {
std::string temp_filename = webrtc::test::TempFilename(
webrtc::test::OutputPath(), "TempFilenameTest");
- ASSERT_TRUE(webrtc::test::FileExists(temp_filename));
+ ASSERT_TRUE(webrtc::test::FileExists(temp_filename))
+ << "Couldn't find file: " << temp_filename;
remove(temp_filename.c_str());
}
diff --git a/video/call.cc b/video/call.cc
index fd41d75f..2b4f76f4 100644
--- a/video/call.cc
+++ b/video/call.cc
@@ -58,6 +58,8 @@ VideoDecoder* VideoDecoder::Create(VideoDecoder::DecoderType codec_type) {
switch (codec_type) {
case kVp8:
return VP8Decoder::Create();
+ case kVp9:
+ return VP9Decoder::Create();
}
assert(false);
return NULL;
@@ -112,8 +114,7 @@ class Call : public webrtc::Call, public PacketReceiver {
virtual void DestroyVideoReceiveStream(
webrtc::VideoReceiveStream* receive_stream) OVERRIDE;
- virtual uint32_t SendBitrateEstimate() OVERRIDE;
- virtual uint32_t ReceiveBitrateEstimate() OVERRIDE;
+ virtual Stats GetStats() const OVERRIDE;
virtual DeliveryStatus DeliverPacket(const uint8_t* packet,
size_t length) OVERRIDE;
@@ -319,14 +320,26 @@ void Call::DestroyVideoReceiveStream(
delete receive_stream_impl;
}
-uint32_t Call::SendBitrateEstimate() {
- // TODO(pbos): Return send-bitrate estimate
- return 0;
-}
-
-uint32_t Call::ReceiveBitrateEstimate() {
- // TODO(pbos): Return receive-bitrate estimate
- return 0;
+Call::Stats Call::GetStats() const {
+ Stats stats;
+ // Ignoring return values.
+ uint32_t send_bandwidth = 0;
+ rtp_rtcp_->GetEstimatedSendBandwidth(base_channel_id_, &send_bandwidth);
+ stats.send_bandwidth_bps = send_bandwidth;
+ uint32_t recv_bandwidth = 0;
+ rtp_rtcp_->GetEstimatedReceiveBandwidth(base_channel_id_, &recv_bandwidth);
+ stats.recv_bandwidth_bps = recv_bandwidth;
+ {
+ ReadLockScoped read_lock(*send_crit_);
+ for (std::map<uint32_t, VideoSendStream*>::const_iterator it =
+ send_ssrcs_.begin();
+ it != send_ssrcs_.end();
+ ++it) {
+ stats.pacer_delay_ms =
+ std::max(it->second->GetPacerQueuingDelayMs(), stats.pacer_delay_ms);
+ }
+ }
+ return stats;
}
void Call::SignalNetworkState(NetworkState state) {
diff --git a/video/call_perf_tests.cc b/video/call_perf_tests.cc
index 9776fb7e..9194b088 100644
--- a/video/call_perf_tests.cc
+++ b/video/call_perf_tests.cc
@@ -502,7 +502,8 @@ void CallPerfTest::TestMinTransmitBitrate(bool pad_to_min_bitrate) {
VideoSendStream::Stats stats = send_stream_->GetStats();
if (stats.substreams.size() > 0) {
assert(stats.substreams.size() == 1);
- int bitrate_kbps = stats.substreams.begin()->second.bitrate_bps / 1000;
+ int bitrate_kbps =
+ stats.substreams.begin()->second.total_bitrate_bps / 1000;
if (bitrate_kbps > 0) {
test::PrintResult(
"bitrate_stats_",
diff --git a/video/end_to_end_tests.cc b/video/end_to_end_tests.cc
index 96249c3c..2b3c00f5 100644
--- a/video/end_to_end_tests.cc
+++ b/video/end_to_end_tests.cc
@@ -225,8 +225,7 @@ TEST_F(EndToEndTest, TransmitsFirstFrame) {
DestroyStreams();
}
-// TODO(marpan): Re-enable this test on the next libvpx roll.
-TEST_F(EndToEndTest, DISABLED_SendsAndReceivesVP9) {
+TEST_F(EndToEndTest, SendsAndReceivesVP9) {
class VP9Observer : public test::EndToEndTest, public VideoRenderer {
public:
VP9Observer()
@@ -1202,6 +1201,53 @@ TEST_F(EndToEndTest, ReceiveStreamSendsRemb) {
RunBaseTest(&test);
}
+TEST_F(EndToEndTest, VerifyBandwidthStats) {
+ class RtcpObserver : public test::EndToEndTest, public PacketReceiver {
+ public:
+ RtcpObserver()
+ : EndToEndTest(kDefaultTimeoutMs),
+ sender_call_(NULL),
+ receiver_call_(NULL),
+ has_seen_pacer_delay_(false) {}
+
+ virtual DeliveryStatus DeliverPacket(const uint8_t* packet,
+ size_t length) OVERRIDE {
+ Call::Stats sender_stats = sender_call_->GetStats();
+ Call::Stats receiver_stats = receiver_call_->GetStats();
+ if (!has_seen_pacer_delay_)
+ has_seen_pacer_delay_ = sender_stats.pacer_delay_ms > 0;
+ if (sender_stats.send_bandwidth_bps > 0 &&
+ receiver_stats.recv_bandwidth_bps > 0 && has_seen_pacer_delay_)
+ observation_complete_->Set();
+ return receiver_call_->Receiver()->DeliverPacket(packet, length);
+ }
+
+ virtual void OnCallsCreated(Call* sender_call,
+ Call* receiver_call) OVERRIDE {
+ sender_call_ = sender_call;
+ receiver_call_ = receiver_call;
+ }
+
+ virtual void PerformTest() OVERRIDE {
+ EXPECT_EQ(kEventSignaled, Wait()) << "Timed out while waiting for "
+ "non-zero bandwidth stats.";
+ }
+
+ virtual void SetReceivers(
+ PacketReceiver* send_transport_receiver,
+ PacketReceiver* receive_transport_receiver) OVERRIDE {
+ test::RtpRtcpObserver::SetReceivers(this, receive_transport_receiver);
+ }
+
+ private:
+ Call* sender_call_;
+ Call* receiver_call_;
+ bool has_seen_pacer_delay_;
+ } test;
+
+ RunBaseTest(&test);
+}
+
void EndToEndTest::TestXrReceiverReferenceTimeReport(bool enable_rrtr) {
static const int kNumRtcpReportPacketsToObserve = 5;
class RtcpXrObserver : public test::EndToEndTest {
@@ -1434,7 +1480,7 @@ TEST_F(EndToEndTest, GetStats) {
// Make sure all fields have been populated.
receive_stats_filled_["IncomingRate"] |=
- stats.network_frame_rate != 0 || stats.bitrate_bps != 0;
+ stats.network_frame_rate != 0 || stats.total_bitrate_bps != 0;
receive_stats_filled_["FrameCallback"] |= stats.decode_frame_rate != 0;
@@ -1465,7 +1511,7 @@ TEST_F(EndToEndTest, GetStats) {
send_stats_filled_["NumStreams"] |=
stats.substreams.size() == expected_send_ssrcs_.size();
- for (std::map<uint32_t, StreamStats>::const_iterator it =
+ for (std::map<uint32_t, SsrcStats>::const_iterator it =
stats.substreams.begin();
it != stats.substreams.end();
++it) {
@@ -1475,7 +1521,7 @@ TEST_F(EndToEndTest, GetStats) {
send_stats_filled_[CompoundKey("IncomingRate", it->first)] |=
stats.input_frame_rate != 0;
- const StreamStats& stream_stats = it->second;
+ const SsrcStats& stream_stats = it->second;
send_stats_filled_[CompoundKey("StatisticsUpdated", it->first)] |=
stream_stats.rtcp_stats.cumulative_lost != 0 ||
@@ -1490,7 +1536,7 @@ TEST_F(EndToEndTest, GetStats) {
send_stats_filled_[CompoundKey("BitrateStatisticsObserver",
it->first)] |=
- stream_stats.bitrate_bps != 0;
+ stream_stats.total_bitrate_bps != 0;
send_stats_filled_[CompoundKey("FrameCountObserver", it->first)] |=
stream_stats.delta_frames != 0 || stream_stats.key_frames != 0;
diff --git a/video/loopback.cc b/video/loopback.cc
index 4b49c31e..8013833d 100644
--- a/video/loopback.cc
+++ b/video/loopback.cc
@@ -142,6 +142,8 @@ void Loopback() {
scoped_ptr<VideoEncoder> encoder;
if (flags::Codec() == "VP8") {
encoder.reset(VideoEncoder::Create(VideoEncoder::kVp8));
+ } else if (flags::Codec() == "VP9") {
+ encoder.reset(VideoEncoder::Create(VideoEncoder::kVp9));
} else {
// Codec not supported.
assert(false && "Codec not supported!");
diff --git a/video/receive_statistics_proxy.cc b/video/receive_statistics_proxy.cc
index 38262834..ca0bcdfb 100644
--- a/video/receive_statistics_proxy.cc
+++ b/video/receive_statistics_proxy.cc
@@ -58,10 +58,10 @@ std::string ReceiveStatisticsProxy::GetCName() const {
void ReceiveStatisticsProxy::IncomingRate(const int video_channel,
const unsigned int framerate,
- const unsigned int bitrate) {
+ const unsigned int bitrate_bps) {
CriticalSectionScoped lock(crit_.get());
stats_.network_frame_rate = framerate;
- stats_.bitrate_bps = bitrate;
+ stats_.total_bitrate_bps = bitrate_bps;
}
void ReceiveStatisticsProxy::StatisticsUpdated(
diff --git a/video/receive_statistics_proxy.h b/video/receive_statistics_proxy.h
index b5fbf860..a1b6735b 100644
--- a/video/receive_statistics_proxy.h
+++ b/video/receive_statistics_proxy.h
@@ -52,7 +52,7 @@ class ReceiveStatisticsProxy : public ViEDecoderObserver,
const VideoCodec& video_codec) OVERRIDE {}
virtual void IncomingRate(const int video_channel,
const unsigned int framerate,
- const unsigned int bitrate) OVERRIDE;
+ const unsigned int bitrate_bps) OVERRIDE;
virtual void DecoderTiming(int decode_ms,
int max_decode_ms,
int current_delay_ms,
diff --git a/video/send_statistics_proxy.cc b/video/send_statistics_proxy.cc
index 1b6081d2..f2df0ed2 100644
--- a/video/send_statistics_proxy.cc
+++ b/video/send_statistics_proxy.cc
@@ -29,6 +29,7 @@ void SendStatisticsProxy::OutgoingRate(const int video_channel,
const unsigned int bitrate) {
CriticalSectionScoped lock(crit_.get());
stats_.encode_frame_rate = framerate;
+ stats_.media_bitrate_bps = bitrate;
}
void SendStatisticsProxy::SuspendChange(int video_channel, bool is_suspended) {
@@ -47,8 +48,8 @@ VideoSendStream::Stats SendStatisticsProxy::GetStats() const {
return stats_;
}
-StreamStats* SendStatisticsProxy::GetStatsEntry(uint32_t ssrc) {
- std::map<uint32_t, StreamStats>::iterator it = stats_.substreams.find(ssrc);
+SsrcStats* SendStatisticsProxy::GetStatsEntry(uint32_t ssrc) {
+ std::map<uint32_t, SsrcStats>::iterator it = stats_.substreams.find(ssrc);
if (it != stats_.substreams.end())
return &it->second;
@@ -66,7 +67,7 @@ StreamStats* SendStatisticsProxy::GetStatsEntry(uint32_t ssrc) {
void SendStatisticsProxy::StatisticsUpdated(const RtcpStatistics& statistics,
uint32_t ssrc) {
CriticalSectionScoped lock(crit_.get());
- StreamStats* stats = GetStatsEntry(ssrc);
+ SsrcStats* stats = GetStatsEntry(ssrc);
if (stats == NULL)
return;
@@ -77,28 +78,30 @@ void SendStatisticsProxy::DataCountersUpdated(
const StreamDataCounters& counters,
uint32_t ssrc) {
CriticalSectionScoped lock(crit_.get());
- StreamStats* stats = GetStatsEntry(ssrc);
+ SsrcStats* stats = GetStatsEntry(ssrc);
if (stats == NULL)
return;
stats->rtp_stats = counters;
}
-void SendStatisticsProxy::Notify(const BitrateStatistics& bitrate,
+void SendStatisticsProxy::Notify(const BitrateStatistics& total_stats,
+ const BitrateStatistics& retransmit_stats,
uint32_t ssrc) {
CriticalSectionScoped lock(crit_.get());
- StreamStats* stats = GetStatsEntry(ssrc);
+ SsrcStats* stats = GetStatsEntry(ssrc);
if (stats == NULL)
return;
- stats->bitrate_bps = bitrate.bitrate_bps;
+ stats->total_bitrate_bps = total_stats.bitrate_bps;
+ stats->retransmit_bitrate_bps = retransmit_stats.bitrate_bps;
}
void SendStatisticsProxy::FrameCountUpdated(FrameType frame_type,
uint32_t frame_count,
const unsigned int ssrc) {
CriticalSectionScoped lock(crit_.get());
- StreamStats* stats = GetStatsEntry(ssrc);
+ SsrcStats* stats = GetStatsEntry(ssrc);
if (stats == NULL)
return;
@@ -120,7 +123,7 @@ void SendStatisticsProxy::SendSideDelayUpdated(int avg_delay_ms,
int max_delay_ms,
uint32_t ssrc) {
CriticalSectionScoped lock(crit_.get());
- StreamStats* stats = GetStatsEntry(ssrc);
+ SsrcStats* stats = GetStatsEntry(ssrc);
if (stats == NULL)
return;
stats->avg_delay_ms = avg_delay_ms;
diff --git a/video/send_statistics_proxy.h b/video/send_statistics_proxy.h
index ef459dab..2f645b1e 100644
--- a/video/send_statistics_proxy.h
+++ b/video/send_statistics_proxy.h
@@ -46,7 +46,9 @@ class SendStatisticsProxy : public RtcpStatisticsCallback,
uint32_t ssrc) OVERRIDE;
// From BitrateStatisticsObserver.
- virtual void Notify(const BitrateStatistics& stats, uint32_t ssrc) OVERRIDE;
+ virtual void Notify(const BitrateStatistics& total_stats,
+ const BitrateStatistics& retransmit_stats,
+ uint32_t ssrc) OVERRIDE;
// From FrameCountObserver.
virtual void FrameCountUpdated(FrameType frame_type,
@@ -75,7 +77,7 @@ class SendStatisticsProxy : public RtcpStatisticsCallback,
uint32_t ssrc) OVERRIDE;
private:
- StreamStats* GetStatsEntry(uint32_t ssrc) EXCLUSIVE_LOCKS_REQUIRED(crit_);
+ SsrcStats* GetStatsEntry(uint32_t ssrc) EXCLUSIVE_LOCKS_REQUIRED(crit_);
const VideoSendStream::Config config_;
scoped_ptr<CriticalSectionWrapper> crit_;
diff --git a/video/send_statistics_proxy_unittest.cc b/video/send_statistics_proxy_unittest.cc
index f768452f..d7750f8a 100644
--- a/video/send_statistics_proxy_unittest.cc
+++ b/video/send_statistics_proxy_unittest.cc
@@ -44,22 +44,23 @@ class SendStatisticsProxyTest : public ::testing::Test {
void ExpectEqual(VideoSendStream::Stats one, VideoSendStream::Stats other) {
EXPECT_EQ(one.input_frame_rate, other.input_frame_rate);
EXPECT_EQ(one.encode_frame_rate, other.encode_frame_rate);
+ EXPECT_EQ(one.media_bitrate_bps, other.media_bitrate_bps);
EXPECT_EQ(one.suspended, other.suspended);
EXPECT_EQ(one.substreams.size(), other.substreams.size());
- for (std::map<uint32_t, StreamStats>::const_iterator it =
+ for (std::map<uint32_t, SsrcStats>::const_iterator it =
one.substreams.begin();
it != one.substreams.end();
++it) {
- std::map<uint32_t, StreamStats>::const_iterator corresponding_it =
+ std::map<uint32_t, SsrcStats>::const_iterator corresponding_it =
other.substreams.find(it->first);
ASSERT_TRUE(corresponding_it != other.substreams.end());
- const StreamStats& a = it->second;
- const StreamStats& b = corresponding_it->second;
+ const SsrcStats& a = it->second;
+ const SsrcStats& b = corresponding_it->second;
EXPECT_EQ(a.key_frames, b.key_frames);
EXPECT_EQ(a.delta_frames, b.delta_frames);
- EXPECT_EQ(a.bitrate_bps, b.bitrate_bps);
+ EXPECT_EQ(a.total_bitrate_bps, b.total_bitrate_bps);
EXPECT_EQ(a.avg_delay_ms, b.avg_delay_ms);
EXPECT_EQ(a.max_delay_ms, b.max_delay_ms);
@@ -84,7 +85,7 @@ class SendStatisticsProxyTest : public ::testing::Test {
int avg_delay_ms_;
int max_delay_ms_;
VideoSendStream::Stats expected_;
- typedef std::map<uint32_t, StreamStats>::const_iterator StreamIterator;
+ typedef std::map<uint32_t, SsrcStats>::const_iterator StreamIterator;
};
TEST_F(SendStatisticsProxyTest, RtcpStatistics) {
@@ -93,7 +94,7 @@ TEST_F(SendStatisticsProxyTest, RtcpStatistics) {
it != config_.rtp.ssrcs.end();
++it) {
const uint32_t ssrc = *it;
- StreamStats& ssrc_stats = expected_.substreams[ssrc];
+ SsrcStats& ssrc_stats = expected_.substreams[ssrc];
// Add statistics with some arbitrary, but unique, numbers.
uint32_t offset = ssrc * sizeof(RtcpStatistics);
@@ -107,7 +108,7 @@ TEST_F(SendStatisticsProxyTest, RtcpStatistics) {
it != config_.rtp.rtx.ssrcs.end();
++it) {
const uint32_t ssrc = *it;
- StreamStats& ssrc_stats = expected_.substreams[ssrc];
+ SsrcStats& ssrc_stats = expected_.substreams[ssrc];
// Add statistics with some arbitrary, but unique, numbers.
uint32_t offset = ssrc * sizeof(RtcpStatistics);
@@ -121,17 +122,25 @@ TEST_F(SendStatisticsProxyTest, RtcpStatistics) {
ExpectEqual(expected_, stats);
}
-TEST_F(SendStatisticsProxyTest, FrameRates) {
+TEST_F(SendStatisticsProxyTest, CaptureFramerate) {
const int capture_fps = 31;
- const int encode_fps = 29;
ViECaptureObserver* capture_observer = statistics_proxy_.get();
capture_observer->CapturedFrameRate(0, capture_fps);
- ViEEncoderObserver* encoder_observer = statistics_proxy_.get();
- encoder_observer->OutgoingRate(0, encode_fps, 0);
VideoSendStream::Stats stats = statistics_proxy_->GetStats();
EXPECT_EQ(capture_fps, stats.input_frame_rate);
+}
+
+TEST_F(SendStatisticsProxyTest, EncodedBitrateAndFramerate) {
+ const int media_bitrate_bps = 500;
+ const int encode_fps = 29;
+
+ ViEEncoderObserver* encoder_observer = statistics_proxy_.get();
+ encoder_observer->OutgoingRate(0, encode_fps, media_bitrate_bps);
+
+ VideoSendStream::Stats stats = statistics_proxy_->GetStats();
+ EXPECT_EQ(media_bitrate_bps, stats.media_bitrate_bps);
EXPECT_EQ(encode_fps, stats.encode_frame_rate);
}
@@ -156,8 +165,8 @@ TEST_F(SendStatisticsProxyTest, FrameCounts) {
++it) {
const uint32_t ssrc = *it;
// Add statistics with some arbitrary, but unique, numbers.
- StreamStats& stats = expected_.substreams[ssrc];
- uint32_t offset = ssrc * sizeof(StreamStats);
+ SsrcStats& stats = expected_.substreams[ssrc];
+ uint32_t offset = ssrc * sizeof(SsrcStats);
stats.key_frames = offset;
stats.delta_frames = offset + 1;
observer->FrameCountUpdated(kVideoFrameKey, stats.key_frames, ssrc);
@@ -168,8 +177,8 @@ TEST_F(SendStatisticsProxyTest, FrameCounts) {
++it) {
const uint32_t ssrc = *it;
// Add statistics with some arbitrary, but unique, numbers.
- StreamStats& stats = expected_.substreams[ssrc];
- uint32_t offset = ssrc * sizeof(StreamStats);
+ SsrcStats& stats = expected_.substreams[ssrc];
+ uint32_t offset = ssrc * sizeof(SsrcStats);
stats.key_frames = offset;
stats.delta_frames = offset + 1;
observer->FrameCountUpdated(kVideoFrameKey, stats.key_frames, ssrc);
@@ -223,21 +232,27 @@ TEST_F(SendStatisticsProxyTest, Bitrate) {
it != config_.rtp.ssrcs.end();
++it) {
const uint32_t ssrc = *it;
- BitrateStatistics bitrate;
+ BitrateStatistics total;
+ BitrateStatistics retransmit;
// Use ssrc as bitrate_bps to get a unique value for each stream.
- bitrate.bitrate_bps = ssrc;
- observer->Notify(bitrate, ssrc);
- expected_.substreams[ssrc].bitrate_bps = ssrc;
+ total.bitrate_bps = ssrc;
+ retransmit.bitrate_bps = ssrc + 1;
+ observer->Notify(total, retransmit, ssrc);
+ expected_.substreams[ssrc].total_bitrate_bps = total.bitrate_bps;
+ expected_.substreams[ssrc].retransmit_bitrate_bps = retransmit.bitrate_bps;
}
for (std::vector<uint32_t>::const_iterator it = config_.rtp.rtx.ssrcs.begin();
it != config_.rtp.rtx.ssrcs.end();
++it) {
const uint32_t ssrc = *it;
- BitrateStatistics bitrate;
+ BitrateStatistics total;
+ BitrateStatistics retransmit;
// Use ssrc as bitrate_bps to get a unique value for each stream.
- bitrate.bitrate_bps = ssrc;
- observer->Notify(bitrate, ssrc);
- expected_.substreams[ssrc].bitrate_bps = ssrc;
+ total.bitrate_bps = ssrc;
+ retransmit.bitrate_bps = ssrc + 1;
+ observer->Notify(total, retransmit, ssrc);
+ expected_.substreams[ssrc].total_bitrate_bps = total.bitrate_bps;
+ expected_.substreams[ssrc].retransmit_bitrate_bps = retransmit.bitrate_bps;
}
VideoSendStream::Stats stats = statistics_proxy_->GetStats();
@@ -292,9 +307,10 @@ TEST_F(SendStatisticsProxyTest, NoSubstreams) {
rtp_callback->DataCountersUpdated(rtp_stats, exluded_ssrc);
// From BitrateStatisticsObserver.
- BitrateStatistics bitrate;
+ BitrateStatistics total;
+ BitrateStatistics retransmit;
BitrateStatisticsObserver* bitrate_observer = statistics_proxy_.get();
- bitrate_observer->Notify(bitrate, exluded_ssrc);
+ bitrate_observer->Notify(total, retransmit, exluded_ssrc);
// From FrameCountObserver.
FrameCountObserver* fps_observer = statistics_proxy_.get();
diff --git a/video/video_send_stream.cc b/video/video_send_stream.cc
index 28231b00..489cd140 100644
--- a/video/video_send_stream.cc
+++ b/video/video_send_stream.cc
@@ -492,5 +492,12 @@ void VideoSendStream::SignalNetworkState(Call::NetworkState state) {
rtp_rtcp_->SetRTCPStatus(channel_, kRtcpNone);
}
+int VideoSendStream::GetPacerQueuingDelayMs() const {
+ int pacer_delay_ms = 0;
+ if (rtp_rtcp_->GetPacerQueuingDelayMs(channel_, &pacer_delay_ms) != 0) {
+ return 0;
+ }
+ return pacer_delay_ms;
+}
} // namespace internal
} // namespace webrtc
diff --git a/video/video_send_stream.h b/video/video_send_stream.h
index f7874308..873785dc 100644
--- a/video/video_send_stream.h
+++ b/video/video_send_stream.h
@@ -74,6 +74,8 @@ class VideoSendStream : public webrtc::VideoSendStream,
void SignalNetworkState(Call::NetworkState state);
+ int GetPacerQueuingDelayMs() const;
+
private:
void ConfigureSsrcs();
TransportAdapter transport_adapter_;
diff --git a/video/video_send_stream_tests.cc b/video/video_send_stream_tests.cc
index b863957b..3ab11274 100644
--- a/video/video_send_stream_tests.cc
+++ b/video/video_send_stream_tests.cc
@@ -962,8 +962,8 @@ TEST_F(VideoSendStreamTest, ProducesStats) {
config_.rtp.ssrcs.begin(), config_.rtp.ssrcs.end(), ssrc));
// Check for data populated by various sources. RTCP excluded as this
// data is received from remote side. Tested in call tests instead.
- const StreamStats& entry = stats.substreams[ssrc];
- if (entry.key_frames > 0u && entry.bitrate_bps > 0 &&
+ const SsrcStats& entry = stats.substreams[ssrc];
+ if (entry.key_frames > 0u && entry.total_bitrate_bps > 0 &&
entry.rtp_stats.packets > 0u && entry.avg_delay_ms > 0 &&
entry.max_delay_ms > 0) {
return true;
@@ -1045,20 +1045,20 @@ TEST_F(VideoSendStreamTest, MinTransmitBitrateRespectsRemb) {
VideoSendStream::Stats stats = stream_->GetStats();
if (!stats.substreams.empty()) {
EXPECT_EQ(1u, stats.substreams.size());
- int bitrate_bps = stats.substreams.begin()->second.bitrate_bps;
- test::PrintResult(
- "bitrate_stats_",
- "min_transmit_bitrate_low_remb",
- "bitrate_bps",
- static_cast<size_t>(bitrate_bps),
- "bps",
- false);
- if (bitrate_bps > kHighBitrateBps) {
+ int total_bitrate_bps =
+ stats.substreams.begin()->second.total_bitrate_bps;
+ test::PrintResult("bitrate_stats_",
+ "min_transmit_bitrate_low_remb",
+ "bitrate_bps",
+ static_cast<size_t>(total_bitrate_bps),
+ "bps",
+ false);
+ if (total_bitrate_bps > kHighBitrateBps) {
rtp_rtcp_->SetREMBData(kRembBitrateBps, 1, &header.ssrc);
rtp_rtcp_->Process();
bitrate_capped_ = true;
} else if (bitrate_capped_ &&
- bitrate_bps < kRembRespectedBitrateBps) {
+ total_bitrate_bps < kRembRespectedBitrateBps) {
observation_complete_->Set();
}
}
diff --git a/video_decoder.h b/video_decoder.h
index 03a564e3..941c0ac1 100644
--- a/video_decoder.h
+++ b/video_decoder.h
@@ -40,6 +40,7 @@ class VideoDecoder {
public:
enum DecoderType {
kVp8,
+ kVp9
};
static VideoDecoder* Create(DecoderType codec_type);
diff --git a/video_engine/vie_base_impl.cc b/video_engine/vie_base_impl.cc
index cf64eada..81c748af 100644
--- a/video_engine/vie_base_impl.cc
+++ b/video_engine/vie_base_impl.cc
@@ -10,7 +10,6 @@
#include "webrtc/video_engine/vie_base_impl.h"
-#include <sstream>
#include <string>
#include <utility>
@@ -329,23 +328,8 @@ int ViEBaseImpl::StopReceive(const int video_channel) {
}
int ViEBaseImpl::GetVersion(char version[1024]) {
- assert(kViEVersionMaxMessageSize == 1024);
- if (!version) {
- shared_data_.SetLastError(kViEBaseInvalidArgument);
- return -1;
- }
-
- // Add WebRTC Version.
- std::stringstream version_stream;
- version_stream << "VideoEngine 39" << std::endl;
-
- // Add build info.
- version_stream << "Build: " << BUILDINFO << std::endl;
-
- int version_length = version_stream.tellp();
- assert(version_length < 1024);
- memcpy(version, version_stream.str().c_str(), version_length);
- version[version_length] = '\0';
+ assert(version != NULL);
+ strcpy(version, "VideoEngine 39");
return 0;
}
diff --git a/video_engine/vie_base_impl.h b/video_engine/vie_base_impl.h
index 20fd6159..0ae7818d 100644
--- a/video_engine/vie_base_impl.h
+++ b/video_engine/vie_base_impl.h
@@ -64,11 +64,6 @@ class ViEBaseImpl
ViESharedData* shared_data() { return &shared_data_; }
private:
- // Version functions.
- int32_t AddViEVersion(char* str) const;
- int32_t AddBuildInfo(char* str) const;
- int32_t AddExternalTransportBuild(char* str) const;
-
int CreateChannel(int& video_channel, int original_channel, // NOLINT
bool sender);
diff --git a/video_engine/vie_channel.h b/video_engine/vie_channel.h
index 03279069..3b8d96a2 100644
--- a/video_engine/vie_channel.h
+++ b/video_engine/vie_channel.h
@@ -415,10 +415,12 @@ class ViEChannel
class RegisterableBitrateStatisticsObserver:
public RegisterableCallback<BitrateStatisticsObserver> {
- virtual void Notify(const BitrateStatistics& stats, uint32_t ssrc) {
+ virtual void Notify(const BitrateStatistics& total_stats,
+ const BitrateStatistics& retransmit_stats,
+ uint32_t ssrc) {
CriticalSectionScoped cs(critsect_.get());
if (callback_)
- callback_->Notify(stats, ssrc);
+ callback_->Notify(total_stats, retransmit_stats, ssrc);
}
}
send_bitrate_observer_;
diff --git a/video_engine/vie_defines.h b/video_engine/vie_defines.h
index 7bfed465..74b5e1a7 100644
--- a/video_engine/vie_defines.h
+++ b/video_engine/vie_defines.h
@@ -35,8 +35,6 @@ enum { kViEMinKeyRequestIntervalMs = 300 };
// ViEBase
enum { kViEMaxNumberOfChannels = 64 };
-enum { kViEVersionMaxMessageSize = 1024 };
-enum { kViEMaxModuleVersionSize = 960 };
// ViECapture
enum { kViEMaxCaptureDevices = 256 };
@@ -101,21 +99,6 @@ inline int ChannelId(const int moduleId) {
return static_cast<int>(moduleId & 0xffff);
}
-// Build information macros
-#if defined(_DEBUG) || defined(DEBUG)
-#define BUILDMODE "d"
-#elif defined(NDEBUG)
-#define BUILDMODE "r"
-#else
-#define BUILDMODE "?"
-#endif
-
-#define BUILDTIME __TIME__
-#define BUILDDATE __DATE__
-
-// Example: "Oct 10 2002 12:05:30 r".
-#define BUILDINFO BUILDDATE " " BUILDTIME " " BUILDMODE
-
// Windows specific.
#if defined(_WIN32)
#define RENDER_MODULE_TYPE kRenderWindows
diff --git a/video_receive_stream.h b/video_receive_stream.h
index 5ab898c7..a8620d98 100644
--- a/video_receive_stream.h
+++ b/video_receive_stream.h
@@ -63,7 +63,7 @@ class VideoReceiveStream {
int expected_delay_ms;
};
- struct Stats : public StreamStats {
+ struct Stats : public SsrcStats {
Stats()
: network_frame_rate(0),
decode_frame_rate(0),
diff --git a/video_send_stream.h b/video_send_stream.h
index aa5033af..a9aba945 100644
--- a/video_send_stream.h
+++ b/video_send_stream.h
@@ -41,11 +41,13 @@ class VideoSendStream {
Stats()
: input_frame_rate(0),
encode_frame_rate(0),
+ media_bitrate_bps(0),
suspended(false) {}
int input_frame_rate;
int encode_frame_rate;
+ int media_bitrate_bps;
bool suspended;
- std::map<uint32_t, StreamStats> substreams;
+ std::map<uint32_t, SsrcStats> substreams;
};
struct Config {
diff --git a/voice_engine/voe_base_impl.cc b/voice_engine/voe_base_impl.cc
index ad6314a7..17830950 100644
--- a/voice_engine/voe_base_impl.cc
+++ b/voice_engine/voe_base_impl.cc
@@ -777,15 +777,6 @@ int VoEBaseImpl::GetVersion(char version[1024])
accLen += len;
assert(accLen < kVoiceEngineVersionMaxMessageSize);
- len = AddBuildInfo(versionPtr);
- if (len == -1)
- {
- return -1;
- }
- versionPtr += len;
- accLen += len;
- assert(accLen < kVoiceEngineVersionMaxMessageSize);
-
#ifdef WEBRTC_EXTERNAL_TRANSPORT
len = AddExternalTransportBuild(versionPtr);
if (len == -1)
@@ -828,11 +819,6 @@ int VoEBaseImpl::GetVersion(char version[1024])
return 0;
}
-int32_t VoEBaseImpl::AddBuildInfo(char* str) const
-{
- return sprintf(str, "Build: %s\n", BUILDINFO);
-}
-
int32_t VoEBaseImpl::AddVoEVersion(char* str) const
{
return sprintf(str, "VoiceEngine 4.1.0\n");
diff --git a/voice_engine/voe_base_impl.h b/voice_engine/voe_base_impl.h
index 985ef5d8..2f377362 100644
--- a/voice_engine/voe_base_impl.h
+++ b/voice_engine/voe_base_impl.h
@@ -146,7 +146,6 @@ private:
int64_t* elapsed_time_ms,
int64_t* ntp_time_ms);
- int32_t AddBuildInfo(char* str) const;
int32_t AddVoEVersion(char* str) const;
// Initialize channel by setting Engine Information then initializing
diff --git a/voice_engine/voice_engine_defines.h b/voice_engine/voice_engine_defines.h
index b3cba7c3..cde9470a 100644
--- a/voice_engine/voice_engine_defines.h
+++ b/voice_engine/voice_engine_defines.h
@@ -128,26 +128,6 @@ enum { kVoiceEngineMaxRtpExtensionId = 14 };
} // namespace webrtc
// ----------------------------------------------------------------------------
-// Build information macros
-// ----------------------------------------------------------------------------
-
-#if defined(_DEBUG)
-#define BUILDMODE "d"
-#elif defined(DEBUG)
-#define BUILDMODE "d"
-#elif defined(NDEBUG)
-#define BUILDMODE "r"
-#else
-#define BUILDMODE "?"
-#endif
-
-#define BUILDTIME __TIME__
-#define BUILDDATE __DATE__
-
-// Example: "Oct 10 2002 12:05:30 r"
-#define BUILDINFO BUILDDATE " " BUILDTIME " " BUILDMODE
-
-// ----------------------------------------------------------------------------
// Macros
// ----------------------------------------------------------------------------