// 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;
class TickClock;
}

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: While destroying the pool will abort any uncompleted copies, it 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.
  using FrameReadyCB =
      base::OnceCallback<void(const scoped_refptr<VideoFrame>&)>;

  // 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,
      FrameReadyCB frame_ready_cb);

  // Aborts any pending copies. Previously provided |frame_ready_cb| callbacks
  // may still be called if the copy has already started.
  virtual void Abort();

  // Allows injection of a base::SimpleTestClock for testing.
  void SetTickClockForTesting(const base::TickClock* tick_clock);

 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_
