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 "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 #include <iterator> | 8 #include <iterator> |
9 | 9 |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
(...skipping 259 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
270 } | 270 } |
271 | 271 |
272 void CastStreamingNativeHandler::CallCreateCallback( | 272 void CastStreamingNativeHandler::CallCreateCallback( |
273 scoped_ptr<CastRtpStream> stream1, | 273 scoped_ptr<CastRtpStream> stream1, |
274 scoped_ptr<CastRtpStream> stream2, | 274 scoped_ptr<CastRtpStream> stream2, |
275 scoped_ptr<CastUdpTransport> udp_transport) { | 275 scoped_ptr<CastUdpTransport> udp_transport) { |
276 v8::Isolate* isolate = context()->isolate(); | 276 v8::Isolate* isolate = context()->isolate(); |
277 v8::HandleScope handle_scope(isolate); | 277 v8::HandleScope handle_scope(isolate); |
278 v8::Context::Scope context_scope(context()->v8_context()); | 278 v8::Context::Scope context_scope(context()->v8_context()); |
279 | 279 |
280 v8::Handle<v8::Value> callback_args[3]; | 280 v8::Local<v8::Value> callback_args[3]; |
281 callback_args[0] = v8::Null(isolate); | 281 callback_args[0] = v8::Null(isolate); |
282 callback_args[1] = v8::Null(isolate); | 282 callback_args[1] = v8::Null(isolate); |
283 | 283 |
284 if (stream1) { | 284 if (stream1) { |
285 const int stream1_id = last_transport_id_++; | 285 const int stream1_id = last_transport_id_++; |
286 callback_args[0] = v8::Integer::New(isolate, stream1_id); | 286 callback_args[0] = v8::Integer::New(isolate, stream1_id); |
287 rtp_stream_map_[stream1_id] = | 287 rtp_stream_map_[stream1_id] = |
288 linked_ptr<CastRtpStream>(stream1.release()); | 288 linked_ptr<CastRtpStream>(stream1.release()); |
289 } | 289 } |
290 if (stream2) { | 290 if (stream2) { |
291 const int stream2_id = last_transport_id_++; | 291 const int stream2_id = last_transport_id_++; |
292 callback_args[1] = v8::Integer::New(isolate, stream2_id); | 292 callback_args[1] = v8::Integer::New(isolate, stream2_id); |
293 rtp_stream_map_[stream2_id] = | 293 rtp_stream_map_[stream2_id] = |
294 linked_ptr<CastRtpStream>(stream2.release()); | 294 linked_ptr<CastRtpStream>(stream2.release()); |
295 } | 295 } |
296 const int udp_id = last_transport_id_++; | 296 const int udp_id = last_transport_id_++; |
297 udp_transport_map_[udp_id] = | 297 udp_transport_map_[udp_id] = |
298 linked_ptr<CastUdpTransport>(udp_transport.release()); | 298 linked_ptr<CastUdpTransport>(udp_transport.release()); |
299 callback_args[2] = v8::Integer::New(isolate, udp_id); | 299 callback_args[2] = v8::Integer::New(isolate, udp_id); |
300 context()->CallFunction( | 300 context()->CallFunction( |
301 v8::Local<v8::Function>::New(isolate, create_callback_), 3, | 301 v8::Local<v8::Function>::New(isolate, create_callback_), 3, |
302 callback_args); | 302 callback_args); |
303 create_callback_.Reset(); | 303 create_callback_.Reset(); |
304 } | 304 } |
305 | 305 |
306 void CastStreamingNativeHandler::CallStartCallback(int stream_id) { | 306 void CastStreamingNativeHandler::CallStartCallback(int stream_id) { |
307 v8::Isolate* isolate = context()->isolate(); | 307 v8::Isolate* isolate = context()->isolate(); |
308 v8::HandleScope handle_scope(isolate); | 308 v8::HandleScope handle_scope(isolate); |
309 v8::Context::Scope context_scope(context()->v8_context()); | 309 v8::Context::Scope context_scope(context()->v8_context()); |
310 v8::Handle<v8::Array> event_args = v8::Array::New(isolate, 1); | 310 v8::Local<v8::Array> event_args = v8::Array::New(isolate, 1); |
311 event_args->Set(0, v8::Integer::New(isolate, stream_id)); | 311 event_args->Set(0, v8::Integer::New(isolate, stream_id)); |
312 context()->DispatchEvent("cast.streaming.rtpStream.onStarted", event_args); | 312 context()->DispatchEvent("cast.streaming.rtpStream.onStarted", event_args); |
313 } | 313 } |
314 | 314 |
315 void CastStreamingNativeHandler::CallStopCallback(int stream_id) { | 315 void CastStreamingNativeHandler::CallStopCallback(int stream_id) { |
316 v8::Isolate* isolate = context()->isolate(); | 316 v8::Isolate* isolate = context()->isolate(); |
317 v8::HandleScope handle_scope(isolate); | 317 v8::HandleScope handle_scope(isolate); |
318 v8::Context::Scope context_scope(context()->v8_context()); | 318 v8::Context::Scope context_scope(context()->v8_context()); |
319 v8::Handle<v8::Array> event_args = v8::Array::New(isolate, 1); | 319 v8::Local<v8::Array> event_args = v8::Array::New(isolate, 1); |
320 event_args->Set(0, v8::Integer::New(isolate, stream_id)); | 320 event_args->Set(0, v8::Integer::New(isolate, stream_id)); |
321 context()->DispatchEvent("cast.streaming.rtpStream.onStopped", event_args); | 321 context()->DispatchEvent("cast.streaming.rtpStream.onStopped", event_args); |
322 } | 322 } |
323 | 323 |
324 void CastStreamingNativeHandler::CallErrorCallback(int stream_id, | 324 void CastStreamingNativeHandler::CallErrorCallback(int stream_id, |
325 const std::string& message) { | 325 const std::string& message) { |
326 v8::Isolate* isolate = context()->isolate(); | 326 v8::Isolate* isolate = context()->isolate(); |
327 v8::HandleScope handle_scope(isolate); | 327 v8::HandleScope handle_scope(isolate); |
328 v8::Context::Scope context_scope(context()->v8_context()); | 328 v8::Context::Scope context_scope(context()->v8_context()); |
329 v8::Handle<v8::Array> event_args = v8::Array::New(isolate, 2); | 329 v8::Local<v8::Array> event_args = v8::Array::New(isolate, 2); |
330 event_args->Set(0, v8::Integer::New(isolate, stream_id)); | 330 event_args->Set(0, v8::Integer::New(isolate, stream_id)); |
331 event_args->Set( | 331 event_args->Set( |
332 1, | 332 1, |
333 v8::String::NewFromUtf8( | 333 v8::String::NewFromUtf8( |
334 isolate, message.data(), v8::String::kNormalString, message.size())); | 334 isolate, message.data(), v8::String::kNormalString, message.size())); |
335 context()->DispatchEvent("cast.streaming.rtpStream.onError", event_args); | 335 context()->DispatchEvent("cast.streaming.rtpStream.onError", event_args); |
336 } | 336 } |
337 | 337 |
338 void CastStreamingNativeHandler::DestroyCastRtpStream( | 338 void CastStreamingNativeHandler::DestroyCastRtpStream( |
339 const v8::FunctionCallbackInfo<v8::Value>& args) { | 339 const v8::FunctionCallbackInfo<v8::Value>& args) { |
(...skipping 11 matching lines...) Expand all Loading... |
351 CHECK_EQ(1, args.Length()); | 351 CHECK_EQ(1, args.Length()); |
352 CHECK(args[0]->IsInt32()); | 352 CHECK(args[0]->IsInt32()); |
353 | 353 |
354 const int transport_id = args[0]->ToInt32(args.GetIsolate())->Value(); | 354 const int transport_id = args[0]->ToInt32(args.GetIsolate())->Value(); |
355 CastRtpStream* transport = GetRtpStreamOrThrow(transport_id); | 355 CastRtpStream* transport = GetRtpStreamOrThrow(transport_id); |
356 if (!transport) | 356 if (!transport) |
357 return; | 357 return; |
358 | 358 |
359 scoped_ptr<V8ValueConverter> converter(V8ValueConverter::create()); | 359 scoped_ptr<V8ValueConverter> converter(V8ValueConverter::create()); |
360 std::vector<CastRtpParams> cast_params = transport->GetSupportedParams(); | 360 std::vector<CastRtpParams> cast_params = transport->GetSupportedParams(); |
361 v8::Handle<v8::Array> result = | 361 v8::Local<v8::Array> result = |
362 v8::Array::New(args.GetIsolate(), | 362 v8::Array::New(args.GetIsolate(), |
363 static_cast<int>(cast_params.size())); | 363 static_cast<int>(cast_params.size())); |
364 for (size_t i = 0; i < cast_params.size(); ++i) { | 364 for (size_t i = 0; i < cast_params.size(); ++i) { |
365 RtpParams params; | 365 RtpParams params; |
366 FromCastRtpParams(cast_params[i], ¶ms); | 366 FromCastRtpParams(cast_params[i], ¶ms); |
367 scoped_ptr<base::DictionaryValue> params_value = params.ToValue(); | 367 scoped_ptr<base::DictionaryValue> params_value = params.ToValue(); |
368 result->Set( | 368 result->Set( |
369 static_cast<int>(i), | 369 static_cast<int>(i), |
370 converter->ToV8Value(params_value.get(), context()->v8_context())); | 370 converter->ToV8Value(params_value.get(), context()->v8_context())); |
371 } | 371 } |
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
561 scoped_ptr<base::BinaryValue> raw_events) { | 561 scoped_ptr<base::BinaryValue> raw_events) { |
562 v8::Isolate* isolate = context()->isolate(); | 562 v8::Isolate* isolate = context()->isolate(); |
563 v8::HandleScope handle_scope(isolate); | 563 v8::HandleScope handle_scope(isolate); |
564 v8::Context::Scope context_scope(context()->v8_context()); | 564 v8::Context::Scope context_scope(context()->v8_context()); |
565 | 565 |
566 RtpStreamCallbackMap::iterator it = | 566 RtpStreamCallbackMap::iterator it = |
567 get_raw_events_callbacks_.find(transport_id); | 567 get_raw_events_callbacks_.find(transport_id); |
568 if (it == get_raw_events_callbacks_.end()) | 568 if (it == get_raw_events_callbacks_.end()) |
569 return; | 569 return; |
570 scoped_ptr<V8ValueConverter> converter(V8ValueConverter::create()); | 570 scoped_ptr<V8ValueConverter> converter(V8ValueConverter::create()); |
571 v8::Handle<v8::Value> callback_args[] = { | 571 v8::Local<v8::Value> callback_args[] = { |
572 converter->ToV8Value(raw_events.get(), context()->v8_context())}; | 572 converter->ToV8Value(raw_events.get(), context()->v8_context())}; |
573 context()->CallFunction(v8::Local<v8::Function>::New(isolate, *it->second), | 573 context()->CallFunction(v8::Local<v8::Function>::New(isolate, *it->second), |
574 arraysize(callback_args), callback_args); | 574 arraysize(callback_args), callback_args); |
575 get_raw_events_callbacks_.erase(it); | 575 get_raw_events_callbacks_.erase(it); |
576 } | 576 } |
577 | 577 |
578 void CastStreamingNativeHandler::CallGetStatsCallback( | 578 void CastStreamingNativeHandler::CallGetStatsCallback( |
579 int transport_id, | 579 int transport_id, |
580 scoped_ptr<base::DictionaryValue> stats) { | 580 scoped_ptr<base::DictionaryValue> stats) { |
581 v8::Isolate* isolate = context()->isolate(); | 581 v8::Isolate* isolate = context()->isolate(); |
582 v8::HandleScope handle_scope(isolate); | 582 v8::HandleScope handle_scope(isolate); |
583 v8::Context::Scope context_scope(context()->v8_context()); | 583 v8::Context::Scope context_scope(context()->v8_context()); |
584 | 584 |
585 RtpStreamCallbackMap::iterator it = get_stats_callbacks_.find(transport_id); | 585 RtpStreamCallbackMap::iterator it = get_stats_callbacks_.find(transport_id); |
586 if (it == get_stats_callbacks_.end()) | 586 if (it == get_stats_callbacks_.end()) |
587 return; | 587 return; |
588 | 588 |
589 scoped_ptr<V8ValueConverter> converter(V8ValueConverter::create()); | 589 scoped_ptr<V8ValueConverter> converter(V8ValueConverter::create()); |
590 v8::Handle<v8::Value> callback_args[] = { | 590 v8::Local<v8::Value> callback_args[] = { |
591 converter->ToV8Value(stats.get(), context()->v8_context())}; | 591 converter->ToV8Value(stats.get(), context()->v8_context())}; |
592 context()->CallFunction(v8::Local<v8::Function>::New(isolate, *it->second), | 592 context()->CallFunction(v8::Local<v8::Function>::New(isolate, *it->second), |
593 arraysize(callback_args), callback_args); | 593 arraysize(callback_args), callback_args); |
594 get_stats_callbacks_.erase(it); | 594 get_stats_callbacks_.erase(it); |
595 } | 595 } |
596 | 596 |
597 CastRtpStream* CastStreamingNativeHandler::GetRtpStreamOrThrow( | 597 CastRtpStream* CastStreamingNativeHandler::GetRtpStreamOrThrow( |
598 int transport_id) const { | 598 int transport_id) const { |
599 RtpStreamMap::const_iterator iter = rtp_stream_map_.find( | 599 RtpStreamMap::const_iterator iter = rtp_stream_map_.find( |
600 transport_id); | 600 transport_id); |
(...skipping 12 matching lines...) Expand all Loading... |
613 if (iter != udp_transport_map_.end()) | 613 if (iter != udp_transport_map_.end()) |
614 return iter->second.get(); | 614 return iter->second.get(); |
615 v8::Isolate* isolate = context()->v8_context()->GetIsolate(); | 615 v8::Isolate* isolate = context()->v8_context()->GetIsolate(); |
616 isolate->ThrowException(v8::Exception::RangeError( | 616 isolate->ThrowException(v8::Exception::RangeError( |
617 v8::String::NewFromUtf8(isolate, kUdpTransportNotFound))); | 617 v8::String::NewFromUtf8(isolate, kUdpTransportNotFound))); |
618 return NULL; | 618 return NULL; |
619 } | 619 } |
620 | 620 |
621 bool CastStreamingNativeHandler::FrameReceiverConfigFromArg( | 621 bool CastStreamingNativeHandler::FrameReceiverConfigFromArg( |
622 v8::Isolate* isolate, | 622 v8::Isolate* isolate, |
623 const v8::Handle<v8::Value>& arg, | 623 const v8::Local<v8::Value>& arg, |
624 media::cast::FrameReceiverConfig* config) { | 624 media::cast::FrameReceiverConfig* config) { |
625 | 625 |
626 scoped_ptr<V8ValueConverter> converter(V8ValueConverter::create()); | 626 scoped_ptr<V8ValueConverter> converter(V8ValueConverter::create()); |
627 scoped_ptr<base::Value> params_value( | 627 scoped_ptr<base::Value> params_value( |
628 converter->FromV8Value(arg, context()->v8_context())); | 628 converter->FromV8Value(arg, context()->v8_context())); |
629 if (!params_value) { | 629 if (!params_value) { |
630 isolate->ThrowException(v8::Exception::TypeError( | 630 isolate->ThrowException(v8::Exception::TypeError( |
631 v8::String::NewFromUtf8(isolate, kUnableToConvertParams))); | 631 v8::String::NewFromUtf8(isolate, kUnableToConvertParams))); |
632 return false; | 632 return false; |
633 } | 633 } |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
687 !HexDecode(*params->aes_iv_mask, &config->aes_iv_mask)) { | 687 !HexDecode(*params->aes_iv_mask, &config->aes_iv_mask)) { |
688 isolate->ThrowException(v8::Exception::Error( | 688 isolate->ThrowException(v8::Exception::Error( |
689 v8::String::NewFromUtf8(isolate, kInvalidAesIvMask))); | 689 v8::String::NewFromUtf8(isolate, kInvalidAesIvMask))); |
690 return false; | 690 return false; |
691 } | 691 } |
692 return true; | 692 return true; |
693 } | 693 } |
694 | 694 |
695 bool CastStreamingNativeHandler::IPEndPointFromArg( | 695 bool CastStreamingNativeHandler::IPEndPointFromArg( |
696 v8::Isolate* isolate, | 696 v8::Isolate* isolate, |
697 const v8::Handle<v8::Value>& arg, | 697 const v8::Local<v8::Value>& arg, |
698 net::IPEndPoint* ip_endpoint) { | 698 net::IPEndPoint* ip_endpoint) { |
699 scoped_ptr<V8ValueConverter> converter(V8ValueConverter::create()); | 699 scoped_ptr<V8ValueConverter> converter(V8ValueConverter::create()); |
700 scoped_ptr<base::Value> destination_value( | 700 scoped_ptr<base::Value> destination_value( |
701 converter->FromV8Value(arg, context()->v8_context())); | 701 converter->FromV8Value(arg, context()->v8_context())); |
702 if (!destination_value) { | 702 if (!destination_value) { |
703 isolate->ThrowException(v8::Exception::TypeError( | 703 isolate->ThrowException(v8::Exception::TypeError( |
704 v8::String::NewFromUtf8(isolate, kInvalidAesIvMask))); | 704 v8::String::NewFromUtf8(isolate, kInvalidAesIvMask))); |
705 return false; | 705 return false; |
706 } | 706 } |
707 scoped_ptr<IPEndPoint> destination = | 707 scoped_ptr<IPEndPoint> destination = |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
806 } | 806 } |
807 } | 807 } |
808 } | 808 } |
809 | 809 |
810 if (!options) { | 810 if (!options) { |
811 options = new base::DictionaryValue(); | 811 options = new base::DictionaryValue(); |
812 } | 812 } |
813 | 813 |
814 v8::CopyablePersistentTraits<v8::Function>::CopyablePersistent error_callback; | 814 v8::CopyablePersistentTraits<v8::Function>::CopyablePersistent error_callback; |
815 error_callback.Reset(args.GetIsolate(), | 815 error_callback.Reset(args.GetIsolate(), |
816 v8::Handle<v8::Function>(args[7].As<v8::Function>())); | 816 v8::Local<v8::Function>(args[7].As<v8::Function>())); |
817 | 817 |
818 session->Start( | 818 session->Start( |
819 audio_config, | 819 audio_config, |
820 video_config, | 820 video_config, |
821 local_endpoint, | 821 local_endpoint, |
822 remote_endpoint, | 822 remote_endpoint, |
823 make_scoped_ptr(options), | 823 make_scoped_ptr(options), |
824 capture_format, | 824 capture_format, |
825 base::Bind(&CastStreamingNativeHandler::AddTracksToMediaStream, | 825 base::Bind(&CastStreamingNativeHandler::AddTracksToMediaStream, |
826 weak_factory_.GetWeakPtr(), | 826 weak_factory_.GetWeakPtr(), |
827 url, | 827 url, |
828 params), | 828 params), |
829 base::Bind(&CastStreamingNativeHandler::CallReceiverErrorCallback, | 829 base::Bind(&CastStreamingNativeHandler::CallReceiverErrorCallback, |
830 weak_factory_.GetWeakPtr(), | 830 weak_factory_.GetWeakPtr(), |
831 error_callback)); | 831 error_callback)); |
832 } | 832 } |
833 | 833 |
834 void CastStreamingNativeHandler::CallReceiverErrorCallback( | 834 void CastStreamingNativeHandler::CallReceiverErrorCallback( |
835 v8::CopyablePersistentTraits<v8::Function>::CopyablePersistent function, | 835 v8::CopyablePersistentTraits<v8::Function>::CopyablePersistent function, |
836 const std::string& error_message) { | 836 const std::string& error_message) { |
837 v8::Isolate* isolate = context()->v8_context()->GetIsolate(); | 837 v8::Isolate* isolate = context()->v8_context()->GetIsolate(); |
838 v8::Handle<v8::Value> arg = v8::String::NewFromUtf8(isolate, | 838 v8::Local<v8::Value> arg = v8::String::NewFromUtf8(isolate, |
839 error_message.data(), | 839 error_message.data(), |
840 v8::String::kNormalString, | 840 v8::String::kNormalString, |
841 error_message.size()); | 841 error_message.size()); |
842 context()->CallFunction( | 842 context()->CallFunction( |
843 v8::Local<v8::Function>::New(isolate, function), 1, &arg); | 843 v8::Local<v8::Function>::New(isolate, function), 1, &arg); |
844 } | 844 } |
845 | 845 |
846 | 846 |
847 void CastStreamingNativeHandler::AddTracksToMediaStream( | 847 void CastStreamingNativeHandler::AddTracksToMediaStream( |
848 const std::string& url, | 848 const std::string& url, |
849 const media::AudioParameters& params, | 849 const media::AudioParameters& params, |
850 scoped_refptr<media::AudioCapturerSource> audio, | 850 scoped_refptr<media::AudioCapturerSource> audio, |
851 scoped_ptr<media::VideoCapturerSource> video) { | 851 scoped_ptr<media::VideoCapturerSource> video) { |
852 content::AddAudioTrackToMediaStream(audio, params, true, true, url); | 852 content::AddAudioTrackToMediaStream(audio, params, true, true, url); |
853 content::AddVideoTrackToMediaStream(video.Pass(), true, true, url); | 853 content::AddVideoTrackToMediaStream(video.Pass(), true, true, url); |
854 } | 854 } |
855 | 855 |
856 } // namespace extensions | 856 } // namespace extensions |
OLD | NEW |