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 {
}
MediaPlayerAndroid* BrowserMediaPlayerManager::CreateMediaPlayer(
MediaPlayerHostMsg_Initialize_Type type,
int player_id,
const GURL& url,
const GURL& first_party_for_cookies,
int demuxer_client_id,
const MediaPlayerHostMsg_Initialize_Params& media_player_params,
bool hide_url_log,
MediaPlayerManager* manager,
BrowserDemuxerAndroid* demuxer) {
switch (type) {
switch (media_player_params.type) {
case MEDIA_PLAYER_TYPE_URL: {
const std::string user_agent = GetContentClient()->GetUserAgent();
MediaPlayerBridge* media_player_bridge = new MediaPlayerBridge(
player_id,
url,
first_party_for_cookies,
media_player_params.player_id,
media_player_params.url,
media_player_params.first_party_for_cookies,
user_agent,
hide_url_log,
manager,
base::Bind(&BrowserMediaPlayerManager::OnMediaResourcesRequested,
weak_ptr_factory_.GetWeakPtr()),
base::Bind(&BrowserMediaPlayerManager::OnMediaResourcesReleased,
weak_ptr_factory_.GetWeakPtr()));
weak_ptr_factory_.GetWeakPtr()),
media_player_params.frame_url);
BrowserMediaPlayerManager* browser_media_player_manager =
static_cast<BrowserMediaPlayerManager*>(manager);
ContentViewCoreImpl* content_view_core_impl =
......@@ -92,8 +89,9 @@ MediaPlayerAndroid* BrowserMediaPlayerManager::CreateMediaPlayer(
// TODO(qinmin): extract the metadata once the user decided to load
// the page.
browser_media_player_manager->OnMediaMetadataChanged(
player_id, base::TimeDelta(), 0, 0, false);
} else if (!content_view_core_impl->ShouldBlockMediaRequest(url)) {
media_player_params.player_id, base::TimeDelta(), 0, 0, false);
} else if (!content_view_core_impl->ShouldBlockMediaRequest(
media_player_params.url)) {
media_player_bridge->Initialize();
}
return media_player_bridge;
......@@ -101,13 +99,14 @@ MediaPlayerAndroid* BrowserMediaPlayerManager::CreateMediaPlayer(
case MEDIA_PLAYER_TYPE_MEDIA_SOURCE: {
return new MediaSourcePlayer(
player_id,
media_player_params.player_id,
manager,
base::Bind(&BrowserMediaPlayerManager::OnMediaResourcesRequested,
weak_ptr_factory_.GetWeakPtr()),
base::Bind(&BrowserMediaPlayerManager::OnMediaResourcesReleased,
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) {
}
void BrowserMediaPlayerManager::OnInitialize(
MediaPlayerHostMsg_Initialize_Type type,
int player_id,
const GURL& url,
const GURL& first_party_for_cookies,
int demuxer_client_id) {
DCHECK(type != MEDIA_PLAYER_TYPE_MEDIA_SOURCE || demuxer_client_id > 0)
const MediaPlayerHostMsg_Initialize_Params& media_player_params) {
DCHECK(media_player_params.type != MEDIA_PLAYER_TYPE_MEDIA_SOURCE ||
media_player_params.demuxer_client_id > 0)
<< "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*>(
web_contents()->GetRenderProcessHost());
MediaPlayerAndroid* player = CreateMediaPlayer(
type, player_id, url, first_party_for_cookies, demuxer_client_id,
media_player_params,
host->GetBrowserContext()->IsOffTheRecord(), this,
host->browser_demuxer_android());
if (!player)
return;
......
......@@ -23,6 +23,8 @@ namespace media {
class DemuxerAndroid;
}
struct MediaPlayerHostMsg_Initialize_Params;
namespace content {
class BrowserDemuxerAndroid;
class ContentViewCoreImpl;
......@@ -96,11 +98,7 @@ class CONTENT_EXPORT BrowserMediaPlayerManager
virtual void OnEnterFullscreen(int player_id);
virtual void OnExitFullscreen(int player_id);
virtual void OnInitialize(
MediaPlayerHostMsg_Initialize_Type type,
int player_id,
const GURL& url,
const GURL& first_party_for_cookies,
int demuxer_client_id);
const MediaPlayerHostMsg_Initialize_Params& media_player_params);
virtual void OnStart(int player_id);
virtual void OnSeek(int player_id, const base::TimeDelta& time);
virtual void OnPause(int player_id, bool is_media_related_action);
......@@ -141,11 +139,7 @@ class CONTENT_EXPORT BrowserMediaPlayerManager
private:
// Constructs a MediaPlayerAndroid object.
media::MediaPlayerAndroid* CreateMediaPlayer(
MediaPlayerHostMsg_Initialize_Type type,
int player_id,
const GURL& url,
const GURL& first_party_for_cookies,
int demuxer_client_id,
const MediaPlayerHostMsg_Initialize_Params& media_player_params,
bool hide_url_log,
media::MediaPlayerManager* manager,
BrowserDemuxerAndroid* demuxer);
......
......@@ -62,6 +62,17 @@ IPC_STRUCT_TRAITS_END()
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:
// 1. Renderer->Browser MediaPlayerHostMsg_Seek
// This is the beginning of actual seek flow in response to web app requests
......@@ -198,21 +209,10 @@ IPC_MESSAGE_ROUTED0(MediaPlayerMsg_PauseVideo)
IPC_MESSAGE_ROUTED1(MediaPlayerHostMsg_DestroyMediaPlayer,
int /* player_id */)
// Initialize a media player object with the given type and player_id. The other
// parameters are used depending on the type of player.
//
// url: the URL to load when initializing a URL player.
//
// 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 */)
// Initialize a media player object.
IPC_MESSAGE_ROUTED1(
MediaPlayerHostMsg_Initialize,
MediaPlayerHostMsg_Initialize_Params);
// Pause the player.
IPC_MESSAGE_ROUTED2(MediaPlayerHostMsg_Pause,
......
......@@ -127,7 +127,7 @@ public class DOMUtils {
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)
throws InterruptedException, TimeoutException {
StringBuilder sb = new StringBuilder();
......
......@@ -66,10 +66,18 @@ void RendererMediaPlayerManager::Initialize(
int player_id,
const GURL& url,
const GURL& first_party_for_cookies,
int demuxer_client_id) {
Send(new MediaPlayerHostMsg_Initialize(
routing_id(), type, player_id, url, first_party_for_cookies,
demuxer_client_id));
int demuxer_client_id,
const GURL& frame_url) {
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) {
......
......@@ -23,8 +23,9 @@ namespace gfx {
class RectF;
}
namespace content {
struct MediaPlayerHostMsg_Initialize_Params;
namespace content {
class WebMediaPlayerAndroid;
// Class for managing all the WebMediaPlayerAndroid objects in the same
......@@ -43,7 +44,8 @@ class RendererMediaPlayerManager : public RenderFrameObserver {
int player_id,
const GURL& url,
const GURL& first_party_for_cookies,
int demuxer_client_id);
int demuxer_client_id,
const GURL& frame_url);
// Starts the player.
void Start(int player_id);
......
......@@ -239,7 +239,8 @@ void WebMediaPlayerAndroid::load(LoadType load_type,
url_ = url;
GURL first_party_url = frame_->document().firstPartyForCookies();
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_))
player_manager_->EnterFullscreen(player_id_, frame_);
......
......@@ -14,11 +14,13 @@ MediaPlayerAndroid::MediaPlayerAndroid(
int player_id,
MediaPlayerManager* manager,
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),
release_media_resources_cb_(release_media_resources_cb),
player_id_(player_id),
manager_(manager) {
manager_(manager),
frame_url_(frame_url) {
}
MediaPlayerAndroid::~MediaPlayerAndroid() {}
......
......@@ -81,11 +81,14 @@ class MEDIA_EXPORT MediaPlayerAndroid {
int player_id() { return player_id_; }
GURL frame_url() { return frame_url_; }
protected:
MediaPlayerAndroid(int player_id,
MediaPlayerManager* manager,
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_; }
......@@ -100,6 +103,9 @@ class MEDIA_EXPORT MediaPlayerAndroid {
// Resource manager for all the media players.
MediaPlayerManager* manager_;
// Url for the frame that contains this player.
GURL frame_url_;
DISALLOW_COPY_AND_ASSIGN(MediaPlayerAndroid);
};
......
......@@ -33,11 +33,13 @@ MediaPlayerBridge::MediaPlayerBridge(
bool hide_url_log,
MediaPlayerManager* manager,
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,
manager,
request_media_resources_cb,
release_media_resources_cb),
release_media_resources_cb,
frame_url),
prepared_(false),
pending_play_(false),
url_(url),
......
......@@ -49,7 +49,8 @@ class MEDIA_EXPORT MediaPlayerBridge : public MediaPlayerAndroid {
bool hide_url_log,
MediaPlayerManager* manager,
const RequestMediaResourcesCB& request_media_resources_cb,
const ReleaseMediaResourcesCB& release_media_resources_cb);
const ReleaseMediaResourcesCB& release_media_resources_cb,
const GURL& frame_url);
virtual ~MediaPlayerBridge();
// Initialize this object and extract the metadata from the media.
......
......@@ -28,11 +28,13 @@ MediaSourcePlayer::MediaSourcePlayer(
MediaPlayerManager* manager,
const RequestMediaResourcesCB& request_media_resources_cb,
const ReleaseMediaResourcesCB& release_media_resources_cb,
scoped_ptr<DemuxerAndroid> demuxer)
scoped_ptr<DemuxerAndroid> demuxer,
const GURL& frame_url)
: MediaPlayerAndroid(player_id,
manager,
request_media_resources_cb,
release_media_resources_cb),
release_media_resources_cb,
frame_url),
demuxer_(demuxer.Pass()),
pending_event_(NO_EVENT_PENDING),
playing_(false),
......
......@@ -42,7 +42,8 @@ class MEDIA_EXPORT MediaSourcePlayer : public MediaPlayerAndroid,
MediaPlayerManager* manager,
const RequestMediaResourcesCB& request_media_resources_cb,
const ReleaseMediaResourcesCB& release_media_resources_cb,
scoped_ptr<DemuxerAndroid> demuxer);
scoped_ptr<DemuxerAndroid> demuxer,
const GURL& frame_url);
virtual ~MediaSourcePlayer();
// MediaPlayerAndroid implementation.
......
......@@ -167,7 +167,8 @@ class MediaSourcePlayerTest : public testing::Test {
base::Unretained(&manager_)),
base::Bind(&MockMediaPlayerManager::OnMediaResourcesReleased,
base::Unretained(&manager_)),
scoped_ptr<DemuxerAndroid>(demuxer_)),
scoped_ptr<DemuxerAndroid>(demuxer_),
GURL()),
decoder_callback_hook_executed_(false),
surface_texture_a_is_next_(true) {}
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