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

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: Fixed nits 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() == kAesBlockSize * 2 &&
115 video_config.aes_key.size() == kAesBlockSize * 2) {
116 iv_mask_ = ConvertFromBase16String(video_config.aes_iv_mask);
117 crypto::SymmetricKey* key = crypto::SymmetricKey::Import(
118 crypto::SymmetricKey::AES,
119 ConvertFromBase16String(video_config.aes_key));
Alpha Left Google 2013/11/07 01:10:11 Again don't do the conversion here.
pwestin 2013/11/07 17:16:04 Done.
120 encryptor_.reset(new crypto::Encryptor());
121 encryptor_->Init(key, crypto::Encryptor::CTR, std::string());
122 } else if (video_config.aes_iv_mask.size() != 0 ||
123 video_config.aes_iv_mask.size() != 0) {
124 DCHECK(false) << "Invalid crypto configuration";
125 }
126
112 rtcp_.reset(new Rtcp( 127 rtcp_.reset(new Rtcp(
113 cast_environment_->Clock(), 128 cast_environment_->Clock(),
114 rtcp_feedback_.get(), 129 rtcp_feedback_.get(),
115 paced_packet_sender, 130 paced_packet_sender,
116 rtp_video_sender_statistics_.get(), 131 rtp_video_sender_statistics_.get(),
117 NULL, 132 NULL,
118 video_config.rtcp_mode, 133 video_config.rtcp_mode,
119 base::TimeDelta::FromMilliseconds(video_config.rtcp_interval), 134 base::TimeDelta::FromMilliseconds(video_config.rtcp_interval),
120 true, 135 true,
121 video_config.sender_ssrc, 136 video_config.sender_ssrc,
(...skipping 14 matching lines...) Expand all
136 DCHECK(video_encoder_.get()) << "Invalid state"; 151 DCHECK(video_encoder_.get()) << "Invalid state";
137 152
138 if (!video_encoder_->EncodeVideoFrame(video_frame, capture_time, 153 if (!video_encoder_->EncodeVideoFrame(video_frame, capture_time,
139 base::Bind(&VideoSender::SendEncodedVideoFrameMainThread, 154 base::Bind(&VideoSender::SendEncodedVideoFrameMainThread,
140 weak_factory_.GetWeakPtr()), callback)) { 155 weak_factory_.GetWeakPtr()), callback)) {
141 VLOG(0) << "Failed to InsertRawVideoFrame"; 156 VLOG(0) << "Failed to InsertRawVideoFrame";
142 cast_environment_->PostTask(CastEnvironment::MAIN, FROM_HERE, callback); 157 cast_environment_->PostTask(CastEnvironment::MAIN, FROM_HERE, callback);
143 } 158 }
144 } 159 }
145 160
146 void VideoSender::InsertCodedVideoFrame(const EncodedVideoFrame* encoded_frame, 161 void VideoSender::InsertCodedVideoFrame(EncodedVideoFrame* encoded_frame,
147 const base::TimeTicks& capture_time, 162 const base::TimeTicks& capture_time,
148 const base::Closure callback) { 163 const base::Closure callback) {
149 DCHECK(!video_encoder_.get()) << "Invalid state"; 164 DCHECK(!video_encoder_.get()) << "Invalid state";
150 DCHECK(encoded_frame) << "Invalid argument"; 165 DCHECK(encoded_frame) << "Invalid argument";
151 166
152 SendEncodedVideoFrame(encoded_frame, capture_time); 167 SendEncodedVideoFrame(encoded_frame, capture_time);
153 cast_environment_->PostTask(CastEnvironment::MAIN, FROM_HERE, callback); 168 cast_environment_->PostTask(CastEnvironment::MAIN, FROM_HERE, callback);
154 } 169 }
155 170
156 void VideoSender::SendEncodedVideoFrameMainThread( 171 void VideoSender::SendEncodedVideoFrameMainThread(
157 scoped_ptr<EncodedVideoFrame> video_frame, 172 scoped_ptr<EncodedVideoFrame> video_frame,
158 const base::TimeTicks& capture_time) { 173 const base::TimeTicks& capture_time) {
159 SendEncodedVideoFrame(video_frame.get(), capture_time); 174 SendEncodedVideoFrame(video_frame.get(), capture_time);
160 } 175 }
161 176
162 void VideoSender::SendEncodedVideoFrame(const EncodedVideoFrame* encoded_frame, 177 bool VideoSender::EncryptVideoFrame(const EncodedVideoFrame* video_frame,
178 EncodedVideoFrame* encrypted_frame) {
179 DCHECK(encryptor_) << "Invalid state";
180
181 encryptor_->SetCounter(GetAesNounce(video_frame->frame_id, iv_mask_));
182
183 encrypted_frame->codec = video_frame->codec;
184 encrypted_frame->key_frame = video_frame->key_frame;
185 encrypted_frame->frame_id = video_frame->frame_id;
186 encrypted_frame->last_referenced_frame_id =
187 video_frame->last_referenced_frame_id;
188
189 return encryptor_->Encrypt(video_frame->data, &encrypted_frame->data);
190 }
191
192 void VideoSender::SendEncodedVideoFrame(EncodedVideoFrame* encoded_frame,
163 const base::TimeTicks& capture_time) { 193 const base::TimeTicks& capture_time) {
164 last_send_time_ = cast_environment_->Clock()->NowTicks(); 194 last_send_time_ = cast_environment_->Clock()->NowTicks();
165 rtp_sender_->IncomingEncodedVideoFrame(encoded_frame, capture_time); 195
196 if (encryptor_) {
197 EncodedVideoFrame encrypted_video_frame;
198
199 if (EncryptVideoFrame(encoded_frame, &encrypted_video_frame)) {
200 rtp_sender_->IncomingEncodedVideoFrame(&encrypted_video_frame,
201 capture_time);
202 } else {
203 DCHECK(false) << "Encryption error";
204 return;
205 }
206 } else {
207 rtp_sender_->IncomingEncodedVideoFrame(encoded_frame, capture_time);
208 }
166 if (encoded_frame->key_frame) { 209 if (encoded_frame->key_frame) {
167 VLOG(1) << "Send encoded key frame; frame_id:" 210 VLOG(1) << "Send encoded key frame; frame_id:"
168 << static_cast<int>(encoded_frame->frame_id); 211 << static_cast<int>(encoded_frame->frame_id);
169 last_sent_key_frame_id_ = encoded_frame->frame_id; 212 last_sent_key_frame_id_ = encoded_frame->frame_id;
170 } 213 }
171 last_sent_frame_id_ = encoded_frame->frame_id; 214 last_sent_frame_id_ = encoded_frame->frame_id;
172 UpdateFramesInFlight(); 215 UpdateFramesInFlight();
173 } 216 }
174 217
175 void VideoSender::OnReceivedIntraFrameRequest() { 218 void VideoSender::OnReceivedIntraFrameRequest() {
(...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after
368 void VideoSender::ResendFrame(uint8 resend_frame_id) { 411 void VideoSender::ResendFrame(uint8 resend_frame_id) {
369 MissingFramesAndPacketsMap missing_frames_and_packets; 412 MissingFramesAndPacketsMap missing_frames_and_packets;
370 PacketIdSet missing; 413 PacketIdSet missing;
371 missing_frames_and_packets.insert(std::make_pair(resend_frame_id, missing)); 414 missing_frames_and_packets.insert(std::make_pair(resend_frame_id, missing));
372 rtp_sender_->ResendPackets(missing_frames_and_packets); 415 rtp_sender_->ResendPackets(missing_frames_and_packets);
373 last_send_time_ = cast_environment_->Clock()->NowTicks(); 416 last_send_time_ = cast_environment_->Clock()->NowTicks();
374 } 417 }
375 418
376 } // namespace cast 419 } // namespace cast
377 } // namespace media 420 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698