diff options
Diffstat (limited to 'chromium/media/base/android/media_player_bridge.cc')
-rw-r--r-- | chromium/media/base/android/media_player_bridge.cc | 109 |
1 files changed, 85 insertions, 24 deletions
diff --git a/chromium/media/base/android/media_player_bridge.cc b/chromium/media/base/android/media_player_bridge.cc index f570bdc8677..0f79c13ad93 100644 --- a/chromium/media/base/android/media_player_bridge.cc +++ b/chromium/media/base/android/media_player_bridge.cc @@ -9,6 +9,7 @@ #include "base/basictypes.h" #include "base/logging.h" #include "base/message_loop/message_loop_proxy.h" +#include "base/strings/string_util.h" #include "jni/MediaPlayerBridge_jni.h" #include "media/base/android/media_player_manager.h" #include "media/base/android/media_resource_getter.h" @@ -45,6 +46,11 @@ MediaPlayerBridge::MediaPlayerBridge( } MediaPlayerBridge::~MediaPlayerBridge() { + if (!j_media_player_bridge_.is_null()) { + JNIEnv* env = base::android::AttachCurrentThread(); + CHECK(env); + Java_MediaPlayerBridge_destroy(env, j_media_player_bridge_.obj()); + } Release(); } @@ -72,7 +78,8 @@ void MediaPlayerBridge::CreateJavaMediaPlayerBridge() { JNIEnv* env = base::android::AttachCurrentThread(); CHECK(env); - j_media_player_bridge_.Reset(Java_MediaPlayerBridge_create(env)); + j_media_player_bridge_.Reset(Java_MediaPlayerBridge_create( + env, reinterpret_cast<intptr_t>(this))); SetMediaPlayerListener(); } @@ -85,6 +92,13 @@ void MediaPlayerBridge::SetJavaMediaPlayerBridge( j_media_player_bridge_.Reset(env, j_media_player_bridge); } +base::android::ScopedJavaLocalRef<jobject> MediaPlayerBridge:: + GetJavaMediaPlayerBridge() { + base::android::ScopedJavaLocalRef<jobject> j_bridge( + j_media_player_bridge_); + return j_bridge; +} + void MediaPlayerBridge::SetMediaPlayerListener() { jobject j_context = base::android::GetApplicationContext(); DCHECK(j_context); @@ -111,8 +125,8 @@ void MediaPlayerBridge::SetVideoSurface(gfx::ScopedJavaSurface surface) { } void MediaPlayerBridge::Prepare() { - if (j_media_player_bridge_.is_null()) - CreateJavaMediaPlayerBridge(); + DCHECK(j_media_player_bridge_.is_null()); + CreateJavaMediaPlayerBridge(); if (url_.SchemeIsFileSystem()) { manager()->GetMediaResourceGetter()->GetPlatformPathFromFileSystemURL( url_, base::Bind(&MediaPlayerBridge::SetDataSource, @@ -137,15 +151,37 @@ void MediaPlayerBridge::SetDataSource(const std::string& url) { jobject j_context = base::android::GetApplicationContext(); DCHECK(j_context); - if (Java_MediaPlayerBridge_setDataSource( + const std::string data_uri_prefix("data:"); + if (StartsWithASCII(url, data_uri_prefix, true)) { + if (!Java_MediaPlayerBridge_setDataUriDataSource( + env, j_media_player_bridge_.obj(), j_context, j_url_string.obj())) { + OnMediaError(MEDIA_ERROR_FORMAT); + } + return; + } + + if (!Java_MediaPlayerBridge_setDataSource( env, j_media_player_bridge_.obj(), j_context, j_url_string.obj(), j_cookies.obj(), hide_url_log_)) { - RequestMediaResourcesFromManager(); - Java_MediaPlayerBridge_prepareAsync( - env, j_media_player_bridge_.obj()); - } else { OnMediaError(MEDIA_ERROR_FORMAT); + return; } + + manager()->RequestMediaResources(player_id()); + if (!Java_MediaPlayerBridge_prepareAsync(env, j_media_player_bridge_.obj())) + OnMediaError(MEDIA_ERROR_FORMAT); +} + +void MediaPlayerBridge::OnDidSetDataUriDataSource(JNIEnv* env, jobject obj, + jboolean success) { + if (!success) { + OnMediaError(MEDIA_ERROR_FORMAT); + return; + } + + manager()->RequestMediaResources(player_id()); + if (!Java_MediaPlayerBridge_prepareAsync(env, j_media_player_bridge_.obj())) + OnMediaError(MEDIA_ERROR_FORMAT); } void MediaPlayerBridge::OnCookiesRetrieved(const std::string& cookies) { @@ -166,7 +202,8 @@ void MediaPlayerBridge::OnMediaMetadataExtracted( width_ = width; height_ = height; } - OnMediaMetadataChanged(duration_, width_, height_, success); + manager()->OnMediaMetadataChanged( + player_id(), duration_, width_, height_, success); } void MediaPlayerBridge::Start() { @@ -219,14 +256,14 @@ int MediaPlayerBridge::GetVideoHeight() { env, j_media_player_bridge_.obj()); } -void MediaPlayerBridge::SeekTo(base::TimeDelta time) { +void MediaPlayerBridge::SeekTo(const base::TimeDelta& timestamp) { // Record the time to seek when OnMediaPrepared() is called. - pending_seek_ = time; + pending_seek_ = timestamp; if (j_media_player_bridge_.is_null()) Prepare(); else if (prepared_) - SeekInternal(time); + SeekInternal(timestamp); } base::TimeDelta MediaPlayerBridge::GetCurrentTime() { @@ -261,7 +298,7 @@ void MediaPlayerBridge::Release() { JNIEnv* env = base::android::AttachCurrentThread(); Java_MediaPlayerBridge_release(env, j_media_player_bridge_.obj()); j_media_player_bridge_.Reset(); - ReleaseMediaResourcesFromManager(); + manager()->ReleaseMediaResources(player_id()); listener_.ReleaseMediaPlayerListenerResources(); } @@ -278,17 +315,29 @@ void MediaPlayerBridge::SetVolume(double volume) { void MediaPlayerBridge::OnVideoSizeChanged(int width, int height) { width_ = width; height_ = height; - MediaPlayerAndroid::OnVideoSizeChanged(width, height); + manager()->OnVideoSizeChanged(player_id(), width, height); +} + +void MediaPlayerBridge::OnMediaError(int error_type) { + manager()->OnError(player_id(), error_type); +} + +void MediaPlayerBridge::OnBufferingUpdate(int percent) { + manager()->OnBufferingUpdate(player_id(), percent); } void MediaPlayerBridge::OnPlaybackComplete() { time_update_timer_.Stop(); - MediaPlayerAndroid::OnPlaybackComplete(); + manager()->OnPlaybackComplete(player_id()); } void MediaPlayerBridge::OnMediaInterrupted() { time_update_timer_.Stop(); - MediaPlayerAndroid::OnMediaInterrupted(); + manager()->OnMediaInterrupted(player_id()); +} + +void MediaPlayerBridge::OnSeekComplete() { + manager()->OnSeekComplete(player_id(), GetCurrentTime()); } void MediaPlayerBridge::OnMediaPrepared() { @@ -307,17 +356,25 @@ void MediaPlayerBridge::OnMediaPrepared() { pending_play_ = false; } - GetAllowedOperations(); - OnMediaMetadataChanged(duration_, width_, height_, true); + UpdateAllowedOperations(); + manager()->OnMediaMetadataChanged( + player_id(), duration_, width_, height_, true); +} + +ScopedJavaLocalRef<jobject> MediaPlayerBridge::GetAllowedOperations() { + JNIEnv* env = base::android::AttachCurrentThread(); + CHECK(env); + + return Java_MediaPlayerBridge_getAllowedOperations( + env, j_media_player_bridge_.obj()); } -void MediaPlayerBridge::GetAllowedOperations() { +void MediaPlayerBridge::UpdateAllowedOperations() { JNIEnv* env = base::android::AttachCurrentThread(); CHECK(env); - ScopedJavaLocalRef<jobject> allowedOperations = - Java_MediaPlayerBridge_getAllowedOperations( - env, j_media_player_bridge_.obj()); + ScopedJavaLocalRef<jobject> allowedOperations = GetAllowedOperations(); + can_pause_ = Java_AllowedOperations_canPause(env, allowedOperations.obj()); can_seek_forward_ = Java_AllowedOperations_canSeekForward( env, allowedOperations.obj()); @@ -332,7 +389,7 @@ void MediaPlayerBridge::StartInternal() { time_update_timer_.Start( FROM_HERE, base::TimeDelta::FromMilliseconds(kTimeUpdateInterval), - this, &MediaPlayerBridge::OnTimeUpdated); + this, &MediaPlayerBridge::OnTimeUpdateTimerFired); } } @@ -342,7 +399,7 @@ void MediaPlayerBridge::PauseInternal() { time_update_timer_.Stop(); } -void MediaPlayerBridge::PendingSeekInternal(base::TimeDelta time) { +void MediaPlayerBridge::PendingSeekInternal(const base::TimeDelta& time) { SeekInternal(time); } @@ -364,6 +421,10 @@ void MediaPlayerBridge::SeekInternal(base::TimeDelta time) { env, j_media_player_bridge_.obj(), time_msec); } +void MediaPlayerBridge::OnTimeUpdateTimerFired() { + manager()->OnTimeUpdate(player_id(), GetCurrentTime()); +} + bool MediaPlayerBridge::RegisterMediaPlayerBridge(JNIEnv* env) { bool ret = RegisterNativesImpl(env); DCHECK(g_MediaPlayerBridge_clazz); |