Commit 8168b6ba authored by Antonio Gomes's avatar Antonio Gomes Committed by Commit Bot

Switch PeerConnectionDependencyFactory away from std::string

Instead, WTF::String is used.

BUG=787254
R=haraken@chromium.org

Change-Id: I046b6309b56e5d7664b0e7983d712aa3b21a12a0
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1988289Reviewed-by: default avatarKentaro Hara <haraken@chromium.org>
Commit-Queue: Antonio Gomes <tonikitoo@igalia.com>
Cr-Commit-Position: refs/heads/master@{#728522}
parent df9ad50a
...@@ -260,8 +260,8 @@ MediaStreamVideoWebRtcSink::MediaStreamVideoWebRtcSink( ...@@ -260,8 +260,8 @@ MediaStreamVideoWebRtcSink::MediaStreamVideoWebRtcSink(
// PeerConnectionFactory::CreateVideoTrack doesn't do reference counting. // PeerConnectionFactory::CreateVideoTrack doesn't do reference counting.
video_source_proxy_ = video_source_proxy_ =
factory->CreateVideoTrackSourceProxy(video_source_.get()); factory->CreateVideoTrackSourceProxy(video_source_.get());
video_track_ = factory->CreateLocalVideoTrack(track.Id().Utf8(), video_track_ =
video_source_proxy_.get()); factory->CreateLocalVideoTrack(track.Id(), video_source_proxy_.get());
video_track_->set_content_hint( video_track_->set_content_hint(
ContentHintTypeToWebRtcContentHint(track.ContentHint())); ContentHintTypeToWebRtcContentHint(track.ContentHint()));
......
...@@ -404,35 +404,34 @@ MockPeerConnectionDependencyFactory::CreateVideoTrackSourceProxy( ...@@ -404,35 +404,34 @@ MockPeerConnectionDependencyFactory::CreateVideoTrackSourceProxy(
} }
scoped_refptr<webrtc::MediaStreamInterface> scoped_refptr<webrtc::MediaStreamInterface>
MockPeerConnectionDependencyFactory::CreateLocalMediaStream( MockPeerConnectionDependencyFactory::CreateLocalMediaStream(
const std::string& label) { const String& label) {
return new rtc::RefCountedObject<MockMediaStream>(label); return new rtc::RefCountedObject<MockMediaStream>(label.Utf8());
} }
scoped_refptr<webrtc::VideoTrackInterface> scoped_refptr<webrtc::VideoTrackInterface>
MockPeerConnectionDependencyFactory::CreateLocalVideoTrack( MockPeerConnectionDependencyFactory::CreateLocalVideoTrack(
const std::string& id, const String& id,
webrtc::VideoTrackSourceInterface* source) { webrtc::VideoTrackSourceInterface* source) {
scoped_refptr<webrtc::VideoTrackInterface> track( scoped_refptr<webrtc::VideoTrackInterface> track(
new rtc::RefCountedObject<MockWebRtcVideoTrack>(id, source)); new rtc::RefCountedObject<MockWebRtcVideoTrack>(id.Utf8(), source));
return track; return track;
} }
SessionDescriptionInterface* SessionDescriptionInterface*
MockPeerConnectionDependencyFactory::CreateSessionDescription( MockPeerConnectionDependencyFactory::CreateSessionDescription(
const std::string& type, const String& type,
const std::string& sdp, const String& sdp,
webrtc::SdpParseError* error) { webrtc::SdpParseError* error) {
if (fail_to_create_session_description_) if (fail_to_create_session_description_)
return nullptr; return nullptr;
return new MockSessionDescription(type, sdp); return new MockSessionDescription(type.Utf8(), sdp.Utf8());
} }
webrtc::IceCandidateInterface* webrtc::IceCandidateInterface*
MockPeerConnectionDependencyFactory::CreateIceCandidate( MockPeerConnectionDependencyFactory::CreateIceCandidate(const String& sdp_mid,
const std::string& sdp_mid, int sdp_mline_index,
int sdp_mline_index, const String& sdp) {
const std::string& sdp) { return new MockIceCandidate(sdp_mid.Utf8(), sdp_mline_index, sdp.Utf8());
return new MockIceCandidate(sdp_mid, sdp_mline_index, sdp);
} }
scoped_refptr<base::SingleThreadTaskRunner> scoped_refptr<base::SingleThreadTaskRunner>
......
...@@ -172,18 +172,17 @@ class MockPeerConnectionDependencyFactory ...@@ -172,18 +172,17 @@ class MockPeerConnectionDependencyFactory
scoped_refptr<webrtc::VideoTrackSourceInterface> CreateVideoTrackSourceProxy( scoped_refptr<webrtc::VideoTrackSourceInterface> CreateVideoTrackSourceProxy(
webrtc::VideoTrackSourceInterface* source) override; webrtc::VideoTrackSourceInterface* source) override;
scoped_refptr<webrtc::MediaStreamInterface> CreateLocalMediaStream( scoped_refptr<webrtc::MediaStreamInterface> CreateLocalMediaStream(
const std::string& label) override; const String& label) override;
scoped_refptr<webrtc::VideoTrackInterface> CreateLocalVideoTrack( scoped_refptr<webrtc::VideoTrackInterface> CreateLocalVideoTrack(
const std::string& id, const String& id,
webrtc::VideoTrackSourceInterface* source) override; webrtc::VideoTrackSourceInterface* source) override;
webrtc::SessionDescriptionInterface* CreateSessionDescription( webrtc::SessionDescriptionInterface* CreateSessionDescription(
const std::string& type, const String& type,
const std::string& sdp, const String& sdp,
webrtc::SdpParseError* error) override; webrtc::SdpParseError* error) override;
webrtc::IceCandidateInterface* CreateIceCandidate( webrtc::IceCandidateInterface* CreateIceCandidate(const String& sdp_mid,
const std::string& sdp_mid, int sdp_mline_index,
int sdp_mline_index, const String& sdp) override;
const std::string& sdp) override;
scoped_refptr<base::SingleThreadTaskRunner> GetWebRtcSignalingTaskRunner() scoped_refptr<base::SingleThreadTaskRunner> GetWebRtcSignalingTaskRunner()
override; override;
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#include <stddef.h> #include <stddef.h>
#include <memory> #include <memory>
#include <string>
#include <utility> #include <utility>
#include <vector> #include <vector>
...@@ -74,13 +75,12 @@ enum WebRTCIPHandlingPolicy { ...@@ -74,13 +75,12 @@ enum WebRTCIPHandlingPolicy {
DISABLE_NON_PROXIED_UDP, DISABLE_NON_PROXIED_UDP,
}; };
WebRTCIPHandlingPolicy GetWebRTCIPHandlingPolicy( WebRTCIPHandlingPolicy GetWebRTCIPHandlingPolicy(const String& preference) {
const std::string& preference) { if (preference == kWebRTCIPHandlingDefaultPublicAndPrivateInterfaces)
if (preference == blink::kWebRTCIPHandlingDefaultPublicAndPrivateInterfaces)
return DEFAULT_PUBLIC_AND_PRIVATE_INTERFACES; return DEFAULT_PUBLIC_AND_PRIVATE_INTERFACES;
if (preference == blink::kWebRTCIPHandlingDefaultPublicInterfaceOnly) if (preference == kWebRTCIPHandlingDefaultPublicInterfaceOnly)
return DEFAULT_PUBLIC_INTERFACE_ONLY; return DEFAULT_PUBLIC_INTERFACE_ONLY;
if (preference == blink::kWebRTCIPHandlingDisableNonProxiedUdp) if (preference == kWebRTCIPHandlingDisableNonProxiedUdp)
return DISABLE_NON_PROXIED_UDP; return DISABLE_NON_PROXIED_UDP;
return DEFAULT; return DEFAULT;
} }
...@@ -399,14 +399,14 @@ PeerConnectionDependencyFactory::CreatePortAllocator( ...@@ -399,14 +399,14 @@ PeerConnectionDependencyFactory::CreatePortAllocator(
// detached, it is impossible for RTCPeerConnectionHandler to outlive the // detached, it is impossible for RTCPeerConnectionHandler to outlive the
// frame. Therefore using a raw pointer of |media_permission| is safe here. // frame. Therefore using a raw pointer of |media_permission| is safe here.
media::MediaPermission* media_permission = nullptr; media::MediaPermission* media_permission = nullptr;
if (!blink::Platform::Current()->ShouldEnforceWebRTCRoutingPreferences()) { if (!Platform::Current()->ShouldEnforceWebRTCRoutingPreferences()) {
port_config.enable_multiple_routes = true; port_config.enable_multiple_routes = true;
port_config.enable_nonproxied_udp = true; port_config.enable_nonproxied_udp = true;
VLOG(3) << "WebRTC routing preferences will not be enforced"; VLOG(3) << "WebRTC routing preferences will not be enforced";
} else { } else {
if (web_frame && web_frame->View()) { if (web_frame && web_frame->View()) {
blink::WebString webrtc_ip_handling_policy; WebString webrtc_ip_handling_policy;
blink::Platform::Current()->GetWebRTCRendererPreferences( Platform::Current()->GetWebRTCRendererPreferences(
web_frame, &webrtc_ip_handling_policy, &min_port, &max_port, web_frame, &webrtc_ip_handling_policy, &min_port, &max_port,
&allow_mdns_obfuscation); &allow_mdns_obfuscation);
...@@ -415,7 +415,7 @@ PeerConnectionDependencyFactory::CreatePortAllocator( ...@@ -415,7 +415,7 @@ PeerConnectionDependencyFactory::CreatePortAllocator(
// collected depends on if mic/camera permission is granted for this // collected depends on if mic/camera permission is granted for this
// origin. // origin.
WebRTCIPHandlingPolicy policy = WebRTCIPHandlingPolicy policy =
GetWebRTCIPHandlingPolicy(webrtc_ip_handling_policy.Utf8()); GetWebRTCIPHandlingPolicy(webrtc_ip_handling_policy);
switch (policy) { switch (policy) {
// TODO(guoweis): specify the flag of disabling local candidate // TODO(guoweis): specify the flag of disabling local candidate
// collection when webrtc is updated. // collection when webrtc is updated.
...@@ -484,9 +484,8 @@ PeerConnectionDependencyFactory::CreateAsyncResolverFactory() { ...@@ -484,9 +484,8 @@ PeerConnectionDependencyFactory::CreateAsyncResolverFactory() {
} }
scoped_refptr<webrtc::MediaStreamInterface> scoped_refptr<webrtc::MediaStreamInterface>
PeerConnectionDependencyFactory::CreateLocalMediaStream( PeerConnectionDependencyFactory::CreateLocalMediaStream(const String& label) {
const std::string& label) { return GetPcFactory()->CreateLocalMediaStream(label.Utf8()).get();
return GetPcFactory()->CreateLocalMediaStream(label).get();
} }
scoped_refptr<webrtc::VideoTrackSourceInterface> scoped_refptr<webrtc::VideoTrackSourceInterface>
...@@ -504,24 +503,25 @@ PeerConnectionDependencyFactory::CreateVideoTrackSourceProxy( ...@@ -504,24 +503,25 @@ PeerConnectionDependencyFactory::CreateVideoTrackSourceProxy(
scoped_refptr<webrtc::VideoTrackInterface> scoped_refptr<webrtc::VideoTrackInterface>
PeerConnectionDependencyFactory::CreateLocalVideoTrack( PeerConnectionDependencyFactory::CreateLocalVideoTrack(
const std::string& id, const String& id,
webrtc::VideoTrackSourceInterface* source) { webrtc::VideoTrackSourceInterface* source) {
return GetPcFactory()->CreateVideoTrack(id, source).get(); return GetPcFactory()->CreateVideoTrack(id.Utf8(), source).get();
} }
webrtc::SessionDescriptionInterface* webrtc::SessionDescriptionInterface*
PeerConnectionDependencyFactory::CreateSessionDescription( PeerConnectionDependencyFactory::CreateSessionDescription(
const std::string& type, const String& type,
const std::string& sdp, const String& sdp,
webrtc::SdpParseError* error) { webrtc::SdpParseError* error) {
return webrtc::CreateSessionDescription(type, sdp, error); return webrtc::CreateSessionDescription(type.Utf8(), sdp.Utf8(), error);
} }
webrtc::IceCandidateInterface* webrtc::IceCandidateInterface*
PeerConnectionDependencyFactory::CreateIceCandidate(const std::string& sdp_mid, PeerConnectionDependencyFactory::CreateIceCandidate(const String& sdp_mid,
int sdp_mline_index, int sdp_mline_index,
const std::string& sdp) { const String& sdp) {
return webrtc::CreateIceCandidate(sdp_mid, sdp_mline_index, sdp, nullptr); return webrtc::CreateIceCandidate(sdp_mid.Utf8(), sdp_mline_index, sdp.Utf8(),
nullptr);
} }
blink::WebRtcAudioDeviceImpl* blink::WebRtcAudioDeviceImpl*
...@@ -632,8 +632,7 @@ void PeerConnectionDependencyFactory::EnsureWebRtcAudioDeviceImpl() { ...@@ -632,8 +632,7 @@ void PeerConnectionDependencyFactory::EnsureWebRtcAudioDeviceImpl() {
} }
std::unique_ptr<webrtc::RtpCapabilities> std::unique_ptr<webrtc::RtpCapabilities>
PeerConnectionDependencyFactory::GetSenderCapabilities( PeerConnectionDependencyFactory::GetSenderCapabilities(const String& kind) {
const std::string& kind) {
if (kind == "audio") { if (kind == "audio") {
return std::make_unique<webrtc::RtpCapabilities>( return std::make_unique<webrtc::RtpCapabilities>(
GetPcFactory()->GetRtpSenderCapabilities(cricket::MEDIA_TYPE_AUDIO)); GetPcFactory()->GetRtpSenderCapabilities(cricket::MEDIA_TYPE_AUDIO));
...@@ -645,8 +644,7 @@ PeerConnectionDependencyFactory::GetSenderCapabilities( ...@@ -645,8 +644,7 @@ PeerConnectionDependencyFactory::GetSenderCapabilities(
} }
std::unique_ptr<webrtc::RtpCapabilities> std::unique_ptr<webrtc::RtpCapabilities>
PeerConnectionDependencyFactory::GetReceiverCapabilities( PeerConnectionDependencyFactory::GetReceiverCapabilities(const String& kind) {
const std::string& kind) {
if (kind == "audio") { if (kind == "audio") {
return std::make_unique<webrtc::RtpCapabilities>( return std::make_unique<webrtc::RtpCapabilities>(
GetPcFactory()->GetRtpReceiverCapabilities(cricket::MEDIA_TYPE_AUDIO)); GetPcFactory()->GetRtpReceiverCapabilities(cricket::MEDIA_TYPE_AUDIO));
......
...@@ -5,8 +5,6 @@ ...@@ -5,8 +5,6 @@
#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_PEERCONNECTION_PEER_CONNECTION_DEPENDENCY_FACTORY_H_ #ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_PEERCONNECTION_PEER_CONNECTION_DEPENDENCY_FACTORY_H_
#define THIRD_PARTY_BLINK_RENDERER_MODULES_PEERCONNECTION_PEER_CONNECTION_DEPENDENCY_FACTORY_H_ #define THIRD_PARTY_BLINK_RENDERER_MODULES_PEERCONNECTION_PEER_CONNECTION_DEPENDENCY_FACTORY_H_
#include <string>
#include "base/macros.h" #include "base/macros.h"
#include "base/message_loop/message_loop_current.h" #include "base/message_loop/message_loop_current.h"
#include "base/single_thread_task_runner.h" #include "base/single_thread_task_runner.h"
...@@ -71,11 +69,11 @@ class MODULES_EXPORT PeerConnectionDependencyFactory ...@@ -71,11 +69,11 @@ class MODULES_EXPORT PeerConnectionDependencyFactory
// Asks the PeerConnection factory to create a Local MediaStream object. // Asks the PeerConnection factory to create a Local MediaStream object.
virtual scoped_refptr<webrtc::MediaStreamInterface> CreateLocalMediaStream( virtual scoped_refptr<webrtc::MediaStreamInterface> CreateLocalMediaStream(
const std::string& label); const String& label);
// Asks the PeerConnection factory to create a Local VideoTrack object. // Asks the PeerConnection factory to create a Local VideoTrack object.
virtual scoped_refptr<webrtc::VideoTrackInterface> CreateLocalVideoTrack( virtual scoped_refptr<webrtc::VideoTrackInterface> CreateLocalVideoTrack(
const std::string& id, const String& id,
webrtc::VideoTrackSourceInterface* source); webrtc::VideoTrackSourceInterface* source);
// Asks the libjingle PeerConnection factory to create a libjingle // Asks the libjingle PeerConnection factory to create a libjingle
...@@ -98,22 +96,22 @@ class MODULES_EXPORT PeerConnectionDependencyFactory ...@@ -98,22 +96,22 @@ class MODULES_EXPORT PeerConnectionDependencyFactory
// Creates a libjingle representation of a Session description. Used by a // Creates a libjingle representation of a Session description. Used by a
// RTCPeerConnectionHandler instance. // RTCPeerConnectionHandler instance.
virtual webrtc::SessionDescriptionInterface* CreateSessionDescription( virtual webrtc::SessionDescriptionInterface* CreateSessionDescription(
const std::string& type, const String& type,
const std::string& sdp, const String& sdp,
webrtc::SdpParseError* error); webrtc::SdpParseError* error);
// Creates a libjingle representation of an ice candidate. // Creates a libjingle representation of an ice candidate.
virtual webrtc::IceCandidateInterface* CreateIceCandidate( virtual webrtc::IceCandidateInterface* CreateIceCandidate(
const std::string& sdp_mid, const String& sdp_mid,
int sdp_mline_index, int sdp_mline_index,
const std::string& sdp); const String& sdp);
// Returns the most optimistic view of the capabilities of the system for // Returns the most optimistic view of the capabilities of the system for
// sending or receiving media of the given kind ("audio" or "video"). // sending or receiving media of the given kind ("audio" or "video").
virtual std::unique_ptr<webrtc::RtpCapabilities> GetSenderCapabilities( virtual std::unique_ptr<webrtc::RtpCapabilities> GetSenderCapabilities(
const std::string& kind); const String& kind);
virtual std::unique_ptr<webrtc::RtpCapabilities> GetReceiverCapabilities( virtual std::unique_ptr<webrtc::RtpCapabilities> GetReceiverCapabilities(
const std::string& kind); const String& kind);
blink::WebRtcAudioDeviceImpl* GetWebRtcAudioDevice(); blink::WebRtcAudioDeviceImpl* GetWebRtcAudioDevice();
......
...@@ -1552,11 +1552,11 @@ void RTCPeerConnectionHandler::AddICECandidate( ...@@ -1552,11 +1552,11 @@ void RTCPeerConnectionHandler::AddICECandidate(
TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::addICECandidate"); TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::addICECandidate");
std::unique_ptr<webrtc::IceCandidateInterface> native_candidate( std::unique_ptr<webrtc::IceCandidateInterface> native_candidate(
dependency_factory_->CreateIceCandidate( dependency_factory_->CreateIceCandidate(
candidate->SdpMid().Utf8(), candidate->SdpMid(),
candidate->SdpMLineIndex() candidate->SdpMLineIndex()
? static_cast<int>(*candidate->SdpMLineIndex()) ? static_cast<int>(*candidate->SdpMLineIndex())
: -1, : -1,
candidate->Candidate().Utf8())); candidate->Candidate()));
auto callback_on_task_runner = auto callback_on_task_runner =
[](base::WeakPtr<RTCPeerConnectionHandler> handler_weak_ptr, [](base::WeakPtr<RTCPeerConnectionHandler> handler_weak_ptr,
...@@ -2446,8 +2446,7 @@ RTCPeerConnectionHandler::CreateNativeSessionDescription( ...@@ -2446,8 +2446,7 @@ RTCPeerConnectionHandler::CreateNativeSessionDescription(
const String& type, const String& type,
webrtc::SdpParseError* error) { webrtc::SdpParseError* error) {
webrtc::SessionDescriptionInterface* native_desc = webrtc::SessionDescriptionInterface* native_desc =
dependency_factory_->CreateSessionDescription(type.Utf8(), sdp.Utf8(), dependency_factory_->CreateSessionDescription(type, sdp, error);
error);
LOG_IF(ERROR, !native_desc) << "Failed to create native session description." LOG_IF(ERROR, !native_desc) << "Failed to create native session description."
<< " Type: " << type << " SDP: " << sdp; << " Type: " << type << " SDP: " << sdp;
......
...@@ -309,8 +309,7 @@ class RTCPeerConnectionHandlerTest : public ::testing::Test { ...@@ -309,8 +309,7 @@ class RTCPeerConnectionHandlerTest : public ::testing::Test {
} }
// Creates a WebKit local MediaStream. // Creates a WebKit local MediaStream.
blink::WebMediaStream CreateLocalMediaStream( WebMediaStream CreateLocalMediaStream(const std::string& stream_label) {
const std::string& stream_label) {
std::string video_track_label("video-label"); std::string video_track_label("video-label");
std::string audio_track_label("audio-label"); std::string audio_track_label("audio-label");
blink::WebMediaStreamSource blink_audio_source; blink::WebMediaStreamSource blink_audio_source;
...@@ -373,18 +372,18 @@ class RTCPeerConnectionHandlerTest : public ::testing::Test { ...@@ -373,18 +372,18 @@ class RTCPeerConnectionHandlerTest : public ::testing::Test {
// Creates a remote MediaStream and adds it to the mocked native // Creates a remote MediaStream and adds it to the mocked native
// peer connection. // peer connection.
rtc::scoped_refptr<webrtc::MediaStreamInterface> AddRemoteMockMediaStream( rtc::scoped_refptr<webrtc::MediaStreamInterface> AddRemoteMockMediaStream(
const std::string& stream_label, const String& stream_label,
const std::string& video_track_label, const String& video_track_label,
const std::string& audio_track_label) { const String& audio_track_label) {
rtc::scoped_refptr<webrtc::MediaStreamInterface> stream( rtc::scoped_refptr<webrtc::MediaStreamInterface> stream(
mock_dependency_factory_->CreateLocalMediaStream(stream_label).get()); mock_dependency_factory_->CreateLocalMediaStream(stream_label).get());
if (!video_track_label.empty()) { if (!video_track_label.IsEmpty()) {
InvokeAddTrack( InvokeAddTrack(
stream, blink::MockWebRtcVideoTrack::Create(video_track_label).get()); stream, MockWebRtcVideoTrack::Create(video_track_label.Utf8()).get());
} }
if (!audio_track_label.empty()) { if (!audio_track_label.IsEmpty()) {
InvokeAddTrack( InvokeAddTrack(
stream, blink::MockWebRtcAudioTrack::Create(audio_track_label).get()); stream, MockWebRtcAudioTrack::Create(audio_track_label.Utf8()).get());
} }
mock_peer_connection_->AddRemoteStream(stream); mock_peer_connection_->AddRemoteStream(stream);
return stream; return stream;
......
...@@ -193,7 +193,7 @@ RTCRtpCapabilities* RTCRtpReceiver::getCapabilities(const String& kind) { ...@@ -193,7 +193,7 @@ RTCRtpCapabilities* RTCRtpReceiver::getCapabilities(const String& kind) {
std::unique_ptr<webrtc::RtpCapabilities> rtc_capabilities = std::unique_ptr<webrtc::RtpCapabilities> rtc_capabilities =
PeerConnectionDependencyFactory::GetInstance()->GetSenderCapabilities( PeerConnectionDependencyFactory::GetInstance()->GetSenderCapabilities(
kind.Utf8()); kind);
HeapVector<Member<RTCRtpCodecCapability>> codecs; HeapVector<Member<RTCRtpCodecCapability>> codecs;
codecs.ReserveInitialCapacity( codecs.ReserveInitialCapacity(
......
...@@ -580,7 +580,7 @@ RTCRtpCapabilities* RTCRtpSender::getCapabilities(const String& kind) { ...@@ -580,7 +580,7 @@ RTCRtpCapabilities* RTCRtpSender::getCapabilities(const String& kind) {
std::unique_ptr<webrtc::RtpCapabilities> rtc_capabilities = std::unique_ptr<webrtc::RtpCapabilities> rtc_capabilities =
PeerConnectionDependencyFactory::GetInstance()->GetSenderCapabilities( PeerConnectionDependencyFactory::GetInstance()->GetSenderCapabilities(
kind.Utf8()); kind);
HeapVector<Member<RTCRtpCodecCapability>> codecs; HeapVector<Member<RTCRtpCodecCapability>> codecs;
codecs.ReserveInitialCapacity( codecs.ReserveInitialCapacity(
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment