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

Unified Diff: media/filters/video_renderer_base.cc

Issue 10796074: Move VideoRenderer out of Filter heirarchy. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src
Patch Set: GetMediaTime Created 8 years, 5 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « media/filters/video_renderer_base.h ('k') | media/filters/video_renderer_base_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: media/filters/video_renderer_base.cc
diff --git a/media/filters/video_renderer_base.cc b/media/filters/video_renderer_base.cc
index 8451201fae668bd916c1c86bb853bf48e6c9883b..a381a345c6aac6cee2bfe9affbec661f4431b02d 100644
--- a/media/filters/video_renderer_base.cc
+++ b/media/filters/video_renderer_base.cc
@@ -2,24 +2,23 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+#include "media/filters/video_renderer_base.h"
+
#include "base/bind.h"
#include "base/callback.h"
#include "base/callback_helpers.h"
#include "base/threading/platform_thread.h"
#include "media/base/buffers.h"
-#include "media/base/filter_host.h"
#include "media/base/limits.h"
#include "media/base/pipeline.h"
#include "media/base/video_frame.h"
-#include "media/filters/video_renderer_base.h"
namespace media {
VideoRendererBase::VideoRendererBase(const base::Closure& paint_cb,
const SetOpaqueCB& set_opaque_cb,
bool drop_frames)
- : host_(NULL),
- frame_available_(&lock_),
+ : frame_available_(&lock_),
state_(kUninitialized),
thread_(base::kNullThreadHandle),
pending_read_(false),
@@ -32,12 +31,6 @@ VideoRendererBase::VideoRendererBase(const base::Closure& paint_cb,
DCHECK(!paint_cb_.is_null());
}
-void VideoRendererBase::SetHost(FilterHost* host) {
- DCHECK(host);
- DCHECK(!host_);
- host_ = host;
-}
-
void VideoRendererBase::Play(const base::Closure& callback) {
base::AutoLock auto_lock(lock_);
DCHECK_EQ(kPrerolled, state_);
@@ -114,22 +107,36 @@ void VideoRendererBase::Seek(base::TimeDelta time, const PipelineStatusCB& cb) {
}
void VideoRendererBase::Initialize(const scoped_refptr<VideoDecoder>& decoder,
- const PipelineStatusCB& status_cb,
+ const PipelineStatusCB& init_cb,
const StatisticsCB& statistics_cb,
- const TimeCB& time_cb) {
+ const TimeCB& time_cb,
+ const NaturalSizeChangedCB& size_changed_cb,
+ const base::Closure& ended_cb,
+ const PipelineStatusCB& error_cb,
+ const TimeDeltaCB& get_time_cb,
+ const TimeDeltaCB& get_duration_cb) {
base::AutoLock auto_lock(lock_);
DCHECK(decoder);
- DCHECK(!status_cb.is_null());
+ DCHECK(!init_cb.is_null());
DCHECK(!statistics_cb.is_null());
DCHECK(!time_cb.is_null());
+ DCHECK(!size_changed_cb.is_null());
+ DCHECK(!ended_cb.is_null());
+ DCHECK(!get_time_cb.is_null());
+ DCHECK(!get_duration_cb.is_null());
DCHECK_EQ(kUninitialized, state_);
decoder_ = decoder;
statistics_cb_ = statistics_cb;
time_cb_ = time_cb;
+ size_changed_cb_ = size_changed_cb;
+ ended_cb_ = ended_cb;
+ error_cb_ = error_cb;
+ get_time_cb_ = get_time_cb;
+ get_duration_cb_ = get_duration_cb;
// Notify the pipeline of the video dimensions.
- host_->SetNaturalVideoSize(decoder_->natural_size());
+ size_changed_cb_.Run(decoder_->natural_size());
// We're all good! Consider ourselves flushed. (ThreadMain() should never
// see us in the kUninitialized state).
@@ -144,7 +151,7 @@ void VideoRendererBase::Initialize(const scoped_refptr<VideoDecoder>& decoder,
if (!base::PlatformThread::Create(0, this, &thread_)) {
NOTREACHED() << "Video thread creation failed";
state_ = kError;
- status_cb.Run(PIPELINE_ERROR_INITIALIZATION_FAILED);
+ init_cb.Run(PIPELINE_ERROR_INITIALIZATION_FAILED);
return;
}
@@ -153,7 +160,7 @@ void VideoRendererBase::Initialize(const scoped_refptr<VideoDecoder>& decoder,
// TODO(scherkus): find out if this is necessary, but it seems to help.
::SetThreadPriority(thread_, THREAD_PRIORITY_ABOVE_NORMAL);
#endif // defined(OS_WIN)
- status_cb.Run(PIPELINE_OK);
+ init_cb.Run(PIPELINE_OK);
}
bool VideoRendererBase::HasEnded() {
@@ -208,7 +215,7 @@ void VideoRendererBase::ThreadMain() {
// This can happen if our preroll only contains end of stream frames.
if (ready_frames_.front()->IsEndOfStream()) {
state_ = kEnded;
- host_->NotifyEnded();
+ ended_cb_.Run();
ready_frames_.clear();
// No need to sleep here as we idle when |state_ != kPlaying|.
@@ -247,7 +254,7 @@ void VideoRendererBase::ThreadMain() {
// |current_frame_|.
if (ready_frames_.front()->IsEndOfStream()) {
state_ = kEnded;
- host_->NotifyEnded();
+ ended_cb_.Run();
ready_frames_.clear();
// No need to sleep here as we idle when |state_ != kPlaying|.
@@ -265,7 +272,7 @@ void VideoRendererBase::ThreadMain() {
break;
base::TimeDelta remaining_time =
- ready_frames_.front()->GetTimestamp() - host_->GetTime();
+ ready_frames_.front()->GetTimestamp() - get_time_cb_.Run();
// Still a chance we can render the frame!
if (remaining_time.InMicroseconds() > 0)
@@ -384,7 +391,7 @@ void VideoRendererBase::FrameReady(VideoDecoder::DecoderStatus status,
return;
}
- host_->SetError(error);
+ error_cb_.Run(error);
return;
}
@@ -424,10 +431,11 @@ void VideoRendererBase::FrameReady(VideoDecoder::DecoderStatus status,
// frame rate. Another way for this to happen is for the container to state a
// smaller duration than the largest packet timestamp.
if (!frame->IsEndOfStream()) {
- if (frame->GetTimestamp() > host_->GetDuration())
- frame->SetTimestamp(host_->GetDuration());
- if ((frame->GetTimestamp() + frame->GetDuration()) > host_->GetDuration())
- frame->SetDuration(host_->GetDuration() - frame->GetTimestamp());
+ base::TimeDelta duration = get_duration_cb_.Run();
+ if (frame->GetTimestamp() > duration)
+ frame->SetTimestamp(duration);
+ if ((frame->GetTimestamp() + frame->GetDuration()) > duration)
+ frame->SetDuration(duration - frame->GetTimestamp());
}
// This one's a keeper! Place it in the ready queue.
@@ -516,7 +524,7 @@ base::TimeDelta VideoRendererBase::CalculateSleepDuration(
const scoped_refptr<VideoFrame>& next_frame,
float playback_rate) {
// Determine the current and next presentation timestamps.
- base::TimeDelta now = host_->GetTime();
+ base::TimeDelta now = get_time_cb_.Run();
base::TimeDelta this_pts = current_frame_->GetTimestamp();
base::TimeDelta next_pts;
if (!next_frame->IsEndOfStream()) {
« no previous file with comments | « media/filters/video_renderer_base.h ('k') | media/filters/video_renderer_base_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698