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
// Copyright (c) 2012-2017 VideoStitch SAS
// Copyright (c) 2018 stitchEm
#pragma once
#include "imageMerger.hpp"
#include "libvideostitch/imageMergerFactory.hpp"
#include <memory>
namespace VideoStitch {
namespace Core {
template <class T>
class LaplacianPyramid;
/**
* @brief Laplacian merger.
* See comments in imageMergerFactory.hpp
*/
class LaplacianImageMerger : public ImageMerger {
public:
/**
* @brief LaplacianImageMerger factory.
*/
class Factory : public ImageMergerFactory {
public:
static Potential<ImageMergerFactory> parse(const Ptv::Value& value);
/**
* Creates a factory that creates LaplacianImageMergers with the given properties.
*/
Factory(int feather, int levels, int64_t baseSize, int gaussianRadius, int filterPasses,
MaskMerger::MaskMergerType maskMergerType);
virtual Potential<ImageMerger> create(const PanoDefinition& pano, ImageMapping& fromIm, const ImageMerger* to,
bool progressive) const;
virtual ~Factory() {}
Ptv::Value* serialize() const;
virtual CoreVersion version() const { return CoreVersion1; }
virtual ImageMergerFactory* clone() const;
virtual std::string hash() const;
virtual uint32_t getBlockAlignment() const;
private:
/**
* Compute the desired number of levels for a given panorama size.
*/
int computeNumLevels(int64_t width, int64_t height) const;
const int feather;
const int levels;
const int64_t baseSize;
const int gaussianRadius;
const int filterPasses;
const MaskMerger::MaskMergerType maskMergerType;
};
public:
~LaplacianImageMerger();
Status prepareMergeAsync(TextureTarget, const ImageMapping& fromIm, GPU::Stream stream) const override;
Status mergeAsync(TextureTarget, const PanoDefinition& pano, GPU::Buffer<uint32_t> pbo,
GPU::UniqueBuffer<uint32_t>& progressivePbo, const ImageMapping& fromIm, bool isFirstMerger,
GPU::Stream stream) const override;
Status reconstruct(TextureTarget, const PanoDefinition&, GPU::Buffer<uint32_t> progressivePbo, bool progressive,
GPU::Stream) const override;
Status setup(const PanoDefinition&, InputsMap&, const ImageMapping&, GPU::Stream) override;
Status setupCubemap(const PanoDefinition&, InputsMap&, const ImageMapping&, GPU::Stream) override;
bool isMultiScale() const override;
private:
LaplacianImageMerger(const PanoDefinition& pano, ImageMapping& fromIm, const ImageMerger* to,
LaplacianPyramid<uint32_t>* const* globalPyramids, int feather, int gaussianRadius,
int filterPasses, MaskMerger::MaskMergerType maskMergerType);
std::unique_ptr<LaplacianPyramid<uint32_t>> pyramids[7];
LaplacianPyramid<uint32_t>* globalPyramids[7]; // Owned by the first merger.
int gaussianRadius;
int filterPasses;
int64_t width, height;
};
} // namespace Core
} // namespace VideoStitch