OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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_codec_player.h" | 5 #include "media/base/android/media_codec_player.h" |
6 | 6 |
7 #include "base/barrier_closure.h" | 7 #include "base/barrier_closure.h" |
8 #include "base/bind.h" | 8 #include "base/bind.h" |
9 #include "base/lazy_instance.h" | 9 #include "base/lazy_instance.h" |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
42 | 42 |
43 scoped_refptr<base::SingleThreadTaskRunner> GetMediaTaskRunner() { | 43 scoped_refptr<base::SingleThreadTaskRunner> GetMediaTaskRunner() { |
44 return g_media_thread.Pointer()->task_runner(); | 44 return g_media_thread.Pointer()->task_runner(); |
45 } | 45 } |
46 | 46 |
47 // MediaCodecPlayer implementation. | 47 // MediaCodecPlayer implementation. |
48 | 48 |
49 MediaCodecPlayer::MediaCodecPlayer( | 49 MediaCodecPlayer::MediaCodecPlayer( |
50 int player_id, | 50 int player_id, |
51 base::WeakPtr<MediaPlayerManager> manager, | 51 base::WeakPtr<MediaPlayerManager> manager, |
52 const RequestMediaResourcesCB& request_media_resources_cb, | 52 const OnDecoderResourcesReleasedCB& on_decoder_resources_released_cb, |
53 scoped_ptr<DemuxerAndroid> demuxer, | 53 scoped_ptr<DemuxerAndroid> demuxer, |
54 const GURL& frame_url) | 54 const GURL& frame_url) |
55 : MediaPlayerAndroid(player_id, | 55 : MediaPlayerAndroid(player_id, |
56 manager.get(), | 56 manager.get(), |
57 request_media_resources_cb, | 57 on_decoder_resources_released_cb, |
58 frame_url), | 58 frame_url), |
59 ui_task_runner_(base::ThreadTaskRunnerHandle::Get()), | 59 ui_task_runner_(base::ThreadTaskRunnerHandle::Get()), |
60 demuxer_(demuxer.Pass()), | 60 demuxer_(demuxer.Pass()), |
61 state_(kStatePaused), | 61 state_(kStatePaused), |
62 interpolator_(&default_tick_clock_), | 62 interpolator_(&default_tick_clock_), |
63 pending_start_(false), | 63 pending_start_(false), |
64 pending_seek_(kNoTimestamp()), | 64 pending_seek_(kNoTimestamp()), |
65 media_weak_factory_(this) { | 65 media_weak_factory_(this) { |
66 DCHECK(ui_task_runner_->BelongsToCurrentThread()); | 66 DCHECK(ui_task_runner_->BelongsToCurrentThread()); |
67 | 67 |
68 DVLOG(1) << "MediaCodecPlayer::MediaCodecPlayer: player_id:" << player_id; | 68 DVLOG(1) << "MediaCodecPlayer::MediaCodecPlayer: player_id:" << player_id; |
69 | 69 |
70 request_resources_cb_ = base::Bind(request_media_resources_cb_, player_id); | |
71 | |
72 completion_cb_ = | 70 completion_cb_ = |
73 base::Bind(&MediaPlayerManager::OnPlaybackComplete, manager, player_id); | 71 base::Bind(&MediaPlayerManager::OnPlaybackComplete, manager, player_id); |
74 seek_done_cb_ = | 72 seek_done_cb_ = |
75 base::Bind(&MediaPlayerManager::OnSeekComplete, manager, player_id); | 73 base::Bind(&MediaPlayerManager::OnSeekComplete, manager, player_id); |
76 error_cb_ = base::Bind(&MediaPlayerManager::OnError, manager, player_id); | 74 error_cb_ = base::Bind(&MediaPlayerManager::OnError, manager, player_id); |
77 attach_listener_cb_ = base::Bind(&MediaPlayerAndroid::AttachListener, | 75 attach_listener_cb_ = base::Bind(&MediaPlayerAndroid::AttachListener, |
78 WeakPtrForUIThread(), nullptr); | 76 WeakPtrForUIThread(), nullptr); |
79 detach_listener_cb_ = | 77 detach_listener_cb_ = |
80 base::Bind(&MediaPlayerAndroid::DetachListener, WeakPtrForUIThread()); | 78 base::Bind(&MediaPlayerAndroid::DetachListener, WeakPtrForUIThread()); |
81 metadata_changed_cb_ = base::Bind(&MediaPlayerAndroid::OnMediaMetadataChanged, | 79 metadata_changed_cb_ = base::Bind(&MediaPlayerAndroid::OnMediaMetadataChanged, |
(...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
292 break; | 290 break; |
293 case kStateError: | 291 case kStateError: |
294 break; // ignore | 292 break; // ignore |
295 default: | 293 default: |
296 NOTREACHED(); | 294 NOTREACHED(); |
297 break; | 295 break; |
298 } | 296 } |
299 } | 297 } |
300 | 298 |
301 void MediaCodecPlayer::Release() { | 299 void MediaCodecPlayer::Release() { |
| 300 // TODO(qinmin): the callback should be posted onto the UI thread when |
| 301 // Release() finishes on media thread. However, the BrowserMediaPlayerManager |
| 302 // could be gone in that case, which cause the MediaThrottler unable to |
| 303 // track the active players. We should pass |
| 304 // MediaThrottler::OnDecodeRequestFinished() to this class in the ctor, but |
| 305 // also need a way for BrowserMediaPlayerManager to track active players. |
| 306 if (ui_task_runner_->BelongsToCurrentThread()) |
| 307 on_decoder_resources_released_cb_.Run(player_id()); |
| 308 |
302 RUN_ON_MEDIA_THREAD(Release); | 309 RUN_ON_MEDIA_THREAD(Release); |
303 | 310 |
304 DVLOG(1) << __FUNCTION__; | 311 DVLOG(1) << __FUNCTION__; |
305 | 312 |
306 // Stop decoding threads and delete MediaCodecs, but keep IPC between browser | 313 // Stop decoding threads and delete MediaCodecs, but keep IPC between browser |
307 // and renderer processes going. Seek should work across and after Release(). | 314 // and renderer processes going. Seek should work across and after Release(). |
308 | 315 |
309 ReleaseDecoderResources(); | 316 ReleaseDecoderResources(); |
310 | 317 |
311 SetPendingStart(false); | 318 SetPendingStart(false); |
(...skipping 464 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
776 interpolator_.SetBounds(now_playing, last_buffered); | 783 interpolator_.SetBounds(now_playing, last_buffered); |
777 | 784 |
778 // Post to UI thread | 785 // Post to UI thread |
779 if (!postpone) { | 786 if (!postpone) { |
780 ui_task_runner_->PostTask(FROM_HERE, | 787 ui_task_runner_->PostTask(FROM_HERE, |
781 base::Bind(time_update_cb_, GetInterpolatedTime(), | 788 base::Bind(time_update_cb_, GetInterpolatedTime(), |
782 base::TimeTicks::Now())); | 789 base::TimeTicks::Now())); |
783 } | 790 } |
784 } | 791 } |
785 | 792 |
786 void MediaCodecPlayer::OnVideoCodecCreated() { | |
787 DCHECK(GetMediaTaskRunner()->BelongsToCurrentThread()); | |
788 | |
789 // This callback requests resources by releasing other players. | |
790 ui_task_runner_->PostTask(FROM_HERE, request_resources_cb_); | |
791 } | |
792 | |
793 void MediaCodecPlayer::OnVideoResolutionChanged(const gfx::Size& size) { | 793 void MediaCodecPlayer::OnVideoResolutionChanged(const gfx::Size& size) { |
794 DCHECK(GetMediaTaskRunner()->BelongsToCurrentThread()); | 794 DCHECK(GetMediaTaskRunner()->BelongsToCurrentThread()); |
795 | 795 |
796 DVLOG(1) << __FUNCTION__ << " " << size.width() << "x" << size.height(); | 796 DVLOG(1) << __FUNCTION__ << " " << size.width() << "x" << size.height(); |
797 | 797 |
798 // Update cache and notify manager on UI thread | 798 // Update cache and notify manager on UI thread |
799 ui_task_runner_->PostTask( | 799 ui_task_runner_->PostTask( |
800 FROM_HERE, base::Bind(metadata_changed_cb_, kNoTimestamp(), size)); | 800 FROM_HERE, base::Bind(metadata_changed_cb_, kNoTimestamp(), size)); |
801 } | 801 } |
802 | 802 |
(...skipping 333 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1136 media_weak_this_, DemuxerStream::VIDEO), | 1136 media_weak_this_, DemuxerStream::VIDEO), |
1137 base::Bind(&MediaCodecPlayer::OnStarvation, media_weak_this_, | 1137 base::Bind(&MediaCodecPlayer::OnStarvation, media_weak_this_, |
1138 DemuxerStream::VIDEO), | 1138 DemuxerStream::VIDEO), |
1139 base::Bind(&MediaCodecPlayer::OnDecoderDrained, media_weak_this_, | 1139 base::Bind(&MediaCodecPlayer::OnDecoderDrained, media_weak_this_, |
1140 DemuxerStream::VIDEO), | 1140 DemuxerStream::VIDEO), |
1141 base::Bind(&MediaCodecPlayer::OnStopDone, media_weak_this_, | 1141 base::Bind(&MediaCodecPlayer::OnStopDone, media_weak_this_, |
1142 DemuxerStream::VIDEO), | 1142 DemuxerStream::VIDEO), |
1143 internal_error_cb_, | 1143 internal_error_cb_, |
1144 base::Bind(&MediaCodecPlayer::OnTimeIntervalUpdate, media_weak_this_, | 1144 base::Bind(&MediaCodecPlayer::OnTimeIntervalUpdate, media_weak_this_, |
1145 DemuxerStream::VIDEO), | 1145 DemuxerStream::VIDEO), |
1146 base::Bind(&MediaCodecPlayer::OnVideoResolutionChanged, media_weak_this_), | 1146 base::Bind(&MediaCodecPlayer::OnVideoResolutionChanged, |
1147 base::Bind(&MediaCodecPlayer::OnVideoCodecCreated, media_weak_this_))); | 1147 media_weak_this_))); |
1148 } | 1148 } |
1149 | 1149 |
1150 bool MediaCodecPlayer::AudioFinished() const { | 1150 bool MediaCodecPlayer::AudioFinished() const { |
1151 return audio_decoder_->IsCompleted() || !audio_decoder_->HasStream(); | 1151 return audio_decoder_->IsCompleted() || !audio_decoder_->HasStream(); |
1152 } | 1152 } |
1153 | 1153 |
1154 bool MediaCodecPlayer::VideoFinished() const { | 1154 bool MediaCodecPlayer::VideoFinished() const { |
1155 return video_decoder_->IsCompleted() || !video_decoder_->HasStream(); | 1155 return video_decoder_->IsCompleted() || !video_decoder_->HasStream(); |
1156 } | 1156 } |
1157 | 1157 |
(...skipping 19 matching lines...) Expand all Loading... |
1177 RETURN_STRING(kStateWaitingForSurface); | 1177 RETURN_STRING(kStateWaitingForSurface); |
1178 RETURN_STRING(kStateWaitingForSeek); | 1178 RETURN_STRING(kStateWaitingForSeek); |
1179 RETURN_STRING(kStateError); | 1179 RETURN_STRING(kStateError); |
1180 } | 1180 } |
1181 return nullptr; // crash early | 1181 return nullptr; // crash early |
1182 } | 1182 } |
1183 | 1183 |
1184 #undef RETURN_STRING | 1184 #undef RETURN_STRING |
1185 | 1185 |
1186 } // namespace media | 1186 } // namespace media |
OLD | NEW |