Commit 22ab7537 authored by David Flynn's avatar David Flynn
Browse files

enc: add getAttrParams helper

This commit introduces PCCTMC3Encoder3Parameters::getAttrParams(...),
a helper to reduce the clutter in searching for attributes to code.
parent 8c4727ae
...@@ -83,6 +83,21 @@ struct PCCTMC3Encoder3Parameters { ...@@ -83,6 +83,21 @@ struct PCCTMC3Encoder3Parameters {
} triSoup; } triSoup;
std::map<std::string, PCCAttributeEncodeParamaters> attributeEncodeParameters; std::map<std::string, PCCAttributeEncodeParamaters> attributeEncodeParameters;
//--------------------------------------------------------------------------
// Retrieve the a set of parameters, or nullptr if they either do not exist
// or guard is false.
const PCCAttributeEncodeParamaters*
getAttrParams(bool guard, const std::string& what) const
{
if (!guard)
return nullptr;
auto it = attributeEncodeParameters.find(what);
if (it == attributeEncodeParameters.end())
return nullptr;
return &it->second;
}
}; };
class PCCTMC3Encoder3 { class PCCTMC3Encoder3 {
...@@ -115,17 +130,18 @@ class PCCTMC3Encoder3 { ...@@ -115,17 +130,18 @@ class PCCTMC3Encoder3 {
PCCPointSet3 *reconstructedCloud = nullptr) { PCCPointSet3 *reconstructedCloud = nullptr) {
init(); init();
pointCloud = inputPointCloud; pointCloud = inputPointCloud;
const bool compressColors =
inputPointCloud.hasColors() && auto paramsColor =
params.attributeEncodeParameters.find("color") != params.attributeEncodeParameters.end(); params.getAttrParams(inputPointCloud.hasColors(), "color");
if (!compressColors) {
if (!paramsColor) {
pointCloud.removeColors(); pointCloud.removeColors();
} }
const bool compressReflectances = inputPointCloud.hasReflectances() && auto paramsReflectance =
params.attributeEncodeParameters.find("reflectance") != params.getAttrParams(inputPointCloud.hasReflectances(), "reflectance");
params.attributeEncodeParameters.end();
if (!compressReflectances) { if (!paramsReflectance) {
pointCloud.removeReflectances(); pointCloud.removeReflectances();
} }
...@@ -135,28 +151,26 @@ class PCCTMC3Encoder3 { ...@@ -135,28 +151,26 @@ class PCCTMC3Encoder3 {
PCCWriteToBuffer<uint8_t>(uint8_t(pointCloud.hasReflectances()), bitstream.buffer, PCCWriteToBuffer<uint8_t>(uint8_t(pointCloud.hasReflectances()), bitstream.buffer,
bitstream.size); bitstream.size);
if (pointCloud.hasColors()) { if (paramsColor) {
AttributeEncoder attrEncoder; AttributeEncoder attrEncoder;
const auto &colorParams = params.attributeEncodeParameters.find("color")->second;
uint64_t colorsSize = bitstream.size; uint64_t colorsSize = bitstream.size;
attrEncoder.encodeHeader(colorParams, "color", bitstream); attrEncoder.encodeHeader(*paramsColor, "color", bitstream);
attrEncoder.buildPredictors(colorParams, pointCloud); attrEncoder.buildPredictors(*paramsColor, pointCloud);
attrEncoder.encodeColors(colorParams, pointCloud, bitstream); attrEncoder.encodeColors(*paramsColor, pointCloud, bitstream);
colorsSize = bitstream.size - colorsSize; colorsSize = bitstream.size - colorsSize;
std::cout << "colors bitstream size " << colorsSize << " B (" std::cout << "colors bitstream size " << colorsSize << " B ("
<< (8.0 * colorsSize) / inputPointCloud.getPointCount() << " bpp)" << std::endl; << (8.0 * colorsSize) / inputPointCloud.getPointCount() << " bpp)" << std::endl;
} }
if (pointCloud.hasReflectances()) { if (paramsReflectance) {
AttributeEncoder attrEncoder; AttributeEncoder attrEncoder;
const auto &reflectanceParams = params.attributeEncodeParameters.find("reflectance")->second;
uint64_t reflectancesSize = bitstream.size; uint64_t reflectancesSize = bitstream.size;
attrEncoder.encodeHeader(reflectanceParams, "reflectance", bitstream); attrEncoder.encodeHeader(*paramsReflectance, "reflectance", bitstream);
attrEncoder.buildPredictors(reflectanceParams, pointCloud); attrEncoder.buildPredictors(*paramsReflectance, pointCloud);
attrEncoder.encodeReflectances(reflectanceParams, pointCloud, bitstream); attrEncoder.encodeReflectances(*paramsReflectance, pointCloud, bitstream);
reflectancesSize = bitstream.size - reflectancesSize; reflectancesSize = bitstream.size - reflectancesSize;
std::cout << "reflectances bitstream size " << reflectancesSize << " B (" std::cout << "reflectances bitstream size " << reflectancesSize << " B ("
...@@ -187,28 +201,32 @@ class PCCTMC3Encoder3 { ...@@ -187,28 +201,32 @@ class PCCTMC3Encoder3 {
std::cout << "positions bitstream size " << positionsSize << " B (" std::cout << "positions bitstream size " << positionsSize << " B ("
<< (8.0 * positionsSize) / inputPointCloud.getPointCount() << " bpp)" << std::endl; << (8.0 * positionsSize) / inputPointCloud.getPointCount() << " bpp)" << std::endl;
if (pointCloud.hasColors()) { auto paramsColor =
params.getAttrParams(pointCloud.hasColors(), "color");
if (paramsColor) {
AttributeEncoder attrEncoder; AttributeEncoder attrEncoder;
const auto &colorParams = params.attributeEncodeParameters.find("color")->second;
uint64_t colorsSize = bitstream.size; uint64_t colorsSize = bitstream.size;
attrEncoder.encodeHeader(colorParams, "color", bitstream); attrEncoder.encodeHeader(*paramsColor, "color", bitstream);
attrEncoder.buildPredictors(colorParams, pointCloud); attrEncoder.buildPredictors(*paramsColor, pointCloud);
attrEncoder.encodeColors(colorParams, pointCloud, bitstream); attrEncoder.encodeColors(*paramsColor, pointCloud, bitstream);
colorsSize = bitstream.size - colorsSize; colorsSize = bitstream.size - colorsSize;
std::cout << "colors bitstream size " << colorsSize << " B (" std::cout << "colors bitstream size " << colorsSize << " B ("
<< (8.0 * colorsSize) / inputPointCloud.getPointCount() << " bpp)" << std::endl; << (8.0 * colorsSize) / inputPointCloud.getPointCount() << " bpp)" << std::endl;
} }
if (pointCloud.hasReflectances()) { auto paramsReflectance =
params.getAttrParams(pointCloud.hasReflectances(), "reflectance");
if (paramsReflectance) {
AttributeEncoder attrEncoder; AttributeEncoder attrEncoder;
const auto &reflectanceParams = params.attributeEncodeParameters.find("reflectance")->second;
uint64_t reflectancesSize = bitstream.size; uint64_t reflectancesSize = bitstream.size;
attrEncoder.encodeHeader(reflectanceParams, "reflectance", bitstream); attrEncoder.encodeHeader(*paramsReflectance, "reflectance", bitstream);
attrEncoder.buildPredictors(reflectanceParams, pointCloud); attrEncoder.buildPredictors(*paramsReflectance, pointCloud);
attrEncoder.encodeReflectances(reflectanceParams, pointCloud, bitstream); attrEncoder.encodeReflectances(*paramsReflectance, pointCloud, bitstream);
reflectancesSize = bitstream.size - reflectancesSize; reflectancesSize = bitstream.size - reflectancesSize;
std::cout << "reflectances bitstream size " << reflectancesSize << " B (" std::cout << "reflectances bitstream size " << reflectancesSize << " B ("
...@@ -259,14 +277,16 @@ class PCCTMC3Encoder3 { ...@@ -259,14 +277,16 @@ class PCCTMC3Encoder3 {
// Should add intToOrigTranslation here. // Should add intToOrigTranslation here.
} }
// Transfer colors. auto paramsColor =
const bool compressColors = params.getAttrParams(inputPointCloud.hasColors(), "color");
inputPointCloud.hasColors() &&
params.attributeEncodeParameters.find("color") != params.attributeEncodeParameters.end(); auto paramsReflectance =
if (compressColors) { params.getAttrParams(inputPointCloud.hasReflectances(), "reflectance");
if (paramsColor) {
pointCloud.addColors(); pointCloud.addColors();
const auto &attributeParams = params.attributeEncodeParameters.find("color")->second; int32_t searchRange = paramsColor->searchRange;
if (!PCCTransfertColors(inputPointCloud, int32_t(attributeParams.searchRange), pointCloud)) { if (!PCCTransfertColors(inputPointCloud, searchRange, pointCloud)) {
std::cout << "Error: can't transfer colors!" << std::endl; std::cout << "Error: can't transfer colors!" << std::endl;
return -1; return -1;
} }
...@@ -309,28 +329,26 @@ class PCCTMC3Encoder3 { ...@@ -309,28 +329,26 @@ class PCCTMC3Encoder3 {
std::cout << "positions bitstream size " << positionsSize << " B (" std::cout << "positions bitstream size " << positionsSize << " B ("
<< (8.0 * positionsSize) / inputPointCloud.getPointCount() << " bpp)" << std::endl; << (8.0 * positionsSize) / inputPointCloud.getPointCount() << " bpp)" << std::endl;
if (pointCloud.hasColors()) { if (paramsColor) {
AttributeEncoder attrEncoder; AttributeEncoder attrEncoder;
const auto &colorParams = params.attributeEncodeParameters.find("color")->second;
uint64_t colorsSize = bitstream.size; uint64_t colorsSize = bitstream.size;
attrEncoder.buildPredictors(colorParams, pointCloud); attrEncoder.buildPredictors(*paramsColor, pointCloud);
attrEncoder.encodeHeader(colorParams, "color", bitstream); attrEncoder.encodeHeader(*paramsColor, "color", bitstream);
attrEncoder.encodeColors(colorParams, pointCloud, bitstream); attrEncoder.encodeColors(*paramsColor, pointCloud, bitstream);
colorsSize = bitstream.size - colorsSize; colorsSize = bitstream.size - colorsSize;
std::cout << "colors bitstream size " << colorsSize << " B (" std::cout << "colors bitstream size " << colorsSize << " B ("
<< (8.0 * colorsSize) / inputPointCloud.getPointCount() << " bpp)" << std::endl; << (8.0 * colorsSize) / inputPointCloud.getPointCount() << " bpp)" << std::endl;
} }
if (pointCloud.hasReflectances()) { if (paramsReflectance) {
AttributeEncoder attrEncoder; AttributeEncoder attrEncoder;
const auto &reflectanceParams = params.attributeEncodeParameters.find("reflectance")->second;
uint64_t reflectancesSize = bitstream.size; uint64_t reflectancesSize = bitstream.size;
attrEncoder.buildPredictors(reflectanceParams, pointCloud); attrEncoder.buildPredictors(*paramsReflectance, pointCloud);
attrEncoder.encodeHeader(reflectanceParams, "reflectance", bitstream); attrEncoder.encodeHeader(*paramsReflectance, "reflectance", bitstream);
attrEncoder.encodeReflectances(reflectanceParams, pointCloud, bitstream); attrEncoder.encodeReflectances(*paramsReflectance, pointCloud, bitstream);
reflectancesSize = bitstream.size - reflectancesSize; reflectancesSize = bitstream.size - reflectancesSize;
std::cout << "reflectances bitstream size " << reflectancesSize << " B (" std::cout << "reflectances bitstream size " << reflectancesSize << " B ("
...@@ -820,19 +838,20 @@ class PCCTMC3Encoder3 { ...@@ -820,19 +838,20 @@ class PCCTMC3Encoder3 {
computeMinPositions(inputPointCloud); computeMinPositions(inputPointCloud);
pointCloud.resize(0); pointCloud.resize(0);
const bool compressColors =
inputPointCloud.hasColors() && auto paramsColor =
params.attributeEncodeParameters.find("color") != params.attributeEncodeParameters.end(); params.getAttrParams(inputPointCloud.hasColors(), "color");
if (compressColors) {
if (paramsColor) {
pointCloud.addColors(); pointCloud.addColors();
} else { } else {
pointCloud.removeColors(); pointCloud.removeColors();
} }
const bool compressReflectances = inputPointCloud.hasReflectances() && auto paramsReflectance =
params.attributeEncodeParameters.find("reflectance") != params.getAttrParams(inputPointCloud.hasReflectances(), "reflectance");
params.attributeEncodeParameters.end();
if (compressReflectances) { if (paramsReflectance) {
pointCloud.addReflectances(); pointCloud.addReflectances();
} else { } else {
pointCloud.removeReflectances(); pointCloud.removeReflectances();
...@@ -865,19 +884,17 @@ class PCCTMC3Encoder3 { ...@@ -865,19 +884,17 @@ class PCCTMC3Encoder3 {
} }
} }
if (compressColors) { // transfer colors if (paramsColor) { // transfer colors
const auto &attributeParams = params.attributeEncodeParameters.find("color")->second; int32_t searchRange = paramsColor->searchRange;
if (!PCCTransfertColors(inputPointCloud, int32_t(attributeParams.searchRange), if (!PCCTransfertColors(inputPointCloud, searchRange, pointCloud)) {
pointCloud)) {
std::cout << "Error: can't transfer colors!" << std::endl; std::cout << "Error: can't transfer colors!" << std::endl;
return -1; return -1;
} }
} }
if (compressReflectances) { // transfer reflectances if (paramsReflectance) { // transfer reflectances
const auto &attributeParams = params.attributeEncodeParameters.find("reflectance")->second; int32_t searchRange = paramsReflectance->searchRange;
if (!PCCTransfertReflectances(inputPointCloud, int32_t(attributeParams.searchRange), if (!PCCTransfertReflectances(inputPointCloud, searchRange, pointCloud)) {
pointCloud)) {
std::cout << "Error: can't transfer reflectances!" << std::endl; std::cout << "Error: can't transfer reflectances!" << std::endl;
return -1; return -1;
} }
...@@ -901,10 +918,10 @@ class PCCTMC3Encoder3 { ...@@ -901,10 +918,10 @@ class PCCTMC3Encoder3 {
quantizedPoint[0] = std::round(point[0]); quantizedPoint[0] = std::round(point[0]);
quantizedPoint[1] = std::round(point[1]); quantizedPoint[1] = std::round(point[1]);
quantizedPoint[2] = std::round(point[2]); quantizedPoint[2] = std::round(point[2]);
if (compressColors) { if (paramsColor) {
pointCloud.setColor(i, inputPointCloud.getColor(i)); pointCloud.setColor(i, inputPointCloud.getColor(i));
} }
if (compressReflectances) { if (paramsReflectance) {
pointCloud.setReflectance(i, inputPointCloud.getReflectance(i)); pointCloud.setReflectance(i, inputPointCloud.getReflectance(i));
} }
} }
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment