| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "media/base/android/media_player_bridge.h" | 5 #include "media/base/android/media_player_bridge.h" |
| 6 | 6 |
| 7 #include "base/android/jni_android.h" | 7 #include "base/android/jni_android.h" |
| 8 #include "base/android/jni_string.h" | 8 #include "base/android/jni_string.h" |
| 9 #include "base/basictypes.h" | 9 #include "base/basictypes.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| 11 #include "base/message_loop_proxy.h" | 11 #include "base/message_loop_proxy.h" |
| 12 #include "jni/MediaPlayerBridge_jni.h" | 12 #include "jni/MediaPlayerBridge_jni.h" |
| 13 #include "jni/MediaPlayer_jni.h" | 13 #include "jni/MediaPlayer_jni.h" |
| 14 #include "media/base/android/media_player_bridge_manager.h" | 14 #include "media/base/android/media_player_manager.h" |
| 15 #include "media/base/android/media_resource_getter.h" | 15 #include "media/base/android/media_resource_getter.h" |
| 16 | 16 |
| 17 using base::android::ConvertUTF8ToJavaString; | 17 using base::android::ConvertUTF8ToJavaString; |
| 18 using base::android::ScopedJavaLocalRef; | 18 using base::android::ScopedJavaLocalRef; |
| 19 | 19 |
| 20 // Time update happens every 250ms. | 20 // Time update happens every 250ms. |
| 21 static const int kTimeUpdateInterval = 250; | 21 static const int kTimeUpdateInterval = 250; |
| 22 | 22 |
| 23 // Android MediaMetadataRetriever may fail to extract the metadata from the | 23 // Android MediaMetadataRetriever may fail to extract the metadata from the |
| 24 // media under some circumstances. This makes the user unable to perform | 24 // media under some circumstances. This makes the user unable to perform |
| 25 // seek. To solve this problem, we use a temporary duration of 100 seconds when | 25 // seek. To solve this problem, we use a temporary duration of 100 seconds when |
| 26 // the duration is unknown. And we scale the seek position later when duration | 26 // the duration is unknown. And we scale the seek position later when duration |
| 27 // is available. | 27 // is available. |
| 28 static const int kTemporaryDuration = 100; | 28 static const int kTemporaryDuration = 100; |
| 29 | 29 |
| 30 namespace media { | 30 namespace media { |
| 31 | 31 |
| 32 MediaPlayerBridge::MediaPlayerBridge( | 32 MediaPlayerBridge::MediaPlayerBridge( |
| 33 int player_id, | 33 int player_id, |
| 34 const GURL& url, | 34 const GURL& url, |
| 35 const GURL& first_party_for_cookies, | 35 const GURL& first_party_for_cookies, |
| 36 MediaResourceGetter* resource_getter, | |
| 37 bool hide_url_log, | 36 bool hide_url_log, |
| 38 MediaPlayerBridgeManager* manager, | 37 MediaPlayerManager* manager, |
| 39 const MediaErrorCB& media_error_cb, | 38 const MediaErrorCB& media_error_cb, |
| 40 const VideoSizeChangedCB& video_size_changed_cb, | 39 const VideoSizeChangedCB& video_size_changed_cb, |
| 41 const BufferingUpdateCB& buffering_update_cb, | 40 const BufferingUpdateCB& buffering_update_cb, |
| 42 const MediaMetadataChangedCB& media_metadata_changed_cb, | 41 const MediaMetadataChangedCB& media_metadata_changed_cb, |
| 43 const PlaybackCompleteCB& playback_complete_cb, | 42 const PlaybackCompleteCB& playback_complete_cb, |
| 44 const SeekCompleteCB& seek_complete_cb, | 43 const SeekCompleteCB& seek_complete_cb, |
| 45 const TimeUpdateCB& time_update_cb, | 44 const TimeUpdateCB& time_update_cb, |
| 46 const MediaInterruptedCB& media_interrupted_cb) | 45 const MediaInterruptedCB& media_interrupted_cb) |
| 47 : media_error_cb_(media_error_cb), | 46 : media_error_cb_(media_error_cb), |
| 48 video_size_changed_cb_(video_size_changed_cb), | 47 video_size_changed_cb_(video_size_changed_cb), |
| 49 buffering_update_cb_(buffering_update_cb), | 48 buffering_update_cb_(buffering_update_cb), |
| 50 media_metadata_changed_cb_(media_metadata_changed_cb), | 49 media_metadata_changed_cb_(media_metadata_changed_cb), |
| 51 playback_complete_cb_(playback_complete_cb), | 50 playback_complete_cb_(playback_complete_cb), |
| 52 seek_complete_cb_(seek_complete_cb), | 51 seek_complete_cb_(seek_complete_cb), |
| 53 media_interrupted_cb_(media_interrupted_cb), | 52 media_interrupted_cb_(media_interrupted_cb), |
| 54 time_update_cb_(time_update_cb), | 53 time_update_cb_(time_update_cb), |
| 55 player_id_(player_id), | 54 player_id_(player_id), |
| 56 prepared_(false), | 55 prepared_(false), |
| 57 pending_play_(false), | 56 pending_play_(false), |
| 58 url_(url), | 57 url_(url), |
| 59 first_party_for_cookies_(first_party_for_cookies), | 58 first_party_for_cookies_(first_party_for_cookies), |
| 60 hide_url_log_(hide_url_log), | 59 hide_url_log_(hide_url_log), |
| 61 duration_(base::TimeDelta::FromSeconds(kTemporaryDuration)), | 60 duration_(base::TimeDelta::FromSeconds(kTemporaryDuration)), |
| 62 width_(0), | 61 width_(0), |
| 63 height_(0), | 62 height_(0), |
| 64 can_pause_(true), | 63 can_pause_(true), |
| 65 can_seek_forward_(true), | 64 can_seek_forward_(true), |
| 66 can_seek_backward_(true), | 65 can_seek_backward_(true), |
| 67 manager_(manager), | 66 manager_(manager), |
| 68 resource_getter_(resource_getter), | |
| 69 ALLOW_THIS_IN_INITIALIZER_LIST(weak_this_(this)), | 67 ALLOW_THIS_IN_INITIALIZER_LIST(weak_this_(this)), |
| 70 listener_(base::MessageLoopProxy::current(), | 68 listener_(base::MessageLoopProxy::current(), |
| 71 weak_this_.GetWeakPtr()) { | 69 weak_this_.GetWeakPtr()) { |
| 72 Initialize(); | 70 Initialize(); |
| 73 } | 71 } |
| 74 | 72 |
| 75 MediaPlayerBridge::~MediaPlayerBridge() { | 73 MediaPlayerBridge::~MediaPlayerBridge() { |
| 76 Release(); | 74 Release(); |
| 77 } | 75 } |
| 78 | 76 |
| 79 void MediaPlayerBridge::Initialize() { | 77 void MediaPlayerBridge::Initialize() { |
| 80 if (url_.SchemeIsFile()) { | 78 if (url_.SchemeIsFile()) { |
| 81 cookies_.clear(); | 79 cookies_.clear(); |
| 82 ExtractMediaMetadata(url_.spec()); | 80 ExtractMediaMetadata(url_.spec()); |
| 83 return; | 81 return; |
| 84 } | 82 } |
| 85 | 83 |
| 84 media::MediaResourceGetter* resource_getter = |
| 85 manager_->GetMediaResourceGetter(); |
| 86 |
| 86 if (url_.SchemeIsFileSystem()) { | 87 if (url_.SchemeIsFileSystem()) { |
| 87 cookies_.clear(); | 88 cookies_.clear(); |
| 88 resource_getter_->GetPlatformPathFromFileSystemURL(url_, base::Bind( | 89 resource_getter->GetPlatformPathFromFileSystemURL(url_, base::Bind( |
| 89 &MediaPlayerBridge::ExtractMediaMetadata, weak_this_.GetWeakPtr())); | 90 &MediaPlayerBridge::ExtractMediaMetadata, weak_this_.GetWeakPtr())); |
| 90 return; | 91 return; |
| 91 } | 92 } |
| 92 | 93 |
| 93 resource_getter_->GetCookies(url_, first_party_for_cookies_, base::Bind( | 94 resource_getter->GetCookies(url_, first_party_for_cookies_, base::Bind( |
| 94 &MediaPlayerBridge::OnCookiesRetrieved, weak_this_.GetWeakPtr())); | 95 &MediaPlayerBridge::OnCookiesRetrieved, weak_this_.GetWeakPtr())); |
| 95 } | 96 } |
| 96 | 97 |
| 97 void MediaPlayerBridge::CreateMediaPlayer() { | 98 void MediaPlayerBridge::CreateMediaPlayer() { |
| 98 JNIEnv* env = base::android::AttachCurrentThread(); | 99 JNIEnv* env = base::android::AttachCurrentThread(); |
| 99 CHECK(env); | 100 CHECK(env); |
| 100 | 101 |
| 101 j_media_player_.Reset(JNI_MediaPlayer::Java_MediaPlayer_Constructor(env)); | 102 j_media_player_.Reset(JNI_MediaPlayer::Java_MediaPlayer_Constructor(env)); |
| 102 | 103 |
| 103 jobject j_context = base::android::GetApplicationContext(); | 104 jobject j_context = base::android::GetApplicationContext(); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 117 CHECK(env); | 118 CHECK(env); |
| 118 | 119 |
| 119 JNI_MediaPlayer::Java_MediaPlayer_setSurface( | 120 JNI_MediaPlayer::Java_MediaPlayer_setSurface( |
| 120 env, j_media_player_.obj(), surface); | 121 env, j_media_player_.obj(), surface); |
| 121 } | 122 } |
| 122 | 123 |
| 123 void MediaPlayerBridge::Prepare() { | 124 void MediaPlayerBridge::Prepare() { |
| 124 if (j_media_player_.is_null()) | 125 if (j_media_player_.is_null()) |
| 125 CreateMediaPlayer(); | 126 CreateMediaPlayer(); |
| 126 if (url_.SchemeIsFileSystem()) { | 127 if (url_.SchemeIsFileSystem()) { |
| 127 resource_getter_->GetPlatformPathFromFileSystemURL(url_, base::Bind( | 128 manager_->GetMediaResourceGetter()->GetPlatformPathFromFileSystemURL( |
| 128 &MediaPlayerBridge::SetDataSource, weak_this_.GetWeakPtr())); | 129 url_, base::Bind(&MediaPlayerBridge::SetDataSource, |
| 130 weak_this_.GetWeakPtr())); |
| 129 } else { | 131 } else { |
| 130 SetDataSource(url_.spec()); | 132 SetDataSource(url_.spec()); |
| 131 } | 133 } |
| 132 } | 134 } |
| 133 | 135 |
| 134 void MediaPlayerBridge::SetDataSource(const std::string& url) { | 136 void MediaPlayerBridge::SetDataSource(const std::string& url) { |
| 135 if (j_media_player_.is_null()) | 137 if (j_media_player_.is_null()) |
| 136 return; | 138 return; |
| 137 | 139 |
| 138 JNIEnv* env = base::android::AttachCurrentThread(); | 140 JNIEnv* env = base::android::AttachCurrentThread(); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 157 media_error_cb_.Run(player_id_, MEDIA_ERROR_FORMAT); | 159 media_error_cb_.Run(player_id_, MEDIA_ERROR_FORMAT); |
| 158 } | 160 } |
| 159 } | 161 } |
| 160 | 162 |
| 161 void MediaPlayerBridge::OnCookiesRetrieved(const std::string& cookies) { | 163 void MediaPlayerBridge::OnCookiesRetrieved(const std::string& cookies) { |
| 162 cookies_ = cookies; | 164 cookies_ = cookies; |
| 163 ExtractMediaMetadata(url_.spec()); | 165 ExtractMediaMetadata(url_.spec()); |
| 164 } | 166 } |
| 165 | 167 |
| 166 void MediaPlayerBridge::ExtractMediaMetadata(const std::string& url) { | 168 void MediaPlayerBridge::ExtractMediaMetadata(const std::string& url) { |
| 167 resource_getter_->ExtractMediaMetadata( | 169 manager_->GetMediaResourceGetter()->ExtractMediaMetadata( |
| 168 url, cookies_, base::Bind(&MediaPlayerBridge::OnMediaMetadataExtracted, | 170 url, cookies_, base::Bind(&MediaPlayerBridge::OnMediaMetadataExtracted, |
| 169 weak_this_.GetWeakPtr())); | 171 weak_this_.GetWeakPtr())); |
| 170 } | 172 } |
| 171 | 173 |
| 172 void MediaPlayerBridge::OnMediaMetadataExtracted( | 174 void MediaPlayerBridge::OnMediaMetadataExtracted( |
| 173 base::TimeDelta duration, int width, int height, bool success) { | 175 base::TimeDelta duration, int width, int height, bool success) { |
| 174 if (success) { | 176 if (success) { |
| 175 duration_ = duration; | 177 duration_ = duration; |
| 176 width_ = width; | 178 width_ = width; |
| 177 height_ = height; | 179 height_ = height; |
| (...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 391 | 393 |
| 392 bool MediaPlayerBridge::RegisterMediaPlayerBridge(JNIEnv* env) { | 394 bool MediaPlayerBridge::RegisterMediaPlayerBridge(JNIEnv* env) { |
| 393 bool ret = RegisterNativesImpl(env); | 395 bool ret = RegisterNativesImpl(env); |
| 394 DCHECK(g_MediaPlayerBridge_clazz); | 396 DCHECK(g_MediaPlayerBridge_clazz); |
| 395 if (ret) | 397 if (ret) |
| 396 ret = JNI_MediaPlayer::RegisterNativesImpl(env); | 398 ret = JNI_MediaPlayer::RegisterNativesImpl(env); |
| 397 return ret; | 399 return ret; |
| 398 } | 400 } |
| 399 | 401 |
| 400 } // namespace media | 402 } // namespace media |
| OLD | NEW |