1 // Copyright 2018 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.
4 
5 #ifndef MEDIA_CAPTURE_VIDEO_CHROMEOS_REQUEST_BUILDER_H_
6 #define MEDIA_CAPTURE_VIDEO_CHROMEOS_REQUEST_BUILDER_H_
7 
8 #include <memory>
9 #include <set>
10 #include <vector>
11 
12 #include "base/optional.h"
13 #include "media/capture/video/chromeos/camera_device_delegate.h"
14 #include "media/capture/video/chromeos/mojom/camera3.mojom.h"
15 #include "media/capture/video_capture_types.h"
16 
17 namespace media {
18 
19 class CameraDeviceContext;
20 
21 // BufferInfo is used to store information about the buffer that is needed when
22 // building buffers.
23 struct BufferInfo {
24   uint64_t ipc_id;
25   gfx::Size dimension;
26   gfx::GpuMemoryBufferHandle gpu_memory_buffer_handle;
27   uint32_t drm_format;
28   cros::mojom::HalPixelFormat hal_pixel_format;
29 };
30 
31 // RequestBuilder is used to build capture request that will be sent to camera
32 // HAL process.
33 class CAPTURE_EXPORT RequestBuilder {
34  public:
35   using RequestBufferCallback = base::RepeatingCallback<
36       base::Optional<BufferInfo>(StreamType, base::Optional<uint64_t>)>;
37 
38   RequestBuilder(CameraDeviceContext* device_context,
39                  // Callback to request buffer from StreamBufferManager. Having
40                  // this callback, we do not need to include StreamBufferManager
41                  // when requesting buffer.
42                  RequestBufferCallback request_buffer_callback);
43   ~RequestBuilder();
44 
45   // Builds a capture request by given streams and settings. The
46   // |input_buffer_id| is used for reprocess request.
47   cros::mojom::Camera3CaptureRequestPtr BuildRequest(
48       std::set<StreamType> stream_types,
49       cros::mojom::CameraMetadataPtr settings,
50       base::Optional<uint64_t> input_buffer_id);
51 
52  private:
53   cros::mojom::CameraBufferHandlePtr CreateCameraBufferHandle(
54       StreamType stream_type,
55       BufferInfo buffer_info);
56 
57   cros::mojom::Camera3StreamBufferPtr CreateStreamBuffer(
58       StreamType stream_type,
59       uint64_t buffer_id,
60       cros::mojom::CameraBufferHandlePtr buffer_handle);
61 
62   CameraDeviceContext* device_context_;
63 
64   // The frame number. Increased by one for each capture request sent.
65   uint32_t frame_number_;
66 
67   RequestBufferCallback request_buffer_callback_;
68 };
69 }  // namespace media
70 
71 #endif  // MEDIA_CAPTURE_VIDEO_CHROMEOS_REQUEST_BUILDER_H_
72