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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
// Copyright (c) 2012-2017 VideoStitch SAS
// Copyright (c) 2018 stitchEm
#include <gpu/core1/mergerKernel.hpp>
#include <core1/imageMapping.hpp>
#include "libvideostitch/panoDef.hpp"
#include "../kernel.hpp"
namespace {
#include "mergerKernel.xxd"
INDIRECT_REGISTER_OPENCL_PROGRAM(mergerKernel, true);
} // namespace
namespace VideoStitch {
namespace Core {
Status countInputs(TextureTarget t, const PanoDefinition& pano, GPU::Buffer<uint32_t> panoDevOut,
const Core::ImageMapping& fromIm, GPU::Stream stream) {
if (fromIm.getOutputRect(t).empty()) {
return Status::OK();
}
std::string kernelName;
if (fromIm.getOutputRect(t).right() >= (int64_t)pano.getWidth()) {
kernelName = KERNEL_STR(countInputsKernelWrap);
} else {
kernelName = KERNEL_STR(countInputsKernelNoWrap);
}
auto kernel2D =
GPU::Kernel::get(PROGRAM(mergerKernel), kernelName)
.setup2D(stream, (unsigned)fromIm.getOutputRect(t).getWidth(), (unsigned)fromIm.getOutputRect(t).getHeight());
return kernel2D.enqueueWithKernelArgs(
panoDevOut.get(), (unsigned)pano.getWidth(), (unsigned)pano.getHeight(), fromIm.getDeviceOutputBuffer(t).get(),
(unsigned)fromIm.getOutputRect(t).getWidth(), (unsigned)fromIm.getOutputRect(t).getHeight(),
(unsigned)fromIm.getOutputRect(t).left(), (unsigned)fromIm.getOutputRect(t).top());
}
Status colorMap(const PanoDefinition& pano, GPU::Buffer<uint32_t> panoDevOut, GPU::Stream stream) {
const int64_t size = pano.getWidth() * pano.getHeight();
auto kernel2D = GPU::Kernel::get(PROGRAM(mergerKernel), KERNEL_STR(colormapKernel)).setup1D(stream, (unsigned)size);
return kernel2D.enqueueWithKernelArgs(panoDevOut.get(), (unsigned)pano.getWidth(), (unsigned)size);
}
Status stitchingError(TextureTarget t, const PanoDefinition& pano, GPU::Buffer<uint32_t> panoDevOut,
const ImageMapping& fromIm, GPU::Stream stream) {
if (fromIm.getOutputRect(t).empty()) {
return Status::OK();
}
std::string kernelName;
if (fromIm.getOutputRect(t).right() >= (int64_t)pano.getWidth()) {
kernelName = KERNEL_STR(stitchingErrorKernelWrap);
} else {
kernelName = KERNEL_STR(stitchingErrorKernelNoWrap);
}
auto kernel2D =
GPU::Kernel::get(PROGRAM(mergerKernel), kernelName)
.setup2D(stream, (unsigned)fromIm.getOutputRect(t).getWidth(), (unsigned)fromIm.getOutputRect(t).getHeight());
return kernel2D.enqueueWithKernelArgs(
panoDevOut.get(), (unsigned)pano.getWidth(), (unsigned)pano.getHeight(), fromIm.getDeviceOutputBuffer(t).get(),
(unsigned)fromIm.getOutputRect(t).getWidth(), (unsigned)fromIm.getOutputRect(t).getHeight(),
(unsigned)fromIm.getOutputRect(t).left(), (unsigned)fromIm.getOutputRect(t).top());
}
Status exposureDiffRGB(TextureTarget t, const PanoDefinition& pano, GPU::Buffer<uint32_t> panoDevOut,
const ImageMapping& fromIm, GPU::Stream stream) {
if (fromIm.getOutputRect(t).empty()) {
return Status::OK();
}
std::string kernelName;
if (fromIm.getOutputRect(t).right() >= (int64_t)pano.getWidth()) {
kernelName = KERNEL_STR(exposureErrorRGBKernelWrap);
} else {
kernelName = KERNEL_STR(exposureErrorRGBKernelNoWrap);
}
auto kernel2D =
GPU::Kernel::get(PROGRAM(mergerKernel), kernelName)
.setup2D(stream, (unsigned)fromIm.getOutputRect(t).getWidth(), (unsigned)fromIm.getOutputRect(t).getHeight());
return kernel2D.enqueueWithKernelArgs(
panoDevOut.get(), (unsigned)pano.getWidth(), (unsigned)pano.getHeight(), fromIm.getDeviceOutputBuffer(t).get(),
(unsigned)fromIm.getOutputRect(t).getWidth(), (unsigned)fromIm.getOutputRect(t).getHeight(),
(unsigned)fromIm.getOutputRect(t).left(), (unsigned)fromIm.getOutputRect(t).top());
}
Status amplitude(const PanoDefinition& pano, GPU::Buffer<uint32_t> panoDevOut, GPU::Stream stream) {
const int64_t size = pano.getWidth() * pano.getHeight();
auto kernel1D = GPU::Kernel::get(PROGRAM(mergerKernel), KERNEL_STR(amplitudeKernel)).setup1D(stream, (unsigned)size);
return kernel1D.enqueueWithKernelArgs(panoDevOut.get(), 0, (3 * 256 * 256), (unsigned)pano.getWidth(),
(unsigned)size);
}
Status disregardNoDiffArea(const PanoDefinition& pano, GPU::Buffer<uint32_t> panoDevOut, GPU::Stream stream) {
const int64_t size = pano.getWidth() * pano.getHeight();
auto kernel1D =
GPU::Kernel::get(PROGRAM(mergerKernel), KERNEL_STR(maskOutSingleInput)).setup1D(stream, (unsigned)size);
return kernel1D.enqueueWithKernelArgs(panoDevOut.get(), (unsigned)pano.getWidth(), (unsigned)size);
}
Status checkerMerge(TextureTarget t, const PanoDefinition& pano, GPU::Buffer<uint32_t> panoDevOut,
const ImageMapping& fromIm, unsigned checkerSize, GPU::Stream stream) {
if (fromIm.getOutputRect(t).empty()) {
return Status::OK();
}
std::string kernelName;
if (fromIm.getOutputRect(t).right() >= (int64_t)pano.getWidth()) {
kernelName = KERNEL_STR(checkerInsertKernelWrap);
} else {
kernelName = KERNEL_STR(checkerInsertKernelNoWrap);
}
auto kernel2D =
GPU::Kernel::get(PROGRAM(mergerKernel), kernelName)
.setup2D(stream, (unsigned)fromIm.getOutputRect(t).getWidth(), (unsigned)fromIm.getOutputRect(t).getHeight());
return kernel2D.enqueueWithKernelArgs(
panoDevOut.get(), (unsigned)pano.getWidth(), (unsigned)pano.getHeight(), fromIm.getDeviceOutputBuffer(t).get(),
(unsigned)fromIm.getOutputRect(t).getWidth(), (unsigned)fromIm.getOutputRect(t).getHeight(),
(unsigned)fromIm.getOutputRect(t).left(), (unsigned)fromIm.getOutputRect(t).top(), checkerSize);
}
Status noblend(TextureTarget t, const PanoDefinition& pano, GPU::Buffer<uint32_t> panoDevOut,
const ImageMapping& fromIm, GPU::Stream stream) {
if (fromIm.getOutputRect(t).empty()) {
return Status::OK();
}
std::string kernelName;
if (fromIm.getOutputRect(t).right() >= (int64_t)pano.getWidth()) {
kernelName = KERNEL_STR(noblendKernelWrap);
} else {
kernelName = KERNEL_STR(noblendKernelNoWrap);
}
auto kernel2D =
GPU::Kernel::get(PROGRAM(mergerKernel), kernelName)
.setup2D(stream, (unsigned)fromIm.getOutputRect(t).getWidth(), (unsigned)fromIm.getOutputRect(t).getHeight());
return kernel2D.enqueueWithKernelArgs(
panoDevOut.get(), (unsigned)pano.getWidth(), (unsigned)pano.getHeight(), fromIm.getDeviceOutputBuffer(t).get(),
(unsigned)fromIm.getOutputRect(t).getWidth(), (unsigned)fromIm.getOutputRect(t).getHeight(),
(unsigned)fromIm.getOutputRect(t).left(), (unsigned)fromIm.getOutputRect(t).top());
};
} // namespace Core
} // namespace VideoStitch