Logo
ApraPipes 1.0
Loading...
Searching...
No Matches
RawImagePlanarMetadata.h
1#pragma once
2
3#include "FrameMetadata.h"
4#include "ImageMetadata.h"
5#include <opencv2/opencv.hpp>
6
8{
9public:
11
12 RawImagePlanarMetadata(int _width, int _height, ImageMetadata::ImageType _imageType, size_t alignLength, int _depth, MemType _memType = MemType::HOST) : FrameMetadata(FrameType::RAW_IMAGE_PLANAR, _memType)
13 {
14 size_t _step[4] = {0, 0, 0, 0};
15
16 switch (_imageType)
17 {
19 for (auto i = 0; i < 3; i++)
20 {
21 _step[i] = _width + FrameMetadata::getPaddingLength(_width, alignLength);
22 }
23
24 break;
26 _step[0] = _width + FrameMetadata::getPaddingLength(_width, alignLength);
27 _step[1] = _step[0];
28 break;
30 _step[0] = _width + FrameMetadata::getPaddingLength(_width, alignLength);
31 _step[1] = _width >> 1;
32 _step[1] = _step[1] + FrameMetadata::getPaddingLength(_step[1], alignLength);
33 _step[2] = _step[1];
34 break;
35 default:
36 auto msg = "Unknown image type<" + std::to_string(imageType) + ">";
37 throw AIPException(AIP_NOTIMPLEMENTED, msg);
38 }
39
40 auto elemSize = ImageMetadata::getElemSize(_depth);
41 for (auto i = 0; i < maxChannels; i++)
42 {
43 _step[i] = _step[i] * elemSize;
44 }
45
46 initData(_width, _height, _imageType, _step, _depth, nextPtrOffset);
47 }
48
49 RawImagePlanarMetadata(int _width, int _height, ImageMetadata::ImageType _imageType, size_t _step[4], int _depth, MemType _memType = MemType::HOST) : FrameMetadata(FrameType::RAW_IMAGE_PLANAR, _memType)
50 {
51 initData(_width, _height, _imageType, _step, _depth, nextPtrOffset);
52 }
53
54 RawImagePlanarMetadata(int _width, int _height, ImageMetadata::ImageType _imageType, int _depth, size_t _step[4], size_t _nextPtrOffset[4], MemType _memType = MemType::HOST) : FrameMetadata(FrameType::RAW_IMAGE_PLANAR, _memType)
55 {
56 initData(_width, _height, _imageType, _step, _depth, _nextPtrOffset);
57 }
58
59 void reset()
60 {
62 // RAW_IMAGE
63 for (auto i = 0; i < maxChannels; i++)
64 {
65 width[i] = NOT_SET_NUM;
66 height[i] = NOT_SET_NUM;
67 step[i] = NOT_SET_NUM;
68 }
69 channels = NOT_SET_NUM;
70 depth = NOT_SET_NUM;
71 }
72
74 {
75 FrameMetadata::setData(metadata);
76
77 imageType = metadata.imageType;
78 channels = metadata.channels;
79 for (auto i = 0; i < channels; i++)
80 {
81 width[i] = metadata.width[i];
82 height[i] = metadata.height[i];
83 step[i] = metadata.step[i];
84 }
85 depth = metadata.depth;
86
88 }
89
90 bool isSet()
91 {
92 return channels != NOT_SET_NUM;
93 }
94
95 int getWidth(int channelId)
96 {
97 return width[channelId];
98 }
99
100 int getHeight(int channelId)
101 {
102 return height[channelId];
103 }
104
105 size_t getRowSize(int channelId)
106 {
107 auto multiple = 1;
108 if (channelId == 1 && imageType == ImageMetadata::NV12)
109 {
110 multiple = 2;
111 }
112 auto elemSize = ImageMetadata::getElemSize(depth);
113 return static_cast<size_t>(width[channelId] * elemSize * multiple);
114 }
115
116 size_t getStep(int channelId) { return step[channelId]; }
117 size_t getNextPtrOffset(int channelId) { return nextPtrOffset[channelId]; }
118
119 size_t getOffset(int channelId, int offsetX, int offsetY)
120 {
122 {
123 throw AIPException(AIP_NOTIMPLEMENTED, "Offset for NV12 not implemented");
124 }
125 if (imageType == ImageMetadata::YUV420 && channelId != 0)
126 {
127 offsetX = offsetX >> 1;
128 offsetY = offsetY >> 1;
129 }
130
131 auto elemSize = ImageMetadata::getElemSize(depth);
132
133 return ( step[channelId]*offsetY + (elemSize * offsetX) );
134 }
135
136 size_t getDataSizeByChannel(int channelId)
137 {
138 auto elemSize = ImageMetadata::getElemSize(depth);
139 return static_cast<size_t>(step[channelId] * height[channelId] * elemSize);
140 }
141
142 int getDepth() { return depth; }
143
144 int getChannels() { return channels; }
145
147
148protected:
150 {
151 dataSize = 0;
152 for (auto i = 0; i < channels; i++)
153 {
154 if (nextPtrOffset[i] == NOT_SET_NUM)
155 {
157 dataSize += step[i] * height[i];
158 }
159 }
160 }
161
162 void initData(int _width, int _height, ImageMetadata::ImageType _imageType, size_t _step[4], int _depth, size_t _nextPtrOffset[4])
163 {
164 channels = 3;
165 depth = _depth;
166 imageType = _imageType;
167
168 for (auto i = 0; i < channels; i++)
169 {
170 nextPtrOffset[i] = _nextPtrOffset[i];
171 step[i] = _step[i];
172 }
173
174 switch (_imageType)
175 {
177 for (auto i = 0; i < channels; i++)
178 {
179 width[i] = _width;
180 height[i] = _height;
181 }
182
183 break;
185 channels = 2;
186 width[0] = _width;
187 height[0] = _height;
188 width[1] = _width >> 1;
189 height[1] = _height >> 1;
190 break;
192 width[0] = _width;
193 height[0] = _height;
194 width[1] = _width >> 1;
195 height[1] = _height >> 1;
196 width[2] = width[1];
197 height[2] = height[1];
198
199 break;
200 default:
201 auto msg = "Unknown image type<" + std::to_string(imageType) + ">";
202 throw AIPException(AIP_NOTIMPLEMENTED, msg);
203 }
204
205 setDataSize();
206 }
207
208 // https://docs.opencv.org/4.1.1/d3/d63/classcv_1_1Mat.html
209 int width[4] = {NOT_SET_NUM, NOT_SET_NUM, NOT_SET_NUM, NOT_SET_NUM};
210 int height[4] = {NOT_SET_NUM, NOT_SET_NUM, NOT_SET_NUM, NOT_SET_NUM};
211 int channels = NOT_SET_NUM;
212 size_t step[4] = {NOT_SET_NUM, NOT_SET_NUM, NOT_SET_NUM, NOT_SET_NUM}; // https://docs.opencv.org/4.1.1/d3/d63/classcv_1_1Mat.html#a51615ebf17a64c968df0bf49b4de6a3a
213 size_t nextPtrOffset[4] = { NOT_SET_NUM, NOT_SET_NUM, NOT_SET_NUM, NOT_SET_NUM };
214 int depth = NOT_SET_NUM;
215
217
218 int maxChannels = 4;
219};
Definition FrameMetadata.h:10
virtual void reset()
Definition FrameMetadata.h:88
size_t dataSize
Definition FrameMetadata.h:145
static size_t getPaddingLength(size_t length, size_t alignLength)
Definition FrameMetadata.h:12
void setData(FrameMetadata &metadata)
Definition FrameMetadata.h:132
MemType
Definition FrameMetadata.h:58
@ HOST
Definition FrameMetadata.h:59
FrameType
Definition FrameMetadata.h:29
@ RAW_IMAGE_PLANAR
Definition FrameMetadata.h:33
static size_t getElemSize(int depth)
Definition ImageMetadata.h:32
ImageType
Definition ImageMetadata.h:11
@ YUV420
Definition ImageMetadata.h:20
@ YUV444
Definition ImageMetadata.h:19
@ NV12
Definition ImageMetadata.h:23
Definition RawImagePlanarMetadata.h:8
ImageMetadata::ImageType getImageType()
Definition RawImagePlanarMetadata.h:146
RawImagePlanarMetadata(int _width, int _height, ImageMetadata::ImageType _imageType, int _depth, size_t _step[4], size_t _nextPtrOffset[4], MemType _memType=MemType::HOST)
Definition RawImagePlanarMetadata.h:54
int width[4]
Definition RawImagePlanarMetadata.h:209
size_t getDataSizeByChannel(int channelId)
Definition RawImagePlanarMetadata.h:136
void setData(RawImagePlanarMetadata &metadata)
Definition RawImagePlanarMetadata.h:73
size_t getOffset(int channelId, int offsetX, int offsetY)
Definition RawImagePlanarMetadata.h:119
int maxChannels
Definition RawImagePlanarMetadata.h:218
size_t getStep(int channelId)
Definition RawImagePlanarMetadata.h:116
RawImagePlanarMetadata(int _width, int _height, ImageMetadata::ImageType _imageType, size_t alignLength, int _depth, MemType _memType=MemType::HOST)
Definition RawImagePlanarMetadata.h:12
bool isSet()
Definition RawImagePlanarMetadata.h:90
int depth
Definition RawImagePlanarMetadata.h:214
void initData(int _width, int _height, ImageMetadata::ImageType _imageType, size_t _step[4], int _depth, size_t _nextPtrOffset[4])
Definition RawImagePlanarMetadata.h:162
RawImagePlanarMetadata(MemType _memType)
Definition RawImagePlanarMetadata.h:10
size_t getRowSize(int channelId)
Definition RawImagePlanarMetadata.h:105
RawImagePlanarMetadata(int _width, int _height, ImageMetadata::ImageType _imageType, size_t _step[4], int _depth, MemType _memType=MemType::HOST)
Definition RawImagePlanarMetadata.h:49
size_t step[4]
Definition RawImagePlanarMetadata.h:212
void reset()
Definition RawImagePlanarMetadata.h:59
int getHeight(int channelId)
Definition RawImagePlanarMetadata.h:100
int getWidth(int channelId)
Definition RawImagePlanarMetadata.h:95
void setDataSize()
Definition RawImagePlanarMetadata.h:149
ImageMetadata::ImageType imageType
Definition RawImagePlanarMetadata.h:216
int getChannels()
Definition RawImagePlanarMetadata.h:144
int getDepth()
Definition RawImagePlanarMetadata.h:142
size_t nextPtrOffset[4]
Definition RawImagePlanarMetadata.h:213
int height[4]
Definition RawImagePlanarMetadata.h:210
int channels
Definition RawImagePlanarMetadata.h:211
size_t getNextPtrOffset(int channelId)
Definition RawImagePlanarMetadata.h:117