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

Side by Side Diff: media/cast/transport/cast_transport_sender_impl.cc

Issue 388663003: Cast: Reshuffle files under media/cast (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: missing includes Created 6 years, 5 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 | Annotate | Revision Log
OLDNEW
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "media/cast/transport/cast_transport_sender_impl.h"
6
7 #include "base/single_thread_task_runner.h"
8 #include "media/cast/transport/cast_transport_config.h"
9 #include "media/cast/transport/cast_transport_defines.h"
10 #include "net/base/net_util.h"
11
12 namespace media {
13 namespace cast {
14 namespace transport {
15
16 scoped_ptr<CastTransportSender> CastTransportSender::Create(
17 net::NetLog* net_log,
18 base::TickClock* clock,
19 const net::IPEndPoint& remote_end_point,
20 const CastTransportStatusCallback& status_callback,
21 const BulkRawEventsCallback& raw_events_callback,
22 base::TimeDelta raw_events_callback_interval,
23 const scoped_refptr<base::SingleThreadTaskRunner>& transport_task_runner) {
24 return scoped_ptr<CastTransportSender>(
25 new CastTransportSenderImpl(net_log,
26 clock,
27 remote_end_point,
28 status_callback,
29 raw_events_callback,
30 raw_events_callback_interval,
31 transport_task_runner.get(),
32 NULL));
33 }
34
35 CastTransportSenderImpl::CastTransportSenderImpl(
36 net::NetLog* net_log,
37 base::TickClock* clock,
38 const net::IPEndPoint& remote_end_point,
39 const CastTransportStatusCallback& status_callback,
40 const BulkRawEventsCallback& raw_events_callback,
41 base::TimeDelta raw_events_callback_interval,
42 const scoped_refptr<base::SingleThreadTaskRunner>& transport_task_runner,
43 PacketSender* external_transport)
44 : clock_(clock),
45 status_callback_(status_callback),
46 transport_task_runner_(transport_task_runner),
47 transport_(external_transport ? NULL
48 : new UdpTransport(net_log,
49 transport_task_runner,
50 net::IPEndPoint(),
51 remote_end_point,
52 status_callback)),
53 logging_(),
54 pacer_(clock,
55 &logging_,
56 external_transport ? external_transport : transport_.get(),
57 transport_task_runner),
58 rtcp_builder_(&pacer_),
59 raw_events_callback_(raw_events_callback) {
60 DCHECK(clock_);
61 if (!raw_events_callback_.is_null()) {
62 DCHECK(raw_events_callback_interval > base::TimeDelta());
63 event_subscriber_.reset(new SimpleEventSubscriber);
64 logging_.AddRawEventSubscriber(event_subscriber_.get());
65 raw_events_timer_.Start(FROM_HERE,
66 raw_events_callback_interval,
67 this,
68 &CastTransportSenderImpl::SendRawEvents);
69 }
70 if (transport_) {
71 // The default DSCP value for cast is AF41. Which gives it a higher
72 // priority over other traffic.
73 transport_->SetDscp(net::DSCP_AF41);
74 }
75 }
76
77 CastTransportSenderImpl::~CastTransportSenderImpl() {
78 if (event_subscriber_.get())
79 logging_.RemoveRawEventSubscriber(event_subscriber_.get());
80 }
81
82 void CastTransportSenderImpl::InitializeAudio(
83 const CastTransportRtpConfig& config) {
84 LOG_IF(WARNING, config.aes_key.empty() || config.aes_iv_mask.empty())
85 << "Unsafe to send audio with encryption DISABLED.";
86 if (!audio_encryptor_.Initialize(config.aes_key, config.aes_iv_mask)) {
87 status_callback_.Run(TRANSPORT_AUDIO_UNINITIALIZED);
88 return;
89 }
90 audio_sender_.reset(new RtpSender(clock_, transport_task_runner_, &pacer_));
91 if (audio_sender_->Initialize(config)) {
92 pacer_.RegisterAudioSsrc(config.ssrc);
93 status_callback_.Run(TRANSPORT_AUDIO_INITIALIZED);
94 } else {
95 audio_sender_.reset();
96 status_callback_.Run(TRANSPORT_AUDIO_UNINITIALIZED);
97 }
98 }
99
100 void CastTransportSenderImpl::InitializeVideo(
101 const CastTransportRtpConfig& config) {
102 LOG_IF(WARNING, config.aes_key.empty() || config.aes_iv_mask.empty())
103 << "Unsafe to send video with encryption DISABLED.";
104 if (!video_encryptor_.Initialize(config.aes_key, config.aes_iv_mask)) {
105 status_callback_.Run(TRANSPORT_VIDEO_UNINITIALIZED);
106 return;
107 }
108 video_sender_.reset(new RtpSender(clock_, transport_task_runner_, &pacer_));
109 if (video_sender_->Initialize(config)) {
110 pacer_.RegisterVideoSsrc(config.ssrc);
111 status_callback_.Run(TRANSPORT_VIDEO_INITIALIZED);
112 } else {
113 video_sender_.reset();
114 status_callback_.Run(TRANSPORT_VIDEO_UNINITIALIZED);
115 }
116 }
117
118 void CastTransportSenderImpl::SetPacketReceiver(
119 const PacketReceiverCallback& packet_receiver) {
120 transport_->StartReceiving(packet_receiver);
121 }
122
123 namespace {
124 void EncryptAndSendFrame(const EncodedFrame& frame,
125 TransportEncryptionHandler* encryptor,
126 RtpSender* sender) {
127 if (encryptor->is_activated()) {
128 EncodedFrame encrypted_frame;
129 frame.CopyMetadataTo(&encrypted_frame);
130 if (encryptor->Encrypt(frame.frame_id, frame.data, &encrypted_frame.data)) {
131 sender->SendFrame(encrypted_frame);
132 } else {
133 LOG(ERROR) << "Encryption failed. Not sending frame with ID "
134 << frame.frame_id;
135 }
136 } else {
137 sender->SendFrame(frame);
138 }
139 }
140 } // namespace
141
142 void CastTransportSenderImpl::InsertCodedAudioFrame(
143 const EncodedFrame& audio_frame) {
144 DCHECK(audio_sender_) << "Audio sender uninitialized";
145 EncryptAndSendFrame(audio_frame, &audio_encryptor_, audio_sender_.get());
146 }
147
148 void CastTransportSenderImpl::InsertCodedVideoFrame(
149 const EncodedFrame& video_frame) {
150 DCHECK(video_sender_) << "Video sender uninitialized";
151 EncryptAndSendFrame(video_frame, &video_encryptor_, video_sender_.get());
152 }
153
154 void CastTransportSenderImpl::SendRtcpFromRtpSender(
155 uint32 packet_type_flags,
156 uint32 ntp_seconds,
157 uint32 ntp_fraction,
158 uint32 rtp_timestamp,
159 const RtcpDlrrReportBlock& dlrr,
160 uint32 sending_ssrc,
161 const std::string& c_name) {
162 RtcpSenderInfo sender_info;
163 sender_info.ntp_seconds = ntp_seconds;
164 sender_info.ntp_fraction = ntp_fraction;
165 sender_info.rtp_timestamp = rtp_timestamp;
166 if (audio_sender_ && audio_sender_->ssrc() == sending_ssrc) {
167 sender_info.send_packet_count = audio_sender_->send_packet_count();
168 sender_info.send_octet_count = audio_sender_->send_octet_count();
169 } else if (video_sender_ && video_sender_->ssrc() == sending_ssrc) {
170 sender_info.send_packet_count = video_sender_->send_packet_count();
171 sender_info.send_octet_count = video_sender_->send_octet_count();
172 } else {
173 LOG(ERROR) << "Sending RTCP with an invalid SSRC.";
174 return;
175 }
176 rtcp_builder_.SendRtcpFromRtpSender(
177 packet_type_flags, sender_info, dlrr, sending_ssrc, c_name);
178 }
179
180 void CastTransportSenderImpl::ResendPackets(
181 bool is_audio,
182 const MissingFramesAndPacketsMap& missing_packets,
183 bool cancel_rtx_if_not_in_list,
184 base::TimeDelta dedupe_window) {
185 if (is_audio) {
186 DCHECK(audio_sender_) << "Audio sender uninitialized";
187 audio_sender_->ResendPackets(missing_packets,
188 cancel_rtx_if_not_in_list,
189 dedupe_window);
190 } else {
191 DCHECK(video_sender_) << "Video sender uninitialized";
192 video_sender_->ResendPackets(missing_packets,
193 cancel_rtx_if_not_in_list,
194 dedupe_window);
195 }
196 }
197
198 void CastTransportSenderImpl::SendRawEvents() {
199 DCHECK(event_subscriber_.get());
200 DCHECK(!raw_events_callback_.is_null());
201 std::vector<PacketEvent> packet_events;
202 event_subscriber_->GetPacketEventsAndReset(&packet_events);
203 raw_events_callback_.Run(packet_events);
204 }
205
206 } // namespace transport
207 } // namespace cast
208 } // namespace media
OLDNEW
« no previous file with comments | « media/cast/transport/cast_transport_sender_impl.h ('k') | media/cast/transport/cast_transport_sender_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698