OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/video_sender/video_sender.h" | 5 #include "media/cast/video_sender/video_sender.h" |
6 | 6 |
7 #include <list> | 7 #include <list> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
54 VideoSender::VideoSender( | 54 VideoSender::VideoSender( |
55 scoped_refptr<CastEnvironment> cast_environment, | 55 scoped_refptr<CastEnvironment> cast_environment, |
56 const VideoSenderConfig& video_config, | 56 const VideoSenderConfig& video_config, |
57 const scoped_refptr<GpuVideoAcceleratorFactories>& gpu_factories, | 57 const scoped_refptr<GpuVideoAcceleratorFactories>& gpu_factories, |
58 transport::PacedPacketSender* const paced_packet_sender) | 58 transport::PacedPacketSender* const paced_packet_sender) |
59 : rtp_max_delay_( | 59 : rtp_max_delay_( |
60 base::TimeDelta::FromMilliseconds(video_config.rtp_max_delay_ms)), | 60 base::TimeDelta::FromMilliseconds(video_config.rtp_max_delay_ms)), |
61 max_frame_rate_(video_config.max_frame_rate), | 61 max_frame_rate_(video_config.max_frame_rate), |
62 cast_environment_(cast_environment), | 62 cast_environment_(cast_environment), |
63 rtcp_feedback_(new LocalRtcpVideoSenderFeedback(this)), | 63 rtcp_feedback_(new LocalRtcpVideoSenderFeedback(this)), |
64 rtp_sender_(new transport::RtpSender(cast_environment->Clock(), | 64 rtp_sender_(new transport::RtpSender(cast_environment, |
65 NULL, | 65 NULL, |
66 &video_config, | 66 &video_config, |
67 paced_packet_sender)), | 67 paced_packet_sender)), |
68 last_acked_frame_id_(-1), | 68 last_acked_frame_id_(-1), |
69 last_sent_frame_id_(-1), | 69 last_sent_frame_id_(-1), |
70 duplicate_ack_(0), | 70 duplicate_ack_(0), |
71 last_skip_count_(0), | 71 last_skip_count_(0), |
72 congestion_control_(cast_environment->Clock(), | 72 congestion_control_(cast_environment->Clock(), |
73 video_config.congestion_control_back_off, | 73 video_config.congestion_control_back_off, |
74 video_config.max_bitrate, | 74 video_config.max_bitrate, |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
141 cast_environment_->Logging()->InsertFrameEvent(now, kVideoFrameReceived, | 141 cast_environment_->Logging()->InsertFrameEvent(now, kVideoFrameReceived, |
142 GetVideoRtpTimestamp(capture_time), kFrameIdUnknown); | 142 GetVideoRtpTimestamp(capture_time), kFrameIdUnknown); |
143 | 143 |
144 if (!video_encoder_->EncodeVideoFrame(video_frame, capture_time, | 144 if (!video_encoder_->EncodeVideoFrame(video_frame, capture_time, |
145 base::Bind(&VideoSender::SendEncodedVideoFrameMainThread, | 145 base::Bind(&VideoSender::SendEncodedVideoFrameMainThread, |
146 weak_factory_.GetWeakPtr()))) { | 146 weak_factory_.GetWeakPtr()))) { |
147 } | 147 } |
148 } | 148 } |
149 | 149 |
150 void VideoSender::SendEncodedVideoFrameMainThread( | 150 void VideoSender::SendEncodedVideoFrameMainThread( |
151 scoped_ptr<transport::EncodedVideoFrame> video_frame, | 151 scoped_ptr<EncodedVideoFrame> video_frame, |
152 const base::TimeTicks& capture_time) { | 152 const base::TimeTicks& capture_time) { |
153 SendEncodedVideoFrame(video_frame.get(), capture_time); | 153 SendEncodedVideoFrame(video_frame.get(), capture_time); |
154 } | 154 } |
155 | 155 |
156 bool VideoSender::EncryptVideoFrame( | 156 bool VideoSender::EncryptVideoFrame(const EncodedVideoFrame& video_frame, |
157 const transport::EncodedVideoFrame& video_frame, | 157 EncodedVideoFrame* encrypted_frame) { |
158 transport::EncodedVideoFrame* encrypted_frame) { | |
159 DCHECK(encryptor_) << "Invalid state"; | 158 DCHECK(encryptor_) << "Invalid state"; |
160 | 159 |
161 if (!encryptor_->SetCounter(GetAesNonce(video_frame.frame_id, iv_mask_))) { | 160 if (!encryptor_->SetCounter(GetAesNonce(video_frame.frame_id, iv_mask_))) { |
162 NOTREACHED() << "Failed to set counter"; | 161 NOTREACHED() << "Failed to set counter"; |
163 return false; | 162 return false; |
164 } | 163 } |
165 | 164 |
166 if (!encryptor_->Encrypt(video_frame.data, &encrypted_frame->data)) { | 165 if (!encryptor_->Encrypt(video_frame.data, &encrypted_frame->data)) { |
167 NOTREACHED() << "Encrypt error"; | 166 NOTREACHED() << "Encrypt error"; |
168 return false; | 167 return false; |
169 } | 168 } |
170 encrypted_frame->codec = video_frame.codec; | 169 encrypted_frame->codec = video_frame.codec; |
171 encrypted_frame->key_frame = video_frame.key_frame; | 170 encrypted_frame->key_frame = video_frame.key_frame; |
172 encrypted_frame->frame_id = video_frame.frame_id; | 171 encrypted_frame->frame_id = video_frame.frame_id; |
173 encrypted_frame->last_referenced_frame_id = | 172 encrypted_frame->last_referenced_frame_id = |
174 video_frame.last_referenced_frame_id; | 173 video_frame.last_referenced_frame_id; |
175 return true; | 174 return true; |
176 } | 175 } |
177 | 176 |
178 void VideoSender::SendEncodedVideoFrame( | 177 void VideoSender::SendEncodedVideoFrame(const EncodedVideoFrame* encoded_frame, |
179 const transport::EncodedVideoFrame* encoded_frame, | 178 const base::TimeTicks& capture_time) { |
180 const base::TimeTicks& capture_time) { | |
181 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); | 179 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); |
182 last_send_time_ = cast_environment_->Clock()->NowTicks(); | 180 last_send_time_ = cast_environment_->Clock()->NowTicks(); |
183 | 181 |
184 if (encryptor_) { | 182 if (encryptor_) { |
185 transport::EncodedVideoFrame encrypted_video_frame; | 183 EncodedVideoFrame encrypted_video_frame; |
186 | 184 |
187 if (!EncryptVideoFrame(*encoded_frame, &encrypted_video_frame)) { | 185 if (!EncryptVideoFrame(*encoded_frame, &encrypted_video_frame)) { |
188 // Logging already done. | 186 // Logging already done. |
189 return; | 187 return; |
190 } | 188 } |
191 rtp_sender_->IncomingEncodedVideoFrame(&encrypted_video_frame, | 189 rtp_sender_->IncomingEncodedVideoFrame(&encrypted_video_frame, |
192 capture_time); | 190 capture_time); |
193 } else { | 191 } else { |
194 rtp_sender_->IncomingEncodedVideoFrame(encoded_frame, capture_time); | 192 rtp_sender_->IncomingEncodedVideoFrame(encoded_frame, capture_time); |
195 } | 193 } |
(...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
448 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); | 446 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); |
449 MissingFramesAndPacketsMap missing_frames_and_packets; | 447 MissingFramesAndPacketsMap missing_frames_and_packets; |
450 PacketIdSet missing; | 448 PacketIdSet missing; |
451 missing_frames_and_packets.insert(std::make_pair(resend_frame_id, missing)); | 449 missing_frames_and_packets.insert(std::make_pair(resend_frame_id, missing)); |
452 rtp_sender_->ResendPackets(missing_frames_and_packets); | 450 rtp_sender_->ResendPackets(missing_frames_and_packets); |
453 last_send_time_ = cast_environment_->Clock()->NowTicks(); | 451 last_send_time_ = cast_environment_->Clock()->NowTicks(); |
454 } | 452 } |
455 | 453 |
456 } // namespace cast | 454 } // namespace cast |
457 } // namespace media | 455 } // namespace media |
OLD | NEW |