| // Copyright 2015 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. |
| |
| #ifndef MEDIA_VIDEO_GPU_MEMORY_BUFFER_VIDEO_FRAME_POOL_H_ |
| #define MEDIA_VIDEO_GPU_MEMORY_BUFFER_VIDEO_FRAME_POOL_H_ |
| |
| #include "base/macros.h" |
| #include "base/memory/ref_counted.h" |
| #include "base/task_runner.h" |
| #include "media/base/video_frame.h" |
| |
| namespace base { |
| class SingleThreadTaskRunner; |
| } |
| |
| namespace media { |
| class GpuVideoAcceleratorFactories; |
| |
| // Interface to a pool of GpuMemoryBuffers/textures/images that can be used to |
| // transform software VideoFrames to VideoFrames backed by native textures. |
| // The resources used by the VideoFrame created by the pool will be |
| // automatically put back into the pool once the frame is destroyed. |
| // The pool recycles resources to a void unnecessarily allocating and |
| // destroying textures, images and GpuMemoryBuffer that could result |
| // in a round trip to the browser/GPU process. |
| // NOTE: Destroying the pool will not immediately invalidate outstanding video |
| // frames. GPU memory buffers will be kept alive by video frames indirectly |
| // referencing them. Video frames themselves are ref-counted and will be |
| // released when they are no longer needed, potentially after the pool is |
| // destroyed. |
| class MEDIA_EXPORT GpuMemoryBufferVideoFramePool { |
| public: |
| GpuMemoryBufferVideoFramePool(); |
| GpuMemoryBufferVideoFramePool( |
| const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner, |
| const scoped_refptr<base::TaskRunner>& worker_task_runner, |
| GpuVideoAcceleratorFactories* gpu_factories); |
| virtual ~GpuMemoryBufferVideoFramePool(); |
| |
| // Callback used by MaybeCreateHardwareFrame to deliver a new VideoFrame |
| // after it has been copied to GpuMemoryBuffers. |
| typedef base::Callback<void(const scoped_refptr<VideoFrame>&)> FrameReadyCB; |
| |
| // Calls |cb| on |media_worker_pool| with a new VideoFrame containing only |
| // mailboxes to native resources. |cb| will be destroyed on |
| // |media_worker_pool|. |
| // The content of the new object is copied from the software-allocated |
| // |video_frame|. |
| // If it's not possible to create a new hardware VideoFrame, |video_frame| |
| // itself will passed to |cb|. |
| virtual void MaybeCreateHardwareFrame( |
| const scoped_refptr<VideoFrame>& video_frame, |
| const FrameReadyCB& frame_ready_cb); |
| |
| private: |
| class PoolImpl; |
| scoped_refptr<PoolImpl> pool_impl_; |
| |
| DISALLOW_COPY_AND_ASSIGN(GpuMemoryBufferVideoFramePool); |
| }; |
| |
| } // namespace media |
| |
| #endif // MEDIA_VIDEO_GPU_MEMORY_BUFFER_VIDEO_FRAME_POOL_H_ |