CVB++ 15.0
decl_buffer_image.hpp
1#pragma once
2
3#include <algorithm>
4#include <exception>
5#include <memory>
6#include <vector>
7
8#include "../../global.hpp"
9#include "../driver.hpp"
10#include "../stream_image.hpp"
11
12namespace Cvb
13{
14
15 CVB_BEGIN_INLINE_NS
16
17 namespace Driver
18 {
19
20 class BufferImage : public StreamImage
21 {
22 struct PrivateTag
23 {
24 };
25
26 public:
27 class ImageLayout
28 {
29 public:
30 static std::unique_ptr<ImageLayout> FromImage(const Image &image);
31
32 static std::unique_ptr<ImageLayout> FromIMGHandle(void *handle);
33
34 ImageLayout() noexcept = default;
35 ImageLayout(const ImageLayout &other) = delete;
36 ImageLayout &operator=(const ImageLayout &other) = delete;
37 ImageLayout(ImageLayout &&other) = delete;
38 ImageLayout &operator=(ImageLayout &&other) = delete;
39
40 virtual ~ImageLayout() = default;
41
42 virtual void *CloneImage(const Image &image) const = 0;
43
44 void *CloneIMGHandle(void *handle) const;
45 };
46
47 static std::unique_ptr<BufferImage> Create(const DevicePtr &device, const ImageLayout &layout,
48 double rawTimestamp);
49
50 static std::unique_ptr<BufferImage> Create(const DevicePtr &device, double rawTimestamp);
51
52 BufferImage(HandleGuard<Image> &&guard, const DevicePtr &device, double rawTimestamp, PrivateTag) noexcept
53 : StreamImage(std::move(guard))
54 , device_(device)
55 {
56 SetRawTimestamp(rawTimestamp);
57 }
58
59 private:
60 class HandleImage : public Image
61 {
62 public:
63 explicit HandleImage(void *handle) noexcept
64 : Image(HandleGuard<Image>(handle))
65 {
66 }
67
68 HandleImage(const HandleImage &other) = delete;
69 HandleImage &operator=(const HandleImage &other) = delete;
70 HandleImage(HandleImage &&other) = delete;
71 HandleImage &operator=(HandleImage &&other) = delete;
72
73 virtual ~HandleImage()
74 {
75 Detach();
76 }
77 };
78
79 class LinearLayout : public ImageLayout
80 {
81 struct PrivateTag
82 {
83 };
84
85 private:
86 struct PlaneIndexPair
87 {
88 std::uint8_t *BasePtr;
89 int PlaneIndex;
90 };
91
92 public:
93 static std::unique_ptr<LinearLayout> TryCreate(const Image &image) noexcept;
94
95 void *CloneImage(const Image &image) const override;
96
97 LinearLayout(std::size_t memSize, std::intptr_t xInc, std::intptr_t yInc, std::intptr_t planeInc,
98 const std::vector<PlaneIndexPair> &planeBases, PrivateTag)
99 : memSize_(memSize)
100 , xInc_(xInc)
101 , yInc_(yInc)
102 , planeInc_(planeInc)
103 {
104 std::vector<CExports::cvbval_t> planeOrder(planeBases.size());
105 for (size_t i = 0; i < planeOrder.size(); ++i)
106 planeOrder[i] = static_cast<CExports::cvbval_t>(planeBases[i].PlaneIndex);
107
108 planeOrder.swap(planeOrder_);
109 }
110
111 private:
112 std::size_t memSize_;
113 std::intptr_t xInc_;
114 std::intptr_t yInc_;
115 std::intptr_t planeInc_;
116 std::vector<CExports::cvbval_t> planeOrder_;
117 };
118
119 class NonLinearLayout : public ImageLayout
120 {
121
122 public:
123 void *MakeImageFromPlane(const ImagePlane &plane) const;
124
125 void *CloneImage(const Image &image) const override;
126
127 private:
128 class ImageArrayGuard
129 {
130 public:
131 explicit ImageArrayGuard(std::vector<CExports::IMG> &imageArray)
132 : imageArray_(imageArray)
133 {
134 }
135
136 ImageArrayGuard(const ImageArrayGuard &other) = delete;
137 ImageArrayGuard &operator=(const ImageArrayGuard &other) = delete;
138 ImageArrayGuard(ImageArrayGuard &&other) = delete;
139 ImageArrayGuard &operator=(ImageArrayGuard &&other) = delete;
140
141 ~ImageArrayGuard()
142 {
143 for (auto &img : imageArray_)
144 CVB_CALL_CAPI(ReleaseObject(img));
145 }
146
147 private:
148 std::vector<CExports::IMG> &imageArray_;
149 };
150 };
151
152 DevicePtr device_;
153 };
154
155 } // namespace Driver
156
157 using Driver::BufferImage;
158
159 CVB_END_INLINE_NS
160
161} // namespace Cvb
Base class of all stream related images.
Definition stream_image.hpp:32
cvbbool_t ReleaseObject(OBJ &Object)
Namespace for driver or device related operations.
Definition decl_composite.hpp:28
Root namespace for the Image Manager interface.
Definition c_bayer_to_rgb.h:17
std::shared_ptr< Device > DevicePtr
Convenience shared pointer for Device.
Definition global.hpp:98