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" |
11 #include "base/barrier_closure.h" | 11 #include "base/barrier_closure.h" |
12 #include "base/basictypes.h" | 12 #include "base/basictypes.h" |
13 #include "base/bind.h" | 13 #include "base/bind.h" |
14 #include "base/callback_helpers.h" | 14 #include "base/callback_helpers.h" |
15 #include "base/debug/trace_event.h" | 15 #include "base/debug/trace_event.h" |
16 #include "base/logging.h" | 16 #include "base/logging.h" |
17 #include "base/strings/string_number_conversions.h" | 17 #include "base/strings/string_number_conversions.h" |
18 #include "media/base/android/audio_decoder_job.h" | 18 #include "media/base/android/audio_decoder_job.h" |
19 #include "media/base/android/media_drm_bridge.h" | 19 #include "media/base/android/media_drm_bridge.h" |
20 #include "media/base/android/media_player_manager.h" | 20 #include "media/base/android/media_player_manager.h" |
21 #include "media/base/android/video_decoder_job.h" | 21 #include "media/base/android/video_decoder_job.h" |
22 | 22 |
23 | 23 |
24 namespace media { | 24 namespace media { |
25 | 25 |
26 MediaSourcePlayer::MediaSourcePlayer( | 26 MediaSourcePlayer::MediaSourcePlayer( |
27 int player_id, | 27 int player_id, |
28 MediaPlayerManager* manager, | 28 MediaPlayerManager* manager, |
29 const RequestMediaResourcesCB& request_media_resources_cb, | 29 const RequestMediaResourcesCB& request_media_resources_cb, |
30 const ReleaseMediaResourcesCB& release_media_resources_cb, | |
31 scoped_ptr<DemuxerAndroid> demuxer, | 30 scoped_ptr<DemuxerAndroid> demuxer, |
32 const GURL& frame_url) | 31 const GURL& frame_url) |
33 : MediaPlayerAndroid(player_id, | 32 : MediaPlayerAndroid(player_id, |
34 manager, | 33 manager, |
35 request_media_resources_cb, | 34 request_media_resources_cb, |
36 release_media_resources_cb, | |
37 frame_url), | 35 frame_url), |
38 demuxer_(demuxer.Pass()), | 36 demuxer_(demuxer.Pass()), |
39 pending_event_(NO_EVENT_PENDING), | 37 pending_event_(NO_EVENT_PENDING), |
40 playing_(false), | 38 playing_(false), |
41 interpolator_(&default_tick_clock_), | 39 interpolator_(&default_tick_clock_), |
42 doing_browser_seek_(false), | 40 doing_browser_seek_(false), |
43 pending_seek_(false), | 41 pending_seek_(false), |
44 drm_bridge_(NULL), | 42 drm_bridge_(NULL), |
45 cdm_registration_id_(0), | 43 cdm_registration_id_(0), |
46 is_waiting_for_key_(false), | 44 is_waiting_for_key_(false), |
47 is_waiting_for_audio_decoder_(false), | 45 is_waiting_for_audio_decoder_(false), |
48 is_waiting_for_video_decoder_(false), | 46 is_waiting_for_video_decoder_(false), |
49 weak_factory_(this) { | 47 weak_factory_(this) { |
50 audio_decoder_job_.reset(new AudioDecoderJob( | 48 audio_decoder_job_.reset(new AudioDecoderJob( |
51 base::Bind(&DemuxerAndroid::RequestDemuxerData, | 49 base::Bind(&DemuxerAndroid::RequestDemuxerData, |
52 base::Unretained(demuxer_.get()), | 50 base::Unretained(demuxer_.get()), |
53 DemuxerStream::AUDIO), | 51 DemuxerStream::AUDIO), |
54 base::Bind(&MediaSourcePlayer::OnDemuxerConfigsChanged, | 52 base::Bind(&MediaSourcePlayer::OnDemuxerConfigsChanged, |
55 weak_factory_.GetWeakPtr()))); | 53 weak_factory_.GetWeakPtr()))); |
56 video_decoder_job_.reset(new VideoDecoderJob( | 54 video_decoder_job_.reset(new VideoDecoderJob( |
57 base::Bind(&DemuxerAndroid::RequestDemuxerData, | 55 base::Bind(&DemuxerAndroid::RequestDemuxerData, |
58 base::Unretained(demuxer_.get()), | 56 base::Unretained(demuxer_.get()), |
59 DemuxerStream::VIDEO), | 57 DemuxerStream::VIDEO), |
60 base::Bind(request_media_resources_cb_, player_id), | 58 base::Bind(request_media_resources_cb_, player_id), |
61 base::Bind(release_media_resources_cb_, player_id), | |
62 base::Bind(&MediaSourcePlayer::OnDemuxerConfigsChanged, | 59 base::Bind(&MediaSourcePlayer::OnDemuxerConfigsChanged, |
63 weak_factory_.GetWeakPtr()))); | 60 weak_factory_.GetWeakPtr()))); |
64 demuxer_->Initialize(this); | 61 demuxer_->Initialize(this); |
65 interpolator_.SetUpperBound(base::TimeDelta()); | 62 interpolator_.SetUpperBound(base::TimeDelta()); |
66 weak_this_ = weak_factory_.GetWeakPtr(); | 63 weak_this_ = weak_factory_.GetWeakPtr(); |
67 } | 64 } |
68 | 65 |
69 MediaSourcePlayer::~MediaSourcePlayer() { | 66 MediaSourcePlayer::~MediaSourcePlayer() { |
70 Release(); | 67 Release(); |
71 DCHECK_EQ(!drm_bridge_, !cdm_registration_id_); | 68 DCHECK_EQ(!drm_bridge_, !cdm_registration_id_); |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
182 return std::min(interpolator_.GetInterpolatedTime(), duration_); | 179 return std::min(interpolator_.GetInterpolatedTime(), duration_); |
183 } | 180 } |
184 | 181 |
185 base::TimeDelta MediaSourcePlayer::GetDuration() { | 182 base::TimeDelta MediaSourcePlayer::GetDuration() { |
186 return duration_; | 183 return duration_; |
187 } | 184 } |
188 | 185 |
189 void MediaSourcePlayer::Release() { | 186 void MediaSourcePlayer::Release() { |
190 DVLOG(1) << __FUNCTION__; | 187 DVLOG(1) << __FUNCTION__; |
191 | 188 |
192 is_surface_in_use_ = false; | |
193 audio_decoder_job_->ReleaseDecoderResources(); | 189 audio_decoder_job_->ReleaseDecoderResources(); |
194 video_decoder_job_->ReleaseDecoderResources(); | 190 video_decoder_job_->ReleaseDecoderResources(); |
195 | 191 |
196 // Prevent player restart, including job re-creation attempts. | 192 // Prevent player restart, including job re-creation attempts. |
197 playing_ = false; | 193 playing_ = false; |
198 | 194 |
199 decoder_starvation_callback_.Cancel(); | 195 decoder_starvation_callback_.Cancel(); |
200 } | 196 } |
201 | 197 |
202 void MediaSourcePlayer::SetVolume(double volume) { | 198 void MediaSourcePlayer::SetVolume(double volume) { |
203 audio_decoder_job_->SetVolume(volume); | 199 audio_decoder_job_->SetVolume(volume); |
204 } | 200 } |
205 | 201 |
206 bool MediaSourcePlayer::IsSurfaceInUse() const { | 202 bool MediaSourcePlayer::IsSurfaceInUse() const { |
207 return is_surface_in_use_; | 203 return video_decoder_job_ && video_decoder_job_->is_decoding(); |
208 } | 204 } |
209 | 205 |
210 bool MediaSourcePlayer::CanPause() { | 206 bool MediaSourcePlayer::CanPause() { |
211 return Seekable(); | 207 return Seekable(); |
212 } | 208 } |
213 | 209 |
214 bool MediaSourcePlayer::CanSeekForward() { | 210 bool MediaSourcePlayer::CanSeekForward() { |
215 return Seekable(); | 211 return Seekable(); |
216 } | 212 } |
217 | 213 |
(...skipping 538 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
756 // release MediaDrm when the video is paused, or when the device goes to | 752 // release MediaDrm when the video is paused, or when the device goes to |
757 // sleep (see http://crbug.com/272421). | 753 // sleep (see http://crbug.com/272421). |
758 NOTREACHED() << "CDM detachment not supported."; | 754 NOTREACHED() << "CDM detachment not supported."; |
759 DCHECK(drm_bridge_); | 755 DCHECK(drm_bridge_); |
760 audio_decoder_job_->SetDrmBridge(NULL); | 756 audio_decoder_job_->SetDrmBridge(NULL); |
761 video_decoder_job_->SetDrmBridge(NULL); | 757 video_decoder_job_->SetDrmBridge(NULL); |
762 drm_bridge_ = NULL; | 758 drm_bridge_ = NULL; |
763 } | 759 } |
764 | 760 |
765 } // namespace media | 761 } // namespace media |
OLD | NEW |