Index: chrome/browser/media/cast_remoting_connector.h |
diff --git a/chrome/browser/media/cast_remoting_connector.h b/chrome/browser/media/cast_remoting_connector.h |
index 9fb6d8278aaf2b091c61504ba7ef76f1dcb4c1b6..a332fe4631db6145fab4a410a2514edd96ceb149 100644 |
--- a/chrome/browser/media/cast_remoting_connector.h |
+++ b/chrome/browser/media/cast_remoting_connector.h |
@@ -9,21 +9,30 @@ |
#include "base/memory/weak_ptr.h" |
#include "base/supports_user_data.h" |
-#include "chrome/browser/media/router/media_routes_observer.h" |
-#include "chrome/common/media_router/route_message.h" |
+#include "media/mojo/interfaces/mirror_service_remoting.mojom.h" |
#include "media/mojo/interfaces/remoting.mojom.h" |
+#include "mojo/public/cpp/bindings/strong_binding.h" |
namespace content { |
class RenderFrameHost; |
class WebContents; |
} |
+namespace media_router { |
+class MediaRouter; |
+} |
+ |
// CastRemotingConnector connects a single source (a media element in a render |
// frame) with a single sink (a media player in a remote device). There is one |
// instance of a CastRemotingConnector per source WebContents (representing a |
// collection of render frames), and it is created on-demand. The source in the |
// render process represents itself by providing a media::mojom::RemotingSource |
-// service instance. The sink is represented by the Media Router Cast Provider. |
+// service instance. The sink is represented by a MediaRemoter in Media Route |
imcheng
2017/06/22 01:13:27
The MR extension is desktop-specific. How about "
xjz
2017/06/23 19:02:41
Done.
|
+// extension, which handles the communication with the remote device. The |
+// CastRemotingConnector and the MediaRemoter are connected when a sink that is |
+// capable of remoting is available. Once connected, they can communicate with |
+// each other through the media::mojom::MirrorServiceRemoter and |
+// media::mojom::MirrorServiceRemotingSource interfaces. |
// |
// Whenever a candidate media source is created in a render frame, |
// ChromeContentBrowserClient will call CreateMediaRemoter() to instantiate a |
@@ -33,38 +42,35 @@ class WebContents; |
// notify when a sink becomes available for remoting, and to pass binary |
// messages from the sink back to the source. |
// |
-// At any time before or after the CastRemotingConnector is created, the |
-// Media Router Cast Provider may create a tab remoting media route. This |
-// indicates that the provider has found a sink that is capable of remoting and |
-// is available for use. At this point, CastRemotingConnector notifies all |
-// RemotingSources that a sink is available, and some time later a |
-// RemotingSource can request the start of a remoting session. Once the sink is |
-// no longer available, the provider terminates the route and |
-// CastRemotingConnector notifies all RemotingSources that the sink is gone. |
+// When the CastRemotingConnector is created, it will register itself in the |
+// media_router::MediaRouterMojoImpl with the tab ID. When a mirroring route is |
imcheng
2017/06/22 01:13:27
s/MojoImpl//
xjz
2017/06/23 19:02:41
Done.
|
+// created and avilable for remoting, a MediaRemoter is created and started in |
+// the extension, and it notifies the media_router::MediaRouterMojoImpl through |
imcheng
2017/06/22 01:13:27
ditto for "extension". How about something along t
xjz
2017/06/23 19:02:41
Done.
|
+// the MediaRouter mojo interface, and connects to the CastRemotingConnector |
+// with the same source tab Id. At this point, the CastRemotingConnector can |
+// compunicate with the MediaRemoter. When CastRemotingConnector gets notified |
imcheng
2017/06/22 01:13:27
typo in "communicate"
xjz
2017/06/23 19:02:41
Done.
|
+// that a sink is available, it notifies all RemotingSources, and some time |
+// later a RemotingSource can request the start of a remoting session. |
// |
// Note that only one RemotingSource can remote media at a time. Therefore, |
// CastRemotingConnector must mediate among simultaneous requests for media |
// remoting, and only allow one at a time. Currently, the policy is "first come, |
// first served." |
// |
-// When starting a remoting session, the CastRemotingConnector sends control |
-// messages to the Cast Provider. These control messages direct the provider to |
-// start/stop remoting with the remote device (e.g., launching apps or services |
-// on the remote device). Among its other duties, the provider will also set up |
-// a Cast Streaming session to provide a bitstream transport for the media. Once |
-// this is done, the provider sends notification messages back to |
-// CastRemotingConnector to acknowledge this. Then, CastRemotingConnector knows |
-// it can look-up and pass the mojo data pipe handles to CastRemotingSenders, |
-// and the remoting session will be fully active. The CastRemotingConnector is |
-// responsible for passing small binary messages between the source and sink, |
-// while the CastRemotingSender handles the high-volume media data transfer. |
+// When starting a remoting session, the MediaRemoter will also set up a Cast |
+// Streaming session to provide a bitstream transport for the media. Once this |
+// is done, the MediaRemoter notifies the CastRemotingConnector. Then, |
+// CastRemotingConnector knows it can look-up and pass the mojo data pipe |
+// handles to CastRemotingSenders, and the remoting session will be fully active |
+// The CastRemotingConnector is responsible for passing small binary messages |
+// between the source and sink, while the CastRemotingSender handles the |
+// high-volume media data transfer. |
// |
// Please see the unit tests in cast_remoting_connector_unittest.cc as a |
-// reference for how CastRemotingConnector and a Cast Provider interact to |
+// reference for how CastRemotingConnector and a MediaRemoter interact to |
// start/execute/stop remoting sessions. |
-class CastRemotingConnector |
- : public base::SupportsUserData::Data, |
- public media_router::MediaRoutesObserver { |
+class CastRemotingConnector : public base::SupportsUserData::Data, |
imcheng
2017/06/22 01:13:27
Was it a deliberate decision to not put this class
xjz
2017/06/23 19:02:41
It sgtm to put this class under the cast namespace
|
+ public media::mojom::MirrorServiceRemotingSource { |
public: |
~CastRemotingConnector() final; |
@@ -78,6 +84,13 @@ class CastRemotingConnector |
media::mojom::RemotingSourcePtr source, |
media::mojom::RemoterRequest request); |
+ // Called when a MediaRemoter is created and started in extension. This call |
+ // connects the CastRemotingConnector with the MediaRemoter in extension. |
+ // Remoting sessions can only be started after this is called. |
+ void ConnectToService( |
+ media::mojom::MirrorServiceRemotingSourceRequest source_request, |
+ media::mojom::MirrorServiceRemoterPtr remoter); |
+ |
private: |
// Allow unit tests access to the private constructor and CreateBridge() |
// method, since unit tests don't have a complete browser (i.e., with a |
@@ -91,15 +104,9 @@ class CastRemotingConnector |
// mojo message pipe. |
class RemotingBridge; |
- // A RouteMessageObserver for the remoting route that passes messages from the |
- // Cast Provider back to this connector. An instance of this class only exists |
- // while a remoting route is available, and is owned by CastRemotingConnector. |
- class MessageObserver; |
- |
- // Main constructor. |media_source_id| refers to any remoted content managed |
+ // Main constructor. |tab_id| refers to any remoted content managed |
// by this instance (i.e., any remoted content from one tab/WebContents). |
- CastRemotingConnector(media_router::MediaRouter* router, |
- const media_router::MediaSource::Id& media_source_id); |
+ CastRemotingConnector(media_router::MediaRouter* router, int32_t tab_id); |
// Creates a RemotingBridge that implements the requested Remoter service, and |
// binds it to the interface |request|. |
@@ -113,6 +120,17 @@ class CastRemotingConnector |
void DeregisterBridge(RemotingBridge* bridge, |
media::mojom::RemotingStopReason reason); |
+ // media::mojom::MirrorServiceRemotingSource implementations. |
+ void OnSinkAvailable( |
+ media::mojom::RemotingSinkCapabilities capabilities) override; |
+ void OnStarted() override; |
+ void OnStartFailed(media::mojom::RemotingStartFailReason reason) override; |
+ void OnMessageFromSink(const std::vector<uint8_t>& message) override; |
+ void OnStopped(media::mojom::RemotingStopReason reason) override; |
+ void OnDataStreamsStarted(int32_t audio_stream_id, |
+ int32_t video_stream_id) override; |
+ void OnError() override; |
+ |
// These methods are called by RemotingBridge to forward media::mojom::Remoter |
// calls from a source through to this connector. They ensure that only one |
// source is allowed to be in a remoting session at a time, and that no source |
@@ -129,35 +147,16 @@ class CastRemotingConnector |
void SendMessageToSink(RemotingBridge* bridge, |
const std::vector<uint8_t>& message); |
- // Send a control message to the Cast Provider. This may or may not succeed, |
- // with the success status reported later via HandleSendMessageResult(). |
- void SendMessageToProvider(const std::string& message); |
- |
- // Called by the current MessageObserver to process messages observed on the |
- // remoting route. There are two types of messages: 1) TEXT notification |
- // messages from the Cast Provider, to report on the current state of a |
- // remoting session between Chrome and the remote device, and 2) BINARY |
- // messages, to be passed directly to the active remoting source during a |
- // remoting session. |
- void ProcessMessagesFromRoute( |
- const std::vector<media_router::RouteMessage>& messages); |
- |
- // Error handlers for message/data sending during an active remoting |
- // session. When a failure occurs, these immediately force-stop remoting. |
- void HandleSendMessageResult(bool success); |
+ // Error handlers for message sending during an active remoting session. When |
+ // a failure occurs, these immediately force-stop remoting. |
void OnDataSendFailed(); |
- // MediaRoutesObserver implementation: Scans |routes| to check whether the |
- // existing remoting route has gone away and/or there is a new remoting route |
- // established, and take the necessary actions to notify sources and/or |
- // shutdown an active remoting session. |
- void OnRoutesUpdated( |
- const std::vector<media_router::MediaRoute>& routes, |
- const std::vector<media_router::MediaRoute::Id>& ignored) final; |
+ // Called when any connection error/lost occurs with the MediaRemoter. |
+ void OnMirrorServiceStopped(); |
- // The MediaSource ID referring to any remoted content managed by this |
- // CastRemotingConnector. |
- const media_router::MediaSource::Id media_source_id_; |
+ media_router::MediaRouter* const media_router_; |
+ |
+ const int32_t tab_id_; |
// Describes the sink's capabilities according to what has been enabled via |
// |features::kMediaRemoting|. These are controlled manually via |
@@ -169,18 +168,6 @@ class CastRemotingConnector |
// set. |
std::set<RemotingBridge*> bridges_; |
- // Created when the Media Router Cast Provider has created a media remoting |
- // route to a sink that supports remoting and is available for use. This |
- // observer simply dispatches messages from the Cast Provider and sink back to |
- // this connector. Once the route is gone, this is reset to null. |
- std::unique_ptr<MessageObserver> message_observer_; |
- |
- // Incremented each time StartRemoting() is called, and used as a "current |
- // session ID" to ensure that control messaging between this connector and the |
- // Cast Provider are referring to the same remoting session. This allows both |
- // this connector and the provider to ignore stale messages. |
- unsigned int session_counter_; |
- |
// When non-null, an active remoting session is taking place, with this |
// pointing to the RemotingBridge being used to communicate with the source. |
RemotingBridge* active_bridge_; |
@@ -192,6 +179,9 @@ class CastRemotingConnector |
media::mojom::RemotingDataStreamSenderRequest pending_audio_sender_request_; |
media::mojom::RemotingDataStreamSenderRequest pending_video_sender_request_; |
+ mojo::Binding<media::mojom::MirrorServiceRemotingSource> binding_; |
+ media::mojom::MirrorServiceRemoterPtr remoter_; |
+ |
// Produces weak pointers that are only valid for the current remoting |
// session. This is used to cancel any outstanding callbacks when a remoting |
// session is stopped. |