// prevent unnecessarily large messages from being passed around, and the sizes
// are somewhat arbitrary as the EME specification doesn't specify any limits.
static const size_t kEmeUuidSize = 16;
-static const size_t kEmeTypeMaximum = 50; // Type is a MIME type.
-static const size_t kEmeInitDataMaximum = 10240; // 10 KB
-static const size_t kEmeResponseMaximum = 10240; // 10 KB
+static const size_t kEmeInitDataMaximum = 64 * 1024; // 64 KB
+static const size_t kEmeResponseMaximum = 64 * 1024; // 64 KB
namespace content {
: WebContentsObserver(WebContents::FromRenderViewHost(render_view_host)),
fullscreen_player_id_(-1),
pending_fullscreen_player_id_(-1),
+ fullscreen_player_is_released_(false),
web_contents_(WebContents::FromRenderViewHost(render_view_host)),
weak_ptr_factory_(this) {
}
IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_Seek, OnSeek)
IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_Pause, OnPause)
IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_SetVolume, OnSetVolume)
+ IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_SetPoster, OnSetPoster)
IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_Release, OnReleaseResources)
IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_DestroyMediaPlayer, OnDestroyPlayer)
IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_DestroyAllMediaPlayers,
IPC_MESSAGE_HANDLER(MediaKeysHostMsg_CreateSession, OnCreateSession)
IPC_MESSAGE_HANDLER(MediaKeysHostMsg_UpdateSession, OnUpdateSession)
IPC_MESSAGE_HANDLER(MediaKeysHostMsg_ReleaseSession, OnReleaseSession)
- IPC_MESSAGE_HANDLER(MediaKeysHostMsg_CancelAllPendingSessionCreations,
- OnCancelAllPendingSessionCreations)
+ IPC_MESSAGE_HANDLER(MediaKeysHostMsg_DestroyCdm, OnDestroyCdm)
#if defined(VIDEO_HOLE)
IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_NotifyExternalSurface,
OnNotifyExternalSurface)
void BrowserMediaPlayerManager::FullscreenPlayerPlay() {
MediaPlayerAndroid* player = GetFullscreenPlayer();
if (player) {
+ if (fullscreen_player_is_released_) {
+ video_view_->OpenVideo();
+ fullscreen_player_is_released_ = false;
+ }
player->Start();
Send(new MediaPlayerMsg_DidMediaPlayerPlay(
routing_id(), fullscreen_player_id_));
if (!player)
return;
if (release_media_player)
- player->Release();
+ ReleaseFullscreenPlayer(player);
else
player->SetVideoSurface(gfx::ScopedJavaSurface());
}
-void BrowserMediaPlayerManager::SuspendFullscreen() {
- MediaPlayerAndroid* player = GetFullscreenPlayer();
- if (player)
- player->SetVideoSurface(gfx::ScopedJavaSurface());
-}
-
-void BrowserMediaPlayerManager::ResumeFullscreen(
- gfx::ScopedJavaSurface surface) {
- MediaPlayerAndroid* player = GetFullscreenPlayer();
- if (player)
- player->SetVideoSurface(surface.Pass());
-}
-
void BrowserMediaPlayerManager::OnTimeUpdate(int player_id,
base::TimeDelta current_time) {
Send(new MediaPlayerMsg_MediaTimeUpdate(
int media_keys_id,
uint32 session_id,
const std::vector<uint8>& message,
- const std::string& destination_url) {
+ const GURL& destination_url) {
Send(new MediaKeysMsg_SessionMessage(
routing_id(), media_keys_id, session_id, message, destination_url));
}
player->SetVolume(volume);
}
+void BrowserMediaPlayerManager::OnSetPoster(int player_id, const GURL& url) {
+ // To be overridden by subclasses.
+}
+
void BrowserMediaPlayerManager::OnReleaseResources(int player_id) {
MediaPlayerAndroid* player = GetPlayer(player_id);
if (player)
player->Release();
+ if (player_id == fullscreen_player_id_)
+ fullscreen_player_is_released_ = true;
#if defined(VIDEO_HOLE)
WebContentsViewAndroid* view =
void BrowserMediaPlayerManager::OnCreateSession(
int media_keys_id,
uint32 session_id,
- const std::string& type,
+ MediaKeysHostMsg_CreateSession_Type content_type,
const std::vector<uint8>& init_data) {
- if (type.length() > kEmeTypeMaximum) {
- OnSessionError(
- media_keys_id, session_id, media::MediaKeys::kUnknownError, 0);
- return;
- }
if (init_data.size() > kEmeInitDataMaximum) {
+ LOG(WARNING) << "InitData for ID: " << media_keys_id
+ << " too long: " << init_data.size();
OnSessionError(
media_keys_id, session_id, media::MediaKeys::kUnknownError, 0);
return;
}
+ // Convert the session content type into a MIME type. "audio" and "video"
+ // don't matter, so using "video" for the MIME type.
+ // Ref:
+ // https://dvcs.w3.org/hg/html-media/raw-file/default/encrypted-media/encrypted-media.html#dom-createsession
+ std::string mime_type;
+ switch (content_type) {
+ case CREATE_SESSION_TYPE_WEBM:
+ mime_type = "video/webm";
+ break;
+ case CREATE_SESSION_TYPE_MP4:
+ mime_type = "video/mp4";
+ break;
+ default:
+ NOTREACHED();
+ return;
+ }
+
if (CommandLine::ForCurrentProcess()
->HasSwitch(switches::kDisableInfobarForProtectedMediaIdentifier)) {
- CreateSessionIfPermitted(media_keys_id, session_id, type, init_data, true);
+ CreateSessionIfPermitted(
+ media_keys_id, session_id, mime_type, init_data, true);
return;
}
weak_ptr_factory_.GetWeakPtr(),
media_keys_id,
session_id,
- type,
+ mime_type,
init_data));
}
}
if (response.size() > kEmeResponseMaximum) {
- DLOG(WARNING) << "Response for ID: " << media_keys_id
- << " too long: " << response.size();
+ LOG(WARNING) << "Response for ID: " << media_keys_id
+ << " too long: " << response.size();
OnSessionError(
media_keys_id, session_id, media::MediaKeys::kUnknownError, 0);
return;
drm_bridge->ReleaseSession(session_id);
}
-void BrowserMediaPlayerManager::OnCancelAllPendingSessionCreations(
- int media_keys_id) {
+void BrowserMediaPlayerManager::OnDestroyCdm(int media_keys_id) {
MediaDrmBridge* drm_bridge = GetDrmBridge(media_keys_id);
if (!drm_bridge) return;
+ CancelAllPendingSessionCreations(media_keys_id);
+ RemoveDrmBridge(media_keys_id);
+}
+
+void BrowserMediaPlayerManager::CancelAllPendingSessionCreations(
+ int media_keys_id) {
BrowserContext* context =
web_contents()->GetRenderProcessHost()->GetBrowserContext();
context->CancelProtectedMediaIdentifierPermissionRequests(media_keys_id);
void BrowserMediaPlayerManager::CreateSessionIfPermitted(
int media_keys_id,
uint32 session_id,
- const std::string& type,
+ const std::string& content_type,
const std::vector<uint8>& init_data,
bool permitted) {
if (!permitted) {
}
media_keys_ids_pending_approval_.erase(media_keys_id);
media_keys_ids_approved_.insert(media_keys_id);
- drm_bridge->CreateSession(session_id, type, &init_data[0], init_data.size());
+
+ if (!drm_bridge->CreateSession(
+ session_id, content_type, &init_data[0], init_data.size())) {
+ return;
+ }
+
+ // TODO(xhwang): Move the following code to OnSessionReady.
// TODO(qinmin): currently |media_keys_id| and player ID are identical.
// This might not be true in the future.
OnProtectedSurfaceRequested(media_keys_id);
}
+void BrowserMediaPlayerManager::ReleaseFullscreenPlayer(
+ MediaPlayerAndroid* player) {
+ player->Release();
+}
+
} // namespace content