File: mojo_mjpeg_decode_accelerator_service.h

package info (click to toggle)
chromium 139.0.7258.127-1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 6,122,068 kB
  • sloc: cpp: 35,100,771; ansic: 7,163,530; javascript: 4,103,002; python: 1,436,920; asm: 946,517; xml: 746,709; pascal: 187,653; perl: 88,691; sh: 88,436; objc: 79,953; sql: 51,488; cs: 44,583; fortran: 24,137; makefile: 22,147; tcl: 15,277; php: 13,980; yacc: 8,984; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (110 lines) | stat: -rw-r--r-- 4,167 bytes parent folder | download | duplicates (3)
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
// Copyright 2015 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef COMPONENTS_CHROMEOS_CAMERA_MOJO_MJPEG_DECODE_ACCELERATOR_SERVICE_H_
#define COMPONENTS_CHROMEOS_CAMERA_MOJO_MJPEG_DECODE_ACCELERATOR_SERVICE_H_

#include <stdint.h>

#include <map>
#include <memory>
#include <vector>

#include "base/functional/callback.h"
#include "base/threading/thread_checker.h"
#include "components/chromeos_camera/common/mjpeg_decode_accelerator.mojom.h"
#include "components/chromeos_camera/gpu_mjpeg_decode_accelerator_factory.h"
#include "components/chromeos_camera/mjpeg_decode_accelerator.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"

namespace chromeos_camera {

// Implementation of a chromeos_camera::mojom::MjpegDecodeAccelerator which runs
// in the GPU process, and wraps a JpegDecodeAccelerator.
class MojoMjpegDecodeAcceleratorService
    : public chromeos_camera::mojom::MjpegDecodeAccelerator,
      public MjpegDecodeAccelerator::Client {
 public:
  using MjpegDecodeOnBeginFrameCB = std::optional<base::RepeatingClosure>;
  static void Create(
      mojo::PendingReceiver<chromeos_camera::mojom::MjpegDecodeAccelerator>
          receiver,
      base::RepeatingCallback<void(MjpegDecodeOnBeginFrameCB)> cb);

  MojoMjpegDecodeAcceleratorService(const MojoMjpegDecodeAcceleratorService&) =
      delete;
  MojoMjpegDecodeAcceleratorService& operator=(
      const MojoMjpegDecodeAcceleratorService&) = delete;

  ~MojoMjpegDecodeAcceleratorService() override;

  // MjpegDecodeAccelerator::Client implementation.
  void VideoFrameReady(int32_t buffer_id) override;
  void NotifyError(
      int32_t buffer_id,
      ::chromeos_camera::MjpegDecodeAccelerator::Error error) override;

 private:
  // A common wrapper type for Mojo callbacks of Decode* functions.
  using MojoCallback = base::OnceCallback<void(
      ::chromeos_camera::MjpegDecodeAccelerator::Error)>;
  using MojoCallbackMap = std::map<int32_t, MojoCallback>;

  // Holds the tasks coming from the client to be decoded.
  struct DecodeTask;

  // This constructor internally calls
  // GpuMjpegDecodeAcceleratorFactory::GetAcceleratorFactories() to
  // fill |accelerator_factory_functions_|.
  MojoMjpegDecodeAcceleratorService();

  // chromeos_camera::mojom::MjpegDecodeAccelerator implementation.
  void Initialize(InitializeCallback callback) override;
  void Decode(media::BitstreamBuffer input_buffer,
              const gfx::Size& coded_size,
              mojo::ScopedSharedBufferHandle output_handle,
              uint32_t output_buffer_size,
              DecodeCallback callback) override;
  void DecodeWithDmaBuf(int32_t task_id,
                        mojo::ScopedHandle src_dmabuf_fd,
                        uint32_t src_size,
                        uint32_t src_offset,
                        mojom::DmaBufVideoFramePtr dst_frame,
                        DecodeWithDmaBufCallback callback) override;
  void Uninitialize() override;

  void OnInitialize(
      std::vector<GpuMjpegDecodeAcceleratorFactory::CreateAcceleratorCB>
          remaining_accelerator_factory_functions,
      InitializeCallback init_cb,
      bool last_initialize_result);

  void InitializeInternal(
      std::vector<GpuMjpegDecodeAcceleratorFactory::CreateAcceleratorCB>
          remaining_accelerator_factory_functions,
      InitializeCallback init_cb);

  void NotifyDecodeStatus(
      int32_t bitstream_buffer_id,
      ::chromeos_camera::MjpegDecodeAccelerator::Error error);

  void DecodeWithDmaBufOnBeginFrame();

  // A map from |task_id| to MojoCallback.
  MojoCallbackMap mojo_cb_map_;

  bool accelerator_initialized_;

  std::unique_ptr<::chromeos_camera::MjpegDecodeAccelerator> accelerator_;
  base::RepeatingCallback<void(MjpegDecodeOnBeginFrameCB)> set_begin_frame_cb_;
  bool vsync_driven_decoding_ = false;
  std::vector<DecodeTask> input_queue_;
  THREAD_CHECKER(thread_checker_);

  base::WeakPtrFactory<MojoMjpegDecodeAcceleratorService> weak_this_factory_;
};

}  // namespace chromeos_camera

#endif  // COMPONENTS_CHROMEOS_CAMERA_MOJO_MJPEG_DECODE_ACCELERATOR_SERVICE_H_