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/filters/video_renderer_base.cc

Issue 12989009: Remove reference counting from media::VideoDecoder and friends. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 9 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/filters/video_renderer_base.h" 5 #include "media/filters/video_renderer_base.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/callback.h" 8 #include "base/callback.h"
9 #include "base/callback_helpers.h" 9 #include "base/callback_helpers.h"
10 #include "base/message_loop.h" 10 #include "base/message_loop.h"
11 #include "base/threading/platform_thread.h" 11 #include "base/threading/platform_thread.h"
12 #include "media/base/buffers.h" 12 #include "media/base/buffers.h"
13 #include "media/base/limits.h" 13 #include "media/base/limits.h"
14 #include "media/base/pipeline.h" 14 #include "media/base/pipeline.h"
15 #include "media/base/video_frame.h" 15 #include "media/base/video_frame.h"
16 #include "media/filters/decrypting_demuxer_stream.h" 16 #include "media/filters/decrypting_demuxer_stream.h"
17 #include "media/filters/video_decoder_selector.h" 17 #include "media/filters/video_decoder_selector.h"
18 18
19 namespace media { 19 namespace media {
20 20
21 base::TimeDelta VideoRendererBase::kMaxLastFrameDuration() { 21 base::TimeDelta VideoRendererBase::kMaxLastFrameDuration() {
22 return base::TimeDelta::FromMilliseconds(250); 22 return base::TimeDelta::FromMilliseconds(250);
23 } 23 }
24 24
25 VideoRendererBase::VideoRendererBase( 25 VideoRendererBase::VideoRendererBase(
26 const scoped_refptr<base::MessageLoopProxy>& message_loop, 26 const scoped_refptr<base::MessageLoopProxy>& message_loop,
27 ScopedVector<VideoDecoder> decoders,
27 const SetDecryptorReadyCB& set_decryptor_ready_cb, 28 const SetDecryptorReadyCB& set_decryptor_ready_cb,
28 const PaintCB& paint_cb, 29 const PaintCB& paint_cb,
29 const SetOpaqueCB& set_opaque_cb, 30 const SetOpaqueCB& set_opaque_cb,
30 bool drop_frames) 31 bool drop_frames)
31 : message_loop_(message_loop), 32 : message_loop_(message_loop),
32 weak_factory_(this), 33 weak_factory_(this),
33 set_decryptor_ready_cb_(set_decryptor_ready_cb), 34 decoder_selector_(new VideoDecoderSelector(
35 message_loop, decoders.Pass(), set_decryptor_ready_cb)),
34 received_end_of_stream_(false), 36 received_end_of_stream_(false),
35 frame_available_(&lock_), 37 frame_available_(&lock_),
36 state_(kUninitialized), 38 state_(kUninitialized),
37 thread_(base::kNullThreadHandle), 39 thread_(base::kNullThreadHandle),
38 pending_read_(false), 40 pending_read_(false),
39 drop_frames_(drop_frames), 41 drop_frames_(drop_frames),
40 playback_rate_(0), 42 playback_rate_(0),
41 paint_cb_(paint_cb), 43 paint_cb_(paint_cb),
42 set_opaque_cb_(set_opaque_cb), 44 set_opaque_cb_(set_opaque_cb),
43 last_timestamp_(kNoTimestamp()) { 45 last_timestamp_(kNoTimestamp()) {
44 DCHECK(!paint_cb_.is_null()); 46 DCHECK(!paint_cb_.is_null());
45 } 47 }
46 48
47 VideoRendererBase::~VideoRendererBase() { 49 VideoRendererBase::~VideoRendererBase() {
48 base::AutoLock auto_lock(lock_); 50 base::AutoLock auto_lock(lock_);
49 CHECK(state_ == kStopped || state_ == kUninitialized) << state_; 51 CHECK(state_ == kStopped || state_ == kUninitialized) << state_;
50 CHECK_EQ(thread_, base::kNullThreadHandle); 52 CHECK_EQ(thread_, base::kNullThreadHandle);
Ami GONE FROM CHROMIUM 2013/03/22 23:48:01 should also weak_factory_.InvalidateWeakPtrs().
scherkus (not reviewing) 2013/03/28 02:00:01 Was this comment based on how you thought weak_ptr
51 } 53 }
52 54
53 void VideoRendererBase::Play(const base::Closure& callback) { 55 void VideoRendererBase::Play(const base::Closure& callback) {
54 DCHECK(message_loop_->BelongsToCurrentThread()); 56 DCHECK(message_loop_->BelongsToCurrentThread());
55 base::AutoLock auto_lock(lock_); 57 base::AutoLock auto_lock(lock_);
56 DCHECK_EQ(kPrerolled, state_); 58 DCHECK_EQ(kPrerolled, state_);
57 state_ = kPlaying; 59 state_ = kPlaying;
58 callback.Run(); 60 callback.Run();
59 } 61 }
60 62
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
155 DCHECK(!cb.is_null()); 157 DCHECK(!cb.is_null());
156 DCHECK(preroll_cb_.is_null()); 158 DCHECK(preroll_cb_.is_null());
157 159
158 state_ = kPrerolling; 160 state_ = kPrerolling;
159 preroll_cb_ = cb; 161 preroll_cb_ = cb;
160 preroll_timestamp_ = time; 162 preroll_timestamp_ = time;
161 AttemptRead_Locked(); 163 AttemptRead_Locked();
162 } 164 }
163 165
164 void VideoRendererBase::Initialize(const scoped_refptr<DemuxerStream>& stream, 166 void VideoRendererBase::Initialize(const scoped_refptr<DemuxerStream>& stream,
165 const VideoDecoderList& decoders,
166 const PipelineStatusCB& init_cb, 167 const PipelineStatusCB& init_cb,
167 const StatisticsCB& statistics_cb, 168 const StatisticsCB& statistics_cb,
168 const TimeCB& max_time_cb, 169 const TimeCB& max_time_cb,
169 const NaturalSizeChangedCB& size_changed_cb, 170 const NaturalSizeChangedCB& size_changed_cb,
170 const base::Closure& ended_cb, 171 const base::Closure& ended_cb,
171 const PipelineStatusCB& error_cb, 172 const PipelineStatusCB& error_cb,
172 const TimeDeltaCB& get_time_cb, 173 const TimeDeltaCB& get_time_cb,
173 const TimeDeltaCB& get_duration_cb) { 174 const TimeDeltaCB& get_duration_cb) {
174 DCHECK(message_loop_->BelongsToCurrentThread()); 175 DCHECK(message_loop_->BelongsToCurrentThread());
175 base::AutoLock auto_lock(lock_); 176 base::AutoLock auto_lock(lock_);
176 DCHECK(stream); 177 DCHECK(stream);
177 DCHECK(!decoders.empty());
178 DCHECK_EQ(stream->type(), DemuxerStream::VIDEO); 178 DCHECK_EQ(stream->type(), DemuxerStream::VIDEO);
179 DCHECK(!init_cb.is_null()); 179 DCHECK(!init_cb.is_null());
180 DCHECK(!statistics_cb.is_null()); 180 DCHECK(!statistics_cb.is_null());
181 DCHECK(!max_time_cb.is_null()); 181 DCHECK(!max_time_cb.is_null());
182 DCHECK(!size_changed_cb.is_null()); 182 DCHECK(!size_changed_cb.is_null());
183 DCHECK(!ended_cb.is_null()); 183 DCHECK(!ended_cb.is_null());
184 DCHECK(!get_time_cb.is_null()); 184 DCHECK(!get_time_cb.is_null());
185 DCHECK(!get_duration_cb.is_null()); 185 DCHECK(!get_duration_cb.is_null());
186 DCHECK_EQ(kUninitialized, state_); 186 DCHECK_EQ(kUninitialized, state_);
187 187
188 weak_this_ = weak_factory_.GetWeakPtr(); 188 weak_this_ = weak_factory_.GetWeakPtr();
189 init_cb_ = init_cb; 189 init_cb_ = init_cb;
190 statistics_cb_ = statistics_cb; 190 statistics_cb_ = statistics_cb;
191 max_time_cb_ = max_time_cb; 191 max_time_cb_ = max_time_cb;
192 size_changed_cb_ = size_changed_cb; 192 size_changed_cb_ = size_changed_cb;
193 ended_cb_ = ended_cb; 193 ended_cb_ = ended_cb;
194 error_cb_ = error_cb; 194 error_cb_ = error_cb;
195 get_time_cb_ = get_time_cb; 195 get_time_cb_ = get_time_cb;
196 get_duration_cb_ = get_duration_cb; 196 get_duration_cb_ = get_duration_cb;
197 state_ = kInitializing; 197 state_ = kInitializing;
198 198
199 scoped_ptr<VideoDecoderSelector> decoder_selector( 199 decoder_selector_->SelectVideoDecoder(
200 new VideoDecoderSelector(base::MessageLoopProxy::current(),
201 decoders,
202 set_decryptor_ready_cb_));
203
204 // To avoid calling |decoder_selector| methods and passing ownership of
205 // |decoder_selector| in the same line.
206 VideoDecoderSelector* decoder_selector_ptr = decoder_selector.get();
207
208 decoder_selector_ptr->SelectVideoDecoder(
209 stream, 200 stream,
210 statistics_cb, 201 statistics_cb,
211 base::Bind(&VideoRendererBase::OnDecoderSelected, weak_this_, 202 base::Bind(&VideoRendererBase::OnDecoderSelected, weak_this_));
212 base::Passed(&decoder_selector)));
213 } 203 }
214 204
215 void VideoRendererBase::OnDecoderSelected( 205 void VideoRendererBase::OnDecoderSelected(
216 scoped_ptr<VideoDecoderSelector> decoder_selector, 206 scoped_ptr<VideoDecoder> decoder,
217 const scoped_refptr<VideoDecoder>& selected_decoder,
218 const scoped_refptr<DecryptingDemuxerStream>& decrypting_demuxer_stream) { 207 const scoped_refptr<DecryptingDemuxerStream>& decrypting_demuxer_stream) {
219 DCHECK(message_loop_->BelongsToCurrentThread()); 208 DCHECK(message_loop_->BelongsToCurrentThread());
220 base::AutoLock auto_lock(lock_); 209 base::AutoLock auto_lock(lock_);
221 210
222 if (state_ == kStopped) 211 if (state_ == kStopped)
223 return; 212 return;
224 213
225 DCHECK_EQ(state_, kInitializing); 214 DCHECK_EQ(state_, kInitializing);
226 215
227 if (!selected_decoder) { 216 if (!decoder) {
228 state_ = kUninitialized; 217 state_ = kUninitialized;
229 base::ResetAndReturn(&init_cb_).Run(DECODER_ERROR_NOT_SUPPORTED); 218 base::ResetAndReturn(&init_cb_).Run(DECODER_ERROR_NOT_SUPPORTED);
230 return; 219 return;
231 } 220 }
232 221
233 decoder_ = selected_decoder; 222 decoder_ = decoder.Pass();
234 decrypting_demuxer_stream_ = decrypting_demuxer_stream; 223 decrypting_demuxer_stream_ = decrypting_demuxer_stream;
235 224
236 // We're all good! Consider ourselves flushed. (ThreadMain() should never 225 // We're all good! Consider ourselves flushed. (ThreadMain() should never
237 // see us in the kUninitialized state). 226 // see us in the kUninitialized state).
238 // Since we had an initial Preroll(), we consider ourself flushed, because we 227 // Since we had an initial Preroll(), we consider ourself flushed, because we
239 // have not populated any buffers yet. 228 // have not populated any buffers yet.
240 state_ = kFlushed; 229 state_ = kFlushed;
241 230
242 set_opaque_cb_.Run(!decoder_->HasAlpha()); 231 set_opaque_cb_.Run(!decoder_->HasAlpha());
243 set_opaque_cb_.Reset(); 232 set_opaque_cb_.Reset();
(...skipping 327 matching lines...) Expand 10 before | Expand all | Expand 10 after
571 // Because we might remain in the prerolled state for an undetermined amount 560 // Because we might remain in the prerolled state for an undetermined amount
572 // of time (e.g., we seeked while paused), we'll paint the first prerolled 561 // of time (e.g., we seeked while paused), we'll paint the first prerolled
573 // frame. 562 // frame.
574 if (!ready_frames_.empty()) 563 if (!ready_frames_.empty())
575 PaintNextReadyFrame_Locked(); 564 PaintNextReadyFrame_Locked();
576 565
577 base::ResetAndReturn(&preroll_cb_).Run(PIPELINE_OK); 566 base::ResetAndReturn(&preroll_cb_).Run(PIPELINE_OK);
578 } 567 }
579 568
580 } // namespace media 569 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698