| Index: chrome/renderer/extensions/webrtc_native_handler.cc
|
| diff --git a/chrome/renderer/extensions/webrtc_native_handler.cc b/chrome/renderer/extensions/webrtc_native_handler.cc
|
| deleted file mode 100644
|
| index ac3bf18a11e09f86147c0026e13fc033d37d9f81..0000000000000000000000000000000000000000
|
| --- a/chrome/renderer/extensions/webrtc_native_handler.cc
|
| +++ /dev/null
|
| @@ -1,354 +0,0 @@
|
| -// Copyright 2013 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "chrome/renderer/extensions/webrtc_native_handler.h"
|
| -
|
| -#include <functional>
|
| -
|
| -#include "base/logging.h"
|
| -#include "base/message_loop/message_loop.h"
|
| -#include "chrome/common/extensions/api/webrtc_cast_send_transport.h"
|
| -#include "chrome/common/extensions/api/webrtc_cast_udp_transport.h"
|
| -#include "chrome/renderer/extensions/chrome_v8_context.h"
|
| -#include "chrome/renderer/media/cast_send_transport.h"
|
| -#include "chrome/renderer/media/cast_session.h"
|
| -#include "chrome/renderer/media/cast_udp_transport.h"
|
| -#include "content/public/renderer/v8_value_converter.h"
|
| -#include "net/base/host_port_pair.h"
|
| -#include "third_party/WebKit/public/platform/WebMediaStreamTrack.h"
|
| -#include "third_party/WebKit/public/web/WebDOMMediaStreamTrack.h"
|
| -
|
| -using content::V8ValueConverter;
|
| -
|
| -// Extension types.
|
| -using extensions::api::webrtc_cast_send_transport::CodecSpecificParams;
|
| -using extensions::api::webrtc_cast_send_transport::RtpCaps;
|
| -using extensions::api::webrtc_cast_send_transport::RtpParams;
|
| -using extensions::api::webrtc_cast_send_transport::RtpPayloadParams;
|
| -using extensions::api::webrtc_cast_udp_transport::UdpParams;
|
| -
|
| -namespace extensions {
|
| -
|
| -namespace {
|
| -const char kSendTransportNotFound[] = "The send transport cannot be found";
|
| -const char kUdpTransportNotFound[] = "The UDP transport cannot be found";
|
| -const char kInvalidUdpParams[] = "Invalid UDP params";
|
| -const char kInvalidRtpParams[] = "Invalid value for RTP params";
|
| -const char kUnableToConvertArgs[] = "Unable to convert arguments";
|
| -const char kUnableToConvertParams[] = "Unable to convert params";
|
| -
|
| -// These helper methods are used to convert between Extension API
|
| -// types and Cast types.
|
| -void ToCastCodecSpecificParams(const CodecSpecificParams& ext_params,
|
| - CastCodecSpecificParams* cast_params) {
|
| - cast_params->key = ext_params.key;
|
| - cast_params->value = ext_params.value;
|
| -}
|
| -
|
| -void FromCastCodecSpecificParams(const CastCodecSpecificParams& cast_params,
|
| - CodecSpecificParams* ext_params) {
|
| - ext_params->key = cast_params.key;
|
| - ext_params->value = cast_params.value;
|
| -}
|
| -
|
| -void ToCastRtpPayloadParams(const RtpPayloadParams& ext_params,
|
| - CastRtpPayloadParams* cast_params) {
|
| - cast_params->payload_type = ext_params.payload_type;
|
| - cast_params->codec_name = ext_params.codec_name;
|
| - cast_params->ssrc = ext_params.ssrc ? *ext_params.ssrc : 0;
|
| - cast_params->clock_rate = ext_params.clock_rate ? *ext_params.clock_rate : 0;
|
| - cast_params->min_bitrate =
|
| - ext_params.min_bitrate ? *ext_params.min_bitrate : 0;
|
| - cast_params->max_bitrate =
|
| - ext_params.max_bitrate ? *ext_params.max_bitrate : 0;
|
| - cast_params->channels = ext_params.channels ? *ext_params.channels : 0;
|
| - cast_params->width = ext_params.width ? *ext_params.width : 0;
|
| - cast_params->height = ext_params.height ? *ext_params.height : 0;
|
| - for (size_t i = 0; i < ext_params.codec_specific_params.size(); ++i) {
|
| - CastCodecSpecificParams cast_codec_params;
|
| - ToCastCodecSpecificParams(*ext_params.codec_specific_params[i],
|
| - &cast_codec_params);
|
| - cast_params->codec_specific_params.push_back(cast_codec_params);
|
| - }
|
| -}
|
| -
|
| -void FromCastRtpPayloadParams(const CastRtpPayloadParams& cast_params,
|
| - RtpPayloadParams* ext_params) {
|
| - ext_params->payload_type = cast_params.payload_type;
|
| - ext_params->codec_name = cast_params.codec_name;
|
| - if (cast_params.ssrc)
|
| - ext_params->ssrc.reset(new int(cast_params.ssrc));
|
| - if (cast_params.clock_rate)
|
| - ext_params->clock_rate.reset(new int(cast_params.clock_rate));
|
| - if (cast_params.min_bitrate)
|
| - ext_params->min_bitrate.reset(new int(cast_params.min_bitrate));
|
| - if (cast_params.max_bitrate)
|
| - ext_params->max_bitrate.reset(new int(cast_params.max_bitrate));
|
| - if (cast_params.channels)
|
| - ext_params->channels.reset(new int(cast_params.channels));
|
| - if (cast_params.width)
|
| - ext_params->width.reset(new int(cast_params.width));
|
| - if (cast_params.height)
|
| - ext_params->height.reset(new int(cast_params.height));
|
| - for (size_t i = 0; i < cast_params.codec_specific_params.size(); ++i) {
|
| - linked_ptr<CodecSpecificParams> ext_codec_params(
|
| - new CodecSpecificParams());
|
| - FromCastCodecSpecificParams(cast_params.codec_specific_params[i],
|
| - ext_codec_params.get());
|
| - ext_params->codec_specific_params.push_back(ext_codec_params);
|
| - }
|
| -}
|
| -
|
| -void FromCastRtpCaps(const CastRtpCaps& cast_caps, RtpCaps* ext_caps) {
|
| - std::copy(cast_caps.rtcp_features.begin(), cast_caps.rtcp_features.end(),
|
| - ext_caps->rtcp_features.begin());
|
| - for (size_t i = 0; i < cast_caps.payloads.size(); ++i) {
|
| - linked_ptr<RtpPayloadParams> ext_payload_params(new RtpPayloadParams());
|
| - FromCastRtpPayloadParams(cast_caps.payloads[i], ext_payload_params.get());
|
| - ext_caps->payloads.push_back(ext_payload_params);
|
| - }
|
| -}
|
| -
|
| -void ToCastRtpParams(const RtpParams& ext_params, CastRtpParams* cast_params) {
|
| - std::copy(ext_params.rtcp_features.begin(), ext_params.rtcp_features.end(),
|
| - cast_params->rtcp_features.begin());
|
| - for (size_t i = 0; i < ext_params.payloads.size(); ++i) {
|
| - CastRtpPayloadParams cast_payload_params;
|
| - ToCastRtpPayloadParams(*ext_params.payloads[i], &cast_payload_params);
|
| - cast_params->payloads.push_back(cast_payload_params);
|
| - }
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -WebRtcNativeHandler::WebRtcNativeHandler(ChromeV8Context* context)
|
| - : ObjectBackedNativeHandler(context),
|
| - last_transport_id_(0),
|
| - weak_factory_(this) {
|
| - RouteFunction("CreateSession",
|
| - base::Bind(&WebRtcNativeHandler::CreateCastSession,
|
| - base::Unretained(this)));
|
| - RouteFunction("DestroyCastSendTransport",
|
| - base::Bind(&WebRtcNativeHandler::DestroyCastSendTransport,
|
| - base::Unretained(this)));
|
| - RouteFunction("GetCapsCastSendTransport",
|
| - base::Bind(&WebRtcNativeHandler::GetCapsCastSendTransport,
|
| - base::Unretained(this)));
|
| - RouteFunction("StartCastSendTransport",
|
| - base::Bind(&WebRtcNativeHandler::StartCastSendTransport,
|
| - base::Unretained(this)));
|
| - RouteFunction("StopCastSendTransport",
|
| - base::Bind(&WebRtcNativeHandler::StopCastSendTransport,
|
| - base::Unretained(this)));
|
| - RouteFunction("DestroyCastUdpTransport",
|
| - base::Bind(&WebRtcNativeHandler::DestroyCastUdpTransport,
|
| - base::Unretained(this)));
|
| - RouteFunction("StartCastUdpTransport",
|
| - base::Bind(&WebRtcNativeHandler::StartCastUdpTransport,
|
| - base::Unretained(this)));
|
| -}
|
| -
|
| -WebRtcNativeHandler::~WebRtcNativeHandler() {
|
| -}
|
| -
|
| -void WebRtcNativeHandler::CreateCastSession(
|
| - const v8::FunctionCallbackInfo<v8::Value>& args) {
|
| - CHECK_EQ(3, args.Length());
|
| - CHECK(args[0]->IsObject());
|
| - CHECK(args[1]->IsObject());
|
| - CHECK(args[2]->IsFunction());
|
| -
|
| - blink::WebDOMMediaStreamTrack track1 =
|
| - blink::WebDOMMediaStreamTrack::fromV8Value(args[0]);
|
| - if (track1.isNull())
|
| - return;
|
| - blink::WebDOMMediaStreamTrack track2 =
|
| - blink::WebDOMMediaStreamTrack::fromV8Value(args[1]);
|
| - if (track2.isNull())
|
| - return;
|
| -
|
| - scoped_refptr<CastSession> session(new CastSession());
|
| - scoped_ptr<CastSendTransport> stream1(
|
| - new CastSendTransport(track1.component(), session));
|
| - scoped_ptr<CastSendTransport> stream2(
|
| - new CastSendTransport(track2.component(), session));
|
| - scoped_ptr<CastUdpTransport> udp_transport(
|
| - new CastUdpTransport(session));
|
| -
|
| - create_callback_.reset(args[2].As<v8::Function>());
|
| -
|
| - base::MessageLoop::current()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(
|
| - &WebRtcNativeHandler::CallCreateCallback,
|
| - weak_factory_.GetWeakPtr(),
|
| - base::Passed(&stream1),
|
| - base::Passed(&stream2),
|
| - base::Passed(&udp_transport)));
|
| -}
|
| -
|
| -void WebRtcNativeHandler::CallCreateCallback(
|
| - scoped_ptr<CastSendTransport> stream1,
|
| - scoped_ptr<CastSendTransport> stream2,
|
| - scoped_ptr<CastUdpTransport> udp_transport) {
|
| - v8::HandleScope handle_scope(context()->isolate());
|
| - v8::Context::Scope context_scope(context()->v8_context());
|
| -
|
| - const int stream1_id = last_transport_id_++;
|
| - send_transport_map_[stream1_id] =
|
| - linked_ptr<CastSendTransport>(stream1.release());
|
| - const int stream2_id = last_transport_id_++;
|
| - send_transport_map_[stream2_id] =
|
| - linked_ptr<CastSendTransport>(stream2.release());
|
| - const int udp_id = last_transport_id_++;
|
| - udp_transport_map_[udp_id] =
|
| - linked_ptr<CastUdpTransport>(udp_transport.release());
|
| -
|
| - v8::Handle<v8::Value> callback_args[3];
|
| - callback_args[0] = v8::Integer::New(stream1_id);
|
| - callback_args[1] = v8::Integer::New(stream2_id);
|
| - callback_args[2] = v8::Integer::New(udp_id);
|
| - context()->CallFunction(create_callback_.NewHandle(context()->isolate()),
|
| - 3, callback_args);
|
| - create_callback_.reset();
|
| -}
|
| -
|
| -void WebRtcNativeHandler::DestroyCastSendTransport(
|
| - const v8::FunctionCallbackInfo<v8::Value>& args) {
|
| - CHECK_EQ(1, args.Length());
|
| - CHECK(args[0]->IsInt32());
|
| -
|
| - const int transport_id = args[0]->ToInt32()->Value();
|
| - if (!GetSendTransportOrThrow(transport_id))
|
| - return;
|
| - send_transport_map_.erase(transport_id);
|
| -}
|
| -
|
| -void WebRtcNativeHandler::GetCapsCastSendTransport(
|
| - const v8::FunctionCallbackInfo<v8::Value>& args) {
|
| - CHECK_EQ(1, args.Length());
|
| - CHECK(args[0]->IsInt32());
|
| -
|
| - const int transport_id = args[0]->ToInt32()->Value();
|
| - CastSendTransport* transport = GetSendTransportOrThrow(transport_id);
|
| - if (!transport)
|
| - return;
|
| -
|
| - CastRtpCaps cast_caps = transport->GetCaps();
|
| - RtpCaps caps;
|
| - FromCastRtpCaps(cast_caps, &caps);
|
| -
|
| - scoped_ptr<base::DictionaryValue> caps_value = caps.ToValue();
|
| - scoped_ptr<V8ValueConverter> converter(V8ValueConverter::create());
|
| - args.GetReturnValue().Set(converter->ToV8Value(
|
| - caps_value.get(), context()->v8_context()));
|
| -}
|
| -
|
| -void WebRtcNativeHandler::StartCastSendTransport(
|
| - const v8::FunctionCallbackInfo<v8::Value>& args) {
|
| - CHECK_EQ(2, args.Length());
|
| - CHECK(args[0]->IsInt32());
|
| - CHECK(args[1]->IsObject());
|
| -
|
| - const int transport_id = args[0]->ToInt32()->Value();
|
| - CastSendTransport* transport = GetSendTransportOrThrow(transport_id);
|
| - if (!transport)
|
| - return;
|
| -
|
| - scoped_ptr<V8ValueConverter> converter(V8ValueConverter::create());
|
| - scoped_ptr<Value> params_value(
|
| - converter->FromV8Value(args[1], context()->v8_context()));
|
| - if (!params_value) {
|
| - args.GetIsolate()->ThrowException(v8::Exception::TypeError(
|
| - v8::String::NewFromUtf8(args.GetIsolate(), kUnableToConvertParams)));
|
| - return;
|
| - }
|
| - scoped_ptr<RtpParams> params = RtpParams::FromValue(*params_value);
|
| - if (!params) {
|
| - args.GetIsolate()->ThrowException(v8::Exception::TypeError(
|
| - v8::String::NewFromUtf8(args.GetIsolate(), kInvalidRtpParams)));
|
| - return;
|
| - }
|
| -
|
| - CastRtpCaps cast_params;
|
| - ToCastRtpParams(*params, &cast_params);
|
| - transport->Start(cast_params);
|
| -}
|
| -
|
| -void WebRtcNativeHandler::StopCastSendTransport(
|
| - const v8::FunctionCallbackInfo<v8::Value>& args) {
|
| - CHECK_EQ(1, args.Length());
|
| - CHECK(args[0]->IsInt32());
|
| -
|
| - const int transport_id = args[0]->ToInt32()->Value();
|
| - CastSendTransport* transport = GetSendTransportOrThrow(transport_id);
|
| - if (!transport)
|
| - return;
|
| - transport->Stop();
|
| -}
|
| -
|
| -void WebRtcNativeHandler::DestroyCastUdpTransport(
|
| - const v8::FunctionCallbackInfo<v8::Value>& args) {
|
| - CHECK_EQ(1, args.Length());
|
| - CHECK(args[0]->IsInt32());
|
| -
|
| - const int transport_id = args[0]->ToInt32()->Value();
|
| - if (!GetUdpTransportOrThrow(transport_id))
|
| - return;
|
| - udp_transport_map_.erase(transport_id);
|
| -}
|
| -
|
| -void WebRtcNativeHandler::StartCastUdpTransport(
|
| - const v8::FunctionCallbackInfo<v8::Value>& args) {
|
| - CHECK_EQ(2, args.Length());
|
| - CHECK(args[0]->IsInt32());
|
| - CHECK(args[1]->IsObject());
|
| -
|
| - const int transport_id = args[0]->ToInt32()->Value();
|
| - CastUdpTransport* transport = GetUdpTransportOrThrow(transport_id);
|
| - if (!transport)
|
| - return;
|
| -
|
| - scoped_ptr<V8ValueConverter> converter(V8ValueConverter::create());
|
| - scoped_ptr<Value> udp_params_value(
|
| - converter->FromV8Value(args[1], context()->v8_context()));
|
| - if (!udp_params_value) {
|
| - args.GetIsolate()->ThrowException(v8::Exception::TypeError(
|
| - v8::String::NewFromUtf8(args.GetIsolate(), kUnableToConvertArgs)));
|
| - return;
|
| - }
|
| - scoped_ptr<UdpParams> udp_params = UdpParams::FromValue(*udp_params_value);
|
| - if (!udp_params) {
|
| - args.GetIsolate()->ThrowException(v8::Exception::TypeError(
|
| - v8::String::NewFromUtf8(args.GetIsolate(), kInvalidUdpParams)));
|
| - return;
|
| - }
|
| - transport->Start(net::HostPortPair(udp_params->address, udp_params->port));
|
| -}
|
| -
|
| -CastSendTransport* WebRtcNativeHandler::GetSendTransportOrThrow(
|
| - int transport_id) const {
|
| - SendTransportMap::const_iterator iter = send_transport_map_.find(
|
| - transport_id);
|
| - if (iter != send_transport_map_.end())
|
| - return iter->second.get();
|
| - v8::Isolate* isolate = context()->v8_context()->GetIsolate();
|
| - isolate->ThrowException(v8::Exception::RangeError(
|
| - v8::String::NewFromUtf8(isolate, kSendTransportNotFound)));
|
| - return NULL;
|
| -}
|
| -
|
| -CastUdpTransport* WebRtcNativeHandler::GetUdpTransportOrThrow(
|
| - int transport_id) const {
|
| - UdpTransportMap::const_iterator iter = udp_transport_map_.find(
|
| - transport_id);
|
| - if (iter != udp_transport_map_.end())
|
| - return iter->second.get();
|
| - v8::Isolate* isolate = context()->v8_context()->GetIsolate();
|
| - isolate->ThrowException(v8::Exception::RangeError(
|
| - v8::String::NewFromUtf8(isolate, kUdpTransportNotFound)));
|
| - return NULL;
|
| -}
|
| -
|
| -} // namespace extensions
|
|
|