Logo
ApraPipes 1.0
Loading...
Searching...
No Matches
DMAFrameUtils.h
1#pragma once
2
3#include "Frame.h"
4#include "FrameMetadata.h"
5#include "FrameMetadataFactory.h"
6#include "ImagePlaneData.h"
7#include "AIPExceptions.h"
8#include "DMAFDWrapper.h"
9#include "DMAAllocator.h"
10#include <memory>
11
13{
14public:
15 typedef std::function<void(frame_sp &, ImagePlanes &)> GetImagePlanes;
16
17public:
18 static GetImagePlanes getImagePlanesFunction(framemetadata_sp &metadata, ImagePlanes &imagePlanes)
19 {
20
21 auto frameType = metadata->getFrameType();
22 switch (frameType)
23 {
25 {
26 size_t pitch[4] = {0, 0, 0, 0};
27 auto rawMetadata = FrameMetadataFactory::downcast<RawImageMetadata>(metadata);
28 auto imageType = rawMetadata->getImageType();
29 FrameMetadata::MemType inputMemType = metadata->getMemType();
30 if (inputMemType == FrameMetadata::MemType::DMABUF)
31 {
32 int type = CV_8UC4;
33 switch (imageType)
34 {
37 type = CV_8UC4;
38 break;
41 type = CV_8UC3;
42 break;
43 default:
44 throw AIPException(AIP_FATAL, "Only Image Type accepted are UYVY or ARGB found " + std::to_string(imageType));
45 }
46 auto imageType = rawMetadata->getImageType();
47 auto metadata = framemetadata_sp(new RawImageMetadata(rawMetadata->getWidth(), rawMetadata->getHeight(), imageType, type, size_t(0), CV_8U, FrameMetadata::MemType::DMABUF, true));
48 DMAAllocator::setMetadata(metadata, rawMetadata->getWidth(), rawMetadata->getHeight(), imageType, pitch);
49
50 imagePlanes.push_back(std::make_shared<ImagePlaneData>(metadata->getDataSize(),
51 pitch[0],
52 rawMetadata->getRowSize(),
53 rawMetadata->getWidth(),
54 rawMetadata->getHeight()));
55 }
56
57 else
58 {
59
60 imagePlanes.push_back(std::make_shared<ImagePlaneData>(metadata->getDataSize(),
61 rawMetadata->getStep(),
62 rawMetadata->getRowSize(),
63 rawMetadata->getWidth(),
64 rawMetadata->getHeight()));
65 }
66
68 }
70 {
72 auto imageType = rawMetadata->getImageType();
73 auto channels = rawMetadata->getChannels();
74 FrameMetadata::MemType inputMemType = metadata->getMemType();
75 size_t pitch[4] = {0, 0, 0, 0};
76 size_t offset[4] = {0, 0, 0, 0};
77 size_t width[4];
78 size_t height[4];
79 if (inputMemType == FrameMetadata::MemType::DMABUF)
80 {
81 for (auto i = 0; i < channels; i++)
82 {
83 width[i] = rawMetadata->getWidth(i);
84 height[i] = rawMetadata->getHeight(i);
85 }
86 auto metadata = framemetadata_sp(new RawImagePlanarMetadata(width[0], height[0], imageType, size_t(0), CV_8U, FrameMetadata::MemType::DMABUF));
87 DMAAllocator::setMetadata(metadata, width[0], height[0], imageType, pitch, offset);
88
89 for (auto i = 0; i < channels; i++)
90 {
91 imagePlanes.push_back(std::make_shared<ImagePlaneData>(rawMetadata->getDataSizeByChannel(i),
92 pitch[i],
93 rawMetadata->getRowSize(i),
94 width[i],
95 height[i]));
96 }
97 }
98
99 else
100 {
101 for (auto i = 0; i < channels; i++)
102 {
103 imagePlanes.push_back(std::make_shared<ImagePlaneData>(rawMetadata->getDataSizeByChannel(i),
104 rawMetadata->getStep(i),
105 rawMetadata->getRowSize(i),
106 rawMetadata->getWidth(i),
107 rawMetadata->getHeight(i)));
108 }
109 }
110
111 switch (imageType)
112 {
117 default:
118 throw AIPException(AIP_FATAL, "Unsupported ImageType<" + std::to_string(imageType) + ">");
119 }
120 }
121 default:
122 throw AIPException(AIP_FATAL, "Unsupported FrameType<" + std::to_string(frameType) + ">");
123 }
124 }
125
126 static void getDMAFDHostImagePlanes(frame_sp &frame, ImagePlanes &imagePlanes)
127 {
128 auto inputMetadata = frame->getMetadata();
129 FrameMetadata::MemType mInputMemType = inputMetadata->getMemType();
130 if (mInputMemType == FrameMetadata::MemType::DMABUF)
131 {
132
133 auto ptr = static_cast<DMAFDWrapper *>(frame->data());
134 imagePlanes[0]->data = ptr->getHostPtr();
135 }
136 else
137 {
138 auto ptr = static_cast<uint8_t *>(frame->data());
139 imagePlanes[0]->data = ptr;
140 }
141 }
142
143 static void getDMAFDYUV420HostImagePlanes(frame_sp &frame, ImagePlanes &imagePlanes)
144 {
145 auto ptr = static_cast<DMAFDWrapper *>(frame->data());
146 imagePlanes[0]->data = ptr->getHostPtrY();
147 imagePlanes[1]->data = ptr->getHostPtrU();
148 imagePlanes[2]->data = ptr->getHostPtrV();
149 }
150
151 static void getDMAFDNV12HostImagePlanes(frame_sp &frame, ImagePlanes &imagePlanes)
152 {
153 auto ptr = static_cast<DMAFDWrapper *>(frame->data());
154 imagePlanes[0]->data = ptr->getHostPtrY();
155 imagePlanes[1]->data = ptr->getHostPtrUV();
156 }
157};
static void setMetadata(framemetadata_sp &metadata, int width, int height, ImageMetadata::ImageType imageType, size_t pitchValues[4]=nullptr, size_t offsetValues[4]=nullptr)
Definition DMAAllocator.h:101
Definition DMAFDWrapper.h:8
void * getHostPtr()
Definition DMAFDWrapper.cpp:137
void * getHostPtrY()
Definition DMAFDWrapper.cpp:147
Definition DMAFrameUtils.h:13
static void getDMAFDNV12HostImagePlanes(frame_sp &frame, ImagePlanes &imagePlanes)
Definition DMAFrameUtils.h:151
static GetImagePlanes getImagePlanesFunction(framemetadata_sp &metadata, ImagePlanes &imagePlanes)
Definition DMAFrameUtils.h:18
static void getDMAFDYUV420HostImagePlanes(frame_sp &frame, ImagePlanes &imagePlanes)
Definition DMAFrameUtils.h:143
static void getDMAFDHostImagePlanes(frame_sp &frame, ImagePlanes &imagePlanes)
Definition DMAFrameUtils.h:126
std::function< void(frame_sp &, ImagePlanes &)> GetImagePlanes
Definition DMAFrameUtils.h:15
static T * downcast(framemetadata_sp metadata)
Definition FrameMetadataFactory.h:9
MemType
Definition FrameMetadata.h:58
@ DMABUF
Definition FrameMetadata.h:62
@ RAW_IMAGE_PLANAR
Definition FrameMetadata.h:33
@ RAW_IMAGE
Definition FrameMetadata.h:32
@ RGBA
Definition ImageMetadata.h:17
@ YUV420
Definition ImageMetadata.h:20
@ YUYV
Definition ImageMetadata.h:22
@ UYVY
Definition ImageMetadata.h:21
@ BGRA
Definition ImageMetadata.h:15
@ NV12
Definition ImageMetadata.h:23
Definition RawImageMetadata.h:10
Definition RawImagePlanarMetadata.h:8