Commit d2892504 authored by David Flynn's avatar David Flynn
Browse files

hls/m45867: add tile inventory writer/parser

parent d5d4e366
......@@ -72,6 +72,7 @@ public:
void storeSps(SequenceParameterSet&& sps);
void storeGps(GeometryParameterSet&& gps);
void storeAps(AttributeParameterSet&& aps);
void storeTileInventory(TileInventory&& inventory);
//==========================================================================
......@@ -100,6 +101,9 @@ private:
std::map<int, GeometryParameterSet> _gpss;
std::map<int, AttributeParameterSet> _apss;
// Metadata that allows slices/tiles to be indentified by their bounding box
TileInventory _tileInventory;
// The active SPS
const SequenceParameterSet* _sps;
const GeometryParameterSet* _gps;
......
......@@ -87,6 +87,10 @@ PCCTMC3Decoder3::decompress(
return decodeGeometryBrick(*buf);
case PayloadType::kAttributeBrick: decodeAttributeBrick(*buf); return 0;
case PayloadType::kTileInventory:
storeTileInventory(parseTileInventory(*buf));
return 0;
}
// todo(df): error, unhandled payload type
......@@ -120,6 +124,15 @@ PCCTMC3Decoder3::storeAps(AttributeParameterSet&& aps)
_apss.emplace(std::make_pair(aps.aps_attr_parameter_set_id, aps));
}
//--------------------------------------------------------------------------
void
PCCTMC3Decoder3::storeTileInventory(TileInventory&& inventory)
{
// todo(df): handle replacement semantics
_tileInventory = inventory;
}
//==========================================================================
// Initialise the point cloud storage and decode a single geometry brick.
//
......
......@@ -52,6 +52,7 @@ enum class PayloadType
kGeometryBrick = 2,
kAttributeParameterSet = 3,
kAttributeBrick = 4,
kTileInventory = 5,
};
//============================================================================
......@@ -255,4 +256,14 @@ struct AttributeBrickHeader {
//============================================================================
struct TileInventory {
struct Entry {
PCCVector3<int> tile_bounding_box_xyz0;
PCCVector3<int> tile_bounding_box_whd;
};
std::vector<Entry> tiles;
};
//============================================================================
} // namespace pcc
......@@ -438,4 +438,55 @@ parseAbh(const PayloadBuffer& buf, int* bytesRead)
//============================================================================
PayloadBuffer
write(const TileInventory& inventory)
{
PayloadBuffer buf(PayloadType::kTileInventory);
auto bs = makeBitWriter(std::back_inserter(buf));
int num_tiles = inventory.tiles.size();
bs.writeUe(num_tiles);
for (const auto& entry : inventory.tiles) {
bs.writeSe(entry.tile_bounding_box_xyz0.x());
bs.writeSe(entry.tile_bounding_box_xyz0.y());
bs.writeSe(entry.tile_bounding_box_xyz0.z());
bs.writeUe(entry.tile_bounding_box_whd.x());
bs.writeUe(entry.tile_bounding_box_whd.y());
bs.writeUe(entry.tile_bounding_box_whd.z());
}
bs.byteAlign();
return buf;
}
//----------------------------------------------------------------------------
TileInventory
parseTileInventory(const PayloadBuffer& buf)
{
TileInventory inventory;
assert(buf.type == PayloadType::kTileInventory);
auto bs = makeBitReader(buf.begin(), buf.end());
int num_tiles;
bs.readUe(&num_tiles);
for (int i = 0; i < num_tiles; i++) {
TileInventory::Entry entry;
bs.readSe(&entry.tile_bounding_box_xyz0.x());
bs.readSe(&entry.tile_bounding_box_xyz0.y());
bs.readSe(&entry.tile_bounding_box_xyz0.z());
bs.readUe(&entry.tile_bounding_box_whd.x());
bs.readUe(&entry.tile_bounding_box_whd.y());
bs.readUe(&entry.tile_bounding_box_whd.z());
inventory.tiles.push_back(entry);
}
bs.byteAlign();
return inventory;
}
//============================================================================
} // namespace pcc
......@@ -45,10 +45,12 @@ namespace pcc {
PayloadBuffer write(const SequenceParameterSet& sps);
PayloadBuffer write(const GeometryParameterSet& gps);
PayloadBuffer write(const AttributeParameterSet& aps);
PayloadBuffer write(const TileInventory& inventory);
SequenceParameterSet parseSps(const PayloadBuffer& buf);
GeometryParameterSet parseGps(const PayloadBuffer& buf);
AttributeParameterSet parseAps(const PayloadBuffer& buf);
TileInventory parseTileInventory(const PayloadBuffer& buf);
//----------------------------------------------------------------------------
......
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