- 21 Nov, 2019 14 commits
-
-
David Flynn authored
Since the codec can only code integer positions, using Vec3<double> for position data requires repeated inefficient format conversions. This commit changes the internal representation to Vec3<int32_t>.
-
David Flynn authored
This commit moves the non-normative inverse position scaling process from the codec's reconstruction process into the ply writer. This is to support changing the internal point cloud position representation to integer.
-
This commit enables sharing of LoDs between attributes of the same slice if certain preconditions are met.
-
David Flynn authored
In order to isolate the attribute coder from the rest of the codec, this adds an interface along with factory methods to the attribute codec.
-
This adoption permits coding geometry with non-cubic bounding boxes. Since the depth of the tree remains constant for cubic and non-cubic bounding boxes with identical largest dimensions, quad-tree and binary-tree partitions are introduced to avoid coding 'fractional' positions. The following configuration options control the placement of non-octree partitions within the coding tree: --max_num_implicit_qtbt_before_ot --min_implicit_qtbt_size_log2
-
This extends the geometry based quantisation scheme to: - add a per-slice QP offset, and - permit uniform quantisation of the whole slice without requiring signalling of an additional node QP offset. Per node QP offset signalling is disabled by setting positionQuantisationOctreeDepth=-1
-
This introduces a quantization scheme into the octree coding process, enables adaptive geometry quantization for different regions of the point cloud. This in-loop scheme is independent of the any quantisation performed in non-normative pre-processing at the input to the encoder. At a particular depth of the octree, the remaining (uncoded) position bits of each point are quantised according to a per-node (or rather, per-subtree) QP. The QP itself is signalled as an offset to a base QP. The following configuration parameters are added: positionQuantisationEnabled positionBaseQp positionQuantisationOctreeDepth
-
A per-slice region may be defined with a qp offset. Points within the region have an offset applied to the per-level QP.
-
David Flynn authored
This commit enables signalling a colour matrix index using cicp_matrix_coefficients_idx (ISO/IEC 23001-8 codec independent code points). It adds the following options that replace the existing colorTransform option: - colourMatrix: The coded representation according to ISO/IEC 23001-8. - convertPlyColourspace: Enables conversion to/from RGB using the indicated matrix. Configuration files are updated to use the new option and to signal the identity matrix in the case of direct GBR coding.
-
In order to support bit depths higher than 8bit, this commit adds an attr_t type to represent attribute data. Existing uses of uint8_t and uint16_t are converted to attr_t.
-
David Flynn authored
None of these methods need to be inlined.
-
David Flynn authored
This commit migrates PCCPointSet3::read and write to ply::read and write.
-
This commit enables the codec to encapsulate more than one frame in the coded bitstream. The number of frames to encode is controlled by the frameCount option. Support is added to encode multiple source frames from separate ply files based on a template input file name. A printf-like "%d" directive acts as a placeholder for the current frame number. Decoding functions in a similar way with a each frame decoded from the bitstream being written to a separate ply file named according to a template pattern. The first frame number used for file I/O may be set using the firstFrameNum option.
-
David Flynn authored
This adds: - a frame_idx syntax element to every geometry slice header. - (decoder) handling of a frame boundary data unit. Frame boundaries are represented by changes in the value of frame_idx or by the presence of a frame boundary data unit.
-
- 12 Aug, 2019 6 commits
-
-
This avoids artefacts during trisoup generation by checking whether the original slice partition interval is an integer multiple of the block size W=2^(trisoup_node_size_log2). If not, the partition interval is rounded up to the nearest integer that is exactly divisible by the block size.
-
This commit adds a process to limit the number of points per slice to be within a hard upper limit and soft lower limit.
-
Adjust the operation sequence of slice partition and geometry quantization. We do geometry quantization first and then do the slice partition, so that the point number of each slice would be kept in the predefined range under lossless/lossy geometry coding conditions.
-
Rather than code bypass bins using a simplified mode of the arithmetic coder, this commit adds the ability to signal bypass bins in a separate byte-reversed sub-stream.
-
This commit allow individual QP offsets to be specified for each LoD/RAHT layer in attribute coding.
-
This commit implements the recolouring method described in m47800, which notably uses a distance-weighted average rather than the previous unweighted average.
-
- 24 Apr, 2019 1 commit
-
-
David Flynn authored
This commit fixes an error whereby current the slice and tile ids would be reset to zero at the start of each geometry slice, causing the slice and tile ids set by the partitioning method to be overwritten.
-
- 16 Apr, 2019 6 commits
-
-
David Flynn authored
When the same geom_box_log2_scale is used for all slices, it is not necessary to store them in slice headers. This commit permits signalling of the common value in the GPS.
-
David Flynn authored
This commit permits signalling a per-slice delta QP for luma and chroma attribute components. The delta is relative to the base value derived from the APS. NB: while syntax support and derivation processes are provided, this commit does not contain any method to control the delta QP value at the encoder.
-
This commit introduces control of the quantisation step size using the familiar HEVC | AVC quantisation parameter.
-
David Flynn authored
This is part of a series attempting to remove unhelpful typedefs.
-
David Flynn authored
This is part of a series attempting to remove unhelpful typedefs. The old typedefs (PCCVector3D, PCCPoint3D, PCCColor3B) are retained for compatibility, but marked as deprecated.
-
David Flynn authored
This is part of a series attempting to remove unhelpful typedefs.
-
- 06 Feb, 2019 4 commits
-
-
This partitioning method (--partitionMethod=3) decomposes the input pointcloud into an octree of depth --partitionOctreeDepth=d, with each leaf node corresponding to a slice.
-
This partitioning method (--partitionMethod=2) finds the longest edge of the point cloud and divides it into --partitionNumUniformGeom=n slices along the longest edge. If n = 0, the ratio of longest edge to shortest edge determines the number of slices.
-
David Flynn authored
This commit provides a basic frame work for partitioning a frame into multiple slices, with the continued assumption of single-frame sequences. The decoder is modified to independently decode each slice and accumulate decoded points in a buffer for output. The encoder is updated to support partitioning the input point cloud into slices and to independently code each slice. Points from reconstructed slices are accumulated and output at the end of the frame period. The partitioning process (partitioning methods are defined in partitioning.cpp) proceeds as follows: - quantise the input point cloud without duplicate point removal or reordering points. - apply the partitioning function to produce a list of tiles and slices, each slice having an origin, id, and list of point indexes that identify points in the input point cloud. - producing a source point cloud for each partition as a subset of the input point cloud. - compressing each partition (slice) as normal by quantising the partitioned input. Recolouring is necessarily performed against the partitioned input since the recolouring method cannot correctly handle recolouring a partition from a complete point cloud. NB: this commit does not provide any partitioning methods.
-
David Flynn authored
This commit provides support for each slice to have an origin specified relative to the sequence bounding box. Reconstructed points are offset by the slice origin prior to inverse scaling and translation.
-
- 05 Feb, 2019 5 commits
-
-
David Flynn authored
- calculates the sequence bounding box at the start of encoding (in original coordinates as a decoder may reconstruct it) - signals bounding box in SPS - disables signalling of geometry box origin (always 0)
-
David Flynn authored
The configuration parameters seq_bounding_box_xyz0 and seq_bounding_box_whd allow overriding the automatic derivation of frame (sequence) bounding box, forcing the depth of the geometry tree. NB: seq_bounding_box_xyz0 and seq_bounding_box_whd are specified using unscaled co-ordinates. NB: this patch does not signal these parameters in the SPS.
-
David Flynn authored
-
David Flynn authored
- signal geom_slice_id / attr_geom_slice_id in geometry / attribute header. - attr_geom_slice_id set to current geom_slice_id to maintain relationship between attribute and geometry. - increment geom_slice_id after each round of encoding. - decoder checks that the attribute payload's attr_geom_slice_id corresponds to the most recently decoded geometry payload.
-
David Flynn authored
This commit provides trisoup_node_size_log2 as a replacement for the following HLS syntax variables: - geom_codec_type (redundant wrt. triangle node size derivation) - trisoup_depth (redundant wrt. bounding box) - trisoup_triangle_level (semantics simplified) The following config options have been removed: - geometryCodec (redundant wrt. trisoup_node_size_log2) - triSoupLevel (replaced by trisoup_node_size_log2) - triSoupDepth (unnecessary) - triSoupIntToOrigScale (redundant wrt. positionQuantizationScale)
-
- 31 Oct, 2018 4 commits
-
-
David Flynn authored
This commit adds an arithmetic codec interface class that allows a compile time choice of arithmetic codec implementation. Context types are renamed to support compile time selection, and existing support functions that were added to the third-party arithmetic codec are moved to the wrapper.
-
This commit integrates a c++ trisoup codec, replacing the previous matlab implementation. The provided code has been reworked to avoid duplicating code, dead code, and operate with the current HLS.
-
David Flynn authored
This commit splits the handling of the geometry brick header and octree geometry coding. The encoder/decoder classes now take care of coding the header, while the geometry coder handles the geometry coding itself.
-
David Flynn authored
This commit prepares for the possibility that geometry coding itself is lossy. Instead of performing recolouring just after input quantisation, it is deferred until after geometry processing. The recolouring functions are updated to handle differences in pointcloud scales rather than requiring the target pointcloud to be scaled identically to the source.
-