Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(411)

Side by Side Diff: media/base/android/media_source_player.cc

Issue 1407933010: media: Make MediaKeys ref-counted. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698