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

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

Issue 2675173003: Adding "adapter" ORTC objects on top of ChannelManager/BaseChannel/etc. (Closed)
Patch Set: Add memcheck suppression for end-to-end tests. Created 3 years, 9 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
« no previous file with comments | « webrtc/ortc/ortcrtpsenderadapter.h ('k') | webrtc/ortc/rtpparametersconversion.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 <utility>
14
15 #include "webrtc/base/checks.h"
16 #include "webrtc/media/base/mediaconstants.h"
17 #include "webrtc/ortc/rtptransportadapter.h"
18
19 namespace {
20
21 void FillAudioSenderParameters(webrtc::RtpParameters* parameters) {
22 for (webrtc::RtpCodecParameters& codec : parameters->codecs) {
23 if (!codec.num_channels) {
24 codec.num_channels = rtc::Optional<int>(1);
25 }
26 }
27 }
28
29 void FillVideoSenderParameters(webrtc::RtpParameters* parameters) {
30 for (webrtc::RtpCodecParameters& codec : parameters->codecs) {
31 if (!codec.clock_rate) {
32 codec.clock_rate = rtc::Optional<int>(cricket::kVideoCodecClockrate);
33 }
34 }
35 }
36
37 } // namespace
38
39 namespace webrtc {
40
41 BEGIN_OWNED_PROXY_MAP(OrtcRtpSender)
42 PROXY_SIGNALING_THREAD_DESTRUCTOR()
43 PROXY_METHOD1(RTCError, SetTrack, MediaStreamTrackInterface*)
44 PROXY_CONSTMETHOD0(rtc::scoped_refptr<MediaStreamTrackInterface>, GetTrack)
45 PROXY_METHOD1(RTCError, SetTransport, RtpTransportInterface*)
46 PROXY_CONSTMETHOD0(RtpTransportInterface*, GetTransport)
47 PROXY_METHOD1(RTCError, Send, const RtpParameters&)
48 PROXY_CONSTMETHOD0(RtpParameters, GetParameters)
49 PROXY_CONSTMETHOD0(cricket::MediaType, GetKind)
50 END_PROXY_MAP()
51
52 // static
53 std::unique_ptr<OrtcRtpSenderInterface> OrtcRtpSenderAdapter::CreateProxy(
54 std::unique_ptr<OrtcRtpSenderAdapter> wrapped_sender) {
55 RTC_DCHECK(wrapped_sender);
56 rtc::Thread* signaling =
57 wrapped_sender->rtp_transport_controller_->signaling_thread();
58 rtc::Thread* worker =
59 wrapped_sender->rtp_transport_controller_->worker_thread();
60 return OrtcRtpSenderProxy::Create(signaling, worker,
61 std::move(wrapped_sender));
62 }
63
64 OrtcRtpSenderAdapter::~OrtcRtpSenderAdapter() {
65 internal_sender_ = nullptr;
66 SignalDestroyed();
67 }
68
69 RTCError OrtcRtpSenderAdapter::SetTrack(MediaStreamTrackInterface* track) {
70 if (track && cricket::MediaTypeFromString(track->kind()) != kind_) {
71 LOG_AND_RETURN_ERROR(
72 RTCErrorType::INVALID_PARAMETER,
73 "Track kind (audio/video) doesn't match the kind of this sender.");
74 }
75 if (internal_sender_ && !internal_sender_->SetTrack(track)) {
76 // Since we checked the track type above, this should never happen...
77 RTC_NOTREACHED();
78 LOG_AND_RETURN_ERROR(RTCErrorType::INTERNAL_ERROR,
79 "Failed to set track on RtpSender.");
80 }
81 track_ = track;
82 return RTCError::OK();
83 }
84
85 rtc::scoped_refptr<MediaStreamTrackInterface> OrtcRtpSenderAdapter::GetTrack()
86 const {
87 return track_;
88 }
89
90 RTCError OrtcRtpSenderAdapter::SetTransport(RtpTransportInterface* transport) {
91 LOG_AND_RETURN_ERROR(
92 RTCErrorType::UNSUPPORTED_OPERATION,
93 "Changing the transport of an RtpSender is not yet supported.");
94 }
95
96 RtpTransportInterface* OrtcRtpSenderAdapter::GetTransport() const {
97 return transport_;
98 }
99
100 RTCError OrtcRtpSenderAdapter::Send(const RtpParameters& parameters) {
101 RtpParameters filled_parameters = parameters;
102 RTCError err;
103 uint32_t ssrc = 0;
104 switch (kind_) {
105 case cricket::MEDIA_TYPE_AUDIO:
106 FillAudioSenderParameters(&filled_parameters);
107 err = rtp_transport_controller_->ValidateAndApplyAudioSenderParameters(
108 filled_parameters, &ssrc);
109 if (!err.ok()) {
110 return err;
111 }
112 break;
113 case cricket::MEDIA_TYPE_VIDEO:
114 FillVideoSenderParameters(&filled_parameters);
115 err = rtp_transport_controller_->ValidateAndApplyVideoSenderParameters(
116 filled_parameters, &ssrc);
117 if (!err.ok()) {
118 return err;
119 }
120 break;
121 case cricket::MEDIA_TYPE_DATA:
122 RTC_NOTREACHED();
123 return webrtc::RTCError(webrtc::RTCErrorType::INTERNAL_ERROR);
124 }
125 last_applied_parameters_ = filled_parameters;
126
127 // Now that parameters were applied, can call SetSsrc on the internal sender.
128 // This is analogous to a PeerConnection calling SetSsrc after
129 // SetLocalDescription is successful.
130 //
131 // If there were no encodings, this SSRC may be 0, which is valid.
132 if (!internal_sender_) {
133 CreateInternalSender();
134 }
135 internal_sender_->SetSsrc(ssrc);
136
137 return RTCError::OK();
138 }
139
140 RtpParameters OrtcRtpSenderAdapter::GetParameters() const {
141 return last_applied_parameters_;
142 }
143
144 cricket::MediaType OrtcRtpSenderAdapter::GetKind() const {
145 return kind_;
146 }
147
148 OrtcRtpSenderAdapter::OrtcRtpSenderAdapter(
149 cricket::MediaType kind,
150 RtpTransportInterface* transport,
151 RtpTransportControllerAdapter* rtp_transport_controller)
152 : kind_(kind),
153 transport_(transport),
154 rtp_transport_controller_(rtp_transport_controller) {}
155
156 void OrtcRtpSenderAdapter::CreateInternalSender() {
157 switch (kind_) {
158 case cricket::MEDIA_TYPE_AUDIO:
159 internal_sender_ = new AudioRtpSender(
160 rtp_transport_controller_->voice_channel(), nullptr);
161 break;
162 case cricket::MEDIA_TYPE_VIDEO:
163 internal_sender_ =
164 new VideoRtpSender(rtp_transport_controller_->video_channel());
165 break;
166 case cricket::MEDIA_TYPE_DATA:
167 RTC_NOTREACHED();
168 }
169 if (track_) {
170 if (!internal_sender_->SetTrack(track_)) {
171 // Since we checked the track type when it was set, this should never
172 // happen...
173 RTC_NOTREACHED();
174 }
175 }
176 }
177
178 } // namespace webrtc
OLDNEW
« no previous file with comments | « webrtc/ortc/ortcrtpsenderadapter.h ('k') | webrtc/ortc/rtpparametersconversion.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698