diff options
author | qinmin@chromium.org <qinmin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-07-04 02:47:47 +0000 |
---|---|---|
committer | qinmin@chromium.org <qinmin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-07-04 02:47:47 +0000 |
commit | f9380385b001d9aaab6b82d4bd01f0bd24cd52a1 (patch) | |
tree | 1ae84eeb88f4c834c6062ceaeec3f3ae828fb618 /media | |
parent | fbc08aa288ecf9ffba63e229a3017dfddda5a28f (diff) | |
download | chromium_src-f9380385b001d9aaab6b82d4bd01f0bd24cd52a1.zip chromium_src-f9380385b001d9aaab6b82d4bd01f0bd24cd52a1.tar.gz chromium_src-f9380385b001d9aaab6b82d4bd01f0bd24cd52a1.tar.bz2 |
Request a protected surface for EME media playback
If |is_video_encrypted_| is true, always request a protected surface from MediaPlayerManager.
If manager denies the request, playback will fail. Otherwise, SetVideoSurface(surface, true) will be called later.
TBR=sievers@chromium.org
BUG=163552
Review URL: https://chromiumcodereview.appspot.com/18591002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@210114 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media')
-rw-r--r-- | media/base/android/media_player_bridge.cc | 2 | ||||
-rw-r--r-- | media/base/android/media_player_manager.h | 3 | ||||
-rw-r--r-- | media/base/android/media_source_player.cc | 10 | ||||
-rw-r--r-- | media/base/android/media_source_player_unittest.cc | 1 |
4 files changed, 14 insertions, 2 deletions
diff --git a/media/base/android/media_player_bridge.cc b/media/base/android/media_player_bridge.cc index 0ada084..a485c8e 100644 --- a/media/base/android/media_player_bridge.cc +++ b/media/base/android/media_player_bridge.cc @@ -133,7 +133,7 @@ void MediaPlayerBridge::SetDuration(base::TimeDelta duration) { void MediaPlayerBridge::SetVideoSurface(gfx::ScopedJavaSurface surface) { if (j_media_player_.is_null()) { - if (surface.IsSurfaceEmpty()) + if (surface.IsEmpty()) return; Prepare(); } diff --git a/media/base/android/media_player_manager.h b/media/base/android/media_player_manager.h index 9a85565..bd39b84 100644 --- a/media/base/android/media_player_manager.h +++ b/media/base/android/media_player_manager.h @@ -114,6 +114,9 @@ class MEDIA_EXPORT MediaPlayerManager { // Get the MediaDrmBridge object for the given media key Id. virtual media::MediaDrmBridge* GetDrmBridge(int media_keys_id) = 0; + // Called by the player to get a hardware protected surface. + virtual void OnProtectedSurfaceRequested(int player_id) = 0; + // TODO(xhwang): The following three methods needs to be decoupled from // MediaPlayerManager to support the W3C Working Draft version of the EME // spec. diff --git a/media/base/android/media_source_player.cc b/media/base/android/media_source_player.cc index 1929f49..6a74188 100644 --- a/media/base/android/media_source_player.cc +++ b/media/base/android/media_source_player.cc @@ -320,6 +320,11 @@ MediaSourcePlayer::~MediaSourcePlayer() { } void MediaSourcePlayer::SetVideoSurface(gfx::ScopedJavaSurface surface) { + // Ignore non-empty surface that is unprotected if |is_video_encrypted_| is + // true. + if (is_video_encrypted_ && !surface.IsEmpty() && !surface.is_protected()) + return; + surface_ = surface.Pass(); pending_event_ |= SURFACE_CHANGE_EVENT_PENDING; if (pending_event_ & SEEK_EVENT_PENDING) { @@ -345,6 +350,9 @@ bool MediaSourcePlayer::Seekable() { void MediaSourcePlayer::Start() { playing_ = true; + if (is_video_encrypted_) + manager()->OnProtectedSurfaceRequested(player_id()); + StartInternal(); } @@ -773,7 +781,7 @@ void MediaSourcePlayer::ConfigureAudioDecoderJob() { } void MediaSourcePlayer::ConfigureVideoDecoderJob() { - if (!HasVideo() || surface_.IsSurfaceEmpty()) { + if (!HasVideo() || surface_.IsEmpty()) { video_decoder_job_.reset(); return; } diff --git a/media/base/android/media_source_player_unittest.cc b/media/base/android/media_source_player_unittest.cc index 4d70fa8..359e095 100644 --- a/media/base/android/media_source_player_unittest.cc +++ b/media/base/android/media_source_player_unittest.cc @@ -58,6 +58,7 @@ class MockMediaPlayerManager : public MediaPlayerManager { virtual media::MediaDrmBridge* GetDrmBridge(int media_keys_id) OVERRIDE { return NULL; } + virtual void OnProtectedSurfaceRequested(int player_id) OVERRIDE {} virtual void OnKeyAdded(int key_id, const std::string& session_id) OVERRIDE {} virtual void OnKeyError(int key_id, |