Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(116)

Side by Side Diff: webrtc/ortc/ortcrtpsenderadapter.cc

Issue 2675173003: Adding "adapter" ORTC objects on top of ChannelManager/BaseChannel/etc. (Closed)
Patch Set: Adding OrtcFactory unit tests. Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 /*
2 * Copyright 2017 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11 #include "webrtc/ortc/ortcrtpsenderadapter.h"
12
13 #include "webrtc/base/checks.h"
14 #include "webrtc/media/base/mediaconstants.h"
15 #include "webrtc/ortc/rtptransportadapter.h"
16
17 namespace {
18
19 void FillAudioSenderParameters(webrtc::RtpParameters* parameters) {
20 for (webrtc::RtpCodecParameters& codec : parameters->codecs) {
21 if (!codec.num_channels) {
22 codec.num_channels = rtc::Optional<int>(1);
23 }
24 }
25 }
26
27 void FillVideoSenderParameters(webrtc::RtpParameters* parameters) {
28 for (webrtc::RtpCodecParameters& codec : parameters->codecs) {
29 if (!codec.clock_rate) {
30 codec.clock_rate = rtc::Optional<int>(cricket::kVideoCodecClockrate);
31 }
32 }
33 }
34
35 } // namespace
36
37 namespace webrtc {
38
39 BEGIN_OWNED_PROXY_MAP(OrtcRtpSender)
40 PROXY_SIGNALING_THREAD_DESTRUCTOR()
41 PROXY_METHOD1(RTCError, SetTrack, MediaStreamTrackInterface*)
42 PROXY_CONSTMETHOD0(rtc::scoped_refptr<MediaStreamTrackInterface>, GetTrack)
43 PROXY_METHOD1(RTCError, SetTransport, RtpTransportInterface*)
44 PROXY_CONSTMETHOD0(RtpTransportInterface*, GetTransport)
45 PROXY_METHOD1(RTCError, Send, const RtpParameters&)
46 PROXY_CONSTMETHOD0(RtpParameters, GetParameters)
47 PROXY_CONSTMETHOD0(cricket::MediaType, GetKind)
48 END_PROXY_MAP()
49
50 // static
51 RTCErrorOr<std::unique_ptr<OrtcRtpSenderInterface>>
52 OrtcRtpSenderAdapter::CreateProxied(cricket::MediaType kind,
53 RtpTransportInterface* transport) {
54 RTC_DCHECK(transport);
55 RtpTransportControllerAdapter* rtp_transport_controller =
56 transport->GetInternal()->rtp_transport_controller();
57 // Call "attach" method to ensure more than one sender of the same type
58 // isn't attached to the same transport.
59 RTCError err;
60 switch (kind) {
61 case cricket::MEDIA_TYPE_AUDIO:
62 err = rtp_transport_controller->AttachAudioSender(transport);
63 break;
64 case cricket::MEDIA_TYPE_VIDEO:
65 err = rtp_transport_controller->AttachVideoSender(transport);
66 break;
67 case cricket::MEDIA_TYPE_DATA:
68 RTC_NOTREACHED();
69 }
70 if (!err.ok()) {
71 return err;
72 }
73
74 return OrtcRtpSenderProxy::Create(
75 rtp_transport_controller->signaling_thread(),
76 rtp_transport_controller->worker_thread(),
77 new OrtcRtpSenderAdapter(kind, transport, rtp_transport_controller));
78 }
79
80 OrtcRtpSenderAdapter::~OrtcRtpSenderAdapter() {
81 internal_sender_ = nullptr;
82 // Need to detach from transport (was attached in Create method).
83 switch (kind_) {
84 case cricket::MEDIA_TYPE_AUDIO:
85 rtp_transport_controller_->DetachAudioSender();
86 break;
87 case cricket::MEDIA_TYPE_VIDEO:
88 rtp_transport_controller_->DetachVideoSender();
89 break;
90 case cricket::MEDIA_TYPE_DATA:
91 RTC_NOTREACHED();
92 }
93 }
94
95 RTCError OrtcRtpSenderAdapter::SetTrack(MediaStreamTrackInterface* track) {
96 if (track && cricket::MediaTypeFromString(track->kind()) != kind_) {
97 LOG_AND_RETURN_ERROR(
98 RTCErrorType::INVALID_PARAMETER,
99 "Track kind (audio/video) doesn't match the kind of this sender.");
100 }
101 if (!internal_sender_->SetTrack(track)) {
102 // Since we checked the track type above, this should never happen...
103 RTC_NOTREACHED();
104 return RTCError(RTCErrorType::INTERNAL_ERROR);
105 }
106 return RTCError::OK();
107 }
108
109 rtc::scoped_refptr<MediaStreamTrackInterface> OrtcRtpSenderAdapter::GetTrack()
110 const {
111 return internal_sender_->track();
112 }
113
114 RTCError OrtcRtpSenderAdapter::SetTransport(RtpTransportInterface* transport) {
115 LOG(LS_ERROR) << "Changing the transport of an RtpSender is not yet "
116 << "supported.";
117 return RTCError(RTCErrorType::UNSUPPORTED_PARAMETER);
118 }
119
120 RtpTransportInterface* OrtcRtpSenderAdapter::GetTransport() const {
121 return transport_;
122 }
123
124 RTCError OrtcRtpSenderAdapter::Send(const RtpParameters& parameters) {
125 RtpParameters filled_parameters = parameters;
126 RTCError err;
127 uint32_t ssrc = 0;
128 switch (kind_) {
129 case cricket::MEDIA_TYPE_AUDIO:
130 FillAudioSenderParameters(&filled_parameters);
131 err = rtp_transport_controller_->ValidateAndApplyAudioSenderParameters(
132 filled_parameters, &ssrc);
133 if (!err.ok()) {
134 return err;
135 }
136 break;
137 case cricket::MEDIA_TYPE_VIDEO:
138 FillVideoSenderParameters(&filled_parameters);
139 err = rtp_transport_controller_->ValidateAndApplyVideoSenderParameters(
140 filled_parameters, &ssrc);
141 if (!err.ok()) {
142 return err;
143 }
144 break;
145 case cricket::MEDIA_TYPE_DATA:
146 RTC_NOTREACHED();
147 return webrtc::RTCError(webrtc::RTCErrorType::INTERNAL_ERROR);
148 }
149 last_applied_parameters_ = filled_parameters;
150
151 // Now that parameters were applied, can call SetSsrc on the internal sender.
152 // This is analogous to a PeerConnection calling SetSsrc after
153 // SetLocalDescription is successful.
154 //
155 // If there were no encodings, this SSRC may be 0, which is valid.
156 internal_sender_->SetSsrc(ssrc);
157
158 return RTCError::OK();
159 }
160
161 RtpParameters OrtcRtpSenderAdapter::GetParameters() const {
162 return last_applied_parameters_;
163 }
164
165 cricket::MediaType OrtcRtpSenderAdapter::GetKind() const {
166 return internal_sender_->media_type();
167 }
168
169 OrtcRtpSenderAdapter::OrtcRtpSenderAdapter(
170 cricket::MediaType kind,
171 RtpTransportInterface* transport,
172 RtpTransportControllerAdapter* rtp_transport_controller)
173 : kind_(kind),
174 transport_(transport),
175 rtp_transport_controller_(rtp_transport_controller) {
176 CreateInternalSender();
177 }
178
179 void OrtcRtpSenderAdapter::CreateInternalSender() {
180 switch (kind_) {
181 case cricket::MEDIA_TYPE_AUDIO:
182 internal_sender_ = new AudioRtpSender(
183 rtp_transport_controller_->voice_channel(), nullptr);
184 break;
185 case cricket::MEDIA_TYPE_VIDEO:
186 internal_sender_ =
187 new VideoRtpSender(rtp_transport_controller_->video_channel());
188 break;
189 case cricket::MEDIA_TYPE_DATA:
190 RTC_NOTREACHED();
191 }
192 }
193
194 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698