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

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

Issue 2675173003: Adding "adapter" ORTC objects on top of ChannelManager/BaseChannel/etc. (Closed)
Patch Set: Merge with master 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 std::unique_ptr<OrtcRtpSenderInterface> OrtcRtpSenderAdapter::CreateProxy(
52 std::unique_ptr<OrtcRtpSenderAdapter> wrapped_sender) {
53 RTC_DCHECK(wrapped_sender);
54 return OrtcRtpSenderProxy::Create(
55 wrapped_sender->rtp_transport_controller_->signaling_thread(),
56 wrapped_sender->rtp_transport_controller_->worker_thread(),
57 wrapped_sender.release());
58 }
59
60 OrtcRtpSenderAdapter::~OrtcRtpSenderAdapter() {
61 internal_sender_ = nullptr;
62 SignalDestroyed();
63 }
64
65 RTCError OrtcRtpSenderAdapter::SetTrack(MediaStreamTrackInterface* track) {
66 if (track && cricket::MediaTypeFromString(track->kind()) != kind_) {
67 LOG_AND_RETURN_ERROR(
68 RTCErrorType::INVALID_PARAMETER,
69 "Track kind (audio/video) doesn't match the kind of this sender.");
70 }
71 if (internal_sender_ && !internal_sender_->SetTrack(track)) {
72 // Since we checked the track type above, this should never happen...
73 RTC_NOTREACHED();
74 LOG_AND_RETURN_ERROR(RTCErrorType::INTERNAL_ERROR,
75 "Failed to set track on RtpSender.");
76 }
77 track_ = track;
78 return RTCError::OK();
79 }
80
81 rtc::scoped_refptr<MediaStreamTrackInterface> OrtcRtpSenderAdapter::GetTrack()
82 const {
83 return track_;
84 }
85
86 RTCError OrtcRtpSenderAdapter::SetTransport(RtpTransportInterface* transport) {
87 LOG_AND_RETURN_ERROR(
88 RTCErrorType::UNSUPPORTED_OPERATION,
89 "Changing the transport of an RtpSender is not yet supported.");
90 }
91
92 RtpTransportInterface* OrtcRtpSenderAdapter::GetTransport() const {
93 return transport_;
94 }
95
96 RTCError OrtcRtpSenderAdapter::Send(const RtpParameters& parameters) {
97 RtpParameters filled_parameters = parameters;
98 RTCError err;
99 uint32_t ssrc = 0;
100 switch (kind_) {
101 case cricket::MEDIA_TYPE_AUDIO:
102 FillAudioSenderParameters(&filled_parameters);
103 err = rtp_transport_controller_->ValidateAndApplyAudioSenderParameters(
104 filled_parameters, &ssrc);
105 if (!err.ok()) {
106 return err;
107 }
108 break;
109 case cricket::MEDIA_TYPE_VIDEO:
110 FillVideoSenderParameters(&filled_parameters);
111 err = rtp_transport_controller_->ValidateAndApplyVideoSenderParameters(
112 filled_parameters, &ssrc);
113 if (!err.ok()) {
114 return err;
115 }
116 break;
117 case cricket::MEDIA_TYPE_DATA:
118 RTC_NOTREACHED();
119 return webrtc::RTCError(webrtc::RTCErrorType::INTERNAL_ERROR);
120 }
121 last_applied_parameters_ = filled_parameters;
122
123 // Now that parameters were applied, can call SetSsrc on the internal sender.
124 // This is analogous to a PeerConnection calling SetSsrc after
125 // SetLocalDescription is successful.
126 //
127 // If there were no encodings, this SSRC may be 0, which is valid.
128 if (!internal_sender_) {
129 CreateInternalSender();
130 }
131 internal_sender_->SetSsrc(ssrc);
132
133 return RTCError::OK();
134 }
135
136 RtpParameters OrtcRtpSenderAdapter::GetParameters() const {
137 return last_applied_parameters_;
138 }
139
140 cricket::MediaType OrtcRtpSenderAdapter::GetKind() const {
141 return kind_;
142 }
143
144 OrtcRtpSenderAdapter::OrtcRtpSenderAdapter(
145 cricket::MediaType kind,
146 RtpTransportInterface* transport,
147 RtpTransportControllerAdapter* rtp_transport_controller)
148 : kind_(kind),
149 transport_(transport),
150 rtp_transport_controller_(rtp_transport_controller) {}
151
152 void OrtcRtpSenderAdapter::CreateInternalSender() {
153 switch (kind_) {
154 case cricket::MEDIA_TYPE_AUDIO:
155 internal_sender_ = new AudioRtpSender(
156 rtp_transport_controller_->voice_channel(), nullptr);
157 break;
158 case cricket::MEDIA_TYPE_VIDEO:
159 internal_sender_ =
160 new VideoRtpSender(rtp_transport_controller_->video_channel());
161 break;
162 case cricket::MEDIA_TYPE_DATA:
163 RTC_NOTREACHED();
164 }
165 if (track_) {
166 if (!internal_sender_->SetTrack(track_)) {
167 // Since we checked the track type when it was set, this should never
168 // happen...
169 RTC_NOTREACHED();
170 }
171 }
172 }
173
174 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698