summaryrefslogtreecommitdiffstats
path: root/media
diff options
context:
space:
mode:
authorqinmin@chromium.org <qinmin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-07-04 02:47:47 +0000
committerqinmin@chromium.org <qinmin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-07-04 02:47:47 +0000
commitf9380385b001d9aaab6b82d4bd01f0bd24cd52a1 (patch)
tree1ae84eeb88f4c834c6062ceaeec3f3ae828fb618 /media
parentfbc08aa288ecf9ffba63e229a3017dfddda5a28f (diff)
downloadchromium_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.cc2
-rw-r--r--media/base/android/media_player_manager.h3
-rw-r--r--media/base/android/media_source_player.cc10
-rw-r--r--media/base/android/media_source_player_unittest.cc1
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,