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

Side by Side Diff: chrome/renderer/extensions/cast_streaming_native_handler.cc

Issue 121543003: Set AES key and IV mask to CastSender (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 11 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
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 "chrome/renderer/extensions/cast_streaming_native_handler.h" 5 #include "chrome/renderer/extensions/cast_streaming_native_handler.h"
6 6
7 #include <functional> 7 #include <functional>
8 8
9 #include "base/base64.h"
9 #include "base/logging.h" 10 #include "base/logging.h"
10 #include "base/message_loop/message_loop.h" 11 #include "base/message_loop/message_loop.h"
11 #include "chrome/common/extensions/api/cast_streaming_rtp_stream.h" 12 #include "chrome/common/extensions/api/cast_streaming_rtp_stream.h"
12 #include "chrome/common/extensions/api/cast_streaming_udp_transport.h" 13 #include "chrome/common/extensions/api/cast_streaming_udp_transport.h"
13 #include "chrome/renderer/extensions/chrome_v8_context.h" 14 #include "chrome/renderer/extensions/chrome_v8_context.h"
14 #include "chrome/renderer/media/cast_rtp_stream.h" 15 #include "chrome/renderer/media/cast_rtp_stream.h"
15 #include "chrome/renderer/media/cast_session.h" 16 #include "chrome/renderer/media/cast_session.h"
16 #include "chrome/renderer/media/cast_udp_transport.h" 17 #include "chrome/renderer/media/cast_udp_transport.h"
17 #include "content/public/renderer/v8_value_converter.h" 18 #include "content/public/renderer/v8_value_converter.h"
18 #include "net/base/host_port_pair.h" 19 #include "net/base/host_port_pair.h"
19 #include "third_party/WebKit/public/platform/WebMediaStreamTrack.h" 20 #include "third_party/WebKit/public/platform/WebMediaStreamTrack.h"
20 #include "third_party/WebKit/public/web/WebDOMMediaStreamTrack.h" 21 #include "third_party/WebKit/public/web/WebDOMMediaStreamTrack.h"
21 22
22 using content::V8ValueConverter; 23 using content::V8ValueConverter;
23 24
24 // Extension types. 25 // Extension types.
25 using extensions::api::cast_streaming_rtp_stream::CodecSpecificParams; 26 using extensions::api::cast_streaming_rtp_stream::CodecSpecificParams;
26 using extensions::api::cast_streaming_rtp_stream::RtpCaps; 27 using extensions::api::cast_streaming_rtp_stream::RtpCaps;
27 using extensions::api::cast_streaming_rtp_stream::RtpParams; 28 using extensions::api::cast_streaming_rtp_stream::RtpParams;
28 using extensions::api::cast_streaming_rtp_stream::RtpPayloadParams; 29 using extensions::api::cast_streaming_rtp_stream::RtpPayloadParams;
29 using extensions::api::cast_streaming_udp_transport::UdpParams; 30 using extensions::api::cast_streaming_udp_transport::UdpParams;
30 31
31 namespace extensions { 32 namespace extensions {
32 33
33 namespace { 34 namespace {
34 const char kRtpStreamNotFound[] = "The RTP stream cannot be found"; 35 const char kRtpStreamNotFound[] = "The RTP stream cannot be found";
35 const char kUdpTransportNotFound[] = "The UDP transport cannot be found"; 36 const char kUdpTransportNotFound[] = "The UDP transport cannot be found";
36 const char kInvalidUdpParams[] = "Invalid UDP params"; 37 const char kInvalidUdpParams[] = "Invalid UDP params";
37 const char kInvalidRtpParams[] = "Invalid value for RTP params"; 38 const char kInvalidRtpParams[] = "Invalid value for RTP params";
39 const char kInvalidAesKey[] = "Invalid value for AES key";
40 const char kInvalidAesIvMask[] = "Invalid value for AES IV mask";
38 const char kUnableToConvertArgs[] = "Unable to convert arguments"; 41 const char kUnableToConvertArgs[] = "Unable to convert arguments";
39 const char kUnableToConvertParams[] = "Unable to convert params"; 42 const char kUnableToConvertParams[] = "Unable to convert params";
40 43
41 // These helper methods are used to convert between Extension API 44 // These helper methods are used to convert between Extension API
42 // types and Cast types. 45 // types and Cast types.
43 void ToCastCodecSpecificParams(const CodecSpecificParams& ext_params, 46 void ToCastCodecSpecificParams(const CodecSpecificParams& ext_params,
44 CastCodecSpecificParams* cast_params) { 47 CastCodecSpecificParams* cast_params) {
45 cast_params->key = ext_params.key; 48 cast_params->key = ext_params.key;
46 cast_params->value = ext_params.value; 49 cast_params->value = ext_params.value;
47 } 50 }
48 51
49 void FromCastCodecSpecificParams(const CastCodecSpecificParams& cast_params, 52 void FromCastCodecSpecificParams(const CastCodecSpecificParams& cast_params,
50 CodecSpecificParams* ext_params) { 53 CodecSpecificParams* ext_params) {
51 ext_params->key = cast_params.key; 54 ext_params->key = cast_params.key;
52 ext_params->value = cast_params.value; 55 ext_params->value = cast_params.value;
53 } 56 }
54 57
55 void ToCastRtpPayloadParams(const RtpPayloadParams& ext_params, 58 bool ToCastRtpPayloadParamsOrThrow(v8::Isolate* isolate,
56 CastRtpPayloadParams* cast_params) { 59 const RtpPayloadParams& ext_params,
60 CastRtpPayloadParams* cast_params) {
57 cast_params->payload_type = ext_params.payload_type; 61 cast_params->payload_type = ext_params.payload_type;
58 cast_params->codec_name = ext_params.codec_name; 62 cast_params->codec_name = ext_params.codec_name;
59 cast_params->ssrc = ext_params.ssrc ? *ext_params.ssrc : 0; 63 cast_params->ssrc = ext_params.ssrc ? *ext_params.ssrc : 0;
60 cast_params->feedback_ssrc = 64 cast_params->feedback_ssrc =
61 ext_params.feedback_ssrc ? *ext_params.feedback_ssrc : 0; 65 ext_params.feedback_ssrc ? *ext_params.feedback_ssrc : 0;
62 cast_params->clock_rate = ext_params.clock_rate ? *ext_params.clock_rate : 0; 66 cast_params->clock_rate = ext_params.clock_rate ? *ext_params.clock_rate : 0;
63 cast_params->min_bitrate = 67 cast_params->min_bitrate =
64 ext_params.min_bitrate ? *ext_params.min_bitrate : 0; 68 ext_params.min_bitrate ? *ext_params.min_bitrate : 0;
65 cast_params->max_bitrate = 69 cast_params->max_bitrate =
66 ext_params.max_bitrate ? *ext_params.max_bitrate : 0; 70 ext_params.max_bitrate ? *ext_params.max_bitrate : 0;
67 cast_params->channels = ext_params.channels ? *ext_params.channels : 0; 71 cast_params->channels = ext_params.channels ? *ext_params.channels : 0;
68 cast_params->width = ext_params.width ? *ext_params.width : 0; 72 cast_params->width = ext_params.width ? *ext_params.width : 0;
69 cast_params->height = ext_params.height ? *ext_params.height : 0; 73 cast_params->height = ext_params.height ? *ext_params.height : 0;
74 if (ext_params.aes_key &&
75 !base::Base64Decode(*ext_params.aes_key, &cast_params->aes_key)) {
76 isolate->ThrowException(v8::Exception::Error(
77 v8::String::NewFromUtf8(isolate, kInvalidAesKey)));
78 return false;
79 }
80 if (ext_params.aes_iv_mask &&
81 !base::Base64Decode(*ext_params.aes_iv_mask,
82 &cast_params->aes_iv_mask)) {
83 isolate->ThrowException(v8::Exception::Error(
84 v8::String::NewFromUtf8(isolate, kInvalidAesIvMask)));
85 return false;
86 }
70 for (size_t i = 0; i < ext_params.codec_specific_params.size(); ++i) { 87 for (size_t i = 0; i < ext_params.codec_specific_params.size(); ++i) {
71 CastCodecSpecificParams cast_codec_params; 88 CastCodecSpecificParams cast_codec_params;
72 ToCastCodecSpecificParams(*ext_params.codec_specific_params[i], 89 ToCastCodecSpecificParams(*ext_params.codec_specific_params[i],
73 &cast_codec_params); 90 &cast_codec_params);
74 cast_params->codec_specific_params.push_back(cast_codec_params); 91 cast_params->codec_specific_params.push_back(cast_codec_params);
75 } 92 }
93 return true;
76 } 94 }
77 95
78 void FromCastRtpPayloadParams(const CastRtpPayloadParams& cast_params, 96 void FromCastRtpPayloadParams(const CastRtpPayloadParams& cast_params,
79 RtpPayloadParams* ext_params) { 97 RtpPayloadParams* ext_params) {
80 ext_params->payload_type = cast_params.payload_type; 98 ext_params->payload_type = cast_params.payload_type;
81 ext_params->codec_name = cast_params.codec_name; 99 ext_params->codec_name = cast_params.codec_name;
82 if (cast_params.ssrc) 100 if (cast_params.ssrc)
83 ext_params->ssrc.reset(new int(cast_params.ssrc)); 101 ext_params->ssrc.reset(new int(cast_params.ssrc));
84 if (cast_params.feedback_ssrc) 102 if (cast_params.feedback_ssrc)
85 ext_params->feedback_ssrc.reset(new int(cast_params.feedback_ssrc)); 103 ext_params->feedback_ssrc.reset(new int(cast_params.feedback_ssrc));
(...skipping 21 matching lines...) Expand all
107 void FromCastRtpCaps(const CastRtpCaps& cast_caps, RtpCaps* ext_caps) { 125 void FromCastRtpCaps(const CastRtpCaps& cast_caps, RtpCaps* ext_caps) {
108 std::copy(cast_caps.rtcp_features.begin(), cast_caps.rtcp_features.end(), 126 std::copy(cast_caps.rtcp_features.begin(), cast_caps.rtcp_features.end(),
109 ext_caps->rtcp_features.begin()); 127 ext_caps->rtcp_features.begin());
110 for (size_t i = 0; i < cast_caps.payloads.size(); ++i) { 128 for (size_t i = 0; i < cast_caps.payloads.size(); ++i) {
111 linked_ptr<RtpPayloadParams> ext_payload_params(new RtpPayloadParams()); 129 linked_ptr<RtpPayloadParams> ext_payload_params(new RtpPayloadParams());
112 FromCastRtpPayloadParams(cast_caps.payloads[i], ext_payload_params.get()); 130 FromCastRtpPayloadParams(cast_caps.payloads[i], ext_payload_params.get());
113 ext_caps->payloads.push_back(ext_payload_params); 131 ext_caps->payloads.push_back(ext_payload_params);
114 } 132 }
115 } 133 }
116 134
117 void ToCastRtpParams(const RtpParams& ext_params, CastRtpParams* cast_params) { 135 bool ToCastRtpParamsOrThrow(v8::Isolate* isolate,
136 const RtpParams& ext_params,
137 CastRtpParams* cast_params) {
118 std::copy(ext_params.rtcp_features.begin(), ext_params.rtcp_features.end(), 138 std::copy(ext_params.rtcp_features.begin(), ext_params.rtcp_features.end(),
119 cast_params->rtcp_features.begin()); 139 cast_params->rtcp_features.begin());
120 for (size_t i = 0; i < ext_params.payloads.size(); ++i) { 140 for (size_t i = 0; i < ext_params.payloads.size(); ++i) {
121 CastRtpPayloadParams cast_payload_params; 141 CastRtpPayloadParams cast_payload_params;
122 ToCastRtpPayloadParams(*ext_params.payloads[i], &cast_payload_params); 142 if (!ToCastRtpPayloadParamsOrThrow(isolate,
143 *ext_params.payloads[i],
144 &cast_payload_params)) {
145 return false;
146 }
123 cast_params->payloads.push_back(cast_payload_params); 147 cast_params->payloads.push_back(cast_payload_params);
124 } 148 }
149 return true;
125 } 150 }
126 151
127 } // namespace 152 } // namespace
128 153
129 CastStreamingNativeHandler::CastStreamingNativeHandler(ChromeV8Context* context) 154 CastStreamingNativeHandler::CastStreamingNativeHandler(ChromeV8Context* context)
130 : ObjectBackedNativeHandler(context), 155 : ObjectBackedNativeHandler(context),
131 last_transport_id_(0), 156 last_transport_id_(0),
132 weak_factory_(this) { 157 weak_factory_(this) {
133 RouteFunction("CreateSession", 158 RouteFunction("CreateSession",
134 base::Bind(&CastStreamingNativeHandler::CreateCastSession, 159 base::Bind(&CastStreamingNativeHandler::CreateCastSession,
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
270 return; 295 return;
271 } 296 }
272 scoped_ptr<RtpParams> params = RtpParams::FromValue(*params_value); 297 scoped_ptr<RtpParams> params = RtpParams::FromValue(*params_value);
273 if (!params) { 298 if (!params) {
274 args.GetIsolate()->ThrowException(v8::Exception::TypeError( 299 args.GetIsolate()->ThrowException(v8::Exception::TypeError(
275 v8::String::NewFromUtf8(args.GetIsolate(), kInvalidRtpParams))); 300 v8::String::NewFromUtf8(args.GetIsolate(), kInvalidRtpParams)));
276 return; 301 return;
277 } 302 }
278 303
279 CastRtpCaps cast_params; 304 CastRtpCaps cast_params;
280 ToCastRtpParams(*params, &cast_params); 305 v8::Isolate* isolate = context()->v8_context()->GetIsolate();
306 if (!ToCastRtpParamsOrThrow(isolate, *params, &cast_params))
307 return;
281 transport->Start(cast_params); 308 transport->Start(cast_params);
282 } 309 }
283 310
284 void CastStreamingNativeHandler::StopCastRtpStream( 311 void CastStreamingNativeHandler::StopCastRtpStream(
285 const v8::FunctionCallbackInfo<v8::Value>& args) { 312 const v8::FunctionCallbackInfo<v8::Value>& args) {
286 CHECK_EQ(1, args.Length()); 313 CHECK_EQ(1, args.Length());
287 CHECK(args[0]->IsInt32()); 314 CHECK(args[0]->IsInt32());
288 315
289 const int transport_id = args[0]->ToInt32()->Value(); 316 const int transport_id = args[0]->ToInt32()->Value();
290 CastRtpStream* transport = GetRtpStreamOrThrow(transport_id); 317 CastRtpStream* transport = GetRtpStreamOrThrow(transport_id);
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
356 transport_id); 383 transport_id);
357 if (iter != udp_transport_map_.end()) 384 if (iter != udp_transport_map_.end())
358 return iter->second.get(); 385 return iter->second.get();
359 v8::Isolate* isolate = context()->v8_context()->GetIsolate(); 386 v8::Isolate* isolate = context()->v8_context()->GetIsolate();
360 isolate->ThrowException(v8::Exception::RangeError( 387 isolate->ThrowException(v8::Exception::RangeError(
361 v8::String::NewFromUtf8(isolate, kUdpTransportNotFound))); 388 v8::String::NewFromUtf8(isolate, kUdpTransportNotFound)));
362 return NULL; 389 return NULL;
363 } 390 }
364 391
365 } // namespace extensions 392 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698