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 #if !defined(GOOGLE_TV) | 32 #if !defined(GOOGLE_TV) |
33 // static | 33 // static |
34 MediaPlayerBridge* MediaPlayerBridge::Create( | 34 MediaPlayerBridge* MediaPlayerBridge::Create( |
35 int player_id, | 35 int player_id, |
36 const GURL& url, | 36 const GURL& url, |
37 bool is_media_source, | 37 bool is_media_source, |
38 const GURL& first_party_for_cookies, | 38 const GURL& first_party_for_cookies, |
39 MediaResourceGetter* resource_getter, | |
40 bool hide_url_log, | 39 bool hide_url_log, |
41 MediaPlayerBridgeManager* manager, | 40 MediaPlayerManager* manager, |
42 const MediaErrorCB& media_error_cb, | 41 const MediaErrorCB& media_error_cb, |
43 const VideoSizeChangedCB& video_size_changed_cb, | 42 const VideoSizeChangedCB& video_size_changed_cb, |
44 const BufferingUpdateCB& buffering_update_cb, | 43 const BufferingUpdateCB& buffering_update_cb, |
45 const MediaMetadataChangedCB& media_prepared_cb, | 44 const MediaMetadataChangedCB& media_prepared_cb, |
46 const PlaybackCompleteCB& playback_complete_cb, | 45 const PlaybackCompleteCB& playback_complete_cb, |
47 const SeekCompleteCB& seek_complete_cb, | 46 const SeekCompleteCB& seek_complete_cb, |
48 const TimeUpdateCB& time_update_cb, | 47 const TimeUpdateCB& time_update_cb, |
49 const MediaInterruptedCB& media_interrupted_cb) { | 48 const MediaInterruptedCB& media_interrupted_cb) { |
50 LOG_IF(WARNING, is_media_source) << "MSE is not supported"; | 49 LOG_IF(WARNING, is_media_source) << "MSE is not supported"; |
51 return new MediaPlayerBridge( | 50 return new MediaPlayerBridge( |
52 player_id, | 51 player_id, |
53 url, | 52 url, |
54 first_party_for_cookies, | 53 first_party_for_cookies, |
55 resource_getter, | |
56 hide_url_log, | 54 hide_url_log, |
57 manager, | 55 manager, |
58 media_error_cb, | 56 media_error_cb, |
59 video_size_changed_cb, | 57 video_size_changed_cb, |
60 buffering_update_cb, | 58 buffering_update_cb, |
61 media_prepared_cb, | 59 media_prepared_cb, |
62 playback_complete_cb, | 60 playback_complete_cb, |
63 seek_complete_cb, | 61 seek_complete_cb, |
64 time_update_cb, | 62 time_update_cb, |
65 media_interrupted_cb); | 63 media_interrupted_cb); |
66 } | 64 } |
67 #endif | 65 #endif |
68 | 66 |
69 MediaPlayerBridge::MediaPlayerBridge( | 67 MediaPlayerBridge::MediaPlayerBridge( |
70 int player_id, | 68 int player_id, |
71 const GURL& url, | 69 const GURL& url, |
72 const GURL& first_party_for_cookies, | 70 const GURL& first_party_for_cookies, |
73 MediaResourceGetter* resource_getter, | |
74 bool hide_url_log, | 71 bool hide_url_log, |
75 MediaPlayerBridgeManager* manager, | 72 MediaPlayerManager* manager, |
76 const MediaErrorCB& media_error_cb, | 73 const MediaErrorCB& media_error_cb, |
77 const VideoSizeChangedCB& video_size_changed_cb, | 74 const VideoSizeChangedCB& video_size_changed_cb, |
78 const BufferingUpdateCB& buffering_update_cb, | 75 const BufferingUpdateCB& buffering_update_cb, |
79 const MediaMetadataChangedCB& media_metadata_changed_cb, | 76 const MediaMetadataChangedCB& media_metadata_changed_cb, |
80 const PlaybackCompleteCB& playback_complete_cb, | 77 const PlaybackCompleteCB& playback_complete_cb, |
81 const SeekCompleteCB& seek_complete_cb, | 78 const SeekCompleteCB& seek_complete_cb, |
82 const TimeUpdateCB& time_update_cb, | 79 const TimeUpdateCB& time_update_cb, |
83 const MediaInterruptedCB& media_interrupted_cb) | 80 const MediaInterruptedCB& media_interrupted_cb) |
84 : media_error_cb_(media_error_cb), | 81 : media_error_cb_(media_error_cb), |
85 video_size_changed_cb_(video_size_changed_cb), | 82 video_size_changed_cb_(video_size_changed_cb), |
86 buffering_update_cb_(buffering_update_cb), | 83 buffering_update_cb_(buffering_update_cb), |
87 media_metadata_changed_cb_(media_metadata_changed_cb), | 84 media_metadata_changed_cb_(media_metadata_changed_cb), |
88 playback_complete_cb_(playback_complete_cb), | 85 playback_complete_cb_(playback_complete_cb), |
89 seek_complete_cb_(seek_complete_cb), | 86 seek_complete_cb_(seek_complete_cb), |
90 media_interrupted_cb_(media_interrupted_cb), | 87 media_interrupted_cb_(media_interrupted_cb), |
91 time_update_cb_(time_update_cb), | 88 time_update_cb_(time_update_cb), |
92 player_id_(player_id), | 89 player_id_(player_id), |
93 prepared_(false), | 90 prepared_(false), |
94 pending_play_(false), | 91 pending_play_(false), |
95 url_(url), | 92 url_(url), |
96 first_party_for_cookies_(first_party_for_cookies), | 93 first_party_for_cookies_(first_party_for_cookies), |
97 hide_url_log_(hide_url_log), | 94 hide_url_log_(hide_url_log), |
98 duration_(base::TimeDelta::FromSeconds(kTemporaryDuration)), | 95 duration_(base::TimeDelta::FromSeconds(kTemporaryDuration)), |
99 width_(0), | 96 width_(0), |
100 height_(0), | 97 height_(0), |
101 can_pause_(true), | 98 can_pause_(true), |
102 can_seek_forward_(true), | 99 can_seek_forward_(true), |
103 can_seek_backward_(true), | 100 can_seek_backward_(true), |
104 manager_(manager), | 101 manager_(manager), |
105 resource_getter_(resource_getter), | |
106 weak_this_(this), | 102 weak_this_(this), |
107 listener_(base::MessageLoopProxy::current(), | 103 listener_(base::MessageLoopProxy::current(), |
108 weak_this_.GetWeakPtr()) { | 104 weak_this_.GetWeakPtr()) { |
109 Initialize(); | 105 Initialize(); |
110 } | 106 } |
111 | 107 |
112 MediaPlayerBridge::~MediaPlayerBridge() { | 108 MediaPlayerBridge::~MediaPlayerBridge() { |
113 Release(); | 109 Release(); |
114 } | 110 } |
115 | 111 |
116 void MediaPlayerBridge::Initialize() { | 112 void MediaPlayerBridge::Initialize() { |
117 if (url_.SchemeIsFile()) { | 113 if (url_.SchemeIsFile()) { |
118 cookies_.clear(); | 114 cookies_.clear(); |
119 ExtractMediaMetadata(url_.spec()); | 115 ExtractMediaMetadata(url_.spec()); |
120 return; | 116 return; |
121 } | 117 } |
122 | 118 |
| 119 media::MediaResourceGetter* resource_getter = |
| 120 manager_->GetMediaResourceGetter(); |
| 121 |
123 if (url_.SchemeIsFileSystem()) { | 122 if (url_.SchemeIsFileSystem()) { |
124 cookies_.clear(); | 123 cookies_.clear(); |
125 resource_getter_->GetPlatformPathFromFileSystemURL(url_, base::Bind( | 124 resource_getter->GetPlatformPathFromFileSystemURL(url_, base::Bind( |
126 &MediaPlayerBridge::ExtractMediaMetadata, weak_this_.GetWeakPtr())); | 125 &MediaPlayerBridge::ExtractMediaMetadata, weak_this_.GetWeakPtr())); |
127 return; | 126 return; |
128 } | 127 } |
129 | 128 |
130 resource_getter_->GetCookies(url_, first_party_for_cookies_, base::Bind( | 129 resource_getter->GetCookies(url_, first_party_for_cookies_, base::Bind( |
131 &MediaPlayerBridge::OnCookiesRetrieved, weak_this_.GetWeakPtr())); | 130 &MediaPlayerBridge::OnCookiesRetrieved, weak_this_.GetWeakPtr())); |
132 } | 131 } |
133 | 132 |
134 void MediaPlayerBridge::CreateMediaPlayer() { | 133 void MediaPlayerBridge::CreateMediaPlayer() { |
135 JNIEnv* env = base::android::AttachCurrentThread(); | 134 JNIEnv* env = base::android::AttachCurrentThread(); |
136 CHECK(env); | 135 CHECK(env); |
137 | 136 |
138 j_media_player_.Reset(JNI_MediaPlayer::Java_MediaPlayer_Constructor(env)); | 137 j_media_player_.Reset(JNI_MediaPlayer::Java_MediaPlayer_Constructor(env)); |
139 | 138 |
140 SetMediaPlayerListener(); | 139 SetMediaPlayerListener(); |
(...skipping 24 matching lines...) Expand all Loading... |
165 CHECK(env); | 164 CHECK(env); |
166 | 165 |
167 JNI_MediaPlayer::Java_MediaPlayer_setSurface( | 166 JNI_MediaPlayer::Java_MediaPlayer_setSurface( |
168 env, j_media_player_.obj(), surface); | 167 env, j_media_player_.obj(), surface); |
169 } | 168 } |
170 | 169 |
171 void MediaPlayerBridge::Prepare() { | 170 void MediaPlayerBridge::Prepare() { |
172 if (j_media_player_.is_null()) | 171 if (j_media_player_.is_null()) |
173 CreateMediaPlayer(); | 172 CreateMediaPlayer(); |
174 if (url_.SchemeIsFileSystem()) { | 173 if (url_.SchemeIsFileSystem()) { |
175 resource_getter_->GetPlatformPathFromFileSystemURL(url_, base::Bind( | 174 manager_->GetMediaResourceGetter()->GetPlatformPathFromFileSystemURL( |
176 &MediaPlayerBridge::SetDataSource, weak_this_.GetWeakPtr())); | 175 url_, base::Bind(&MediaPlayerBridge::SetDataSource, |
| 176 weak_this_.GetWeakPtr())); |
177 } else { | 177 } else { |
178 SetDataSource(url_.spec()); | 178 SetDataSource(url_.spec()); |
179 } | 179 } |
180 } | 180 } |
181 | 181 |
182 void MediaPlayerBridge::SetDataSource(const std::string& url) { | 182 void MediaPlayerBridge::SetDataSource(const std::string& url) { |
183 if (j_media_player_.is_null()) | 183 if (j_media_player_.is_null()) |
184 return; | 184 return; |
185 | 185 |
186 JNIEnv* env = base::android::AttachCurrentThread(); | 186 JNIEnv* env = base::android::AttachCurrentThread(); |
(...skipping 17 matching lines...) Expand all Loading... |
204 media_error_cb_.Run(player_id_, MEDIA_ERROR_FORMAT); | 204 media_error_cb_.Run(player_id_, MEDIA_ERROR_FORMAT); |
205 } | 205 } |
206 } | 206 } |
207 | 207 |
208 void MediaPlayerBridge::OnCookiesRetrieved(const std::string& cookies) { | 208 void MediaPlayerBridge::OnCookiesRetrieved(const std::string& cookies) { |
209 cookies_ = cookies; | 209 cookies_ = cookies; |
210 ExtractMediaMetadata(url_.spec()); | 210 ExtractMediaMetadata(url_.spec()); |
211 } | 211 } |
212 | 212 |
213 void MediaPlayerBridge::ExtractMediaMetadata(const std::string& url) { | 213 void MediaPlayerBridge::ExtractMediaMetadata(const std::string& url) { |
214 resource_getter_->ExtractMediaMetadata( | 214 manager_->GetMediaResourceGetter()->ExtractMediaMetadata( |
215 url, cookies_, base::Bind(&MediaPlayerBridge::OnMediaMetadataExtracted, | 215 url, cookies_, base::Bind(&MediaPlayerBridge::OnMediaMetadataExtracted, |
216 weak_this_.GetWeakPtr())); | 216 weak_this_.GetWeakPtr())); |
217 } | 217 } |
218 | 218 |
219 void MediaPlayerBridge::OnMediaMetadataExtracted( | 219 void MediaPlayerBridge::OnMediaMetadataExtracted( |
220 base::TimeDelta duration, int width, int height, bool success) { | 220 base::TimeDelta duration, int width, int height, bool success) { |
221 if (success) { | 221 if (success) { |
222 duration_ = duration; | 222 duration_ = duration; |
223 width_ = width; | 223 width_ = width; |
224 height_ = height; | 224 height_ = height; |
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
459 NOTREACHED() << "Unexpected ipc received"; | 459 NOTREACHED() << "Unexpected ipc received"; |
460 } | 460 } |
461 | 461 |
462 void MediaPlayerBridge::ReadFromDemuxerAck( | 462 void MediaPlayerBridge::ReadFromDemuxerAck( |
463 const MediaPlayerHostMsg_ReadFromDemuxerAck_Params& params) { | 463 const MediaPlayerHostMsg_ReadFromDemuxerAck_Params& params) { |
464 NOTREACHED() << "Unexpected ipc received"; | 464 NOTREACHED() << "Unexpected ipc received"; |
465 } | 465 } |
466 #endif | 466 #endif |
467 | 467 |
468 } // namespace media | 468 } // namespace media |
OLD | NEW |