summaryrefslogtreecommitdiff
path: root/chromium/media/gpu/chromeos/dmabuf_video_frame_pool.h
blob: 20e1bbc845c8a52bdaebbecf8dcf1b772f04a8a1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
// Copyright 2019 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_GPU_CHROMEOS_DMABUF_VIDEO_FRAME_POOL_H_
#define MEDIA_GPU_CHROMEOS_DMABUF_VIDEO_FRAME_POOL_H_

#include "base/memory/scoped_refptr.h"
#include "base/sequenced_task_runner.h"
#include "media/base/status.h"
#include "media/base/video_frame.h"
#include "media/gpu/chromeos/fourcc.h"
#include "media/gpu/chromeos/gpu_buffer_layout.h"
#include "media/gpu/media_gpu_export.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/gfx/geometry/size.h"

namespace media {

// Interface for allocating and managing DMA-buf VideoFrame. The client should
// set a task runner first, and guarantee both GetFrame() and the destructor are
// executed on this task runner.
// Note: other public methods might be called at different thread. The
// implementation must be thread-safe.
class MEDIA_GPU_EXPORT DmabufVideoFramePool {
 public:
  using DmabufId = const std::vector<base::ScopedFD>*;

  // Get the identifier of Dmabuf-backed |frame|. Calling this method with the
  // frames backed by the same Dmabuf should return the same result.
  static DmabufId GetDmabufId(const VideoFrame& frame);

  DmabufVideoFramePool();
  virtual ~DmabufVideoFramePool();

  // Setter method of |parent_task_runner_|. GetFrame() and destructor method
  // should be called at |parent_task_runner_|.
  // This method must be called only once before any GetFrame() is called.
  virtual void set_parent_task_runner(
      scoped_refptr<base::SequencedTaskRunner> parent_task_runner);

  // Sets the parameters of allocating frames and the maximum number of frames
  // which can be allocated.
  // Returns a valid GpuBufferLayout if the initialization is successful.
  // Returns StatusCode::kAborted if the initialization process is aborted.
  // Returns StatusCode::kInvalidArgument if any other error occurs.
  virtual StatusOr<GpuBufferLayout> Initialize(const Fourcc& fourcc,
                                               const gfx::Size& coded_size,
                                               const gfx::Rect& visible_rect,
                                               const gfx::Size& natural_size,
                                               size_t max_num_frames,
                                               bool use_protected) = 0;

  // Returns a frame from the pool with the layout that is returned by the
  // previous Initialize() method and zero timestamp. Returns nullptr if the
  // pool is exhausted.
  virtual scoped_refptr<VideoFrame> GetFrame() = 0;

  // Checks whether the pool is exhausted. This happens when the pool reached
  // its maximum size and all frames are in use. Calling GetFrame() when the
  // pool is exhausted will return a nullptr.
  virtual bool IsExhausted() = 0;

  // Set the callback for notifying when the pool is no longer exhausted. The
  // callback will be called on |parent_task_runner_|. Note: if there is a
  // pending callback when calling NotifyWhenFrameAvailable(), the old callback
  // would be dropped immediately.
  virtual void NotifyWhenFrameAvailable(base::OnceClosure cb) = 0;

  // Invoke to cause the pool to release all the frames it has allocated before
  // which will cause new ones to be allocated. This method must be called on
  // |parent_task_runner_| because it may invalidate weak ptrs.
  virtual void ReleaseAllFrames() = 0;

 protected:
  scoped_refptr<base::SequencedTaskRunner> parent_task_runner_;
};

}  // namespace media

#endif  // MEDIA_GPU_CHROMEOS_DMABUF_VIDEO_FRAME_POOL_H_