Index: media/filters/video_frame_generator.cc |
=================================================================== |
--- media/filters/video_frame_generator.cc (revision 0) |
+++ media/filters/video_frame_generator.cc (revision 0) |
@@ -0,0 +1,97 @@ |
+// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "media/filters/video_frame_generator.h" |
+ |
+#include "base/bind.h" |
+#include "base/message_loop.h" |
+#include "media/base/demuxer_stream.h" |
+ |
+namespace media { |
+ |
+VideoFrameGenerator::VideoFrameGenerator( |
+ base::MessageLoopProxy* message_loop_proxy, |
+ const gfx::Size& size, |
+ const base::TimeDelta& frame_duration) |
+ : message_loop_proxy_(message_loop_proxy), |
+ natural_size_(size), |
+ stopped_(true), |
+ frame_duration_(frame_duration) { |
+} |
+ |
+VideoFrameGenerator::~VideoFrameGenerator() {} |
+ |
+void VideoFrameGenerator::Initialize( |
+ DemuxerStream* demuxer_stream, |
+ const PipelineStatusCB& filter_callback, |
+ const StatisticsCallback& stat_callback) { |
+ message_loop_proxy_->PostTask( |
+ FROM_HERE, |
+ base::Bind(&VideoFrameGenerator::InitializeOnDecoderThread, |
+ this, make_scoped_refptr(demuxer_stream), |
+ filter_callback, stat_callback)); |
+} |
+ |
+void VideoFrameGenerator::Read(const ReadCB& callback) { |
+ message_loop_proxy_->PostTask( |
+ FROM_HERE, |
+ base::Bind(&VideoFrameGenerator::ReadOnDecoderThread, |
+ this, callback)); |
+} |
+ |
+const gfx::Size& VideoFrameGenerator::natural_size() { |
+ return natural_size_; |
+} |
+ |
+void VideoFrameGenerator::Stop(const base::Closure& callback) { |
+ message_loop_proxy_->PostTask( |
+ FROM_HERE, |
+ base::Bind(&VideoFrameGenerator::StopOnDecoderThread, |
+ this, callback)); |
+} |
+ |
+void VideoFrameGenerator::InitializeOnDecoderThread( |
+ DemuxerStream* demuxer_stream, |
+ const PipelineStatusCB& filter_callback, |
+ const StatisticsCallback& stat_callback) { |
+ DVLOG(1) << "InitializeOnDecoderThread"; |
+ DCHECK(message_loop_proxy_->BelongsToCurrentThread()); |
+ |
+ filter_callback.Run(PIPELINE_OK); |
+ stopped_ = false; |
+} |
+ |
+void VideoFrameGenerator::ReadOnDecoderThread(const ReadCB& callback) { |
+ DCHECK(message_loop_proxy_->BelongsToCurrentThread()); |
+ CHECK(!callback.is_null()); |
+ if (stopped_) |
+ return; |
+ |
+ // Always allocate a new frame. |
+ // |
+ // TODO(scherkus): migrate this to proper buffer recycling. |
+ scoped_refptr<VideoFrame> video_frame = |
+ VideoFrame::CreateFrame(VideoFrame::YV12, |
+ natural_size_.width(), |
+ natural_size_.height(), |
+ current_time_, |
+ frame_duration_); |
+ current_time_ += frame_duration_; |
+ |
+ // TODO(wjia): set pixel data to pre-defined patterns if it's desired to |
+ // verify frame content. |
+ |
+ callback.Run(video_frame); |
+} |
+ |
+void VideoFrameGenerator::StopOnDecoderThread( |
+ const base::Closure& callback) { |
+ DVLOG(1) << "StopOnDecoderThread"; |
+ DCHECK(message_loop_proxy_->BelongsToCurrentThread()); |
+ stopped_ = true; |
+ current_time_ = base::TimeDelta(); |
+ callback.Run(); |
+} |
+ |
+} // namespace media |
Property changes on: media/filters/video_frame_generator.cc |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |