Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(112)

Side by Side Diff: media/base/android/media_codec_player.cc

Issue 1372203002: Throttle media decoding after excessive Android media server crashes (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: addressing comments Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698