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

Side by Side Diff: media/cast/net/cast_transport_impl.cc

Issue 1878883003: Refactor: simplify interface of SenderRtcpSession and CastTransport. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase Created 4 years, 7 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 | « media/cast/net/cast_transport_impl.h ('k') | media/cast/net/cast_transport_impl_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "media/cast/net/cast_transport_impl.h" 5 #include "media/cast/net/cast_transport_impl.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <algorithm> 8 #include <algorithm>
9 #include <string> 9 #include <string>
10 #include <utility> 10 #include <utility>
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
49 const scoped_refptr<base::SingleThreadTaskRunner>& transport_task_runner) { 49 const scoped_refptr<base::SingleThreadTaskRunner>& transport_task_runner) {
50 return std::unique_ptr<CastTransport>( 50 return std::unique_ptr<CastTransport>(
51 new CastTransportImpl(clock, logging_flush_interval, std::move(client), 51 new CastTransportImpl(clock, logging_flush_interval, std::move(client),
52 std::move(transport), transport_task_runner.get())); 52 std::move(transport), transport_task_runner.get()));
53 } 53 }
54 54
55 PacketReceiverCallback CastTransport::PacketReceiverForTesting() { 55 PacketReceiverCallback CastTransport::PacketReceiverForTesting() {
56 return PacketReceiverCallback(); 56 return PacketReceiverCallback();
57 } 57 }
58 58
59 class CastTransportImpl::RtcpClient : public RtcpObserver {
60 public:
61 RtcpClient(std::unique_ptr<RtcpObserver> observer,
62 uint32_t rtp_sender_ssrc,
63 EventMediaType media_type,
64 CastTransportImpl* cast_transport_impl)
65 : rtp_sender_ssrc_(rtp_sender_ssrc),
66 rtcp_observer_(std::move(observer)),
67 media_type_(media_type),
68 cast_transport_impl_(cast_transport_impl) {}
69
70 void OnReceivedCastMessage(const RtcpCastMessage& cast_message) override {
71 rtcp_observer_->OnReceivedCastMessage(cast_message);
72 cast_transport_impl_->OnReceivedCastMessage(rtp_sender_ssrc_, cast_message);
73 }
74
75 void OnReceivedRtt(base::TimeDelta round_trip_time) override {
76 rtcp_observer_->OnReceivedRtt(round_trip_time);
77 }
78
79 void OnReceivedReceiverLog(const RtcpReceiverLogMessage& log) override {
80 cast_transport_impl_->OnReceivedLogMessage(media_type_, log);
81 }
82
83 void OnReceivedPli() override { rtcp_observer_->OnReceivedPli(); }
84
85 private:
86 const uint32_t rtp_sender_ssrc_;
87 const std::unique_ptr<RtcpObserver> rtcp_observer_;
88 const EventMediaType media_type_;
89 CastTransportImpl* const cast_transport_impl_;
90
91 DISALLOW_COPY_AND_ASSIGN(RtcpClient);
92 };
93
59 CastTransportImpl::CastTransportImpl( 94 CastTransportImpl::CastTransportImpl(
60 base::TickClock* clock, 95 base::TickClock* clock,
61 base::TimeDelta logging_flush_interval, 96 base::TimeDelta logging_flush_interval,
62 std::unique_ptr<Client> client, 97 std::unique_ptr<Client> client,
63 std::unique_ptr<PacketTransport> transport, 98 std::unique_ptr<PacketTransport> transport,
64 const scoped_refptr<base::SingleThreadTaskRunner>& transport_task_runner) 99 const scoped_refptr<base::SingleThreadTaskRunner>& transport_task_runner)
65 : clock_(clock), 100 : clock_(clock),
66 logging_flush_interval_(logging_flush_interval), 101 logging_flush_interval_(logging_flush_interval),
67 transport_client_(std::move(client)), 102 transport_client_(std::move(client)),
68 transport_(std::move(transport)), 103 transport_(std::move(transport)),
(...skipping 20 matching lines...) Expand all
89 transport_->StartReceiving( 124 transport_->StartReceiving(
90 base::Bind(&CastTransportImpl::OnReceivedPacket, base::Unretained(this))); 125 base::Bind(&CastTransportImpl::OnReceivedPacket, base::Unretained(this)));
91 } 126 }
92 127
93 CastTransportImpl::~CastTransportImpl() { 128 CastTransportImpl::~CastTransportImpl() {
94 transport_->StopReceiving(); 129 transport_->StopReceiving();
95 } 130 }
96 131
97 void CastTransportImpl::InitializeAudio( 132 void CastTransportImpl::InitializeAudio(
98 const CastTransportRtpConfig& config, 133 const CastTransportRtpConfig& config,
99 const RtcpCastMessageCallback& cast_message_cb, 134 std::unique_ptr<RtcpObserver> rtcp_observer) {
100 const RtcpRttCallback& rtt_cb,
101 const RtcpPliCallback& pli_cb) {
102 LOG_IF(WARNING, config.aes_key.empty() || config.aes_iv_mask.empty()) 135 LOG_IF(WARNING, config.aes_key.empty() || config.aes_iv_mask.empty())
103 << "Unsafe to send audio with encryption DISABLED."; 136 << "Unsafe to send audio with encryption DISABLED.";
104 if (!audio_encryptor_.Initialize(config.aes_key, config.aes_iv_mask)) { 137 if (!audio_encryptor_.Initialize(config.aes_key, config.aes_iv_mask)) {
105 transport_client_->OnStatusChanged(TRANSPORT_AUDIO_UNINITIALIZED); 138 transport_client_->OnStatusChanged(TRANSPORT_AUDIO_UNINITIALIZED);
106 return; 139 return;
107 } 140 }
108 141
109 audio_sender_.reset(new RtpSender(transport_task_runner_, &pacer_)); 142 audio_sender_.reset(new RtpSender(transport_task_runner_, &pacer_));
110 if (audio_sender_->Initialize(config)) { 143 if (audio_sender_->Initialize(config)) {
111 // Audio packets have a higher priority. 144 // Audio packets have a higher priority.
112 pacer_.RegisterAudioSsrc(config.ssrc); 145 pacer_.RegisterAudioSsrc(config.ssrc);
113 pacer_.RegisterPrioritySsrc(config.ssrc); 146 pacer_.RegisterPrioritySsrc(config.ssrc);
114 transport_client_->OnStatusChanged(TRANSPORT_AUDIO_INITIALIZED); 147 transport_client_->OnStatusChanged(TRANSPORT_AUDIO_INITIALIZED);
115 } else { 148 } else {
116 audio_sender_.reset(); 149 audio_sender_.reset();
117 transport_client_->OnStatusChanged(TRANSPORT_AUDIO_UNINITIALIZED); 150 transport_client_->OnStatusChanged(TRANSPORT_AUDIO_UNINITIALIZED);
118 return; 151 return;
119 } 152 }
120 153
121 audio_rtcp_session_.reset(new SenderRtcpSession( 154 audio_rtcp_observer_.reset(
122 base::Bind(&CastTransportImpl::OnReceivedCastMessage, 155 new RtcpClient(std::move(rtcp_observer), config.ssrc, AUDIO_EVENT, this));
123 weak_factory_.GetWeakPtr(), config.ssrc, cast_message_cb), 156 audio_rtcp_session_.reset(
124 rtt_cb, base::Bind(&CastTransportImpl::OnReceivedLogMessage, 157 new SenderRtcpSession(clock_, &pacer_, audio_rtcp_observer_.get(),
125 weak_factory_.GetWeakPtr(), AUDIO_EVENT), 158 config.ssrc, config.feedback_ssrc));
126 pli_cb, clock_, &pacer_, config.ssrc, config.feedback_ssrc));
127 pacer_.RegisterAudioSsrc(config.ssrc); 159 pacer_.RegisterAudioSsrc(config.ssrc);
128 valid_sender_ssrcs_.insert(config.feedback_ssrc); 160 valid_sender_ssrcs_.insert(config.feedback_ssrc);
129 transport_client_->OnStatusChanged(TRANSPORT_AUDIO_INITIALIZED); 161 transport_client_->OnStatusChanged(TRANSPORT_AUDIO_INITIALIZED);
130 } 162 }
131 163
132 void CastTransportImpl::InitializeVideo( 164 void CastTransportImpl::InitializeVideo(
133 const CastTransportRtpConfig& config, 165 const CastTransportRtpConfig& config,
134 const RtcpCastMessageCallback& cast_message_cb, 166 std::unique_ptr<RtcpObserver> rtcp_observer) {
135 const RtcpRttCallback& rtt_cb,
136 const RtcpPliCallback& pli_cb) {
137 LOG_IF(WARNING, config.aes_key.empty() || config.aes_iv_mask.empty()) 167 LOG_IF(WARNING, config.aes_key.empty() || config.aes_iv_mask.empty())
138 << "Unsafe to send video with encryption DISABLED."; 168 << "Unsafe to send video with encryption DISABLED.";
139 if (!video_encryptor_.Initialize(config.aes_key, config.aes_iv_mask)) { 169 if (!video_encryptor_.Initialize(config.aes_key, config.aes_iv_mask)) {
140 transport_client_->OnStatusChanged(TRANSPORT_VIDEO_UNINITIALIZED); 170 transport_client_->OnStatusChanged(TRANSPORT_VIDEO_UNINITIALIZED);
141 return; 171 return;
142 } 172 }
143 173
144 video_sender_.reset(new RtpSender(transport_task_runner_, &pacer_)); 174 video_sender_.reset(new RtpSender(transport_task_runner_, &pacer_));
145 if (!video_sender_->Initialize(config)) { 175 if (!video_sender_->Initialize(config)) {
146 video_sender_.reset(); 176 video_sender_.reset();
147 transport_client_->OnStatusChanged(TRANSPORT_VIDEO_UNINITIALIZED); 177 transport_client_->OnStatusChanged(TRANSPORT_VIDEO_UNINITIALIZED);
148 return; 178 return;
149 } 179 }
150 180
151 video_rtcp_session_.reset(new SenderRtcpSession( 181 video_rtcp_observer_.reset(
152 base::Bind(&CastTransportImpl::OnReceivedCastMessage, 182 new RtcpClient(std::move(rtcp_observer), config.ssrc, VIDEO_EVENT, this));
153 weak_factory_.GetWeakPtr(), config.ssrc, cast_message_cb), 183 video_rtcp_session_.reset(
154 rtt_cb, base::Bind(&CastTransportImpl::OnReceivedLogMessage, 184 new SenderRtcpSession(clock_, &pacer_, video_rtcp_observer_.get(),
155 weak_factory_.GetWeakPtr(), VIDEO_EVENT), 185 config.ssrc, config.feedback_ssrc));
156 pli_cb, clock_, &pacer_, config.ssrc, config.feedback_ssrc));
157 pacer_.RegisterVideoSsrc(config.ssrc); 186 pacer_.RegisterVideoSsrc(config.ssrc);
158 valid_sender_ssrcs_.insert(config.feedback_ssrc); 187 valid_sender_ssrcs_.insert(config.feedback_ssrc);
159 transport_client_->OnStatusChanged(TRANSPORT_VIDEO_INITIALIZED); 188 transport_client_->OnStatusChanged(TRANSPORT_VIDEO_INITIALIZED);
160 } 189 }
161 190
162 namespace { 191 namespace {
163 void EncryptAndSendFrame(const EncodedFrame& frame, 192 void EncryptAndSendFrame(const EncodedFrame& frame,
164 TransportEncryptionHandler* encryptor, 193 TransportEncryptionHandler* encryptor,
165 RtpSender* sender) { 194 RtpSender* sender) {
166 // TODO(miu): We probably shouldn't attempt to send an empty frame, but this 195 // TODO(miu): We probably shouldn't attempt to send an empty frame, but this
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after
342 VLOG(2) << "Received log message via RTCP that we did not expect: " 371 VLOG(2) << "Received log message via RTCP that we did not expect: "
343 << event_log_message.type; 372 << event_log_message.type;
344 break; 373 break;
345 } 374 }
346 } 375 }
347 } 376 }
348 } 377 }
349 378
350 void CastTransportImpl::OnReceivedCastMessage( 379 void CastTransportImpl::OnReceivedCastMessage(
351 uint32_t ssrc, 380 uint32_t ssrc,
352 const RtcpCastMessageCallback& cast_message_cb,
353 const RtcpCastMessage& cast_message) { 381 const RtcpCastMessage& cast_message) {
354 if (!cast_message_cb.is_null())
355 cast_message_cb.Run(cast_message);
356 382
357 DedupInfo dedup_info; 383 DedupInfo dedup_info;
358 if (audio_sender_ && audio_sender_->ssrc() == ssrc) { 384 if (audio_sender_ && audio_sender_->ssrc() == ssrc) {
359 const int64_t acked_bytes = 385 const int64_t acked_bytes =
360 audio_sender_->GetLastByteSentForFrame(cast_message.ack_frame_id); 386 audio_sender_->GetLastByteSentForFrame(cast_message.ack_frame_id);
361 last_byte_acked_for_audio_ = 387 last_byte_acked_for_audio_ =
362 std::max(acked_bytes, last_byte_acked_for_audio_); 388 std::max(acked_bytes, last_byte_acked_for_audio_);
363 } else if (video_sender_ && video_sender_->ssrc() == ssrc) { 389 } else if (video_sender_ && video_sender_->ssrc() == ssrc) {
364 dedup_info.resend_interval = video_rtcp_session_->current_round_trip_time(); 390 dedup_info.resend_interval = video_rtcp_session_->current_round_trip_time();
365 391
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
483 "calling CastTransportImpl::SendRtcpFromRtpReceiver."; 509 "calling CastTransportImpl::SendRtcpFromRtpReceiver.";
484 return; 510 return;
485 } 511 }
486 pacer_.SendRtcpPacket(rtcp_builder_at_rtp_receiver_->local_ssrc(), 512 pacer_.SendRtcpPacket(rtcp_builder_at_rtp_receiver_->local_ssrc(),
487 rtcp_builder_at_rtp_receiver_->Finish()); 513 rtcp_builder_at_rtp_receiver_->Finish());
488 rtcp_builder_at_rtp_receiver_.reset(); 514 rtcp_builder_at_rtp_receiver_.reset();
489 } 515 }
490 516
491 } // namespace cast 517 } // namespace cast
492 } // namespace media 518 } // namespace media
OLDNEW
« no previous file with comments | « media/cast/net/cast_transport_impl.h ('k') | media/cast/net/cast_transport_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698