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

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

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

Powered by Google App Engine
This is Rietveld 408576698