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

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

Powered by Google App Engine
This is Rietveld 408576698