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

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

Issue 2675173003: Adding "adapter" ORTC objects on top of ChannelManager/BaseChannel/etc. (Closed)
Patch Set: Move ORTC files to different subdirectories 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/rtpsendershim.h"
12
13 #include "webrtc/base/checks.h"
14
15 namespace {
16
17 static const int kVideoClockrate = 90000;
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>(kVideoClockrate);
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, SetParameters, 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 RtpSenderShim::CreateProxied(cricket::MediaType kind,
53 const RtpParameters& parameters,
54 RtpTransportShim* transport) {
55 RTC_DCHECK(transport);
56 RtpTransportControllerShim* rtp_transport_controller =
57 transport->rtp_transport_controller();
58 // Call "attach" method to ensure more than one sender of the same type
59 // isn't attached to the same transport.
60 RTCError err;
61 switch (kind) {
62 case cricket::MEDIA_TYPE_AUDIO:
63 err = rtp_transport_controller->AttachAudioSender(transport);
64 break;
65 case cricket::MEDIA_TYPE_VIDEO:
66 err = rtp_transport_controller->AttachVideoSender(transport);
67 break;
68 case cricket::MEDIA_TYPE_DATA:
69 RTC_NOTREACHED();
70 }
71 if (!err.ok()) {
72 return err;
73 }
74
75 // Attempt to set parameters.
76 std::unique_ptr<RtpSenderShim> sender_shim(
77 new RtpSenderShim(kind, transport, rtp_transport_controller));
78 err = sender_shim->SetParameters(parameters);
79 if (!err.ok()) {
80 // Note: Destructor will automatically call "Detach" method.
81 return err;
82 }
83 return OrtcRtpSenderProxy::Create(
84 rtp_transport_controller->signaling_thread(),
85 rtp_transport_controller->worker_thread(), sender_shim.release());
86 }
87
88 RtpSenderShim::~RtpSenderShim() {
89 internal_sender_ = nullptr;
90 // Need to detach from transport (was attached in Create method).
91 switch (kind_) {
92 case cricket::MEDIA_TYPE_AUDIO:
93 rtp_transport_controller_->DetachAudioSender();
94 break;
95 case cricket::MEDIA_TYPE_VIDEO:
96 rtp_transport_controller_->DetachVideoSender();
97 break;
98 case cricket::MEDIA_TYPE_DATA:
99 RTC_NOTREACHED();
100 }
101 }
102
103 RTCError RtpSenderShim::SetTrack(MediaStreamTrackInterface* track) {
104 RTCError ret;
105 if (!internal_sender_->SetTrack(track)) {
106 // Should only happen if track type is invalid.
107 ret.set_type(RTCErrorType::INVALID_PARAMETER);
108 }
109 return ret;
110 }
111
112 rtc::scoped_refptr<MediaStreamTrackInterface> RtpSenderShim::GetTrack() const {
113 return internal_sender_->track();
114 }
115
116 RTCError RtpSenderShim::SetTransport(RtpTransportInterface* transport) {
117 LOG(LS_ERROR) << "Changing the transport of an RtpSender is not yet "
118 << "supported.";
119 return RTCError(RTCErrorType::UNSUPPORTED_PARAMETER);
120 }
121
122 RtpTransportInterface* RtpSenderShim::GetTransport() const {
123 return transport_;
124 }
125
126 RTCError RtpSenderShim::SetParameters(const RtpParameters& parameters) {
127 RtpParameters filled_parameters = parameters;
128 RTCError err;
129 uint32_t ssrc = 0;
130 switch (kind_) {
131 case cricket::MEDIA_TYPE_AUDIO:
132 FillAudioSenderParameters(&filled_parameters);
133 err = rtp_transport_controller_->ValidateAndApplyAudioSenderParameters(
134 filled_parameters, &ssrc);
135 if (!err.ok()) {
136 return err;
137 }
138 break;
139 case cricket::MEDIA_TYPE_VIDEO:
140 FillVideoSenderParameters(&filled_parameters);
141 err = rtp_transport_controller_->ValidateAndApplyVideoSenderParameters(
142 filled_parameters, &ssrc);
143 if (!err.ok()) {
144 return err;
145 }
146 break;
147 case cricket::MEDIA_TYPE_DATA:
148 RTC_NOTREACHED();
149 return webrtc::RTCError(webrtc::RTCErrorType::INTERNAL_ERROR);
150 }
151 last_applied_parameters_ = filled_parameters;
152
153 // Now that parameters were applied, can call SetSsrc on the internal sender.
154 // This is analogous to a PeerConnection calling SetSsrc after
155 // SetLocalDescription is successful.
156 //
157 // If there were no encodings, this SSRC may be 0, which is valid.
158 if (!internal_sender_) {
159 CreateInternalSender();
160 }
161 internal_sender_->SetSsrc(ssrc);
162
163 return RTCError();
164 }
165
166 RtpParameters RtpSenderShim::GetParameters() const {
167 return last_applied_parameters_;
168 }
169
170 cricket::MediaType RtpSenderShim::GetKind() const {
171 return internal_sender_->media_type();
172 }
173
174 RtpSenderShim::RtpSenderShim(
175 cricket::MediaType kind,
176 RtpTransportShim* transport,
177 RtpTransportControllerShim* rtp_transport_controller)
178 : kind_(kind),
179 transport_(transport),
180 rtp_transport_controller_(rtp_transport_controller) {}
181
182 void RtpSenderShim::CreateInternalSender() {
183 switch (kind_) {
184 case cricket::MEDIA_TYPE_AUDIO:
185 internal_sender_ = new AudioRtpSender(
186 rtp_transport_controller_->voice_channel(), nullptr);
187 break;
188 case cricket::MEDIA_TYPE_VIDEO:
189 internal_sender_ =
190 new VideoRtpSender(rtp_transport_controller_->video_channel());
191 break;
192 case cricket::MEDIA_TYPE_DATA:
193 RTC_NOTREACHED();
194 }
195 }
196
197 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698