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 |