From 038974b5525b09973e836309d4e731c19dc12972 Mon Sep 17 00:00:00 2001 From: "hclam@chromium.org" Date: Tue, 3 Dec 2013 15:45:44 +0000 Subject: Cast Extensions API: Major namespace and object renaming There is no functional change in this patch. This change only does renaming. Extensions API namespaces: webrtc.castSendTransport -> cast.streaming.rtpStream webrtc.castUdpTransport -> cast.streaming.udpTransport Class renaming: WebRtcNativeHandler -> CastStreamingNativeHandler CastSendTransport -> CastRtpStream Tests and related files are also renamed to get rid of the webrtc label. BUG=301920 Review URL: https://codereview.chromium.org/90083002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@238403 0039d316-1c4b-4281-b951-d872f2087c98 --- .../browser/extensions/cast_streaming_apitest.cc | 41 +++ chrome/browser/extensions/webrtc_cast_apitest.cc | 41 --- chrome/chrome_renderer.gypi | 12 +- chrome/chrome_tests.gypi | 2 +- chrome/common/extensions/api/_api_features.json | 16 +- .../extensions/api/_permission_features.json | 4 - chrome/common/extensions/api/api.gyp | 4 +- .../extensions/api/cast_streaming_rtp_stream.idl | 96 ++++++ .../extensions/api/cast_streaming_session.idl | 10 +- .../api/cast_streaming_udp_transport.idl | 26 ++ .../extensions/api/webrtc_cast_send_transport.idl | 107 ------- .../extensions/api/webrtc_cast_udp_transport.idl | 26 -- .../permissions/chrome_api_permissions.cc | 1 - .../permissions/permission_set_unittest.cc | 2 +- .../extensions/cast_streaming_native_handler.cc | 354 +++++++++++++++++++++ .../extensions/cast_streaming_native_handler.h | 79 +++++ chrome/renderer/extensions/dispatcher.cc | 15 +- .../renderer/extensions/webrtc_native_handler.cc | 354 --------------------- chrome/renderer/extensions/webrtc_native_handler.h | 79 ----- chrome/renderer/media/cast_rtp_stream.cc | 164 ++++++++++ chrome/renderer/media/cast_rtp_stream.h | 113 +++++++ chrome/renderer/media/cast_send_transport.cc | 164 ---------- chrome/renderer/media/cast_send_transport.h | 113 ------- .../cast_streaming_rtp_stream_custom_bindings.js | 31 ++ .../cast_streaming_session_custom_bindings.js | 4 +- ...cast_streaming_udp_transport_custom_bindings.js | 22 ++ .../webrtc_cast_send_transport_custom_bindings.js | 31 -- .../webrtc_cast_udp_transport_custom_bindings.js | 22 -- chrome/renderer/resources/renderer_resources.grd | 4 +- .../extensions/api_test/cast_streaming/basics.html | 6 + .../extensions/api_test/cast_streaming/basics.js | 34 ++ .../api_test/cast_streaming/manifest.json | 8 + .../extensions/api_test/webrtc_cast/basics.html | 6 - .../data/extensions/api_test/webrtc_cast/basics.js | 34 -- .../extensions/api_test/webrtc_cast/manifest.json | 8 - extensions/common/permissions/api_permission.h | 1 - 36 files changed, 1009 insertions(+), 1025 deletions(-) create mode 100644 chrome/browser/extensions/cast_streaming_apitest.cc delete mode 100644 chrome/browser/extensions/webrtc_cast_apitest.cc create mode 100644 chrome/common/extensions/api/cast_streaming_rtp_stream.idl create mode 100644 chrome/common/extensions/api/cast_streaming_udp_transport.idl delete mode 100644 chrome/common/extensions/api/webrtc_cast_send_transport.idl delete mode 100644 chrome/common/extensions/api/webrtc_cast_udp_transport.idl create mode 100644 chrome/renderer/extensions/cast_streaming_native_handler.cc create mode 100644 chrome/renderer/extensions/cast_streaming_native_handler.h delete mode 100644 chrome/renderer/extensions/webrtc_native_handler.cc delete mode 100644 chrome/renderer/extensions/webrtc_native_handler.h create mode 100644 chrome/renderer/media/cast_rtp_stream.cc create mode 100644 chrome/renderer/media/cast_rtp_stream.h delete mode 100644 chrome/renderer/media/cast_send_transport.cc delete mode 100644 chrome/renderer/media/cast_send_transport.h create mode 100644 chrome/renderer/resources/extensions/cast_streaming_rtp_stream_custom_bindings.js create mode 100644 chrome/renderer/resources/extensions/cast_streaming_udp_transport_custom_bindings.js delete mode 100644 chrome/renderer/resources/extensions/webrtc_cast_send_transport_custom_bindings.js delete mode 100644 chrome/renderer/resources/extensions/webrtc_cast_udp_transport_custom_bindings.js create mode 100644 chrome/test/data/extensions/api_test/cast_streaming/basics.html create mode 100644 chrome/test/data/extensions/api_test/cast_streaming/basics.js create mode 100644 chrome/test/data/extensions/api_test/cast_streaming/manifest.json delete mode 100644 chrome/test/data/extensions/api_test/webrtc_cast/basics.html delete mode 100644 chrome/test/data/extensions/api_test/webrtc_cast/basics.js delete mode 100644 chrome/test/data/extensions/api_test/webrtc_cast/manifest.json diff --git a/chrome/browser/extensions/cast_streaming_apitest.cc b/chrome/browser/extensions/cast_streaming_apitest.cc new file mode 100644 index 0000000..89d2d18c --- /dev/null +++ b/chrome/browser/extensions/cast_streaming_apitest.cc @@ -0,0 +1,41 @@ +// 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 "base/command_line.h" +#include "chrome/browser/extensions/extension_apitest.h" +#include "chrome/common/chrome_switches.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace extensions { + +class CastStreamingApiTest : public ExtensionApiTest { + virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { + ExtensionApiTest::SetUpCommandLine(command_line); + command_line->AppendSwitchASCII( + switches::kWhitelistedExtensionID, + "ddchlicdkolnonkihahngkmmmjnjlkkf"); + } + + virtual void SetUp() OVERRIDE { + // TODO(danakj): The GPU Video Decoder needs real GL bindings. + // crbug.com/269087 + UseRealGLBindings(); + + // These test should be using OSMesa on CrOS, which would make this + // unneeded. + // crbug.com/313128 +#if !defined(OS_CHROMEOS) + UseRealGLContexts(); +#endif + + ExtensionApiTest::SetUp(); + } +}; + +// Test running the test extension for Cast Mirroring API. +IN_PROC_BROWSER_TEST_F(CastStreamingApiTest, Basics) { + ASSERT_TRUE(RunExtensionSubtest("cast_streaming", "basics.html")); +} + +} // namespace extensions diff --git a/chrome/browser/extensions/webrtc_cast_apitest.cc b/chrome/browser/extensions/webrtc_cast_apitest.cc deleted file mode 100644 index 3fee7f8..0000000 --- a/chrome/browser/extensions/webrtc_cast_apitest.cc +++ /dev/null @@ -1,41 +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 "base/command_line.h" -#include "chrome/browser/extensions/extension_apitest.h" -#include "chrome/common/chrome_switches.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace extensions { - -class WebrtcCastApiTest : public ExtensionApiTest { - virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { - ExtensionApiTest::SetUpCommandLine(command_line); - command_line->AppendSwitchASCII( - switches::kWhitelistedExtensionID, - "ddchlicdkolnonkihahngkmmmjnjlkkf"); - } - - virtual void SetUp() OVERRIDE { - // TODO(danakj): The GPU Video Decoder needs real GL bindings. - // crbug.com/269087 - UseRealGLBindings(); - - // These test should be using OSMesa on CrOS, which would make this - // unneeded. - // crbug.com/313128 -#if !defined(OS_CHROMEOS) - UseRealGLContexts(); -#endif - - ExtensionApiTest::SetUp(); - } -}; - -// Test running the test extension for Cast Mirroring API. -IN_PROC_BROWSER_TEST_F(WebrtcCastApiTest, Basics) { - ASSERT_TRUE(RunExtensionSubtest("webrtc_cast", "basics.html")); -} - -} // namespace extensions diff --git a/chrome/chrome_renderer.gypi b/chrome/chrome_renderer.gypi index ce94a42..10b78fb 100644 --- a/chrome/chrome_renderer.gypi +++ b/chrome/chrome_renderer.gypi @@ -62,6 +62,8 @@ 'renderer/extensions/binding_generating_native_handler.h', 'renderer/extensions/blob_native_handler.cc', 'renderer/extensions/blob_native_handler.h', + 'renderer/extensions/cast_streaming_native_handler.cc', + 'renderer/extensions/cast_streaming_native_handler.h', 'renderer/extensions/chrome_v8_context.cc', 'renderer/extensions/chrome_v8_context.h', 'renderer/extensions/chrome_v8_context_set.cc', @@ -147,15 +149,13 @@ 'renderer/extensions/user_script_slave.h', 'renderer/extensions/v8_schema_registry.cc', 'renderer/extensions/v8_schema_registry.h', - 'renderer/extensions/webrtc_native_handler.cc', - 'renderer/extensions/webrtc_native_handler.h', 'renderer/extensions/webstore_bindings.cc', 'renderer/extensions/webstore_bindings.h', 'renderer/isolated_world_ids.h', 'renderer/loadtimes_extension_bindings.cc', 'renderer/loadtimes_extension_bindings.h', - 'renderer/media/cast_send_transport.cc', - 'renderer/media/cast_send_transport.h', + 'renderer/media/cast_rtp_stream.cc', + 'renderer/media/cast_rtp_stream.h', 'renderer/media/cast_session.cc', 'renderer/media/cast_session.h', 'renderer/media/cast_session_delegate.cc', @@ -376,8 +376,8 @@ }], ['enable_webrtc==0', { 'sources!': [ - 'renderer/extensions/webrtc_native_handler.cc', - 'renderer/extensions/webrtc_native_handler.h', + 'renderer/extensions/cast_streaming_native_handler.cc', + 'renderer/extensions/cast_streaming_native_handler.h', 'renderer/media/chrome_webrtc_log_message_delegate.cc', 'renderer/media/chrome_webrtc_log_message_delegate.h', 'renderer/media/webrtc_logging_message_filter.cc', diff --git a/chrome/chrome_tests.gypi b/chrome/chrome_tests.gypi index 0b1774f..bb4a961 100644 --- a/chrome/chrome_tests.gypi +++ b/chrome/chrome_tests.gypi @@ -1179,6 +1179,7 @@ 'browser/extensions/browsertest_util.cc', 'browser/extensions/browsertest_util.h', 'browser/extensions/browsertest_util_browsertest.cc', + 'browser/extensions/cast_streaming_apitest.cc', 'browser/extensions/chrome_app_api_browsertest.cc', 'browser/extensions/content_script_apitest.cc', 'browser/extensions/content_security_policy_apitest.cc', @@ -1242,7 +1243,6 @@ 'browser/extensions/test_extension_dir.cc', 'browser/extensions/test_extension_dir.h', 'browser/extensions/web_contents_browsertest.cc', - 'browser/extensions/webrtc_cast_apitest.cc', 'browser/extensions/webstore_inline_installer_browsertest.cc', 'browser/extensions/webstore_installer_test.cc', 'browser/extensions/webstore_installer_test.h', diff --git a/chrome/common/extensions/api/_api_features.json b/chrome/common/extensions/api/_api_features.json index e9a0d57..14c4263 100644 --- a/chrome/common/extensions/api/_api_features.json +++ b/chrome/common/extensions/api/_api_features.json @@ -128,10 +128,18 @@ "dependencies": ["permission:cast"], "contexts": ["blessed_extension"] }, + "cast.streaming.rtpStream": { + "dependencies": ["permission:cast.streaming"], + "contexts": ["blessed_extension"] + }, "cast.streaming.session": { "dependencies": ["permission:cast.streaming"], "contexts": ["blessed_extension"] }, + "cast.streaming.udpTransport": { + "dependencies": ["permission:cast.streaming"], + "contexts": ["blessed_extension"] + }, "chromeosInfoPrivate": { "platforms": ["chromeos"], "dependencies": ["permission:chromeosInfoPrivate"], @@ -717,14 +725,6 @@ "dependencies": ["permission:webstorePrivate"], "contexts": ["blessed_extension"] }, - "webrtc.castSendTransport": { - "dependencies": ["permission:webrtc"], - "contexts": ["blessed_extension"] - }, - "webrtc.castUdpTransport": { - "dependencies": ["permission:webrtc"], - "contexts": ["blessed_extension"] - }, "webview": { "internal": true, "dependencies": ["permission:webview"], diff --git a/chrome/common/extensions/api/_permission_features.json b/chrome/common/extensions/api/_permission_features.json index 175c9bb..0e5a49d 100644 --- a/chrome/common/extensions/api/_permission_features.json +++ b/chrome/common/extensions/api/_permission_features.json @@ -843,10 +843,6 @@ "channel": "stable", "extension_types": ["extension", "legacy_packaged_app"] }, - "webrtc": { - "channel": "dev", - "extension_types": ["extension"] - }, "webrtcAudioPrivate": { "channel": "stable", "extension_types": ["extension"], diff --git a/chrome/common/extensions/api/api.gyp b/chrome/common/extensions/api/api.gyp index c5a56ec..a7c9eb4 100644 --- a/chrome/common/extensions/api/api.gyp +++ b/chrome/common/extensions/api/api.gyp @@ -166,9 +166,9 @@ }], ['enable_webrtc==1', { 'schema_files': [ + 'cast_streaming_rtp_stream.idl', 'cast_streaming_session.idl', - 'webrtc_cast_send_transport.idl', - 'webrtc_cast_udp_transport.idl', + 'cast_streaming_udp_transport.idl', 'webrtc_logging_private.idl', ], }], diff --git a/chrome/common/extensions/api/cast_streaming_rtp_stream.idl b/chrome/common/extensions/api/cast_streaming_rtp_stream.idl new file mode 100644 index 0000000..55994d3 --- /dev/null +++ b/chrome/common/extensions/api/cast_streaming_rtp_stream.idl @@ -0,0 +1,96 @@ +// 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. + +// The chrome.cast.streaming.rtpStream API allows configuration +// of encoding parameters and RTP parameters used in a Cast streaming +// session. +namespace cast.streaming.rtpStream { + // Params for audio and video codec. + dictionary CodecSpecificParams { + DOMString key; + DOMString value; + }; + + // RTP payload param. + dictionary RtpPayloadParams { + long payloadType; + + DOMString codecName; + + // Synchronization source identifier. + long? ssrc; + + long? clockRate; + + long? minBitrate; + + long? maxBitrate; + + // The number of channels. + long? channels; + + // Video width in pixels. + long? width; + + // Video height in pixels. + long? height; + + // A list of codec specific params. + CodecSpecificParams[] codecSpecificParams; + }; + + // Cast RTP capabilities. + dictionary RtpCaps { + // RTP payload params. + RtpPayloadParams[] payloads; + + DOMString[] rtcpFeatures; + }; + + // Cast RTP parameters. + dictionary RtpParams { + // RTP payload params. + RtpPayloadParams[] payloads; + + DOMString[] rtcpFeatures; + }; + + // Callback from the create method. + // |id| : The ID for the RTP stream. + callback CreateCallback = void (long streamId); + + interface Functions { + // Destroys a Cast RTP stream. + // |streamId| : The RTP stream ID. + [nocompile] static void destroy(long streamId); + + // Returns capabilities of the RTP stream. + // |streamId| : The RTP stream ID. + [nocompile] static RtpCaps getCaps(long streamId); + + // Activates the RTP stream by providing the parameters. + // |streamId| : The RTP stream ID. + // |params| : Parameters set for this stream. + [nocompile] static void start(long streamId, RtpParams params); + + // Stops activity on the specified stream. + // |streamId| : The RTP stream ID. + [nocompile] static void stop(long streamId); + }; + + interface Events { + // Event fired when a Cast RTP stream has started. + // |streamId| : The ID of the RTP stream. + static void onStarted(long streamId); + + // Event fired when a Cast RTP stream has stopped. + // |streamId| : The ID of the RTP stream. + static void onStopped(long streamId); + + // Event fired when a Cast RTP stream has error. + // |streamId| : The ID of the RTP stream. + // |errorString| : The error info. + static void onError(long streamId, DOMString errorString); + }; +}; diff --git a/chrome/common/extensions/api/cast_streaming_session.idl b/chrome/common/extensions/api/cast_streaming_session.idl index 5250c61..47408f0 100644 --- a/chrome/common/extensions/api/cast_streaming_session.idl +++ b/chrome/common/extensions/api/cast_streaming_session.idl @@ -7,15 +7,15 @@ // by RTP streams and a network transport. // // Calling this API will generate corresponding resources for use with -// chrome.webrtc.castSendTransport and chrome.webrtc.castUdpTransport +// chrome.cast.streaming.rtpStream and chrome.cast.streaming.udpTransport // APIs. namespace cast.streaming.session { // Callback from the create method. - // |audioTransportId| : The audio transport ID. - // |videoTransportId| : The video transport ID. + // |audioStreamId| : The audio RTP stream ID. + // |videoStreamId| : The video RTP stream ID. // |udpTransportId| : The UDP transport ID. - callback CreateCallback = void (long audioTransportId, - long videoTransportId, + callback CreateCallback = void (long audioStreamId, + long videoStreamId, long udpTransportId); interface Functions { diff --git a/chrome/common/extensions/api/cast_streaming_udp_transport.idl b/chrome/common/extensions/api/cast_streaming_udp_transport.idl new file mode 100644 index 0000000..8c14060 --- /dev/null +++ b/chrome/common/extensions/api/cast_streaming_udp_transport.idl @@ -0,0 +1,26 @@ +// 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. + +// The chrome.webrtc.castUdpTransport API represents a UDP +// transport for Cast RTP streams. This API is not useful when standalone +// since it does not have send and receive methods. +// It is used to configure the UDP transport used in Cast session. +namespace cast.streaming.udpTransport { + // The UDP socket address and port. + dictionary UdpParams { + DOMString address; + long port; + }; + + interface Functions { + // Destroys a UDP transport. + // |transportId| : The transport ID. + [nocompile] static void destroy(long transportId); + + // Starts to use the transport by providing remote UDP info. + // |transportId| : The transport ID. + // |remoteParams| : The address and port to send packets to. + [nocompile] static void start(long transportId, UdpParams remoteParams); + }; +}; diff --git a/chrome/common/extensions/api/webrtc_cast_send_transport.idl b/chrome/common/extensions/api/webrtc_cast_send_transport.idl deleted file mode 100644 index e2f4fa3..0000000 --- a/chrome/common/extensions/api/webrtc_cast_send_transport.idl +++ /dev/null @@ -1,107 +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. - -// The chrome.webrtc.castSendTransport API takes a track as -// a source of media, and sends that media on the inner transport according to -// the given RtpParams. -namespace webrtc.castSendTransport { - // Params for audio and video codec. - dictionary CodecSpecificParams { - DOMString key; - DOMString value; - }; - - // RTP payload param. - dictionary RtpPayloadParams { - long payloadType; - - DOMString codecName; - - // Synchronization source identifier. - long? ssrc; - - long? clockRate; - - long? minBitrate; - - long? maxBitrate; - - // The number of channels. - long? channels; - - // Video width in pixels. - long? width; - - // Video height in pixels. - long? height; - - // A list of codec specific params. - CodecSpecificParams[] codecSpecificParams; - }; - - // Cast transport capabilities - dictionary RtpCaps { - // RTP payload params. - RtpPayloadParams[] payloads; - - DOMString[] rtcpFeatures; - }; - - // Cast transport params. - dictionary RtpParams { - // RTP payload params. - RtpPayloadParams[] payloads; - - DOMString[] rtcpFeatures; - }; - - // Callback from the create method. - // |id| : The transport id. - callback CreateCallback = void (long transportId); - - interface Functions { - // Destroys a cast send transport. - // |transportId| : The transport ID. - [nocompile] static void destroy(long transportId); - - // Returns capabilities of the transport. - // |transportId| : The transport ID. - [nocompile] static RtpCaps getCaps(long transportId); - - // Starts to use the transport by providing remote params info. - // |transportId| : The transport ID. - // |params| : Parameters set for this transport. - [nocompile] static void start(long transportId, RtpParams params); - - // Stops using the transport. - // |transportId| : The transport ID. - [nocompile] static void stop(long transportId); - }; - - interface Events { - // Event fired when a cast send transport has started. - // |transportId| : The ID of the transport. - static void onStarted(long transportId); - - // Event fired when a cast send transport has connected. - // After this event, the transport is ready to send the track. - // |transportId| : The ID of the transport. - static void onConnected(long transportId); - - // Event fired when a cast send transport has stopped. - // |transportId| : The ID of the transport. - static void onStopped(long transportId); - - // Event fired when a cast send transport has timeout. - // This happens when network has been congested for a while, or one side - // left. - // |transportId| : The ID of the transport. - static void onTimeout(long transportId); - - // Event fired when a cast send transport has error. - // |transportId| : The ID of the transport. - // |errorString| : The error info. - static void onError(long transportId, DOMString errorString); - }; -}; diff --git a/chrome/common/extensions/api/webrtc_cast_udp_transport.idl b/chrome/common/extensions/api/webrtc_cast_udp_transport.idl deleted file mode 100644 index 26ad6e5..0000000 --- a/chrome/common/extensions/api/webrtc_cast_udp_transport.idl +++ /dev/null @@ -1,26 +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. - -// The chrome.webrtc.castUdpTransport API represents a UDP -// transport for Cast RTP streams. This API is not useful when standalone -// since it does not have send and receive methods. -// It is used to configure the UDP transport used in Cast session. -namespace webrtc.castUdpTransport { - // The UDP socket address and port. - dictionary UdpParams { - DOMString address; - long port; - }; - - interface Functions { - // Destroys a UDP transport. - // |transportId| : The transport ID. - [nocompile] static void destroy(long transportId); - - // Starts to use the transport by providing remote UDP info. - // |transportId| : The transport ID. - // |remoteParams| : The address and port to send packets to. - [nocompile] static void start(long transportId, UdpParams remoteParams); - }; -}; diff --git a/chrome/common/extensions/permissions/chrome_api_permissions.cc b/chrome/common/extensions/permissions/chrome_api_permissions.cc index a962096..f82ed5e 100644 --- a/chrome/common/extensions/permissions/chrome_api_permissions.cc +++ b/chrome/common/extensions/permissions/chrome_api_permissions.cc @@ -355,7 +355,6 @@ std::vector ChromeAPIPermissions::GetAllPermissions() { APIPermission::kPointerLock, "pointerLock" }, { APIPermission::kFullscreen, "fullscreen" }, { APIPermission::kAudio, "audio" }, - { APIPermission::kWebRtc, "webrtc" }, { APIPermission::kCastStreaming, "cast.streaming" }, { APIPermission::kOverrideEscFullscreen, "overrideEscFullscreen" }, diff --git a/chrome/common/extensions/permissions/permission_set_unittest.cc b/chrome/common/extensions/permissions/permission_set_unittest.cc index 065310a..b3d4371 100644 --- a/chrome/common/extensions/permissions/permission_set_unittest.cc +++ b/chrome/common/extensions/permissions/permission_set_unittest.cc @@ -664,6 +664,7 @@ TEST(PermissionsTest, PermissionMessages) { skip.insert(APIPermission::kAppWindow); skip.insert(APIPermission::kAudio); skip.insert(APIPermission::kBrowsingData); + skip.insert(APIPermission::kCastStreaming); skip.insert(APIPermission::kContextMenus); skip.insert(APIPermission::kDiagnostics); skip.insert(APIPermission::kDns); @@ -687,7 +688,6 @@ TEST(PermissionsTest, PermissionMessages) { skip.insert(APIPermission::kSystemStorage); skip.insert(APIPermission::kTts); skip.insert(APIPermission::kUnlimitedStorage); - skip.insert(APIPermission::kWebRtc); skip.insert(APIPermission::kWebView); skip.insert(APIPermission::kOverrideEscFullscreen); diff --git a/chrome/renderer/extensions/cast_streaming_native_handler.cc b/chrome/renderer/extensions/cast_streaming_native_handler.cc new file mode 100644 index 0000000..00316c7 --- /dev/null +++ b/chrome/renderer/extensions/cast_streaming_native_handler.cc @@ -0,0 +1,354 @@ +// 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/cast_streaming_native_handler.h" + +#include + +#include "base/logging.h" +#include "base/message_loop/message_loop.h" +#include "chrome/common/extensions/api/cast_streaming_rtp_stream.h" +#include "chrome/common/extensions/api/cast_streaming_udp_transport.h" +#include "chrome/renderer/extensions/chrome_v8_context.h" +#include "chrome/renderer/media/cast_rtp_stream.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::cast_streaming_rtp_stream::CodecSpecificParams; +using extensions::api::cast_streaming_rtp_stream::RtpCaps; +using extensions::api::cast_streaming_rtp_stream::RtpParams; +using extensions::api::cast_streaming_rtp_stream::RtpPayloadParams; +using extensions::api::cast_streaming_udp_transport::UdpParams; + +namespace extensions { + +namespace { +const char kRtpStreamNotFound[] = "The RTP stream 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 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 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 + +CastStreamingNativeHandler::CastStreamingNativeHandler(ChromeV8Context* context) + : ObjectBackedNativeHandler(context), + last_transport_id_(0), + weak_factory_(this) { + RouteFunction("CreateSession", + base::Bind(&CastStreamingNativeHandler::CreateCastSession, + base::Unretained(this))); + RouteFunction("DestroyCastRtpStream", + base::Bind(&CastStreamingNativeHandler::DestroyCastRtpStream, + base::Unretained(this))); + RouteFunction("GetCapsCastRtpStream", + base::Bind(&CastStreamingNativeHandler::GetCapsCastRtpStream, + base::Unretained(this))); + RouteFunction("StartCastRtpStream", + base::Bind(&CastStreamingNativeHandler::StartCastRtpStream, + base::Unretained(this))); + RouteFunction("StopCastRtpStream", + base::Bind(&CastStreamingNativeHandler::StopCastRtpStream, + base::Unretained(this))); + RouteFunction("DestroyCastUdpTransport", + base::Bind(&CastStreamingNativeHandler::DestroyCastUdpTransport, + base::Unretained(this))); + RouteFunction("StartCastUdpTransport", + base::Bind(&CastStreamingNativeHandler::StartCastUdpTransport, + base::Unretained(this))); +} + +CastStreamingNativeHandler::~CastStreamingNativeHandler() { +} + +void CastStreamingNativeHandler::CreateCastSession( + const v8::FunctionCallbackInfo& 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 session(new CastSession()); + scoped_ptr stream1( + new CastRtpStream(track1.component(), session)); + scoped_ptr stream2( + new CastRtpStream(track2.component(), session)); + scoped_ptr udp_transport( + new CastUdpTransport(session)); + + create_callback_.reset(args[2].As()); + + base::MessageLoop::current()->PostTask( + FROM_HERE, + base::Bind( + &CastStreamingNativeHandler::CallCreateCallback, + weak_factory_.GetWeakPtr(), + base::Passed(&stream1), + base::Passed(&stream2), + base::Passed(&udp_transport))); +} + +void CastStreamingNativeHandler::CallCreateCallback( + scoped_ptr stream1, + scoped_ptr stream2, + scoped_ptr udp_transport) { + v8::HandleScope handle_scope(context()->isolate()); + v8::Context::Scope context_scope(context()->v8_context()); + + const int stream1_id = last_transport_id_++; + rtp_stream_map_[stream1_id] = + linked_ptr(stream1.release()); + const int stream2_id = last_transport_id_++; + rtp_stream_map_[stream2_id] = + linked_ptr(stream2.release()); + const int udp_id = last_transport_id_++; + udp_transport_map_[udp_id] = + linked_ptr(udp_transport.release()); + + v8::Handle 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 CastStreamingNativeHandler::DestroyCastRtpStream( + const v8::FunctionCallbackInfo& args) { + CHECK_EQ(1, args.Length()); + CHECK(args[0]->IsInt32()); + + const int transport_id = args[0]->ToInt32()->Value(); + if (!GetRtpStreamOrThrow(transport_id)) + return; + rtp_stream_map_.erase(transport_id); +} + +void CastStreamingNativeHandler::GetCapsCastRtpStream( + const v8::FunctionCallbackInfo& args) { + CHECK_EQ(1, args.Length()); + CHECK(args[0]->IsInt32()); + + const int transport_id = args[0]->ToInt32()->Value(); + CastRtpStream* transport = GetRtpStreamOrThrow(transport_id); + if (!transport) + return; + + CastRtpCaps cast_caps = transport->GetCaps(); + RtpCaps caps; + FromCastRtpCaps(cast_caps, &caps); + + scoped_ptr caps_value = caps.ToValue(); + scoped_ptr converter(V8ValueConverter::create()); + args.GetReturnValue().Set(converter->ToV8Value( + caps_value.get(), context()->v8_context())); +} + +void CastStreamingNativeHandler::StartCastRtpStream( + const v8::FunctionCallbackInfo& args) { + CHECK_EQ(2, args.Length()); + CHECK(args[0]->IsInt32()); + CHECK(args[1]->IsObject()); + + const int transport_id = args[0]->ToInt32()->Value(); + CastRtpStream* transport = GetRtpStreamOrThrow(transport_id); + if (!transport) + return; + + scoped_ptr converter(V8ValueConverter::create()); + scoped_ptr 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 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 CastStreamingNativeHandler::StopCastRtpStream( + const v8::FunctionCallbackInfo& args) { + CHECK_EQ(1, args.Length()); + CHECK(args[0]->IsInt32()); + + const int transport_id = args[0]->ToInt32()->Value(); + CastRtpStream* transport = GetRtpStreamOrThrow(transport_id); + if (!transport) + return; + transport->Stop(); +} + +void CastStreamingNativeHandler::DestroyCastUdpTransport( + const v8::FunctionCallbackInfo& 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 CastStreamingNativeHandler::StartCastUdpTransport( + const v8::FunctionCallbackInfo& 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 converter(V8ValueConverter::create()); + scoped_ptr 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 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)); +} + +CastRtpStream* CastStreamingNativeHandler::GetRtpStreamOrThrow( + int transport_id) const { + RtpStreamMap::const_iterator iter = rtp_stream_map_.find( + transport_id); + if (iter != rtp_stream_map_.end()) + return iter->second.get(); + v8::Isolate* isolate = context()->v8_context()->GetIsolate(); + isolate->ThrowException(v8::Exception::RangeError(v8::String::NewFromUtf8( + isolate, kRtpStreamNotFound))); + return NULL; +} + +CastUdpTransport* CastStreamingNativeHandler::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 diff --git a/chrome/renderer/extensions/cast_streaming_native_handler.h b/chrome/renderer/extensions/cast_streaming_native_handler.h new file mode 100644 index 0000000..4c2360c --- /dev/null +++ b/chrome/renderer/extensions/cast_streaming_native_handler.h @@ -0,0 +1,79 @@ +// 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. + +#ifndef CHROME_RENDERER_EXTENSIONS_CAST_STREAMING_NATIVE_HANDLER_H_ +#define CHROME_RENDERER_EXTENSIONS_CAST_STREAMING_NATIVE_HANDLER_H_ + +#include + +#include "base/memory/linked_ptr.h" +#include "base/memory/weak_ptr.h" +#include "chrome/renderer/extensions/object_backed_native_handler.h" +#include "chrome/renderer/extensions/scoped_persistent.h" +#include "v8/include/v8.h" + +class CastRtpStream; +class CastUdpTransport; + +namespace extensions { + +class ChromeV8Context; + +// Native code that handle chrome.webrtc custom bindings. +class CastStreamingNativeHandler : public ObjectBackedNativeHandler { + public: + explicit CastStreamingNativeHandler(ChromeV8Context* context); + virtual ~CastStreamingNativeHandler(); + + private: + void CreateCastSession( + const v8::FunctionCallbackInfo& args); + + void DestroyCastRtpStream( + const v8::FunctionCallbackInfo& args); + void CreateParamsCastRtpStream( + const v8::FunctionCallbackInfo& args); + void GetCapsCastRtpStream( + const v8::FunctionCallbackInfo& args); + void StartCastRtpStream( + const v8::FunctionCallbackInfo& args); + void StopCastRtpStream( + const v8::FunctionCallbackInfo& args); + + void DestroyCastUdpTransport( + const v8::FunctionCallbackInfo& args); + void StartCastUdpTransport( + const v8::FunctionCallbackInfo& args); + void StopCastUdpTransport( + const v8::FunctionCallbackInfo& args); + + // Helper method to call the v8 callback function after a session is + // created. + void CallCreateCallback(scoped_ptr stream1, + scoped_ptr stream2, + scoped_ptr udp_transport); + + // Gets the RTP stream or UDP transport indexed by an ID. + // If not found, returns NULL and throws a V8 exception. + CastRtpStream* GetRtpStreamOrThrow(int stream_id) const; + CastUdpTransport* GetUdpTransportOrThrow(int transport_id) const; + + int last_transport_id_; + + typedef std::map > RtpStreamMap; + RtpStreamMap rtp_stream_map_; + + typedef std::map > UdpTransportMap; + UdpTransportMap udp_transport_map_; + + base::WeakPtrFactory weak_factory_; + + extensions::ScopedPersistent create_callback_; + + DISALLOW_COPY_AND_ASSIGN(CastStreamingNativeHandler); +}; + +} // namespace extensions + +#endif // CHROME_RENDERER_EXTENSIONS_CAST_STREAMING_NATIVE_HANDLER_H_ diff --git a/chrome/renderer/extensions/dispatcher.cc b/chrome/renderer/extensions/dispatcher.cc index 8aefa04..a3414cf 100644 --- a/chrome/renderer/extensions/dispatcher.cc +++ b/chrome/renderer/extensions/dispatcher.cc @@ -99,7 +99,7 @@ #include "v8/include/v8.h" #if defined(ENABLE_WEBRTC) -#include "chrome/renderer/extensions/webrtc_native_handler.h" +#include "chrome/renderer/extensions/cast_streaming_native_handler.h" #endif using blink::WebDataSource; @@ -944,8 +944,8 @@ void Dispatcher::RegisterNativeHandlers(ModuleSystem* module_system, module_system->RegisterNativeHandler("webstore", scoped_ptr(new WebstoreBindings(this, context))); #if defined(ENABLE_WEBRTC) - module_system->RegisterNativeHandler("webrtc_natives", - scoped_ptr(new WebRtcNativeHandler(context))); + module_system->RegisterNativeHandler("cast_streaming_natives", + scoped_ptr(new CastStreamingNativeHandler(context))); #endif } @@ -1024,12 +1024,13 @@ void Dispatcher::PopulateSourceMap() { source_map_.RegisterSource("webRequestInternal", IDR_WEB_REQUEST_INTERNAL_CUSTOM_BINDINGS_JS); #if defined(ENABLE_WEBRTC) + source_map_.RegisterSource("cast.streaming.rtpStream", + IDR_CAST_STREAMING_RTP_STREAM_CUSTOM_BINDINGS_JS); source_map_.RegisterSource("cast.streaming.session", IDR_CAST_STREAMING_SESSION_CUSTOM_BINDINGS_JS); - source_map_.RegisterSource("webrtc.castSendTransport", - IDR_WEBRTC_CAST_SEND_TRANSPORT_CUSTOM_BINDINGS_JS); - source_map_.RegisterSource("webrtc.castUdpTransport", - IDR_WEBRTC_CAST_UDP_TRANSPORT_CUSTOM_BINDINGS_JS); + source_map_.RegisterSource( + "cast.streaming.udpTransport", + IDR_CAST_STREAMING_UDP_TRANSPORT_CUSTOM_BINDINGS_JS); #endif source_map_.RegisterSource("webstore", IDR_WEBSTORE_CUSTOM_BINDINGS_JS); source_map_.RegisterSource("windowControls", IDR_WINDOW_CONTROLS_JS); diff --git a/chrome/renderer/extensions/webrtc_native_handler.cc b/chrome/renderer/extensions/webrtc_native_handler.cc deleted file mode 100644 index ac3bf18..0000000 --- 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 - -#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 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 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& 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 session(new CastSession()); - scoped_ptr stream1( - new CastSendTransport(track1.component(), session)); - scoped_ptr stream2( - new CastSendTransport(track2.component(), session)); - scoped_ptr udp_transport( - new CastUdpTransport(session)); - - create_callback_.reset(args[2].As()); - - 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 stream1, - scoped_ptr stream2, - scoped_ptr 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(stream1.release()); - const int stream2_id = last_transport_id_++; - send_transport_map_[stream2_id] = - linked_ptr(stream2.release()); - const int udp_id = last_transport_id_++; - udp_transport_map_[udp_id] = - linked_ptr(udp_transport.release()); - - v8::Handle 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& 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& 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 caps_value = caps.ToValue(); - scoped_ptr converter(V8ValueConverter::create()); - args.GetReturnValue().Set(converter->ToV8Value( - caps_value.get(), context()->v8_context())); -} - -void WebRtcNativeHandler::StartCastSendTransport( - const v8::FunctionCallbackInfo& 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 converter(V8ValueConverter::create()); - scoped_ptr 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 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& 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& 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& 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 converter(V8ValueConverter::create()); - scoped_ptr 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 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 diff --git a/chrome/renderer/extensions/webrtc_native_handler.h b/chrome/renderer/extensions/webrtc_native_handler.h deleted file mode 100644 index 99d20cc..0000000 --- a/chrome/renderer/extensions/webrtc_native_handler.h +++ /dev/null @@ -1,79 +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. - -#ifndef CHROME_RENDERER_EXTENSIONS_WEBRTC_NATIVE_HANDLER_H_ -#define CHROME_RENDERER_EXTENSIONS_WEBRTC_NATIVE_HANDLER_H_ - -#include - -#include "base/memory/linked_ptr.h" -#include "base/memory/weak_ptr.h" -#include "chrome/renderer/extensions/object_backed_native_handler.h" -#include "chrome/renderer/extensions/scoped_persistent.h" -#include "v8/include/v8.h" - -class CastSendTransport; -class CastUdpTransport; - -namespace extensions { - -class ChromeV8Context; - -// Native code that handle chrome.webrtc custom bindings. -class WebRtcNativeHandler : public ObjectBackedNativeHandler { - public: - explicit WebRtcNativeHandler(ChromeV8Context* context); - virtual ~WebRtcNativeHandler(); - - private: - void CreateCastSession( - const v8::FunctionCallbackInfo& args); - - void DestroyCastSendTransport( - const v8::FunctionCallbackInfo& args); - void CreateParamsCastSendTransport( - const v8::FunctionCallbackInfo& args); - void GetCapsCastSendTransport( - const v8::FunctionCallbackInfo& args); - void StartCastSendTransport( - const v8::FunctionCallbackInfo& args); - void StopCastSendTransport( - const v8::FunctionCallbackInfo& args); - - void DestroyCastUdpTransport( - const v8::FunctionCallbackInfo& args); - void StartCastUdpTransport( - const v8::FunctionCallbackInfo& args); - void StopCastUdpTransport( - const v8::FunctionCallbackInfo& args); - - // Helper method to call the v8 callback function after a session is - // created. - void CallCreateCallback(scoped_ptr stream1, - scoped_ptr stream2, - scoped_ptr udp_transport); - - // Gets the Send or UDP transport indexed by |transport_id|. - // If not found, returns NULL and throws a V8 exception. - CastSendTransport* GetSendTransportOrThrow(int transport_id) const; - CastUdpTransport* GetUdpTransportOrThrow(int transport_id) const; - - int last_transport_id_; - - typedef std::map > SendTransportMap; - SendTransportMap send_transport_map_; - - typedef std::map > UdpTransportMap; - UdpTransportMap udp_transport_map_; - - base::WeakPtrFactory weak_factory_; - - extensions::ScopedPersistent create_callback_; - - DISALLOW_COPY_AND_ASSIGN(WebRtcNativeHandler); -}; - -} // namespace extensions - -#endif // CHROME_RENDERER_EXTENSIONS_WEBRTC_NATIVE_HANDLER_H_ diff --git a/chrome/renderer/media/cast_rtp_stream.cc b/chrome/renderer/media/cast_rtp_stream.cc new file mode 100644 index 0000000..2590232 --- /dev/null +++ b/chrome/renderer/media/cast_rtp_stream.cc @@ -0,0 +1,164 @@ +// 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/media/cast_rtp_stream.h" + +#include "base/logging.h" +#include "chrome/renderer/media/cast_session.h" +#include "chrome/renderer/media/cast_udp_transport.h" +#include "media/cast/cast_config.h" +#include "media/cast/cast_defines.h" +#include "third_party/WebKit/public/platform/WebMediaStreamSource.h" + +using media::cast::AudioSenderConfig; +using media::cast::VideoSenderConfig; + +namespace { +const char kCodecNameOpus[] = "OPUS"; +const char kCodecNameVp8[] = "VP8"; + +CastRtpPayloadParams DefaultOpusPayload() { + CastRtpPayloadParams payload; + payload.payload_type = 111; + payload.codec_name = kCodecNameOpus; + payload.clock_rate = 48000; + payload.channels = 2; + payload.min_bitrate = payload.max_bitrate = + media::cast::kDefaultAudioEncoderBitrate; + return payload; +} + +CastRtpPayloadParams DefaultVp8Payload() { + CastRtpPayloadParams payload; + payload.payload_type = 100; + payload.codec_name = kCodecNameVp8; + payload.clock_rate = 90000; + payload.width = 1280; + payload.height = 720; + payload.min_bitrate = 50 * 1000; + payload.max_bitrate = 2000 * 1000; + return payload; +} + +CastRtpCaps DefaultAudioCaps() { + CastRtpCaps caps; + caps.payloads.push_back(DefaultOpusPayload()); + // TODO(hclam): Fill in |rtcp_features| and |fec_mechanisms|. + return caps; +} + +CastRtpCaps DefaultVideoCaps() { + CastRtpCaps caps; + caps.payloads.push_back(DefaultVp8Payload()); + // TODO(hclam): Fill in |rtcp_features| and |fec_mechanisms|. + return caps; +} + +bool ToAudioSenderConfig(const CastRtpParams& params, + AudioSenderConfig* config) { + if (params.payloads.empty()) + return false; + const CastRtpPayloadParams& payload_params = params.payloads[0]; + config->sender_ssrc = payload_params.ssrc; + config->use_external_encoder = false; + config->frequency = payload_params.clock_rate; + config->channels = payload_params.channels; + config->bitrate = payload_params.max_bitrate; + config->codec = media::cast::kPcm16; + if (payload_params.codec_name == kCodecNameOpus) + config->codec = media::cast::kOpus; + else + return false; + return true; +} + +bool ToVideoSenderConfig(const CastRtpParams& params, + VideoSenderConfig* config) { + if (params.payloads.empty()) + return false; + const CastRtpPayloadParams& payload_params = params.payloads[0]; + config->sender_ssrc = payload_params.ssrc; + config->use_external_encoder = false; + config->width = payload_params.width; + config->height = payload_params.height; + config->min_bitrate = config->start_bitrate = payload_params.min_bitrate; + config->max_bitrate = payload_params.max_bitrate; + if (payload_params.codec_name == kCodecNameVp8) + config->codec = media::cast::kVp8; + else + return false; + return true; +} +} // namespace + +CastCodecSpecificParams::CastCodecSpecificParams() { +} + +CastCodecSpecificParams::~CastCodecSpecificParams() { +} + +CastRtpPayloadParams::CastRtpPayloadParams() + : payload_type(0), + ssrc(0), + clock_rate(0), + max_bitrate(0), + min_bitrate(0), + channels(0), + width(0), + height(0) { +} + +CastRtpPayloadParams::~CastRtpPayloadParams() { +} + +CastRtpCaps::CastRtpCaps() { +} + +CastRtpCaps::~CastRtpCaps() { +} + +CastRtpStream::CastRtpStream( + const blink::WebMediaStreamTrack& track, + const scoped_refptr& session) + : track_(track), + cast_session_(session) { +} + +CastRtpStream::~CastRtpStream() { +} + +CastRtpCaps CastRtpStream::GetCaps() { + if (IsAudio()) + return DefaultAudioCaps(); + else + return DefaultVideoCaps(); +} + +CastRtpParams CastRtpStream::GetParams() { + return params_; +} + +void CastRtpStream::Start(const CastRtpParams& params) { + if (IsAudio()) { + AudioSenderConfig config; + if (!ToAudioSenderConfig(params, &config)) { + DVLOG(1) << "Invalid parameters for audio."; + } + cast_session_->StartAudio(config); + } else { + VideoSenderConfig config; + if (!ToVideoSenderConfig(params, &config)) { + DVLOG(1) << "Invalid parameters for video."; + } + cast_session_->StartVideo(config); + } +} + +void CastRtpStream::Stop() { + NOTIMPLEMENTED(); +} + +bool CastRtpStream::IsAudio() const { + return track_.source().type() == blink::WebMediaStreamSource::TypeAudio; +} diff --git a/chrome/renderer/media/cast_rtp_stream.h b/chrome/renderer/media/cast_rtp_stream.h new file mode 100644 index 0000000..a219234 --- /dev/null +++ b/chrome/renderer/media/cast_rtp_stream.h @@ -0,0 +1,113 @@ +// 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. + +#ifndef CHROME_RENDERER_MEDIA_CAST_RTP_STREAM_H_ +#define CHROME_RENDERER_MEDIA_CAST_RTP_STREAM_H_ + +#include +#include + +#include "base/basictypes.h" +#include "base/memory/ref_counted.h" +#include "third_party/WebKit/public/platform/WebMediaStreamTrack.h" + +class CastSession; + +// A key value pair structure for codec specific parameters. +struct CastCodecSpecificParams { + std::string key; + std::string value; + + CastCodecSpecificParams(); + ~CastCodecSpecificParams(); +}; + +// Defines the basic properties of a payload supported by cast transport. +struct CastRtpPayloadParams { + // RTP specific field that identifies the content type. + int payload_type; + + // RTP specific field to identify a stream. + int ssrc; + + // Update frequency of payload sample. + int clock_rate; + + // Maximum bitrate. + int max_bitrate; + + // Minimum bitrate. + int min_bitrate; + + // Number of audio channels. + int channels; + + // Width and height of the video content. + int width; + int height; + + // Name of the codec used. + std::string codec_name; + + // List of codec specific parameters. + std::vector codec_specific_params; + + CastRtpPayloadParams(); + ~CastRtpPayloadParams(); +}; + +// Defines the capabilities of the transport. +struct CastRtpCaps { + // Defines a list of supported payloads. + std::vector payloads; + + // Names of supported RTCP features. + std::vector rtcp_features; + + // Names of supported FEC (Forward Error Correction) mechanisms. + std::vector fec_mechanisms; + + CastRtpCaps(); + ~CastRtpCaps(); +}; + +typedef CastRtpCaps CastRtpParams; + +// This object represents a RTP stream that encodes and optionally +// encrypt audio or video data from a WebMediaStreamTrack. +// Note that this object does not actually output packets. It allows +// configuration of encoding and RTP parameters and control such a logical +// stream. +class CastRtpStream { + public: + CastRtpStream(const blink::WebMediaStreamTrack& track, + const scoped_refptr& session); + ~CastRtpStream(); + + // Return capabilities currently supported by this transport. + CastRtpCaps GetCaps(); + + // Return parameters set to this transport. + CastRtpParams GetParams(); + + // Begin encoding of media stream and then submit the encoded streams + // to underlying transport. + void Start(const CastRtpParams& params); + + // Stop encoding. + void Stop(); + + private: + // Return true if this track is an audio track. Return false if this + // track is a video track. + bool IsAudio() const; + + blink::WebMediaStreamTrack track_; + const scoped_refptr cast_session_; + CastRtpParams params_; + + DISALLOW_COPY_AND_ASSIGN(CastRtpStream); +}; + +#endif // CHROME_RENDERER_MEDIA_CAST_RTP_STREAM_H_ diff --git a/chrome/renderer/media/cast_send_transport.cc b/chrome/renderer/media/cast_send_transport.cc deleted file mode 100644 index f48d49b..0000000 --- a/chrome/renderer/media/cast_send_transport.cc +++ /dev/null @@ -1,164 +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/media/cast_send_transport.h" - -#include "base/logging.h" -#include "chrome/renderer/media/cast_session.h" -#include "chrome/renderer/media/cast_udp_transport.h" -#include "media/cast/cast_config.h" -#include "media/cast/cast_defines.h" -#include "third_party/WebKit/public/platform/WebMediaStreamSource.h" - -using media::cast::AudioSenderConfig; -using media::cast::VideoSenderConfig; - -namespace { -const char kCodecNameOpus[] = "OPUS"; -const char kCodecNameVp8[] = "VP8"; - -CastRtpPayloadParams DefaultOpusPayload() { - CastRtpPayloadParams payload; - payload.payload_type = 111; - payload.codec_name = kCodecNameOpus; - payload.clock_rate = 48000; - payload.channels = 2; - payload.min_bitrate = payload.max_bitrate = - media::cast::kDefaultAudioEncoderBitrate; - return payload; -} - -CastRtpPayloadParams DefaultVp8Payload() { - CastRtpPayloadParams payload; - payload.payload_type = 100; - payload.codec_name = kCodecNameVp8; - payload.clock_rate = 90000; - payload.width = 1280; - payload.height = 720; - payload.min_bitrate = 50 * 1000; - payload.max_bitrate = 2000 * 1000; - return payload; -} - -CastRtpCaps DefaultAudioCaps() { - CastRtpCaps caps; - caps.payloads.push_back(DefaultOpusPayload()); - // TODO(hclam): Fill in |rtcp_features| and |fec_mechanisms|. - return caps; -} - -CastRtpCaps DefaultVideoCaps() { - CastRtpCaps caps; - caps.payloads.push_back(DefaultVp8Payload()); - // TODO(hclam): Fill in |rtcp_features| and |fec_mechanisms|. - return caps; -} - -bool ToAudioSenderConfig(const CastRtpParams& params, - AudioSenderConfig* config) { - if (params.payloads.empty()) - return false; - const CastRtpPayloadParams& payload_params = params.payloads[0]; - config->sender_ssrc = payload_params.ssrc; - config->use_external_encoder = false; - config->frequency = payload_params.clock_rate; - config->channels = payload_params.channels; - config->bitrate = payload_params.max_bitrate; - config->codec = media::cast::kPcm16; - if (payload_params.codec_name == kCodecNameOpus) - config->codec = media::cast::kOpus; - else - return false; - return true; -} - -bool ToVideoSenderConfig(const CastRtpParams& params, - VideoSenderConfig* config) { - if (params.payloads.empty()) - return false; - const CastRtpPayloadParams& payload_params = params.payloads[0]; - config->sender_ssrc = payload_params.ssrc; - config->use_external_encoder = false; - config->width = payload_params.width; - config->height = payload_params.height; - config->min_bitrate = config->start_bitrate = payload_params.min_bitrate; - config->max_bitrate = payload_params.max_bitrate; - if (payload_params.codec_name == kCodecNameVp8) - config->codec = media::cast::kVp8; - else - return false; - return true; -} -} // namespace - -CastCodecSpecificParams::CastCodecSpecificParams() { -} - -CastCodecSpecificParams::~CastCodecSpecificParams() { -} - -CastRtpPayloadParams::CastRtpPayloadParams() - : payload_type(0), - ssrc(0), - clock_rate(0), - max_bitrate(0), - min_bitrate(0), - channels(0), - width(0), - height(0) { -} - -CastRtpPayloadParams::~CastRtpPayloadParams() { -} - -CastRtpCaps::CastRtpCaps() { -} - -CastRtpCaps::~CastRtpCaps() { -} - -CastSendTransport::CastSendTransport( - const blink::WebMediaStreamTrack& track, - const scoped_refptr& session) - : track_(track), - cast_session_(session) { -} - -CastSendTransport::~CastSendTransport() { -} - -CastRtpCaps CastSendTransport::GetCaps() { - if (IsAudio()) - return DefaultAudioCaps(); - else - return DefaultVideoCaps(); -} - -CastRtpParams CastSendTransport::GetParams() { - return params_; -} - -void CastSendTransport::Start(const CastRtpParams& params) { - if (IsAudio()) { - AudioSenderConfig config; - if (!ToAudioSenderConfig(params, &config)) { - DVLOG(1) << "Invalid parameters for audio."; - } - cast_session_->StartAudio(config); - } else { - VideoSenderConfig config; - if (!ToVideoSenderConfig(params, &config)) { - DVLOG(1) << "Invalid parameters for video."; - } - cast_session_->StartVideo(config); - } -} - -void CastSendTransport::Stop() { - NOTIMPLEMENTED(); -} - -bool CastSendTransport::IsAudio() const { - return track_.source().type() == blink::WebMediaStreamSource::TypeAudio; -} diff --git a/chrome/renderer/media/cast_send_transport.h b/chrome/renderer/media/cast_send_transport.h deleted file mode 100644 index b30f564..0000000 --- a/chrome/renderer/media/cast_send_transport.h +++ /dev/null @@ -1,113 +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. - -#ifndef CHROME_RENDERER_MEDIA_CAST_SEND_TRANSPORT_H_ -#define CHROME_RENDERER_MEDIA_CAST_SEND_TRANSPORT_H_ - -#include -#include - -#include "base/basictypes.h" -#include "base/memory/ref_counted.h" -#include "third_party/WebKit/public/platform/WebMediaStreamTrack.h" - -class CastSession; - -// A key value pair structure for codec specific parameters. -struct CastCodecSpecificParams { - std::string key; - std::string value; - - CastCodecSpecificParams(); - ~CastCodecSpecificParams(); -}; - -// Defines the basic properties of a payload supported by cast transport. -struct CastRtpPayloadParams { - // RTP specific field that identifies the content type. - int payload_type; - - // RTP specific field to identify a stream. - int ssrc; - - // Update frequency of payload sample. - int clock_rate; - - // Maximum bitrate. - int max_bitrate; - - // Minimum bitrate. - int min_bitrate; - - // Number of audio channels. - int channels; - - // Width and height of the video content. - int width; - int height; - - // Name of the codec used. - std::string codec_name; - - // List of codec specific parameters. - std::vector codec_specific_params; - - CastRtpPayloadParams(); - ~CastRtpPayloadParams(); -}; - -// Defines the capabilities of the transport. -struct CastRtpCaps { - // Defines a list of supported payloads. - std::vector payloads; - - // Names of supported RTCP features. - std::vector rtcp_features; - - // Names of supported FEC (Forward Error Correction) mechanisms. - std::vector fec_mechanisms; - - CastRtpCaps(); - ~CastRtpCaps(); -}; - -typedef CastRtpCaps CastRtpParams; - -// This object represents a RTP stream that encodes and optionally -// encrypt audio or video data from a WebMediaStreamTrack. -// Note that this object does not actually output packets. It allows -// configuration of encoding and RTP parameters and control such a logical -// stream. -class CastSendTransport { - public: - CastSendTransport(const blink::WebMediaStreamTrack& track, - const scoped_refptr& session); - ~CastSendTransport(); - - // Return capabilities currently supported by this transport. - CastRtpCaps GetCaps(); - - // Return parameters set to this transport. - CastRtpParams GetParams(); - - // Begin encoding of media stream and then submit the encoded streams - // to underlying transport. - void Start(const CastRtpParams& params); - - // Stop encoding. - void Stop(); - - private: - // Return true if this track is an audio track. Return false if this - // track is a video track. - bool IsAudio() const; - - blink::WebMediaStreamTrack track_; - const scoped_refptr cast_session_; - CastRtpParams params_; - - DISALLOW_COPY_AND_ASSIGN(CastSendTransport); -}; - -#endif // CHROME_RENDERER_MEDIA_CAST_SEND_TRANSPORT_H_ diff --git a/chrome/renderer/resources/extensions/cast_streaming_rtp_stream_custom_bindings.js b/chrome/renderer/resources/extensions/cast_streaming_rtp_stream_custom_bindings.js new file mode 100644 index 0000000..8feb8dd --- /dev/null +++ b/chrome/renderer/resources/extensions/cast_streaming_rtp_stream_custom_bindings.js @@ -0,0 +1,31 @@ +// 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. + +// Custom binding for the Cast Streaming RtpStream API. + +var binding = require('binding').Binding.create('cast.streaming.rtpStream'); +var natives = requireNative('cast_streaming_natives'); + +binding.registerCustomHook(function(bindingsAPI, extensionId) { + var apiFunctions = bindingsAPI.apiFunctions; + + apiFunctions.setHandleRequest('destroy', + function(transportId) { + natives.DestroyCastRtpStream(transportId); + }); + apiFunctions.setHandleRequest('getCaps', + function(transportId) { + return natives.GetCapsCastRtpStream(transportId); + }); + apiFunctions.setHandleRequest('start', + function(transportId, params) { + natives.StartCastRtpStream(transportId, params); + }); + apiFunctions.setHandleRequest('stop', + function(transportId) { + natives.StopCastRtpStream(transportId); + }); +}); + +exports.binding = binding.generate(); diff --git a/chrome/renderer/resources/extensions/cast_streaming_session_custom_bindings.js b/chrome/renderer/resources/extensions/cast_streaming_session_custom_bindings.js index 8455042..c83639c 100644 --- a/chrome/renderer/resources/extensions/cast_streaming_session_custom_bindings.js +++ b/chrome/renderer/resources/extensions/cast_streaming_session_custom_bindings.js @@ -2,10 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// Custom binding for the Cast streaming API. +// Custom binding for the Cast Streaming Session API. var binding = require('binding').Binding.create('cast.streaming.session'); -var natives = requireNative('webrtc_natives'); +var natives = requireNative('cast_streaming_natives'); binding.registerCustomHook(function(bindingsAPI, extensionId) { var apiFunctions = bindingsAPI.apiFunctions; diff --git a/chrome/renderer/resources/extensions/cast_streaming_udp_transport_custom_bindings.js b/chrome/renderer/resources/extensions/cast_streaming_udp_transport_custom_bindings.js new file mode 100644 index 0000000..a29b321 --- /dev/null +++ b/chrome/renderer/resources/extensions/cast_streaming_udp_transport_custom_bindings.js @@ -0,0 +1,22 @@ +// 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. + +// Custom binding for the Cast Streaming UdpTransport API. + +var binding = require('binding').Binding.create('cast.streaming.udpTransport'); +var natives = requireNative('cast_streaming_natives'); + +binding.registerCustomHook(function(bindingsAPI, extensionId) { + var apiFunctions = bindingsAPI.apiFunctions; + + apiFunctions.setHandleRequest('destroy', function(transportId) { + natives.DestroyCastUdpTransport(transportId); + }); + apiFunctions.setHandleRequest('start', + function(transportId, remoteParams) { + natives.StartCastUdpTransport(transportId, remoteParams); + }); +}); + +exports.binding = binding.generate(); diff --git a/chrome/renderer/resources/extensions/webrtc_cast_send_transport_custom_bindings.js b/chrome/renderer/resources/extensions/webrtc_cast_send_transport_custom_bindings.js deleted file mode 100644 index b23e21a..0000000 --- a/chrome/renderer/resources/extensions/webrtc_cast_send_transport_custom_bindings.js +++ /dev/null @@ -1,31 +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. - -// Custom binding for the webrtc custom transport API. - -var binding = require('binding').Binding.create('webrtc.castSendTransport'); -var webrtc = requireNative('webrtc_natives'); - -binding.registerCustomHook(function(bindingsAPI, extensionId) { - var apiFunctions = bindingsAPI.apiFunctions; - - apiFunctions.setHandleRequest('destroy', - function(transportId) { - webrtc.DestroyCastSendTransport(transportId); - }); - apiFunctions.setHandleRequest('getCaps', - function(transportId) { - return webrtc.GetCapsCastSendTransport(transportId); - }); - apiFunctions.setHandleRequest('start', - function(transportId, params) { - webrtc.StartCastSendTransport(transportId, params); - }); - apiFunctions.setHandleRequest('stop', - function(transportId) { - webrtc.StopCastSendTransport(transportId); - }); -}); - -exports.binding = binding.generate(); diff --git a/chrome/renderer/resources/extensions/webrtc_cast_udp_transport_custom_bindings.js b/chrome/renderer/resources/extensions/webrtc_cast_udp_transport_custom_bindings.js deleted file mode 100644 index faf4053..0000000 --- a/chrome/renderer/resources/extensions/webrtc_cast_udp_transport_custom_bindings.js +++ /dev/null @@ -1,22 +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. - -// Custom binding for the webrtc custom transport API. - -var binding = require('binding').Binding.create('webrtc.castUdpTransport'); -var webrtc = requireNative('webrtc_natives'); - -binding.registerCustomHook(function(bindingsAPI, extensionId) { - var apiFunctions = bindingsAPI.apiFunctions; - - apiFunctions.setHandleRequest('destroy', function(transportId) { - webrtc.DestroyCastUdpTransport(transportId); - }); - apiFunctions.setHandleRequest('start', - function(transportId, remoteParams) { - webrtc.StartCastUdpTransport(transportId, remoteParams); - }); -}); - -exports.binding = binding.generate(); diff --git a/chrome/renderer/resources/renderer_resources.grd b/chrome/renderer/resources/renderer_resources.grd index 9e37455..d6d6584 100644 --- a/chrome/renderer/resources/renderer_resources.grd +++ b/chrome/renderer/resources/renderer_resources.grd @@ -51,7 +51,9 @@ without changes to the corresponding grd file. fb9 --> + + @@ -94,8 +96,6 @@ without changes to the corresponding grd file. fb9 --> - - diff --git a/chrome/test/data/extensions/api_test/cast_streaming/basics.html b/chrome/test/data/extensions/api_test/cast_streaming/basics.html new file mode 100644 index 0000000..86106a4 --- /dev/null +++ b/chrome/test/data/extensions/api_test/cast_streaming/basics.html @@ -0,0 +1,6 @@ + + diff --git a/chrome/test/data/extensions/api_test/cast_streaming/basics.js b/chrome/test/data/extensions/api_test/cast_streaming/basics.js new file mode 100644 index 0000000..36c1b64 --- /dev/null +++ b/chrome/test/data/extensions/api_test/cast_streaming/basics.js @@ -0,0 +1,34 @@ +// 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. + +var rtpStream = chrome.cast.streaming.rtpStream; +var tabCapture = chrome.tabCapture; +var udpTransport = chrome.cast.streaming.udpTransport; +var createSession = chrome.cast.streaming.session.create; + +chrome.test.runTests([ + function rtpStreamStart() { + tabCapture.capture({audio: true, video: true}, function(stream) { + console.log("Got MediaStream."); + chrome.test.assertTrue(!!stream); + createSession(stream.getAudioTracks()[0], + stream.getVideoTracks()[0], + function(stream, audioId, videoId, udpId) { + var audioParams = rtpStream.getCaps(audioId); + var videoParams = rtpStream.getCaps(videoId); + rtpStream.start(audioId, audioParams); + rtpStream.start(videoId, videoParams); + rtpStream.stop(audioId); + rtpStream.stop(videoId); + rtpStream.destroy(audioId); + rtpStream.destroy(videoId); + udpTransport.destroy(udpId); + stream.stop(); + chrome.test.assertEq(audioParams.payloads[0].codecName, "OPUS"); + chrome.test.assertEq(videoParams.payloads[0].codecName, "VP8"); + chrome.test.succeed(); + }.bind(null, stream)); + }); + }, +]); diff --git a/chrome/test/data/extensions/api_test/cast_streaming/manifest.json b/chrome/test/data/extensions/api_test/cast_streaming/manifest.json new file mode 100644 index 0000000..a42cb9c --- /dev/null +++ b/chrome/test/data/extensions/api_test/cast_streaming/manifest.json @@ -0,0 +1,8 @@ +{ + "key": "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC8xv6iO+j4kzj1HiBL93+XVJH/CRyAQMUHS/Z0l8nCAzaAFkW/JsNwxJqQhrZspnxLqbQxNncXs6g6bsXAwKHiEs+LSs+bIv0Gc/2ycZdhXJ8GhEsSMakog5dpQd1681c2gLK/8CrAoewE/0GIKhaFcp7a2iZlGh4Am6fgMKy0iQIDAQAB", + "name": "chrome.webrtc.cast", + "version": "0.1", + "manifest_version": 2, + "description": "Tests Cast Mirroring Extensions API.", + "permissions": ["tabCapture", "cast", "cast.streaming"] +} diff --git a/chrome/test/data/extensions/api_test/webrtc_cast/basics.html b/chrome/test/data/extensions/api_test/webrtc_cast/basics.html deleted file mode 100644 index 86106a4..0000000 --- a/chrome/test/data/extensions/api_test/webrtc_cast/basics.html +++ /dev/null @@ -1,6 +0,0 @@ - - diff --git a/chrome/test/data/extensions/api_test/webrtc_cast/basics.js b/chrome/test/data/extensions/api_test/webrtc_cast/basics.js deleted file mode 100644 index ade2470..0000000 --- a/chrome/test/data/extensions/api_test/webrtc_cast/basics.js +++ /dev/null @@ -1,34 +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. - -var sendTransport = chrome.webrtc.castSendTransport; -var tabCapture = chrome.tabCapture; -var udpTransport = chrome.webrtc.castUdpTransport; -var createSession = chrome.cast.streaming.session.create; - -chrome.test.runTests([ - function sendTransportStart() { - tabCapture.capture({audio: true, video: true}, function(stream) { - console.log("Got MediaStream."); - chrome.test.assertTrue(!!stream); - createSession(stream.getAudioTracks()[0], - stream.getVideoTracks()[0], - function(stream, audioId, videoId, udpId) { - var audioParams = sendTransport.getCaps(audioId); - var videoParams = sendTransport.getCaps(videoId); - sendTransport.start(audioId, audioParams); - sendTransport.start(videoId, videoParams); - sendTransport.stop(audioId); - sendTransport.stop(videoId); - sendTransport.destroy(audioId); - sendTransport.destroy(videoId); - udpTransport.destroy(udpId); - stream.stop(); - chrome.test.assertEq(audioParams.payloads[0].codecName, "OPUS"); - chrome.test.assertEq(videoParams.payloads[0].codecName, "VP8"); - chrome.test.succeed(); - }.bind(null, stream)); - }); - }, -]); diff --git a/chrome/test/data/extensions/api_test/webrtc_cast/manifest.json b/chrome/test/data/extensions/api_test/webrtc_cast/manifest.json deleted file mode 100644 index fb001c4..0000000 --- a/chrome/test/data/extensions/api_test/webrtc_cast/manifest.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "key": "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC8xv6iO+j4kzj1HiBL93+XVJH/CRyAQMUHS/Z0l8nCAzaAFkW/JsNwxJqQhrZspnxLqbQxNncXs6g6bsXAwKHiEs+LSs+bIv0Gc/2ycZdhXJ8GhEsSMakog5dpQd1681c2gLK/8CrAoewE/0GIKhaFcp7a2iZlGh4Am6fgMKy0iQIDAQAB", - "name": "chrome.webrtc.cast", - "version": "0.1", - "manifest_version": 2, - "description": "Tests Cast Mirroring Extensions API.", - "permissions": ["webrtc", "tabCapture", "cast", "cast.streaming"] -} diff --git a/extensions/common/permissions/api_permission.h b/extensions/common/permissions/api_permission.h index 347f05e..4aacd02 100644 --- a/extensions/common/permissions/api_permission.h +++ b/extensions/common/permissions/api_permission.h @@ -159,7 +159,6 @@ class APIPermission { kWebRequest, kWebRequestBlocking, kWebRequestInternal, - kWebRtc, kWebrtcAudioPrivate, kWebrtcLoggingPrivate, kWebstorePrivate, -- cgit v1.1