summaryrefslogtreecommitdiff
path: root/chromium/media/base/android/media_player_bridge.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/media/base/android/media_player_bridge.cc')
-rw-r--r--chromium/media/base/android/media_player_bridge.cc109
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);