Commit 5c060302 authored by maybelle@chromium.org's avatar maybelle@chromium.org

Support casting for embedded YT videos

This is part 1 of the code to start supporting embedded YT for cast. The main
issue is that YT embedded videos need to be identified via the frame that
contains it. This CL sets the frame URL of each video in the MediaPlayerAndroid
object.

Clank downstream piece to come later. 
Min / Aaron: will send you the doc I have that explains this in more detail.

BUG=358573

Committed: https://src.chromium.org/viewvc/chrome?view=rev&revision=277425

Review URL: https://codereview.chromium.org/302453012

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@277879 0039d316-1c4b-4281-b951-d872f2087c98
parent a7a5e4da
...@@ -59,28 +59,25 @@ ContentViewCoreImpl* BrowserMediaPlayerManager::GetContentViewCore() const { ...@@ -59,28 +59,25 @@ ContentViewCoreImpl* BrowserMediaPlayerManager::GetContentViewCore() const {
} }
MediaPlayerAndroid* BrowserMediaPlayerManager::CreateMediaPlayer( MediaPlayerAndroid* BrowserMediaPlayerManager::CreateMediaPlayer(
MediaPlayerHostMsg_Initialize_Type type, const MediaPlayerHostMsg_Initialize_Params& media_player_params,
int player_id,
const GURL& url,
const GURL& first_party_for_cookies,
int demuxer_client_id,
bool hide_url_log, bool hide_url_log,
MediaPlayerManager* manager, MediaPlayerManager* manager,
BrowserDemuxerAndroid* demuxer) { BrowserDemuxerAndroid* demuxer) {
switch (type) { switch (media_player_params.type) {
case MEDIA_PLAYER_TYPE_URL: { case MEDIA_PLAYER_TYPE_URL: {
const std::string user_agent = GetContentClient()->GetUserAgent(); const std::string user_agent = GetContentClient()->GetUserAgent();
MediaPlayerBridge* media_player_bridge = new MediaPlayerBridge( MediaPlayerBridge* media_player_bridge = new MediaPlayerBridge(
player_id, media_player_params.player_id,
url, media_player_params.url,
first_party_for_cookies, media_player_params.first_party_for_cookies,
user_agent, user_agent,
hide_url_log, hide_url_log,
manager, manager,
base::Bind(&BrowserMediaPlayerManager::OnMediaResourcesRequested, base::Bind(&BrowserMediaPlayerManager::OnMediaResourcesRequested,
weak_ptr_factory_.GetWeakPtr()), weak_ptr_factory_.GetWeakPtr()),
base::Bind(&BrowserMediaPlayerManager::OnMediaResourcesReleased, base::Bind(&BrowserMediaPlayerManager::OnMediaResourcesReleased,
weak_ptr_factory_.GetWeakPtr())); weak_ptr_factory_.GetWeakPtr()),
media_player_params.frame_url);
BrowserMediaPlayerManager* browser_media_player_manager = BrowserMediaPlayerManager* browser_media_player_manager =
static_cast<BrowserMediaPlayerManager*>(manager); static_cast<BrowserMediaPlayerManager*>(manager);
ContentViewCoreImpl* content_view_core_impl = ContentViewCoreImpl* content_view_core_impl =
...@@ -92,8 +89,9 @@ MediaPlayerAndroid* BrowserMediaPlayerManager::CreateMediaPlayer( ...@@ -92,8 +89,9 @@ MediaPlayerAndroid* BrowserMediaPlayerManager::CreateMediaPlayer(
// TODO(qinmin): extract the metadata once the user decided to load // TODO(qinmin): extract the metadata once the user decided to load
// the page. // the page.
browser_media_player_manager->OnMediaMetadataChanged( browser_media_player_manager->OnMediaMetadataChanged(
player_id, base::TimeDelta(), 0, 0, false); media_player_params.player_id, base::TimeDelta(), 0, 0, false);
} else if (!content_view_core_impl->ShouldBlockMediaRequest(url)) { } else if (!content_view_core_impl->ShouldBlockMediaRequest(
media_player_params.url)) {
media_player_bridge->Initialize(); media_player_bridge->Initialize();
} }
return media_player_bridge; return media_player_bridge;
...@@ -101,13 +99,14 @@ MediaPlayerAndroid* BrowserMediaPlayerManager::CreateMediaPlayer( ...@@ -101,13 +99,14 @@ MediaPlayerAndroid* BrowserMediaPlayerManager::CreateMediaPlayer(
case MEDIA_PLAYER_TYPE_MEDIA_SOURCE: { case MEDIA_PLAYER_TYPE_MEDIA_SOURCE: {
return new MediaSourcePlayer( return new MediaSourcePlayer(
player_id, media_player_params.player_id,
manager, manager,
base::Bind(&BrowserMediaPlayerManager::OnMediaResourcesRequested, base::Bind(&BrowserMediaPlayerManager::OnMediaResourcesRequested,
weak_ptr_factory_.GetWeakPtr()), weak_ptr_factory_.GetWeakPtr()),
base::Bind(&BrowserMediaPlayerManager::OnMediaResourcesReleased, base::Bind(&BrowserMediaPlayerManager::OnMediaResourcesReleased,
weak_ptr_factory_.GetWeakPtr()), weak_ptr_factory_.GetWeakPtr()),
demuxer->CreateDemuxer(demuxer_client_id)); demuxer->CreateDemuxer(media_player_params.demuxer_client_id),
media_player_params.frame_url);
} }
} }
...@@ -420,23 +419,22 @@ void BrowserMediaPlayerManager::OnExitFullscreen(int player_id) { ...@@ -420,23 +419,22 @@ void BrowserMediaPlayerManager::OnExitFullscreen(int player_id) {
} }
void BrowserMediaPlayerManager::OnInitialize( void BrowserMediaPlayerManager::OnInitialize(
MediaPlayerHostMsg_Initialize_Type type, const MediaPlayerHostMsg_Initialize_Params& media_player_params) {
int player_id, DCHECK(media_player_params.type != MEDIA_PLAYER_TYPE_MEDIA_SOURCE ||
const GURL& url, media_player_params.demuxer_client_id > 0)
const GURL& first_party_for_cookies,
int demuxer_client_id) {
DCHECK(type != MEDIA_PLAYER_TYPE_MEDIA_SOURCE || demuxer_client_id > 0)
<< "Media source players must have positive demuxer client IDs: " << "Media source players must have positive demuxer client IDs: "
<< demuxer_client_id; << media_player_params.demuxer_client_id;
RemovePlayer(player_id); RemovePlayer(media_player_params.player_id);
RenderProcessHostImpl* host = static_cast<RenderProcessHostImpl*>( RenderProcessHostImpl* host = static_cast<RenderProcessHostImpl*>(
web_contents()->GetRenderProcessHost()); web_contents()->GetRenderProcessHost());
MediaPlayerAndroid* player = CreateMediaPlayer( MediaPlayerAndroid* player = CreateMediaPlayer(
type, player_id, url, first_party_for_cookies, demuxer_client_id, media_player_params,
host->GetBrowserContext()->IsOffTheRecord(), this, host->GetBrowserContext()->IsOffTheRecord(), this,
host->browser_demuxer_android()); host->browser_demuxer_android());
if (!player) if (!player)
return; return;
......
...@@ -23,6 +23,8 @@ namespace media { ...@@ -23,6 +23,8 @@ namespace media {
class DemuxerAndroid; class DemuxerAndroid;
} }
struct MediaPlayerHostMsg_Initialize_Params;
namespace content { namespace content {
class BrowserDemuxerAndroid; class BrowserDemuxerAndroid;
class ContentViewCoreImpl; class ContentViewCoreImpl;
...@@ -96,11 +98,7 @@ class CONTENT_EXPORT BrowserMediaPlayerManager ...@@ -96,11 +98,7 @@ class CONTENT_EXPORT BrowserMediaPlayerManager
virtual void OnEnterFullscreen(int player_id); virtual void OnEnterFullscreen(int player_id);
virtual void OnExitFullscreen(int player_id); virtual void OnExitFullscreen(int player_id);
virtual void OnInitialize( virtual void OnInitialize(
MediaPlayerHostMsg_Initialize_Type type, const MediaPlayerHostMsg_Initialize_Params& media_player_params);
int player_id,
const GURL& url,
const GURL& first_party_for_cookies,
int demuxer_client_id);
virtual void OnStart(int player_id); virtual void OnStart(int player_id);
virtual void OnSeek(int player_id, const base::TimeDelta& time); virtual void OnSeek(int player_id, const base::TimeDelta& time);
virtual void OnPause(int player_id, bool is_media_related_action); virtual void OnPause(int player_id, bool is_media_related_action);
...@@ -141,11 +139,7 @@ class CONTENT_EXPORT BrowserMediaPlayerManager ...@@ -141,11 +139,7 @@ class CONTENT_EXPORT BrowserMediaPlayerManager
private: private:
// Constructs a MediaPlayerAndroid object. // Constructs a MediaPlayerAndroid object.
media::MediaPlayerAndroid* CreateMediaPlayer( media::MediaPlayerAndroid* CreateMediaPlayer(
MediaPlayerHostMsg_Initialize_Type type, const MediaPlayerHostMsg_Initialize_Params& media_player_params,
int player_id,
const GURL& url,
const GURL& first_party_for_cookies,
int demuxer_client_id,
bool hide_url_log, bool hide_url_log,
media::MediaPlayerManager* manager, media::MediaPlayerManager* manager,
BrowserDemuxerAndroid* demuxer); BrowserDemuxerAndroid* demuxer);
......
...@@ -62,6 +62,17 @@ IPC_STRUCT_TRAITS_END() ...@@ -62,6 +62,17 @@ IPC_STRUCT_TRAITS_END()
IPC_ENUM_TRAITS(MediaPlayerHostMsg_Initialize_Type) IPC_ENUM_TRAITS(MediaPlayerHostMsg_Initialize_Type)
// Parameters to describe a media player
IPC_STRUCT_BEGIN(MediaPlayerHostMsg_Initialize_Params)
IPC_STRUCT_MEMBER(MediaPlayerHostMsg_Initialize_Type, type)
IPC_STRUCT_MEMBER(base::SharedMemoryHandle, metafile_data_handle)
IPC_STRUCT_MEMBER(int, player_id)
IPC_STRUCT_MEMBER(int, demuxer_client_id)
IPC_STRUCT_MEMBER(GURL, url)
IPC_STRUCT_MEMBER(GURL, first_party_for_cookies)
IPC_STRUCT_MEMBER(GURL, frame_url)
IPC_STRUCT_END()
// Chrome for Android seek message sequence is: // Chrome for Android seek message sequence is:
// 1. Renderer->Browser MediaPlayerHostMsg_Seek // 1. Renderer->Browser MediaPlayerHostMsg_Seek
// This is the beginning of actual seek flow in response to web app requests // This is the beginning of actual seek flow in response to web app requests
...@@ -198,21 +209,10 @@ IPC_MESSAGE_ROUTED0(MediaPlayerMsg_PauseVideo) ...@@ -198,21 +209,10 @@ IPC_MESSAGE_ROUTED0(MediaPlayerMsg_PauseVideo)
IPC_MESSAGE_ROUTED1(MediaPlayerHostMsg_DestroyMediaPlayer, IPC_MESSAGE_ROUTED1(MediaPlayerHostMsg_DestroyMediaPlayer,
int /* player_id */) int /* player_id */)
// Initialize a media player object with the given type and player_id. The other // Initialize a media player object.
// parameters are used depending on the type of player. IPC_MESSAGE_ROUTED1(
// MediaPlayerHostMsg_Initialize,
// url: the URL to load when initializing a URL player. MediaPlayerHostMsg_Initialize_Params);
//
// first_party_for_cookies: the cookie store to use when loading a URL.
//
// demuxer_client_id: the demuxer associated with this player when initializing
// a media source player.
IPC_MESSAGE_ROUTED5(MediaPlayerHostMsg_Initialize,
MediaPlayerHostMsg_Initialize_Type /* type */,
int /* player_id */,
GURL /* url */,
GURL /* first_party_for_cookies */,
int /* demuxer_client_id */)
// Pause the player. // Pause the player.
IPC_MESSAGE_ROUTED2(MediaPlayerHostMsg_Pause, IPC_MESSAGE_ROUTED2(MediaPlayerHostMsg_Pause,
......
...@@ -127,7 +127,7 @@ public class DOMUtils { ...@@ -127,7 +127,7 @@ public class DOMUtils {
return getNodeField("value", viewCore, nodeId); return getNodeField("value", viewCore, nodeId);
} }
private static String getNodeField(String fieldName, final ContentViewCore viewCore, public static String getNodeField(String fieldName, final ContentViewCore viewCore,
String nodeId) String nodeId)
throws InterruptedException, TimeoutException { throws InterruptedException, TimeoutException {
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
......
...@@ -66,10 +66,18 @@ void RendererMediaPlayerManager::Initialize( ...@@ -66,10 +66,18 @@ void RendererMediaPlayerManager::Initialize(
int player_id, int player_id,
const GURL& url, const GURL& url,
const GURL& first_party_for_cookies, const GURL& first_party_for_cookies,
int demuxer_client_id) { int demuxer_client_id,
Send(new MediaPlayerHostMsg_Initialize( const GURL& frame_url) {
routing_id(), type, player_id, url, first_party_for_cookies,
demuxer_client_id)); MediaPlayerHostMsg_Initialize_Params media_player_params;
media_player_params.type = type;
media_player_params.player_id = player_id;
media_player_params.demuxer_client_id = demuxer_client_id;
media_player_params.url = url;
media_player_params.first_party_for_cookies = first_party_for_cookies;
media_player_params.frame_url = frame_url;
Send(new MediaPlayerHostMsg_Initialize(routing_id(), media_player_params));
} }
void RendererMediaPlayerManager::Start(int player_id) { void RendererMediaPlayerManager::Start(int player_id) {
......
...@@ -23,8 +23,9 @@ namespace gfx { ...@@ -23,8 +23,9 @@ namespace gfx {
class RectF; class RectF;
} }
namespace content { struct MediaPlayerHostMsg_Initialize_Params;
namespace content {
class WebMediaPlayerAndroid; class WebMediaPlayerAndroid;
// Class for managing all the WebMediaPlayerAndroid objects in the same // Class for managing all the WebMediaPlayerAndroid objects in the same
...@@ -43,7 +44,8 @@ class RendererMediaPlayerManager : public RenderFrameObserver { ...@@ -43,7 +44,8 @@ class RendererMediaPlayerManager : public RenderFrameObserver {
int player_id, int player_id,
const GURL& url, const GURL& url,
const GURL& first_party_for_cookies, const GURL& first_party_for_cookies,
int demuxer_client_id); int demuxer_client_id,
const GURL& frame_url);
// Starts the player. // Starts the player.
void Start(int player_id); void Start(int player_id);
......
...@@ -239,7 +239,8 @@ void WebMediaPlayerAndroid::load(LoadType load_type, ...@@ -239,7 +239,8 @@ void WebMediaPlayerAndroid::load(LoadType load_type,
url_ = url; url_ = url;
GURL first_party_url = frame_->document().firstPartyForCookies(); GURL first_party_url = frame_->document().firstPartyForCookies();
player_manager_->Initialize( player_manager_->Initialize(
player_type_, player_id_, url, first_party_url, demuxer_client_id); player_type_, player_id_, url, first_party_url, demuxer_client_id,
frame_->document().url());
if (player_manager_->ShouldEnterFullscreen(frame_)) if (player_manager_->ShouldEnterFullscreen(frame_))
player_manager_->EnterFullscreen(player_id_, frame_); player_manager_->EnterFullscreen(player_id_, frame_);
......
...@@ -14,11 +14,13 @@ MediaPlayerAndroid::MediaPlayerAndroid( ...@@ -14,11 +14,13 @@ MediaPlayerAndroid::MediaPlayerAndroid(
int player_id, int player_id,
MediaPlayerManager* manager, MediaPlayerManager* manager,
const RequestMediaResourcesCB& request_media_resources_cb, const RequestMediaResourcesCB& request_media_resources_cb,
const ReleaseMediaResourcesCB& release_media_resources_cb) const ReleaseMediaResourcesCB& release_media_resources_cb,
const GURL& frame_url)
: request_media_resources_cb_(request_media_resources_cb), : request_media_resources_cb_(request_media_resources_cb),
release_media_resources_cb_(release_media_resources_cb), release_media_resources_cb_(release_media_resources_cb),
player_id_(player_id), player_id_(player_id),
manager_(manager) { manager_(manager),
frame_url_(frame_url) {
} }
MediaPlayerAndroid::~MediaPlayerAndroid() {} MediaPlayerAndroid::~MediaPlayerAndroid() {}
......
...@@ -81,11 +81,14 @@ class MEDIA_EXPORT MediaPlayerAndroid { ...@@ -81,11 +81,14 @@ class MEDIA_EXPORT MediaPlayerAndroid {
int player_id() { return player_id_; } int player_id() { return player_id_; }
GURL frame_url() { return frame_url_; }
protected: protected:
MediaPlayerAndroid(int player_id, MediaPlayerAndroid(int player_id,
MediaPlayerManager* manager, MediaPlayerManager* manager,
const RequestMediaResourcesCB& request_media_resources_cb, const RequestMediaResourcesCB& request_media_resources_cb,
const ReleaseMediaResourcesCB& release_media_resources_cb); const ReleaseMediaResourcesCB& release_media_resources_cb,
const GURL& frame_url);
MediaPlayerManager* manager() { return manager_; } MediaPlayerManager* manager() { return manager_; }
...@@ -100,6 +103,9 @@ class MEDIA_EXPORT MediaPlayerAndroid { ...@@ -100,6 +103,9 @@ class MEDIA_EXPORT MediaPlayerAndroid {
// Resource manager for all the media players. // Resource manager for all the media players.
MediaPlayerManager* manager_; MediaPlayerManager* manager_;
// Url for the frame that contains this player.
GURL frame_url_;
DISALLOW_COPY_AND_ASSIGN(MediaPlayerAndroid); DISALLOW_COPY_AND_ASSIGN(MediaPlayerAndroid);
}; };
......
...@@ -33,11 +33,13 @@ MediaPlayerBridge::MediaPlayerBridge( ...@@ -33,11 +33,13 @@ MediaPlayerBridge::MediaPlayerBridge(
bool hide_url_log, bool hide_url_log,
MediaPlayerManager* manager, MediaPlayerManager* manager,
const RequestMediaResourcesCB& request_media_resources_cb, const RequestMediaResourcesCB& request_media_resources_cb,
const ReleaseMediaResourcesCB& release_media_resources_cb) const ReleaseMediaResourcesCB& release_media_resources_cb,
const GURL& frame_url)
: MediaPlayerAndroid(player_id, : MediaPlayerAndroid(player_id,
manager, manager,
request_media_resources_cb, request_media_resources_cb,
release_media_resources_cb), release_media_resources_cb,
frame_url),
prepared_(false), prepared_(false),
pending_play_(false), pending_play_(false),
url_(url), url_(url),
......
...@@ -49,7 +49,8 @@ class MEDIA_EXPORT MediaPlayerBridge : public MediaPlayerAndroid { ...@@ -49,7 +49,8 @@ class MEDIA_EXPORT MediaPlayerBridge : public MediaPlayerAndroid {
bool hide_url_log, bool hide_url_log,
MediaPlayerManager* manager, MediaPlayerManager* manager,
const RequestMediaResourcesCB& request_media_resources_cb, const RequestMediaResourcesCB& request_media_resources_cb,
const ReleaseMediaResourcesCB& release_media_resources_cb); const ReleaseMediaResourcesCB& release_media_resources_cb,
const GURL& frame_url);
virtual ~MediaPlayerBridge(); virtual ~MediaPlayerBridge();
// Initialize this object and extract the metadata from the media. // Initialize this object and extract the metadata from the media.
......
...@@ -28,11 +28,13 @@ MediaSourcePlayer::MediaSourcePlayer( ...@@ -28,11 +28,13 @@ MediaSourcePlayer::MediaSourcePlayer(
MediaPlayerManager* manager, MediaPlayerManager* manager,
const RequestMediaResourcesCB& request_media_resources_cb, const RequestMediaResourcesCB& request_media_resources_cb,
const ReleaseMediaResourcesCB& release_media_resources_cb, const ReleaseMediaResourcesCB& release_media_resources_cb,
scoped_ptr<DemuxerAndroid> demuxer) scoped_ptr<DemuxerAndroid> demuxer,
const GURL& frame_url)
: MediaPlayerAndroid(player_id, : MediaPlayerAndroid(player_id,
manager, manager,
request_media_resources_cb, request_media_resources_cb,
release_media_resources_cb), release_media_resources_cb,
frame_url),
demuxer_(demuxer.Pass()), demuxer_(demuxer.Pass()),
pending_event_(NO_EVENT_PENDING), pending_event_(NO_EVENT_PENDING),
playing_(false), playing_(false),
......
...@@ -42,7 +42,8 @@ class MEDIA_EXPORT MediaSourcePlayer : public MediaPlayerAndroid, ...@@ -42,7 +42,8 @@ class MEDIA_EXPORT MediaSourcePlayer : public MediaPlayerAndroid,
MediaPlayerManager* manager, MediaPlayerManager* manager,
const RequestMediaResourcesCB& request_media_resources_cb, const RequestMediaResourcesCB& request_media_resources_cb,
const ReleaseMediaResourcesCB& release_media_resources_cb, const ReleaseMediaResourcesCB& release_media_resources_cb,
scoped_ptr<DemuxerAndroid> demuxer); scoped_ptr<DemuxerAndroid> demuxer,
const GURL& frame_url);
virtual ~MediaSourcePlayer(); virtual ~MediaSourcePlayer();
// MediaPlayerAndroid implementation. // MediaPlayerAndroid implementation.
......
...@@ -167,7 +167,8 @@ class MediaSourcePlayerTest : public testing::Test { ...@@ -167,7 +167,8 @@ class MediaSourcePlayerTest : public testing::Test {
base::Unretained(&manager_)), base::Unretained(&manager_)),
base::Bind(&MockMediaPlayerManager::OnMediaResourcesReleased, base::Bind(&MockMediaPlayerManager::OnMediaResourcesReleased,
base::Unretained(&manager_)), base::Unretained(&manager_)),
scoped_ptr<DemuxerAndroid>(demuxer_)), scoped_ptr<DemuxerAndroid>(demuxer_),
GURL()),
decoder_callback_hook_executed_(false), decoder_callback_hook_executed_(false),
surface_texture_a_is_next_(true) {} surface_texture_a_is_next_(true) {}
virtual ~MediaSourcePlayerTest() {} virtual ~MediaSourcePlayerTest() {}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment