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

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

Issue 2714813004: Create the SrtpTransportInterface. (Closed)
Patch Set: 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
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 if (!transport_->GetInternal()->TransportReadyToSendAndReceive()) {
100 LOG_AND_RETURN_ERROR(RTCErrorType::INVALID_STATE,
101 "The underneath transport is not ready to send.");
102 }
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

Powered by Google App Engine
This is Rietveld 408576698