diff options
author | Torne (Richard Coles) <torne@google.com> | 2014-11-12 17:59:59 +0000 |
---|---|---|
committer | Torne (Richard Coles) <torne@google.com> | 2014-11-12 17:59:59 +0000 |
commit | 5d04ee7f9fa65f7abe7b1cd18e35335c59047e5b (patch) | |
tree | 32949f5ca19925bf1049834f417a80d9462d0b95 | |
parent | 77155b05052120107f7496d7c424ee24e6420550 (diff) | |
parent | 361320edab39c39820a61c753b14555c603423a7 (diff) | |
download | webrtc-5d04ee7f9fa65f7abe7b1cd18e35335c59047e5b.tar.gz |
Merge from Chromium at DEPS revision 03655fd3f6d7
This commit was generated by merge_to_master.py.
Change-Id: I659bdd3b127bb83ee982b3e6117a93ad4fa68d54
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 { @@ -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 @@ -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: @@ -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 // ---------------------------------------------------------------------------- |