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

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

Issue 1394793003: Throttle media decoding after excessive Android media server crashes (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@2526
Patch Set: rebase 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 (c) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2013 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_source_player.h" 5 #include "media/base/android/media_source_player.h"
6 6
7 #include <limits> 7 #include <limits>
8 8
9 #include "base/android/jni_android.h" 9 #include "base/android/jni_android.h"
10 #include "base/android/jni_string.h" 10 #include "base/android/jni_string.h"
11 #include "base/barrier_closure.h" 11 #include "base/barrier_closure.h"
12 #include "base/basictypes.h" 12 #include "base/basictypes.h"
13 #include "base/bind.h" 13 #include "base/bind.h"
14 #include "base/callback_helpers.h" 14 #include "base/callback_helpers.h"
15 #include "base/logging.h" 15 #include "base/logging.h"
16 #include "base/strings/string_number_conversions.h" 16 #include "base/strings/string_number_conversions.h"
17 #include "base/trace_event/trace_event.h" 17 #include "base/trace_event/trace_event.h"
18 #include "media/base/android/audio_decoder_job.h" 18 #include "media/base/android/audio_decoder_job.h"
19 #include "media/base/android/media_player_manager.h" 19 #include "media/base/android/media_player_manager.h"
20 #include "media/base/android/video_decoder_job.h" 20 #include "media/base/android/video_decoder_job.h"
21 #include "media/base/bind_to_current_loop.h" 21 #include "media/base/bind_to_current_loop.h"
22 #include "media/base/timestamp_constants.h" 22 #include "media/base/timestamp_constants.h"
23 23
24 namespace media { 24 namespace media {
25 25
26 MediaSourcePlayer::MediaSourcePlayer( 26 MediaSourcePlayer::MediaSourcePlayer(
27 int player_id, 27 int player_id,
28 MediaPlayerManager* manager, 28 MediaPlayerManager* manager,
29 const RequestMediaResourcesCB& request_media_resources_cb, 29 const OnDecoderResourcesReleasedCB& on_decoder_resources_released_cb,
30 scoped_ptr<DemuxerAndroid> demuxer, 30 scoped_ptr<DemuxerAndroid> demuxer,
31 const GURL& frame_url) 31 const GURL& frame_url)
32 : MediaPlayerAndroid(player_id, 32 : MediaPlayerAndroid(player_id,
33 manager, 33 manager,
34 request_media_resources_cb, 34 on_decoder_resources_released_cb,
35 frame_url), 35 frame_url),
36 demuxer_(demuxer.Pass()), 36 demuxer_(demuxer.Pass()),
37 pending_event_(NO_EVENT_PENDING), 37 pending_event_(NO_EVENT_PENDING),
38 playing_(false), 38 playing_(false),
39 interpolator_(&default_tick_clock_), 39 interpolator_(&default_tick_clock_),
40 doing_browser_seek_(false), 40 doing_browser_seek_(false),
41 pending_seek_(false), 41 pending_seek_(false),
42 drm_bridge_(NULL), 42 drm_bridge_(NULL),
43 cdm_registration_id_(0), 43 cdm_registration_id_(0),
44 is_waiting_for_key_(false), 44 is_waiting_for_key_(false),
45 key_added_while_decode_pending_(false), 45 key_added_while_decode_pending_(false),
46 is_waiting_for_audio_decoder_(false), 46 is_waiting_for_audio_decoder_(false),
47 is_waiting_for_video_decoder_(false), 47 is_waiting_for_video_decoder_(false),
48 prerolling_(true), 48 prerolling_(true),
49 weak_factory_(this) { 49 weak_factory_(this) {
50 media_stat_.reset(new MediaStatistics()); 50 media_stat_.reset(new MediaStatistics());
51 51
52 audio_decoder_job_.reset(new AudioDecoderJob( 52 audio_decoder_job_.reset(new AudioDecoderJob(
53 base::Bind(&DemuxerAndroid::RequestDemuxerData, 53 base::Bind(&DemuxerAndroid::RequestDemuxerData,
54 base::Unretained(demuxer_.get()), 54 base::Unretained(demuxer_.get()),
55 DemuxerStream::AUDIO), 55 DemuxerStream::AUDIO),
56 base::Bind(&MediaSourcePlayer::OnDemuxerConfigsChanged, 56 base::Bind(&MediaSourcePlayer::OnDemuxerConfigsChanged,
57 weak_factory_.GetWeakPtr()))); 57 weak_factory_.GetWeakPtr())));
58 video_decoder_job_.reset(new VideoDecoderJob( 58 video_decoder_job_.reset(new VideoDecoderJob(
59 base::Bind(&DemuxerAndroid::RequestDemuxerData, 59 base::Bind(&DemuxerAndroid::RequestDemuxerData,
60 base::Unretained(demuxer_.get()), 60 base::Unretained(demuxer_.get()),
61 DemuxerStream::VIDEO), 61 DemuxerStream::VIDEO),
62 base::Bind(request_media_resources_cb_, player_id),
63 base::Bind(&MediaSourcePlayer::OnDemuxerConfigsChanged, 62 base::Bind(&MediaSourcePlayer::OnDemuxerConfigsChanged,
64 weak_factory_.GetWeakPtr()))); 63 weak_factory_.GetWeakPtr())));
65 64
66 demuxer_->Initialize(this); 65 demuxer_->Initialize(this);
67 interpolator_.SetUpperBound(base::TimeDelta()); 66 interpolator_.SetUpperBound(base::TimeDelta());
68 weak_this_ = weak_factory_.GetWeakPtr(); 67 weak_this_ = weak_factory_.GetWeakPtr();
69 } 68 }
70 69
71 MediaSourcePlayer::~MediaSourcePlayer() { 70 MediaSourcePlayer::~MediaSourcePlayer() {
72 Release(); 71 Release();
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
184 183
185 audio_decoder_job_->ReleaseDecoderResources(); 184 audio_decoder_job_->ReleaseDecoderResources();
186 video_decoder_job_->ReleaseDecoderResources(); 185 video_decoder_job_->ReleaseDecoderResources();
187 186
188 // Prevent player restart, including job re-creation attempts. 187 // Prevent player restart, including job re-creation attempts.
189 playing_ = false; 188 playing_ = false;
190 189
191 decoder_starvation_callback_.Cancel(); 190 decoder_starvation_callback_.Cancel();
192 191
193 DetachListener(); 192 DetachListener();
193 on_decoder_resources_released_cb_.Run(player_id());
194 } 194 }
195 195
196 void MediaSourcePlayer::SetVolume(double volume) { 196 void MediaSourcePlayer::SetVolume(double volume) {
197 audio_decoder_job_->SetVolume(volume); 197 audio_decoder_job_->SetVolume(volume);
198 } 198 }
199 199
200 bool MediaSourcePlayer::CanPause() { 200 bool MediaSourcePlayer::CanPause() {
201 return Seekable(); 201 return Seekable();
202 } 202 }
203 203
204 bool MediaSourcePlayer::CanSeekForward() { 204 bool MediaSourcePlayer::CanSeekForward() {
205 return Seekable(); 205 return Seekable();
206 } 206 }
207 207
208 bool MediaSourcePlayer::CanSeekBackward() { 208 bool MediaSourcePlayer::CanSeekBackward() {
209 return Seekable(); 209 return Seekable();
210 } 210 }
211 211
212 bool MediaSourcePlayer::IsPlayerReady() { 212 bool MediaSourcePlayer::IsPlayerReady() {
213 return audio_decoder_job_ || video_decoder_job_; 213 return HasAudio() || HasVideo();
214 } 214 }
215 215
216 void MediaSourcePlayer::StartInternal() { 216 void MediaSourcePlayer::StartInternal() {
217 DVLOG(1) << __FUNCTION__; 217 DVLOG(1) << __FUNCTION__;
218 // If there are pending events, wait for them finish. 218 // If there are pending events, wait for them finish.
219 if (pending_event_ != NO_EVENT_PENDING) 219 if (pending_event_ != NO_EVENT_PENDING)
220 return; 220 return;
221 221
222 if (!manager()->RequestPlay(player_id(), duration_)) { 222 if (!manager()->RequestPlay(player_id(), duration_)) {
223 Pause(true); 223 Pause(true);
(...skipping 619 matching lines...) Expand 10 before | Expand all | Expand 10 after
843 // support setMediaKeys(0) (see http://crbug.com/330324), or when we release 843 // support setMediaKeys(0) (see http://crbug.com/330324), or when we release
844 // MediaDrm when the video is paused, or when the device goes to sleep (see 844 // MediaDrm when the video is paused, or when the device goes to sleep (see
845 // http://crbug.com/272421). 845 // http://crbug.com/272421).
846 audio_decoder_job_->SetDrmBridge(NULL); 846 audio_decoder_job_->SetDrmBridge(NULL);
847 video_decoder_job_->SetDrmBridge(NULL); 847 video_decoder_job_->SetDrmBridge(NULL);
848 cdm_registration_id_ = 0; 848 cdm_registration_id_ = 0;
849 drm_bridge_ = NULL; 849 drm_bridge_ = NULL;
850 } 850 }
851 851
852 } // namespace media 852 } // namespace media
OLDNEW
« no previous file with comments | « media/base/android/media_source_player.h ('k') | media/base/android/media_source_player_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698