| diff --git a/Source/ThirdParty/libwebrtc/Source/webrtc/api/audio_codecs/ilbc/audio_encoder_ilbc.cc b/Source/ThirdParty/libwebrtc/Source/webrtc/api/audio_codecs/ilbc/audio_encoder_ilbc.cc |
| index 896ed238cc3..4d028c9aaf4 100644 |
| --- a/Source/ThirdParty/libwebrtc/Source/webrtc/api/audio_codecs/ilbc/audio_encoder_ilbc.cc |
| +++ b/Source/ThirdParty/libwebrtc/Source/webrtc/api/audio_codecs/ilbc/audio_encoder_ilbc.cc |
| @@ -33,7 +33,7 @@ int GetIlbcBitrate(int ptime) { |
| // 50 bytes per frame of 30 ms => (approx) 13333 bits/s. |
| return 13333; |
| default: |
| - FATAL(); |
| + RTC_FATAL(); |
| } |
| } |
| } // namespace |
| diff --git a/Source/ThirdParty/libwebrtc/Source/webrtc/api/mediatypes.cc b/Source/ThirdParty/libwebrtc/Source/webrtc/api/mediatypes.cc |
| index 599542db08f..140d0ae9625 100644 |
| --- a/Source/ThirdParty/libwebrtc/Source/webrtc/api/mediatypes.cc |
| +++ b/Source/ThirdParty/libwebrtc/Source/webrtc/api/mediatypes.cc |
| @@ -28,7 +28,7 @@ std::string MediaTypeToString(MediaType type) { |
| case MEDIA_TYPE_DATA: |
| return kMediaTypeData; |
| } |
| - FATAL(); |
| + RTC_FATAL(); |
| // Not reachable; avoids compile warning. |
| return ""; |
| } |
| @@ -41,7 +41,7 @@ MediaType MediaTypeFromString(const std::string& type_str) { |
| } else if (type_str == kMediaTypeData) { |
| return MEDIA_TYPE_DATA; |
| } |
| - FATAL(); |
| + RTC_FATAL(); |
| // Not reachable; avoids compile warning. |
| return static_cast<MediaType>(-1); |
| } |
| diff --git a/Source/ThirdParty/libwebrtc/Source/webrtc/audio/remix_resample.cc b/Source/ThirdParty/libwebrtc/Source/webrtc/audio/remix_resample.cc |
| index cc59e2a823c..b1158da213f 100644 |
| --- a/Source/ThirdParty/libwebrtc/Source/webrtc/audio/remix_resample.cc |
| +++ b/Source/ThirdParty/libwebrtc/Source/webrtc/audio/remix_resample.cc |
| @@ -55,7 +55,7 @@ void RemixAndResample(const int16_t* src_data, |
| |
| if (resampler->InitializeIfNeeded(sample_rate_hz, dst_frame->sample_rate_hz_, |
| audio_ptr_num_channels) == -1) { |
| - FATAL() << "InitializeIfNeeded failed: sample_rate_hz = " << sample_rate_hz |
| + RTC_FATAL() << "InitializeIfNeeded failed: sample_rate_hz = " << sample_rate_hz |
| << ", dst_frame->sample_rate_hz_ = " << dst_frame->sample_rate_hz_ |
| << ", audio_ptr_num_channels = " << audio_ptr_num_channels; |
| } |
| @@ -69,7 +69,7 @@ void RemixAndResample(const int16_t* src_data, |
| resampler->Resample(audio_ptr, src_length, dst_frame->mutable_data(), |
| AudioFrame::kMaxDataSizeSamples); |
| if (out_length == -1) { |
| - FATAL() << "Resample failed: audio_ptr = " << audio_ptr |
| + RTC_FATAL() << "Resample failed: audio_ptr = " << audio_ptr |
| << ", src_length = " << src_length |
| << ", dst_frame->mutable_data() = " << dst_frame->mutable_data(); |
| } |
| diff --git a/Source/ThirdParty/libwebrtc/Source/webrtc/common_audio/wav_file.cc b/Source/ThirdParty/libwebrtc/Source/webrtc/common_audio/wav_file.cc |
| index 1b8bcbd923c..90a89281e5c 100644 |
| --- a/Source/ThirdParty/libwebrtc/Source/webrtc/common_audio/wav_file.cc |
| +++ b/Source/ThirdParty/libwebrtc/Source/webrtc/common_audio/wav_file.cc |
| @@ -63,7 +63,7 @@ WavReader::WavReader(rtc::PlatformFile file) { |
| if (!rtc::ClosePlatformFile(file)) { |
| RTC_LOG(LS_ERROR) << "Can't close file."; |
| } |
| - FATAL() << "Could not open wav file for reading."; |
| + RTC_FATAL() << "Could not open wav file for reading."; |
| } |
| |
| ReadableWavFile readable(file_handle_); |
| @@ -148,7 +148,7 @@ WavWriter::WavWriter(rtc::PlatformFile file, |
| if (!rtc::ClosePlatformFile(file)) { |
| RTC_LOG(LS_ERROR) << "Can't close file."; |
| } |
| - FATAL() << "Could not open wav file for writing."; |
| + RTC_FATAL() << "Could not open wav file for writing."; |
| } |
| |
| RTC_CHECK(CheckWavParameters(num_channels_, sample_rate_, kWavFormat, |
| diff --git a/Source/ThirdParty/libwebrtc/Source/webrtc/common_video/video_frame_buffer.cc b/Source/ThirdParty/libwebrtc/Source/webrtc/common_video/video_frame_buffer.cc |
| index f4f138fccb5..5f89b4acb96 100644 |
| --- a/Source/ThirdParty/libwebrtc/Source/webrtc/common_video/video_frame_buffer.cc |
| +++ b/Source/ThirdParty/libwebrtc/Source/webrtc/common_video/video_frame_buffer.cc |
| @@ -272,7 +272,7 @@ rtc::scoped_refptr<PlanarYuvBuffer> WrapYuvBuffer( |
| return WrapI444Buffer(width, height, y_plane, y_stride, u_plane, u_stride, |
| v_plane, v_stride, no_longer_used); |
| default: |
| - FATAL() << "Unexpected frame buffer type."; |
| + RTC_FATAL() << "Unexpected frame buffer type."; |
| return nullptr; |
| } |
| } |
| diff --git a/Source/ThirdParty/libwebrtc/Source/webrtc/modules/audio_coding/codecs/cng/audio_encoder_cng.cc b/Source/ThirdParty/libwebrtc/Source/webrtc/modules/audio_coding/codecs/cng/audio_encoder_cng.cc |
| index 9a2926143d0..476954fe60d 100644 |
| --- a/Source/ThirdParty/libwebrtc/Source/webrtc/modules/audio_coding/codecs/cng/audio_encoder_cng.cc |
| +++ b/Source/ThirdParty/libwebrtc/Source/webrtc/modules/audio_coding/codecs/cng/audio_encoder_cng.cc |
| @@ -171,7 +171,7 @@ AudioEncoder::EncodedInfo AudioEncoderCng::EncodeImpl( |
| break; |
| } |
| case Vad::kError: { |
| - FATAL(); // Fails only if fed invalid data. |
| + RTC_FATAL(); // Fails only if fed invalid data. |
| break; |
| } |
| } |
| diff --git a/Source/ThirdParty/libwebrtc/Source/webrtc/modules/audio_coding/codecs/ilbc/audio_encoder_ilbc.cc b/Source/ThirdParty/libwebrtc/Source/webrtc/modules/audio_coding/codecs/ilbc/audio_encoder_ilbc.cc |
| index 8801fd55590..35e6fc64a62 100644 |
| --- a/Source/ThirdParty/libwebrtc/Source/webrtc/modules/audio_coding/codecs/ilbc/audio_encoder_ilbc.cc |
| +++ b/Source/ThirdParty/libwebrtc/Source/webrtc/modules/audio_coding/codecs/ilbc/audio_encoder_ilbc.cc |
| @@ -41,7 +41,7 @@ int GetIlbcBitrate(int ptime) { |
| // 50 bytes per frame of 30 ms => (approx) 13333 bits/s. |
| return 13333; |
| default: |
| - FATAL(); |
| + RTC_FATAL(); |
| } |
| } |
| |
| @@ -148,7 +148,7 @@ size_t AudioEncoderIlbcImpl::RequiredOutputSizeBytes() const { |
| case 6: |
| return 2 * 50; |
| default: |
| - FATAL(); |
| + RTC_FATAL(); |
| } |
| } |
| |
| diff --git a/Source/ThirdParty/libwebrtc/Source/webrtc/modules/video_coding/codecs/vp9/vp9_noop.cc b/Source/ThirdParty/libwebrtc/Source/webrtc/modules/video_coding/codecs/vp9/vp9_noop.cc |
| new file mode 100644 |
| index 00000000000..b058c2d6728 |
| --- /dev/null |
| +++ b/Source/ThirdParty/libwebrtc/Source/webrtc/modules/video_coding/codecs/vp9/vp9_noop.cc |
| @@ -0,0 +1,43 @@ |
| +/* |
| + * Copyright (c) 2016 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. |
| + * |
| + */ |
| + |
| +#if !defined(RTC_DISABLE_VP9) |
| +#error |
| +#endif // !defined(RTC_DISABLE_VP9) |
| + |
| +#include "modules/video_coding/codecs/vp9/include/vp9.h" |
| + |
| +#include "api/video_codecs/sdp_video_format.h" |
| +#include "rtc_base/checks.h" |
| + |
| +namespace webrtc { |
| + |
| +std::vector<SdpVideoFormat> SupportedVP9Codecs() { |
| + return std::vector<SdpVideoFormat>(); |
| +} |
| + |
| +std::unique_ptr<VP9Encoder> VP9Encoder::Create() { |
| + RTC_NOTREACHED(); |
| + return nullptr; |
| +} |
| + |
| +std::unique_ptr<VP9Encoder> VP9Encoder::Create( |
| + const cricket::VideoCodec& codec) { |
| + RTC_NOTREACHED(); |
| + return nullptr; |
| +} |
| + |
| +std::unique_ptr<VP9Decoder> VP9Decoder::Create() { |
| + RTC_NOTREACHED(); |
| + return nullptr; |
| +} |
| + |
| +} // namespace webrtc |
| diff --git a/Source/ThirdParty/libwebrtc/Source/webrtc/p2p/base/tcpport.cc b/Source/ThirdParty/libwebrtc/Source/webrtc/p2p/base/tcpport.cc |
| index e018ea755d6..0d7aea9d60a 100644 |
| --- a/Source/ThirdParty/libwebrtc/Source/webrtc/p2p/base/tcpport.cc |
| +++ b/Source/ThirdParty/libwebrtc/Source/webrtc/p2p/base/tcpport.cc |
| @@ -351,11 +351,21 @@ TCPConnection::TCPConnection(TCPPort* port, |
| << ", port() Network:" << port->Network()->ToString(); |
| const std::vector<rtc::InterfaceAddress>& desired_addresses = |
| port_->Network()->GetIPs(); |
| + |
| +#if defined(WEBRTC_WEBKIT_BUILD) |
| + RTC_DCHECK(socket->GetLocalAddress().IsLoopbackIP() || |
| + (std::find_if(desired_addresses.begin(), desired_addresses.end(), |
| + [this](const rtc::InterfaceAddress& addr) { |
| + return socket_->GetLocalAddress().ipaddr() == |
| + addr; |
| + }) != desired_addresses.end())); |
| + #else |
| RTC_DCHECK(std::find_if(desired_addresses.begin(), desired_addresses.end(), |
| [this](const rtc::InterfaceAddress& addr) { |
| return socket_->GetLocalAddress().ipaddr() == |
| addr; |
| }) != desired_addresses.end()); |
| +#endif |
| ConnectSocketSignals(socket); |
| } |
| } |
| diff --git a/Source/ThirdParty/libwebrtc/Source/webrtc/pc/peerconnectionfactory.cc b/Source/ThirdParty/libwebrtc/Source/webrtc/pc/peerconnectionfactory.cc |
| index 37c6a0b0bcf..75261508b27 100644 |
| --- a/Source/ThirdParty/libwebrtc/Source/webrtc/pc/peerconnectionfactory.cc |
| +++ b/Source/ThirdParty/libwebrtc/Source/webrtc/pc/peerconnectionfactory.cc |
| @@ -261,7 +261,7 @@ RtpCapabilities PeerConnectionFactory::GetRtpSenderCapabilities( |
| return RtpCapabilities(); |
| } |
| // Not reached; avoids compile warning. |
| - FATAL(); |
| + RTC_FATAL(); |
| } |
| |
| RtpCapabilities PeerConnectionFactory::GetRtpReceiverCapabilities( |
| @@ -288,7 +288,7 @@ RtpCapabilities PeerConnectionFactory::GetRtpReceiverCapabilities( |
| return RtpCapabilities(); |
| } |
| // Not reached; avoids compile warning. |
| - FATAL(); |
| + RTC_FATAL(); |
| } |
| |
| rtc::scoped_refptr<AudioSourceInterface> |
| diff --git a/Source/ThirdParty/libwebrtc/Source/webrtc/pc/rtpparametersconversion.cc b/Source/ThirdParty/libwebrtc/Source/webrtc/pc/rtpparametersconversion.cc |
| index bf3bce3daa3..865685d73c4 100644 |
| --- a/Source/ThirdParty/libwebrtc/Source/webrtc/pc/rtpparametersconversion.cc |
| +++ b/Source/ThirdParty/libwebrtc/Source/webrtc/pc/rtpparametersconversion.cc |
| @@ -61,7 +61,7 @@ RTCErrorOr<cricket::FeedbackParam> ToCricketFeedbackParam( |
| return cricket::FeedbackParam(cricket::kRtcpFbParamTransportCc); |
| } |
| // Not reached; avoids compile warning. |
| - FATAL(); |
| + RTC_FATAL(); |
| } |
| |
| template <typename C> |
| diff --git a/Source/ThirdParty/libwebrtc/Source/webrtc/rtc_base/checks.h b/Source/ThirdParty/libwebrtc/Source/webrtc/rtc_base/checks.h |
| index 9de6d47573c..5cf0679910e 100644 |
| --- a/Source/ThirdParty/libwebrtc/Source/webrtc/rtc_base/checks.h |
| +++ b/Source/ThirdParty/libwebrtc/Source/webrtc/rtc_base/checks.h |
| @@ -80,7 +80,7 @@ RTC_NORETURN void rtc_FatalMessage(const char* file, int line, const char* msg); |
| // messages if the condition doesn't hold. Prefer them to raw RTC_CHECK and |
| // RTC_DCHECK. |
| // |
| -// - FATAL() aborts unconditionally. |
| +// - RTC_FATAL() aborts unconditionally. |
| // |
| // TODO(ajm): Ideally, checks.h would be combined with logging.h, but |
| // consolidation with system_wrappers/logging.h should happen first. |
| @@ -348,9 +348,9 @@ class FatalLogCall final { |
| #define RTC_NOTREACHED() RTC_DCHECK(RTC_UNREACHABLE_CODE_HIT) |
| |
| // TODO(bugs.webrtc.org/8454): Add an RTC_ prefix or rename differently. |
| -#define FATAL() \ |
| +#define RTC_FATAL() \ |
| rtc::webrtc_checks_impl::FatalLogCall<false>(__FILE__, __LINE__, \ |
| - "FATAL()") & \ |
| + "RTC_FATAL()") & \ |
| rtc::webrtc_checks_impl::LogStreamer<>() |
| |
| // Performs the integer division a/b and returns the result. CHECKs that the |
| diff --git a/Source/ThirdParty/libwebrtc/Source/webrtc/rtc_base/flags.cc b/Source/ThirdParty/libwebrtc/Source/webrtc/rtc_base/flags.cc |
| index bcce0dafbc0..6b43b91e026 100644 |
| --- a/Source/ThirdParty/libwebrtc/Source/webrtc/rtc_base/flags.cc |
| +++ b/Source/ThirdParty/libwebrtc/Source/webrtc/rtc_base/flags.cc |
| @@ -81,7 +81,7 @@ void Flag::SetToDefault() { |
| variable_->s = default_.s; |
| return; |
| } |
| - FATAL() << "unreachable code"; |
| + RTC_FATAL() << "unreachable code"; |
| } |
| |
| static const char* Type2String(Flag::Type type) { |
| @@ -95,7 +95,7 @@ static const char* Type2String(Flag::Type type) { |
| case Flag::STRING: |
| return "string"; |
| } |
| - FATAL() << "unreachable code"; |
| + RTC_FATAL() << "unreachable code"; |
| } |
| |
| static void PrintFlagValue(Flag::Type type, FlagValue* p) { |
| @@ -113,7 +113,7 @@ static void PrintFlagValue(Flag::Type type, FlagValue* p) { |
| printf("%s", p->s); |
| return; |
| } |
| - FATAL() << "unreachable code"; |
| + RTC_FATAL() << "unreachable code"; |
| } |
| |
| void Flag::Print(bool print_current_value) { |
| diff --git a/Source/ThirdParty/libwebrtc/Source/webrtc/rtc_base/location.h b/Source/ThirdParty/libwebrtc/Source/webrtc/rtc_base/location.h |
| index 513bc263651..718d9589348 100644 |
| --- a/Source/ThirdParty/libwebrtc/Source/webrtc/rtc_base/location.h |
| +++ b/Source/ThirdParty/libwebrtc/Source/webrtc/rtc_base/location.h |
| @@ -50,7 +50,7 @@ class Location { |
| #define RTC_FROM_HERE RTC_FROM_HERE_WITH_FUNCTION(__FUNCTION__) |
| |
| #define RTC_FROM_HERE_WITH_FUNCTION(function_name) \ |
| - ::rtc::Location(function_name, __FILE__ ":" STRINGIZE(__LINE__)) |
| + ::rtc::Location(function_name, __FILE__ ":" RTC_STRINGIZE(__LINE__)) |
| |
| } // namespace rtc |
| |
| diff --git a/Source/ThirdParty/libwebrtc/Source/webrtc/rtc_base/logging.cc b/Source/ThirdParty/libwebrtc/Source/webrtc/rtc_base/logging.cc |
| index bb4fbfaae25..44ec3f50c19 100644 |
| --- a/Source/ThirdParty/libwebrtc/Source/webrtc/rtc_base/logging.cc |
| +++ b/Source/ThirdParty/libwebrtc/Source/webrtc/rtc_base/logging.cc |
| @@ -20,28 +20,26 @@ |
| #include <CoreServices/CoreServices.h> |
| #elif defined(WEBRTC_ANDROID) |
| #include <android/log.h> |
| - |
| // Android has a 1024 limit on log inputs. We use 60 chars as an |
| // approx for the header/tag portion. |
| // See android/system/core/liblog/logd_write.c |
| static const int kMaxLogLineSize = 1024 - 60; |
| #endif // WEBRTC_MAC && !defined(WEBRTC_IOS) || WEBRTC_ANDROID |
| |
| -#include <stdio.h> |
| -#include <string.h> |
| +#include <limits.h> |
| #include <time.h> |
| + |
| #include <algorithm> |
| #include <cstdarg> |
| #include <vector> |
| |
| -#include "rtc_base/checks.h" |
| #include "rtc_base/criticalsection.h" |
| #include "rtc_base/logging.h" |
| #include "rtc_base/platform_thread_types.h" |
| +#include "rtc_base/never_destroyed.h" |
| #include "rtc_base/stringencode.h" |
| #include "rtc_base/strings/string_builder.h" |
| #include "rtc_base/stringutils.h" |
| -#include "rtc_base/thread_annotations.h" |
| #include "rtc_base/timeutils.h" |
| |
| namespace rtc { |
| @@ -65,20 +63,19 @@ const char* FilenameFromPath(const char* file) { |
| return (end1 > end2) ? end1 + 1 : end2 + 1; |
| } |
| |
| -// Global lock for log subsystem, only needed to serialize access to streams_. |
| -CriticalSection g_log_crit; |
| +// Global lock for log subsystem, only needed to serialize access to streamList(). |
| +CriticalSection& logCriticalScope() { |
| + static auto scope = makeNeverDestroyed<>(CriticalSection { }); |
| + return scope.get(); |
| +} |
| + |
| } // namespace |
| |
| // Inefficient default implementation, override is recommended. |
| void LogSink::OnLogMessage(const std::string& msg, |
| LoggingSeverity severity, |
| const char* tag) { |
| - OnLogMessage(tag + (": " + msg), severity); |
| -} |
| - |
| -void LogSink::OnLogMessage(const std::string& msg, |
| - LoggingSeverity /* severity */) { |
| - OnLogMessage(msg); |
| + OnLogMessage(tag + (": " + msg)); |
| } |
| |
| ///////////////////////////////////////////////////////////////////////////// |
| @@ -91,7 +88,15 @@ bool LogMessage::log_to_stderr_ = true; |
| // Note: we explicitly do not clean this up, because of the uncertain ordering |
| // of destructors at program exit. Let the person who sets the stream trigger |
| // cleanup by setting to null, or let it leak (safe at program exit). |
| -LogMessage::StreamList LogMessage::streams_ RTC_GUARDED_BY(g_log_crit); |
| +typedef std::pair<LogSink*, LoggingSeverity> StreamAndSeverity; |
| +typedef std::list<StreamAndSeverity> StreamList; |
| + |
| +// The output streams and their associated severities |
| +StreamList& streamList() |
| + RTC_EXCLUSIVE_LOCKS_REQUIRED(logCriticalScope()) { |
| + static auto stream_list = makeNeverDestroyed<>(StreamList { }); |
| + return stream_list.get(); |
| +} |
| |
| // Boolean options default to false (0) |
| bool LogMessage::thread_, LogMessage::timestamp_; |
| @@ -105,6 +110,7 @@ LogMessage::LogMessage(const char* file, |
| LogErrorContext err_ctx, |
| int err) |
| : severity_(sev) { |
| + |
| if (timestamp_) { |
| // Use SystemTimeMillis so that even if tests use fake clocks, the timestamp |
| // in log messages represents the real system time. |
| @@ -205,13 +211,13 @@ LogMessage::~LogMessage() { |
| #endif |
| } |
| |
| - CritScope cs(&g_log_crit); |
| - for (auto& kv : streams_) { |
| + CritScope cs(&logCriticalScope()); |
| + for (auto& kv : streamList()) { |
| if (severity_ >= kv.second) { |
| #if defined(WEBRTC_ANDROID) |
| kv.first->OnLogMessage(str, severity_, tag_); |
| #else |
| - kv.first->OnLogMessage(str, severity_); |
| + kv.first->OnLogMessage(str); |
| #endif |
| } |
| } |
| @@ -254,7 +260,7 @@ void LogMessage::LogTimestamps(bool on) { |
| |
| void LogMessage::LogToDebug(LoggingSeverity min_sev) { |
| g_dbg_sev = min_sev; |
| - CritScope cs(&g_log_crit); |
| + CritScope cs(&logCriticalScope()); |
| UpdateMinLogSeverity(); |
| } |
| |
| @@ -263,9 +269,9 @@ void LogMessage::SetLogToStderr(bool log_to_stderr) { |
| } |
| |
| int LogMessage::GetLogToStream(LogSink* stream) { |
| - CritScope cs(&g_log_crit); |
| + CritScope cs(&logCriticalScope()); |
| LoggingSeverity sev = LS_NONE; |
| - for (auto& kv : streams_) { |
| + for (auto& kv : streamList()) { |
| if (!stream || stream == kv.first) { |
| sev = std::min(sev, kv.second); |
| } |
| @@ -274,16 +280,16 @@ int LogMessage::GetLogToStream(LogSink* stream) { |
| } |
| |
| void LogMessage::AddLogToStream(LogSink* stream, LoggingSeverity min_sev) { |
| - CritScope cs(&g_log_crit); |
| - streams_.push_back(std::make_pair(stream, min_sev)); |
| + CritScope cs(&logCriticalScope()); |
| + streamList().push_back(std::make_pair(stream, min_sev)); |
| UpdateMinLogSeverity(); |
| } |
| |
| void LogMessage::RemoveLogToStream(LogSink* stream) { |
| - CritScope cs(&g_log_crit); |
| - for (StreamList::iterator it = streams_.begin(); it != streams_.end(); ++it) { |
| + CritScope cs(&logCriticalScope()); |
| + for (StreamList::iterator it = streamList().begin(); it != streamList().end(); ++it) { |
| if (stream == it->first) { |
| - streams_.erase(it); |
| + streamList().erase(it); |
| break; |
| } |
| } |
| @@ -342,9 +348,9 @@ void LogMessage::ConfigureLogging(const char* params) { |
| } |
| |
| void LogMessage::UpdateMinLogSeverity() |
| - RTC_EXCLUSIVE_LOCKS_REQUIRED(g_log_crit) { |
| + RTC_EXCLUSIVE_LOCKS_REQUIRED(logCriticalScope()) { |
| LoggingSeverity min_sev = g_dbg_sev; |
| - for (const auto& kv : streams_) { |
| + for (const auto& kv : streamList()) { |
| const LoggingSeverity sev = kv.second; |
| min_sev = std::min(min_sev, sev); |
| } |
| @@ -458,11 +464,8 @@ bool LogMessage::IsNoop(LoggingSeverity severity) { |
| // TODO(tommi): We're grabbing this lock for every LogMessage instance that |
| // is going to be logged. This introduces unnecessary synchronization for |
| // a feature that's mostly used for testing. |
| - CritScope cs(&g_log_crit); |
| - if (streams_.size() > 0) |
| - return false; |
| - |
| - return true; |
| + CritScope cs(&logCriticalScope()); |
| + return streamList().size() == 0; |
| } |
| |
| void LogMessage::FinishPrintStream() { |
| diff --git a/Source/ThirdParty/libwebrtc/Source/webrtc/rtc_base/never_destroyed.h b/Source/ThirdParty/libwebrtc/Source/webrtc/rtc_base/never_destroyed.h |
| new file mode 100644 |
| index 00000000000..fcc62e35534 |
| --- /dev/null |
| +++ b/Source/ThirdParty/libwebrtc/Source/webrtc/rtc_base/never_destroyed.h |
| @@ -0,0 +1,69 @@ |
| +/* |
| + * Copyright (C) 2018 Apple Inc. All rights reserved. |
| + * |
| + * Redistribution and use in source and binary forms, with or without |
| + * modification, are permitted provided that the following conditions |
| + * are met: |
| + * 1. Redistributions of source code must retain the above copyright |
| + * notice, this list of conditions and the following disclaimer. |
| + * 2. Redistributions in binary form must reproduce the above copyright |
| + * notice, this list of conditions and the following disclaimer in the |
| + * documentation and/or other materials provided with the distribution. |
| + * |
| + * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' |
| + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, |
| + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
| + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS |
| + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
| + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
| + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
| + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
| + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
| + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF |
| + * THE POSSIBILITY OF SUCH DAMAGE. |
| + */ |
| + |
| +#pragma once |
| + |
| +#include <type_traits> |
| +#include <utility> |
| + |
| +namespace rtc { |
| + |
| +template<typename T> class NeverDestroyed { |
| +public: |
| + template<typename... Args> NeverDestroyed(Args&&... args) |
| + { |
| + new (storagePointer()) T(std::forward<Args>(args)...); |
| + } |
| + |
| + NeverDestroyed(NeverDestroyed&& other) |
| + { |
| + new (storagePointer()) T(std::move(*other.storagePointer())); |
| + } |
| + |
| + operator T&() { return *storagePointer(); } |
| + T& get() { return *storagePointer(); } |
| + |
| + operator const T&() const { return *storagePointer(); } |
| + const T& get() const { return *storagePointer(); } |
| + |
| +private: |
| + NeverDestroyed(const NeverDestroyed&) = delete; |
| + NeverDestroyed& operator=(const NeverDestroyed&) = delete; |
| + |
| + using PointerType = typename std::remove_const<T>::type*; |
| + |
| + PointerType storagePointer() const { return const_cast<PointerType>(reinterpret_cast<const T*>(&m_storage)); } |
| + |
| + // FIXME: Investigate whether we should allocate a hunk of virtual memory |
| + // and hand out chunks of it to NeverDestroyed instead, to reduce fragmentation. |
| + typename std::aligned_storage<sizeof(T), std::alignment_of<T>::value>::type m_storage; |
| +}; |
| + |
| +template<typename T> inline NeverDestroyed<T> makeNeverDestroyed(T&& argument) |
| +{ |
| + return NeverDestroyed<T>(std::move(argument)); |
| +} |
| + |
| +} // namespace rtc |
| diff --git a/Source/ThirdParty/libwebrtc/Source/webrtc/rtc_base/numerics/safe_conversions.h b/Source/ThirdParty/libwebrtc/Source/webrtc/rtc_base/numerics/safe_conversions.h |
| index 58efcaa746a..48c212e4d49 100644 |
| --- a/Source/ThirdParty/libwebrtc/Source/webrtc/rtc_base/numerics/safe_conversions.h |
| +++ b/Source/ThirdParty/libwebrtc/Source/webrtc/rtc_base/numerics/safe_conversions.h |
| @@ -63,11 +63,11 @@ inline Dst saturated_cast(Src value) { |
| |
| // Should fail only on attempting to assign NaN to a saturated integer. |
| case internal::TYPE_INVALID: |
| - FATAL(); |
| + RTC_FATAL(); |
| return std::numeric_limits<Dst>::max(); |
| } |
| |
| - FATAL(); |
| + RTC_FATAL(); |
| return static_cast<Dst>(value); |
| } |
| |
| diff --git a/Source/ThirdParty/libwebrtc/Source/webrtc/rtc_base/opensslcertificate.cc b/Source/ThirdParty/libwebrtc/Source/webrtc/rtc_base/opensslcertificate.cc |
| index 4e61b86f3ba..4e325dcec01 100644 |
| --- a/Source/ThirdParty/libwebrtc/Source/webrtc/rtc_base/opensslcertificate.cc |
| +++ b/Source/ThirdParty/libwebrtc/Source/webrtc/rtc_base/opensslcertificate.cc |
| @@ -244,11 +244,11 @@ std::unique_ptr<SSLCertificate> OpenSSLCertificate::Clone() const { |
| std::string OpenSSLCertificate::ToPEMString() const { |
| BIO* bio = BIO_new(BIO_s_mem()); |
| if (!bio) { |
| - FATAL() << "Unreachable code."; |
| + RTC_FATAL() << "Unreachable code."; |
| } |
| if (!PEM_write_bio_X509(bio, x509_)) { |
| BIO_free(bio); |
| - FATAL() << "Unreachable code."; |
| + RTC_FATAL() << "Unreachable code."; |
| } |
| BIO_write(bio, "\0", 1); |
| char* buffer; |
| @@ -264,11 +264,11 @@ void OpenSSLCertificate::ToDER(Buffer* der_buffer) const { |
| // Calculates the DER representation of the certificate, from scratch. |
| BIO* bio = BIO_new(BIO_s_mem()); |
| if (!bio) { |
| - FATAL() << "Unreachable code."; |
| + RTC_FATAL() << "Unreachable code."; |
| } |
| if (!i2d_X509_bio(bio, x509_)) { |
| BIO_free(bio); |
| - FATAL() << "Unreachable code."; |
| + RTC_FATAL() << "Unreachable code."; |
| } |
| char* data = nullptr; |
| size_t length = BIO_get_mem_data(bio, &data); |
| diff --git a/Source/ThirdParty/libwebrtc/Source/webrtc/rtc_base/physicalsocketserver.cc b/Source/ThirdParty/libwebrtc/Source/webrtc/rtc_base/physicalsocketserver.cc |
| index 4ad2857c00c..7448a7e0427 100644 |
| --- a/Source/ThirdParty/libwebrtc/Source/webrtc/rtc_base/physicalsocketserver.cc |
| +++ b/Source/ThirdParty/libwebrtc/Source/webrtc/rtc_base/physicalsocketserver.cc |
| @@ -596,7 +596,7 @@ bool SocketDispatcher::Initialize() { |
| #elif defined(WEBRTC_POSIX) |
| fcntl(s_, F_SETFL, fcntl(s_, F_GETFL, 0) | O_NONBLOCK); |
| #endif |
| -#if defined(WEBRTC_IOS) |
| +#if defined(WEBRTC_IOS) || (defined(WEBRTC_MAC) && defined(WEBRTC_WEBKIT_BUILD)) |
| // iOS may kill sockets when the app is moved to the background |
| // (specifically, if the app doesn't use the "voip" UIBackgroundMode). When |
| // we attempt to write to such a socket, SIGPIPE will be raised, which by |
| diff --git a/Source/ThirdParty/libwebrtc/Source/webrtc/rtc_base/stringize_macros.h b/Source/ThirdParty/libwebrtc/Source/webrtc/rtc_base/stringize_macros.h |
| index aee8d14551d..38c6f1836bd 100644 |
| --- a/Source/ThirdParty/libwebrtc/Source/webrtc/rtc_base/stringize_macros.h |
| +++ b/Source/ThirdParty/libwebrtc/Source/webrtc/rtc_base/stringize_macros.h |
| @@ -8,7 +8,7 @@ |
| * be found in the AUTHORS file in the root of the source tree. |
| */ |
| |
| -// Modified from the Chromium original: |
| +// Modified from the Chxsromium original: |
| // src/base/strings/stringize_macros.h |
| |
| // This file defines preprocessor macros for stringizing preprocessor |
| @@ -33,6 +33,6 @@ |
| // Then: |
| // STRINGIZE(A) produces "FOO" |
| // STRINGIZE(B(y)) produces "myobj->FunctionCall(y)" |
| -#define STRINGIZE(x) STRINGIZE_NO_EXPANSION(x) |
| +#define RTC_STRINGIZE(x) STRINGIZE_NO_EXPANSION(x) |
| |
| #endif // RTC_BASE_STRINGIZE_MACROS_H_ |
| diff --git a/Source/ThirdParty/libwebrtc/Source/webrtc/rtc_base/virtualsocketserver.cc b/Source/ThirdParty/libwebrtc/Source/webrtc/rtc_base/virtualsocketserver.cc |
| index 79694112c81..bfce0f54541 100644 |
| --- a/Source/ThirdParty/libwebrtc/Source/webrtc/rtc_base/virtualsocketserver.cc |
| +++ b/Source/ThirdParty/libwebrtc/Source/webrtc/rtc_base/virtualsocketserver.cc |
| @@ -1026,9 +1026,9 @@ void VirtualSocketServer::UpdateDelayDistribution() { |
| } |
| } |
| |
| -static double PI = 4 * atan(1.0); |
| |
| static double Normal(double x, double mean, double stddev) { |
| + static double PI = 4 * atan(1.0); |
| double a = (x - mean) * (x - mean) / (2 * stddev * stddev); |
| return exp(-a) / (stddev * sqrt(2 * PI)); |
| } |
| diff --git a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/WebKit/EncoderUtilities.h b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/WebKit/EncoderUtilities.h |
| new file mode 100644 |
| index 00000000000..5b9bdfda114 |
| --- /dev/null |
| +++ b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/WebKit/EncoderUtilities.h |
| @@ -0,0 +1,50 @@ |
| +/* |
| + * Copyright (C) 2018 Apple Inc. All rights reserved. |
| + * |
| + * Redistribution and use in source and binary forms, with or without |
| + * modification, are permitted provided that the following conditions |
| + * are met: |
| + * 1. Redistributions of source code must retain the above copyright |
| + * notice, this list of conditions and the following disclaimer. |
| + * 2. Redistributions in binary form must reproduce the above copyright |
| + * notice, this list of conditions and the following disclaimer in the |
| + * documentation and/or other materials provided with the distribution. |
| + * |
| + * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' |
| + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, |
| + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
| + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS |
| + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
| + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
| + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
| + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
| + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
| + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF |
| + * THE POSSIBILITY OF SUCH DAMAGE. |
| + */ |
| + |
| +#pragma once |
| + |
| +#include "VideoProcessingSoftLink.h" |
| + |
| +#if ENABLE_VCP_ENCODER |
| + |
| +#define CompressionSessionRef VCPCompressionSessionRef |
| +#define CompressionSessionSetProperty webrtc::VCPCompressionSessionSetProperty |
| +#define CompressionSessionGetPixelBufferPool webrtc::VCPCompressionSessionGetPixelBufferPool |
| +#define CompressionSessionEncodeFrame webrtc::VCPCompressionSessionEncodeFrame |
| +#define CompressionSessionCreate webrtc::VCPCompressionSessionCreate |
| +#define kCodecTypeH264 kVCPCodecType4CC_H264 |
| +#define CompressionSessionInvalidate webrtc::VCPCompressionSessionInvalidate |
| + |
| +#else |
| + |
| +#define CompressionSessionRef VTCompressionSessionRef |
| +#define CompressionSessionSetProperty VTSessionSetProperty |
| +#define CompressionSessionGetPixelBufferPool VTCompressionSessionGetPixelBufferPool |
| +#define CompressionSessionEncodeFrame VTCompressionSessionEncodeFrame |
| +#define CompressionSessionCreate VTCompressionSessionCreate |
| +#define kCodecTypeH264 kCMVideoCodecType_H264 |
| +#define CompressionSessionInvalidate VTCompressionSessionInvalidate |
| + |
| +#endif |
| diff --git a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/WebKit/VideoProcessingSoftLink.cpp b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/WebKit/VideoProcessingSoftLink.cpp |
| new file mode 100644 |
| index 00000000000..101e87c6677 |
| --- /dev/null |
| +++ b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/WebKit/VideoProcessingSoftLink.cpp |
| @@ -0,0 +1,78 @@ |
| +/* |
| + * Copyright (C) 2018 Apple Inc. All rights reserved. |
| + * |
| + * Redistribution and use in source and binary forms, with or without |
| + * modification, are permitted provided that the following conditions |
| + * are met: |
| + * 1. Redistributions of source code must retain the above copyright |
| + * notice, this list of conditions and the following disclaimer. |
| + * 2. Redistributions in binary form must reproduce the above copyright |
| + * notice, this list of conditions and the following disclaimer in the |
| + * documentation and/or other materials provided with the distribution. |
| + * |
| + * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' |
| + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, |
| + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
| + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS |
| + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
| + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
| + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
| + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
| + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
| + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF |
| + * THE POSSIBILITY OF SUCH DAMAGE. |
| + */ |
| + |
| +#include "VideoProcessingSoftLink.h" |
| + |
| +#if ENABLE_VCP_ENCODER |
| + |
| +#include "rtc_base/logging.h" |
| +#import <dlfcn.h> |
| +#import <objc/runtime.h> |
| + |
| +// Macros copied from <wtf/cocoa/SoftLinking.h> |
| +#define SOFT_LINK_PRIVATE_FRAMEWORK_FOR_SOURCE(functionNamespace, framework) \ |
| + namespace functionNamespace { \ |
| + void* framework##Library(bool isOptional) \ |
| + { \ |
| + static void* frameworkLibrary; \ |
| + static dispatch_once_t once; \ |
| + dispatch_once(&once, ^{ \ |
| + frameworkLibrary = dlopen("/System/Library/PrivateFrameworks/" #framework ".framework/" #framework, RTLD_NOW); \ |
| + if (!isOptional && !frameworkLibrary) \ |
| + RTC_LOG(LS_ERROR) << "Cannot open framework: " << dlerror(); \ |
| + }); \ |
| + return frameworkLibrary; \ |
| + } \ |
| + } |
| + |
| +#define SOFT_LINK_FUNCTION_FOR_SOURCE(functionNamespace, framework, functionName, resultType, parameterDeclarations, parameterNames) \ |
| + extern "C" { \ |
| + resultType functionName parameterDeclarations; \ |
| + } \ |
| + namespace functionNamespace { \ |
| + static resultType init##framework##functionName parameterDeclarations; \ |
| + resultType (*softLink##framework##functionName) parameterDeclarations = init##framework##functionName; \ |
| + static resultType init##framework##functionName parameterDeclarations \ |
| + { \ |
| + static dispatch_once_t once; \ |
| + dispatch_once(&once, ^{ \ |
| + softLink##framework##functionName = (resultType (*) parameterDeclarations) dlsym(framework##Library(), #functionName); \ |
| + if (!softLink##framework##functionName) \ |
| + RTC_LOG(LS_ERROR) << "Cannot find function ##functionName: " << dlerror(); \ |
| + }); \ |
| + return softLink##framework##functionName parameterNames; \ |
| + } \ |
| +} |
| + |
| +SOFT_LINK_PRIVATE_FRAMEWORK_FOR_SOURCE(webrtc, VideoProcessing) |
| + |
| +SOFT_LINK_FUNCTION_FOR_SOURCE(webrtc, VideoProcessing, VCPCompressionSessionSetProperty, OSStatus, (VCPCompressionSessionRef session, CFStringRef key, CFTypeRef value), (session, key, value)) |
| +SOFT_LINK_FUNCTION_FOR_SOURCE(webrtc, VideoProcessing, VCPCompressionSessionGetPixelBufferPool, CVPixelBufferPoolRef, (VCPCompressionSessionRef session), (session)) |
| +SOFT_LINK_FUNCTION_FOR_SOURCE(webrtc, VideoProcessing, VCPCompressionSessionEncodeFrame, OSStatus, (VCPCompressionSessionRef session, CVImageBufferRef buffer, CMTime timestamp, CMTime time, CFDictionaryRef dictionary, void* data, VTEncodeInfoFlags* flags), (session, buffer, timestamp, time, dictionary, data, flags)) |
| +SOFT_LINK_FUNCTION_FOR_SOURCE(webrtc, VideoProcessing, VCPCompressionSessionCreate, OSStatus, (CFAllocatorRef allocator1, int32_t value1 , int32_t value2, CMVideoCodecType type, CFDictionaryRef dictionary1, CFDictionaryRef dictionary2, CFAllocatorRef allocator3, VTCompressionOutputCallback callback, void* data, VCPCompressionSessionRef* session), (allocator1, value1, value2, type, dictionary1, dictionary2, allocator3, callback, data, session)) |
| +SOFT_LINK_FUNCTION_FOR_SOURCE(webrtc, VideoProcessing, VCPCompressionSessionInvalidate, void, (VCPCompressionSessionRef session), (session)) |
| +SOFT_LINK_FUNCTION_FOR_SOURCE(webrtc, VideoProcessing, VPModuleInitialize, void, (), ()) |
| + |
| +#endif // ENABLE_VCP_ENCODER |
| diff --git a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/WebKit/VideoProcessingSoftLink.h b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/WebKit/VideoProcessingSoftLink.h |
| new file mode 100644 |
| index 00000000000..cf866d8a8db |
| --- /dev/null |
| +++ b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/WebKit/VideoProcessingSoftLink.h |
| @@ -0,0 +1,140 @@ |
| +/* |
| + * Copyright (C) 2018 Apple Inc. All rights reserved. |
| + * |
| + * Redistribution and use in source and binary forms, with or without |
| + * modification, are permitted provided that the following conditions |
| + * are met: |
| + * 1. Redistributions of source code must retain the above copyright |
| + * notice, this list of conditions and the following disclaimer. |
| + * 2. Redistributions in binary form must reproduce the above copyright |
| + * notice, this list of conditions and the following disclaimer in the |
| + * documentation and/or other materials provided with the distribution. |
| + * |
| + * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' |
| + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, |
| + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
| + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS |
| + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
| + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
| + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
| + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
| + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
| + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF |
| + * THE POSSIBILITY OF SUCH DAMAGE. |
| + */ |
| + |
| +#pragma once |
| + |
| +#ifdef __APPLE__ |
| +#include <Availability.h> |
| +#include <AvailabilityMacros.h> |
| +#include <TargetConditionals.h> |
| + |
| +// Macro taken from WTF/wtf/Platform.h |
| +#if defined __has_include && __has_include(<CoreFoundation/CFPriv.h>) |
| + |
| +#if (defined(TARGET_IPHONE_SIMULATOR) && TARGET_IPHONE_SIMULATOR) |
| +#define ENABLE_VCP_ENCODER 0 |
| +#elif (defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE) |
| +#define ENABLE_VCP_ENCODER 1 |
| +#elif (defined(TARGET_OS_MAC) && TARGET_OS_MAC) |
| +#define ENABLE_VCP_ENCODER (__MAC_OS_X_VERSION_MIN_REQUIRED >= 101300 && __MAC_OS_X_VERSION_MAX_ALLOWED >= 101304) |
| +#endif |
| + |
| +#endif |
| + |
| +#if !defined(ENABLE_VCP_ENCODER) |
| +#define ENABLE_VCP_ENCODER 0 |
| +#endif |
| + |
| +#if !defined(ALWAYS_INLINE) |
| +#define ALWAYS_INLINE inline |
| +#endif |
| + |
| +#ifdef __cplusplus |
| +#define WTF_EXTERN_C_BEGIN extern "C" { |
| +#define WTF_EXTERN_C_END } |
| +#else |
| +#define WTF_EXTERN_C_BEGIN |
| +#define WTF_EXTERN_C_END |
| +#endif |
| + |
| +// Macros copied from <wtf/cocoa/SoftLinking.h> |
| +#define SOFT_LINK_FRAMEWORK_FOR_HEADER(functionNamespace, framework) \ |
| + namespace functionNamespace { \ |
| + extern void* framework##Library(bool isOptional = false); \ |
| + bool is##framework##FrameworkAvailable(); \ |
| + inline bool is##framework##FrameworkAvailable() { \ |
| + return framework##Library(true) != nullptr; \ |
| + } \ |
| + } |
| + |
| +#define SOFT_LINK_FUNCTION_FOR_HEADER(functionNamespace, framework, functionName, resultType, parameterDeclarations, parameterNames) \ |
| + WTF_EXTERN_C_BEGIN \ |
| + resultType functionName parameterDeclarations; \ |
| + WTF_EXTERN_C_END \ |
| + namespace functionNamespace { \ |
| + extern resultType (*softLink##framework##functionName) parameterDeclarations; \ |
| + inline resultType softLink_##framework##_##functionName parameterDeclarations \ |
| + { \ |
| + return softLink##framework##functionName parameterNames; \ |
| + } \ |
| + } \ |
| + ALWAYS_INLINE resultType functionName parameterDeclarations \ |
| + {\ |
| + return functionNamespace::softLink##framework##functionName parameterNames; \ |
| + } |
| + |
| +#define SOFT_LINK_FRAMEWORK_OPTIONAL(framework) \ |
| + static void* framework##Library() \ |
| + { \ |
| + static void* frameworkLibrary = dlopen("/System/Library/Frameworks/" #framework ".framework/" #framework, RTLD_NOW); \ |
| + return frameworkLibrary; \ |
| + } |
| + |
| +#define SOFT_LINK_POINTER_OPTIONAL(framework, name, type) \ |
| + static type init##name(); \ |
| + static type (*get##name)() = init##name; \ |
| + static type pointer##name; \ |
| + \ |
| + static type name##Function() \ |
| + { \ |
| + return pointer##name; \ |
| + } \ |
| + \ |
| + static type init##name() \ |
| + { \ |
| + void** pointer = static_cast<void**>(dlsym(framework##Library(), #name)); \ |
| + if (pointer) \ |
| + pointer##name = (__bridge type)(*pointer); \ |
| + get##name = name##Function; \ |
| + return pointer##name; \ |
| + } |
| + |
| +#if ENABLE_VCP_ENCODER |
| + |
| +#include <VideoProcessing/VideoProcessing.h> |
| + |
| +SOFT_LINK_FRAMEWORK_FOR_HEADER(webrtc, VideoProcessing) |
| + |
| +SOFT_LINK_FUNCTION_FOR_HEADER(webrtc, VideoProcessing, VCPCompressionSessionSetProperty, OSStatus, (VCPCompressionSessionRef session, CFStringRef key, CFTypeRef value), (session, key, value)) |
| +#define VCPCompressionSessionSetProperty softLink_VideoProcessing_VCPCompressionSessionSetProperty |
| + |
| +SOFT_LINK_FUNCTION_FOR_HEADER(webrtc, VideoProcessing, VCPCompressionSessionGetPixelBufferPool, CVPixelBufferPoolRef, (VCPCompressionSessionRef session), (session)) |
| +#define VCPCompressionSessionGetPixelBufferPool softLink_VideoProcessing_VCPCompressionSessionGetPixelBufferPool |
| + |
| +SOFT_LINK_FUNCTION_FOR_HEADER(webrtc, VideoProcessing, VCPCompressionSessionEncodeFrame, OSStatus, (VCPCompressionSessionRef session, CVImageBufferRef buffer, CMTime timestamp, CMTime time, CFDictionaryRef dictionary, void * data, VTEncodeInfoFlags * flags), (session, buffer, timestamp, time, dictionary, data, flags)) |
| +#define VCPCompressionSessionEncodeFrame softLink_VideoProcessing_VCPCompressionSessionEncodeFrame |
| + |
| +SOFT_LINK_FUNCTION_FOR_HEADER(webrtc, VideoProcessing, VCPCompressionSessionCreate, OSStatus, (CFAllocatorRef allocator1, int32_t value1 , int32_t value2, CMVideoCodecType type, CFDictionaryRef dictionary1, CFDictionaryRef dictionary2, CFAllocatorRef allocator3, VTCompressionOutputCallback callback, void * data, VCPCompressionSessionRef *session), (allocator1, value1, value2, type, dictionary1, dictionary2, allocator3, callback, data, session)) |
| +#define VCPCompressionSessionCreate softLink_VideoProcessing_VCPCompressionSessionCreate |
| + |
| +SOFT_LINK_FUNCTION_FOR_HEADER(webrtc, VideoProcessing, VCPCompressionSessionInvalidate, void, (VCPCompressionSessionRef session), (session)) |
| +#define VCPCompressionSessionInvalidate softLink_VideoProcessing_VCPCompressionSessionInvalidate |
| + |
| +SOFT_LINK_FUNCTION_FOR_HEADER(webrtc, VideoProcessing, VPModuleInitialize, void, (), ()) |
| +#define VPModuleInitialize softLink_VideoProcessing_VPModuleInitialize |
| + |
| +#endif // ENABLE_VCP_ENCODER |
| + |
| +#endif // __APPLE__ |
| diff --git a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/WebKit/WebKitUtilities.h b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/WebKit/WebKitUtilities.h |
| new file mode 100644 |
| index 00000000000..ef1456eddd3 |
| --- /dev/null |
| +++ b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/WebKit/WebKitUtilities.h |
| @@ -0,0 +1,54 @@ |
| +/* |
| + * Copyright (C) 2018 Apple Inc. All rights reserved. |
| + * |
| + * Redistribution and use in source and binary forms, with or without |
| + * modification, are permitted provided that the following conditions |
| + * are met: |
| + * 1. Redistributions of source code must retain the above copyright |
| + * notice, this list of conditions and the following disclaimer. |
| + * 2. Redistributions in binary form must reproduce the above copyright |
| + * notice, this list of conditions and the following disclaimer in the |
| + * documentation and/or other materials provided with the distribution. |
| + * |
| + * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' |
| + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, |
| + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
| + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS |
| + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
| + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
| + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
| + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
| + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
| + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF |
| + * THE POSSIBILITY OF SUCH DAMAGE. |
| + */ |
| + |
| +#pragma once |
| + |
| +#include "api/video/video_frame_buffer.h" |
| +#include "rtc_base/scoped_ref_ptr.h" |
| +#include "webrtc/media/engine/webrtcvideodecoderfactory.h" |
| +#include "webrtc/media/engine/webrtcvideoencoderfactory.h" |
| + |
| +typedef struct __CVBuffer* CVPixelBufferRef; |
| + |
| +namespace webrtc { |
| + |
| +class VideoDecoderFactory; |
| +class VideoEncoderFactory; |
| +class VideoFrame; |
| + |
| +enum class WebKitCodecSupport { H264, H264AndVP8 }; |
| + |
| +std::unique_ptr<webrtc::VideoEncoderFactory> createWebKitEncoderFactory(WebKitCodecSupport); |
| +std::unique_ptr<webrtc::VideoDecoderFactory> createWebKitDecoderFactory(WebKitCodecSupport); |
| + |
| +void setApplicationStatus(bool isActive); |
| + |
| +void setH264HardwareEncoderAllowed(bool); |
| +bool isH264HardwareEncoderAllowed(); |
| + |
| +CVPixelBufferRef pixelBufferFromFrame(const VideoFrame&, const std::function<CVPixelBufferRef(size_t, size_t)>&); |
| +rtc::scoped_refptr<webrtc::VideoFrameBuffer> pixelBufferToFrame(CVPixelBufferRef); |
| + |
| +} |
| diff --git a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/WebKit/WebKitUtilities.mm b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/WebKit/WebKitUtilities.mm |
| new file mode 100644 |
| index 00000000000..65eefa36f2d |
| --- /dev/null |
| +++ b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/WebKit/WebKitUtilities.mm |
| @@ -0,0 +1,185 @@ |
| +/* |
| + * Copyright (C) 2018 Apple Inc. All rights reserved. |
| + * |
| + * Redistribution and use in source and binary forms, with or without |
| + * modification, are permitted provided that the following conditions |
| + * are met: |
| + * 1. Redistributions of source code must retain the above copyright |
| + * notice, this list of conditions and the following disclaimer. |
| + * 2. Redistributions in binary form must reproduce the above copyright |
| + * notice, this list of conditions and the following disclaimer in the |
| + * documentation and/or other materials provided with the distribution. |
| + * |
| + * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' |
| + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, |
| + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
| + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS |
| + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
| + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
| + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
| + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
| + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
| + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF |
| + * THE POSSIBILITY OF SUCH DAMAGE. |
| + */ |
| + |
| +#include "WebKitUtilities.h" |
| + |
| +//#include "Common/RTCUIApplicationStatusObserver.h" |
| +#import "WebRTC/RTCVideoCodecH264.h" |
| + |
| +#include "api/video/video_frame.h" |
| +#include "native/src/objc_frame_buffer.h" |
| +#include "third_party/libyuv/include/libyuv/convert_from.h" |
| +#include "webrtc/rtc_base/checks.h" |
| +#include "Framework/Headers/WebRTC/RTCVideoCodecFactory.h" |
| +#include "Framework/Headers/WebRTC/RTCVideoFrame.h" |
| +#include "Framework/Headers/WebRTC/RTCVideoFrameBuffer.h" |
| +#include "Framework/Native/api/video_decoder_factory.h" |
| +#include "Framework/Native/api/video_encoder_factory.h" |
| +/* |
| +#if !defined(WEBRTC_IOS) |
| +__attribute__((objc_runtime_name("WK_RTCUIApplicationStatusObserver"))) |
| +@interface RTCUIApplicationStatusObserver : NSObject |
| + |
| ++ (instancetype)sharedInstance; |
| ++ (void)prepareForUse; |
| + |
| +- (BOOL)isApplicationActive; |
| + |
| +@end |
| +#endif |
| + |
| +@implementation RTCUIApplicationStatusObserver { |
| + BOOL _isActive; |
| +} |
| + |
| ++ (instancetype)sharedInstance { |
| + static id sharedInstance; |
| + static dispatch_once_t onceToken; |
| + dispatch_once(&onceToken, ^{ |
| + sharedInstance = [[self alloc] init]; |
| + }); |
| + |
| + return sharedInstance; |
| +} |
| + |
| ++ (void)prepareForUse { |
| + __unused RTCUIApplicationStatusObserver *observer = [self sharedInstance]; |
| +} |
| + |
| +- (id)init { |
| + _isActive = YES; |
| + return self; |
| +} |
| + |
| +- (void)setActive { |
| + _isActive = YES; |
| +} |
| + |
| +- (void)setInactive { |
| + _isActive = NO; |
| +} |
| + |
| +- (BOOL)isApplicationActive { |
| + return _isActive; |
| +} |
| + |
| +@end |
| +*/ |
| +namespace webrtc { |
| + |
| +void setApplicationStatus(bool isActive) |
| +{ |
| +/* |
| + if (isActive) |
| + [[RTCUIApplicationStatusObserver sharedInstance] setActive]; |
| + else |
| + [[RTCUIApplicationStatusObserver sharedInstance] setInactive]; |
| + */ |
| +} |
| + |
| +std::unique_ptr<webrtc::VideoEncoderFactory> createWebKitEncoderFactory(WebKitCodecSupport codecSupport) |
| +{ |
| +#if ENABLE_VCP_ENCODER |
| + static std::once_flag onceFlag; |
| + std::call_once(onceFlag, [] { |
| + webrtc::VPModuleInitialize(); |
| + }); |
| +#endif |
| + return ObjCToNativeVideoEncoderFactory(codecSupport == WebKitCodecSupport::H264AndVP8 ? [[RTCDefaultVideoEncoderFactory alloc] init] : [[RTCVideoEncoderFactoryH264 alloc] init]); |
| +} |
| + |
| +std::unique_ptr<webrtc::VideoDecoderFactory> createWebKitDecoderFactory(WebKitCodecSupport codecSupport) |
| +{ |
| + return ObjCToNativeVideoDecoderFactory(codecSupport == WebKitCodecSupport::H264AndVP8 ? [[RTCDefaultVideoDecoderFactory alloc] init] : [[RTCVideoDecoderFactoryH264 alloc] init]); |
| +} |
| + |
| +static bool h264HardwareEncoderAllowed = true; |
| +void setH264HardwareEncoderAllowed(bool allowed) |
| +{ |
| + h264HardwareEncoderAllowed = allowed; |
| +} |
| + |
| +bool isH264HardwareEncoderAllowed() |
| +{ |
| + return h264HardwareEncoderAllowed; |
| +} |
| + |
| +rtc::scoped_refptr<webrtc::VideoFrameBuffer> pixelBufferToFrame(CVPixelBufferRef pixelBuffer) |
| +{ |
| + RTCCVPixelBuffer *frameBuffer = [[RTCCVPixelBuffer alloc] initWithPixelBuffer:pixelBuffer]; |
| + return new rtc::RefCountedObject<ObjCFrameBuffer>(frameBuffer); |
| +} |
| + |
| +static bool CopyVideoFrameToPixelBuffer(const rtc::scoped_refptr<webrtc::I420BufferInterface>& frame, CVPixelBufferRef pixel_buffer) { |
| + RTC_DCHECK(pixel_buffer); |
| + RTC_DCHECK(CVPixelBufferGetPixelFormatType(pixel_buffer) == kCVPixelFormatType_420YpCbCr8BiPlanarFullRange || CVPixelBufferGetPixelFormatType(pixel_buffer) == kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange); |
| + RTC_DCHECK_EQ(CVPixelBufferGetHeightOfPlane(pixel_buffer, 0), static_cast<size_t>(frame->height())); |
| + RTC_DCHECK_EQ(CVPixelBufferGetWidthOfPlane(pixel_buffer, 0), static_cast<size_t>(frame->width())); |
| + |
| + if (CVPixelBufferLockBaseAddress(pixel_buffer, 0) != kCVReturnSuccess) |
| + return false; |
| + |
| + uint8_t* dst_y = reinterpret_cast<uint8_t*>(CVPixelBufferGetBaseAddressOfPlane(pixel_buffer, 0)); |
| + int dst_stride_y = CVPixelBufferGetBytesPerRowOfPlane(pixel_buffer, 0); |
| + |
| + uint8_t* dst_uv = reinterpret_cast<uint8_t*>(CVPixelBufferGetBaseAddressOfPlane(pixel_buffer, 1)); |
| + int dst_stride_uv = CVPixelBufferGetBytesPerRowOfPlane(pixel_buffer, 1); |
| + |
| + int result = libyuv::I420ToNV12( |
| + frame->DataY(), frame->StrideY(), |
| + frame->DataU(), frame->StrideU(), |
| + frame->DataV(), frame->StrideV(), |
| + dst_y, dst_stride_y, dst_uv, dst_stride_uv, |
| + frame->width(), frame->height()); |
| + |
| + CVPixelBufferUnlockBaseAddress(pixel_buffer, 0); |
| + |
| + if (result) |
| + return false; |
| + |
| + return true; |
| +} |
| + |
| + |
| +CVPixelBufferRef pixelBufferFromFrame(const VideoFrame& frame, const std::function<CVPixelBufferRef(size_t, size_t)>& makePixelBuffer) |
| +{ |
| + if (frame.video_frame_buffer()->type() != VideoFrameBuffer::Type::kNative) { |
| + rtc::scoped_refptr<const I420BufferInterface> buffer = frame.video_frame_buffer()->GetI420(); |
| + |
| + auto pixelBuffer = makePixelBuffer(buffer->width(), buffer->height()); |
| + if (pixelBuffer) |
| + CopyVideoFrameToPixelBuffer(frame.video_frame_buffer()->GetI420(), pixelBuffer); |
| + return pixelBuffer; |
| + } |
| + |
| + auto *frameBuffer = static_cast<ObjCFrameBuffer*>(frame.video_frame_buffer().get())->wrapped_frame_buffer(); |
| + if (![frameBuffer isKindOfClass:[RTCCVPixelBuffer class]]) |
| + return nullptr; |
| + |
| + auto *rtcPixelBuffer = (RTCCVPixelBuffer *)frameBuffer; |
| + return rtcPixelBuffer.pixelBuffer; |
| +} |
| + |
| +} |
| diff --git a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/api/peerconnection/RTCEncodedImage+Private.mm b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/api/peerconnection/RTCEncodedImage+Private.mm |
| index 6f2d1f46d9c..f9901bd327e 100644 |
| --- a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/api/peerconnection/RTCEncodedImage+Private.mm |
| +++ b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/api/peerconnection/RTCEncodedImage+Private.mm |
| @@ -56,6 +56,7 @@ - (webrtc::EncodedImage)nativeEncodedImage { |
| encodedImage.rotation_ = webrtc::VideoRotation(self.rotation); |
| encodedImage._completeFrame = self.completeFrame; |
| encodedImage.qp_ = self.qp ? self.qp.intValue : -1; |
| + encodedImage.SetSpatialIndex(self.spatialIndex); |
| encodedImage.content_type_ = (self.contentType == RTCVideoContentTypeScreenshare) ? |
| webrtc::VideoContentType::SCREENSHARE : |
| webrtc::VideoContentType::UNSPECIFIED; |
| diff --git a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/api/peerconnection/RTCRtpEncodingParameters.h b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/api/peerconnection/RTCRtpEncodingParameters.h |
| index ba50bde649f..dabff725abb 100644 |
| --- a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/api/peerconnection/RTCRtpEncodingParameters.h |
| +++ b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/api/peerconnection/RTCRtpEncodingParameters.h |
| @@ -15,6 +15,7 @@ |
| NS_ASSUME_NONNULL_BEGIN |
| |
| RTC_OBJC_EXPORT |
| +__attribute__((objc_runtime_name("WK_RTCRtpEncodingParameters"))) |
| @interface RTCRtpEncodingParameters : NSObject |
| |
| /** Controls whether the encoding is currently transmitted. */ |
| diff --git a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/api/peerconnection/RTCVideoEncoderSettings+Private.h b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/api/peerconnection/RTCVideoEncoderSettings+Private.h |
| index 5b062455bc0..72af732b23b 100644 |
| --- a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/api/peerconnection/RTCVideoEncoderSettings+Private.h |
| +++ b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/api/peerconnection/RTCVideoEncoderSettings+Private.h |
| @@ -22,4 +22,11 @@ NS_ASSUME_NONNULL_BEGIN |
| |
| @end |
| |
| +@interface RTCVideoBitrateAllocation (Private) |
| + |
| +- (instancetype)initWithNativeVideoBitrateAllocation:(const webrtc::VideoBitrateAllocation *__nullable)videoBitrateAllocation; |
| +- (webrtc::VideoBitrateAllocation)nativeVideoBitrateAllocation; |
| + |
| +@end |
| + |
| NS_ASSUME_NONNULL_END |
| diff --git a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/api/peerconnection/RTCVideoEncoderSettings+Private.mm b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/api/peerconnection/RTCVideoEncoderSettings+Private.mm |
| index 6fb81dbb8af..82b5ba7bc0f 100644 |
| --- a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/api/peerconnection/RTCVideoEncoderSettings+Private.mm |
| +++ b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/api/peerconnection/RTCVideoEncoderSettings+Private.mm |
| @@ -12,6 +12,23 @@ |
| |
| #import "helpers/NSString+StdString.h" |
| |
| +@implementation RTCVideoEncoderSettings { |
| + webrtc::VideoCodec _nativeVideoCodec; |
| +} |
| + |
| +@synthesize name = _name; |
| +@synthesize width = _width; |
| +@synthesize height = _height; |
| +@synthesize startBitrate = _startBitrate; |
| +@synthesize maxBitrate = _maxBitrate; |
| +@synthesize minBitrate = _minBitrate; |
| +@synthesize targetBitrate = _targetBitrate; |
| +@synthesize maxFramerate = _maxFramerate; |
| +@synthesize qpMax = _qpMax; |
| +@synthesize mode = _mode; |
| + |
| +@end |
| + |
| @implementation RTCVideoEncoderSettings (Private) |
| |
| - (instancetype)initWithNativeVideoCodec:(const webrtc::VideoCodec *)videoCodec { |
| @@ -20,6 +37,7 @@ - (instancetype)initWithNativeVideoCodec:(const webrtc::VideoCodec *)videoCodec |
| const char *codecName = CodecTypeToPayloadString(videoCodec->codecType); |
| self.name = [NSString stringWithUTF8String:codecName]; |
| |
| + _nativeVideoCodec = *videoCodec; |
| self.width = videoCodec->width; |
| self.height = videoCodec->height; |
| self.startBitrate = videoCodec->startBitrate; |
| @@ -36,18 +54,28 @@ - (instancetype)initWithNativeVideoCodec:(const webrtc::VideoCodec *)videoCodec |
| } |
| |
| - (webrtc::VideoCodec)nativeVideoCodec { |
| - webrtc::VideoCodec videoCodec; |
| - videoCodec.width = self.width; |
| - videoCodec.height = self.height; |
| - videoCodec.startBitrate = self.startBitrate; |
| - videoCodec.maxBitrate = self.maxBitrate; |
| - videoCodec.minBitrate = self.minBitrate; |
| - videoCodec.targetBitrate = self.targetBitrate; |
| - videoCodec.maxBitrate = self.maxBitrate; |
| - videoCodec.qpMax = self.qpMax; |
| - videoCodec.mode = (webrtc::VideoCodecMode)self.mode; |
| - |
| - return videoCodec; |
| + return _nativeVideoCodec; |
| +} |
| + |
| +@end |
| + |
| +@implementation RTCVideoBitrateAllocation { |
| + webrtc::VideoBitrateAllocation _nativeVideoBitrateAllocation; |
| +} |
| + |
| +@end |
| + |
| +@implementation RTCVideoBitrateAllocation (Private) |
| + |
| +- (instancetype)initWithNativeVideoBitrateAllocation:(const webrtc::VideoBitrateAllocation *)videoBitrateAllocation { |
| + if (self = [super init]) { |
| + _nativeVideoBitrateAllocation = *videoBitrateAllocation; |
| + } |
| + return self; |
| +} |
| + |
| +- (webrtc::VideoBitrateAllocation)nativeVideoBitrateAllocation { |
| + return _nativeVideoBitrateAllocation; |
| } |
| |
| @end |
| diff --git a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/api/video_codec/RTCVideoCodecConstants.mm b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/api/video_codec/RTCVideoCodecConstants.mm |
| index acbf126170c..1447d3b27e1 100644 |
| --- a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/api/video_codec/RTCVideoCodecConstants.mm |
| +++ b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/api/video_codec/RTCVideoCodecConstants.mm |
| @@ -13,5 +13,5 @@ |
| |
| #include "media/base/mediaconstants.h" |
| |
| -NSString *const kRTCVideoCodecVp8Name = @(cricket::kVp8CodecName); |
| -NSString *const kRTCVideoCodecVp9Name = @(cricket::kVp9CodecName); |
| +NSString *const kRTCVideoCodecVp8Name = @"VP8"; |
| +NSString *const kRTCVideoCodecVp9Name = @"VP9"; |
| diff --git a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/api/video_codec/RTCVideoEncoderVP8.h b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/api/video_codec/RTCVideoEncoderVP8.h |
| index 8d87a898931..08d18504222 100644 |
| --- a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/api/video_codec/RTCVideoEncoderVP8.h |
| +++ b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/api/video_codec/RTCVideoEncoderVP8.h |
| @@ -14,6 +14,7 @@ |
| #import "RTCVideoEncoder.h" |
| |
| RTC_OBJC_EXPORT |
| +__attribute__((objc_runtime_name("WK_RTCVideoEncoderVP8"))) |
| @interface RTCVideoEncoderVP8 : NSObject |
| |
| /* This returns a VP8 encoder that can be returned from a RTCVideoEncoderFactory injected into |
| diff --git a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/api/video_codec/RTCWrappedNativeVideoEncoder.mm b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/api/video_codec/RTCWrappedNativeVideoEncoder.mm |
| index 9afd54f55f5..b9634779f1f 100644 |
| --- a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/api/video_codec/RTCWrappedNativeVideoEncoder.mm |
| +++ b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/api/video_codec/RTCWrappedNativeVideoEncoder.mm |
| @@ -58,6 +58,11 @@ - (int)setBitrate:(uint32_t)bitrateKbit framerate:(uint32_t)framerate { |
| return 0; |
| } |
| |
| +- (int)setRateAllocation:(nonnull RTCVideoBitrateAllocation *)allocation framerate:(uint32_t)framerate { |
| + RTC_NOTREACHED(); |
| + return 0; |
| +} |
| + |
| - (NSString *)implementationName { |
| RTC_NOTREACHED(); |
| return nil; |
| diff --git a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/api/video_frame_buffer/RTCNativeI420Buffer.h b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/api/video_frame_buffer/RTCNativeI420Buffer.h |
| index 9a904f5396a..dc903bc4bca 100644 |
| --- a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/api/video_frame_buffer/RTCNativeI420Buffer.h |
| +++ b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/api/video_frame_buffer/RTCNativeI420Buffer.h |
| @@ -17,6 +17,7 @@ NS_ASSUME_NONNULL_BEGIN |
| |
| /** RTCI420Buffer implements the RTCI420Buffer protocol */ |
| RTC_OBJC_EXPORT |
| +__attribute__((objc_runtime_name("WK_RTCI420Buffer"))) |
| @interface RTCI420Buffer : NSObject<RTCI420Buffer> |
| @end |
| |
| diff --git a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/api/video_frame_buffer/RTCNativeMutableI420Buffer.h b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/api/video_frame_buffer/RTCNativeMutableI420Buffer.h |
| index 6cd5110460b..7cfa950abb6 100644 |
| --- a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/api/video_frame_buffer/RTCNativeMutableI420Buffer.h |
| +++ b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/api/video_frame_buffer/RTCNativeMutableI420Buffer.h |
| @@ -18,6 +18,7 @@ NS_ASSUME_NONNULL_BEGIN |
| |
| /** Mutable version of RTCI420Buffer */ |
| RTC_OBJC_EXPORT |
| +__attribute__((objc_runtime_name("WK_RTCMutableI420Buffer"))) |
| @interface RTCMutableI420Buffer : RTCI420Buffer<RTCMutableI420Buffer> |
| @end |
| |
| diff --git a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/base/RTCCodecSpecificInfo.h b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/base/RTCCodecSpecificInfo.h |
| index e2ae4cafa11..9dc44c12af8 100644 |
| --- a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/base/RTCCodecSpecificInfo.h |
| +++ b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/base/RTCCodecSpecificInfo.h |
| @@ -18,6 +18,7 @@ NS_ASSUME_NONNULL_BEGIN |
| * Corresponds to webrtc::CodecSpecificInfo. |
| */ |
| RTC_OBJC_EXPORT |
| +__attribute__((objc_runtime_name("WK_RTCCodecSpecificInfo"))) |
| @protocol RTCCodecSpecificInfo <NSObject> |
| @end |
| |
| diff --git a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/base/RTCEncodedImage.h b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/base/RTCEncodedImage.h |
| index 670c7276ff7..7994ce64a1f 100644 |
| --- a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/base/RTCEncodedImage.h |
| +++ b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/base/RTCEncodedImage.h |
| @@ -31,6 +31,7 @@ typedef NS_ENUM(NSUInteger, RTCVideoContentType) { |
| |
| /** Represents an encoded frame. Corresponds to webrtc::EncodedImage. */ |
| RTC_OBJC_EXPORT |
| +__attribute__((objc_runtime_name("WK_RTCEncodedImage"))) |
| @interface RTCEncodedImage : NSObject |
| |
| @property(nonatomic, strong) NSData *buffer; |
| @@ -47,6 +48,7 @@ RTC_OBJC_EXPORT |
| @property(nonatomic, assign) BOOL completeFrame; |
| @property(nonatomic, strong) NSNumber *qp; |
| @property(nonatomic, assign) RTCVideoContentType contentType; |
| +@property(nonatomic, assign) int spatialIndex; |
| |
| @end |
| |
| diff --git a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/base/RTCEncodedImage.m b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/base/RTCEncodedImage.m |
| index 024a57c541b..85cd5e298e4 100644 |
| --- a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/base/RTCEncodedImage.m |
| +++ b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/base/RTCEncodedImage.m |
| @@ -26,5 +26,6 @@ @implementation RTCEncodedImage |
| @synthesize completeFrame = _completeFrame; |
| @synthesize qp = _qp; |
| @synthesize contentType = _contentType; |
| +@synthesize spatialIndex = _spatialIndex; |
| |
| @end |
| diff --git a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/base/RTCI420Buffer.h b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/base/RTCI420Buffer.h |
| index a6c7e41bcba..cfa14f8af23 100644 |
| --- a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/base/RTCI420Buffer.h |
| +++ b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/base/RTCI420Buffer.h |
| @@ -16,6 +16,7 @@ NS_ASSUME_NONNULL_BEGIN |
| |
| /** Protocol for RTCYUVPlanarBuffers containing I420 data */ |
| RTC_OBJC_EXPORT |
| +__attribute__((objc_runtime_name("WK_RTCI420Buffer"))) |
| @protocol RTCI420Buffer <RTCYUVPlanarBuffer> |
| @end |
| |
| diff --git a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/base/RTCRtpFragmentationHeader.h b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/base/RTCRtpFragmentationHeader.h |
| index 2e26b08b8af..fbbc68a8ef6 100644 |
| --- a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/base/RTCRtpFragmentationHeader.h |
| +++ b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/base/RTCRtpFragmentationHeader.h |
| @@ -16,6 +16,7 @@ NS_ASSUME_NONNULL_BEGIN |
| |
| /** Information for header. Corresponds to webrtc::RTPFragmentationHeader. */ |
| RTC_OBJC_EXPORT |
| +__attribute__((objc_runtime_name("WK_RTCRtpFragmentationHeader"))) |
| @interface RTCRtpFragmentationHeader : NSObject |
| |
| @property(nonatomic, strong) NSArray<NSNumber *> *fragmentationOffset; |
| diff --git a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/base/RTCRtpFragmentationHeader.m b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/base/RTCRtpFragmentationHeader.m |
| index 8049abc411e..6cf21ddc2a1 100644 |
| --- a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/base/RTCRtpFragmentationHeader.m |
| +++ b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/base/RTCRtpFragmentationHeader.m |
| @@ -17,4 +17,5 @@ @implementation RTCRtpFragmentationHeader |
| @synthesize fragmentationTimeDiff = _fragmentationTimeDiff; |
| @synthesize fragmentationPlType = _fragmentationPlType; |
| |
| -@end |
| \ No newline at end of file |
| +@end |
| + |
| diff --git a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/base/RTCVideoCodecInfo.h b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/base/RTCVideoCodecInfo.h |
| index 2162caaa21f..4e643d94347 100644 |
| --- a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/base/RTCVideoCodecInfo.h |
| +++ b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/base/RTCVideoCodecInfo.h |
| @@ -16,6 +16,7 @@ NS_ASSUME_NONNULL_BEGIN |
| |
| /** Holds information to identify a codec. Corresponds to webrtc::SdpVideoFormat. */ |
| RTC_OBJC_EXPORT |
| +__attribute__((objc_runtime_name("WK_RTCVideoCodecInfo"))) |
| @interface RTCVideoCodecInfo : NSObject <NSCoding> |
| |
| - (instancetype)init NS_UNAVAILABLE; |
| diff --git a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/base/RTCVideoDecoder.h b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/base/RTCVideoDecoder.h |
| index 18c6f6b0006..534420d3955 100644 |
| --- a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/base/RTCVideoDecoder.h |
| +++ b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/base/RTCVideoDecoder.h |
| @@ -23,6 +23,7 @@ typedef void (^RTCVideoDecoderCallback)(RTCVideoFrame *frame); |
| |
| /** Protocol for decoder implementations. */ |
| RTC_OBJC_EXPORT |
| +__attribute__((objc_runtime_name("WK_RTCVideoDecoder"))) |
| @protocol RTCVideoDecoder <NSObject> |
| |
| - (void)setCallback:(RTCVideoDecoderCallback)callback; |
| diff --git a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/base/RTCVideoDecoderFactory.h b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/base/RTCVideoDecoderFactory.h |
| index 3e24153b82c..cb95fa3f134 100644 |
| --- a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/base/RTCVideoDecoderFactory.h |
| +++ b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/base/RTCVideoDecoderFactory.h |
| @@ -18,6 +18,7 @@ NS_ASSUME_NONNULL_BEGIN |
| |
| /** RTCVideoDecoderFactory is an Objective-C version of webrtc::VideoDecoderFactory. */ |
| RTC_OBJC_EXPORT |
| +__attribute__((objc_runtime_name("WK_RTCVideoDecoderFactory"))) |
| @protocol RTCVideoDecoderFactory <NSObject> |
| |
| - (nullable id<RTCVideoDecoder>)createDecoder:(RTCVideoCodecInfo *)info; |
| diff --git a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/base/RTCVideoEncoder.h b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/base/RTCVideoEncoder.h |
| index c5257674d83..5291bb1342b 100644 |
| --- a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/base/RTCVideoEncoder.h |
| +++ b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/base/RTCVideoEncoder.h |
| @@ -19,7 +19,11 @@ |
| #import "RTCVideoFrame.h" |
| |
| NS_ASSUME_NONNULL_BEGIN |
| - |
| +/* |
| +namespace webrtc { |
| +class VideoBitrateAllocation; |
| +}; |
| +*/ |
| /** Callback block for encoder. */ |
| typedef BOOL (^RTCVideoEncoderCallback)(RTCEncodedImage *frame, |
| id<RTCCodecSpecificInfo> info, |
| @@ -27,6 +31,7 @@ typedef BOOL (^RTCVideoEncoderCallback)(RTCEncodedImage *frame, |
| |
| /** Protocol for encoder implementations. */ |
| RTC_OBJC_EXPORT |
| +__attribute__((objc_runtime_name("WK_RTCVideoEncoder"))) |
| @protocol RTCVideoEncoder <NSObject> |
| |
| - (void)setCallback:(RTCVideoEncoderCallback)callback; |
| @@ -37,6 +42,7 @@ RTC_OBJC_EXPORT |
| codecSpecificInfo:(nullable id<RTCCodecSpecificInfo>)info |
| frameTypes:(NSArray<NSNumber *> *)frameTypes; |
| - (int)setBitrate:(uint32_t)bitrateKbit framerate:(uint32_t)framerate; |
| +- (int)setRateAllocation: (RTCVideoBitrateAllocation *)allocation framerate:(uint32_t)framerate; |
| - (NSString *)implementationName; |
| |
| /** Returns QP scaling settings for encoder. The quality scaler adjusts the resolution in order to |
| diff --git a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/base/RTCVideoEncoderFactory.h b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/base/RTCVideoEncoderFactory.h |
| index 20c603d6fe6..cbe9ea492ae 100644 |
| --- a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/base/RTCVideoEncoderFactory.h |
| +++ b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/base/RTCVideoEncoderFactory.h |
| @@ -18,6 +18,7 @@ NS_ASSUME_NONNULL_BEGIN |
| |
| /** RTCVideoEncoderFactory is an Objective-C version of webrtc::VideoEncoderFactory. */ |
| RTC_OBJC_EXPORT |
| +__attribute__((objc_runtime_name("WK_RTCVideoEncoderFactory"))) |
| @protocol RTCVideoEncoderFactory <NSObject> |
| |
| - (nullable id<RTCVideoEncoder>)createEncoder:(RTCVideoCodecInfo *)info; |
| diff --git a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/base/RTCVideoEncoderQpThresholds.h b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/base/RTCVideoEncoderQpThresholds.h |
| index 2b48f45ce0a..68cfd66df47 100644 |
| --- a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/base/RTCVideoEncoderQpThresholds.h |
| +++ b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/base/RTCVideoEncoderQpThresholds.h |
| @@ -16,6 +16,7 @@ NS_ASSUME_NONNULL_BEGIN |
| |
| /** QP thresholds for encoder. Corresponds to webrtc::VideoEncoder::QpThresholds. */ |
| RTC_OBJC_EXPORT |
| +__attribute__((objc_runtime_name("WK_RTCVideoEncoderQpThresholds"))) |
| @interface RTCVideoEncoderQpThresholds : NSObject |
| |
| - (instancetype)initWithThresholdsLow:(NSInteger)low high:(NSInteger)high; |
| diff --git a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/base/RTCVideoEncoderSettings.h b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/base/RTCVideoEncoderSettings.h |
| index 69e04cac70f..ae3bf5fb5f1 100644 |
| --- a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/base/RTCVideoEncoderSettings.h |
| +++ b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/base/RTCVideoEncoderSettings.h |
| @@ -21,6 +21,7 @@ typedef NS_ENUM(NSUInteger, RTCVideoCodecMode) { |
| |
| /** Settings for encoder. Corresponds to webrtc::VideoCodec. */ |
| RTC_OBJC_EXPORT |
| +__attribute__((objc_runtime_name("WK_RTCVideoEncoderSettings"))) |
| @interface RTCVideoEncoderSettings : NSObject |
| |
| @property(nonatomic, strong) NSString *name; |
| @@ -40,4 +41,9 @@ RTC_OBJC_EXPORT |
| |
| @end |
| |
| +RTC_OBJC_EXPORT |
| +__attribute__((objc_runtime_name("WK_RTCVideoBitrateAllocation"))) |
| +@interface RTCVideoBitrateAllocation : NSObject |
| +@end |
| + |
| NS_ASSUME_NONNULL_END |
| diff --git a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/base/RTCVideoFrame.h b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/base/RTCVideoFrame.h |
| index 9aca7433f34..bde09c50c9d 100644 |
| --- a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/base/RTCVideoFrame.h |
| +++ b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/base/RTCVideoFrame.h |
| @@ -26,6 +26,7 @@ typedef NS_ENUM(NSInteger, RTCVideoRotation) { |
| |
| // RTCVideoFrame is an ObjectiveC version of webrtc::VideoFrame. |
| RTC_OBJC_EXPORT |
| +__attribute__((objc_runtime_name("WK_RTCVideoFrame"))) |
| @interface RTCVideoFrame : NSObject |
| |
| /** Width without rotation applied. */ |
| diff --git a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/base/RTCVideoFrameBuffer.h b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/base/RTCVideoFrameBuffer.h |
| index bb9e6fba631..186ad0889bf 100644 |
| --- a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/base/RTCVideoFrameBuffer.h |
| +++ b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/base/RTCVideoFrameBuffer.h |
| @@ -18,6 +18,7 @@ NS_ASSUME_NONNULL_BEGIN |
| |
| // RTCVideoFrameBuffer is an ObjectiveC version of webrtc::VideoFrameBuffer. |
| RTC_OBJC_EXPORT |
| +__attribute__((objc_runtime_name("WK_RTCVideoFrameBuffer"))) |
| @protocol RTCVideoFrameBuffer <NSObject> |
| |
| @property(nonatomic, readonly) int width; |
| diff --git a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCCodecSpecificInfoH264.h b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCCodecSpecificInfoH264.h |
| index ece9570a13b..e947dc6e623 100644 |
| --- a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCCodecSpecificInfoH264.h |
| +++ b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCCodecSpecificInfoH264.h |
| @@ -10,7 +10,7 @@ |
| |
| #import <Foundation/Foundation.h> |
| |
| -#import "RTCCodecSpecificInfo.h" |
| +#import "base/RTCCodecSpecificInfo.h" |
| #import "RTCMacros.h" |
| |
| /** Class for H264 specific config. */ |
| @@ -20,6 +20,7 @@ typedef NS_ENUM(NSUInteger, RTCH264PacketizationMode) { |
| }; |
| |
| RTC_OBJC_EXPORT |
| +__attribute__((objc_runtime_name("WK_RTCCodecSpecificInfoH264"))) |
| @interface RTCCodecSpecificInfoH264 : NSObject <RTCCodecSpecificInfo> |
| |
| @property(nonatomic, assign) RTCH264PacketizationMode packetizationMode; |
| diff --git a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCCodecSpecificInfoH264.mm b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCCodecSpecificInfoH264.mm |
| index 57f2411e3bb..63e8bd7f42a 100644 |
| --- a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCCodecSpecificInfoH264.mm |
| +++ b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCCodecSpecificInfoH264.mm |
| @@ -20,6 +20,7 @@ @synthesize packetizationMode = _packetizationMode; |
| - (webrtc::CodecSpecificInfo)nativeCodecSpecificInfo { |
| webrtc::CodecSpecificInfo codecSpecificInfo; |
| codecSpecificInfo.codecType = webrtc::kVideoCodecH264; |
| + codecSpecificInfo.codec_name = [kRTCVideoCodecH264Name cStringUsingEncoding:NSUTF8StringEncoding]; |
| codecSpecificInfo.codecSpecific.H264.packetization_mode = |
| (webrtc::H264PacketizationMode)_packetizationMode; |
| |
| diff --git a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCDefaultVideoDecoderFactory.h b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCDefaultVideoDecoderFactory.h |
| index 7ca9463a593..d11460300d5 100644 |
| --- a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCDefaultVideoDecoderFactory.h |
| +++ b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCDefaultVideoDecoderFactory.h |
| @@ -19,6 +19,7 @@ NS_ASSUME_NONNULL_BEGIN |
| * codecs, create custom implementations of RTCVideoEncoderFactory and RTCVideoDecoderFactory. |
| */ |
| RTC_OBJC_EXPORT |
| +__attribute__((objc_runtime_name("WK_RTCDefaultVideoDecoderFactory"))) |
| @interface RTCDefaultVideoDecoderFactory : NSObject <RTCVideoDecoderFactory> |
| @end |
| |
| diff --git a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCDefaultVideoDecoderFactory.m b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCDefaultVideoDecoderFactory.m |
| index bdb18517caf..c7d08caa9c9 100644 |
| --- a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCDefaultVideoDecoderFactory.m |
| +++ b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCDefaultVideoDecoderFactory.m |
| @@ -15,7 +15,7 @@ |
| #import "api/video_codec/RTCVideoCodecConstants.h" |
| #import "api/video_codec/RTCVideoDecoderVP8.h" |
| #import "base/RTCVideoCodecInfo.h" |
| -#if defined(RTC_ENABLE_VP9) |
| +#if !defined(RTC_DISABLE_VP9) |
| #import "api/video_codec/RTCVideoDecoderVP9.h" |
| #endif |
| |
| @@ -26,7 +26,7 @@ @implementation RTCDefaultVideoDecoderFactory |
| return [[RTCVideoDecoderH264 alloc] init]; |
| } else if ([info.name isEqualToString:kRTCVideoCodecVp8Name]) { |
| return [RTCVideoDecoderVP8 vp8Decoder]; |
| -#if defined(RTC_ENABLE_VP9) |
| +#if !defined(RTC_DISABLE_VP9) |
| } else if ([info.name isEqualToString:kRTCVideoCodecVp9Name]) { |
| return [RTCVideoDecoderVP9 vp9Decoder]; |
| #endif |
| @@ -39,7 +39,7 @@ @implementation RTCDefaultVideoDecoderFactory |
| return @[ |
| [[RTCVideoCodecInfo alloc] initWithName:kRTCVideoCodecH264Name], |
| [[RTCVideoCodecInfo alloc] initWithName:kRTCVideoCodecVp8Name], |
| -#if defined(RTC_ENABLE_VP9) |
| +#if !defined(RTC_DISABLE_VP9) |
| [[RTCVideoCodecInfo alloc] initWithName:kRTCVideoCodecVp9Name], |
| #endif |
| ]; |
| diff --git a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCDefaultVideoEncoderFactory.h b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCDefaultVideoEncoderFactory.h |
| index c45e54362b2..9323256cead 100644 |
| --- a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCDefaultVideoEncoderFactory.h |
| +++ b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCDefaultVideoEncoderFactory.h |
| @@ -19,6 +19,7 @@ NS_ASSUME_NONNULL_BEGIN |
| * codecs, create custom implementations of RTCVideoEncoderFactory and RTCVideoDecoderFactory. |
| */ |
| RTC_OBJC_EXPORT |
| +__attribute__((objc_runtime_name("WK_RTCDefaultVideoEncoderFactory"))) |
| @interface RTCDefaultVideoEncoderFactory : NSObject <RTCVideoEncoderFactory> |
| |
| @property(nonatomic, retain) RTCVideoCodecInfo *preferredCodec; |
| diff --git a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCDefaultVideoEncoderFactory.m b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCDefaultVideoEncoderFactory.m |
| index b72296b64f3..b01c0746792 100644 |
| --- a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCDefaultVideoEncoderFactory.m |
| +++ b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCDefaultVideoEncoderFactory.m |
| @@ -15,7 +15,7 @@ |
| #import "api/video_codec/RTCVideoCodecConstants.h" |
| #import "api/video_codec/RTCVideoEncoderVP8.h" |
| #import "base/RTCVideoCodecInfo.h" |
| -#if defined(RTC_ENABLE_VP9) |
| +#if !defined(RTC_DISABLE_VP9) |
| #import "api/video_codec/RTCVideoEncoderVP9.h" |
| #endif |
| |
| @@ -44,7 +44,7 @@ @implementation RTCDefaultVideoEncoderFactory |
| |
| RTCVideoCodecInfo *vp8Info = [[RTCVideoCodecInfo alloc] initWithName:kRTCVideoCodecVp8Name]; |
| |
| -#if defined(RTC_ENABLE_VP9) |
| +#if !defined(RTC_DISABLE_VP9) |
| RTCVideoCodecInfo *vp9Info = [[RTCVideoCodecInfo alloc] initWithName:kRTCVideoCodecVp9Name]; |
| #endif |
| |
| @@ -52,7 +52,7 @@ @implementation RTCDefaultVideoEncoderFactory |
| constrainedHighInfo, |
| constrainedBaselineInfo, |
| vp8Info, |
| -#if defined(RTC_ENABLE_VP9) |
| +#if !defined(RTC_DISABLE_VP9) |
| vp9Info, |
| #endif |
| ]; |
| @@ -63,7 +63,7 @@ @implementation RTCDefaultVideoEncoderFactory |
| return [[RTCVideoEncoderH264 alloc] initWithCodecInfo:info]; |
| } else if ([info.name isEqualToString:kRTCVideoCodecVp8Name]) { |
| return [RTCVideoEncoderVP8 vp8Encoder]; |
| -#if defined(RTC_ENABLE_VP9) |
| +#if !defined(RTC_DISABLE_VP9) |
| } else if ([info.name isEqualToString:kRTCVideoCodecVp9Name]) { |
| return [RTCVideoEncoderVP9 vp9Encoder]; |
| #endif |
| diff --git a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCH264ProfileLevelId.h b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCH264ProfileLevelId.h |
| index 56b353215a2..d022297674e 100644 |
| --- a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCH264ProfileLevelId.h |
| +++ b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCH264ProfileLevelId.h |
| @@ -48,6 +48,7 @@ typedef NS_ENUM(NSUInteger, RTCH264Level) { |
| }; |
| |
| RTC_OBJC_EXPORT |
| +__attribute__((objc_runtime_name("WK_RTCH264ProfileLevelId"))) |
| @interface RTCH264ProfileLevelId : NSObject |
| |
| @property(nonatomic, readonly) RTCH264Profile profile; |
| diff --git a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCH264ProfileLevelId.mm b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCH264ProfileLevelId.mm |
| index 359656cb97b..3d5c8337246 100644 |
| --- a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCH264ProfileLevelId.mm |
| +++ b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCH264ProfileLevelId.mm |
| @@ -19,23 +19,35 @@ |
| #include "media/base/h264_profile_level_id.h" |
| #include "media/base/mediaconstants.h" |
| |
| +#if !defined(WEBRTC_WEBKIT_BUILD) |
| namespace { |
| |
| NSString *MaxSupportedProfileLevelConstrainedHigh(); |
| NSString *MaxSupportedProfileLevelConstrainedBaseline(); |
| |
| } // namespace |
| +#endif |
| |
| -NSString *const kRTCVideoCodecH264Name = @(cricket::kH264CodecName); |
| +NSString *const kRTCVideoCodecH264Name = @"H264"; |
| NSString *const kRTCLevel31ConstrainedHigh = @"640c1f"; |
| NSString *const kRTCLevel31ConstrainedBaseline = @"42e01f"; |
| + |
| +#if defined(WEBRTC_WEBKIT_BUILD) |
| +NSString *const kRTCMaxSupportedH264ProfileLevelConstrainedHigh = |
| + @"640c1f"; |
| +NSString *const kRTCMaxSupportedH264ProfileLevelConstrainedBaseline = |
| + @"42e01f"; |
| +#else |
| NSString *const kRTCMaxSupportedH264ProfileLevelConstrainedHigh = |
| MaxSupportedProfileLevelConstrainedHigh(); |
| NSString *const kRTCMaxSupportedH264ProfileLevelConstrainedBaseline = |
| MaxSupportedProfileLevelConstrainedBaseline(); |
| +#endif |
| |
| namespace { |
| |
| +#if !defined(WEBRTC_WEBKIT_BUILD) |
| + |
| #if defined(WEBRTC_IOS) |
| |
| using namespace webrtc::H264; |
| @@ -73,6 +85,8 @@ NSString *MaxSupportedProfileLevelConstrainedHigh() { |
| return kRTCLevel31ConstrainedHigh; |
| } |
| |
| +#endif |
| + |
| } // namespace |
| |
| @interface RTCH264ProfileLevelId () |
| diff --git a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCVideoDecoderFactoryH264.h b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCVideoDecoderFactoryH264.h |
| index 4fcff1dff79..fdabd807480 100644 |
| --- a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCVideoDecoderFactoryH264.h |
| +++ b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCVideoDecoderFactoryH264.h |
| @@ -14,5 +14,6 @@ |
| #import "RTCVideoDecoderFactory.h" |
| |
| RTC_OBJC_EXPORT |
| +__attribute__((objc_runtime_name("WK_RTCVideoDecoderFactoryH264"))) |
| @interface RTCVideoDecoderFactoryH264 : NSObject <RTCVideoDecoderFactory> |
| @end |
| diff --git a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCVideoDecoderH264.h b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCVideoDecoderH264.h |
| index b860276206c..b10d1e6a099 100644 |
| --- a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCVideoDecoderH264.h |
| +++ b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCVideoDecoderH264.h |
| @@ -14,5 +14,6 @@ |
| #import "RTCVideoDecoder.h" |
| |
| RTC_OBJC_EXPORT |
| +__attribute__((objc_runtime_name("WK_RTCVideoDecoderH264"))) |
| @interface RTCVideoDecoderH264 : NSObject <RTCVideoDecoder> |
| @end |
| diff --git a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCVideoDecoderH264.mm b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCVideoDecoderH264.mm |
| index 3bfb918bf61..1c18fab17df 100644 |
| --- a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCVideoDecoderH264.mm |
| +++ b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCVideoDecoderH264.mm |
| @@ -19,10 +19,6 @@ |
| #import "helpers.h" |
| #import "helpers/scoped_cftyperef.h" |
| |
| -#if defined(WEBRTC_IOS) |
| -#import "helpers/UIDevice+RTCDevice.h" |
| -#endif |
| - |
| #include "modules/video_coding/include/video_error_codes.h" |
| #include "rtc_base/checks.h" |
| #include "rtc_base/logging.h" |
| @@ -251,9 +247,7 @@ - (void)configureDecompressionSession { |
| - (void)destroyDecompressionSession { |
| if (_decompressionSession) { |
| #if defined(WEBRTC_IOS) |
| - if ([UIDevice isIOS11OrLater]) { |
| - VTDecompressionSessionWaitForAsynchronousFrames(_decompressionSession); |
| - } |
| + VTDecompressionSessionWaitForAsynchronousFrames(_decompressionSession); |
| #endif |
| VTDecompressionSessionInvalidate(_decompressionSession); |
| CFRelease(_decompressionSession); |
| diff --git a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCVideoEncoderFactoryH264.h b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCVideoEncoderFactoryH264.h |
| index c64405e4dac..5f6f78dfa9a 100644 |
| --- a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCVideoEncoderFactoryH264.h |
| +++ b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCVideoEncoderFactoryH264.h |
| @@ -14,5 +14,6 @@ |
| #import "RTCVideoEncoderFactory.h" |
| |
| RTC_OBJC_EXPORT |
| +__attribute__((objc_runtime_name("WK_RTCVideoEncoderFactoryH264"))) |
| @interface RTCVideoEncoderFactoryH264 : NSObject <RTCVideoEncoderFactory> |
| @end |
| diff --git a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCVideoEncoderH264.h b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCVideoEncoderH264.h |
| index a9c05580a41..7714b25eaa4 100644 |
| --- a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCVideoEncoderH264.h |
| +++ b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCVideoEncoderH264.h |
| @@ -15,6 +15,7 @@ |
| #import "RTCVideoEncoder.h" |
| |
| RTC_OBJC_EXPORT |
| +__attribute__((objc_runtime_name("WK_RTCVideoEncoderH264"))) |
| @interface RTCVideoEncoderH264 : NSObject <RTCVideoEncoder> |
| |
| - (instancetype)initWithCodecInfo:(RTCVideoCodecInfo *)codecInfo; |
| diff --git a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCVideoEncoderH264.mm b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCVideoEncoderH264.mm |
| index f6690b6d861..a14357fb80c 100644 |
| --- a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCVideoEncoderH264.mm |
| +++ b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCVideoEncoderH264.mm |
| @@ -9,39 +9,68 @@ |
| * |
| */ |
| |
| -#import "RTCVideoEncoderH264.h" |
| +#import "WebRTC/RTCVideoCodecH264.h" |
| |
| #import <VideoToolbox/VideoToolbox.h> |
| #include <vector> |
| |
| -#if defined(WEBRTC_IOS) |
| -#import "helpers/UIDevice+RTCDevice.h" |
| -#endif |
| -#import "RTCCodecSpecificInfoH264.h" |
| -#import "RTCH264ProfileLevelId.h" |
| -#import "api/peerconnection/RTCRtpFragmentationHeader+Private.h" |
| -#import "api/peerconnection/RTCVideoCodecInfo+Private.h" |
| -#import "base/RTCCodecSpecificInfo.h" |
| -#import "base/RTCI420Buffer.h" |
| -#import "base/RTCVideoEncoder.h" |
| -#import "base/RTCVideoFrame.h" |
| -#import "base/RTCVideoFrameBuffer.h" |
| -#import "components/video_frame_buffer/RTCCVPixelBuffer.h" |
| -#import "helpers.h" |
| - |
| +#import "PeerConnection/RTCVideoCodec+Private.h" |
| +#import "WebRTC/RTCVideoCodec.h" |
| +#import "WebRTC/RTCVideoFrame.h" |
| +#import "WebRTC/RTCVideoFrameBuffer.h" |
| #include "common_video/h264/h264_bitstream_parser.h" |
| #include "common_video/h264/profile_level_id.h" |
| #include "common_video/include/bitrate_adjuster.h" |
| +#import "helpers.h" |
| #include "modules/include/module_common_types.h" |
| #include "modules/video_coding/include/video_error_codes.h" |
| #include "rtc_base/buffer.h" |
| #include "rtc_base/logging.h" |
| #include "rtc_base/timeutils.h" |
| -#include "sdk/objc/components/video_codec/nalu_rewriter.h" |
| +#include "sdk/objc/Framework/Classes/VideoToolbox/nalu_rewriter.h" |
| +#include "system_wrappers/include/clock.h" |
| #include "third_party/libyuv/include/libyuv/convert_from.h" |
| |
| -@interface RTCVideoEncoderH264 () |
| +#include "sdk/WebKit/EncoderUtilities.h" |
| +#include "sdk/WebKit/WebKitUtilities.h" |
| + |
| +#import <dlfcn.h> |
| +#import <objc/runtime.h> |
| + |
| +SOFT_LINK_FRAMEWORK_OPTIONAL(VideoToolBox) |
| +SOFT_LINK_POINTER_OPTIONAL(VideoToolBox, kVTVideoEncoderSpecification_Usage, NSString *) |
| + |
| +#if !ENABLE_VCP_ENCODER && !defined(WEBRTC_IOS) |
| +static inline bool isStandardFrameSize(int32_t width, int32_t height) |
| +{ |
| + // FIXME: Envision relaxing this rule, something like width and height dividable by 4 or 8 should be good enough. |
| + if (width == 1280) |
| + return height == 720; |
| + if (width == 720) |
| + return height == 1280; |
| + if (width == 960) |
| + return height == 540; |
| + if (width == 540) |
| + return height == 960; |
| + if (width == 640) |
| + return height == 480; |
| + if (width == 480) |
| + return height == 640; |
| + if (width == 288) |
| + return height == 352; |
| + if (width == 352) |
| + return height == 288; |
| + if (width == 320) |
| + return height == 240; |
| + if (width == 240) |
| + return height == 320; |
| + return false; |
| +} |
| +#endif |
| |
| +__attribute__((objc_runtime_name("WK_RTCSingleVideoEncoderH264"))) |
| +@interface RTCSingleVideoEncoderH264 : NSObject <RTCVideoEncoder> |
| +- (instancetype)initWithCodecInfo:(RTCVideoCodecInfo *)codecInfo simulcastIndex: (int)index; |
| - (void)frameWasEncoded:(OSStatus)status |
| flags:(VTEncodeInfoFlags)infoFlags |
| sampleBuffer:(CMSampleBufferRef)sampleBuffer |
| @@ -51,7 +80,6 @@ - (void)frameWasEncoded:(OSStatus)status |
| renderTimeMs:(int64_t)renderTimeMs |
| timestamp:(uint32_t)timestamp |
| rotation:(RTCVideoRotation)rotation; |
| - |
| @end |
| |
| namespace { // anonymous namespace |
| @@ -70,7 +98,7 @@ const OSType kNV12PixelFormat = kCVPixelFormatType_420YpCbCr8BiPlanarFullRange; |
| // Struct that we pass to the encoder per frame to encode. We receive it again |
| // in the encoder callback. |
| struct RTCFrameEncodeParams { |
| - RTCFrameEncodeParams(RTCVideoEncoderH264 *e, |
| + RTCFrameEncodeParams(RTCSingleVideoEncoderH264 *e, |
| RTCCodecSpecificInfoH264 *csi, |
| int32_t w, |
| int32_t h, |
| @@ -85,7 +113,7 @@ struct RTCFrameEncodeParams { |
| } |
| } |
| |
| - RTCVideoEncoderH264 *encoder; |
| + RTCSingleVideoEncoderH264 *encoder; |
| RTCCodecSpecificInfoH264 *codecSpecificInfo; |
| int32_t width; |
| int32_t height; |
| @@ -173,8 +201,8 @@ void compressionOutputCallback(void *encoder, |
| rotation:encodeParams->rotation]; |
| } |
| |
| -// Extract VideoToolbox profile out of the webrtc::SdpVideoFormat. If there is |
| -// no specific VideoToolbox profile for the specified level, AutoLevel will be |
| +// Extract VideoToolbox profile out of the cricket::VideoCodec. If there is no |
| +// specific VideoToolbox profile for the specified level, AutoLevel will be |
| // returned. The user must initialize the encoder with a resolution and |
| // framerate conforming to the selected H264 level regardless. |
| CFStringRef ExtractProfile(webrtc::SdpVideoFormat videoFormat) { |
| @@ -280,23 +308,26 @@ CFStringRef ExtractProfile(webrtc::SdpVideoFormat videoFormat) { |
| } |
| } // namespace |
| |
| -@implementation RTCVideoEncoderH264 { |
| +@implementation RTCSingleVideoEncoderH264 { |
| RTCVideoCodecInfo *_codecInfo; |
| std::unique_ptr<webrtc::BitrateAdjuster> _bitrateAdjuster; |
| uint32_t _targetBitrateBps; |
| - uint32_t _encoderFrameRate; |
| uint32_t _encoderBitrateBps; |
| RTCH264PacketizationMode _packetizationMode; |
| CFStringRef _profile; |
| RTCVideoEncoderCallback _callback; |
| int32_t _width; |
| int32_t _height; |
| - VTCompressionSessionRef _compressionSession; |
| + CompressionSessionRef _compressionSession; |
| CVPixelBufferPoolRef _pixelBufferPool; |
| RTCVideoCodecMode _mode; |
| |
| webrtc::H264BitstreamParser _h264BitstreamParser; |
| std::vector<uint8_t> _frameScaleBuffer; |
| + |
| + webrtc::VideoCodec _nativeVideoCodec; |
| + int _simulcastIndex; |
| + bool _disableEncoding; |
| } |
| |
| // .5 is set as a mininum to prevent overcompensating for large temporary |
| @@ -306,12 +337,13 @@ @implementation RTCVideoEncoderH264 { |
| // drastically reduced bitrate, so we want to avoid that. In steady state |
| // conditions, 0.95 seems to give us better overall bitrate over long periods |
| // of time. |
| -- (instancetype)initWithCodecInfo:(RTCVideoCodecInfo *)codecInfo { |
| +- (instancetype)initWithCodecInfo:(RTCVideoCodecInfo *)codecInfo simulcastIndex:(int)index { |
| if (self = [super init]) { |
| _codecInfo = codecInfo; |
| _bitrateAdjuster.reset(new webrtc::BitrateAdjuster(.5, .95)); |
| _packetizationMode = RTCH264PacketizationModeNonInterleaved; |
| _profile = ExtractProfile([codecInfo nativeSdpVideoFormat]); |
| + _simulcastIndex = index; |
| RTC_LOG(LS_INFO) << "Using profile " << CFStringToString(_profile); |
| RTC_CHECK([codecInfo.name isEqualToString:kRTCVideoCodecH264Name]); |
| } |
| @@ -330,11 +362,13 @@ - (NSInteger)startEncodeWithSettings:(RTCVideoEncoderSettings *)settings |
| _width = settings.width; |
| _height = settings.height; |
| _mode = settings.mode; |
| + _nativeVideoCodec = settings.nativeVideoCodec; |
| + |
| + RTC_DCHECK(_nativeVideoCodec.numberOfSimulcastStreams != 1); |
| |
| // We can only set average bitrate on the HW encoder. |
| - _targetBitrateBps = settings.startBitrate * 1000; // startBitrate is in kbps. |
| + _targetBitrateBps = settings.startBitrate; |
| _bitrateAdjuster->SetTargetBitrateBps(_targetBitrateBps); |
| - _encoderFrameRate = settings.maxFramerate; |
| |
| // TODO(tkchin): Try setting payload size via |
| // kVTCompressionPropertyKey_MaxH264SliceBytes. |
| @@ -357,6 +391,10 @@ - (NSInteger)encode:(RTCVideoFrame *)frame |
| isKeyframeRequired = YES; |
| } |
| |
| + if (_disableEncoding) { |
| + return WEBRTC_VIDEO_CODEC_ERROR; |
| + } |
| + |
| CVPixelBufferRef pixelBuffer = nullptr; |
| if ([frame.buffer isKindOfClass:[RTCCVPixelBuffer class]]) { |
| // Native frame buffer |
| @@ -434,9 +472,9 @@ - (NSInteger)encode:(RTCVideoFrame *)frame |
| encodeParams->codecSpecificInfo.packetizationMode = _packetizationMode; |
| |
| // Update the bitrate if needed. |
| - [self setBitrateBps:_bitrateAdjuster->GetAdjustedBitrateBps() frameRate:_encoderFrameRate]; |
| + [self setBitrateBps:_bitrateAdjuster->GetAdjustedBitrateBps()]; |
| |
| - OSStatus status = VTCompressionSessionEncodeFrame(_compressionSession, |
| + OSStatus status = CompressionSessionEncodeFrame(_compressionSession, |
| pixelBuffer, |
| presentationTimeStamp, |
| kCMTimeInvalid, |
| @@ -467,10 +505,10 @@ - (void)setCallback:(RTCVideoEncoderCallback)callback { |
| _callback = callback; |
| } |
| |
| -- (int)setBitrate:(uint32_t)bitrateKbit framerate:(uint32_t)framerate { |
| - _targetBitrateBps = 1000 * bitrateKbit; |
| +- (int)setBitrate:(uint32_t)bitrateBps framerate:(uint32_t)framerate { |
| + _targetBitrateBps = bitrateBps; |
| _bitrateAdjuster->SetTargetBitrateBps(_targetBitrateBps); |
| - [self setBitrateBps:_bitrateAdjuster->GetAdjustedBitrateBps() frameRate:framerate]; |
| + [self setBitrateBps:_bitrateAdjuster->GetAdjustedBitrateBps()]; |
| return WEBRTC_VIDEO_CODEC_OK; |
| } |
| |
| @@ -503,6 +541,11 @@ - (BOOL)resetCompressionSessionIfNeededWithFrame:(RTCVideoFrame *)frame { |
| OSType framePixelFormat = [self pixelFormatOfFrame:frame]; |
| |
| if (_compressionSession) { |
| +#if defined(WEBRTC_WEBKIT_BUILD) |
| + if (!_pixelBufferPool) { |
| + return NO; |
| + } |
| +#endif |
| // The pool attribute `kCVPixelBufferPixelFormatTypeKey` can contain either an array of pixel |
| // formats or a single pixel format. |
| NSDictionary *poolAttributes = |
| @@ -516,6 +559,11 @@ - (BOOL)resetCompressionSessionIfNeededWithFrame:(RTCVideoFrame *)frame { |
| compressionSessionPixelFormats = @[ (NSNumber *)pixelFormats ]; |
| } |
| |
| + if ([frame.buffer isKindOfClass:[RTCCVPixelBuffer class]]) { |
| + RTCCVPixelBuffer *rtcPixelBuffer = (RTCCVPixelBuffer *)frame.buffer; |
| + framePixelFormat = CVPixelBufferGetPixelFormatType(rtcPixelBuffer.pixelBuffer); |
| + } |
| + |
| if (![compressionSessionPixelFormats |
| containsObject:[NSNumber numberWithLong:framePixelFormat]]) { |
| resetCompressionSession = YES; |
| @@ -533,6 +581,7 @@ - (BOOL)resetCompressionSessionIfNeededWithFrame:(RTCVideoFrame *)frame { |
| |
| - (int)resetCompressionSessionWithPixelFormat:(OSType)framePixelFormat { |
| [self destroyCompressionSession]; |
| + _disableEncoding = false; |
| |
| // Set source image buffer attributes. These attributes will be present on |
| // buffers retrieved from the encoder's pixel buffer pool. |
| @@ -559,22 +608,26 @@ - (int)resetCompressionSessionWithPixelFormat:(OSType)framePixelFormat { |
| CFRelease(pixelFormat); |
| pixelFormat = nullptr; |
| } |
| - CFMutableDictionaryRef encoder_specs = nullptr; |
| -#if defined(WEBRTC_MAC) && !defined(WEBRTC_IOS) |
| + CFDictionaryRef encoderSpecs = nullptr; |
| +#if !defined(WEBRTC_IOS) |
| + auto useHardwareEncoder = webrtc::isH264HardwareEncoderAllowed() ? kCFBooleanTrue : kCFBooleanFalse; |
| // Currently hw accl is supported above 360p on mac, below 360p |
| // the compression session will be created with hw accl disabled. |
| - encoder_specs = CFDictionaryCreateMutable( |
| - nullptr, 1, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); |
| - CFDictionarySetValue(encoder_specs, |
| - kVTVideoEncoderSpecification_EnableHardwareAcceleratedVideoEncoder, |
| - kCFBooleanTrue); |
| + CFTypeRef sessionKeys[] = { kVTVideoEncoderSpecification_EnableHardwareAcceleratedVideoEncoder, kVTVideoEncoderSpecification_RequireHardwareAcceleratedVideoEncoder, kVTCompressionPropertyKey_RealTime }; |
| + CFTypeRef sessionValues[] = { useHardwareEncoder, useHardwareEncoder, kCFBooleanTrue }; |
| + encoderSpecs = CFDictionaryCreate(kCFAllocatorDefault, sessionKeys, sessionValues, 3, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); |
| +#else |
| + CFTypeRef sessionKeys[] = { kVTCompressionPropertyKey_RealTime }; |
| + CFTypeRef sessionValues[] = { kCFBooleanTrue }; |
| + encoderSpecs = CFDictionaryCreate(kCFAllocatorDefault, sessionKeys, sessionValues, 1, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); |
| #endif |
| + |
| OSStatus status = |
| - VTCompressionSessionCreate(nullptr, // use default allocator |
| + CompressionSessionCreate(nullptr, // use default allocator |
| _width, |
| _height, |
| - kCMVideoCodecType_H264, |
| - encoder_specs, // use hardware accelerated encoder if available |
| + kCodecTypeH264, |
| + encoderSpecs, // use hardware accelerated encoder if available |
| sourceAttributes, |
| nullptr, // use default compressed data allocator |
| compressionOutputCallback, |
| @@ -584,32 +637,113 @@ - (int)resetCompressionSessionWithPixelFormat:(OSType)framePixelFormat { |
| CFRelease(sourceAttributes); |
| sourceAttributes = nullptr; |
| } |
| - if (encoder_specs) { |
| - CFRelease(encoder_specs); |
| - encoder_specs = nullptr; |
| + if (encoderSpecs) { |
| + CFRelease(encoderSpecs); |
| + encoderSpecs = nullptr; |
| } |
| + |
| +#if ENABLE_VCP_ENCODER || defined(WEBRTC_IOS) |
| if (status != noErr) { |
| RTC_LOG(LS_ERROR) << "Failed to create compression session: " << status; |
| return WEBRTC_VIDEO_CODEC_ERROR; |
| } |
| +#endif |
| #if defined(WEBRTC_MAC) && !defined(WEBRTC_IOS) |
| CFBooleanRef hwaccl_enabled = nullptr; |
| - status = VTSessionCopyProperty(_compressionSession, |
| + if (status == noErr) { |
| + status = VTSessionCopyProperty(_compressionSession, |
| kVTCompressionPropertyKey_UsingHardwareAcceleratedVideoEncoder, |
| nullptr, |
| &hwaccl_enabled); |
| + } |
| if (status == noErr && (CFBooleanGetValue(hwaccl_enabled))) { |
| RTC_LOG(LS_INFO) << "Compression session created with hw accl enabled"; |
| } else { |
| RTC_LOG(LS_INFO) << "Compression session created with hw accl disabled"; |
| + |
| +#if !ENABLE_VCP_ENCODER && !defined(WEBRTC_IOS) |
| + if (!isStandardFrameSize(_width, _height)) { |
| + _disableEncoding = true; |
| + RTC_LOG(LS_ERROR) << "Using H264 software encoder with non standard size is not supported"; |
| + return WEBRTC_VIDEO_CODEC_ERROR; |
| + } |
| + |
| + if (!getkVTVideoEncoderSpecification_Usage()) { |
| + _disableEncoding = true; |
| + RTC_LOG(LS_ERROR) << "RTCSingleVideoEncoderH264 cannot create a H264 software encoder"; |
| + return WEBRTC_VIDEO_CODEC_ERROR; |
| + } |
| + |
| + CFDictionaryRef ioSurfaceValue = CreateCFTypeDictionary(nullptr, nullptr, 0); |
| + int64_t pixelFormatType = framePixelFormat; |
| + CFNumberRef pixelFormat = CFNumberCreate(nullptr, kCFNumberLongType, &pixelFormatType); |
| + |
| + const size_t attributesSize = 3; |
| + CFTypeRef keys[attributesSize] = { |
| + kCVPixelBufferOpenGLCompatibilityKey, |
| + kCVPixelBufferIOSurfacePropertiesKey, |
| + kCVPixelBufferPixelFormatTypeKey |
| + }; |
| + CFTypeRef values[attributesSize] = { |
| + kCFBooleanTrue, |
| + ioSurfaceValue, |
| + pixelFormat}; |
| + CFDictionaryRef sourceAttributes = CreateCFTypeDictionary(keys, values, attributesSize); |
| + |
| + if (ioSurfaceValue) { |
| + CFRelease(ioSurfaceValue); |
| + ioSurfaceValue = nullptr; |
| + } |
| + if (pixelFormat) { |
| + CFRelease(pixelFormat); |
| + pixelFormat = nullptr; |
| + } |
| + |
| + CFMutableDictionaryRef encoderSpecs = CFDictionaryCreateMutable(nullptr, 2, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); |
| + CFDictionarySetValue(encoderSpecs, kVTVideoEncoderSpecification_EnableHardwareAcceleratedVideoEncoder, kCFBooleanFalse); |
| + int usageValue = 1; |
| + CFNumberRef usage = CFNumberCreate(nullptr, kCFNumberIntType, &usageValue); |
| + CFDictionarySetValue(encoderSpecs, (__bridge CFStringRef)getkVTVideoEncoderSpecification_Usage(), usage); |
| + |
| + if (usage) { |
| + CFRelease(usage); |
| + usage = nullptr; |
| + } |
| + |
| + [self destroyCompressionSession]; |
| + |
| + OSStatus status = |
| + CompressionSessionCreate(nullptr, // use default allocator |
| + _width, |
| + _height, |
| + kCodecTypeH264, |
| + encoderSpecs, |
| + sourceAttributes, |
| + nullptr, // use default compressed data allocator |
| + compressionOutputCallback, |
| + nullptr, |
| + &_compressionSession); |
| + if (sourceAttributes) { |
| + CFRelease(sourceAttributes); |
| + sourceAttributes = nullptr; |
| + } |
| + if (encoderSpecs) { |
| + CFRelease(encoderSpecs); |
| + encoderSpecs = nullptr; |
| + } |
| + if (status != noErr) { |
| + return WEBRTC_VIDEO_CODEC_ERROR; |
| + } |
| +#endif |
| } |
| #endif |
| [self configureCompressionSession]; |
| |
| +#if !defined(WEBRTC_WEBKIT_BUILD) |
| // The pixel buffer pool is dependent on the compression session so if the session is reset, the |
| // pool should be reset as well. |
| - _pixelBufferPool = VTCompressionSessionGetPixelBufferPool(_compressionSession); |
| - |
| + _pixelBufferPool = CompressionSessionGetPixelBufferPool(_compressionSession); |
| +#endif |
| return WEBRTC_VIDEO_CODEC_OK; |
| } |
| |
| @@ -618,7 +752,11 @@ - (void)configureCompressionSession { |
| SetVTSessionProperty(_compressionSession, kVTCompressionPropertyKey_RealTime, true); |
| SetVTSessionProperty(_compressionSession, kVTCompressionPropertyKey_ProfileLevel, _profile); |
| SetVTSessionProperty(_compressionSession, kVTCompressionPropertyKey_AllowFrameReordering, false); |
| - [self setEncoderBitrateBps:_targetBitrateBps frameRate:_encoderFrameRate]; |
| +#if ENABLE_VCP_ENCODER |
| + if (auto key = getkVTVideoEncoderSpecification_Usage()) |
| + SetVTSessionProperty(_compressionSession, (__bridge CFStringRef)key, 1); |
| +#endif |
| + [self setEncoderBitrateBps:_targetBitrateBps]; |
| // TODO(tkchin): Look at entropy mode and colorspace matrices. |
| // TODO(tkchin): Investigate to see if there's any way to make this work. |
| // May need it to interop with Android. Currently this call just fails. |
| @@ -635,7 +773,7 @@ - (void)configureCompressionSession { |
| |
| - (void)destroyCompressionSession { |
| if (_compressionSession) { |
| - VTCompressionSessionInvalidate(_compressionSession); |
| + CompressionSessionInvalidate(_compressionSession); |
| CFRelease(_compressionSession); |
| _compressionSession = nullptr; |
| _pixelBufferPool = nullptr; |
| @@ -646,17 +784,15 @@ - (NSString *)implementationName { |
| return @"VideoToolbox"; |
| } |
| |
| -- (void)setBitrateBps:(uint32_t)bitrateBps frameRate:(uint32_t)frameRate { |
| - if (_encoderBitrateBps != bitrateBps || _encoderFrameRate != frameRate) { |
| - [self setEncoderBitrateBps:bitrateBps frameRate:frameRate]; |
| +- (void)setBitrateBps:(uint32_t)bitrateBps { |
| + if (_encoderBitrateBps != bitrateBps) { |
| + [self setEncoderBitrateBps:bitrateBps]; |
| } |
| } |
| |
| -- (void)setEncoderBitrateBps:(uint32_t)bitrateBps frameRate:(uint32_t)frameRate { |
| +- (void)setEncoderBitrateBps:(uint32_t)bitrateBps { |
| if (_compressionSession) { |
| SetVTSessionProperty(_compressionSession, kVTCompressionPropertyKey_AverageBitRate, bitrateBps); |
| - SetVTSessionProperty( |
| - _compressionSession, kVTCompressionPropertyKey_ExpectedFrameRate, frameRate); |
| |
| // TODO(tkchin): Add a helper method to set array value. |
| int64_t dataLimitBytesPerSecondValue = |
| @@ -668,7 +804,7 @@ - (void)setEncoderBitrateBps:(uint32_t)bitrateBps frameRate:(uint32_t)frameRate |
| CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt64Type, &oneSecondValue); |
| const void *nums[2] = {bytesPerSecond, oneSecond}; |
| CFArrayRef dataRateLimits = CFArrayCreate(nullptr, nums, 2, &kCFTypeArrayCallBacks); |
| - OSStatus status = VTSessionSetProperty( |
| + OSStatus status = CompressionSessionSetProperty( |
| _compressionSession, kVTCompressionPropertyKey_DataRateLimits, dataRateLimits); |
| if (bytesPerSecond) { |
| CFRelease(bytesPerSecond); |
| @@ -680,11 +816,10 @@ - (void)setEncoderBitrateBps:(uint32_t)bitrateBps frameRate:(uint32_t)frameRate |
| CFRelease(dataRateLimits); |
| } |
| if (status != noErr) { |
| - RTC_LOG(LS_ERROR) << "Failed to set data rate limit with code: " << status; |
| + RTC_LOG(LS_ERROR) << "Failed to set data rate limit"; |
| } |
| |
| _encoderBitrateBps = bitrateBps; |
| - _encoderFrameRate = frameRate; |
| } |
| } |
| |
| @@ -698,7 +833,7 @@ - (void)frameWasEncoded:(OSStatus)status |
| timestamp:(uint32_t)timestamp |
| rotation:(RTCVideoRotation)rotation { |
| if (status != noErr) { |
| - RTC_LOG(LS_ERROR) << "H264 encode failed with code: " << status; |
| + RTC_LOG(LS_ERROR) << "H264 encode failed: " << status; |
| return; |
| } |
| if (infoFlags & kVTEncodeInfo_FrameDropped) { |
| @@ -743,6 +878,7 @@ - (void)frameWasEncoded:(OSStatus)status |
| frame.rotation = rotation; |
| frame.contentType = (_mode == RTCVideoCodecModeScreensharing) ? RTCVideoContentTypeScreenshare : |
| RTCVideoContentTypeUnspecified; |
| + frame.spatialIndex = _simulcastIndex; |
| frame.flags = webrtc::VideoSendTiming::kInvalid; |
| |
| int qp; |
| @@ -758,9 +894,88 @@ - (void)frameWasEncoded:(OSStatus)status |
| _bitrateAdjuster->Update(frame.buffer.length); |
| } |
| |
| -- (nullable RTCVideoEncoderQpThresholds *)scalingSettings { |
| - return [[RTCVideoEncoderQpThresholds alloc] initWithThresholdsLow:kLowH264QpThreshold |
| - high:kHighH264QpThreshold]; |
| +- (RTCVideoEncoderQpThresholds *)scalingSettings { |
| + return [[RTCVideoEncoderQpThresholds alloc] initWithThresholdsLow:kLowH264QpThreshold high:kHighH264QpThreshold]; |
| +} |
| + |
| +- (int)setRateAllocation:(RTCVideoBitrateAllocation *)allocation framerate:(uint32_t)framerate { |
| + return 0; |
| +} |
| + |
| +@end |
| + |
| +@implementation RTCVideoEncoderH264 { |
| + NSMutableArray<RTCSingleVideoEncoderH264*> *_codecs; |
| + RTCVideoCodecInfo *_codecInfo; |
| +} |
| +- (instancetype)initWithCodecInfo:(RTCVideoCodecInfo *)codecInfo { |
| + if (self = [super init]) { |
| + _codecInfo = codecInfo; |
| + } |
| + return self; |
| +} |
| + |
| +- (void)setCallback:(RTCVideoEncoderCallback)callback { |
| + for (RTCSingleVideoEncoderH264 *codec : _codecs) |
| + [codec setCallback:callback]; |
| +} |
| + |
| +- (NSInteger)startEncodeWithSettings:(RTCVideoEncoderSettings *)settings numberOfCores:(int)numberOfCores { |
| + auto nativeCodecSettings = settings.nativeVideoCodec; |
| + |
| + _codecs = [[NSMutableArray alloc] init]; |
| + for (unsigned index = 0 ; index < nativeCodecSettings.numberOfSimulcastStreams; ++index) { |
| + auto codec = [[RTCSingleVideoEncoderH264 alloc] initWithCodecInfo:_codecInfo simulcastIndex:index]; |
| + [_codecs addObject:codec]; |
| + |
| + auto codecSettings = nativeCodecSettings; |
| + codecSettings.width = nativeCodecSettings.simulcastStream[index].width; |
| + codecSettings.height = nativeCodecSettings.simulcastStream[index].height; |
| + codecSettings.maxBitrate = nativeCodecSettings.simulcastStream[index].maxBitrate; |
| + codecSettings.targetBitrate = nativeCodecSettings.simulcastStream[index].targetBitrate; |
| + codecSettings.minBitrate = nativeCodecSettings.simulcastStream[index].minBitrate; |
| + codecSettings.qpMax = nativeCodecSettings.simulcastStream[index].qpMax; |
| + codecSettings.active = true; |
| + |
| + auto *settings = [[RTCVideoEncoderSettings alloc] initWithNativeVideoCodec:&codecSettings]; |
| + [codec startEncodeWithSettings:settings numberOfCores:numberOfCores]; |
| + } |
| + return 0; |
| +} |
| + |
| +- (NSInteger)releaseEncoder { |
| + for (RTCSingleVideoEncoderH264 *codec : _codecs) |
| + [codec releaseEncoder]; |
| + _codecs = nil; |
| + return 0; |
| +} |
| + |
| +- (NSInteger)encode:(RTCVideoFrame *)frame codecSpecificInfo:(nullable id<RTCCodecSpecificInfo>)info frameTypes:(NSArray<NSNumber *> *)frameTypes { |
| + int result = 0; |
| + for (RTCSingleVideoEncoderH264 *codec : _codecs) |
| + result |= [codec encode:frame codecSpecificInfo:info frameTypes:frameTypes]; |
| + return result; |
| +} |
| + |
| +- (int)setRateAllocation:(RTCVideoBitrateAllocation *)bitRateAllocation framerate:(uint32_t) framerate { |
| + int result = 0; |
| + unsigned counter = 0; |
| + auto nativeBitRateAllocation = bitRateAllocation.nativeVideoBitrateAllocation; |
| + for (RTCSingleVideoEncoderH264 *codec : _codecs) |
| + result |= [codec setBitrate:nativeBitRateAllocation.GetSpatialLayerSum(counter++) framerate:framerate]; |
| + return result; |
| +} |
| + |
| +- (NSString *)implementationName { |
| + return @"VideoToolbox"; |
| +} |
| + |
| +- (RTCVideoEncoderQpThresholds *)scalingSettings { |
| + return [[RTCVideoEncoderQpThresholds alloc] initWithThresholdsLow:kLowH264QpThreshold high:kHighH264QpThreshold]; |
| +} |
| + |
| +- (int)setBitrate:(uint32_t)bitrateKbit framerate:(uint32_t)framerate { |
| + return 0; |
| } |
| |
| @end |
| diff --git a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/UIDevice+H264Profile.mm b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/UIDevice+H264Profile.mm |
| index 852c3d4702f..a015f7ca15c 100644 |
| --- a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/UIDevice+H264Profile.mm |
| +++ b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/UIDevice+H264Profile.mm |
| @@ -24,9 +24,6 @@ struct SupportedH264Profile { |
| |
| constexpr SupportedH264Profile kH264MaxSupportedProfiles[] = { |
| // iPhones with at least iOS 9 |
| - {RTCDeviceTypeIPhoneXS, {kProfileHigh, kLevel5_2}}, // https://support.apple.com/kb/SP779 |
| - {RTCDeviceTypeIPhoneXSMax, {kProfileHigh, kLevel5_2}}, // https://support.apple.com/kb/SP780 |
| - {RTCDeviceTypeIPhoneXR, {kProfileHigh, kLevel5_2}}, // https://support.apple.com/kb/SP781 |
| {RTCDeviceTypeIPhoneX, {kProfileHigh, kLevel5_2}}, // https://support.apple.com/kb/SP770 |
| {RTCDeviceTypeIPhone8, {kProfileHigh, kLevel5_2}}, // https://support.apple.com/kb/SP767 |
| {RTCDeviceTypeIPhone8Plus, {kProfileHigh, kLevel5_2}}, // https://support.apple.com/kb/SP768 |
| diff --git a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/helpers.cc b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/helpers.cc |
| index ac957f1b497..46daf44ecac 100644 |
| --- a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/helpers.cc |
| +++ b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/helpers.cc |
| @@ -35,12 +35,12 @@ std::string CFStringToString(const CFStringRef cf_string) { |
| } |
| |
| // Convenience function for setting a VT property. |
| -void SetVTSessionProperty(VTSessionRef session, |
| +void SetVTSessionProperty(CompressionSessionRef session, |
| CFStringRef key, |
| int32_t value) { |
| CFNumberRef cfNum = |
| CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &value); |
| - OSStatus status = VTSessionSetProperty(session, key, cfNum); |
| + OSStatus status = CompressionSessionSetProperty(session, key, cfNum); |
| CFRelease(cfNum); |
| if (status != noErr) { |
| std::string key_string = CFStringToString(key); |
| @@ -50,13 +50,13 @@ void SetVTSessionProperty(VTSessionRef session, |
| } |
| |
| // Convenience function for setting a VT property. |
| -void SetVTSessionProperty(VTSessionRef session, |
| +void SetVTSessionProperty(CompressionSessionRef session, |
| CFStringRef key, |
| uint32_t value) { |
| int64_t value_64 = value; |
| CFNumberRef cfNum = |
| CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt64Type, &value_64); |
| - OSStatus status = VTSessionSetProperty(session, key, cfNum); |
| + OSStatus status = CompressionSessionSetProperty(session, key, cfNum); |
| CFRelease(cfNum); |
| if (status != noErr) { |
| std::string key_string = CFStringToString(key); |
| @@ -66,9 +66,9 @@ void SetVTSessionProperty(VTSessionRef session, |
| } |
| |
| // Convenience function for setting a VT property. |
| -void SetVTSessionProperty(VTSessionRef session, CFStringRef key, bool value) { |
| +void SetVTSessionProperty(CompressionSessionRef session, CFStringRef key, bool value) { |
| CFBooleanRef cf_bool = (value) ? kCFBooleanTrue : kCFBooleanFalse; |
| - OSStatus status = VTSessionSetProperty(session, key, cf_bool); |
| + OSStatus status = CompressionSessionSetProperty(session, key, cf_bool); |
| if (status != noErr) { |
| std::string key_string = CFStringToString(key); |
| RTC_LOG(LS_ERROR) << "VTSessionSetProperty failed to set: " << key_string |
| @@ -77,10 +77,10 @@ void SetVTSessionProperty(VTSessionRef session, CFStringRef key, bool value) { |
| } |
| |
| // Convenience function for setting a VT property. |
| -void SetVTSessionProperty(VTSessionRef session, |
| +void SetVTSessionProperty(CompressionSessionRef session, |
| CFStringRef key, |
| CFStringRef value) { |
| - OSStatus status = VTSessionSetProperty(session, key, value); |
| + OSStatus status = CompressionSessionSetProperty(session, key, value); |
| if (status != noErr) { |
| std::string key_string = CFStringToString(key); |
| std::string val_string = CFStringToString(value); |
| diff --git a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/helpers.h b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/helpers.h |
| index 0683ea79e56..0c669e8bce6 100644 |
| --- a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/helpers.h |
| +++ b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/helpers.h |
| @@ -16,6 +16,8 @@ |
| #include <VideoToolbox/VideoToolbox.h> |
| #include <string> |
| |
| +#include "sdk/WebKit/EncoderUtilities.h" |
| + |
| // Convenience function for creating a dictionary. |
| inline CFDictionaryRef CreateCFTypeDictionary(CFTypeRef* keys, |
| CFTypeRef* values, |
| @@ -29,18 +31,18 @@ inline CFDictionaryRef CreateCFTypeDictionary(CFTypeRef* keys, |
| std::string CFStringToString(const CFStringRef cf_string); |
| |
| // Convenience function for setting a VT property. |
| -void SetVTSessionProperty(VTSessionRef session, CFStringRef key, int32_t value); |
| +void SetVTSessionProperty(CompressionSessionRef session, CFStringRef key, int32_t value); |
| |
| // Convenience function for setting a VT property. |
| -void SetVTSessionProperty(VTSessionRef session, |
| +void SetVTSessionProperty(CompressionSessionRef session, |
| CFStringRef key, |
| uint32_t value); |
| |
| // Convenience function for setting a VT property. |
| -void SetVTSessionProperty(VTSessionRef session, CFStringRef key, bool value); |
| +void SetVTSessionProperty(CompressionSessionRef session, CFStringRef key, bool value); |
| |
| // Convenience function for setting a VT property. |
| -void SetVTSessionProperty(VTSessionRef session, |
| +void SetVTSessionProperty(CompressionSessionRef session, |
| CFStringRef key, |
| CFStringRef value); |
| |
| diff --git a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/native/src/objc_video_encoder_factory.mm b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/native/src/objc_video_encoder_factory.mm |
| index fafad7466ec..ae45033a570 100644 |
| --- a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/native/src/objc_video_encoder_factory.mm |
| +++ b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/native/src/objc_video_encoder_factory.mm |
| @@ -90,6 +90,11 @@ class ObjCVideoEncoder : public VideoEncoder { |
| return [encoder_ setBitrate:bitrate framerate:framerate]; |
| } |
| |
| + int32_t SetRateAllocation(const VideoBitrateAllocation& allocation, uint32_t framerate) { |
| + auto *rtcAllocation = [[RTCVideoBitrateAllocation alloc] initWithNativeVideoBitrateAllocation:&allocation]; |
| + return [encoder_ setRateAllocation: rtcAllocation framerate:framerate]; |
| + } |
| + |
| VideoEncoder::EncoderInfo GetEncoderInfo() const { |
| EncoderInfo info; |
| info.supports_native_handle = true; |