diff --git a/worker/deps/libwebrtc/libwebrtc/rtc_base/checks.h b/worker/deps/libwebrtc/libwebrtc/rtc_base/checks.h deleted file mode 100644 index dbdc004433f..00000000000 --- a/worker/deps/libwebrtc/libwebrtc/rtc_base/checks.h +++ /dev/null @@ -1,434 +0,0 @@ -/* - * Copyright 2006 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. - */ - -#ifndef RTC_BASE_CHECKS_H_ -#define RTC_BASE_CHECKS_H_ - -// If you for some reson need to know if DCHECKs are on, test the value of -// RTC_DCHECK_IS_ON. (Test its value, not if it's defined; it'll always be -// defined, to either a true or a false value.) -#if !defined(NDEBUG) || defined(DCHECK_ALWAYS_ON) -#define RTC_DCHECK_IS_ON 1 -#else -#define RTC_DCHECK_IS_ON 0 -#endif - -// Annotate a function that will not return control flow to the caller. -#if defined(_MSC_VER) -#define RTC_NORETURN __declspec(noreturn) -#elif defined(__GNUC__) -#define RTC_NORETURN __attribute__ ((__noreturn__)) -#else -#define RTC_NORETURN -#endif - -#ifdef __cplusplus -extern "C" { -#endif -RTC_NORETURN void rtc_FatalMessage(const char* file, int line, const char* msg); -#ifdef __cplusplus -} // extern "C" -#endif - -#ifdef __cplusplus -// C++ version. - -#include - -#include "absl/strings/string_view.h" -#include "rtc_base/numerics/safe_compare.h" -#include "rtc_base/system/inline.h" - -// The macros here print a message to stderr and abort under various -// conditions. All will accept additional stream messages. For example: -// RTC_DCHECK_EQ(foo, bar) << "I'm printed when foo != bar."; -// -// - RTC_CHECK(x) is an assertion that x is always true, and that if it isn't, -// it's better to terminate the process than to continue. During development, -// the reason that it's better to terminate might simply be that the error -// handling code isn't in place yet; in production, the reason might be that -// the author of the code truly believes that x will always be true, but that -// she recognizes that if she is wrong, abrupt and unpleasant process -// termination is still better than carrying on with the assumption violated. -// -// RTC_CHECK always evaluates its argument, so it's OK for x to have side -// effects. -// -// - RTC_DCHECK(x) is the same as RTC_CHECK(x)---an assertion that x is always -// true---except that x will only be evaluated in debug builds; in production -// builds, x is simply assumed to be true. This is useful if evaluating x is -// expensive and the expected cost of failing to detect the violated -// assumption is acceptable. You should not handle cases where a production -// build fails to spot a violated condition, even those that would result in -// crashes. If the code needs to cope with the error, make it cope, but don't -// call RTC_DCHECK; if the condition really can't occur, but you'd sleep -// better at night knowing that the process will suicide instead of carrying -// on in case you were wrong, use RTC_CHECK instead of RTC_DCHECK. -// -// RTC_DCHECK only evaluates its argument in debug builds, so if x has visible -// side effects, you need to write e.g. -// bool w = x; RTC_DCHECK(w); -// -// - RTC_CHECK_EQ, _NE, _GT, ..., and RTC_DCHECK_EQ, _NE, _GT, ... are -// specialized variants of RTC_CHECK and RTC_DCHECK that print prettier -// messages if the condition doesn't hold. Prefer them to raw RTC_CHECK and -// RTC_DCHECK. -// -// - FATAL() aborts unconditionally. -// -// TODO(ajm): Ideally, checks.h would be combined with logging.h, but -// consolidation with system_wrappers/logging.h should happen first. - -namespace rtc { -namespace webrtc_checks_impl { -enum class CheckArgType : int8_t { - kEnd = 0, - kInt, - kLong, - kLongLong, - kUInt, - kULong, - kULongLong, - kDouble, - kLongDouble, - kCharP, - kStdString, - kStringView, - kVoidP, - - // kCheckOp doesn't represent an argument type. Instead, it is sent as the - // first argument from RTC_CHECK_OP to make FatalLog use the next two - // arguments to build the special CHECK_OP error message - // (the "a == b (1 vs. 2)" bit). - kCheckOp, -}; - -RTC_NORETURN void FatalLog(const char* file, - int line, - const char* message, - const CheckArgType* fmt, - ...); - -// Wrapper for log arguments. Only ever make values of this type with the -// MakeVal() functions. -template -struct Val { - static constexpr CheckArgType Type() { return N; } - T GetVal() const { return val; } - T val; -}; - -// Case for when we need to construct a temp string and then print that. -// (We can't use Val -// because we need somewhere to store the temp string.) -struct ToStringVal { - static constexpr CheckArgType Type() { return CheckArgType::kStdString; } - const std::string* GetVal() const { return &val; } - std::string val; -}; - -inline Val MakeVal(int x) { - return {x}; -} -inline Val MakeVal(long x) { - return {x}; -} -inline Val MakeVal(long long x) { - return {x}; -} -inline Val MakeVal(unsigned int x) { - return {x}; -} -inline Val MakeVal(unsigned long x) { - return {x}; -} -inline Val MakeVal( - unsigned long long x) { - return {x}; -} - -inline Val MakeVal(double x) { - return {x}; -} -inline Val MakeVal(long double x) { - return {x}; -} - -inline Val MakeVal(const char* x) { - return {x}; -} -inline Val MakeVal( - const std::string& x) { - return {&x}; -} -inline Val MakeVal( - const absl::string_view& x) { - return {&x}; -} - -inline Val MakeVal(const void* x) { - return {x}; -} - -// The enum class types are not implicitly convertible to arithmetic types. -template < - typename T, - typename std::enable_if::value && - !std::is_arithmetic::value>::type* = nullptr> -inline decltype(MakeVal(std::declval::type>())) -MakeVal(T x) { - return {static_cast::type>(x)}; -} - -template ::type, - typename T2 = decltype(ToLogString(std::declval())), - typename std::enable_if::value>::type* = - nullptr> -ToStringVal MakeVal(const T& x) { - return {ToLogString(x)}; -} - -// Ephemeral type that represents the result of the logging << operator. -template -class LogStreamer; - -// Base case: Before the first << argument. -template <> -class LogStreamer<> final { - public: - template ::value || - std::is_enum::value>::type* = nullptr> - RTC_FORCE_INLINE LogStreamer()))> operator<<( - U arg) const { - return LogStreamer()))>(MakeVal(arg), - this); - } - - template ::value && - !std::is_enum::value>::type* = nullptr> - RTC_FORCE_INLINE LogStreamer()))> operator<<( - const U& arg) const { - return LogStreamer()))>(MakeVal(arg), - this); - } - - template - RTC_NORETURN RTC_FORCE_INLINE static void Call(const char* file, - const int line, - const char* message, - const Us&... args) { - static constexpr CheckArgType t[] = {Us::Type()..., CheckArgType::kEnd}; - FatalLog(file, line, message, t, args.GetVal()...); - } - - template - RTC_NORETURN RTC_FORCE_INLINE static void CallCheckOp(const char* file, - const int line, - const char* message, - const Us&... args) { - static constexpr CheckArgType t[] = {CheckArgType::kCheckOp, Us::Type()..., - CheckArgType::kEnd}; - FatalLog(file, line, message, t, args.GetVal()...); - } -}; - -// Inductive case: We've already seen at least one << argument. The most recent -// one had type `T`, and the earlier ones had types `Ts`. -template -class LogStreamer final { - public: - RTC_FORCE_INLINE LogStreamer(T arg, const LogStreamer* prior) - : arg_(arg), prior_(prior) {} - - template ::value || - std::is_enum::value>::type* = nullptr> - RTC_FORCE_INLINE LogStreamer())), T, Ts...> - operator<<(U arg) const { - return LogStreamer())), T, Ts...>( - MakeVal(arg), this); - } - - template ::value && - !std::is_enum::value>::type* = nullptr> - RTC_FORCE_INLINE LogStreamer())), T, Ts...> - operator<<(const U& arg) const { - return LogStreamer())), T, Ts...>( - MakeVal(arg), this); - } - - template - RTC_NORETURN RTC_FORCE_INLINE void Call(const char* file, - const int line, - const char* message, - const Us&... args) const { - prior_->Call(file, line, message, arg_, args...); - } - - template - RTC_NORETURN RTC_FORCE_INLINE void CallCheckOp(const char* file, - const int line, - const char* message, - const Us&... args) const { - prior_->CallCheckOp(file, line, message, arg_, args...); - } - - private: - // The most recent argument. - T arg_; - - // Earlier arguments. - const LogStreamer* prior_; -}; - -template -class FatalLogCall final { - public: - FatalLogCall(const char* file, int line, const char* message) - : file_(file), line_(line), message_(message) {} - - // This can be any binary operator with precedence lower than <<. - template - RTC_NORETURN RTC_FORCE_INLINE void operator&( - const LogStreamer& streamer) { - isCheckOp ? streamer.CallCheckOp(file_, line_, message_) - : streamer.Call(file_, line_, message_); - } - - private: - const char* file_; - int line_; - const char* message_; -}; -} // namespace webrtc_checks_impl - -// The actual stream used isn't important. We reference |ignored| in the code -// but don't evaluate it; this is to avoid "unused variable" warnings (we do so -// in a particularly convoluted way with an extra ?: because that appears to be -// the simplest construct that keeps Visual Studio from complaining about -// condition being unused). -#define RTC_EAT_STREAM_PARAMETERS(ignored) \ - (true ? true : ((void)(ignored), true)) \ - ? static_cast(0) \ - : rtc::webrtc_checks_impl::FatalLogCall("", 0, "") & \ - rtc::webrtc_checks_impl::LogStreamer<>() - -// Call RTC_EAT_STREAM_PARAMETERS with an argument that fails to compile if -// values of the same types as |a| and |b| can't be compared with the given -// operation, and that would evaluate |a| and |b| if evaluated. -#define RTC_EAT_STREAM_PARAMETERS_OP(op, a, b) \ - RTC_EAT_STREAM_PARAMETERS(((void)rtc::Safe##op(a, b))) - -// RTC_CHECK dies with a fatal error if condition is not true. It is *not* -// controlled by NDEBUG or anything else, so the check will be executed -// regardless of compilation mode. -// -// We make sure RTC_CHECK et al. always evaluates |condition|, as -// doing RTC_CHECK(FunctionWithSideEffect()) is a common idiom. -#define RTC_CHECK(condition) \ - while (!(condition)) \ - rtc::webrtc_checks_impl::FatalLogCall(__FILE__, __LINE__, \ - #condition) & \ - rtc::webrtc_checks_impl::LogStreamer<>() - -// Helper macro for binary operators. -// Don't use this macro directly in your code, use RTC_CHECK_EQ et al below. -#define RTC_CHECK_OP(name, op, val1, val2) \ - while (!rtc::Safe##name((val1), (val2))) \ - rtc::webrtc_checks_impl::FatalLogCall(__FILE__, __LINE__, \ - #val1 " " #op " " #val2) & \ - rtc::webrtc_checks_impl::LogStreamer<>() << (val1) << (val2) - -#define RTC_CHECK_EQ(val1, val2) RTC_CHECK_OP(Eq, ==, val1, val2) -#define RTC_CHECK_NE(val1, val2) RTC_CHECK_OP(Ne, !=, val1, val2) -#define RTC_CHECK_LE(val1, val2) RTC_CHECK_OP(Le, <=, val1, val2) -#define RTC_CHECK_LT(val1, val2) RTC_CHECK_OP(Lt, <, val1, val2) -#define RTC_CHECK_GE(val1, val2) RTC_CHECK_OP(Ge, >=, val1, val2) -#define RTC_CHECK_GT(val1, val2) RTC_CHECK_OP(Gt, >, val1, val2) - -// The RTC_DCHECK macro is equivalent to RTC_CHECK except that it only generates -// code in debug builds. It does reference the condition parameter in all cases, -// though, so callers won't risk getting warnings about unused variables. -#if RTC_DCHECK_IS_ON -#define RTC_DCHECK(condition) RTC_CHECK(condition) -#define RTC_DCHECK_EQ(v1, v2) RTC_CHECK_EQ(v1, v2) -#define RTC_DCHECK_NE(v1, v2) RTC_CHECK_NE(v1, v2) -#define RTC_DCHECK_LE(v1, v2) RTC_CHECK_LE(v1, v2) -#define RTC_DCHECK_LT(v1, v2) RTC_CHECK_LT(v1, v2) -#define RTC_DCHECK_GE(v1, v2) RTC_CHECK_GE(v1, v2) -#define RTC_DCHECK_GT(v1, v2) RTC_CHECK_GT(v1, v2) -#else -#define RTC_DCHECK(condition) RTC_EAT_STREAM_PARAMETERS(condition) -#define RTC_DCHECK_EQ(v1, v2) RTC_EAT_STREAM_PARAMETERS_OP(Eq, v1, v2) -#define RTC_DCHECK_NE(v1, v2) RTC_EAT_STREAM_PARAMETERS_OP(Ne, v1, v2) -#define RTC_DCHECK_LE(v1, v2) RTC_EAT_STREAM_PARAMETERS_OP(Le, v1, v2) -#define RTC_DCHECK_LT(v1, v2) RTC_EAT_STREAM_PARAMETERS_OP(Lt, v1, v2) -#define RTC_DCHECK_GE(v1, v2) RTC_EAT_STREAM_PARAMETERS_OP(Ge, v1, v2) -#define RTC_DCHECK_GT(v1, v2) RTC_EAT_STREAM_PARAMETERS_OP(Gt, v1, v2) -#endif - -#define RTC_UNREACHABLE_CODE_HIT false -#define RTC_NOTREACHED() RTC_DCHECK(RTC_UNREACHABLE_CODE_HIT) - -// TODO(bugs.webrtc.org/8454): Add an RTC_ prefix or rename differently. -#define FATAL() \ - rtc::webrtc_checks_impl::FatalLogCall(__FILE__, __LINE__, \ - "FATAL()") & \ - rtc::webrtc_checks_impl::LogStreamer<>() - -// Performs the integer division a/b and returns the result. CHECKs that the -// remainder is zero. -template -inline T CheckedDivExact(T a, T b) { - RTC_CHECK_EQ(a % b, 0) << a << " is not evenly divisible by " << b; - return a / b; -} - -} // namespace rtc - -#else // __cplusplus not defined -// C version. Lacks many features compared to the C++ version, but usage -// guidelines are the same. - -#define RTC_CHECK(condition) \ - do { \ - if (!(condition)) { \ - rtc_FatalMessage(__FILE__, __LINE__, "CHECK failed: " #condition); \ - } \ - } while (0) - -#define RTC_CHECK_EQ(a, b) RTC_CHECK((a) == (b)) -#define RTC_CHECK_NE(a, b) RTC_CHECK((a) != (b)) -#define RTC_CHECK_LE(a, b) RTC_CHECK((a) <= (b)) -#define RTC_CHECK_LT(a, b) RTC_CHECK((a) < (b)) -#define RTC_CHECK_GE(a, b) RTC_CHECK((a) >= (b)) -#define RTC_CHECK_GT(a, b) RTC_CHECK((a) > (b)) - -#define RTC_DCHECK(condition) \ - do { \ - if (RTC_DCHECK_IS_ON && !(condition)) { \ - rtc_FatalMessage(__FILE__, __LINE__, "DCHECK failed: " #condition); \ - } \ - } while (0) - -#define RTC_DCHECK_EQ(a, b) RTC_DCHECK((a) == (b)) -#define RTC_DCHECK_NE(a, b) RTC_DCHECK((a) != (b)) -#define RTC_DCHECK_LE(a, b) RTC_DCHECK((a) <= (b)) -#define RTC_DCHECK_LT(a, b) RTC_DCHECK((a) < (b)) -#define RTC_DCHECK_GE(a, b) RTC_DCHECK((a) >= (b)) -#define RTC_DCHECK_GT(a, b) RTC_DCHECK((a) > (b)) - -#endif // __cplusplus - -#endif // RTC_BASE_CHECKS_H_ diff --git a/worker/deps/libwebrtc/libwebrtc/rtc_base/numerics/mod_ops.h b/worker/deps/libwebrtc/libwebrtc/rtc_base/numerics/mod_ops.h index 65618b4876c..f1c8b677b25 100644 --- a/worker/deps/libwebrtc/libwebrtc/rtc_base/numerics/mod_ops.h +++ b/worker/deps/libwebrtc/libwebrtc/rtc_base/numerics/mod_ops.h @@ -14,13 +14,13 @@ #include #include -#include "rtc_base/checks.h" +// #include "rtc_base/checks.h" namespace webrtc { template // NOLINT inline unsigned long Add(unsigned long a, unsigned long b) { // NOLINT - RTC_DCHECK_LT(a, M); + // RTC_DCHECK_LT(a, M); unsigned long t = M - b % M; // NOLINT unsigned long res = a - t; // NOLINT if (t > a) @@ -30,7 +30,7 @@ inline unsigned long Add(unsigned long a, unsigned long b) { // NOLINT template // NOLINT inline unsigned long Subtract(unsigned long a, unsigned long b) { // NOLINT - RTC_DCHECK_LT(a, M); + // RTC_DCHECK_LT(a, M); unsigned long sub = b % M; // NOLINT if (a < sub) return M - (sub - a); @@ -65,8 +65,8 @@ template inline typename std::enable_if<(M > 0), T>::type ForwardDiff(T a, T b) { static_assert(std::is_unsigned::value, "Type must be an unsigned integer."); - RTC_DCHECK_LT(a, M); - RTC_DCHECK_LT(b, M); + // RTC_DCHECK_LT(a, M); + // RTC_DCHECK_LT(b, M); return a <= b ? b - a : M - (a - b); } @@ -110,8 +110,8 @@ template inline typename std::enable_if<(M > 0), T>::type ReverseDiff(T a, T b) { static_assert(std::is_unsigned::value, "Type must be an unsigned integer."); - RTC_DCHECK_LT(a, M); - RTC_DCHECK_LT(b, M); + // RTC_DCHECK_LT(a, M); + // RTC_DCHECK_LT(b, M); return b <= a ? a - b : M - (b - a); } diff --git a/worker/deps/libwebrtc/libwebrtc/rtc_base/numerics/sequence_number_util.h b/worker/deps/libwebrtc/libwebrtc/rtc_base/numerics/sequence_number_util.h index 57efb5128de..0fa689f9c75 100644 --- a/worker/deps/libwebrtc/libwebrtc/rtc_base/numerics/sequence_number_util.h +++ b/worker/deps/libwebrtc/libwebrtc/rtc_base/numerics/sequence_number_util.h @@ -16,7 +16,6 @@ #include #include "absl/types/optional.h" -#include "rtc_base/checks.h" #include "rtc_base/numerics/mod_ops.h" namespace webrtc { diff --git a/worker/deps/libwebrtc/libwebrtc/rtc_base/system/inline.h b/worker/deps/libwebrtc/libwebrtc/rtc_base/system/inline.h deleted file mode 100644 index f585d34ded3..00000000000 --- a/worker/deps/libwebrtc/libwebrtc/rtc_base/system/inline.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (c) 2018 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. - */ - -#ifndef RTC_BASE_SYSTEM_INLINE_H_ -#define RTC_BASE_SYSTEM_INLINE_H_ - -#if defined(_MSC_VER) - -#define RTC_FORCE_INLINE __forceinline -#define RTC_NO_INLINE __declspec(noinline) - -#elif defined(__GNUC__) - -#define RTC_FORCE_INLINE __attribute__((__always_inline__)) -#define RTC_NO_INLINE __attribute__((__noinline__)) - -#else - -#define RTC_FORCE_INLINE -#define RTC_NO_INLINE - -#endif - -#endif // RTC_BASE_SYSTEM_INLINE_H_ diff --git a/worker/src/RTC/TransportCongestionControlServer.cpp b/worker/src/RTC/TransportCongestionControlServer.cpp index b168090435e..ee344fe9ba3 100644 --- a/worker/src/RTC/TransportCongestionControlServer.cpp +++ b/worker/src/RTC/TransportCongestionControlServer.cpp @@ -116,15 +116,17 @@ namespace RTC { if (arrival_time > kMaxTimeMs) { - MS_WARN_DEV("Arrival time out of bounds:%" PRIu64 "", arrival_time); + MS_WARN_DEV("arrival time out of bounds:%" PRIu64 "", arrival_time); return; } + int64_t seq = this->unwrapper.Unwrap(sequence_number); if (seq <= 0) { - MS_WARN_DEV("Invalid seq_num:%" PRIu16 ", unwrap-seq:%" PRId64 "", sequence_number, seq); + MS_WARN_DEV("invalid seq_num:%" PRIu16 ", unwrap-seq:%" PRId64 "", sequence_number, seq); return; } + if ( this->periodicWindowStartSeq && this->packetArrivalTimes.lower_bound(*this->periodicWindowStartSeq) == @@ -146,12 +148,15 @@ namespace RTC // We are only interested in the first time a packet is received. if (this->packetArrivalTimes.find(seq) != this->packetArrivalTimes.end()) + { return; + } this->packetArrivalTimes[seq] = arrival_time; // Limit the range of sequence numbers to send feedback for. auto first_arrival_time_to_keep = this->packetArrivalTimes.lower_bound( this->packetArrivalTimes.rbegin()->first - kMaxNumberOfPackets); + if (first_arrival_time_to_keep != this->packetArrivalTimes.begin()) { this->packetArrivalTimes.erase(this->packetArrivalTimes.begin(), first_arrival_time_to_keep); @@ -169,7 +174,9 @@ namespace RTC // current feedback packet. Some older may still be in the map, in case a // reordering happens and we need to retransmit them. if (!this->periodicWindowStartSeq) + { return; + } for (auto begin_iterator = this->packetArrivalTimes.lower_bound(*this->periodicWindowStartSeq); begin_iterator != this->packetArrivalTimes.cend(); @@ -177,12 +184,14 @@ namespace RTC { int64_t next_sequence_number = BuildFeedbackPacket( *this->periodicWindowStartSeq, begin_iterator, this->packetArrivalTimes.cend()); + // If build feedback packet fail, it will not be sent. if (next_sequence_number < 0) { // Reset and create a new feedback packet for next periodic. this->transportCcFeedbackPacket.reset(new RTC::RTCP::FeedbackRtpTransportPacket( this->transportCcFeedbackSenderSsrc, this->transportCcFeedbackMediaSsrc)); + return; } @@ -212,13 +221,14 @@ namespace RTC { auto result = this->transportCcFeedbackPacket->AddPacket( static_cast(it->first & 0xFFFF), it->second, this->maxRtcpPacketLen); + if (RTC::RTCP::FeedbackRtpTransportPacket::AddPacketResult::SUCCESS != result) { // If we can't even add the first seq to the feedback packet, we won't be // able to build it at all. // RTC_CHECK(begin_iterator != it); MS_WARN_DEV( - "Add fail! result:%" PRIu32 ", cur-seq:%" PRId64 ", next-seq:%" PRId64 + "add fail! result:%" PRIu32 ", cur-seq:%" PRId64 ", next-seq:%" PRId64 ", base-seq:%" PRId64 "", static_cast(result), it->first, @@ -226,6 +236,7 @@ namespace RTC base_sequence_number); // When add not success then update startSeq to current seq. this->periodicWindowStartSeq = it->first; + // Could not add timestamp, feedback packet max size exceeded. Return and // try again with a fresh packet. if (RTC::RTCP::FeedbackRtpTransportPacket::AddPacketResult::MAX_SIZE_EXCEEDED == result) @@ -238,7 +249,9 @@ namespace RTC return -1; } } + next_sequence_number = it->first + 1; + // If the feedback packet is full, send it now. if (this->transportCcFeedbackPacket->IsFull()) { @@ -246,6 +259,7 @@ namespace RTC break; } } + return next_sequence_number; }