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 OnPlayerReleasedCB& on_player_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_player_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 if (ui_task_runner_->BelongsToCurrentThread()) | |
301 on_player_released_cb_.Run(player_id()); | |
Tima Vaisburd
2015/09/28 22:09:12
Did you consider posting this callback to UI threa
Ted C
2015/09/28 22:42:30
And should we be doing something in the else?
Tima Vaisburd
2015/09/28 23:04:47
In the 'else' we continue :-)
Each method with RU
qinmin
2015/09/29 23:16:23
The problem to post the task is that the MediaPlay
| |
302 | |
302 RUN_ON_MEDIA_THREAD(Release); | 303 RUN_ON_MEDIA_THREAD(Release); |
303 | 304 |
304 DVLOG(1) << __FUNCTION__; | 305 DVLOG(1) << __FUNCTION__; |
305 | 306 |
306 // Stop decoding threads and delete MediaCodecs, but keep IPC between browser | 307 // Stop decoding threads and delete MediaCodecs, but keep IPC between browser |
307 // and renderer processes going. Seek should work across and after Release(). | 308 // and renderer processes going. Seek should work across and after Release(). |
308 | 309 |
309 ReleaseDecoderResources(); | 310 ReleaseDecoderResources(); |
310 | 311 |
311 SetPendingStart(false); | 312 SetPendingStart(false); |
(...skipping 464 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
776 interpolator_.SetBounds(now_playing, last_buffered); | 777 interpolator_.SetBounds(now_playing, last_buffered); |
777 | 778 |
778 // Post to UI thread | 779 // Post to UI thread |
779 if (!postpone) { | 780 if (!postpone) { |
780 ui_task_runner_->PostTask(FROM_HERE, | 781 ui_task_runner_->PostTask(FROM_HERE, |
781 base::Bind(time_update_cb_, GetInterpolatedTime(), | 782 base::Bind(time_update_cb_, GetInterpolatedTime(), |
782 base::TimeTicks::Now())); | 783 base::TimeTicks::Now())); |
783 } | 784 } |
784 } | 785 } |
785 | 786 |
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) { | 787 void MediaCodecPlayer::OnVideoResolutionChanged(const gfx::Size& size) { |
794 DCHECK(GetMediaTaskRunner()->BelongsToCurrentThread()); | 788 DCHECK(GetMediaTaskRunner()->BelongsToCurrentThread()); |
795 | 789 |
796 DVLOG(1) << __FUNCTION__ << " " << size.width() << "x" << size.height(); | 790 DVLOG(1) << __FUNCTION__ << " " << size.width() << "x" << size.height(); |
797 | 791 |
798 // Update cache and notify manager on UI thread | 792 // Update cache and notify manager on UI thread |
799 ui_task_runner_->PostTask( | 793 ui_task_runner_->PostTask( |
800 FROM_HERE, base::Bind(metadata_changed_cb_, kNoTimestamp(), size)); | 794 FROM_HERE, base::Bind(metadata_changed_cb_, kNoTimestamp(), size)); |
801 } | 795 } |
802 | 796 |
(...skipping 333 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1136 media_weak_this_, DemuxerStream::VIDEO), | 1130 media_weak_this_, DemuxerStream::VIDEO), |
1137 base::Bind(&MediaCodecPlayer::OnStarvation, media_weak_this_, | 1131 base::Bind(&MediaCodecPlayer::OnStarvation, media_weak_this_, |
1138 DemuxerStream::VIDEO), | 1132 DemuxerStream::VIDEO), |
1139 base::Bind(&MediaCodecPlayer::OnDecoderDrained, media_weak_this_, | 1133 base::Bind(&MediaCodecPlayer::OnDecoderDrained, media_weak_this_, |
1140 DemuxerStream::VIDEO), | 1134 DemuxerStream::VIDEO), |
1141 base::Bind(&MediaCodecPlayer::OnStopDone, media_weak_this_, | 1135 base::Bind(&MediaCodecPlayer::OnStopDone, media_weak_this_, |
1142 DemuxerStream::VIDEO), | 1136 DemuxerStream::VIDEO), |
1143 internal_error_cb_, | 1137 internal_error_cb_, |
1144 base::Bind(&MediaCodecPlayer::OnTimeIntervalUpdate, media_weak_this_, | 1138 base::Bind(&MediaCodecPlayer::OnTimeIntervalUpdate, media_weak_this_, |
1145 DemuxerStream::VIDEO), | 1139 DemuxerStream::VIDEO), |
1146 base::Bind(&MediaCodecPlayer::OnVideoResolutionChanged, media_weak_this_), | 1140 base::Bind(&MediaCodecPlayer::OnVideoResolutionChanged, |
1147 base::Bind(&MediaCodecPlayer::OnVideoCodecCreated, media_weak_this_))); | 1141 media_weak_this_))); |
1148 } | 1142 } |
1149 | 1143 |
1150 bool MediaCodecPlayer::AudioFinished() const { | 1144 bool MediaCodecPlayer::AudioFinished() const { |
1151 return audio_decoder_->IsCompleted() || !audio_decoder_->HasStream(); | 1145 return audio_decoder_->IsCompleted() || !audio_decoder_->HasStream(); |
1152 } | 1146 } |
1153 | 1147 |
1154 bool MediaCodecPlayer::VideoFinished() const { | 1148 bool MediaCodecPlayer::VideoFinished() const { |
1155 return video_decoder_->IsCompleted() || !video_decoder_->HasStream(); | 1149 return video_decoder_->IsCompleted() || !video_decoder_->HasStream(); |
1156 } | 1150 } |
1157 | 1151 |
(...skipping 19 matching lines...) Expand all Loading... | |
1177 RETURN_STRING(kStateWaitingForSurface); | 1171 RETURN_STRING(kStateWaitingForSurface); |
1178 RETURN_STRING(kStateWaitingForSeek); | 1172 RETURN_STRING(kStateWaitingForSeek); |
1179 RETURN_STRING(kStateError); | 1173 RETURN_STRING(kStateError); |
1180 } | 1174 } |
1181 return nullptr; // crash early | 1175 return nullptr; // crash early |
1182 } | 1176 } |
1183 | 1177 |
1184 #undef RETURN_STRING | 1178 #undef RETURN_STRING |
1185 | 1179 |
1186 } // namespace media | 1180 } // namespace media |
OLD | NEW |