Chromium Code Reviews| 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,98 @@ |
| +// 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" |
| +#include "media/base/filter_host.h" |
|
acolwell GONE FROM CHROMIUM
2012/01/06 18:09:16
nit: I don't think this include is needed.
wjia(left Chromium)
2012/01/06 22:18:59
Done.
|
| + |
| +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 |