Chromium Code Reviews| 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 |