OLD | NEW |
---|---|
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 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_source_player.h" | 5 #include "media/base/android/media_source_player.h" |
6 | 6 |
7 #include <limits> | 7 #include <limits> |
8 | 8 |
9 #include "base/android/jni_android.h" | 9 #include "base/android/jni_android.h" |
10 #include "base/android/jni_string.h" | 10 #include "base/android/jni_string.h" |
(...skipping 21 matching lines...) Expand all Loading... | |
32 : MediaPlayerAndroid(player_id, | 32 : MediaPlayerAndroid(player_id, |
33 manager, | 33 manager, |
34 on_decoder_resources_released_cb, | 34 on_decoder_resources_released_cb, |
35 frame_url), | 35 frame_url), |
36 demuxer_(demuxer.Pass()), | 36 demuxer_(demuxer.Pass()), |
37 pending_event_(NO_EVENT_PENDING), | 37 pending_event_(NO_EVENT_PENDING), |
38 playing_(false), | 38 playing_(false), |
39 interpolator_(&default_tick_clock_), | 39 interpolator_(&default_tick_clock_), |
40 doing_browser_seek_(false), | 40 doing_browser_seek_(false), |
41 pending_seek_(false), | 41 pending_seek_(false), |
42 drm_bridge_(NULL), | 42 drm_bridge_(nullptr), |
43 cdm_registration_id_(0), | 43 cdm_registration_id_(0), |
44 is_waiting_for_key_(false), | 44 is_waiting_for_key_(false), |
45 key_added_while_decode_pending_(false), | 45 key_added_while_decode_pending_(false), |
46 is_waiting_for_audio_decoder_(false), | 46 is_waiting_for_audio_decoder_(false), |
47 is_waiting_for_video_decoder_(false), | 47 is_waiting_for_video_decoder_(false), |
48 prerolling_(true), | 48 prerolling_(true), |
49 weak_factory_(this) { | 49 weak_factory_(this) { |
50 media_stat_.reset(new MediaStatistics()); | 50 media_stat_.reset(new MediaStatistics()); |
51 | 51 |
52 audio_decoder_job_.reset(new AudioDecoderJob( | 52 audio_decoder_job_.reset(new AudioDecoderJob( |
53 base::Bind(&DemuxerAndroid::RequestDemuxerData, | 53 base::Bind(&DemuxerAndroid::RequestDemuxerData, |
54 base::Unretained(demuxer_.get()), | 54 base::Unretained(demuxer_.get()), |
55 DemuxerStream::AUDIO), | 55 DemuxerStream::AUDIO), |
56 base::Bind(&MediaSourcePlayer::OnDemuxerConfigsChanged, | 56 base::Bind(&MediaSourcePlayer::OnDemuxerConfigsChanged, |
57 weak_factory_.GetWeakPtr()))); | 57 weak_factory_.GetWeakPtr()))); |
58 video_decoder_job_.reset(new VideoDecoderJob( | 58 video_decoder_job_.reset(new VideoDecoderJob( |
59 base::Bind(&DemuxerAndroid::RequestDemuxerData, | 59 base::Bind(&DemuxerAndroid::RequestDemuxerData, |
60 base::Unretained(demuxer_.get()), | 60 base::Unretained(demuxer_.get()), |
61 DemuxerStream::VIDEO), | 61 DemuxerStream::VIDEO), |
62 base::Bind(&MediaSourcePlayer::OnDemuxerConfigsChanged, | 62 base::Bind(&MediaSourcePlayer::OnDemuxerConfigsChanged, |
63 weak_factory_.GetWeakPtr()))); | 63 weak_factory_.GetWeakPtr()))); |
64 | 64 |
65 demuxer_->Initialize(this); | 65 demuxer_->Initialize(this); |
66 interpolator_.SetUpperBound(base::TimeDelta()); | 66 interpolator_.SetUpperBound(base::TimeDelta()); |
67 weak_this_ = weak_factory_.GetWeakPtr(); | 67 weak_this_ = weak_factory_.GetWeakPtr(); |
68 } | 68 } |
69 | 69 |
70 MediaSourcePlayer::~MediaSourcePlayer() { | 70 MediaSourcePlayer::~MediaSourcePlayer() { |
71 Release(); | 71 Release(); |
72 DCHECK_EQ(!drm_bridge_, !cdm_registration_id_); | 72 DCHECK_EQ(!cdm_, !cdm_registration_id_); |
73 if (drm_bridge_) { | 73 if (cdm_) { |
74 drm_bridge_->UnregisterPlayer(cdm_registration_id_); | 74 drm_bridge_->UnregisterPlayer(cdm_registration_id_); |
Tima Vaisburd
2015/10/28 22:49:40
Same consideration as with MediaCodecPlayer: I wou
xhwang
2015/10/29 00:17:28
Done.
| |
75 cdm_registration_id_ = 0; | 75 cdm_registration_id_ = 0; |
76 } | 76 } |
77 } | 77 } |
78 | 78 |
79 void MediaSourcePlayer::SetVideoSurface(gfx::ScopedJavaSurface surface) { | 79 void MediaSourcePlayer::SetVideoSurface(gfx::ScopedJavaSurface surface) { |
80 DVLOG(1) << __FUNCTION__; | 80 DVLOG(1) << __FUNCTION__; |
81 if (!video_decoder_job_->SetVideoSurface(surface.Pass())) | 81 if (!video_decoder_job_->SetVideoSurface(surface.Pass())) |
82 return; | 82 return; |
83 // Retry video decoder creation. | 83 // Retry video decoder creation. |
84 RetryDecoderCreation(false, true); | 84 RetryDecoderCreation(false, true); |
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
266 MediaDrmBridge::JavaObjectPtr /* media_crypto */, | 266 MediaDrmBridge::JavaObjectPtr /* media_crypto */, |
267 bool /* needs_protected_surface */) { | 267 bool /* needs_protected_surface */) { |
268 // Callback parameters are ignored in this player. They are intended for | 268 // Callback parameters are ignored in this player. They are intended for |
269 // MediaCodecPlayer which uses a different threading scheme. | 269 // MediaCodecPlayer which uses a different threading scheme. |
270 DCHECK(!drm_bridge_->GetMediaCrypto().is_null()); | 270 DCHECK(!drm_bridge_->GetMediaCrypto().is_null()); |
271 | 271 |
272 // Retry decoder creation if the decoders are waiting for MediaCrypto. | 272 // Retry decoder creation if the decoders are waiting for MediaCrypto. |
273 RetryDecoderCreation(true, true); | 273 RetryDecoderCreation(true, true); |
274 } | 274 } |
275 | 275 |
276 void MediaSourcePlayer::SetCdm(BrowserCdm* cdm) { | 276 void MediaSourcePlayer::SetCdm(const scoped_refptr<MediaKeys>& cdm) { |
277 DCHECK(cdm); | |
278 | |
277 // Currently we don't support DRM change during the middle of playback, even | 279 // Currently we don't support DRM change during the middle of playback, even |
278 // if the player is paused. | 280 // if the player is paused. |
279 // TODO(qinmin): support DRM change after playback has started. | 281 // TODO(qinmin): support DRM change after playback has started. |
280 // http://crbug.com/253792. | 282 // http://crbug.com/253792. |
281 if (GetCurrentTime() > base::TimeDelta()) { | 283 if (GetCurrentTime() > base::TimeDelta()) { |
282 VLOG(0) << "Setting DRM bridge after playback has started. " | 284 VLOG(0) << "Setting DRM bridge after playback has started. " |
283 << "This is not well supported!"; | 285 << "This is not well supported!"; |
284 } | 286 } |
285 | 287 |
286 if (drm_bridge_) { | 288 if (cdm_) { |
287 NOTREACHED() << "Currently we do not support resetting CDM."; | 289 NOTREACHED() << "Currently we do not support resetting CDM."; |
288 return; | 290 return; |
289 } | 291 } |
290 | 292 |
293 cdm_ = cdm; | |
294 | |
291 // Only MediaDrmBridge will be set on MediaSourcePlayer. | 295 // Only MediaDrmBridge will be set on MediaSourcePlayer. |
292 drm_bridge_ = static_cast<MediaDrmBridge*>(cdm); | 296 drm_bridge_ = static_cast<MediaDrmBridge*>(cdm_.get()); |
293 | 297 |
294 cdm_registration_id_ = drm_bridge_->RegisterPlayer( | 298 cdm_registration_id_ = drm_bridge_->RegisterPlayer( |
295 base::Bind(&MediaSourcePlayer::OnKeyAdded, weak_this_), | 299 base::Bind(&MediaSourcePlayer::OnKeyAdded, weak_this_), |
296 base::Bind(&MediaSourcePlayer::OnCdmUnset, weak_this_)); | 300 base::Bind(&MediaSourcePlayer::OnCdmUnset, weak_this_)); |
297 | 301 |
298 audio_decoder_job_->SetDrmBridge(drm_bridge_); | 302 audio_decoder_job_->SetDrmBridge(drm_bridge_); |
299 video_decoder_job_->SetDrmBridge(drm_bridge_); | 303 video_decoder_job_->SetDrmBridge(drm_bridge_); |
300 | 304 |
301 if (drm_bridge_->GetMediaCrypto().is_null()) { | 305 if (drm_bridge_->GetMediaCrypto().is_null()) { |
306 // Use BindToCurrentLoop to avoid reentrancy. | |
302 MediaDrmBridge::MediaCryptoReadyCB cb = BindToCurrentLoop( | 307 MediaDrmBridge::MediaCryptoReadyCB cb = BindToCurrentLoop( |
303 base::Bind(&MediaSourcePlayer::OnMediaCryptoReady, weak_this_)); | 308 base::Bind(&MediaSourcePlayer::OnMediaCryptoReady, weak_this_)); |
304 drm_bridge_->SetMediaCryptoReadyCB(cb); | 309 drm_bridge_->SetMediaCryptoReadyCB(cb); |
305 return; | 310 return; |
306 } | 311 } |
307 | 312 |
308 // If the player is previously waiting for CDM, retry decoder creation. | 313 // If the player is previously waiting for CDM, retry decoder creation. |
309 RetryDecoderCreation(true, true); | 314 RetryDecoderCreation(true, true); |
310 } | 315 } |
311 | 316 |
(...skipping 518 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
830 key_added_while_decode_pending_ = false; | 835 key_added_while_decode_pending_ = false; |
831 | 836 |
832 // StartInternal() will trigger a prefetch, where in most cases we'll just | 837 // StartInternal() will trigger a prefetch, where in most cases we'll just |
833 // use previously received data. | 838 // use previously received data. |
834 if (playing_) | 839 if (playing_) |
835 StartInternal(); | 840 StartInternal(); |
836 } | 841 } |
837 | 842 |
838 void MediaSourcePlayer::OnCdmUnset() { | 843 void MediaSourcePlayer::OnCdmUnset() { |
839 DVLOG(1) << __FUNCTION__; | 844 DVLOG(1) << __FUNCTION__; |
840 DCHECK(drm_bridge_); | 845 DCHECK(cdm_); |
841 // TODO(xhwang): Currently this is only called during teardown. Support full | 846 // TODO(xhwang): Currently this is only called during teardown. Support full |
842 // detachment of CDM during playback. This will be needed when we start to | 847 // detachment of CDM during playback. This will be needed when we start to |
843 // support setMediaKeys(0) (see http://crbug.com/330324), or when we release | 848 // support setMediaKeys(0) (see http://crbug.com/330324), or when we release |
844 // MediaDrm when the video is paused, or when the device goes to sleep (see | 849 // MediaDrm when the video is paused, or when the device goes to sleep (see |
845 // http://crbug.com/272421). | 850 // http://crbug.com/272421). |
846 audio_decoder_job_->SetDrmBridge(NULL); | 851 audio_decoder_job_->SetDrmBridge(nullptr); |
847 video_decoder_job_->SetDrmBridge(NULL); | 852 video_decoder_job_->SetDrmBridge(nullptr); |
848 cdm_registration_id_ = 0; | 853 cdm_registration_id_ = 0; |
849 drm_bridge_ = NULL; | 854 drm_bridge_ = nullptr; |
855 cdm_ = nullptr; | |
850 } | 856 } |
851 | 857 |
852 } // namespace media | 858 } // namespace media |
OLD | NEW |