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

Side by Side Diff: media/cast/video_sender/video_sender.cc

Issue 62843002: Cast: Added support for AES-CTR crypto. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addressed comments Created 7 years, 1 month 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
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"
11 #include "base/message_loop/message_loop.h" 11 #include "base/message_loop/message_loop.h"
12 #include "crypto/symmetric_key.h"
12 #include "media/cast/cast_defines.h" 13 #include "media/cast/cast_defines.h"
13 #include "media/cast/pacing/paced_sender.h" 14 #include "media/cast/pacing/paced_sender.h"
14 #include "media/cast/video_sender/video_encoder.h" 15 #include "media/cast/video_sender/video_encoder.h"
15 16
16 namespace media { 17 namespace media {
17 namespace cast { 18 namespace cast {
18 19
19 const int64 kMinSchedulingDelayMs = 1; 20 const int64 kMinSchedulingDelayMs = 1;
20 21
21 class LocalRtcpVideoSenderFeedback : public RtcpSenderFeedback { 22 class LocalRtcpVideoSenderFeedback : public RtcpSenderFeedback {
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
102 new LocalRtpVideoSenderStatistics(rtp_sender_.get())); 103 new LocalRtpVideoSenderStatistics(rtp_sender_.get()));
103 104
104 if (video_config.use_external_encoder) { 105 if (video_config.use_external_encoder) {
105 DCHECK(video_encoder_controller) << "Invalid argument"; 106 DCHECK(video_encoder_controller) << "Invalid argument";
106 video_encoder_controller_ = video_encoder_controller; 107 video_encoder_controller_ = video_encoder_controller;
107 } else { 108 } else {
108 video_encoder_ = new VideoEncoder(cast_environment, video_config, 109 video_encoder_ = new VideoEncoder(cast_environment, video_config,
109 max_unacked_frames_); 110 max_unacked_frames_);
110 video_encoder_controller_ = video_encoder_.get(); 111 video_encoder_controller_ = video_encoder_.get();
111 } 112 }
113
114 if (video_config.aes_iv_mask.size() == kAesKeySize &&
115 video_config.aes_key.size() == kAesKeySize) {
116 iv_mask_ = video_config.aes_iv_mask;
117 crypto::SymmetricKey* key = crypto::SymmetricKey::Import(
118 crypto::SymmetricKey::AES, video_config.aes_key);
119 encryptor_.reset(new crypto::Encryptor());
120 encryptor_->Init(key, crypto::Encryptor::CTR, std::string());
121 } else if (video_config.aes_iv_mask.size() != 0 ||
122 video_config.aes_key.size() != 0) {
123 DCHECK(false) << "Invalid crypto configuration";
124 }
125
112 rtcp_.reset(new Rtcp( 126 rtcp_.reset(new Rtcp(
113 cast_environment_->Clock(), 127 cast_environment_->Clock(),
114 rtcp_feedback_.get(), 128 rtcp_feedback_.get(),
115 paced_packet_sender, 129 paced_packet_sender,
116 rtp_video_sender_statistics_.get(), 130 rtp_video_sender_statistics_.get(),
117 NULL, 131 NULL,
118 video_config.rtcp_mode, 132 video_config.rtcp_mode,
119 base::TimeDelta::FromMilliseconds(video_config.rtcp_interval), 133 base::TimeDelta::FromMilliseconds(video_config.rtcp_interval),
120 true, 134 true,
121 video_config.sender_ssrc, 135 video_config.sender_ssrc,
(...skipping 30 matching lines...) Expand all
152 SendEncodedVideoFrame(encoded_frame, capture_time); 166 SendEncodedVideoFrame(encoded_frame, capture_time);
153 cast_environment_->PostTask(CastEnvironment::MAIN, FROM_HERE, callback); 167 cast_environment_->PostTask(CastEnvironment::MAIN, FROM_HERE, callback);
154 } 168 }
155 169
156 void VideoSender::SendEncodedVideoFrameMainThread( 170 void VideoSender::SendEncodedVideoFrameMainThread(
157 scoped_ptr<EncodedVideoFrame> video_frame, 171 scoped_ptr<EncodedVideoFrame> video_frame,
158 const base::TimeTicks& capture_time) { 172 const base::TimeTicks& capture_time) {
159 SendEncodedVideoFrame(video_frame.get(), capture_time); 173 SendEncodedVideoFrame(video_frame.get(), capture_time);
160 } 174 }
161 175
176 bool VideoSender::EncryptVideoFrame(const EncodedVideoFrame* video_frame,
177 EncodedVideoFrame* encrypted_frame) {
178 DCHECK(encryptor_) << "Invalid state";
179
180 encryptor_->SetCounter(GetAesNounce(video_frame->frame_id, iv_mask_));
181
182 encrypted_frame->codec = video_frame->codec;
183 encrypted_frame->key_frame = video_frame->key_frame;
184 encrypted_frame->frame_id = video_frame->frame_id;
185 encrypted_frame->last_referenced_frame_id =
186 video_frame->last_referenced_frame_id;
187
188 return encryptor_->Encrypt(video_frame->data, &encrypted_frame->data);
189 }
190
162 void VideoSender::SendEncodedVideoFrame(const EncodedVideoFrame* encoded_frame, 191 void VideoSender::SendEncodedVideoFrame(const EncodedVideoFrame* encoded_frame,
163 const base::TimeTicks& capture_time) { 192 const base::TimeTicks& capture_time) {
164 last_send_time_ = cast_environment_->Clock()->NowTicks(); 193 last_send_time_ = cast_environment_->Clock()->NowTicks();
165 rtp_sender_->IncomingEncodedVideoFrame(encoded_frame, capture_time); 194
195 if (encryptor_) {
196 EncodedVideoFrame encrypted_video_frame;
197
198 if (EncryptVideoFrame(encoded_frame, &encrypted_video_frame)) {
199 rtp_sender_->IncomingEncodedVideoFrame(&encrypted_video_frame,
200 capture_time);
201 } else {
202 DCHECK(false) << "Encryption error";
203 return;
204 }
205 } else {
206 rtp_sender_->IncomingEncodedVideoFrame(encoded_frame, capture_time);
207 }
166 if (encoded_frame->key_frame) { 208 if (encoded_frame->key_frame) {
167 VLOG(1) << "Send encoded key frame; frame_id:" 209 VLOG(1) << "Send encoded key frame; frame_id:"
168 << static_cast<int>(encoded_frame->frame_id); 210 << static_cast<int>(encoded_frame->frame_id);
169 last_sent_key_frame_id_ = encoded_frame->frame_id; 211 last_sent_key_frame_id_ = encoded_frame->frame_id;
170 } 212 }
171 last_sent_frame_id_ = encoded_frame->frame_id; 213 last_sent_frame_id_ = encoded_frame->frame_id;
172 UpdateFramesInFlight(); 214 UpdateFramesInFlight();
173 } 215 }
174 216
175 void VideoSender::OnReceivedIntraFrameRequest() { 217 void VideoSender::OnReceivedIntraFrameRequest() {
(...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after
368 void VideoSender::ResendFrame(uint8 resend_frame_id) { 410 void VideoSender::ResendFrame(uint8 resend_frame_id) {
369 MissingFramesAndPacketsMap missing_frames_and_packets; 411 MissingFramesAndPacketsMap missing_frames_and_packets;
370 PacketIdSet missing; 412 PacketIdSet missing;
371 missing_frames_and_packets.insert(std::make_pair(resend_frame_id, missing)); 413 missing_frames_and_packets.insert(std::make_pair(resend_frame_id, missing));
372 rtp_sender_->ResendPackets(missing_frames_and_packets); 414 rtp_sender_->ResendPackets(missing_frames_and_packets);
373 last_send_time_ = cast_environment_->Clock()->NowTicks(); 415 last_send_time_ = cast_environment_->Clock()->NowTicks();
374 } 416 }
375 417
376 } // namespace cast 418 } // namespace cast
377 } // namespace media 419 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698