| 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 |