OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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 "base/callback.h" | 5 #include "base/callback.h" |
6 #include "media/base/buffers.h" | 6 #include "media/base/buffers.h" |
7 #include "media/base/filter_host.h" | 7 #include "media/base/filter_host.h" |
8 #include "media/base/video_frame.h" | 8 #include "media/base/video_frame.h" |
9 #include "media/filters/video_renderer_base.h" | 9 #include "media/filters/video_renderer_base.h" |
10 | 10 |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
139 | 139 |
140 void VideoRendererBase::Initialize(VideoDecoder* decoder, | 140 void VideoRendererBase::Initialize(VideoDecoder* decoder, |
141 FilterCallback* callback) { | 141 FilterCallback* callback) { |
142 AutoLock auto_lock(lock_); | 142 AutoLock auto_lock(lock_); |
143 DCHECK(decoder); | 143 DCHECK(decoder); |
144 DCHECK(callback); | 144 DCHECK(callback); |
145 DCHECK_EQ(kUninitialized, state_); | 145 DCHECK_EQ(kUninitialized, state_); |
146 decoder_ = decoder; | 146 decoder_ = decoder; |
147 scoped_ptr<FilterCallback> c(callback); | 147 scoped_ptr<FilterCallback> c(callback); |
148 | 148 |
| 149 decoder_->set_fill_buffer_done_callback( |
| 150 NewCallback(this, &VideoRendererBase::OnFillBufferDone)); |
149 // Notify the pipeline of the video dimensions. | 151 // Notify the pipeline of the video dimensions. |
150 if (!ParseMediaFormat(decoder->media_format(), &width_, &height_, | 152 if (!ParseMediaFormat(decoder->media_format(), &width_, &height_, |
151 &uses_egl_image_)) { | 153 &uses_egl_image_)) { |
152 host()->SetError(PIPELINE_ERROR_INITIALIZATION_FAILED); | 154 host()->SetError(PIPELINE_ERROR_INITIALIZATION_FAILED); |
153 callback->Run(); | 155 callback->Run(); |
154 return; | 156 return; |
155 } | 157 } |
156 host()->SetVideoSize(width_, height_); | 158 host()->SetVideoSize(width_, height_); |
157 | 159 |
158 // Initialize the subclass. | 160 // Initialize the subclass. |
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
305 | 307 |
306 void VideoRendererBase::GetCurrentFrame(scoped_refptr<VideoFrame>* frame_out) { | 308 void VideoRendererBase::GetCurrentFrame(scoped_refptr<VideoFrame>* frame_out) { |
307 AutoLock auto_lock(lock_); | 309 AutoLock auto_lock(lock_); |
308 // We should have initialized and have the current frame. | 310 // We should have initialized and have the current frame. |
309 DCHECK(state_ == kPaused || state_ == kSeeking || state_ == kPlaying || | 311 DCHECK(state_ == kPaused || state_ == kSeeking || state_ == kPlaying || |
310 state_ == kEnded); | 312 state_ == kEnded); |
311 DCHECK(current_frame_); | 313 DCHECK(current_frame_); |
312 *frame_out = current_frame_; | 314 *frame_out = current_frame_; |
313 } | 315 } |
314 | 316 |
315 void VideoRendererBase::OnReadComplete(VideoFrame* frame) { | 317 void VideoRendererBase::OnFillBufferDone(scoped_refptr<VideoFrame> frame) { |
316 AutoLock auto_lock(lock_); | 318 AutoLock auto_lock(lock_); |
317 | 319 |
318 // TODO(ajwong): Work around cause we don't synchronize on stop. Correct | 320 // TODO(ajwong): Work around cause we don't synchronize on stop. Correct |
319 // fix is to resolve http://crbug.com/16059. | 321 // fix is to resolve http://crbug.com/16059. |
320 if (state_ == kStopped) { | 322 if (state_ == kStopped) { |
321 return; | 323 return; |
322 } | 324 } |
323 | 325 |
324 DCHECK(state_ == kPaused || state_ == kSeeking || state_ == kPlaying || | 326 DCHECK(state_ == kPaused || state_ == kSeeking || state_ == kPlaying || |
325 state_ == kEnded); | 327 state_ == kEnded); |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
360 pause_callback_.reset(); | 362 pause_callback_.reset(); |
361 } | 363 } |
362 } | 364 } |
363 } | 365 } |
364 | 366 |
365 void VideoRendererBase::ScheduleRead_Locked() { | 367 void VideoRendererBase::ScheduleRead_Locked() { |
366 lock_.AssertAcquired(); | 368 lock_.AssertAcquired(); |
367 DCHECK_NE(kEnded, state_); | 369 DCHECK_NE(kEnded, state_); |
368 DCHECK_LT(pending_reads_, kMaxFrames); | 370 DCHECK_LT(pending_reads_, kMaxFrames); |
369 ++pending_reads_; | 371 ++pending_reads_; |
370 decoder_->Read(NewCallback(this, &VideoRendererBase::OnReadComplete)); | 372 // TODO(jiesun): We use dummy buffer to feed decoder to let decoder to |
| 373 // provide buffer pools. In the future, we may want to implement real |
| 374 // buffer pool to recycle buffers. |
| 375 scoped_refptr<VideoFrame> video_frame; |
| 376 decoder_->FillThisBuffer(video_frame); |
371 } | 377 } |
372 | 378 |
373 base::TimeDelta VideoRendererBase::CalculateSleepDuration( | 379 base::TimeDelta VideoRendererBase::CalculateSleepDuration( |
374 VideoFrame* next_frame, float playback_rate) { | 380 VideoFrame* next_frame, float playback_rate) { |
375 // Determine the current and next presentation timestamps. | 381 // Determine the current and next presentation timestamps. |
376 base::TimeDelta now = host()->GetTime(); | 382 base::TimeDelta now = host()->GetTime(); |
377 base::TimeDelta this_pts = current_frame_->GetTimestamp(); | 383 base::TimeDelta this_pts = current_frame_->GetTimestamp(); |
378 base::TimeDelta next_pts; | 384 base::TimeDelta next_pts; |
379 if (next_frame) { | 385 if (next_frame) { |
380 next_pts = next_frame->GetTimestamp(); | 386 next_pts = next_frame->GetTimestamp(); |
(...skipping 12 matching lines...) Expand all Loading... |
393 previous_time_ = now; | 399 previous_time_ = now; |
394 } | 400 } |
395 | 401 |
396 // Scale our sleep based on the playback rate. | 402 // Scale our sleep based on the playback rate. |
397 // TODO(scherkus): floating point badness and degrade gracefully. | 403 // TODO(scherkus): floating point badness and degrade gracefully. |
398 return base::TimeDelta::FromMicroseconds( | 404 return base::TimeDelta::FromMicroseconds( |
399 static_cast<int64>(sleep.InMicroseconds() / playback_rate)); | 405 static_cast<int64>(sleep.InMicroseconds() / playback_rate)); |
400 } | 406 } |
401 | 407 |
402 } // namespace media | 408 } // namespace media |
OLD | NEW |