Extension syncing: Introduce a NeedsSync pref
[chromium-blink-merge.git] / media / base / video_frame_pool.cc
blob4951941d06be5d7ffe9e08e0959fb303ba7661c5
1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "media/base/video_frame_pool.h"
7 #include <list>
9 #include "base/bind.h"
10 #include "base/memory/ref_counted.h"
11 #include "base/synchronization/lock.h"
13 namespace media {
15 class VideoFramePool::PoolImpl
16 : public base::RefCountedThreadSafe<VideoFramePool::PoolImpl> {
17 public:
18 PoolImpl();
20 // Returns a frame from the pool that matches the specified
21 // parameters or creates a new frame if no suitable frame exists in
22 // the pool. The pool is drained if no matching frame is found.
23 scoped_refptr<VideoFrame> CreateFrame(VideoPixelFormat format,
24 const gfx::Size& coded_size,
25 const gfx::Rect& visible_rect,
26 const gfx::Size& natural_size,
27 base::TimeDelta timestamp);
29 // Shuts down the frame pool and releases all frames in |frames_|.
30 // Once this is called frames will no longer be inserted back into
31 // |frames_|.
32 void Shutdown();
34 size_t GetPoolSizeForTesting() const { return frames_.size(); }
36 private:
37 friend class base::RefCountedThreadSafe<VideoFramePool::PoolImpl>;
38 ~PoolImpl();
40 // Called when the frame wrapper gets destroyed.
41 // |frame| is the actual frame that was wrapped and is placed
42 // in |frames_| by this function so it can be reused.
43 void FrameReleased(const scoped_refptr<VideoFrame>& frame);
45 base::Lock lock_;
46 bool is_shutdown_;
47 std::list<scoped_refptr<VideoFrame> > frames_;
49 DISALLOW_COPY_AND_ASSIGN(PoolImpl);
52 VideoFramePool::PoolImpl::PoolImpl() : is_shutdown_(false) {}
54 VideoFramePool::PoolImpl::~PoolImpl() {
55 DCHECK(is_shutdown_);
58 scoped_refptr<VideoFrame> VideoFramePool::PoolImpl::CreateFrame(
59 VideoPixelFormat format,
60 const gfx::Size& coded_size,
61 const gfx::Rect& visible_rect,
62 const gfx::Size& natural_size,
63 base::TimeDelta timestamp) {
64 base::AutoLock auto_lock(lock_);
65 DCHECK(!is_shutdown_);
67 scoped_refptr<VideoFrame> frame;
69 while (!frame.get() && !frames_.empty()) {
70 scoped_refptr<VideoFrame> pool_frame = frames_.front();
71 frames_.pop_front();
73 if (pool_frame->format() == format &&
74 pool_frame->coded_size() == coded_size &&
75 pool_frame->visible_rect() == visible_rect &&
76 pool_frame->natural_size() == natural_size) {
77 frame = pool_frame;
78 frame->set_timestamp(timestamp);
79 break;
83 if (!frame.get()) {
84 frame = VideoFrame::CreateFrame(
85 format, coded_size, visible_rect, natural_size, timestamp);
88 scoped_refptr<VideoFrame> wrapped_frame = VideoFrame::WrapVideoFrame(
89 frame, frame->visible_rect(), frame->natural_size());
90 wrapped_frame->AddDestructionObserver(
91 base::Bind(&VideoFramePool::PoolImpl::FrameReleased, this, frame));
92 return wrapped_frame;
95 void VideoFramePool::PoolImpl::Shutdown() {
96 base::AutoLock auto_lock(lock_);
97 is_shutdown_ = true;
98 frames_.clear();
101 void VideoFramePool::PoolImpl::FrameReleased(
102 const scoped_refptr<VideoFrame>& frame) {
103 base::AutoLock auto_lock(lock_);
104 if (is_shutdown_)
105 return;
107 frames_.push_back(frame);
110 VideoFramePool::VideoFramePool() : pool_(new PoolImpl()) {
113 VideoFramePool::~VideoFramePool() {
114 pool_->Shutdown();
117 scoped_refptr<VideoFrame> VideoFramePool::CreateFrame(
118 VideoPixelFormat format,
119 const gfx::Size& coded_size,
120 const gfx::Rect& visible_rect,
121 const gfx::Size& natural_size,
122 base::TimeDelta timestamp) {
123 return pool_->CreateFrame(format, coded_size, visible_rect, natural_size,
124 timestamp);
127 size_t VideoFramePool::GetPoolSizeForTesting() const {
128 return pool_->GetPoolSizeForTesting();
131 } // namespace media