Directional lifting in v-dmc
By determining delta scale values and adaptive weights, the encoding and decoding of dynamic meshes are optimized, addressing inefficiencies in existing methods and enhancing computational efficiency and compression performance.
Patent Information
- Authority / Receiving Office
- WO · WO
- Patent Type
- Applications
- Current Assignee / Owner
- QUALCOMM INC
- Filing Date
- 2026-01-14
- Publication Date
- 2026-07-23
AI Technical Summary
Existing methods for encoding and decoding dynamic meshes suffer from computational inefficiencies, inflexible signaling, and reduced compression efficiency due to hard-coded scale thresholds, expensive division operations, and repetitive signaling in directional lifting transforms.
The proposed solution involves determining delta scale values and adaptive weights based on base and exponent values, using a delta-based approach to signal scale values, and simplifying coherence calculations to optimize performance and reduce complexity in directional lifting transforms.
This approach enhances computational efficiency, reduces complexity, and improves compression efficiency by optimizing scale signaling and avoiding redundant operations, resulting in a more flexible and efficient encoding and decoding process.
Smart Images

Figure US2026011229_23072026_PF_FP_ABST
Abstract
Description
Qualcomm Ref. No. 2502081WO 1 / 114DIRECTIONAL LIFTING IN V-DMC
[0001] This application claims priority to U.S. Patent Application No. 19 / 447,946 filed January 13, 2026, which claims the benefit of U. S. Provisional Patent Application No.63 / 781,018, filed 31 March 2025, U.S. Provisional Patent Application No. 63 / 775,147, filed 20 March 2025, and U.S. Provisional Patent Application No. 63 / 745,714, filed 15 January 2025, the entire content of each being incorporated herein by reference.TECHNICAL FIELD
[0002] This disclosure relates to video-based coding of dynamic meshes.BACKGROUND
[0003] Meshes may be used to represent physical content of a 3 -dimensional space. Meshes may have utility in a wide variety of situations. For example, meshes may be used in the context of representing the physical content of an environment for purposes of positioning virtual objects in an extended reality, e.g., augmented reality (AR), virtual reality (VR), or mixed reality (MR), application. Mesh compression is a process for encoding and decoding meshes. Encoding meshes may reduce the amount of data required for storage and transmission of the meshes.SUMMARY
[0004] The techniques of this disclosure relate to encoding and decoding dynamic mesh data using an improved directional lifting transform. In an encoding process, an encoder device determines a base value and an exponent value. The encoder device determines a delta scale value based on the base and exponent values, and further determines a first scale value, a second scale value, and a third scale value from the delta scale value. A forward directional lifting transform is performed on a displacement vector for a target vertex using one or more of these determined scale values to generate one or more transform coefficients that the device encodes to generate encoded transform coefficients. The encoder device generates a bitstream to include the encoded transform coefficients, a first syntax element indicating the base value, and a second syntax element indicating the exponent value.
[0005] In a corresponding decoding process, a decoder device receives the first syntax element indicating the base value and the second syntax element indicating the exponent 1616-614WO01Qualcomm Ref. No. 2502081WO 2 / 114value. The decoder determines the delta scale value, the first scale value, the second scale value, and the third scale value based on these received values. An inverse directional lifting transform is performed to determine a displacement vector for the target vertex, where the transform relies on one or more of the first, second, or third scale values. The base mesh is subsequently deformed using the displacement vector to determine a decoded mesh.
[0006] The inverse directional lifting transform may use these determined scale values to adapt prediction and update weights. To apply the scales, the decoder determines a deviation value for a wavelet coefficient of the target vertex, for example, based on an absolute difference between a first component of the wavelet coefficient and a mean value associated with a mesh patch. The decoder selects one of the first, second, or third scale values as a selected scale value based on a comparison of this deviation value to a standard deviation value associated with the mesh patch. The decoder device then determines an adaptive weight based on the selected scale value.
[0007] The adaptive weight may be applied to a prediction step or an update step of the inverse transform. To apply the weight, the decoder first determines a coherence of the target vertex relative to a first neighboring vertex and a second neighboring vertex. This coherence calculation is simplified by comparing only a first component of the first neighboring vertex to a first component of the second neighboring vertex. Based on the coherence, a selected neighboring vertex is identified, and the adaptive weight modifies the contribution from the selected neighboring vertex during the prediction or update step.
[0008] According to an example of this disclosure, a device for decoding a bitstream of encoded mesh data includes: one or more memory units; one or more processing units implemented in circuitry, coupled to the one or more memory units, and configured to: receive, in the bitstream of encoded mesh data, a first syntax element indicating a base value; receive, in the bitstream of encoded mesh data, a second syntax element indicating an exponent value; determine a delta scale value based on the base value and the exponent value; perform an inverse directional lifting transform to determine a displacement vector for a target vertex of a base mesh based on one or more of a first scale value, a second scale value, or a third scale value determined based on the delta scale value; deform the base mesh based on the displacement vector to determine a deformed base mesh; and determine a decoded mesh based on the deformed base mesh.
[0009] According to an example of this disclosure, a method of decoding a bitstream of encoded mesh data includes: receiving, in the bitstream of encoded mesh data, a first 1616-614WO01Qualcomm Ref. No. 2502081WO 3 / 114syntax element indicating a base value; receiving, in the bitstream of encoded mesh data, a second syntax element indicating an exponent value; determining a delta scale value based on the base value and the exponent value; performing an inverse directional lifting transform to determine a displacement vector for a target vertex of a base mesh based on one or more of a first scale value, a second scale value, or a third scale value determined based on the delta scale value; deforming the base mesh based on the displacement vector to determine a deformed base mesh; and determining a decoded mesh based on the deformed base mesh.
[0010] A non-transitory computer-readable medium stores instructions that, when executed by processing circuitry, cause the processing circuitry to: receive, in a bitstream of encoded mesh data, a first syntax element indicating a base value; receive, in the bitstream of encoded mesh data, a second syntax element indicating an exponent value; determine a delta scale value based on the base value and the exponent value; perform an inverse directional lifting transform to determine a displacement vector for a target vertex of a base mesh based on one or more of a first scale value, a second scale value, or a third scale value determined based on the delta scale value; deform the base mesh based on the displacement vector to determine a deformed base mesh; and determine a decoded mesh based on the deformed base mesh.
[0011] According to an example of this disclosure, a device for generating a bitstream of encoded mesh data includes: one or more memory units; one or more processing units implemented in circuitry, coupled to the one or more memory units, and configured to: perform a plurality of forward directional lifting transforms on a displacement vector for a target vertex of a base mesh using different scale values to determine a first scale value, a second scale value, and a third scale value; determine a delta scale value based on the first scale value, the second scale value, and the third scale value; determine a base value based on the delta scale value; determine an exponent value based on the delta scale value; perform a forward directional lifting transform on the displacement vector for the target vertex of the base mesh based on one or more of the first scale value, the second scale value, or the third scale value to determine one or more transform coefficients; encode the one or more transform coefficients to determine encoded transform coefficients; and generate the bitstream of encoded mesh data, the bitstream comprising a first syntax element indicating the base value, a second syntax element indicating the exponent value, and additionally syntax elements indicating the encoded transform coefficients.1616-614WO01Qualcomm Ref. No. 2502081WO 4 / 114
[0012] The details of one or more examples are set forth in the accompanying drawings and the description below. Other features, objects, and advantages will be apparent from the description, drawings, and claims.BRIEF DESCRIPTION OF DRAWINGS
[0013] FIG. 1 is a block diagram illustrating an example encoding and decoding system that may perform the techniques of this disclosure.
[0014] FIG. 2 shows an example implementation of a V-DMC encoder.
[0015] FIG. 3 shows an example implementation of a V-DMC decoder.
[0016] FIG. 4 shows an example of resampling to enable efficient compression of a 2D curve.
[0017] FIG. 5 shows a displaced curve that has a subdivision structure, while approximating the shape of the original mesh.
[0018] FIG. 6 shows a block diagram of a pre-processing system.
[0019] FIG. 7 shows an example of a V-DMC intra frame encoder.
[0020] FIG. 8 shows an example of a V-DMC decoder.
[0021] FIG. 9 shows an example of a V-DMC intra frame decoder.
[0022] FIG. 10 shows an example of an arithmetic decoder for decoding displacements.
[0023] FIG. 11 shows an example of a mid-point subdivision scheme.
[0024] FIG. 12 shows scales based on a normal distribution range.
[0025] FIG. 13 is a flowchart illustrating an example process for encoding a mesh.
[0026] FIG. 14 is a flowchart illustrating an example process for decoding a compressed bitstream of mesh data.
[0027] FIG. 15 is a flowchart illustrating an example process for encoding a mesh.
[0028] FIG. 16 is a flowchart illustrating an example process for decoding a compressed bitstream of mesh data.1616-614WO01Qualcomm Ref. No. 2502081WO 5 / 114DETAILED DESCRIPTION
[0029] A mesh generally refers to a collection of vertices in a three-dimensional (3D) space that collectively represent one or multiple objects in the 3D space. The vertices are connected by edges, and the edges form polygons, which form faces of the mesh. Each vertex may also have one or more associated attributes, such as a texture or a color. In most scenarios, having more vertices produces higher quality, e.g., more detailed and more realistic, meshes. Having more vertices, however, also requires more data to represent the mesh.
[0030] To reduce the amount of data needed to represent the mesh, the mesh may be encoded using lossy or lossless encoding. In lossless encoding, the decoded version of the encoded mesh exactly matches the original mesh. In lossy encoding, by contrast, the process of encoding and decoding the mesh causes loss, such as distortion, in the decoded version of the encoded mesh.
[0031] In one example of a lossy encoding technique for meshes, a mesh encoder decimates an original mesh to determine a base mesh. To decimate the original mesh, the mesh encoder subsamples or otherwise reduces the number of vertices in the original mesh, such that the base mesh is a rough approximation, with fewer vertices, of the original mesh. The mesh encoder then subdivides the decimated mesh. That is, the mesh encoder estimates the locations of additional vertices in between the vertices of the base mesh. The mesh encoder then deforms the subdivided mesh by moving the vertices in a manner that makes the deformed mesh more closely match the original mesh.
[0032] After determining a desired base mesh and deformation of the subdivided mesh, the mesh encoder generates a bitstream that includes data for constructing the base mesh and data for performing the deformation. The data defining the deformation may be signaled as a series of displacement vectors that indicate the movement, or displacement, of the additional vertices determined by the subdividing process. To decode a mesh from the bitstream, a mesh decoder reconstructs the base mesh based on the signaled information, applies the same subdivision process as the mesh encoder, and then displaces the additional vertices based on the signaled displacement vectors.
[0033] The compression of displacement vectors may utilize a wavelet transform, often implemented as a lifting scheme that includes prediction and update operations. Existing approaches may use a directional lifting transform as part of this lifting scheme. This directional lifting transform adapts the prediction and update weights based on a calculated coherence between a target vertex and the neighboring vertices.1616-614WO01Qualcomm Ref. No. 2502081WO 6 / 114
[0034] Implementations of this directional lifting, however, may suffer from computational inefficiencies and inflexible signaling. For example, the performance of the directional lifting transform is sensitive to scale thresholds used in the transform, but these thresholds may be hard-coded in a decoder, which prevents optimization by an encoder. Other calculations, such as determining a Z-score, may rely on computationally expensive division operations, and coherence calculations may perform redundant dot product operations. Signaling logic may also lack flexibility, such as preventing a tool from being enabled at a patch level. In other examples, parameters for merge and inter meshpatches may not be delta-coded, reducing compression efficiency, and mean values may be signaled repetitively.
[0035] The techniques of this disclosure relate to encoding and decoding dynamic mesh data using an improved directional lifting transform and signaling process. In an encoding process, an encoder device determines a base value and an exponent value. The encoder device determines a delta scale value based on the base and exponent values, and further determines a first scale value, a second scale value, and a third scale value from the delta scale value. A forward directional lifting transform is performed on a displacement vector for a target vertex using one or more of these determined scale values to generate one or more transform coefficients. The encoder device generates a bitstream to include the encoded transform coefficients, a first syntax element indicating the base value, and a second syntax element indicating the exponent value.
[0036] In a corresponding decoding process, a decoder device receives the first syntax element indicating the base value and the second syntax element indicating the exponent value. The decoder device determines the delta scale value, the first scale value, the second scale value, and the third scale value based on these received values. An inverse directional lifting transform is performed to determine a displacement vector for the target vertex, where the transform relies on one or more of the first, second, or third scale values. The base mesh is subsequently deformed using the displacement vector to determine a decoded mesh.
[0037] The inverse directional lifting transform may use these determined scale values to adapt prediction and update weights. To apply the scales, the decoder determines a deviation value for a wavelet coefficient of the target vertex, for example, based on an absolute difference between a first component of the wavelet coefficient and a mean value associated with a mesh patch. The decoder selects one of the first, second, or third scale values as a selected scale value based on a comparison of this deviation value to a standard 1616-614WO01Qualcomm Ref. No. 2502081WO 7 / 114deviation value associated with the mesh patch. The decoder device then determines an adaptive weight based on the selected scale value.
[0038] The adaptive weight may be applied to a prediction step or an update step of the inverse transform. To apply the weight, the decoder first determines a coherence of the target vertex relative to a first neighboring vertex and a second neighboring vertex. This coherence calculation is simplified by comparing only a first component of the first neighboring vertex to a first component of the second neighboring vertex. Based on the coherence, a selected neighboring vertex is identified, and the adaptive weight modifies the contribution from the selected neighboring vertex during the prediction or update step.
[0039] Further signaling improvements may be achieved, by for instance, adding a patchlevel flag to enable or disable directional lifting for a specific meshpatch, independent of sequence-level parameters. Additionally, parameters for merge and inter meshpatches may be delta-coded relative to a predictor. A mean value determined for a lifting offset tool may also be reused for the directional lifting transform. In some examples, the scale values may be signaled using an alternative delta-based approach to minimize metadata overhead.
[0040] The techniques of this disclosure address the shortcomings of existing approaches. For instance, in accordance with examples described in this disclosure, signaling the scale values via a base and exponent, or via a delta-based approach, replaces the fixed, hard-coded thresholds. This provides a generalized decoder design where the performancesensitive scales may be optimized and signaled efficiently. The techniques also introduce computational simplifications to the directional lifting algorithm, reducing complexity and increasing processing speed. This process avoids an expensive division operation by comparing the deviation value (e.g., a z-score numerator) directly to the standard deviation value. The simplified coherence calculation avoids a redundant dot product operation, and the check for equal coherence may also be removed to further reduce complexity. The enhanced signaling provides greater flexibility and compression efficiency, reduces bitstream size, and avoids repetitive signaling.
[0041] FIG. 1 is a block diagram illustrating an example encoding and decoding system 100 that may perform the techniques of this disclosure. The techniques of this disclosure are generally directed to coding (encoding and / or decoding) meshes. The coding may be effective in compressing and / or decompressing data of the meshes.
[0042] As shown in FIG. 1, system 100 includes a source device 102 and a destination device 116. Source device 102 provides encoded data to be decoded by a destination 1616-614WO01Qualcomm Ref. No. 2502081WO 8 / 114device 116. Particularly, in the example of FIG. 1, source device 102 provides the data to destination device 116 via a computer-readable medium 110. Source device 102 and destination device 116 may comprise any of a wide range of devices, including desktop computers, notebook (i.e., laptop) computers, tablet computers, set-top boxes, telephone handsets such as smartphones, televisions, cameras, display devices, digital media players, video gaming consoles, video streaming devices, terrestrial or marine vehicles, spacecraft, aircraft, robots, LIDAR devices, satellites, or the like. In some cases, source device 102 and destination device 116 may be equipped for wireless communication.
[0043] In the example of FIG. 1, source device 102 includes a data source 104, a memory 106, a V-DMC encoder 200, and an output interface 108. Destination device 116 includes an input interface 122, a V-DMC decoder 300, a memory 120, and a data consumer 118. In accordance with this disclosure, V-DMC encoder 200 of source device 102 and V-DMC decoder 300 of destination device 116 may be configured to apply the techniques of this disclosure related to displacement vector quantization. Thus, source device 102 represents an example of an encoding device, while destination device 116 represents an example of a decoding device. In other examples, source device 102 and destination device 116 may include other components or arrangements. For example, source device 102 may receive data from an internal or external source. Likewise, destination device 116 may interface with an external data consumer, rather than include a data consumer in the same device.
[0044] System 100 as shown in FIG. 1 is merely one example. In general, other digital encoding and / or decoding devices may perform the techniques of this disclosure related to displacement vector quantization. Source device 102 and destination device 116 are merely examples of such devices in which source device 102 generates coded data for transmission to destination device 116. This disclosure refers to a “coding” device as a device that performs coding (encoding and / or decoding) of data. Thus, V-DMC encoder 200 and V-DMC decoder 300 represent examples of coding devices, in particular, an encoder and a decoder, respectively. In some examples, source device 102 and destination device 116 may operate in a substantially symmetrical manner such that each of source device 102 and destination device 116 includes encoding and decoding components. Hence, system 100 may support one-way or two-way transmission between source device 102 and destination device 116, e.g., for streaming, playback, broadcasting, telephony, navigation, and other applications.1616-614WO01Qualcomm Ref. No. 2502081WO 9 / 114
[0045] In general, data source 104 represents a source of data (e.g., raw, unencoded data) and may provide a sequential series of “frames” of the data to V-DMC encoder 200, which encodes data for the frames. Data source 104 may, for example, execute a framework or platform for generating graphics for video games, augmented reality, simulations, or any other such use case. Data source 104 of source device 102 may include a graphics engine that generates raw mesh data from any combination of one or more sensors configured to obtain real-world data. Examples of such sensors include cameras, 2D scanners, 3D scanners, light detection and ranging (LIDAR) devices, video cameras, ultrasonic sensors, infrared sensors, inertial measurement sensors, sonar sensors, pressure sensors, thermal imaging sensors, magnetic sensors, laser range finders, photodetectors, and the like. In other examples, the graphics engine may generate meshes that are entirely computer generated, i.e., not representative of a real world scene, using modeling, simulation, animation, generative adversarial networks, and the like. In yet other examples, data source 104 may not include a graphics engine, but instead, may obtain the mesh data from a storage unit or other device.
[0046] Regardless of whether the mesh data is based on real-world sensor data, entirely computer generated, obtained from an external source, or some combination thereof, V-DMC encoder 200 encodes the mesh data. V-DMC encoder 200 may rearrange the frames from the received order (sometimes referred to as “display order”) into a coding order for coding. V-DMC encoder 200 may generate one or more bitstreams including encoded data. Source device 102 may then output the encoded data via output interface 108 onto computer-readable medium 110 for reception and / or retrieval by, e.g., input interface 122 of destination device 116.
[0047] Memory 106 of source device 102 and memory 120 of destination device 116 may represent general purpose memories. In some examples, memory 106 and memory 120 may store raw data, e.g., raw data from data source 104 and raw, decoded data from V-DMC decoder 300. Additionally or alternatively, memory 106 and memory 120 may store software instructions executable by, e.g., V-DMC encoder 200 and V-DMC decoder 300, respectively. Although memory 106 and memory 120 are shown separately from V-DMC encoder 200 and V-DMC decoder 300 in this example, it should be understood that V-DMC encoder 200 and V-DMC decoder 300 may also include internal memories for functionally similar or equivalent purposes. Furthermore, memory 106 and memory 120 may store encoded data, e.g., output from V-DMC encoder 200 and input to V-DMC decoder 300. In some examples, portions of memory 106 and memory 120 may be 1616-614WO01Qualcomm Ref. No. 2502081WO 10 / 114allocated as one or more buffers, e.g., to store raw, decoded, and / or encoded data. For instance, memory 106 and memory 120 may store data representing a mesh.
[0048] Computer-readable medium 110 may represent any type of medium or device capable of transporting the encoded data from source device 102 to destination device 116. In one example, computer-readable medium 110 represents a communication medium to enable source device 102 to transmit encoded data directly to destination device 116 in real-time, e.g., via a radio frequency network or computer-based network. Output interface 108 may modulate a transmission signal including the encoded data, and input interface 122 may demodulate the received transmission signal, according to a communication standard, such as a wireless communication protocol. The communication medium may comprise any wireless or wired communication medium, such as a radio frequency (RF) spectrum or one or more physical transmission lines. The communication medium may form part of a packet-based network, such as a local area network, a wide-area network, or a global network such as the Internet. The communication medium may include routers, switches, base stations, or any other equipment that may be useful to facilitate communication from source device 102 to destination device 116.
[0049] In some examples, source device 102 may output encoded data from output interface 108 to storage device 112. Similarly, destination device 116 may access encoded data from storage device 112 via input interface 122. Storage device 112 may include any of a variety of distributed or locally accessed data storage media such as a hard drive, Blu-ray discs, DVDs, CD-ROMs, flash memory, volatile or non-volatile memory, or any other suitable digital storage media for storing encoded data.
[0050] In some examples, source device 102 may output encoded data to file server 114 or another intermediate storage device that may store the encoded data generated by source device 102. Destination device 116 may access stored data from file server 114 via streaming or download. File server 114 may be any type of server device capable of storing encoded data and transmitting that encoded data to the destination device 116. File server 114 may represent a web server (e.g., for a website), a File Transfer Protocol (FTP) server, a content delivery network device, or a network attached storage (NAS) device. Destination device 116 may access encoded data from file server 114 through any standard data connection, including an Internet connection. This may include a wireless channel (e.g., a Wi-Fi connection), a wired connection (e.g., digital subscriber line (DSL), cable modem, etc.), or a combination of both that is suitable for accessing 1616-614WO01Qualcomm Ref. No. 2502081 WO 11 / 114encoded data stored on file server 114. File server 114 and input interface 122 may be configured to operate according to a streaming transmission protocol, a download transmission protocol, or a combination thereof.
[0051] Output interface 108 and input interface 122 may represent wireless transmitters / receivers, modems, wired networking components (e.g., Ethernet cards), wireless communication components that operate according to any of a variety of IEEE 802.11 standards, or other physical components. In examples where output interface 108 and input interface 122 comprise wireless components, output interface 108 and input interface 122 may be configured to transfer data, such as encoded data, according to a cellular communication standard, such as 4G, 4G-LTE (Long-Term Evolution), LTE Advanced, 5G, or the like. In some examples where output interface 108 comprises a wireless transmitter, output interface 108 and input interface 122 may be configured to transfer data, such as encoded data, according to other wireless standards, such as an IEEE 802.11 specification, an IEEE 802.15 specification (e.g., ZigBee™), a Bluetooth™ standard, or the like. In some examples, source device 102 and / or destination device 116 may include respective system-on-a-chip (SoC) devices. For example, source device 102 may include an SoC device to perform the functionality attributed to V-DMC encoder 200 and / or output interface 108, and destination device 116 may include an SoC device to perform the functionality attributed to V-DMC decoder 300 and / or input interface 122.
[0052] The techniques of this disclosure may be applied to encoding and decoding in support of any of a variety of applications, such as communication between autonomous vehicles, communication between scanners, cameras, sensors and processing devices such as local or remote servers, geographic mapping, or other applications.
[0053] Input interface 122 of destination device 116 receives an encoded bitstream from computer-readable medium 110 (e.g., a communication medium, storage device 112, file server 114, or the like). The encoded bitstream may include signaling information defined by V-DMC encoder 200, which is also used by V-DMC decoder 300, such as syntax elements having values that describe characteristics and / or processing of coded units (e.g., slices, pictures, groups of pictures, sequences, or the like). Data consumer 118 uses the decoded data. For example, data consumer 118 may use the decoded data to determine the locations of physical objects. In some examples, data consumer 118 may comprise a display to present imagery based on meshes.
[0054] V-DMC encoder 200 and V-DMC decoder 300 each may be implemented as any of a variety of suitable encoder and / or decoder circuitry, such as one or more 1616-614WO01Qualcomm Ref. No. 2502081 WO 12 / 114microprocessors, digital signal processors (DSPs), application specific integrated circuits (ASICs), field programmable gate arrays (FPGAs), discrete logic, software, hardware, firmware or any combinations thereof. When the techniques are implemented partially in software, a device may store instructions for the software in a suitable, non-transitory computer-readable medium and execute the instructions in hardware using one or more processors to perform the techniques of this disclosure. Each of V-DMC encoder 200 and V-DMC decoder 300 may be included in one or more encoders or decoders, either of which may be integrated as part of a combined encoder / decoder (CODEC) in a respective device. A device including V-DMC encoder 200 and / or V-DMC decoder 300 may comprise one or more integrated circuits, microprocessors, and / or other types of devices.
[0055] V-DMC encoder 200 and V-DMC decoder 300 may operate according to a coding standard. This disclosure may generally refer to coding (e.g., encoding and decoding) of pictures to include the process of encoding or decoding data. An encoded bitstream generally includes a series of values for syntax elements representative of coding decisions (e.g., coding modes).
[0056] This disclosure may generally refer to “signaling” certain information, such as syntax elements. The term “signaling” may generally refer to the communication of values for syntax elements and / or other data used to decode encoded data. That is, V-DMC encoder 200 may signal values for syntax elements in the bitstream. In general, signaling refers to generating a value in the bitstream. As noted above, source device 102 may transport the bitstream to destination device 116 substantially in real time, or not in real time, such as might occur when storing syntax elements to storage device 112 for later retrieval by destination device 116.
[0057] This disclosure addresses various improvements of the displacement vector quantization process in the video-based coding of dynamic meshes (V-DMC) technology that is being standardized in MPEG WG7 (3DGH).
[0058] The MPEG working group 7 (WG7), also known as the 3D graphics and haptics coding group (3DGH), is currently standardizing the coding of dynamic mesh representations (V-DMC) targeting XR use cases. The current test model is based on the call for proposals result, Khaled Mammou, Jungsun Kim, Alexandros Tourapis, Dimitri Podborski, Krasimir Kolarov, [V-CG] Apple’s Dynamic Mesh Coding CfP Response, ISO / IEC JTC1 / SC29 / WG7, m59281, Apr. 2022, and encompasses the pre-processing of the input meshes into approximated meshes with typically fewer vertices named the base meshes, which are coded with a static mesh coder such as Google Draco, MPEG’s edge 1616-614WO01Qualcomm Ref. No. 2502081 WO 13 / 114breaker implementation, etc. In addition, the encoder may estimate the motion of the base mesh vertices and code the motion vectors into the bitstream. The reconstructed base meshes may be subdivided into finer meshes with additional vertices and, hence, additional triangles. The encoder may refine the positions of the subdivided mesh vertices to approximate the original mesh. The refinements or vertex displacement vectors may be coded into the bitstream. In the current test model, the displacement vectors are wavelet transformed (lifting scheme), quantized, and the coefficients are either packed into a 2D frame or directly coded with an arithmetic coder after inter prediction. The sequence of video frames is coded with a typical video coder, for example, the High Efficiency Video Coding (HEVC) Standard or the Versatile Video Coding (VVC) standard, into the bitstream. In addition, the sequence of texture frames is coded with a video coder.
[0059] FIGS. 2 and 3 show the overall system model for the current V-DMC test model (TM) encoder (V-DMC encoder 200 in FIG. 2) and decoder (V-DMC decoder 300 in FIG.3) architecture. V-DMC encoder 200 performs volumetric media conversion, and V-DMC decoder 300 performs a corresponding reconstruction. The 3D media is converted to a series of sub-bitstreams: base mesh, displacement, and texture attributes. Additional atlas information is also included in the bitstream to enable inverse reconstruction, as described in N00680.
[0060] FIG. 2 shows an example implementation of V-DMC encoder 200. In the example of FIG. 2, V-DMC encoder 200 includes pre-processing unit 204, atlas encoder 208, base mesh encoder 212, displacement encoder 216, video encoder 220, and multiplexer (MUX) 224. Pre-processing unit 204 receives an input mesh sequence and generates atlas parameters, a base mesh, the displacement vectors, and the texture attribute maps. Atlas encoder 208 encodes the atlas parameters. Base mesh encoder 212 encodes the base mesh. Displacement encoder 216 encodes the displacement vectors, for example as V3C video components or using arithmetic displacement coding. Video encoder 220 encodes the texture attribute components, e.g., texture or material information, using any video codec, such as the High Efficiency Video Coding (HEVC) Standard or the Versatile Video Coding (VVC) standard. MUX 224 combines the atlas sub-bitstream produced by atlas encoder 208, the base mesh sub-bitstream produced by base mesh encoder 212, the displacement sub-bitstream produced by displacement encoder 216, and the texture attribute sub-bitstream produced by video encoder 220 into a single encoded bitstream that may be stored or transmitted.1616-614WO01Qualcomm Ref. No. 2502081 WO 14 / 114
[0061] Aspects of V-DMC encoder 200 will now be described in more detail. Preprocessing unit 204 represents the 3D volumetric data as a set of base meshes and corresponding refinement components. This is achieved through a conversion of input dynamic mesh representations into a number of V3C components: a base mesh, a set of displacements, a 2D representation of the texture map, and an atlas. The base mesh component is a simplified low-resolution approximation of the original mesh in the lossy compression and is the original mesh in the lossless compression. The base mesh component can be encoded by base mesh encoder 212 using any mesh codec.
[0062] Base mesh encoder 212 may be configured to implement the Edgebreaker algorithm, e.g., m63344, for encoding the base mesh where the connectivity is encoded using a CLERS op code, e.g., from Rossignac and Lopes, and the residual of the attribute is encoded using prediction from the previously encoded / decoded vertices’ attributes.
[0063] Aspects of base mesh encoder 212 will now be described in more detail. One or more submeshes are input to base mesh encoder 212. Submeshes are generated by preprocessing unit 204. Submeshes are generated from original meshes by utilizing semantic segmentation. Each base mesh may include one or more submeshes.
[0064] Base mesh encoder 212 may process connected components. Connected components include a cluster of triangles that are connected by their neighbors. A submesh can have one or more connected components. Base mesh encoder 212 may encode one “connected component” at a time for connectivity and attributes encoding and then performs entropy encoding on all “connected components”.
[0065] Base mesh encoder 212 defines and categorizes the input base mesh into the connectivity and attributes. The geometry and texture coordinates (UV coordinates) are categorized as attributes.
[0066] FIG. 3 shows an example implementation of V-DMC decoder 300. In the example of FIG. 3, V-DMC decoder 300 includes demultiplexer 304, atlas decoder 308, base mesh decoder 314, displacement decoder 316, video decoder 320, base mesh processing unit 324, displacement processing unit 328, mesh generation unit 332, and reconstruction unit 336.
[0067] Demultiplexer 304 separates the encoded bitstream into an atlas sub-bitstream, a base-mesh sub-bitstream, a displacement sub-bitstream, and a texture attribute subbitstream. Atlas decoder 308 decodes the atlas sub-bitstream to determine the atlas information to enable inverse reconstruction. Base mesh decoder 314 decodes the base mesh sub-bitstream, and base mesh processing unit 324 reconstructs the base mesh.1616-614WO01Qualcomm Ref. No. 2502081 WO 15 / 114Displacement decoder 316 decodes the displacement sub-bitstream, and displacement processing unit 328 reconstructs the displacement vectors. Mesh generation unit 332 modifies the base mesh based on the displacement vector to form a displaced mesh.
[0068] Video decoder 320 decodes the texture attribute sub-bitstream to determine the texture attribute map, and reconstruction unit 336 associates the texture attributes with the displaced mesh to form a reconstructed dynamic mesh.
[0069] The following description will detail the displacement vector coding in the current V-DMC test model and WD 2.0. Additionally, the coding of the base mesh motion field is described.
[0070] A pre-processing system, such as pre-processing system 600 described with respect to FIG. 6, may be configured to perform preprocessing on an input mesh M(i). FIG. 4 illustrates the basic idea behind the proposed pre-processing scheme using a 2D curve. The same concepts may be applied to the input 3D mesh M(i) to produce a base mesh m(i) and a displacement field d(i).
[0071] In FIG. 4, the input 2D curve (represented by a 2D polyline), referred to as original curve 402, is first downsampled to generate a base curve / polyline, referred to as the decimated curve 404. A subdivision scheme, such as that described in Garland et al, Surface Simplification Using Quadric Error Metrics (https: / / www.cs.cmu.edu / ~garland / Papers / quadrics.pdf), is then applied to the decimated polyline to generate a subdivided curve 406. For instance, in FIG. 4, a subdivision scheme using an iterative interpolation scheme is applied. The subdivision scheme inserts at each iteration a new point in the middle of each edge of the polyline. In the example illustrated, two subdivision iterations were applied.
[0072] The proposed scheme is independent of the chosen subdivision scheme and may be combined with other subdivision schemes. The subdivided polyline is then deformed, or displaced, to get a better approximation of the original curve. This better approximation is displaced curve 408 in FIG. 4. Displacement vectors (arrows 410 in FIG. 4) are computed for each vertex of the subdivided mesh such that the shape of the displaced curve is as close as possible to the shape of the original curve (see FIG. 5). As illustrated by section 514 of displaced curve 408 and section 512 of original curve 402, for example, the displaced curve may not perfectly match the original curve.
[0073] An advantage of the subdivided curve is that the subdivided curve may have a subdivision structure that allows for efficient compression, while offering a faithful1616-614WO01Qualcomm Ref. No. 2502081 WO 16 / 114approximation of the original curve. The compression efficiency is obtained thanks to the following properties:The decimated / base curve has a low number of vertices and requires a limited number of bits to be encoded / transmitted.The subdivided curve is automatically generated by the decoder once the base / decimated curve is decoded (i.e., no need for any information other than the subdivision scheme type and subdivision iteration count).The displaced curve is generated by decoding the displacement vectors associated with the subdivided curve vertices. Besides allowing for spatial / quality scalability, the subdivision structure enables efficient transforms such as wavelet decomposition, which can offer high compression performance.
[0074] FIG. 6 shows a block diagram of pre-processing system 600 which may be included in V-DMC encoder 200 or may be separate from V-DMC encoder 200. Preprocessing system 600 represents an example implementation of pre-processing unit 204 as described with respect to FIG. 2. In the example of FIG. 6, pre-processing system 600 includes mesh decimation unit 610, atlas parameterization unit 620, and subdivision surface fitting unit 630.
[0075] Mesh decimation unit 610 uses a simplification technique to decimate the input mesh M(i) and produce the decimated mesh dm(i). The decimated mesh dm(i) is then re-parameterized by atlas parameterization unit 620, which may for example use the UVAtlas tool. The generated mesh is denoted as pm(i). The UVAtlas tool considers only the geometry information of the decimated mesh dm(i) when computing the atlas parameterization, which is likely sub-optimal for compression purposes. Better parameterization schemes or tools may also be considered with the proposed framework.
[0076] Applying re-parameterization to the input mesh makes it possible to generate a lower number of patches. This reduces parameterization discontinuities and may lead to better RD performance. Subdivision surface fitting unit 630 takes as input the reparameterized mesh pm(i) and the input mesh M(i) and produces the base mesh m(i) together with a set of displacements d(i). First, pm(i) is subdivided by applying the subdivision scheme. The displacement field d(i) is computed by determining for each vertex of the subdivided mesh the nearest point on the surface of the original mesh M(i).
[0077] For the Random Access (RA) condition, a temporally consistent re-meshing may be computed by considering the base mesh m(j) of a reference frame with index j as the1616-614WO01Qualcomm Ref. No. 2502081 WO 17 / 114input for subdivision surface fitting unit 630. This makes it possible to produce the same subdivision structure for the current mesh M’(i) as the one computed for the reference mesh Such a re-meshing process makes it possible to skip the encoding of the base mesh m(i) and re-use the base mesh m(j) associated with the reference frame M(j). This may also enable better temporal prediction for both the attribute and geometry information. More precisely, a motion field (i) describing how to move the vertices of m(j) to match the positions of m(i) is computed and encoded. Note that such timeconsistent re-meshing is not always possible. The proposed system compares the distortion obtained with and without the temporal consistency constraint and chooses the mode that offers the best RD compromise.
[0078] Note that the pre-processing system is not normative and may be replaced by any other system that produces displaced subdivision surfaces. A possible efficient implementation would constrain the 3D reconstruction unit to directly generate displaced subdivision surface and avoids the need for such pre-processing.
[0079] V-DMC encoder 200 and V-DMC decoder 300 may be configured to perform displacements coding, including video-based coding. Depending on the application and the targeted bitrate / visual quality, the encoder may optionally encode a set of displacement vectors associated with the subdivided mesh vertices, referred to as the displacement field d(i), as described in this section.
[0080] FIG. 7 shows V-DMC encoder 700, which is configured to implement an intra encoding process. V-DMC encoder 700 represents an example implementation of V-DMC encoder 200.
[0081] FIG. 7 includes the following abbreviations:m(i) - Base meshd(i) - Displacementsm”(i) - Reconstructed Base Meshd”(i) - Reconstructed DisplacementsA(i) - Attribute MapA’(i) - Updated Attribute MapM(i) - Static / Dynamic MeshDM(i) - Reconstructed Deformed Meshm’(i) - Reconstructed Quantized Base Meshd’(i) - Updated Displacementse(i) - Wavelet Coefficients1616-614WO01Qualcomm Ref. No. 2502081 WO 18 / 114e’(i) - Quantized Wavelet Coefficientspe’(i) - Packed Quantized Wavelet Coefficientsrpe’(i) - Reconstructed Packed Quantized Wavelet CoefficientsAB - Compressed attribute bitstreamDB - Compressed displacement bitstreamBMB - Compressed base mesh bitstream
[0082] V-DMC encoder 200 receives base mesh m(i) and displacements d(i), for example from pre-processing system 600 of FIG. 6. V-DMC encoder 200 also retrieves mesh M(i) and attribute map A(i).
[0083] Quantization unit 702 quantizes the base mesh, and static mesh encoder 704 encodes the quantized base mesh to generate a compressed base mesh bitstream. Static mesh decoder 706 then decodes the encoded base mesh. To the extent the encoding of the base mesh by static mesh encoder 704 is lossy, this encoding followed by decoding may determine the loss so that V-DMC encoder 700 may determine displacement vectors that reduce or minimize the loss.
[0084] Displacement update unit 708 uses the reconstructed quantized base mesh m’(i) to update the displacement field d(i) to generate an updated displacement field d’(0- This process considers the differences between the reconstructed base mesh m’(i) and the original base mesh m(i). By exploiting the subdivision surface mesh structure, wavelet transform unit 710 applies a wavelet transform to d’(i) to generate a set of wavelet coefficients. The scheme is generally agnostic to the transform applied and may leverage any other transform, including the identity transform. In accordance with the techniques of this disclosure, transform unit 710 includes a bias / offset determination unit 711. Bias / offset determination unit 711 may be configured to transform a set of displacement vectors to determine a set of transform coefficients; determine a bias value for the set of transform coefficients; determine an offset value based on the bias value for the set of transform coefficients; and subtract the offset value from the set of transform coefficients to determine bias-adjusted transform coefficients.
[0085] Quantization unit 712 quantizes wavelet coefficients, e.g., the bias-adjusted transform coefficients determined by bias / offset determination unit 711, and image packing unit 714 packs the quantized wavelet coefficients into a 2D image / video that can be compressed using a traditional image / video encoder in the same spirit as video-based point cloud compression (V-PCC) to generate a displacement bitstream.1616-614WO01Qualcomm Ref. No. 2502081 WO 19 / 114
[0086] Attribute transfer unit 730 converts the original attribute map A(i) to an updated attribute map that corresponds to the reconstructed deformed mesh DM(i). Padding unit 732 pads the updated attributed map by, for example, filling patches of the frame that have empty samples with interpolated samples that may improve coding efficiency and reduce artifacts. Color space conversion unit 734 converts the attribute map into a different color space, and video encoding unit 736 encodes the updated attribute map in the new color space, using for example a video codec, to generate an attribute bitstream.
[0087] Multiplexer 738 combines the compressed attribute bitstream, compressed displacement bitstream, and compressed base mesh bitstream into a single compressed bitstream.
[0088] Image unpacking unit 718 and inverse quantization unit 720 apply image unpacking and inverse quantization to the reconstructed packed quantized wavelet coefficients generated by video encoding unit 716 to obtain the reconstructed version of the wavelet coefficients. Inverse wavelet transform unit 722 applies an inverse wavelet transform to the reconstructed wavelet coefficient to determine reconstructed displacements d’’(0-
[0089] Inverse quantization unit 724 applies an inverse quantization to the reconstructed quantized base mesh m’(i) to obtain a reconstructed base meshDeformed mesh reconstruction unit 728 subdividesand applies the reconstructed displacements d’’(i) to its vertices to obtain the reconstructed deformed mesh DM(i
[0090] Image unpacking unit 718, inverse quantization unit 720, inverse wavelet transform unit 722, and deformed mesh reconstruction unit 728 represent a displacement decoding loop. Inverse quantization unit 724 and deformed mesh reconstruction unit 728 represent a base mesh decoding loop. V-DMC encoder 700 includes the displacement decoding loop and the base mesh decoding loop so that V-DMC encoder 700 can make encoding decisions, such as determining an acceptable rate-distortion tradeoff, based on the same decoded mesh that a mesh decoder will generate, which may include distortion due to the quantization and transforms. V-DMC encoder 700 may also use decoded versions of the base mesh, reconstructed mesh, and displacements for encoding subsequent base meshes and displacements.
[0091] Control unit 750 generally represents the decision making functionality of V-DMC encoder 700. During an encoding process, control unit 750 may, for example, make determinations with respect to mode selection, rate allocation, quality control, and other such decisions.1616-614WO01Qualcomm Ref. No. 2502081 WO 20 / 114
[0092] FIG. 8 shows V-DMC decoder 800, which may be configured to perform either intra- or inter-decoding. V-DMC decoder 800 represents an example implementation of V-DMC decoder 300. The processes described with respect to FIG. 8 may also be performed, in full or in part, by V-DMC encoder 200.
[0093] V-DMC decoder 800 includes demultiplexer (DMUX) 802, which receives compressed bitstream b(i) and separates the compressed bitstream into a base mesh bitstream (BMB), a displacement bitstream (DB), and an attribute bitstream (AB). Mode select unit 804 determines if the base mesh data is encoded in an intra mode or an inter mode. If the base mesh is encoded in an intra mode, then static mesh decoder 806 decodes the mesh data without reliance on any previously decoded meshes. If the base mesh is encoded in an inter mode, then motion decoder 808 decodes motion, and base mesh reconstruction unit 810 applies the motion to an already decoded mesh (m”(j)) stored in mesh buffer 812 to determine a reconstructed quantized base mesh (m’(i))). Inverse quantization unit 814 applies an inverse quantization to the reconstructed quantized base mesh to determine a reconstructed base mesh (m”(i)).
[0094] Video decoder 816 decodes the displacement bitstream to determine a set or frame of quantized transform coefficients. Image unpacking unit 818 unpacks the quantized transform coefficients. For example, video decoder 816 may decode the quantized transform coefficients into a frame, where the quantized transform coefficients are organized into blocks with particular scanning orders. Image unpacking unit 818 converts the quantized transform coefficients from being organized in the frame into an ordered series. In some implementations, the quantized transform coefficients may be directly coded, using a context-based arithmetic coder for example, and unpacking may be unnecessary.
[0095] Regardless of whether the quantized transform coefficients are decoded directly or in a frame, inverse quantization unit 820 inverse quantizes, e.g., inverse scales, quantized transform coefficients to determine de-quantized transform coefficients. Inverse wavelet transform unit 822 applies an inverse transform to the de-quantized transform coefficients to determine a set of displacement vectors. Inverse wavelet transform unit 822 includes offset unit 823. Offset unit 823 is configured to determine an offset value based on one or more syntax elements and apply the offset to a set of transform coefficients to determine a set of updated transform coefficients before inverse wavelet transform unit 822 applies the inverse transform.1616-614WO01Qualcomm Ref. No. 2502081 WO 21 / 114
[0096] Deformed mesh reconstruction unit 824 deforms the reconstructed base mesh using the decoded displacement vectors to determine a decoded mesh (M”(i)).Video decoder 826 decodes the attribute bitstream to determine decoded attribute values (A’ (i)), and color space conversion unit 828 converts the decoded attribute values into a desired color space to determine final attribute values (A”(i)). The final attribute values correspond to attributes, such as color or texture, for the vertices of the decoded mesh.
[0097] FIG. 9 shows a block diagram of an intra decoder which may, for example, be part of V-DMC decoder 300. De-multiplexer (DMUX) 902 separates compressed bitstream (bi) into a mesh sub-stream, a displacement sub-stream for positions and potentially for each vertex attribute, zero or more attribute map sub-streams, and an atlas sub-stream containing patch information in the same manner as in V3C / V-PCC.
[0098] De-multiplexer 902 feeds the mesh sub-stream to static mesh decoder 906 to generate the reconstructed quantized base mesh m’(i). Inverse quantization unit 914 inverse quantizes the base mesh to determine the decoded base meshVideo / image decoding unit 916 decodes the displacement sub-stream, and image unpacking unit 918 unpacks the image / video to determine quantized transform coefficients, e.g., wavelet coefficients. Inverse quantization unit 920 inverse quantizes the quantized transform coefficients to determine dequantized transform coefficients. Inverse transform unit 922 generates the decoded displacement field d’’(i) by applying the inverse transform to the unquantized coefficients. Deformed mesh reconstruction unit 924 generates the final decoded mesh (M”(i)) by applying the reconstruction process to the decoded base mesh and by adding the decoded displacement fieldThe attribute sub-stream is directly decoded by video / image decoding unit 926 to generate an attribute map A"(i). Color format / space conversion unit 928 may convert the attribute map into a different format or color space.
[0099] As an addition or alternative to packing the quantized wavelet coefficients in frames and coding as images or video, a scheme that directly codes the quantized wavelet coefficients with a block-based arithmetic coder may also be used. This scheme is illustrated in FIG. 10. The decoded quantized wavelet coefficients are inter predicted from the reference buffer, which contains quantized wavelet coefficients from prior frames, for example, the preceding frame. In the example of FIG. 10, decoder 1000 performs contextbased arithmetic decoding 1002 of a displacement bitstream based on a context update 1004. Decoder 1000 performs de-binarization 1006 on the context decoded bitstream to determine values for syntax elements and performs coefficient level decoding 1008 on 1616-614WO01Qualcomm Ref. No. 2502081 WO 22 / 114the syntax elements. For intra coded displacements, decoder 1000 performs inverse quantization 1012 on the coefficient levels to determine de-quantized coefficient levels, and then performs an inverse wavelet transform 1014 on the de-quantized coefficient levels to determine the displacements. For inter coded displacements, decoder 1000 performs inter prediction 1016 using reference frames stored in a frame buffer 1018 and adds 1020 the prediction values to the coefficient levels to determine final coefficient levels. Decoder 1000 then performs inverse quantization 1012 on the final coefficient levels to determine de-quantized coefficient levels, and then performs an inverse wavelet transform 1014 on the de-quantized coefficient levels to determine the displacements.
[0100] V-DMC encoder 200 and V-DMC decoder 300 may be configured to implement a subdivision scheme. Various subdivision schemes could be considered. A possible solution is the mid-point subdivision scheme, which at each subdivision iteration subdivides each triangle into four sub-triangles as described in FIG. 11. New vertices are introduced in the middle of each edge. In the example, FIG. 11, triangles 1102 are subdivided to obtain triangles 1104, and triangles 1104 are subdivided to obtain triangles 1106. The subdivision process is applied independently to the geometry and to the texture coordinates since the connectivity for the geometry and for the texture coordinates is usually different. Using the sub-division scheme, V-DMC encoder 200 and V-DMC decoder 300 compute the position Pos(v12) of a newly introduced vertex v12at the center of an edge (v1, v2), as follows:1Pos(v12) = ½ (Pos(v1) + Pos(v2)),where Pos(v1) and Pos(v2) are the positions of the verticesand v2.
[0101] The same process is used to compute the texture coordinates of the newly created vertex. For normal vectors, an extra normalization step is applied as follows:N(v12) =(V12)“ ||Wi) + W2)ll’here:• N(v12), N(v1), and N(v2) are the normal vectors associated with the vertices v12, v1, and v2, respectively.• 11 x 11 is the norm2 of the vector x.
[0102] V-DMC encoder 200 and V-DMC decoder 300 may be configured to apply wavelet transforms. Various wavelet transforms may be applied. The results reported for CfP are based on a linear wavelet transform.1616-614WO01Qualcomm Ref. No. 2502081 WO 23 / 114
[0103] The prediction process is defined as follows:Signal(v) ← Signal(v) − ½ (Signal(v1) + Signal(v2))where• v is the vertex introduced in the middle of the edge (v1, v2), and• Signal(v), Signal(v1), and Signal(v2) are the values of the geometry / vertex attribute signals at the vertices v, v1, and v2, respectively.
[0104] The updated process is as follows:Signal(v) ← Signal(v) + 1 / 8 ∑ Signal(w)wev*where v* is the set of neighboring vertices of the vertex v.
[0105] The scheme may allow to skip the update process. The wavelet coefficients could be quantized e.g., by using a uniform quantizer with a dead zone.
[0106] Local versus canonical coordinate systems for displacements will now be discussed. The displacement field d(i) is defined in the same cartesian coordinate system as the input mesh. A possible optimization is to transform d(i) from this canonical coordinate system to a local coordinate system, which is defined by the normal to the subdivided mesh at each vertex.
[0107] A potential advantage of considering a local coordinate system for the displacements is the possibility to quantize more heavily the tangential components of the displacements compared to the normal component. In fact, the normal component of the displacement has more significant impact on the reconstructed mesh quality than the two tangential components.
[0108] V-DMC encoder 200 and V-DMC decoder 300 may be configured to implement packing of wavelet coefficients. The following scheme is used to pack the wavelet coefficients into a 2D image:• Traverse the coefficients from low to high frequency.• For each coefficient, determine the index of the NxM pixel block (e.g., N = M = 16) in which the coefficient is to be stored following a raster order for blocks. • The position within the NxM pixel block may be computed by using a Morton order to maximize locality.1616-614WO01Qualcomm Ref. No. 2502081 WO 24 / 114
[0109] Other packing schemes could be used (e.g., zigzag order, raster order). The encoder could explicitly signal in the bitstream the used packing scheme (e.g., atlas sequence parameters). This could be done at patch, patch group, tile, or sequence level.
[0110] V-DMC encoder 200 may be configured to perform displacement video encoding. The proposed scheme is agnostic of which video coding technology is used. When coding the displacement wavelet coefficients, a lossless approach may be used since the quantization is applied in a separate module. Another approach is to rely on the video encoder to compress the coefficients in a lossy manner and apply a quantization either in the original or transform domain.[OHl] V-DMC encoder 200 and V-DMC decoder 300 may be configured to execute a directional lifting algorithm.a. As part of the preprocessing step, in lifting transform, prediction is performed twice. First preprocessing prediction is used to calculate μ and σ across all vertices of the signal signal[v].b. Then directional lifting is applied after both, the main prediction and update operation in lifting transform in steps as listed from c. onwards.c. When vl and v2 are the neighboring vertices and v is the target vertex, coherence is computed as follows:signal[v]. signal[v1] > signal[v]. signal[v2] −−−→ 0 ⎤signal[v]. signal[v1] == signal[v]. signal[v2] −−→ 2 ⎬ Coherencesignatfy]. signatfyl] < signatfy]. signal[v2] - > 1Jd. Zscoreis computed as abs(signal[v] − μ) / σe. The value k is selected based on Zscoreas follows:k 0.5 if Zscore< 1= 0.75 if Zscore< 2= 0.95 otherwisef. Scale is calculated as:- Uscale= (k * 0.1 + 0.9)^2 − 1 for updatePscale= (k * 0.1 + 0.9)^1 − 1 for predictiong. Apply directional weight to prediction stepsignal[v] = signal[v] − Pscale* signal[v1], if coherence = 1signal[v] = signal[v] − Pscale* signal[v2], if coherence = 0h. Apply directional weight to update step1616-614WO01Qualcomm Ref. No. 2502081 WO 25 / 114signal[v1] = signal[v1] + Uscale* signal[v], if coherence = 1signal[v2] = signal[v2] + Uscale* signal[v], if coherence = 0
[0112] The following is example code for inverse directional lifting: template<class Tl, class T2>voidapplyDirectionalWeights(std::vector< Tl>& signal,int32_t v, int32_t vl, int32_t v2,const std::vector<double> dirScale,const T2 predWeight,const T2 updateWeight 1,const T2 updateWeight2,const bool isPredStep,const bool islnverse) {auto d1 = updateWeight1 * signal[v];auto d2 = updateWeight2 * signal[v];auto ps1 = predWeight * signal[v1];auto ps2 = predWeight * signal[v2];auto mean_global = dirScale[0];auto std_global = dirScale[1];if (islnverse) {auto signal_v_rec = isPredStep ? signal[v] : (signal[v] + predWeight * (signal[v1] + signal[v2]));int8_t coherence =computeCoherence(signal_v_rec, signal[v1], signal[v2]);double deviation = signal_v_rec[0] - mean_global;double z_score = std::abs(deviation / std_global);auto weight = (z_score < 1)? 0.5: (z_score < 2)? 0.75: 0.95;auto weight_normalized =pow((weight * 0.1 + 0.9), (isPredStep == false? 2: 1)) - 1.; if (coherence <= 1) {if (isPredStep) {auto ps = coherence ? ps1 : ps2;1616-614WO01Qualcomm Ref. No. 2502081 WO 26 / 114signal[v] += weight_normalized * ps;}else {auto ps = coherence ? v1 : v2;auto d = ps == v1 ? d1 : d2;signal[ps] -= weight_normalized * d;}}
[0113] This disclosure addresses various problems. A first set of problems that may be addressed by techniques described in this disclosure is directed to directional lifting algorithm issues. Coherence is deduced using the dot product of two neighboring vertices, while the directional lifting is applied only to the first component (normal vector) of the displacement vector. In the coherence calculation, three conditions are tested. Among the three conditions, the likelihood of the dot product of neighboring vertices with the target vertex being equal is very low, making the check redundant. A scale is chosen based on a value ‘k’ which is selected based on the range that the z-score falls into, making the process a two-step calculation with multiple constants that are hard-coded. A division by standard deviation to calculate the z-score is used, which is essentially compared to choose the value ‘k’, making for an expensive operation that can be simplified.
[0114] A second set of problems that may be addressed by techniques described in this disclosure is directed to directional lifting parameters signaling issues. VDMC’s updated committee draft (CD), Text of ISO / IEC DIS 23090-29 Video-based mesh coding, ISO / IEC JTC1 / SC29 / WG7, NO 1027, November 2024, is referenced in this disclosure for the intra meshpatch, merge meshpatch, inter meshpatch, and lifting transform parameters syntaxes and is incorporated herein by reference. The following issues have been identified and are being addressed by the techniques of this disclosure. If at the Sequence Parameter Set (SPS) level, the transform type is none, then the directional lifting flag may be disabled, and when the transform type is overridden at the meshpatch level, the directional lifting transform cannot be enabled. Also, if the subdivision process is overridden at the meshpatch level, for example to mid / mid / loop, then the directional lifting transform cannot be disabled at the meshpatch level.1616-614WO01Qualcomm Ref. No. 2502081 WO 27 / 114
[0115] Additionally, the performance is sensitive to the three threshold ranges used to calculate the value of ‘k’, but these ranges are currently neither optimized nor signaled. Also, there is flexibility to enable or disable this tool per Level of Detail (LOD), which introduces too many update weight cases in the lifting transform. Directional lifting scale parameters are two but are sent as one parameter with an index of 2 in the meshpatch, inter meshpatch, and merge meshpatch. The directional lifting parameters are sent as fractional values, but only the numerator with a precision of 2 is sent, and the decoder uses a fixed value of 100 to calculate the scale. The directional lifting parameters are not delta-coded for merge and inter meshpatches. Finally, the lifting offset tool and the directional lifting transform signal a mean of the same signal but signal the mean separately, causing repetitive signaling.
[0116] A dot product for coherence calculation will now be discussed. A problem with current implementations is that coherence is deduced using a dot product of two neighboring vertices while the directional lifting is applied only to the first component (normal vector) of displacement vector. A simplified solution may be that if signal vl and signal_v2 are neighboring vertices and the signal is the target vertex, then the coherence may be computed as follows:computeCoherence(const T signal, const T signal vl, const T signal_v2) {auto dotproduct_v1 = signal[0] * signal_v1[0] + signal[1] * signal_v1[1]+ signal[2] * signal_v1[2];auto dotproduct_v2 = signal[0] * signal_v2[0] + signal[1] * signal_v2[1]+ signal[2] * signal_v2[2];if (dotproduct_v1 > dotproduct_v2) { / / printf(“vl is more coherent\n”);return 0;} else if (dotproduct_v1 == dotproduct_v2) { / / printf(“Two even samples have the same importance level!\n");return 2;} else { / / printf(“v2 is more coherent\n”);return 1;}1616-614WO01Qualcomm Ref. No. 2502081 WO 28 / 114}
[0117] The directional lifting is applied only to the first component of the displacement vector which essentially makes computing coherence using dot product redundant. Same coherence can be computed by comparing (e.g., just comparing) the values of first component of each vertex as follows:computeCoherence(const T signal, const T signal vl, const T signal_v2) {<del>auto dotproduct_v1 = signal[0] * signal_v1[0] + signal[1] * signal_v1[1] +signal[2] * signal_v1[2];auto dotproduct_v2 = signal[0] * signal_v2[0] + signal[1] * signal_v2[1] +signal[2] * signal_v2[2];< / del>if (signal_v1[0] > signal_v2[0]) { / / printf("vl is more coherent\n");return 0;} else if (signal_v1[0] == signal_v2[0]) { / / printf(" Two even samples have the same importance level!\n");return 2;} else { / / printf("v2 is more coherent\n");return 1;}}
[0118] Checking the unlikely case of the dot product being equal in computing coherence will now be discussed. A problem with current implementations is that, in a coherence calculation, three conditions are tested. The likelihood of a dot product of neighboring vertices with the target vertex being equal is very low, making the check redundant. As a potential solution, the highly unlikely condition check can be removed from the computeCoherence process as follows:computeCoherence(const T signal, const T signal vl, const T signal_v2) {auto dotproduct_v1 = signal[0] * signal_v1[0] + signal[1] * signal_v1[1]+ signal[2] * signal_v1[2];1616-614WO01Qualcomm Ref. No. 2502081 WO 29 / 114auto dotproduct_v2 = signal[0] * signal_v2[0] + signal[1] * signal_v2[1]+ signal[2] * signal_v2[2];if (dotproduct_v1 > dotproduct_v2) { / / printf("vl is more coherent\n");return 0;<del>} else if (dotproduct_v1 == dotproduct_v2) { / / printf(" Two even samples have the same importance level!\n");return 2;} else {< / del> / / printf("v2 is more coherent\n");return 1;
[0119] An example of this solution combined with the simplifications discussed above with respect to dot product coherence may be as follows:computeCoherence(const T signal, const T signal vl, const T signal_v2) {if (signal_v1[0] > signal_v2[0]) { / / printf("vl is more coherent\n");return 0;} else { / / printf("v2 is more coherent\n");return 1;
[0120] A simplification of a scale calculation will now be discussed. A problem with current implementations is that a scale is chosen based on a value ‘k’ which is selected based on the range the z-score falls into, making for a two-step calculation with multiple constants that are hard coded. A potential solution is that for directional lifting algorithm, V-DMC encoder 200 and V-DMC decoder 300 may be configured to determine the value k is based on Zscoreas follows:fc 0.5 if Zscore< 11616-614WO01Qualcomm Ref. No. 2502081 WO 30 / 114= 0.75 if Zscore< 2= 0.95 otherwise
[0121] Then, V-DMC encoder 200 and V-DMC decoder 300 may be configured to determine the scale as:Uscaie = ( * 0.1 + 0.9)A2 — 1 for update Pscale= (k * 0.1 + 0.9)^1 − 1 for prediction
[0122] These two-step calculation can be combined as follows:The value k is selected based on Zscoreas follows:k = 0.5 * 0.1 + 0.9 = 0.95 if Zscore< 1= 0.75 * 0.1 + 0.9 = 0.975 if Zscore<= 0.95 * 0.1 + 0.9 = 0.995 otherwiseThen, V-DMC encoder 200 and V-DMC decoder 300 may be configured to determine the scale as:Uscale= (k)^2 − 1 for updatePscale= (k)^1 − 1 for prediction
[0123] Division for z-score calculation will now be discussed. A problem with current implementations is that a division with standard deviation to calculate z-score is used which is essentially compared to choose the value ‘k’ making for an expensive operation which can be simplified. A potential solution is as follows:Zscoreis computed as abs(signal[v] − μ) / σThe value k is selected based on Zscoreas follows:k 0.5 if Zscore1= 0.75 if Zscore< 2= 0.95 otherwise
[0124] The division to calculate Z-score can be removed and the above-mentioned steps in directional lifting algorithm can be simplified as follows:Znumis computed as abs(signal[v] − μ)The value k is selected based on Zscoreas follows:k 0.5 if Znumo= 0.75 if Znum< 2 * o= 0.95 Otherwise
[0125] The following is code after combining all the simplifications:tempi ate<cl ass Tl, class T2>1616-614WO01Qualcomm Ref. No. 2502081 WO 31 / 114voidapplyDirectionalWeights(std::vector< Tl>& signal,int32_t v, int32_t vl, int32_t v2,const std::vector<double> dirScale,const T2 predWeight,const T2 updateWeight 1,const T2 updateWeight2,double scale 1,double scale2,double scale3,const bool isPredStep,const bool islnverse) {auto d1 = updateWeight1 * signal[v];auto d2 = updateWeight2 * signal[v];auto ps1 = predWeight * signal[v1];auto ps2 = predWeight * signal[v2];auto mean_global = dirScale[0];auto std_global = dirScale[1];if (islnverse) {auto signal_v_rec = isPredStep ? signal[v] : (signal[v] + predWeight * (signal[v1] + signal[v2]));int8_t coherence = (signal [vl][0] > signal [v2][0])? 0: 1;double z_score = std::abs(signal_v_rec[0] - mean_global);auto weight = (z_score < std_global)? scalel: (z_score < (2*std_global))? scale2: scale3;auto weight_normalized = pow(( weight), (isPredStep == false? 2: 1)) - 1.;if (coherence <= 1) {if (isPredStep) {auto ps = coherence ? ps1 : ps2;signal[v] += weight_normalized * ps;}else {1616-614WO01Qualcomm Ref. No. 2502081 WO 32 / 114auto ps = coherence ? v1 : v2;auto d = ps == v1 ? d1 : d2;signal[ps] -= weight_normalized * d;}}Where, scalel, scale2 and scale3 are 0.95, 0.975 and 0.995 respectively. The scales can be either hard coded or signaled in the bitstream as explained in more detail below.
[0126] A patch-level directional lifting enable flag will now be discussed. A problem with current implementations is that if, at the Sequence Parameter Set (SPS) level, the transform type is none, then the directional lifting flag may be disabled, and when the transform type is overridden at the meshpatch level, then a directional lifting transform cannot be enabled. Also, if the subdivision process is overridden at the meshpatch level, for example, to mid / mid / loop, then the directional lifting transform cannot be disabled at the meshpatch level. Introducing functionality to enable the directional lifting transform at the meshpatch level provides a possible solution to the above-mentioned problem and may be more appropriate because directional lifting is applied at the patch level and is unique to each patch. This technique may be achieved by moving the syntax element asve_directional_lifting_present_flag as shown below. Throughout this disclosure, the delimiters <add> and < / add> are used to show added text, and the delimiters <del> and < / del> are used to show deleted text.ASPSasps_vdmc_extension( ) { Descriptor asve_subdivision_iteration_count u(3) AspsSubdivisionCount = asve_subdivision_iteration_countif( AspsSubdivisionCount > 1 ) {asve_lod_adaptive_subdivision_flag u(1) }if( AspsSubdivisionCount > 0 ) {asve_edge_based_subdivision_flag u(1) }for( i=0; i < AspsSubdivisionCount; i++) {if( asve_lod_adaptive_subdivision_flag == 1 || i == 0 ) {asve_subdivision_method[ i ] u(3) } else {asve_subdivision_method[ i ] = asve_subdivision_method
[0000] }AspsSubdivisionMethod[ i ] = asve_subdivision_method[ i ]1616-614WO01Qualcomm Ref. No. 2502081 WO 33 / 114}if( asve_edge_based_subdivision_flag == 1 ) {asve_subdivision_min_edge_length u(16) AspsSubdivisionMinEdgeLength = asve_subdivision_min_edge_length} else {AspsSubdivisionMinEdgeLength = 0}asve_1d_displacement_flag u(1) asve_interpolate_subdivided_normals_flag u(1) asve_displacement_reference_qp_minus49 se(v) asve_quantization_parameters_present_flag u(1) if( asve_quantization_parameters_present_flag ) { asve_inverse_quantization_offset_present_flag u(1) vdmc_quantization_parameters( 0, AspsSubdivisionCount, 0)}if( AspsSubdivisionCount!= 0 ) {asve_transform_method u(3) AspsTransformMethod = asve_transform_method}asve_lifting_offset_present_flag u(1) <add>asve_directional_lifting_present_flag< / add> u(1) if( asve_transform_method == LI NEARJJ FTI NG && AspsSubdivisionCount!= 0) {<del>asve_directional_lifting_present_flag< / del> u(1) vdmc_lifting_transform_parameters( 0, AspsSubdivisionCount )}asve_atribute_information_present_flag u(1) if( asve_attribute_information_present_flag ) {asve_consistent_atribute_frame_flag u(1) if(!asve_consistent_attribute_frame_flag) {asve_atribute_frame_count u(7) }for(i=0; i< AspsAttributeNominalFrameCount; i++){asve_atribute_frame_width[ i ] ue(v) asve_atribute_frame_height[ i ] ue(v) asve_atribute_subtexture_enabled_flag[ i ] u(1) }}asve_displacement_id_present_flag u(1) asve_lod_patches_enable_flag u(1) asve_packing_method u(1) if (!asve_attribute_information_present_flag ) { asve_projection_texcoord_enable_flag u(1) if( asve_projection_texcoord_enable_flag ){ asve_projection_texcoord_mapping_atribute_index_present_flag u(1)if( asve_projection_texcoord_mapping_attribute_index_present_flag ) {1616-614WO01Qualcomm Ref. No. 2502081 WO 34 / 114asve_projection_texcoord_mapping_atribute_index u(7) }asve_projection_texcoord_output_bit_depth_minus1 u(5) asve_projection_texcoord_bbox_bias_enable_flag u(1) asve_projection_texcoord_upscale_factor_minus1 u(40) asve_projection_texcoord_log2_downscale_factor u(6) asve_projection_raw_textcoord_present_flag u(1) if( asve_projection_raw_textcoord_present_flag ) asve_projection_raw_textcoord_bitdepth_minus1 u(v) }}asve_vdmc_vui_parameters_present_flag u(1) if( asve_vdmc_vui_parameters_present_flag )vdmc_vui_parameters( )}Meshpatch data unit syntaxmeshpatch_data_unit( tilelD, patchldx ) { Descriptor mdu_submesh_id[ tilelD ][ patchldx ] ue(v) if( athjype == P_TILE || athjype == l_TILE ) {if( AspsDisplacementldPresentFlag ) {mdu_displ_id[ tilelD ][ patchldx ] ue(v) } else {if( AspsLodPatchesEnableFlag )mdu_lod_idx[ tilelD ][ patchldx ] ue(v) mdu_2d_pos_x[ tilelD ][ patchldx ] ue(v) mdu_2d_pos_y[ tilelD ][ patchldx ] ue(v) mdu_2d_size_x_minus1[ tilelD ][ patchldx ] ue(v) mdu_2d_size_y_minus1[ tilelD ][ patchldx ] ue(v) }if( mdu_lod_idx[ tilelD ][ patchldx ] == 0 ) {PatchSubdivisionCount[ tilelD ][ patchldx ] = AfpsSubdivisionCount mdu_parameters_override_flag[ tilelD ][ patchldx ] u(1) if( mdu_parameters_override_flag[ tilelD ][ patchldx ] ){u(1) mdu_subdivision_iteration_count_present_flag[ tilelD ][ patchldx ]if( mdu_subdivision_iteration_count_present_flag[ tilelD ][ patchldx ] ) {mdu_subdivision_iteration_count u(3) PatchSubdivisionCount[ tilelD ][ patchldx ] = mdu_subdivision_iteration_count}if( PatchSubdivisionCount[ tilelD ][ patchldx ]!= 0 )mdu_transform_method_present_flag[ tilelD ][ patchldx ] u(1)1616-614WO01Qualcomm Ref. No. 2502081 WO 35 / 114if(!mdu_subdivision_iteration_count_present_flag[ tilelD ][ patchldx ] ) {if( PatchSubdivisionCount[ tilelD ][ patchldx ]!= 0 )u(1) mdu_subdivision_method_present_flag[ tilelD ][ patchldx ]if( asve_quantization_parameters_present_flag ) mdu_quantization_present_flag[ tilelD ][ patchldx ] u(1) if ( (!mdu_transform_method_present_flag[ tilelD ][ patchldx ] ) &&PatchSubdivisionCount[ tilelD ][ patchldx ]!= 0 )u(1) mdu_transform_parameters_present_flag[ tilelD ][ patchldx ]}}if( mdu_subdivision_method_present_flag[ tilelD ][ patchldx ] ){if( PatchSubdivisionCount[ tilelD ][ patchldx ] > 1) { mdu_lod_adaptive_subdivision_flag[ tilelD ][ patchldx ] u(1) }for( I = 0; I < PatchSubdivisionCount[ tilelD ][ patchldx ]; I++) { if( mdu_lod_adaptive_subdivision_flag == 1 || I == 0 ) { mdu_subdivision_method[ tilelD ][ patchldx ][ I ] u(3) } else {mdu_subdivision_method[ tilelD ][ patchldx ][ I ] = mdu_subdivision_method[ tilelD ][ patchldx ]
[0000] }PatchSubdivisionMethod[ tilelD ][ patchldx ][ I ] = mdu_subdivision_method[ I ]}if( asve_edge_based_subdivision_flag == 1 ) { mdu_subdivision_min_edge_length[ tilelD ][ patchldx ] u(16) PatchSubdivisionMinEdgeLength[ tilelD ][ patchldx ] = mdu_subdivision_min_edge_length[ tilelD ][ patchldx ]} else {PatchSubdivisionMinEdgeLength[ tilelD ][ patchldx ] = 0 }} else {for( I = 0; I < PatchSubdivisionCount[ tilelD ][ patchldx ]; I++ ){ PatchSubdivisionMethod[ tilelD ][ patchldx ][ I ] = AfpsSubdivisionMethod[ I ]}PatchSubdivisionMinEdgeLength[ tilelD ][ patchldx ] = AfpsSubdivisionMinEdgeLength}if( mdu_quantization_present_flag[ tilelD ][ patchldx ] ) vdmc_quantization_parameters( 2,PatchSubdivisionCount[ tilelD ][ patchldx ],AfpsSubdivisionCount )if( AspsinvQuantOffsetPresentFlag ) {1616-614WO01Qualcomm Ref. No. 2502081 WO 36 / 114u(1) mdu_inverse_quantization_offset_enable_flag[ tilelD ][ patchldx ]if( mdu_inverse_quantization_offset_enable_flag ) {for( i = 0; i < PatchSubdivisionCount[ tilelD ][ patchldx ]; i++ ) {for( j = 0; j < AspsDispComponents; j++ ) {for( k = 0; k < 3; k++) {u(1) mdu_inverse_quantization_offset_sign[ tilelD ][ patchldx ][ I ][j ][ k ] mdu_inverse_quantization_offset_value_log2_prec1_delta[ tilelD ][ patchldx ][ I ][ j ][ se(v) k]mdu_inverse_quantization_offset_value_log2_prec2_delta[ tilelD ][ patchldx ][ I ][ j ][ se(v) k ]}}}}}mdu_displacement_coordinate_system[ tilelD ][ patchldx ] u(1) if( mdu_transform_method_present_flag[ tilelD ][ patchldx ] && PatchSubdivisionCount[ tilelD ][ patchldx ]!= 0 ) mdu_transform_method[ tilelD ][ patchldx ] u(3) if( mdu_transform_method[ tilelD ][ patchldx ]== LINEAR_LIFTING ) { if( AspsLiftingOffsetPresentFlag ) {mdu_lifting_offset_present_flag [ tilelD ][ patchldx ] u(1) if( mdu_lifting_offset_present_flag[ tilelD ][ patchldx ] ) {for( I = 0; I < PatchSubdivisionCount[ tilelD ][ patchldx ]; I++ ) {se(v) mdu_lifting_offset_values_num[ tilelD ][ patchldx ][ I ]ue(v) mdu_lifting_offset_values_deno_minus1[ tilelD ][ patchldx ][ I ]}}}if( AspsDirectionalLiftingPresentFlag ) {<add>mdu_directional_lifting_present_flag u(1) [ tilelD ][ patchldx] < / add><add>if( mdu_directional_lifting_present_flag[ tilelD ][ patchldx ] ) {< / add>for( I = 0; I < 2; I++ ) {se(v) mdu_directional_lifting_scale_num[ tilelD ][ patchldx ][ I ]}<add>}< / add>}if ( mdu_transform_parameters_present_flag[ tilelD ][ patchldx ] ) {vdmc_lifting_transform_parameters(2,PatchSubdivisionCount] tilelD ][ patchldx ] )1616-614WO01Qualcomm Ref. No. 2502081 WO 37 / 114}}}if( AspsDisplacementldPresentFlag || (AspsLodPatchesEnableFlag == 0 ) ) { vertexInfoCount = PatchSubdivisionCount[ tilelD ][ patchldx ] + 1} else {vertexInfoCount = 1}for( I = 0; I < vertexInfoCount; I++ ) {mdu_block_count_minus1[ tilelD ][ patchldx ][ I ]; u(v) mdu_last_pos_in_block[ tilelD ][ patchldx ][ I ] u(v) }smldx = SubmeshlDTolndex[ mdu_submesh_id[ tilelD ][ patchldx ] ]if( afve_projection_texcoord_present_flag[ smldx ] )texture_projection_information( tilelD, patchldx )}if( ath_type == P_TILE_ATT ||ath_type == I_TILE_ATTR ) {i = TileIDToAtlasAttributeIdxf tileID ]if( AspsAttributeSubtextureEnabled Flag [ I ] ){mdu_attributes_2d_pos_x[ tilelD ][ patchldx ] ue(v) mdu_attributes_2d_pos_y[ tilelD ][ patchldx ] ue(v) mdu_attributes_2d_size_x_minus1[ tilelD ][ patchldx ] ue(v) mdu_attributes_2d_size_y_minus1[ tilelD ][ patchldx ] ue(v) }}}mdu directional lifting present flag [ tilelD ][ patchldx ] equal to 1 indicates that the directional lifting parameters are present for a meshpatch with index patchldx, in the current atlas tile, with tile ID equal to tilelD. mdu_directional_lifting_present_flag[ tilelD ][ patchldx ] equal to 0 indicates that the directional lifting parameters are not present. When not present, mdu_directional_lifting_present_flag[ tilelD ][ patchldx ] is inferred to be equal to 0.Merge meshpatch data unit syntaxmerge_meshpatch_data_unit( tilelD, patchldx ) { Descriptor if( NumRefldxActive )mmdu_ref_index[ tilelD ][ patchldx ] ue(v) mmdu_patch_index[ tilelD ][ patchldx ] se(v) if( AspsLodPatchesEnableFlag )mmdu_lod_idx[ tilelD ][ patchldx ] ue(v)if( mmdu_lod_idx[ tilelD ][ patchldx ] == 0 ) {1616-614WO01Qualcomm Ref. No. 2502081 WO 38 / 114u(1) mmdu_subdivision_iteration_count_present_flag[ tilelD ][ patchldx ]if( mmdu_subdivision_iteration_count_present_flag[ tilelD ][ patchldx ] ) {mmdu_subdivision_iteration_count[ tilelD ][ patchldx ] u(3) MergePatchSubdivisionCount[ tilelD ][ patchldx ] = mmdu_subdivision_iteration_count[ tilelD ][ patchldx ]} else {MergePatchSubdivisionCount[ tilelD ][ patchldx ] = AfpsSubdivisionCount}if( AspsinvQuantOffsetPresentFlag ) {u(1) mmdu_inverse_quantization_offset_enable_flag[ tilelD ][ patchldx ]if( imdu_inverse_quantization_offset_enable_flag ) {for( I = 0; I < MergePatchSubdivisionCount[ tilelD ][ patchldx ]; I++ ) {for( j = 0; j < AspsDispComponents; j++ ) {for( k = 0; k < 3; k++) { mmdu_inverse_quantization_offset_sign[ tileID ][ patchIdx ][ i ][ j ][ k ] u(1) mmdu_inverse_quantization_offset_value_log2_prec1_delta[ tileID ][ patchIdx ][ i ][ j ][ k ] se(v)mmdu_inverse_quantization_offset_value_log2_prec2_delta[ tileID ][ patchIdx ][ i ][ j ][ k ] se(v)}}}}}if( AspsLiftingOffsetPresentFlag ){mmdu_lifting_offset_present_flag[ tilelD ][ patchldx ] u(1) if( mmdu_lifting_offset_present_flag[ tilelD ][ patchldx ] ) {for( I = 0; I < MergePatchSubdivisionCount[ tilelD ][ patchldx ]; I++ ) {se(v) mmdu_lifting_offset_delta_values_num[ tileID ][ patchIdx ][ i ]se(v) mmdu_lifting_offset_delta_values_deno[ tileID ][ patchIdx ][ i ]}}}if( AspsDirectionalLiftingPresentFlag ) {<add> mmdu_directional_lifting_present_flag [ tilelD ][ patchldx] u(1) < / add><add> if( mmdu_directional_lifting_present_flag[ tilelD ][ patchldx ] ) {< / add>for( I = 0; I < 2; I++ ) {1616-614WO01Qualcomm Ref. No. 2502081 WO 39 / 114se(v) mmdu_directional_lifting_scale_num[ tilelD ][ patchldx ][ I ]}<add> }< / add>}if( asve_projection_texcoord_enable_flag ){ mmdu_texture_projection_present_flag[ tilelD ][ patchldx ] u(1) if( mmdu_texture_projection_present_flag[ tilelD ][ patchldx ] ) texture_projection_merge_information( tilelD, patchldx )}}}}m mdu directional lifting present flag [ tilelD ] [ patchldx ] equal to 1 indicates that the directional lifting parameters are present for a meshpatch with index patchldx, in the current atlas tile, with tile ID equal to tilelD. mmdu_directional_lifting_pre sent flag [tilelD ][ patchldx ] equal to 0 indicates that the directional lifting parameters are not present. When not present, mmdu_directional_lifting_present_flag[ tilelD ] [ patchldx ] is inferred to be equal to 0.Inter meshpatch data unit syntaxinter_meshpatch_data_unit( tilelD, patchldx ) { Descriptor if( NumRefldxActive )imdu_ref_index[ tilelD ][ patchldx ] ue(v) imdu_patch_index[ tilelD ][ patchldx ] se(v) if( !AspsDisplacementIdPresentFlag ) {if( AspsLodPatchesEnableFlag )imdu_lod_idx[ tilelD ][ patchldx ] ue(v) imdu_2d_delta_pos_x[ tilelD ][ patchldx ] se(v) imdu_2d_delta_pos_y[ tilelD ][ patchldx ] se(v) imdu_2d_delta_size_x[ tilelD ][ patchldx ] se(v) imdu_2d_delta_size_y[ tilelD ][ patchldx ] se(v) }if( imdu_lod_idx[ tilelD ][ patchldx ] == 0 ) { imdu_subdivision_iteration_count_present_flag[ tilelD ][ patchldx ] u(1) if( imdu_subdivision_iteration_count_present_flag[ tilelD ][ patchldx ] ){ imdu_subdivision_iteration_count[ tilelD ][ patchldx ] U(3) I nterPatchSubdivisionCount[ tilelD ][ patchldx ] =imdu_subdivision_iteration_count[ tileID ][ patchIdx ]}else1616-614WO01Qualcomm Ref. No. 2502081 WO 40 / 114InterPatchSubdivisionCount[ tilelD ][ patchldx ] = AfpsSubdivisionCountif( AspsInvQuantOffsetPresentFlag ) {u(1) imdu_inverse_quantization_offset_enable_flag[ tilelD ][ patchldx ]if( imdu_inverse_quantization_offset_enable_flag ) {for( i = 0; i < MergePatchSubdivisionCount[ tilelD ][ patchldx ]; I++ ) {for( j = 0; j < AspsDispComponents; j++ ) {for( k = 0; k < 3; k++) { imdu_inverse_quantization_offset_sign[ tileID ][ patchIdx ][ i ][ j ][ k ] u(1) imdu_inverse_quantization_offset_value_log2_prec1_delta[ tileID ][ patchIdx ][ i ][ j ][ k ] se(v)imdu_inverse_quantization_offset_value_log2_prec2_delta[ tileID ][ patchIdx ][ i ][ j ][ k ] se(v)}}}}}if( I nterPatchSubdivisionCount[ tilelD ][ patchldx ]!= 0 )u(1) imdu_transform_parameters_present_flag[ tilelD ][ patchldx ] imdu_transform_method_present_flag[ tilelD ][ patchldx ] u(1) if( imdu_transform_method_present_flag[ tilelD ][ patchldx ] ) { imdu_transform_method[ tilelD ][ patchldx ] u(3) InterPatchTransformMethod[ tilelD ][ patchldx ] =imdu_transform_method[ tilelD ][ patchldx ]} else {InterPatchTransformMethod[ tilelD ][ patchldx ] = AfpsTransformMethod}}if( AspsDisplacementldPresentFlag || ( AspsLodPatchesEnableFlag == 0 ) ) { vertexInfoCount = InterPatchSubdivisionCount[ tileID ][ patchIdx ] + 1} else {vertexinfoCount = 1}for( I = 0; I < vertexinfoCount;!++){imdu_delta_block_count[ tileID ][ patchIdx ][ i ] se(v) imdu_delta_last_pos_in_block[ tileID ][ patchIdx ][ i ] se(v) }if ( imdu_lod_idx[ tilelD ][ patchldx ] == 0 ) {if( lnterPatchTransformMethod[ tilelD ][ patchldx ] == LI NEARJJ FTI NG &&AspsLiftingOffsetPresentFlag ){imdu_lifting_offset_present_flag[ tilelD ][ patchldx ] u(1)1616-614WO01Qualcomm Ref. No. 2502081 WO 41 / 114if( imdu_lifting_offset_present_flag [ tilelD ][ patchldx ] ) {for( I = 0; 1 < 1 nterPatchSubdivisionCount] tilelD ][ patchldx ]; I++ ) {se(v) imdu_lifting_offset_delta_values_num[ tileID ][ patchIdx ][ i ]se(v) imdu_lifting_offset_delta_values_deno[ tileID ][ patchIdx ][ i ]}}}if( lnterPatchTransformMethod[ tilelD ][ patchldx ] == LI NEARJJ FTI NG &&AspsDirectionalLiftingPresentFlag ) {<add> imdu_directional_lifting_present_flag [ tilelD ][ patchldx] u(1) < / add><add> if( imdu_directional_lifting_present_flag[ tilelD ][ patchldx ] ) {< / add>for( I = 0; I < 2; I++ ) {se(v) imdu_directional_lifting_scale_num[ tilelD ][ patchldx ][ I ]}<add> }< / add>}if( InterPatchTransformMethod] tilelD ][ patchldx ] == LI NEARJJ FTI NG &&( imdujransform_parameters_presentjlag[ tilelD ][ patchldx ] || imdu_subdivisionjteration_count_presentjlag[ tilelD ][ patchldx ] ||imdujransform_method_presentjlag[ tilelD ][ patchldx ] ) ){ vdmcjiftingjransform_parameters(2,1 nterPatchSubdivisionCount] tilelD ][ patchldx ] )}if( asve_projectionjexcoord_enable_flag ) imdu_texture_projection_present_flag[ tilelD ][ patchldx ] u(1) if( imdujexture_projection_presentjlag[ tilelD ][ patchldx ] ) texture_projectionjnterjnformation( tilelD, patchldx )}}imdu directional lifting present flag [ tilelD ][ patchldx ] equal to 1 indicates that the directional lifting parameters are present for a meshpatch with index patchldx, in the current atlas tile, with tile ID equal to tilelD. imdu_directional_lifting_present_flag[ tilelD ][ patchldx ] equal to 0 indicates that the directional lifting parameters are not present. When not1616-614WO01Qualcomm Ref. No. 2502081 WO 42 / 114present, imdu_directional_lifting_present_flag[ tileID ][ patchIdx ] is inferred to be equal to 0.
[0127] Signaling thresholds in directional lifting will now be discussed. A problem with current implementations is that the performance is sensitive to the three threshold ranges to calculate the value of ‘k’ / scale but, the ranges are currently neither optimized nor signaled. Also, there is potentially too much flexibility to enable or disable directional lifting per LOD which introduces too many update weight cases for the lifting transform. With reference to the simplification described above with respect to the division for z-score calculation, a possible solution is that currently the three scales based on the range of z-score may be hard coded as scalel=0.95, scale2=0.975 and scale3=0.995 as shown in FIG. 12.
[0128] FIG. 12 is a conceptual diagram illustrating a normal distribution 1200 of signal values, such as wavelet coefficients, relative to a mean value p and standard deviation intervals c. FIG. 12 visualizes how the directional lifting algorithm selects specific scale factors — shown as scale 1 (0.95), scale 2 (0.975), and scale 3 (0.995) — based on the statistical deviation of a target vertex's value. Specifically, V-DMC encoder 200 and V-DMC decoder 300 may be configured to utilize these thresholds to categorize the “Z-score” or absolute deviation of a signal. If the deviation falls within one standard deviation (Is), then V-DMC encoder 200 and V-DMC decoder 300 may be configured to apply the first scale, whereas deviations falling within two standard deviations (2c) or three standard deviations (3c) trigger the second or third scales, respectively. This selection process enables the directional lifting transform to adaptively weight the prediction and update steps based on the statistical likelihood of the signal value, thereby improving coding efficiency.
[0129] As the performance of the tool is sensitive to the scales, it may be useful to signal the scales, and an efficient way to signal the scales may be to determine a relation between the scales. The value for scalel can be signaled as a one minus value. Then, scale2 can be deduced from scale 1, and scale3 can be deduced from scale2, so on and so forth or set to 1 shown in the steps as follows:Ascalescalel = 1 - - —; for z — score < laAscalescale2 = scalel -I - - —;for z — score < 2ascale3 = scale2 +&scale■ for z— score < 3a or otherwise1616-614WO01Qualcomm Ref. No. 2502081 WO 43 / 114Or,Asccilescaled = scale2 4 - - —; for z — score < 3a or otherwise
[0130] Now, reduced signaling for Δscale may be signaled instead of three scale values. The value of scale can be signaled as base + 10−exp. This scale value can be signaled as part of the lifting transform parameters and can be optimized. The number of update cases can be reduced by removing the flexibility to enable or disable the directional lifting transform as follows:Lifting transform parameters syntaxvdmc_lifting_transform_parameters( Itplndex, subdivisioncount ){ Descriptor vltp_skip_update_flag[ ltpIndex ] u(1) for( I = 0; I < subdivisioncount; i++ ) {if( vltp_skip_update_flag[ Itplndex ] ) {UpdateWeight] Itplndex ][ I ] = 0} else {if( i == 0 ) {vltp_adaptive_update_weight_flag[ Itplndex ] u(1) vltp_valence_update_flag[ Itplndex ] u(1) }if( vltp_adaptive_update_weight_flag[ Itplndex ] == 1 || I == 0) { vltp_lifting_update_weight_numerator[ Itplndex ][ I ] ue(v) vltp_lifting_update_weight_denominator_minus1[ Itplndex ][ I ] ue(v) UpdateWeight] Itplndex ][ I ] =( vltpjifti ng_update_weight_numerator[ Itplndex ][ I ] ) +( vltpjifti ng_update_weight_denomi nator_minus1 [ Itplndex ][ I ] + 1 )} else {UpdateWeight] Itplndex ][ I ] = UpdateWeight] Itplndex ]
[0000] }}}vltp_adaptive_prediction_weight_flag[ Itplndex ] u(1) if( vltp_adaptive_prediction_weight_flag[ Itplndex ] ) {for( i=0; I < subdivisioncount; I++ ) {vltpjifting_prediction_weight_numerator[ Itplndex ][ I ] ue(v) vltp_lifting_prediction_weig ht_ denominator_minus1[ Itplndex ][ I ] ue(v) }}for( i=0; I < subdivisioncount; I++ ) {Predictionweight] Itplndex ][ I ] =( vltp_lifting_prediction_weight_numerator[ ltpIndex ][ i ] ) ÷ ( vltp_lifting_prediction_weight_denominator_minus1[ ltpIndex ][ i ] + 1 ) }if (asve_directional_lifting_present_flag) {ue(v)1616-614WO01Qualcomm Ref. No. 2502081 WO 44 / 114<add>vltp_directional_lifting_scale_exp[ Itplndex] < / add> ue(v) <del>for( I = 0; I < subdivisioncount; I++) {< / del><del> vltp_directional_lifting_lod_flag[ Itplndex ][ I ] < / del> u(1) <del> }< / del>}}vltp_directional_lifting_scale_base[ Itplndex ] indicates the value of base of the scale used in directional lifting to adapt prediction and update weights in the lifting transform. Itplndex is the index of the lifting transform parameter set.vltp_directional_lifting_scale_exp[ Itplndex ] indicates the value of exponent in power of 10 used to represent scale value used in directional lifting to adapt prediction and update weights in the lifting transform. Itplndex is the index of the lifting transform parameter set.
[0131] With this scale deduction process, the inverse directional lifting algorithm with all the simplification may be implemented as follows:template<class Tl, class T2>voidapplyDirectionalWeights(std::vector< Tl>& signal,int32_t v, int32_t vl, int32_t v2,const std::vector<double> dirScale,const T2 predWeight,const T2 updateWeight 1,const T2 updateWeight2,double scale,const bool isPredStep,const bool islnverse) {auto d1 = updateWeight1 * signal[v];auto d2 = updateWeight2 * signal[v];auto ps1 = predWeight * signal[v1];auto ps2 = predWeight * signal[v2];<add>double scale 1 = 1- scale;double scale2 = scale 1 + scale / 2;double scale3 = scale2 + scale / 3;1616-614WO01Qualcomm Ref. No. 2502081 WO 45 / 114< / add>auto mean_global = dirScale[0];auto std_global = dirScale[1];if (islnverse) {auto signal_v_rec = isPredStep ? signal[v] : (signal[v] + predWeight * (signal[v1] + signal[v2]));int8_t coherence = (signal [vl][0] > signal [v2][0])? 0: 1;double z_score = std::abs(signal_v_rec[0] - mean_global);auto weight = (z_score < std_global)? scalel: (z_score < (2*std_global))? scale2: scale3;auto weight_normalized = pow(( weight), (isPredStep == false? 2: 1)) - 1.;if (coherence <= 1) {if (isPredStep) {auto ps = coherence ? ps1 : ps2;signal[v] += weight_normalized * ps;}else {auto ps = coherence ? v1 : v2;auto d = ps == v1 ? d1 : d2;signal[ps] -= weight_normalized * d;}}Ortemplate<class Tl, class T2>voidapplyDirectionalWeights(std::vector< Tl>& signal,int32_t v, int32_t vl, int32_t v2,const std::vector<double> dirScale,const T2 predWeight,const T2 updateWeight 1,const T2 updateWeight2,1616-614WO01Qualcomm Ref. No. 2502081 WO 46 / 114double scale,const bool isPredStep,const bool islnverse) {auto d1 = updateWeight1 * signal[v];auto d2 = updateWeight2 * signal[v];auto ps1 = predWeight * signal[v1];auto ps2 = predWeight * signal[v2];<add>double scale 1 = 1- scale;double scale2 = scale 1 + scale / 2;double scale3 = 1;< / add>auto mean_global = dirScale[0];auto std_global = dirScale[1];if (islnverse) {auto signal_v_rec = isPredStep ? signal[v] : (signal[v] + predWeight * (signal[v1] + signal[v2]));int8_t coherence = (signal [vl][0] > signal [v2][0])? 0: 1;double z_score = std::abs(signal_v_rec[0] - mean_global);auto weight = (z_score < std_global)? scalel: (z_score < (2*std_global))? scale2: scale3;auto weight_normalized = pow(( weight), (isPredStep == false? 2: 1)) - 1.;if (coherence <= 1) {if (isPredStep) {auto ps = coherence ? ps1 : ps2;signal[v] += weight_normalized * ps;}else {auto ps = coherence ? v1 : v2;auto d = ps == v1 ? d1 : d2;signal[ps] -= weight_normalized * d;1616-614WO01Qualcomm Ref. No. 2502081 WO 47 / 114}}Ortemplate<class Tl, class T2>voidapplyDirectionalWeights(std::vector< Tl>& signal,int32_t v, int32_t vl, int32_t v2,const std::vector<double> dirScale,const T2 predWeight,const T2 updateWeightl,const T2 updateWeight2,double scale,const bool isPredStep,const bool islnverse) {auto d1 = updateWeight1 * signal[v];auto d2 = updateWeight2 * signal[v];auto ps1 = predWeight * signal[v1];auto ps2 = predWeight * signal[v2];<add>double scale 1 = 1- scale;double scale2 = scale 1 + scale / 2;double scale3 = scale2 + scale / 2;< / add>auto mean_global = dirScale[0];auto std_global = dirScale[1];if (islnverse) {auto signal_v_rec = isPredStep ? signal[v] : (signal[v] + predWeight * (signal[v1] + signal[v2]));int8_t coherence = (signal [vl][0] > signal[v2][0])? 0: 1;double z_score = std::abs(signal_v_rec[0] - mean_global);auto weight = (z score < std global)? scalel: (z score < (2*std_global))? scale2: scale3;1616-614WO01Qualcomm Ref. No. 2502081 WO 48 / 114auto weight_normalized = pow((weight), (isPredStep == false? 2: 1)) - 1.;if (coherence <= 1) {if (isPredStep) {auto ps = coherence ? ps1 : ps2;signal[v] += weight_normalized * ps;}else {auto ps = coherence ? v1 : v2;auto d = ps == v1 ? d1 : d2;signal[ps] -= weight_normalized * d;}}
[0132] Another way to signal the three threshold cut-offs is to signal them independently with the same precision that can be signaled as follows: vdmc_lifting_transform_parameters( Itplndex, subdivisioncount ){ Descriptor vltp_skip_update_flag[ ltpIndex ] u(1) for( I = 0; I < subdivisioncount; i++ ) {if( vltp_skip_update_flag[ Itplndex ] ) {UpdateWeight[ Itplndex ][ I ] = 0} else {if( i == 0 ) {vltp_adaptive_update_weight_flag[ Itplndex ] u(1) vltp_valence_update_flag[ Itplndex ] u(1) }if( vltp_adaptive_update_weight_flag[ Itplndex ] == 1 || I == 0) { vltp_lifting_update_weight_numerator[ Itplndex ][ I ] ue(v) vltp_lifting_update_weight_denominator_minus1[ Itplndex ][ I ] ue(v) UpdateWeight[ Itplndex ][ I ] =( vltpjifti ng_update_weight_numerator[ Itplndex ][ I ] ) +( vltpjifti ng_update_weight_denominator_minus1 [ Itplndex ][ I ] + 1 )} else {UpdateWeight[ Itplndex ][ I ] = UpdateWeight[ Itplndex ]
[0000] 1616-614WO01Qualcomm Ref. No. 2502081 WO 49 / 114}}}vltp_adaptive_prediction_weight_flag[ Itplndex ] u(1) if( vltp_adaptive_prediction_weight_flag[ Itplndex ] ) {for( 1=0; I < subdivisioncount; I++ ) {vltp_lifting_prediction_weight_numerator[ Itplndex ][ I ] ue(v) vltp_lifting_prediction_weight_denominator_minus1[ Itplndex ][ I ] ue(v) }}for( i=0; I < subdivisioncount; I++ ) {PredictionWeight[ Itplndex ][ I ] =( vltp_lifting_prediction_weight_numerator[ Itplndex ][ I ] ) +( vltp_lifting_prediction_weight_denominator_minus1[ ltpIndex ][ i ] + 1 ) }if (asve_directional_lifting_present_flag) {vltp_directional_lifting_scale1[ Itplndex ] ue(v) vltp_directional_lifting_scale2[ ltpIndex ] ue(v)vltp_directional_lifting_scale3[ ltpIndex ] ue(v) vltp_directional_lifting_scale_deno_minus1[ Itplndex ] ue(v) }}vltp_directional_lifting_scalel[ Itplndex ] indicates the value of first threshold to choose a scale used in directional lifting to adapt prediction and update weights in the lifting transform. Itplndex is the index of the lifting transform parameter set. vltp_directional_lifting_scale2[ Itplndex ] indicates the value of second threshold to choose a scale used in directional lifting to adapt prediction and update weights in the lifting transform. Itplndex is the index of the lifting transform parameter set.vltp_directional_lifting_scale3[ Itplndex ] indicates the value of third threshold to choose a scale used in directional lifting to adapt prediction and update weights in the lifting transform. Itplndex is the index of the lifting transform parameter set.1616-614WO01Qualcomm Ref. No. 2502081 WO 50 / 114vltp directional lifting scale deno minusl [ Itplndex ] indicates the precision used to signal all the thresholds used in directional lifting to adapt prediction and update weights in the lifting transform. Itplndex is the index of the lifting transform parameter set.
[0133] Another way to signal three scales that offers the flexibility of the above solution but with a minimal metadata increase is as follows:vdmc_lifting_transform_parameters( Itplndex, subdivisioncount ){ Descriptor vltp_skip_update_flag[ Itplndex ] u(1) for( I = 0; I < subdivisioncount;!++) {if( vltp_skip_update_flag[ Itplndex ] ) {UpdateWeight[ Itplndex ][ I ] = 0} else {if( i == 0 ) {vltp_adaptive_update_weight_flag[ Itplndex ] u(1) vltp_valence_update_flag[ Itplndex ] u(1) }if( vltp_adaptive_update_weight_flag[ Itplndex ] == 1 || I == 0) { vltp_lifting_update_weight_numerator[ Itplndex ][ I ] ue(v) ue(v) vltp_lifting_update_weight_denominator_minus1[ Itplndex ][ I ]UpdateWeight[ Itplndex ][ I ] =( vltpjifti ng_update_weight_numerator[ Itplndex ][ I ] ) +( vltpjifti ng_update_weight_denomi nator_minus1 [ Itplndex ][ I ] + 1 )} else {UpdateWeight[ Itplndex ][ I ] = UpdateWeight[ Itplndex ]
[0000] }}}vltp_adaptive_prediction_weight_flag[ Itplndex ] u(1) if( vltp_adaptive_prediction_weight_flag[ Itplndex ] ) {for( i=0; I < subdivisioncount; I++ ) { vltpjifting_prediction_weight_numerator[ Itplndex ][ I ] ue(v) ue(v) vltpjifting_prediction_weight_denominator_minus1[ Itplndex ][ I ]}}for( i=0; I < subdivisioncount; I++ ) {PredictionWeight[ Itplndex ][ I ] =( vltp_lifting_prediction_weight_numerator[ ltpIndex ][ i ] ) ÷ ( vltp_lifting_prediction_weight_denominator_minus1[ ltpIndex ][ i ] + 1 ) }<add>if (asve_directional_lifting_present_flag) {vltp_directional_lifting_scale1 [ Itplndex ] ue(v)vltp_directional_lifting_delta_scale2[ Itplndex ] ue(v) 1616-614WO01Qualcomm Ref. No. 2502081 WO 51 / 114vltp_directional_lifting_delta_scale3[ Itplndex ] ue(v) vltp_directional_lifting_scale_deno_minus1[ Itplndex ] ue(v) < / add>}vltp_directional_lifting_scalel[ Itplndex ] indicates the value of first threshold to choose as the first scale value used in directional lifting to adapt prediction and update weights in the lifting transform. Itplndex is the index of the lifting transform parameter set.vltp_directional_lifting_delta_scale2[ Itplndex ] indicates the difference between first and second threshold to compute the second scale used in directional lifting to adapt prediction and update weights in the lifting transform. Itplndex is the index of the lifting transform parameter set.vltp_directional_lifting_delta_scale3[ Itplndex ] indicates the difference between second and third threshold to compute the third scale used in directional lifting to adapt prediction and update weights in the lifting transform. Itplndex is the index of the lifting transform parameter set.vltp directional lifting scale deno minusl [ Itplndex ] plus 1 indicates the precision used to signal all the thresholds used in directional lifting to adapt prediction and update weights in the lifting transform. Itplndex is the index of the lifting transform parameter set.
[0134] And the three scales can be computed as follows:Scale 1 = vltp_directional_lifting_scalel[ Itplndex ] / (vltp_directional_lifting_scale_deno_minusl[ Itplndex ]+l)Scale2 = Scale 1+(vltp_directional_lifting_delta_scale2[ Itplndex ] / (vltp_directional_lifting_scale_deno_minusl[ Itplndex ]+l))Scale3 = Scale2+(vltp_directional_lifting_delta_scale3[ Itplndex ] / (vltp_directional_lifting_scale_deno_minusl[ Itplndex ]+l))
[0135] The above equations illustrate how V-DMC decoder 300 may reconstruct the three scale values used in the directional lifting transform. The first scale (Scalel) is calculated by dividing a signaled numerator by a common denominator. The second and third scales (Scale2 and Scale3) are then calculated using a delta-coding approach to improve signaling efficiency. Specifically, Scale2 is derived by adding a first delta value to Scalel, and Scale3 is derived by adding a second delta value to Scale2. All three calculations utilize the same denominator (derived from the syntax element1616-614WO01Qualcomm Ref. No. 2502081 WO 52 / 114vltp directional lifting scale deno minusl plus 1) to establish the precision of the values.
[0136] Removing for loop and sending two directional lifting parameters will now be discussed. A problem with current implementations is that directional lifting scale parameters are two but sent as one parameter with index of 2 in meshpatch, inter meshpatch and merge meshpatch. A potential solution is to remove for loop and send two independent parameter for mean and standard deviation values.Meshoatch data unit syntaxmeshpatch_data_unit( tilelD, patchldx ) { Descriptor mdu_submesh_id[ tilelD ][ patchldx ] ue(v) if( athjype == P_TILE || athjype == l_TILE ) {if( AspsDisplacementldPresentFlag ) {mdu_displ_id[ tilelD ][ patchldx ] ue(v) } else {if( AspsLodPatchesEnableFlag )mdu_lod_idx[ tilelD ][ patchldx ] ue(v) mdu_2d_pos_x[ tilelD ][ patchldx ] ue(v) mdu_2d_pos_y[ tilelD ][ patchldx ] ue(v) mdu_2d_size_x_minus1[ tilelD ][ patchldx ] ue(v) mdu_2d_size_y_minus1[ tilelD ][ patchldx ] ue(v) }if( mdu_lod_idx[ tilelD ][ patchldx ] == 0 ) {PatchSubdivisionCount[ tilelD ][ patchldx ] = AfpsSubdivisionCount mdu_parameters_override_flag[ tilelD ][ patchldx ] u(1) if( mdu_parameters_override_flag[ tilelD ][ patchldx ] ){u(1) mdu_subdivision_iteration_count_present_flag[ tilelD ][ patchldx ]if( mdu_subdivision_iteration_count_present_flag[ tilelD ][ patchldx ] ) {mdu_subdivision_iteration_count u(3) PatchSubdivisionCount[ tilelD ][ patchldx ] = mdu_subdivision_iteration_count}if( PatchSubdivisionCount[ tilelD ][ patchldx ]!= 0 ) mdu_transform_method_present_flag[ tilelD ][ patchldx ] u(1) if( I mdu_subdivision_iteration_count_present_flag[ tilelD ][ patchldx ] ) {if( PatchSubdivisionCount[ tilelD ][ patchldx ]!= 0 )u(1) mdu_subdivision_method_present_flag[ tilelD ][ patchldx ]if( asve_quantization_parameters_present_flag )mdu_quantization_present_flag[ tilelD ][ patchldx ] u(1)1616-614WO01Qualcomm Ref. No. 2502081 WO 53 / 114if ( (!mdu_transform_method_present_flag[ tilelD ][ patchldx ] ) &&PatchSubdivisionCount[ tilelD ][ patchldx ]!= 0 )u(1) mdu_transform_parameters_present_flag[ tilelD ][ patchldx ]}}if( mdu_subdivision_method_present_flag[ tilelD ][ patchldx ] ){if( PatchSubdivisionCount[ tilelD ][ patchldx ] > 1) { mdu_lod_adaptive_subdivision_flag[ tilelD ][ patchldx ] u(1) }for( i = 0; i < PatchSubdivisionCount[ tilelD ][ patchldx ]; I++) {if( mdu_lod_adaptive_subdivision_flag == 1 || I == 0 ) { mdu_subdivision_method[ tilelD ][ patchldx ][ i ] u(3) } else {mdu_subdivision_method[ tilelD ][ patchldx ][ I ] = mdu_subdivision_method[ tilelD ][ patchldx ]
[0000] }PatchSubdivisionMethod[ tilelD ][ patchldx ][ I ] = mdu_subdivision_method[ i ]}if( asve_edge_based_subdivision_flag == 1 ) { mdu_subdivision_min_edge_length[ tilelD ][ patchldx ] u(16) PatchSubdivisionMinEdgeLength[ tilelD ][ patchldx ] = mdu_subdivision_min_edge_length[ tilelD ][ patchldx ]} else {PatchSubdivisionMinEdgeLength[ tilelD ][ patchldx ] = 0}} else {for( i = 0; i < PatchSubdivisionCount[ tilelD ][ patchldx ]; I++ ){ PatchSubdivisionMethod[ tilelD ][ patchldx ][ I ] = AfpsSubdivisionMethod[ i ]}PatchSubdivisionMinEdgeLength[ tilelD ][ patchldx ] = AfpsSubdivisionMinEdgeLength}if( mdu_quantization_present_flag[ tilelD ][ patchldx ] ) vdmc_quantization_parameters( 2,PatchSubdivisionCount[ tilelD ][ patchldx ],AfpsSubdivisionCount )if( AspsInvQuantOffsetPresentFlag ) {u(1) mdu_inverse_quantization_offset_enable_flag[ tilelD ][ patchldx ]if( mdu_inverse_quantization_offset_enable_flag ) {for( i = 0; i < PatchSubdivisionCount[ tilelD ][ patchldx ]; I++ ) {for( j = 0; j < AspsDispComponents; j++ ) {for( k = 0; k < 3; k++) {1616-614WO01Qualcomm Ref. No. 2502081 WO 54 / 114u(1) mdu_inverse_quantization_offset_sign[ tilelD ][ patchldx ][ i ][j ][ k ] mdu_inverse_quantization_offset_value_log2_prec1_delta[ tilelD ][ patchldx ][ i ][ j ][ se(v) k ]mdu_inverse_quantization_offset_value_log2_prec2_delta[ tilelD ][ patchldx ][ I ][ j ][ se(v) k ]}}}}}mdu_displacement_coordinate_system[ tilelD ][ patchldx ] u(1) if( mdu_transform_method_present_flag[ tilelD ][ patchldx ] && PatchSubdivisionCount[ tilelD ][ patchldx ]!= 0 ) mdu_transform_method[ tilelD ][ patchldx ] u(3) if( mdu_transform_method[ tilelD ][ patchldx ]== LINEAR_LIFTING ) { if( AspsLiftingOffsetPresentFlag ) {mdu_lifting_offset_present_flag [ tilelD ][ patchldx ] u(1) if( mdu_lifting_offset_present_flag[ tilelD ][ patchldx ] ) {for( I = 0; I < PatchSubdivisionCount[ tilelD ][ patchldx ]; I++ ) {se(v) mdu_lifting_offset_values_num[ tilelD ][ patchldx ][ I ]ue(v) mdu_lifting_offset_values_deno_minus1[ tilelD ][ patchldx ][ I ]}}}if( AspsDirectionalLiftingPresentFlag ) {<del>for( I = 0; I < 2; I++ ) {< / del> <add>mdu_directional_lifting_mean_num[ tilelD ][ patchldx ] se(v) < / add><del> ue(v) mdu_directional_lifting_scale_num[ tilelD ][ patchldx ][ I ]< / del><add>mdu_directional_lifting_std_num[ tilelD ][ patchldx ]<add><del>}< / del>}if ( mdu_transform_parameters_present_flag[ tilelD ][ patchldx ] ) { vdmc_lifting_transform_parameters(2,PatchSubdivisionCount[ tilelD ][ patchldx ] )}}}if( AspsDisplacementldPresentFlag || (AspsLodPatchesEnableFlag == 0 ) ) {vertexinfoCount = PatchSubdivisionCount[ tilelD ][ patchldx ] + 11616-614WO01Qualcomm Ref. No. 2502081 WO 55 / 114} else {vertexInfoCount = 1}for( i = 0; i < vertexInfoCount; I++ ) {mdu_block_count_minus1[ tilelD ][ patchldx ][ I ]; u(v) mdu_last_pos_in_block[ tilelD ][ patchldx ][ I ] u(v) }smldx = SubmeshlDTolndexf mdu_submesh_id[ tilelD ][ patchldx ] ]if( afve_projection_texcoord_present_flag[ smldx ] )texture_projection_information( tilelD, patchldx )}if( ath_type == P_TILE_ATT ||ath_type == I_TILE_ATTR ) {i = TileIDToAtlasAttributeIdxf tileID ]if( AspsAttributeSubtextureEnabled Flag [ I ] ){mdu_attributes_2d_pos_x[ tilelD ][ patchldx ] ue(v) mdu_attributes_2d_pos_y[ tilelD ][ patchldx ] ue(v) mdu_attributes_2d_size_x_minus1[ tilelD ][ patchldx ] ue(v) mdu_attributes_2d_size_y_minus1[ tilelD ][ patchldx ] ue(v) }}}mdu_directional_lifting_mean_num[ tilelD ][ patchldx ] indicates the numerator of the mean used to calculate z-score in the directional lifting, signalled for submesh with submesh ID mdu submesh idf tilelD ][ patchldx ].mdu_directional_lifting_std_num[ tilelD ][ patchldx ] indicates the numerator of the standard deviation used to calculate z-score in the directional lifting, signalled for submesh with submesh ID mdu submesh idf tilelD ][ patchldx ].Merge meshpatch data unit syntaxmerge_meshpatch_data_unit( tilelD, patchldx ) { Descriptor if( NumRefldxActive )mmdu_ref_index[ tilelD ][ patchldx ] ue(v) mmdu_patch_index[ tilelD ][ patchldx ] se(v) if( AspsLodPatchesEnableFlag )mmdu_lod_idx[ tilelD ][ patchldx ] ue(v) if( mmdu_lod_idx[ tilelD ][ patchldx ] == 0 ) { mmdu_subdivision_iteration_count_present_flag[ tilelD ][ patchldx ] u(1) if( mmdu_subdivision_iteration_count_present_flag[ tilelD ][ patchldx ] ) {mmdu_subdivision_iteration_count[ tilelD ][ patchldx ] u(3) 1616-614WO01Qualcomm Ref. No. 2502081 WO 56 / 114MergePatchSubdivisionCount[ tilelD ][ patchldx ] = mmdu_subdivision_iteration_count[ tilelD ][ patchldx ]} else {MergePatchSubdivisionCount[ tilelD ][ patchldx ] = AfpsSubdivisionCount}if( AspsInvQuantOffsetPresentFlag ) { mmdu_inverse_quantization_offset_enable_flag[ tilelD ][ patchldx ] u(1) if( imdu_inverse_quantization_offset_enable_flag ) {for( I = 0; I < MergePatchSubdivisionCount[ tilelD ][ patchldx ]; I++ ) {for( j = 0; j < AspsDispComponents; j++ ) {for( k = 0; k < 3; k++) { mmdu_inverse_quantization_offset_sign[ tileID ][ patchIdx ][ i ][ j ][ k ] u(1) mmdu_inverse_quantization_offset_value_log2_prec1_delta[ tileID ][ patchIdx ][ i ][ j ][ k ] se(v)mmdu_inverse_quantization_offset_value_log2_prec2_delta[ tileID ][ patchIdx ][ i ][ j ][ k ] se(v)}}}}}if( AspsLiftingOffsetPresentFlag ){mmdu_lifting_offset_present_flag[ tilelD ][ patchldx ] u(1) if( mmdu_lifting_offset_present_flag[ tilelD ][ patchldx ] ) {for( I = 0; I < MergePatchSubdivisionCount[ tilelD ][ patchldx ]; I++ ) {se(v) mmdu_lifting_offset_delta_values_num[ tileID ][ patchIdx ][ i ]se(v) mmdu_lifting_offset_delta_values_deno[ tileID ][ patchIdx ][ i ]}}}if( AspsDirectionalLiftingPresentFlag ) {<del> for( I = 0; I < 2; I++ ) {< / del><add> se(v) mmdu_directional_lifting_mean_num[ tilelD ][ patchldx ]< / add><del> ue(v) mmdu_directional_lifting_scale_num[ tilelD ][ patchldx ][ I ] < / del><add>mmdu_directional_lifting_std_num[ tilelD ][ patchldx ]< / add><del> }< / del>1616-614WO01Qualcomm Ref. No. 2502081 WO 57 / 114}if( asve_projection_texcoord_enable_flag ){ mmdu_texture_projection_present_flag[ tilelD ][ patchldx ] u(1) if( mmdu_texture_projection_present_flag[ tilelD ][ patchldx ] ) texture_projection_merge_information( tilelD, patchldx )}}}}mmdu_directional_lifting_mean_num[ tilelD ][ patchldx ] indicates the numerator of the mean used to calculate z-score in the directional lifting, signalled for submesh with submesh ID mdu submesh idf tilelD ][ patchldx ].mmdu_directional_lifting_std_num[ tilelD ][ patchldx ] indicates the numerator of the standard deviation used to calculate z-score in the directional lifting, signalled for submesh with submesh ID mdu submesh idf tilelD ][ patchldx ].Inter meshpatch data unit syntaxinter_meshpatch_data_unit( tilelD, patchldx ) { Descriptor if( NumRefldxActive )imdu_ref_index[ tilelD ][ patchldx ] ue(v) imdu_patch_index[ tilelD ][ patchldx ] se(v) if( !AspsDisplacementIdPresentFlag ) {if( AspsLodPatchesEnableFlag )imdu_lod_idx[ tilelD ][ patchldx ] ue(v) imdu_2d_delta_pos_x[ tilelD ][ patchldx ] se(v) imdu_2d_delta_pos_y[ tilelD ][ patchldx ] se(v) imdu_2d_delta_size_x[ tilelD ][ patchldx ] se(v) imdu_2d_delta_size_y[ tilelD ][ patchldx ] se(v) }if( imdu_lod_idx[ tilelD ][ patchldx ] == 0 ) { imdu_subdivision_iteration_count_present_flag[ tilelD ][ patchldx ] u(1) if( imdu_subdivision_iteration_count_present_flag[ tilelD ][ patchldx ] ){ imdu_subdivision_iteration_count[ tilelD ][ patchldx ] U(3) I nterPatchSubdivisionCountf tilelD ][ patchldx ] =imdu_subdivision_iteration_count[ tileID ][ patchIdx ]}elseI nterPatchSubdivisionCountf tilelD ][ patchldx ] = AfpsSubdivisionCount1616-614WO01Qualcomm Ref. No. 2502081 WO 58 / 114if( AspsInvQuantOffsetPresentFlag ) { imdu_inverse_quantization_offset_enable_flag[ tilelD ][ patchldx ] u(1) if( imdu_inverse_quantization_offset_enable_flag ) {for( i = 0; i < MergePatchSubdivisionCount[ tilelD ][ patchldx ]; i++ ) {for( j = 0; j < AspsDispComponents; j++ ) {for( k = 0; k < 3; k++) { imdu_inverse_quantization_offset_sign[ tileID ][ patchIdx ][ i ][ j ][ k ] u(1) imdu_inverse_quantization_offset_value_log2_prec1_delta[ tileID ][ patchIdx ][ i ][ j ][ k ] se(v)imdu_inverse_quantization_offset_value_log2_prec2_delta[ tileID ][ patchIdx ][ i ][ j ][ k ] se(v)}}}}}if( InterPatchSubdivisionCount[ tilelD ][ patchldx ]!= 0 ) imdu_transform_parameters_present_flag[ tilelD ][ patchldx ] u(1) imdu_transform_method_present_flag[ tilelD ][ patchldx ] u(1) if( imdu_transform_method_present_flag[ tilelD ][ patchldx ] ) { imdu_transform_method[ tilelD ][ patchldx ] u(3) lnterPatchTransformMethod[ tilelD ][ patchldx ] =imdu_transform_method[ tilelD ][ patchldx ]} else {InterPatchTransformMethod[ tilelD ][ patchldx ] = AfpsTransformMethod}}if( AspsDisplacementldPresentFlag || ( AspsLodPatchesEnableFlag == 0 ) ) { vertexInfoCount = InterPatchSubdivisionCount[ tileID ][ patchIdx ] + 1} else {vertexinfoCount = 1}for( I = 0; I < vertexinfoCount;!++){imdu_delta_block_count[ tileID ][ patchIdx ][ i ] se(v) imdu_delta_last_pos_in_block[ tileID ][ patchIdx ][ i ] se(v) }if ( imdu_lod_idx[ tilelD ][ patchldx ] == 0 ) {if( lnterPatchTransformMethod[ tilelD ][ patchldx ] == LI NEARJJ FTI NG && AspsLiftingOffsetPresentFlag ){imdu_lifting_offset_present_flag[ tilelD ][ patchldx ] u(1) if( imdu_lifting_offset_present_flag[ tilelD ][ patchldx ] ) {for( I = 0; I < I nterPatchSubdivisionCount[ tilelD ][ patchldx ]; I++ ) {se(v)imdu_lifting_offset_delta_values_num[ tilelD ][ patchldx ][ I ]1616-614WO01Qualcomm Ref. No. 2502081 WO 59 / 114se(v) imdu_lifting_offset_delta_values_deno[ tileID ][ patchIdx ][ i ]}}}if( InterPatchTransformMethodf tilelD ][ patchldx ] == LI NEARJJ FTI NG && AspsDirectionalLiftingPresentFlag ) {<del> for( I = 0; I < 2; I++ ) {< / del><add> se(v) imdu_directional_lifting_mean_num[ tilelD ][ patchldx ]< / add><del> ue(v) imdu_directional_lifting_scale_num[ tilelD ][ patchldx ][ I ]< / del><add>imdu_directional_lifting_std_num[ tilelD ][ patchldx ]< / add><del> }< / del>}if( InterPatchTransformMethodf tilelD ][ patchldx ] == LI NEARJJ FTI NG &&( imdujransform_parameters_presentjlag[ tilelD ][ patchldx ] || imdu_subdivision Jteration_count_present_flag[ tilelD ][ patchldx ] || imdujransform_method_presentjlag[ tilelD ][ patchldx ] ) ){ vdmcjiftingjransform_parameters(2,1 nterPatchSubdivisionCountf tilelD ][ patchldx ] )}if( asve_projectionjexcoord_enable_flag )imdu_texture_projection_present_flag[ tilelD ][ patchldx ] u(1) if( imdujexture_projection_presentjlag[ tilelD ][ patchldx ] ) texture_projectionjnterjnformation( tilelD, patchldx )}}imdu_directional_lifting_mean_num[ tilelD ][ patchldx ] indicates the numerator of the mean used to calculate z-score in the directional lifting, signalled for submesh with submesh ID mdu submesh idf tilelD ][ patchldx ].imdu_directional_lifting_std_num[ tilelD ][ patchldx ] indicates the numerator of the standard deviation used to calculate z-score in the directional lifting, signalled for submesh with submesh ID mdu submesh idf tilelD ][ patchldx ].
[0137] Signaling the denominator in directional lifting will now be discussed. A problem with current implementations is that the directional lifting parameters are sent1616-614WO01Qualcomm Ref. No. 2502081 WO 60 / 114as fractional values but only numerator with a precision of 2 is sent, and a decoder uses a fixed value of 100 to calculate the scale. A possible solution is to signal the denominator with optimum precision for completeness.Meshpatch data unit syntaxmeshpatch_data_unit( tilelD, patchldx ) { Descriptor mdu_submesh_id[ tilelD ][ patchldx ] ue(v) if( athjype == P_TILE || athjype == l_TILE ) {if( AspsDisplacementldPresentFlag ) {mdu_displ_id[ tilelD ][ patchldx ] ue(v) } else {if( AspsLodPatchesEnableFlag )mdu_lod_idx[ tilelD ][ patchldx ] ue(v) mdu_2d_pos_x[ tilelD ][ patchldx ] ue(v) mdu_2d_pos_y[ tilelD ][ patchldx ] ue(v) mdu_2d_size_x_minus1[ tilelD ][ patchldx ] ue(v) mdu_2d_size_y_minus1[ tilelD ][ patchldx ] ue(v) }if( mdu_lod_idx[ tilelD ][ patchldx ] == 0 ) {PatchSubdi visionCountf tilelD ][ patchldx ] = AfpsSubdivisionCount mdu_parameters_override_flag[ tilelD ][ patchldx ] u(1) if( mdu_parameters_override_flag[ tilelD ][ patchldx ] ){u(1) mdu_subdivision_iteration_count_present_flag[ tilelD ][ patchldx ]if( mdu_subdivision_iteration_count_present_flag[ tilelD ][ patchldx ] ) {mdu_subdivision_iteration_count u(3) PatchSubdi visionCountf tilelD ][ patchldx ] = mdu_subdivision_iteration_count}if( PatchSubdivisionCount[ tilelD ][ patchldx ]!= 0 ) mdu_transform_method_present_flag[ tilelD ][ patchldx ] u(1) if( I mdu_subdivision_iteration_count_present_flag[ tilelD ][ patchldx ] ) {if( PatchSubdivisionCount[ tilelD ][ patchldx ]!= 0 )u(1) mdu_subdivision_method_present_flag[ tilelD ][ patchldx ]if( asve_quantization_parameters_present_flag ) mdu_quantization_present_flag[ tilelD ][ patchldx ] u(1) if ( (!mdu_transform_method_present_flag[ tilelD ][ patchldx ] ) &&PatchSubdi visionCount[ tilelD ][ patchldx ]!= 0 )u(1) mdu_transform_parameters_present_flag[ tilelD ][ patchldx ]}}1616-614WO01Qualcomm Ref. No. 2502081 WO 61 / 114if( mdu_subdivision_method_present_flag[ tilelD ][ patchldx ] ){if( PatchSubdivisionCount[ tilelD ][ patchldx ] > 1) { mdu_lod_adaptive_subdivision_flag[ tilelD ][ patchldx ] u(1) }for( I = 0; I < PatchSubdivisionCount[ tilelD ][ patchldx ]; I++) { if( mdu_lod_adaptive_subdivision_flag == 1 || I == 0 ) { mdu_subdivision_method[ tilelD ][ patchldx ][ I ] u(3) } else {mdu_subdivision_method[ tilelD ][ patchldx ][ I ] = mdu_subdivision_method[ tilelD ][ patchldx ]
[0000] }PatchSubdivisionMethod[ tilelD ][ patchldx ][ I ] = mdu_subdivision_method[ I ]}if( asve_edge_based_subdivision_flag == 1 ) { mdu_subdivision_min_edge_length[ tilelD ][ patchldx ] u(16) PatchSubdivisionMinEdgeLength[ tilelD ][ patchldx ] = mdu_subdivision_min_edge_length[ tilelD ][ patchldx ]} else {PatchSubdivisionMinEdgeLength[ tilelD ][ patchldx ] = 0}} else {for( I = 0; I < PatchSubdivisionCount[ tilelD ][ patchldx ]; I++ ){ PatchSubdivisionMethod[ tilelD ][ patchldx ][ I ] = AfpsSubdivisionMethod[ I ]}PatchSubdivisionMinEdgeLength[ tilelD ][ patchldx ] = AfpsSubdivisionMinEdgeLength}if( mdu_quantization_present_flag[ tilelD ][ patchldx ] ) vdmc_quantization_parameters( 2,PatchSubdivisionCount[ tilelD ][ patchldx ],AfpsSubdivisionCount )if( AspsinvQuantOffsetPresentFlag ) {u(1) mdu_inverse_quantization_offset_enable_flag[ tilelD ][ patchldx ]if( mdu_inverse_quantization_offset_enable_flag ) {for( I = 0; I < PatchSubdivisionCount[ tilelD ][ patchldx ]; I++ ) {for( j = 0; j < AspsDispComponents; j++ ) {for( k = 0; k < 3; k++) {u(1) mdu_inverse_quantization_offset_sign[ tilelD ][ patchldx ][ I ][j ][ k ] mdu_inverse_quantization_offset_value_log2_prec1_delta[ tilelD ][ patchldx ][ I ][ j ][ se(v) k]mdu_inverse_quantization_offset_value_log2_prec2_delta[ tilelD ][ patchldx ][ I ][ j ][ se(v) k ]}}1616-614WO01Qualcomm Ref. No. 2502081 WO 62 / 114}}}mdu_displacement_coordinate_system[ tilelD ][ patchldx ] u(1) if( mdu_transform_method_present_flag[ tilelD ][ patchldx ] && PatchSubdivisionCount[ tilelD ][ patchldx ]!= 0 ) mdu_transform_method[ tilelD ][ patchldx ] u(3) if( mdu_transform_method[ tilelD ][ patchldx ]== LI NEARJJ FTI NG ) {if( AspsLiftingOffsetPresentFlag ) {mdu_lifting_offset_present_flag [ tilelD ][ patchldx ] u(1) if( mdu_lifting_offset_present_flag[ tilelD ][ patchldx ] ) { for( I = 0; I < PatchSubdivisionCount[ tilelD ][ patchldx ]; I++ ) {se(v) mdu_lifting_offset_values_num[ tilelD ][ patchldx ][ I ]ue(v) mdu_lifting_offset_values_deno_minus1[ tilelD ][ patchldx ][ I ]}}}if( AspsDirectionalLiftingPresentFlag ) {for( I = 0; I < 2; I++ ) {se(v) mdu_directional_lifting_scale_num[ tilelD ][ patchldx ][ I ]<add> ue(v) mdu_directional_lifting_scale_deno_minus1 [tilelD ][ patchldx ][ I ]< / add>}}if ( mdu_transform_parameters_present_flag[ tilelD ][ patchldx ] ) { vdmc_lifting_transform_parameters(2,PatchSubdivisionCount[ tilelD ][ patchldx ] )}}}if( AspsDisplacementldPresentFlag || (AspsLodPatchesEnableFlag == 0 ) ) { vertexinfoCount = PatchSubdivisionCount[ tilelD ][ patchldx ] + 1} else {vertexinfoCount = 1}for( I = 0; I < vertexinfoCount; I++ ) {mdu_block_count_minus1[ tilelD ][ patchldx ][ I ]; u(v) mdu_last_pos_in_block[ tilelD ][ patchldx ][ I ] u(v) }smldx = SubmeshlDTolndex[ mdu_submesh_id[ tilelD ][ patchldx ] ]if( afve_projection_texcoord_present_flag[ smldx ] )texture_projection_information( tilelD, patchldx )1616-614WO01Qualcomm Ref. No. 2502081 WO 63 / 114}if( ath_type == P_TILE_ATT ||ath_type == I_TILE_ATTR ) {i = TilelDToAtlasAttributeldxf tilelD ]if( AspsAttributeSubtextureEnabled Flag [ I ] ){mdu_attributes_2d_pos_x[ tilelD ][ patchldx ] ue(v) mdu_attributes_2d_pos_y[ tilelD ][ patchldx ] ue(v) mdu_attributes_2d_size_x_minus1[ tilelD ][ patchldx ] ue(v) mdu_attributes_2d_size_y_minus1[ tilelD ][ patchldx ] ue(v) }}}mdu_directional_lifting_scale_deno_minusl[ tilelD ][ patchldx ][ i ] plus 1 indicates the denominator of the directional lifting scale used to adapt prediction and update weights in the lifting transform for the scale value signalled with index i for submesh with submesh ID mdu submesh idf tilelD ][ patchldx ].Merge meshpatch data unit syntaxmerge_meshpatch_data_unit( tilelD, patchldx ) { Descriptor if( NumRefldxActive )mmdu_ref_index[ tilelD ][ patchldx ] ue(v) mmdu_patch_index[ tilelD ][ patchldx ] se(v) if( AspsLodPatchesEnableFlag )mmdu_lod_idx[ tilelD ][ patchldx ] ue(v) if( mmdu_lod_idx[ tilelD ][ patchldx ] == 0 ) { mmdu_subdivision_iteration_count_present_flag[ tilelD ][ patchldx ] u(1) if( mmdu_subdivision_iteration_count_present_flag[ tilelD ][ patchldx ] ) { mmdu_subdivision_iteration_count[ tilelD ][ patchldx ] u(3) MergePatchSubdivisionCount[ tilelD ][ patchldx ] = mmdu_subdivision_iteration_count[ tilelD ][ patchldx ]} else {MergePatchSubdivisionCount[ tilelD ][ patchldx ] = AfpsSubdivisionCount}if( AspsinvQuantOffsetPresentFlag ) { mmdu_inverse_quantization_offset_enable_flag[ tilelD ][ patchldx ] u(1) if( imdu_inverse_quantization_offset_enable_flag ) {for( I = 0; I < MergePatchSubdivisionCount[ tilelD ][ patchldx ]; I++ ) {for( j = 0; j < AspsDispComponents; j++ ) {for( k = 0; k < 3; k++) { mmdu_inverse_quantization_offset_sign[ tilelD ][ patchldx ][ I ][j ][ k ] u(1) mmdu_inverse_quantization_offset_value_log2_prec1_delta[ tilelD ][ patchldx ][ I ][ j se(v)][ k ]1616-614WO01Qualcomm Ref. No. 2502081 WO 64 / 114mmdu_inverse_quantization_offset_value_log2_prec2_delta[ tileID ][ patchIdx ][ i ][ j ][ k ] se(v)}}}}}if( AspsLiftingOffsetPresentFlag ){mmdu_lifting_offset_present_flag[ tilelD ][ patchldx ] u(1) if( mmdu_lifting_offset_present_flag [ tilelD ][ patchldx ] ) {for( I = 0; I < MergePatchSubdivisionCount[ tilelD ][ patchldx ]; I++ ) {se(v) mmdu_lifting_offset_delta_values_num[ tileID ][ patchIdx ][ i ]se(v) mmdu_lifting_offset_delta_values_deno[ tileID ][ patchIdx ][ i ]}}}if( AspsDirectionalLiftingPresentFlag ) {for( I = 0; I < 2; I++ ) {mmdu_directional_lifting_scale_num[ tilelD ][ patchldx ][ I ] se(v) <add> ue(v) mmdu_directional_lifting_scale_deno_minus1[ tilelD ][ patchldx ][ I ]< / add>}}if( asve_projection_texcoord_enable_flag ){mmdu_texture_projection_present_flag[ tilelD ][ patchldx ] u(1) if( mmdu_texture_projection_present_flag[ tilelD ][ patchldx ] ) texture_projection_merge_information( tilelD, patchldx )}}}}mmdu_directional_lifting_scale_deno_minusl[ tilelD ][ patchldx ][ i ] plus 1 indicates the denominator of the directional lifting scale used to adapt prediction and update weights in the lifting transform for the scale value signalled with index i for submesh with submesh ID mdu submesh idf tilelD ][ patchldx ].Inter meshpatch data unit syntaxinter_meshpatch_data_unit( tilelD, patchldx ) { Descriptorif( NumRefldxActive )1616-614WO01Qualcomm Ref. No. 2502081 WO 65 / 114imdu_ref_index[ tilelD ][ patchldx ] ue(v) imdu_patch_index[ tilelD ][ patchldx ] se(v) if( !AspsDisplacementIdPresentFlag ) {if( AspsLodPatchesEnableFlag )imdu_lod_idx[ tilelD ][ patchldx ] ue(v) imdu_2d_delta_pos_x[ tilelD ][ patchldx ] se(v) imdu_2d_delta_pos_y[ tilelD ][ patchldx ] se(v) imdu_2d_delta_size_x[ tilelD ][ patchldx ] se(v) imdu_2d_delta_size_y[ tilelD ][ patchldx ] se(v) }if( imdu_lod_idx[ tilelD ][ patchldx ] == 0 ) { imdu_subdivision_iteration_count_present_flag[ tilelD ][ patchldx ] u(1) if( imdu_subdivision_iteration_count_present_flag[ tilelD ][ patchldx ] ){ imdu_subdivision_iteration_count[ tileID ][ patchIdx ] U(3) InterPatchSubdivisionCount[ tileID ][ patchIdx ] =imdu_subdivision_iteration_count[ tileID ][ patchIdx ]}elseInterPatchSubdivisionCount[ tilelD ][ patchldx ] = AfpsSubdivisionCountif( AspsinvQuantOffsetPresentFlag ) { imdu_inverse_quantization_offset_enable_flag[ tilelD ][ patchldx ] u(1) if( imdu_inverse_quantization_offset_enable_flag ) {for( I = 0; I < MergePatchSubdivisionCount[ tilelD ][ patchldx ]; I++ ) {for( j = 0; j < AspsDispComponents; j++ ) {for( k = 0; k < 3; k++) { imdu_inverse_quantization_offset_sign[ tileID ][ patchIdx ][ i ][ j ][ k ] u(1) imdu_inverse_quantization_offset_value_log2_prec1_delta[ tileID ][ patchIdx ][ i ][ j ][ k ] se(v)imdu_inverse_quantization_offset_value_log2_prec2_delta[ tileID ][ patchIdx ][ i ][ j ][ k ] se(v)}}}}}if( InterPatchSubdivisionCount[ tilelD ][ patchldx ]!= 0 ) imdu_transform_parameters_present_flag[ tilelD ][ patchldx ] u(1) imdu_transform_method_present_flag[ tilelD ][ patchldx ] u(1) if( imdu_transform_method_present_flag[ tilelD ][ patchldx ] ) { imdu_transform_method[ tilelD ][ patchldx ] u(3) lnterPatchTransformMethod[ tilelD ][ patchldx ] =imdu_transform_method[ tilelD ][ patchldx ]} else {InterPatchTransformMethod[ tilelD ][ patchldx ] = AfpsTransformMethod}1616-614WO01Qualcomm Ref. No. 2502081 WO 66 / 114}if( AspsDisplacementldPresentFlag || ( AspsLodPatchesEnableFlag == 0 ) ) { vertexInfoCount = InterPatchSubdivisionCount[ tilelD ][ patchldx ] + 1} else {vertexInfoCount = 1}for( I = 0; I < vertexInfoCount;!++){imdu_delta_block_count[ tileID ][ patchIdx ][ i ] se(v) imdu_delta_last_pos_in_block[ tileID ][ patchIdx ][ i ] se(v) }if ( imdu_lod_idx[ tilelD ][ patchldx ] == 0 ) {if( lnterPatchTransformMethod[ tilelD ][ patchldx ] == LI NEARJJ FTI NG && AspsLiftingOffsetPresentFlag ){imdu_lifting_offset_present_flag[ tilelD ][ patchldx ] u(1) if( imdu_lifting_offset_present_flag[ tilelD ][ patchldx ] ) {for( I = 0; I < I nterPatchSubdivisionCount[ tilelD ][ patchldx ]; I++ ) {se(v) imdu_lifting_offset_delta_values_num[ tileID ][ patchIdx ][ i ]se(v) imdu_lifting_offset_delta_values_deno[ tileID ][ patchIdx ][ i ]}}}if( lnterPatchTransformMethod[ tilelD ][ patchldx ] == LI NEARJJ FTI NG && AspsDirectionalLiftingPresentFlag ) {for( I = 0; I < 2; I++ ) {imdu_directional_lifting_scale_num[ tileID ][ patchIdx ][ i ] se(v) <add> ue(v) imdu_directional_lifting_scale_deno_minus1[ tileID ][ patchIdx ][ i ]< / add>}}if( lnterPatchTransformMethod[ tilelD ][ patchldx ] == LI NEARJJ FTI NG &&( imdujransform_parameters_presentjlag[ tilelD ][ patchldx ] || imdu_subdivisionjteration_count_present_flag[ tilelD ][ patchldx ] || imdujransform_method_presentjlag[ tilelD ][ patchldx ] ) ){ vdmcjiftingjransform_parameters(2,I nterPatchSubdivisionCount[ tilelD ][ patchldx ] )}if( asve_projection_texcoord_enable_flag ) imdu_texture_projection_present_flag[ tileID ][ patchIdx ] u(1) if( imdu_texture_projection_present_flag[ tileID ][ patchIdx ] ) texture_projection_inter_information( tileID, patchIdx )}}1616-614WO01Qualcomm Ref. No. 2502081 WO 67 / 114imdu_directional_lifting_scale_deno_minusl[ tilelD ][ patchldx ][ i ] plus 1 indicates the denominator of the directional lifting scale used to adapt prediction and update weights in the lifting transform for the scale value signalled with index i for submesh with submesh ID mdu_submesh_id[ tilelD ] [ patchldx ].
[0138] Delta coding of directional lifting parameters will now be discussed. A problem with current implementations is that the directional lifting parameters are not delta coded for merge and inter meshpatches.
[0139] A possible solution is as follows:Merge meshpatch data unit syntaxmerge_meshpatch_data_unit( tilelD, patchldx ) { Descriptor if( NumRefldxActive )mmdu_ref_index[ tilelD ][ patchldx ] ue(v) mmdu_patch_index[ tilelD ][ patchldx ] se(v) if( AspsLodPatchesEnableFlag )mmdu_lod_idx[ tilelD ][ patchldx ] ue(v) if( mmdu_lod_idx[ tilelD ][ patchldx ] == 0 ) { mmdu_subdivision_iteration_count_present_flag[ tilelD ][ patchldx ] u(1) if( mmdu_subdivision_iteration_count_present_flag[ tilelD ][ patchldx ] ) { mmdu_subdivision_iteration_count[ tilelD ][ patchldx ] u(3) MergePatchSubdivisionCount[ tilelD ][ patchldx ] = mmdu_subdivision_iteration_count[ tilelD ][ patchldx ]} else {MergePatchSubdivisionCount[ tilelD ][ patchldx ] = AfpsSubdivisionCount}if( AspsinvQuantOffsetPresentFlag ) {mmdu_inverse_quantization_offset_enable_flag[ tilelD ][ patchldx ] u(1) if( imdu_inverse_quantization_offset_enable_flag ) {for( I = 0; I < MergePatchSubdivisionCount[ tilelD ][ patchldx ]; I++ ) {for( j = 0; j < AspsDispComponents; j++ ) {for( k = 0; k < 3; k++) { mmdu_inverse_quantization_offset_sign[ tilelD ][ patchldx ][ I ][j ][ k ] u(1) mmdu_inverse_quantization_offset_value_log2_prec1_delta[ tilelD ][ patchldx ][ I ][j ][ k se(v) mmdu_inverse_quantization_offset_value_log2_prec2_delta[ tilelD ][ patchldx ][ I ][j ][ k se(v) }}}}}if( AspsLiftingOffsetPresentFlag ){mmdu_lifting_offset_present_flag[ tileID ][ patchIdx ] u(1) 1616-614WO01Qualcomm Ref. No. 2502081 WO 68 / 114if( mmdu_lifting_offset_present_flag[ tilelD ][ patchldx ] ) {for( i = 0; i < MergePatchSubdivisionCount[ tilelD ][ patchldx ]; I++ ) {se(v) mmdu_lifting_offset_delta_values_num[ tileID ][ patchIdx ][ i ]se(v) mmdu_lifting_offset_delta_values_deno[ tileID ][ patchIdx ][ i ]}}}if( AspsDirectionalLiftingPresentFlag ) {for( I = 0; I < 2; I++ ) {<del> se(v) mmdu_directional_lifting_ scale_num[ tilelD ][ patchldx ][ I ]< / del><add>mmdu_directional_lifti ng_delta_scale_n um [ tilelD ][ patchldx ][ I ]< / add>}}if( asve_projection_texcoord_enable_flag ){mmdu_texture_projection_present_flag[ tilelD ][ patchldx ] u(1) if( mmdu_texture_projection_present_flag[ tilelD ][ patchldx ] ) texture_projection_merge_information( tilelD, patchldx )}}}}mmdu_directional_lifting_delta_scale_num[ tile ID ][ patchldx ][ i ] specifies the difference of the numerator of the directional lifting scale used to adapt prediction and update weights in the lifting transform for the scale value signalled with index i in patch with a meshpatch with index patchldx, in the current atlas tile, with tile ID equal to tilelD.Inter meshpatch data unit syntaxinter_meshpatch_data_unit( tilelD, patchldx ) { Descriptor if( NumRefldxActive )imdu_ref_index[ tilelD ][ patchldx ] ue(v) imdu_patch_index[ tilelD ][ patchldx ] se(v) if( !AspsDisplacementIdPresentFlag ) {if( AspsLodPatchesEnableFlag )imdu_lod_idx[ tilelD ][ patchldx ] ue(v) imdu_2d_delta_pos_x[ tilelD ][ patchldx ] se(v)imdu_2d_delta_pos_y[ tilelD ][ patchldx ] se(v) 1616-614WO01Qualcomm Ref. No. 2502081 WO 69 / 114imdu_2d_delta_size_x[ tilelD ][ patchldx ] se(v) imdu_2d_delta_size_y[ tilelD ][ patchldx ] se(v) }if( imdu_lod_idx[ tilelD ][ patchldx ] == 0 ) { imdu_subdivision_iteration_count_present_flag[ tilelD ][ patchldx ] u(1) if( imdu_subdivision_iteration_count_present_flag[ tilelD ][ patchldx ] ){imdu_subdivision_iteration_count[ tileID ][ patchIdx ] U(3) 1 nterPatchSubdivisionCount[ tilelD ][ patchldx ] =imdu_subdivision_iteration_count[ tileID ][ patchIdx ]}elseInterPatchSubdivisionCount[ tilelD ][ patchldx ] = AfpsSubdivisionCountif( AspsinvQuantOffsetPresentFlag ) { imdu_inverse_quantization_offset_enable_flag[ tilelD ][ patchldx ] u(1) if( imdu_inverse_quantization_offset_enable_flag ) {for( I = 0; I < MergePatchSubdivisionCount[ tilelD ][ patchldx ]; I++ ) {for( j = 0; j < AspsDispComponents; j++ ) {for( k = 0; k < 3; k++) { imdu_inverse_quantization_offset_sign[ tilelD ][ patchldx ][ I ][j ][ k ] u(1) imdu_inverse_quantization_offset_value_log2_prec1_delta[ tilelD ][ patchldx ][ I ][j ][ k ] se(v) imdu_inverse_quantization_offset_value_log2_prec2_delta[ tilelD ][ patchldx ][ I ][j ][ k ] se(v)}}}}}if( InterPatchSubdivisionCount[ tilelD ][ patchldx ]!= 0 ) imdu_transform_parameters_present_flag[ tilelD ][ patchldx ] u(1) imdu_transform_method_present_flag[ tilelD ][ patchldx ] u(1) if( imdu_transform_method_present_flag[ tilelD ][ patchldx ] ) { imdu_transform_method[ tilelD ][ patchldx ] u(3) lnterPatchTransformMethod[ tilelD ][ patchldx ] =imdu_transform_method[ tilelD ][ patchldx ]} else {InterPatchTransformMethod[ tilelD ][ patchldx ] = AfpsTransformMethod}}if( AspsDisplacementldPresentFlag || ( AspsLodPatchesEnableFlag == 0 ) ) { vertexInfoCount = InterPatchSubdivisionCount[ tileID ][ patchIdx ] + 1} else {vertexinfoCount = 1}for( I = 0; I < vertexinfoCount;!++){imdu_delta_block_count[ tilelD ][ patchldx ][ I ] se(v)1616-614WO01Qualcomm Ref. No. 2502081 WO 70 / 114imdu_delta_last_pos_in_block[ tilelD ][ patchldx ][ i ] se(v) }if ( imdu_lod_idx[ tilelD ][ patchldx ] == 0 ) {if( lnterPatchTransformMethod[ tilelD ][ patchldx ] == LI NEARJJ FTI NG && AspsLiftingOffsetPresentFlag ){imdu_lifting_offset_present_flag[ tileID ][ patchIdx ] u(1) if( imdu_lifting_offset_present_flag [ tilelD ][ patchldx ] ) {for( I = 0; 1 < 1 nterPatchSubdivisionCount[ tilelD ][ patchldx ]; I++ ) {se(v) imdu_lifting_offset_delta_values_num[ tileID ][ patchIdx ][ i ]se(v) imdu_lifting_offset_delta_values_deno[ tileID ][ patchIdx ][ i ]}}}if( lnterPatchTransformMethod[ tilelD ][ patchldx ] == LI NEARJJ FTI NG && AspsDirectionalLiftingPresentFlag ) {for( I = 0; I < 2; I++ ) {<del> se(v) imdu_directional Jifting_ scale_num[ tilelD ][ patchldx ][ I ]< / del><add>imdu_directional Jifting_delta_scale_num[ tilelD ][ patchldx ][ I ]< / add>}}if( lnterPatchTransformMethod[ tilelD ][ patchldx ] == LI NEARJJ FTI NG &&( imdujransform_parameters_presentjlag[ tilelD ][ patchldx ] || imdu_subdivisionjteration_count_present_flag[ tilelD ][ patchldx ] || imdujransform_method_presentjlag[ tilelD ][ patchldx ] ) ){ vdmcjiftingjransform_parameters(2,InterPatchSubdivisionCount[ tileID ][ patchIdx ] )}if( asve_projection_texcoord_enable_flag )imdujexture_projection_presentjlag[ tilelD ][ patchldx ] u(1) if( imdujexture_projection_presentjlag[ tilelD ][ patchldx ] ) texture_projectionjnterjnformation( tilelD, patchldx )}}imdu_directional_lifting_delta_scale_num[ tileID ][ patchIdx ][ i ] specifies the difference of the numerator of the directional lifting scale used to adapt prediction and update weights in the lifting transform for the scale value1616-614WO01Qualcomm Ref. No. 2502081 WO 71 / 114signalled with index i in patch with a meshpatch with index patchldx, in the current atlas tile, with tile ID equal to tilelD.
[0140] Reusing the mean from lifting offset for directional lifting will now be discussed. A problem with current implementations is that the lifting offset tool and directional lifting transform signals a mean of the same signal but signals them separately causing repetitive signaling. A possible solution is that the mean deduced and signaled for the lifting offset may be used in directional lifting and repetitive signaling of mean as directional lifting parameter may be removed as follows:Meshpatch data unit syntaxmeshpatch_data_unit( tilelD, patchldx ) { Descriptor mdu_submesh_id[ tilelD ][ patchldx ] ue(v) if( athjype == P_TILE || athjype == l_TILE ) {if( AspsDisplacementldPresentFlag ) {mdu_displ_id[ tilelD ][ patchldx ] ue(v) } else {if( AspsLodPatchesEnableFlag )mdu_lod_idx[ tilelD ][ patchldx ] ue(v) mdu_2d_pos_x[ tilelD ][ patchldx ] ue(v) mdu_2d_pos_y[ tilelD ][ patchldx ] ue(v) mdu_2d_size_x_minus1[ tilelD ][ patchldx ] ue(v) mdu_2d_size_y_minus1[ tilelD ][ patchldx ] ue(v) }if( mdu_lod_idx[ tilelD ][ patchldx ] == 0 ) {PatchSubdivisionCount[ tilelD ][ patchldx ] = AfpsSubdivisionCount mdu_parameters_override_flag[ tilelD ][ patchldx ] u(1) if( mdu_parameters_override_flag[ tilelD ][ patchldx ] ){u(1) mdu_subdivision_iteration_count_present_flag[ tilelD ][ patchldx ]if( mdu_subdivision_iteration_count_present_flag[ tilelD ][ patchldx ] ) {mdu_subdivision_iteration_count u(3) PatchSubdivisionCount[ tilelD ][ patchldx ] = mdu_subdivision_iteration_count}if( PatchSubdivisionCount[ tilelD ][ patchldx ]!= 0 ) mdu_transform_method_present_flag[ tilelD ][ patchldx ] u(1) if( I mdu_subdivision_iteration_count_present_flag[ tilelD ][ patchldx ] ) {if( PatchSubdivisionCount[ tilelD ][ patchldx ]!= 0 )u(1) mdu_subdivision_method_present_flag[ tilelD ][ patchldx ]if( asve_quantization_parameters_present_flag )mdu_quantization_present_flag[ tilelD ][ patchldx ] u(1)1616-614WO01Qualcomm Ref. No. 2502081 WO 72 / 114if ( (!mdu_transform_method_present_flag[ tilelD ][ patchldx ] ) &&PatchSubdivisionCount[ tilelD ][ patchldx ]!= 0 )u(1) mdu_transform_parameters_present_flag[ tilelD ][ patchldx ]}}if( mdu_subdivision_method_present_flag[ tilelD ][ patchldx ] ){if( PatchSubdivisionCount[ tilelD ][ patchldx ] > 1) { mdu_lod_adaptive_subdivision_flag[ tilelD ][ patchldx ] u(1) }for( i = 0; i < PatchSubdivisionCount[ tilelD ][ patchldx ]; I++) {if( mdu_lod_adaptive_subdivision_flag == 1 || I == 0 ) { mdu_subdivision_method[ tilelD ][ patchldx ][ i ] u(3) } else {mdu_subdivision_method[ tilelD ][ patchldx ][ I ] = mdu_subdivision_method[ tilelD ][ patchldx ]
[0000] }PatchSubdivisionMethod[ tilelD ][ patchldx ][ I ] = mdu_subdivision_method[ i ]}if( asve_edge_based_subdivision_flag == 1 ) { mdu_subdivision_min_edge_length[ tilelD ][ patchldx ] u(16) PatchSubdivisionMinEdgeLength[ tilelD ][ patchldx ] = mdu_subdivision_min_edge_length[ tilelD ][ patchldx ]} else {PatchSubdivisionMinEdgeLength[ tilelD ][ patchldx ] = 0}} else {for( i = 0; i < PatchSubdivisionCount[ tilelD ][ patchldx ]; I++ ){ PatchSubdivisionMethod[ tilelD ][ patchldx ][ I ] = AfpsSubdivisionMethod[ i ]}PatchSubdivisionMinEdgeLength[ tilelD ][ patchldx ] = AfpsSubdivisionMinEdgeLength}if( mdu_quantization_present_flag[ tilelD ][ patchldx ] ) vdmc_quantization_parameters( 2,PatchSubdivisionCount[ tilelD ][ patchldx ],AfpsSubdivisionCount )if( AspsInvQuantOffsetPresentFlag ) {u(1) mdu_inverse_quantization_offset_enable_flag[ tilelD ][ patchldx ]if( mdu_inverse_quantization_offset_enable_flag ) {for( i = 0; i < PatchSubdivisionCount[ tilelD ][ patchldx ]; I++ ) {for( j = 0; j < AspsDispComponents; j++ ) {for( k = 0; k < 3; k++) {1616-614WO01Qualcomm Ref. No. 2502081 WO 73 / 114u(1) mdu_inverse_quantization_offset_sign[ tilelD ][ patchldx ][ i ][j ][ k ] mdu_inverse_quantization_offset_value_log2_prec1_delta[ tilelD ][ patchldx ][ i ][ j ][ se(v) k ]mdu_inverse_quantization_offset_value_log2_prec2_delta[ tilelD ][ patchldx ][ I ][ j ][ se(v) k ]}}}}}mdu_displacement_coordinate_system[ tilelD ][ patchldx ] u(1) if( mdu_transform_method_present_flag[ tilelD ][ patchldx ] && PatchSubdivisionCount[ tilelD ][ patchldx ]!= 0 ) mdu_transform_method[ tilelD ][ patchldx ] u(3) if( mdu_transform_method[ tilelD ][ patchldx ]== LINEAR_LIFTING ) { if( AspsLiftingOffsetPresentFlag ) {mdu_lifting_offset_present_flag [ tilelD ][ patchldx ] u(1) if( mdu_lifting_offset_present_flag[ tilelD ][ patchldx ] ) {for( I = 0; I < PatchSubdivisionCount[ tilelD ][ patchldx ]; I++ ) {se(v) mdu_lifting_offset_values_num[ tilelD ][ patchldx ][ I ]ue(v) mdu_lifting_offset_values_deno_minus1[ tilelD ][ patchldx ][ I ]}}}if( AspsDirectionalLiftingPresentFlag ) {<del>for( I = 0; I < 2; I++ ) {< / del><del> se(v) mdu_directional_lifting_scale_num[ tilelD ][ patchldx ][ I ]< / del><del>}< / del>}if ( mdu_transform_parameters_present_flag[ tilelD ][ patchldx ] ) { vdmc_lifting_transform_parameters(2,PatchSubdivisionCount[ tilelD ][ patchldx ] )}}}if( AspsDisplacementldPresentFlag || (AspsLodPatchesEnableFlag == 0 ) ) { vertexinfoCount = PatchSubdivisionCount[ tilelD ][ patchldx ] + 1} else {vertexinfoCount = 11616-614WO01Qualcomm Ref. No. 2502081 WO 74 / 114}for( i = 0; i < vertexInfoCount; i++ ) {mdu_block_count_minus1[ tilelD ][ patchldx ][ i ]; u(v) mdu_last_pos_in_block[ tilelD ][ patchldx ][ i ] u(v) }smldx = SubmeshlDTolndex[ mdu_submesh_id[ tilelD ][ patchldx ] ]if( afve_projection_texcoord_present_flag[ smldx ] )texture_projection_information( tilelD, patchldx )}if( ath_type == P_TILE_ATT ||ath_type == I_TILE_ATTR ) {I = TilelDToAtlasAttributeldx[ tilelD ]if( AspsAttributeSubtextureEnabledFlag[ I ] ){mdu_attributes_2d_pos_x[ tilelD ][ patchldx ] ue(v) mdu_attributes_2d_pos_y[ tilelD ][ patchldx ] ue(v) mdu_attributes_2d_size_x_minus1[ tilelD ][ patchldx ] ue(v) mdu_attributes_2d_size_y_minus1[ tilelD ][ patchldx ] ue(v) }}}Merge meshpatch data unit syntaxmerge_meshpatch_data_unit( tilelD, patchldx ) { Descriptor if( NumRefldxActive )mmdu_ref_index[ tilelD ][ patchldx ] ue(v) mmdu_patch_index[ tilelD ][ patchldx ] se(v) if( AspsLodPatchesEnableFlag )mmdu_lod_idx[ tilelD ][ patchldx ] ue(v) if( mmdu_lod_idx[ tilelD ][ patchldx ] == 0 ) { mmdu_subdivision_iteration_count_present_flag[ tilelD ][ patchldx ] u(1) if( mmdu_subdivision_iteration_count_present_flag[ tilelD ][ patchldx ] ) { mmdu_subdivision_iteration_count[ tilelD ][ patchldx ] u(3) MergePatchSubdivisionCount[ tilelD ][ patchldx ] = mmdu_subdivision_iteration_count[ tilelD ][ patchldx ]} else {MergePatchSubdivisionCount[ tilelD ][ patchldx ] = AfpsSubdivisionCount}if( AspsinvQuantOffsetPresentFlag ) { mmdu_inverse_quantization_offset_enable_flag[ tilelD ][ patchldx ] u(1) if( imdu_inverse_quantization_offset_enable_flag ) {for( I = 0; I < MergePatchSubdivisionCount[ tilelD ][ patchldx ]; I++ ) {for( j = 0; j < AspsDispComponents; j++ ) {for( k = 0; k < 3; k++) {mmdu_inverse_quantization_offset_sign[ tilelD ][ patchldx ][ I ][j ][ k ] u(1)1616-614WO01Qualcomm Ref. No. 2502081 WO 75 / 114mmdu_inverse_quantization_offset_value_log2_prec1_delta[ tilelD ][ patchldx ][ i ][ j se(v) ][ k ]mmdu_inverse_quantization_offset_value_log2_prec2_delta[ tilelD ][ patchldx ][ i ][ j se(v) ][ k ]}}}}}if( AspsLiftingOffsetPresentFlag<add>|| AspsDirectionalLiftingPresentFlag < / add> ){mmdu_lifting_offset_present_flag[ tilelD ][ patchldx ] u(1) if( mmdu_lifting_offset_present_flag[ tilelD ][ patchldx ] ) {for( I = 0; I < MergePatchSubdivisionCount[ tilelD ][ patchldx ]; I++ ) {se(v) mmdu_lifting_offset_delta_values_num[ tileID ][ patchIdx ][ i ]se(v) mmdu_lifting_offset_delta_values_deno[ tileID ][ patchIdx ][ i ]}}}if( AspsDirectionalLiftingPresentFlag ) {<add> se(v) mmdu_directional_lifting_std_num[ tilelD ][ patchldx ][ I ]< / add><del>for( I = 0; I < 2; I++ ) {mmdu_directional_lifting_scale_num[ tilelD ][ patchldx ][ I ] se(v) < / del>}if( asve_projection_texcoord_enable_flag ){ mmdu_texture_projection_present_flag[ tilelD ][ patchldx ] u(1) if( mmdu_texture_projection_present_flag[ tilelD ][ patchldx ] ) texture_projection_merge_information( tilelD, patchldx )}}}}1616-614WO01Qualcomm Ref. No. 2502081 WO 76 / 114Inter meshpatch data unit syntaxinter_meshpatch_data_unit( tilelD, patchldx ) { Descriptor if( NumRefldxActive )imdu_ref_index[ tilelD ][ patchldx ] ue(v) imdu_patch_index[ tilelD ][ patchldx ] se(v) if( !AspsDisplacementIdPresentFlag ) {if( AspsLodPatchesEnableFlag )imdu_lod_idx[ tilelD ][ patchldx ] ue(v) imdu_2d_delta_pos_x[ tilelD ][ patchldx ] se(v) imdu_2d_delta_pos_y[ tilelD ][ patchldx ] se(v) imdu_2d_delta_size_x[ tilelD ][ patchldx ] se(v) imdu_2d_delta_size_y[ tilelD ][ patchldx ] se(v) }if( imdu_lod_idx[ tilelD ][ patchldx ] == 0 ) { imdu_subdivision_iteration_count_present_flag[ tilelD ][ patchldx ] u(1) if( imdu_subdivision_iteration_count_present_flag[ tilelD ][ patchldx ] ){ imdu_subdivision_iteration_count[ tileID ][ patchIdx ] U(3) InterPatchSubdivisionCount[ tileID ][ patchIdx ] =imdu_subdivision_iteration_count[ tileID ][ patchIdx ]}elseInterPatchSubdivisionCount[ tilelD ][ patchldx ] = AfpsSubdivisionCountif( AspsinvQuantOffsetPresentFlag ) { imdu_inverse_quantization_offset_enable_flag[ tilelD ][ patchldx ] u(1) if( imdu_inverse_quantization_offset_enable_flag ) {for( I = 0; I < MergePatchSubdivisionCount[ tilelD ][ patchldx ]; I++ ) {for( j = 0; j < AspsDispComponents; j++ ) {for( k = 0; k < 3; k++) { imdu_inverse_quantization_offset_sign[ tileID ][ patchIdx ][ i ][ j ][ k ] u(1) imdu_inverse_quantization_offset_value_log2_prec1_delta[ tileID ][ patchIdx ][ i ][ j ][ k ] se(v)imdu_inverse_quantization_offset_value_log2_prec2_delta[ tileID ][ patchIdx ][ i ][ j ][ k ] se(v)}}}}}if( InterPatchSubdivisionCount[ tilelD ][ patchldx ]!= 0 ) imdu_transform_parameters_present_flag[ tilelD ][ patchldx ] u(1) imdu_transform_method_present_flag[ tilelD ][ patchldx ] u(1) if( imdu_transform_method_present_flag[ tilelD ][ patchldx ] ) { imdu_transform_method[ tilelD ][ patchldx ] u(3) lnterPatchTransformMethod[ tilelD ][ patchldx ] =imdu_transform_method[ tilelD ][ patchldx ]1616-614WO01Qualcomm Ref. No. 2502081 WO 77 / 114} else {InterPatchTransformMethod[ tilelD ][ patchldx ] = AfpsTransformMethod}}if( AspsDisplacementldPresentFlag || ( AspsLodPatchesEnableFlag == 0 ) ) { vertexInfoCount = InterPatchSubdivisionCount[ tilelD ][ patchldx ] + 1} else {vertexInfoCount = 1}for( I = 0; I < vertexInfoCount;!++){imdu_delta_block_count[ tileID ][ patchIdx ][ i ] se(v) imdu_delta_last_pos_in_block[ tileID ][ patchIdx ][ i ] se(v) }if ( imdu_lod_idx[ tilelD ][ patchldx ] == 0 ) {if( lnterPatchTransformMethod[ tilelD ][ patchldx ] == LI NEARJJ FTI NG && AspsLiftingOffsetPresentFlag <add>|| AspsDirectionalLiftingPresentFlag < / add> ){imdu_lifting_offset_present_flag[ tilelD ][ patchldx ] u(1) if( imdu_lifting_offset_present_flag[ tilelD ][ patchldx ] ) {for( I = 0; I < I nterPatchSubdivisionCount[ tilelD ][ patchldx ]; I++ ) {se(v) imdu_lifting_offset_delta_values_num[ tileID ][ patchIdx ][ i ]se(v) imdu_lifting_offset_delta_values_deno[ tileID ][ patchIdx ][ i ]}}}if( lnterPatchTransformMethod[ tilelD ][ patchldx ] == LI NEARJJ FTI NG && AspsDirectionalLiftingPresentFlag ) {<add> imdu_directional_lifting_std_num[ tilelD ][ patchldx ][ i ] se(v)< / add><del>for( I = 0; I < 2; I++ ) {imdu_directional_lifting_scale_num[ tileID ][ patchIdx ][ i ] se(v) < / del>}if( lnterPatchTransformMethod[ tilelD ][ patchldx ] == LI NEARJJ FTI NG &&( imdujransform_parameters_presentjlag[ tilelD ][ patchldx ] || imdu_subdivisionjteration_count_present_flag[ tilelD ][ patchldx ] || imdujransform_method_presentjlag[ tilelD ][ patchldx ] ) ){ vdmcjiftingjransform_parameters(2,I nterPatchSubdivisionCount[ tilelD ][ patchldx ] ) }if( asve_projection_texcoord_enable_flag )imdu_texture_projection_present_flag[ tilelD ][ patchldx ] u(1) 1616-614WO01Qualcomm Ref. No. 2502081 WO 78 / 114if( imdu_texture_projection_present_flag[ tilelD ][ patchldx ] ) texture_projection_inter_information( tilelD, patchldx )}}
[0141] A combination of the solutions discussed above for the patch level directional lifting enable flag,_signaling thresholds in directional lifting, _removing for loop and sending two directional lifting parameters, signaling the denominator in directional lifting, and delta coding of directional lifting parameters is as follows:Meshpatch data unit syntaxmeshpatch_data_unit( tilelD, patchldx ) { Descriptor mdu_submesh_id[ tilelD ][ patchldx ] ue(v) if( athjype == P_TILE || athjype == l_TILE ) {if( AspsDisplacementldPresentFlag ) {mdu_displ_id[ tilelD ][ patchldx ] ue(v) } else {if( AspsLodPatchesEnableFlag )mdu_lod_idx[ tilelD ][ patchldx ] ue(v) mdu_2d_pos_x[ tilelD ][ patchldx ] ue(v) mdu_2d_pos_y[ tilelD ][ patchldx ] ue(v) mdu_2d_size_x_minus1[ tilelD ][ patchldx ] ue(v) mdu_2d_size_y_minus1[ tilelD ][ patchldx ] ue(v) }if( mdu_lod_idx[ tilelD ][ patchldx ] == 0 ) {PatchSubdivisionCount[ tilelD ][ patchldx ] = AfpsSubdivisionCount mdu_parameters_override_flag[ tilelD ][ patchldx ] u(1) if( mdu_parameters_override_flag[ tilelD ][ patchldx ] ){u(1) mdu_subdivision_iteration_count_present_flag[ tilelD ][ patchldx ]if( mdu_subdivision_iteration_count_present_flag[ tilelD ][ patchldx ] ) {mdu_subdivision_iteration_count u(3) PatchSubdivisionCount[ tilelD ][ patchldx ] = mdu_subdivision_iteration_count}if( PatchSubdivisionCount[ tilelD ][ patchldx ]!= 0 ) mdu_transform_method_present_flag[ tilelD ][ patchldx ] u(1) if( I mdu_subdivision_iteration_count_present_flag[ tilelD ][ patchldx ] ) {if( PatchSubdivisionCount[ tilelD ][ patchldx ]!= 0 )u(1) mdu_subdivision_method_present_flag[ tilelD ][ patchldx ]if( asve_quantization_parameters_present_flag )1616-614WO01Qualcomm Ref. No. 2502081 WO 79 / 114mdu_quantization_present_flag[ tilelD ][ patchldx ] u(1) if ( (!mdu_transform_method_present_flag[ tilelD ][ patchldx ] ) &&PatchSubdivisionCount[ tilelD ][ patchldx ]!= 0 )u(1) mdu_transform_parameters_present_flag[ tilelD ][ patchldx ]}}if( mdu_subdivision_method_present_flag[ tilelD ][ patchldx ] ){if( PatchSubdivisionCount[ tilelD ][ patchldx ] > 1) { mdu_lod_adaptive_subdivision_flag[ tilelD ][ patchldx ] u(1) }for( i = 0; i < PatchSubdivisionCount[ tilelD ][ patchldx ]; I++) {if( mdu_lod_adaptive_subdivision_flag == 1 || I == 0 ) { mdu_subdivision_method[ tilelD ][ patchldx ][ i ] u(3) } else {mdu_subdivision_method[ tilelD ][ patchldx ][ I ] = mdu_subdivision_method[ tilelD ][ patchldx ]
[0000] }PatchSubdivisionMethod[ tilelD ][ patchldx ][ I ] = mdu_subdivision_method[ i ]}if( asve_edge_based_subdivision_flag == 1 ) { mdu_subdivision_min_edge_length[ tilelD ][ patchldx ] u(16) PatchSubdivisionMinEdgeLength[ tilelD ][ patchldx ] = mdu_subdivision_min_edge_length[ tilelD ][ patchldx ]} else {PatchSubdivisionMinEdgeLength[ tilelD ][ patchldx ] = 0 }} else {for( i = 0; i < PatchSubdivisionCount[ tilelD ][ patchldx ]; I++ ){ PatchSubdivisionMethod[ tilelD ][ patchldx ][ I ] = AfpsSubdivisionMethod[ i ]}PatchSubdivisionMinEdgeLength[ tilelD ][ patchldx ] = AfpsSubdivisionMinEdgeLength}if( mdu_quantization_present_flag[ tilelD ][ patchldx ] ) vdmc_quantization_parameters( 2,PatchSubdivisionCount[ tilelD ][ patchldx ],AfpsSubdivisionCount )if( AspsInvQuantOffsetPresentFlag ) {u(1) mdu_inverse_quantization_offset_enable_flag[ tilelD ][ patchldx ]if( mdu_inverse_quantization_offset_enable_flag ) {for( i = 0; i < PatchSubdivisionCount[ tilelD ][ patchldx ]; I++ ) {for( j = 0; j < AspsDispComponents; j++ ) {for( k = 0; k < 3; k++) {1616-614WO01Qualcomm Ref. No. 2502081 WO 80 / 114u(1) mdu_inverse_quantization_offset_sign[ tilelD ][ patchldx ][ i ][j ][ k ] mdu_inverse_quantization_offset_value_log2_prec1_delta[ tilelD ][ patchldx ][ i ][ j ][ se(v) k ]mdu_inverse_quantization_offset_value_log2_prec2_delta[ tilelD ][ patchldx ][ I ][ j ][ se(v) k ]}}}}}mdu_displacement_coordinate_system[ tilelD ][ patchldx ] u(1) if( mdu_transform_method_present_flag[ tilelD ][ patchldx ] && PatchSubdivisionCount[ tilelD ][ patchldx ]!= 0 ) mdu_transform_method[ tilelD ][ patchldx ] u(3) if( mdu_transform_method[ tilelD ][ patchldx ]== LINEAR_LIFTING ) { if( AspsLiftingOffsetPresentFlag ) {mdu_lifting_offset_present_flag [ tilelD ][ patchldx ] u(1) if( mdu_lifting_offset_present_flag[ tilelD ][ patchldx ] ) {for( I = 0; I < PatchSubdivisionCount[ tilelD ][ patchldx ]; I++ ) {se(v) mdu_lifting_offset_values_num[ tilelD ][ patchldx ][ I ]ue(v) mdu_lifting_offset_values_deno_minus1[ tilelD ][ patchldx ][ I ]}}}if( AspsDirectionalLiftingPresentFlag ) {<add> u(1) mdu_directional_lifting_present_flag [ tilelD ][ patchldx ]< / add><add>if( mdu_directional_lifting_present_flag[ tilelD ][ patchldx ] ) {< / add><del>for( I = 0; I < 2; I++) {< / del><add> se(v) mdu_directional_lifting_mean_num[ tilelD ][ patchldx ]<add><add> ue(v) mdu_directional_lifting_mean_deno_minus1[ tilelD ][ patchldx]< / add><del> ue(v) mdu_directional_lifting_std_num[ tilelD ][ patchldx ]< / del><add>mdu_directional_lifting_std_num[ tilelD ][ patchldx ]1616-614WO01Qualcomm Ref. No. 2502081 WO 81 / 114< / add><add> ue(v) mdu_directional_lifting_std_deno_minus1[ tilelD ][ patchldx ]<add><del>}< / del><add>}< / add>}if ( mdu_transform_parameters_present_flag[ tilelD ][ patchldx ] ) { vdmc_lifting_transform_parameters(2,PatchSubdi visionCountf tilelD ][ patchldx ] )}}}if( AspsDisplacementldPresentFlag || (AspsLodPatchesEnableFlag == 0 ) ) { vertexinfoCount = PatchSubdivisionCount[ tilelD ][ patchldx ] + 1} else {vertexinfoCount = 1}for( I = 0; I < vertexinfoCount; I++ ) {mdu_block_count_minus1[ tilelD ][ patchldx ][ I ]; u(v) mdu_last_pos_in_block[ tilelD ][ patchldx ][ I ] u(v) }smldx = SubmeshlDTolndex[ mdu_submesh_id[ tilelD ][ patchldx ] ]if( afve_projection_texcoord_present_flag[ smldx ] ) texture_projection_information( tilelD, patchldx )}if( ath_type == P_TILE_ATT ||ath_type == I_TILE_ATTR ) {i = TileIDToAtlasAttributeIdxf tileID ]if( AspsAttributeSubtextureEnabled Flag [ I ] ){mdu_attributes_2d_pos_x[ tilelD ][ patchldx ] ue(v) mdu_attributes_2d_pos_y[ tilelD ][ patchldx ] ue(v) mdu_attributes_2d_size_x_minus1[ tilelD ][ patchldx ] ue(v) mdu_attributes_2d_size_y_minus1[ tilelD ][ patchldx ] ue(v) }}}mdu directional lifting present flag [ tilelD ][ patchldx ] equal to 1 indicates that the directional lifting parameters are present for a meshpatch with index patchldx, in the current atlas tile, with tile ID equal to tilelD. mdu_directional_lifting_present_flag[ tilelD ][ patchldx ] equal to 0 indicates that the directional lifting parameters are not present. When not1616-614WO01Qualcomm Ref. No. 2502081 WO 82 / 114present, mdu_directional_lifting_present_flag[ tileID ][ patchIdx ] is inferred to be equal to 0.mdu_directional_lifting_mean_num[ tilelD ][ patchldx ] indicates the numerator of the mean used to calculate z-score in the directional lifting, signalled with index i for submesh with submesh ID mdu submesh idf tilelD ][ patchldx ].mdu_directional_lifting_mean_deno_minusl[ tilelD ][ patchldx ] plus 1 indicates the denominator of mean used to calculate z-score in the directional lifting, signalled with index i for submesh with submesh ID mdu submesh idf tilelD ][ patchldx ].mdu directional lifting std numf tilelD ][ patchldx ] indicates the numerator of the standard deviation used to calculate z-score in the directional lifting, signalled for submesh with submesh ID mdu submesh idf tilelD ][ patchldx ].mdu directional lifting std deno minuslf tilelD ][ patchldx ] plus 1 indicates the denominator of the standard deviation used to calculate z-score in the directional lifting, signalled for submesh with submesh ID mdu submesh idf tilelD ][ patchldx ].Merge meshpatch data unit syntaxmerge_meshpatch_data_unit( tilelD, patchldx ) { Descriptor iff NumRefldxActive )mmdu_ref_index[ tilelD ][ patchldx ] uefv) mmdu_patch_index[ tilelD ][ patchldx ] sefv) iff AspsLodPatchesEnableFlag )mmdu_lod_idx[ tileID ][ patchIdx ] ue(v) if( mmdu_lod_idx[ tileID ][ patchIdx ] == 0 ) {u(1) mmdu_subdivision_iteration_count_present_flag[ tileID ][ patchIdx ]iff mmdu_subdivision_iteration_count_present_flag[ tileID ][ patchIdx ] ) {mmdu_subdivision_iteration_count[ tileID ][ patchIdx ] u(3) MergePatchSubdivisionCount[ tileID ][ patchIdx ] = mmdu_subdivision_iteration_count[ tileID ][ patchIdx ]} else {MergePatchSubdivisionCountf tilelD ][ patchldx ] = AfpsSubdivisionCount}1616-614WO01Qualcomm Ref. No. 2502081 WO 83 / 114if( AspsInvQuantOffsetPresentFlag ) {u(1) mmdu_inverse_quantization_offset_enable_flag[ tilelD ][ patchldx ]if( imdu_inverse_quantization_offset_enable_flag ) {for( i = 0; i < MergePatchSubdivisionCount[ tilelD ][ patchldx ]; i++ ) {for( j = 0; j < AspsDispComponents; j++ ) {for( k = 0; k < 3; k++) { mmdu_inverse_quantization_offset_sign[ tileID ][ patchIdx ][ i ][ j ][ k ] u(1) mmdu_inverse_quantization_offset_value_log2_prec1_delta[ tileID ][ patchIdx ][ i ][ j ][ k ] se(v)mmdu_inverse_quantization_offset_value_log2_prec2_delta[ tileID ][ patchIdx ][ i ][ j ][ k ] se(v)}}}}}if( AspsLiftingOffsetPresentFlag ){mmdu_lifting_offset_present_flag[ tilelD ][ patchldx ] u(1) if( mmdu_lifting_offset_present_flag[ tilelD ][ patchldx ] ) {for( I = 0; I < MergePatchSubdivisionCount[ tilelD ][ patchldx ]; I++ ) {se(v) mmdu_lifting_offset_delta_values_num[ tileID ][ patchIdx ][ i ]se(v) mmdu_lifting_offset_delta_values_deno[ tileID ][ patchIdx ][ i ]}}}if( AspsDirectionalLiftingPresentFlag ) {<add>if( mmdu_directional_lifting_present_flag[ tilelD ][ patchldx ] ) {< / add><del> for( I = 0; I < 2; I++ ) {< / del><add> se(v) mmdu_directional_lifting_delta_mean_num[ tilelD ][ patchldx ]< / add><add> se(v) mmdu_directional_lifting_delta_mean_deno[ tilelD ][ patchldx ]< / add><del> se(v) mmdu_directional_lifting_ scale_num[ tilelD ][ patchldx ][ I ]< / del>1616-614WO01Qualcomm Ref. No. 2502081 WO 84 / 114<add>mmdu_directional_lifting_delta_std_num[ tilelD ][ patchldx ]< / add><add> sefv) mmdu_directional_lifting_delta_std_deno[ tilelD ][ patchldx ]< / add><del> }< / del><add> }< / add>}iff asve_projection_texcoord_enable_flag ){ mmdu_texture_projection_present_flag[ tilelD ][ patchldx ] u(1) iff mmdu_texture_projection_present_flag[ tilelD ][ patchldx ] ) texture_projection_merge_information( tilelD, patchldx )}}}}mmdu_directional_lifting_present_flag [ tileID ][ patchIdx ] equal to 1 indicates that the directional lifting parameters are present for a meshpatch with index patchIdx, in the current atlas tile, with tile ID equal to tileID. imdu_directional_lifting_present_flag[ tileID ][ patchIdx ] equal to 0 indicates that the directional lifting parameters are not present. When not present, imdu_directional_lifting_present_flag[ tileID ][ patchIdx ] is inferred to be equal to 0.mmdu directional lifting delta mean numf tilelD ][ patchldx ] specifies the difference of the mean numerator used to calculate z-score in the directional lifting, signalled for submesh with submesh ID mdu submesh idf tilelD ][ patchldx ].mmdu_directional_lifting_ delta_mean_deno[ tileID ][ patchIdx ] specifies the difference of the mean denominator used to calculate z-score in the directional lifting, signalled for submesh with submesh ID mdu_submesh_id[ tileID ][ patchIdx ].mmdu directional lifting delta std numf tilelD ][ patchldx ] specifies the difference of the standard deviation numerator used to calculate z-score in the directional lifting, signalled for submesh with submesh ID mdu submesh idf tilelD ][ patchldx ].1616-614WO01Qualcomm Ref. No. 2502081 WO 85 / 114mmdu_directional_lifting_delta_std_deno[ tilelD ][ patchldx ] specifies the difference of the standard deviation denominator used to calculate z- score in the directional lifting, signalled for submesh with submesh ID mdu submesh idf tilelD ][ patchldx ].Inter meshpatch data unit syntaxinter_meshpatch_data_unit( tilelD, patchldx ) { Descriptor if( NumRefldxActive )imdu_ref_index[ tilelD ][ patchldx ] ue(v) imdu_patch_index[ tilelD ][ patchldx ] se(v) if( !AspsDisplacementIdPresentFlag ) {if( AspsLodPatchesEnableFlag )imdu_lod_idx[ tilelD ][ patchldx ] ue(v) imdu_2d_delta_pos_x[ tilelD ][ patchldx ] se(v) imdu_2d_delta_pos_y[ tilelD ][ patchldx ] se(v) imdu_2d_delta_size_x[ tilelD ][ patchldx ] se(v) imdu_2d_delta_size_y[ tilelD ][ patchldx ] se(v) }if( imdu_lod_idx[ tilelD ][ patchldx ] == 0 ) { imdu_subdivision_iteration_count_present_flag[ tilelD ][ patchldx ] u(1) if( imdu_subdivision_iteration_count_present_flag[ tilelD ][ patchldx ] ){ imdu_subdivision_iteration_count[ tileID ][ patchIdx ] U(3) InterPatchSubdivisionCount[ tileID ][ patchIdx ] =imdu_subdivision_iteration_count[ tileID ][ patchIdx ]}elseInterPatchSubdivisionCount[ tilelD ][ patchldx ] = AfpsSubdivisionCountif( AspsInvQuantOffsetPresentFlag ) {u(1) imdu_inverse_quantization_offset_enable_flag[ tilelD ][ patchldx ]if( imdu_inverse_quantization_offset_enable_flag ) {for( I = 0; I < MergePatchSubdivisionCount[ tilelD ][ patchldx ]; I++ ) {for( j = 0; j < AspsDispComponents; j++ ) {for( k = 0; k < 3; k++) { imdu_inverse_quantization_offset_sign[ tileID ][ patchIdx ][ i ][ j ][ k ] u(1) imdu_inverse_quantization_offset_value_log2_prec1_delta[ tileID ][ patchIdx ][ i ][ j ][ k ] se(v)imdu_inverse_quantization_offset_value_log2_prec2_delta[ tileID ][ patchIdx ][ i ][ j ][ k ] se(v)}}}}1616-614WO01Qualcomm Ref. No. 2502081 WO 86 / 114}if( InterPatchSubdivisionCount[ tileID ][ patchIdx ] != 0 )u(1) imdu_transform_parameters_present_flag[ tilelD ][ patchldx ] imdu_transform_method_present_flag[ tilelD ][ patchldx ] u(1) if( imdu_transform_method_present_flag[ tilelD ][ patchldx ] ) { imdu_transform_method[ tilelD ][ patchldx ] u(3) InterPatchTransformMethod[ tilelD ][ patchldx ] =imdu_transform_method[ tilelD ][ patchldx ]} else {InterPatchTransformMethod[ tilelD ][ patchldx ] = AfpsTransformMethod}}if( AspsDisplacementldPresentFlag || ( AspsLodPatchesEnableFlag == 0 ) ) { vertexInfoCount = InterPatchSubdivisionCount[ tileID ][ patchIdx ] + 1} else {vertexinfoCount = 1}for( I = 0; I < vertexinfoCount;!++){imdu_delta_block_count[ tileID ][ patchIdx ][ i ] se(v) imdu_delta_last_pos_in_block[ tileID ][ patchIdx ][ i ] se(v) }if ( imdu_lod_idx[ tilelD ][ patchldx ] == 0 ) {if( lnterPatchTransformMethod[ tilelD ][ patchldx ] == LI NEARJJ FTI NG &&AspsLiftingOffsetPresentFlag ){ imdu_lifting_offset_present_flag[ tilelD ][ patchldx ] u(1) if( imdu_lifting_offset_present_flag[ tilelD ][ patchldx ] ) {for( I = 0; I < I nterPatchSubdivisionCount[ tilelD ][ patchldx ]; I++ ) {se(v) imdu_lifting_offset_delta_values_num[ tileID ][ patchIdx ][ i ]se(v) imdu_lifting_offset_delta_values_deno[ tileID ][ patchIdx ][ i ]}}}if( lnterPatchTransformMethod[ tilelD ][ patchldx ] == LI NEARJJ FTI NG &&AspsDirectionalLiftingPresentFlag ) {<del> for( I = 0; I < 2; I++ ) {< / del>se(v)se(v)1616-614WO01Qualcomm Ref. No. 2502081 WO 87 / 114se(v)se(v)<del / > }< / del><add> }< / add>}if( lnterPatchTransformMethod[ tilelD ][ patchldx ] == LI NEARJJ FTI NG &&( imdu_transform_parameters_present_flag[ tilelD ][ patchldx ] || imdu_subdivision_iteration_count_present_flag[ tilelD ][ patchldx ] ||imdu_transform_method_present_flag[ tilelD ][ patchldx ] ) ){ vdmc_lifting_transform_parameters(2,InterPatchSubdivisionCount[ tileID ][ patchIdx ] )}if( asve_projection_texcoord_enable_flag ) imdu_texture_projection_present_flag[ tilelD ][ patchldx ] u(1) if( imdu_texture_projection_present_flag[ tilelD ][ patchldx ] ) texture_projection_inter_information( tilelD, patchldx )}}imdu directional lifting present flag [ tilelD ][ patchldx ] equal to 1 indicates that the directional lifting parameters are present for a meshpatch with index patchldx, in the current atlas tile, with tile ID equal to tilelD. imdu_directional_lifting_present_flag[ tilelD ][ patchldx ] equal to 0 indicates that the directional lifting parameters are not present. When not present, imdu_directional_lifting_present_flag[ tileID ][ patchIdx ] is inferred to be equal to 0.imdu_directional_lifting_delta_mean_num[ tilelD ][ patchldx ] specifies the difference of the mean numerator used to calculate z-score in the directional lifting, signalled for submesh with submesh ID mdu submesh idf tilelD ][ patchldx ].imdu_directional_lifting_ delta_mean_deno[ tileID ][ patchIdx ] specifies the difference of the mean denominator used to calculate z-score1616-614WO01Qualcomm Ref. No. 2502081 WO 88 / 114in the directional lifting, signalled for submesh with submesh ID mdu submesh idf tilelD ][ patchldx ].imdu directional lifting delta std numf tilelD ][ patchldx ] specifies the difference of the standard deviation numerator used to calculate z-score in the directional lifting, signalled for submesh with submesh ID mdu submesh idf tilelD ][ patchldx ].imdu directional lifting delta std denof tilelD ][ patchldx ] specifies the difference of the standard deviation denominator used to calculate z- score in the directional lifting, signalled for submesh with submesh ID mdu submesh idf tilelD ][ patchldx ].
[0142] Lifting offset and directional lifting disabled for 3-d displacement is now described. Lifting offset tool and directional lifting transform could be extended to 3 dimensional but currently are applicable only when displacement is 1 -dimensional. Therefore, the aforementioned tools inability should be checked at an ASPS level as follows:asps_vdmc_extension( ) {asve_subdivision_iteration_countAspsSubdivisionCount = asve_subdivision_iteration_countiff AspsSubdivisionCount > 1 ) {asve_lod_adaptive_subdivision_flag}asve_edge_based_subdivision_flagfor( i=0; i < AspsSubdivisionCount; i++) {iff asve_lod_adaptive_subdivision_flag == 1 || i == 0 ) {asve_subdivision_method[ i ]} else {asve_subdivision_method[ i ] = asve_subdivision_method
[0000] }AspsSubdivisionMethodf i ] = asve_subdivision_method[ i ]}1616-614WO01Qualcomm Ref. No. 2502081 WO 89 / 114if( asve_edge_based_subdivision_flag == 1 ) { asve_subdivision_min_edge_lengthAspsSubdivisionMinEdgeLength = asve_subdivision_min_edge_length} else {AspsSubdivisionMinEdgeLength = 0}asve_1d_displacement_flagasve_interpolate_subdivided_normals_flag asve_displacement_reference_qp_minus49 asve_quantization_parameters_present_flagif( asve_quantization_parameters_present_flag ) { asve_inverse_quantization_offset_present_flag vdmc_quantization_parameters( 0, AspsSubdivisionCount, 0)}if( AspsSubdivisionCount!= 0 ) {asve_transform_methodAspsTransformMethod = asve_transform_method}if(asve_1d_displacement_flag){asve_lifting_offset_present_flagasve_directional_lifting_present_flag}<add> if( asve_transform_method == LI NEARJJ FTI NG && AspsSubdivisionCount!= 0 ) { vdmc_lifting_transform_parameters( 0, AspsSubdivisionCount )} < / add>asve_atribute_information_present_flagif( asve_attribute_information_present_flag ) { asve_consistent_atribute_frame_flag if(!asve_consistent_attribute_frame_flag) { asve_atribute_frame_size_count}for(i=0; i< AspsAttributeNominalFrameSizeCount; i++){1616-614WO01Qualcomm Ref. No. 2502081 WO 90 / 114asve_atribute_frame_width[ i ]asve_atribute_frame_height[ i ]asve_atribute_subtexture_enabled_flag[ i ]}}asve_displacement_id_present_flagasve_lod_patches_enable_flagasve_packing_methodasve_projection_texcoord_enable_flagif( asve_projection_texcoord_enable_flag ){ asve_projection_texcoord_mapping_atribute_index_present_flagif( asve_projection_texcoord_mapping_attribute_index_present_flag ) { asve_projection_texcoord_mapping_atribute_index}asve_projection_texcoord_output_bit_depth_minus1 asve_projection_texcoord_bbox_bias_enable_flag asve_projection_texcoord_upscale_factor_minus1 asve_projection_texcoord_log2_downscale_factor asve_projection_raw_textcoord_present_flagif( asve_projection_raw_textcoord_present_flag ) asve_projection_raw_textcoord_bitdepth_minus1}asve_vdmc_vui_parameters_present_flagif( asve_vdmc_vui_parameters_present_flag )vdmc_vui_parameters( )}
[0143] FIG. 13 is a flowchart illustrating an example process for encoding a mesh. Although described with respect to V-DMC encoder 200 (FIGS. 1 and 2), it should be understood that other devices may be configured to perform a process similar to that of FIG. 13.
[0144] In the example of FIG. 13, V-DMC encoder 200 receives an input mesh (1302). V-DMC encoder 200 determines a base mesh based on the input mesh (1304). V-DMC 1616-614WO01Qualcomm Ref. No. 2502081 WO 91 / 114encoder 200 determines a set of displacement vectors based on the input mesh and the base mesh (1306). V-DMC encoder 200 outputs an encoded bitstream that includes an encoded representation of the base mesh and an encoded representation of the displacement vectors (1308). V-DMC encoder 200 may additionally determine attribute values from the input mesh and include an encoded representation of the attribute values vectors in the encoded bitstream.
[0145] FIG. 14 is a flowchart illustrating an example process for decoding a compressed bitstream of mesh data. Although described with respect to V-DMC decoder 300 (FIGS.1 and 3), it should be understood that other devices may be configured to perform a process similar to that of FIG. 14.
[0146] In the example of FIG. 14, V-DMC decoder 300 determines, based on the encoded mesh data, a base mesh (1402). V-DMC decoder 300 determines, based on the encoded mesh data, one or more displacement vectors (1404). V-DMC decoder 300 deforms the base mesh using the one or more displacement vectors (1406). For example, the base mesh may have a first set of vertices, and V-DMC decoder 300 may subdivide the base mesh to determine an additional set of vertices for the base mesh. To deform the base mesh, V-DMC decoder 300 may modify the locations of the additional set of vertices based on the one or more displacement vectors. V-DMC decoder 300 outputs a decoded mesh based on the deformed mesh (1408). V-DMC decoder 300 may, for example, output the decoded mesh for storage, transmission, or display.
[0147] FIG. 15 is a flowchart illustrating an example process for encoding a mesh. Although described with respect to V-DMC encoder 200, processing circuitry of other devices may be configured to perform the techniques of this disclosure.
[0148] V-DMC encoder 200 performs a plurality of forward directional lifting transforms on a displacement vector for a target vertex of a base mesh using different scale values to determine a first scale value, a second scale value, and a third scale value (1502). In some examples, V-DMC encoder 200 may perform a rate-distortion optimization (RDO) process to select optimal values for the first scale value (e.g., scalel), the second scale value (e.g., scale2), and the third scale value (e.g., scale3) from a set of candidate values. The performance of the directional lifting transform may be sensitive to these thresholds, and determining optimal scales at the encoder allows for improved coding efficiency compared to using hard-coded thresholds at the decoder.
[0149] V-DMC encoder 200 determines a delta scale value based on the first scale value, the second scale value, and the third scale value (1504). To reduce metadata overhead, V- 1616-614WO01Qualcomm Ref. No. 2502081 WO 92 / 114DMC encoder 200 may determine a single parameter, the delta scale value (e.g., Δscale), that relates the three scale values. For example, V-DMC encoder 200 may determine the delta scale value such that the first scale value equals one minus the delta scale value (scale1 = 1 − Δscale). V-DMC encoder 200 may further confirm that the second scale value satisfies a relationship based on the first scale value and the delta scale value, such as scale2 = scale1 + (Δscale / 2). V-DMC encoder 200 may also confirm that the third scale value satisfies a relationship based on the second scale value, such as scale3 = scale2 + (Δscale / 3), scale3 = scale2 + (Δscale / 2), or scale3 = 1.
[0150] V-DMC encoder 200 determines a base value based on the delta scale value (1508) and determines an exponent value based on the delta scale value (1510). Rather than signaling the full floating-point values for the scales, V-DMC encoder 200 calculates a base value (e.g., base) and an exponent value (e.g., exp) that represent the delta scale value. In some examples, V-DMC encoder 200 determines these values according to the relationship: Δscale = base + 10−exp. This representation allows V-DMC encoder 200 to signal the performance-sensitive thresholds efficiently using integer syntax elements.
[0151] V-DMC encoder 200 performs a forward directional lifting transform on the displacement vector for the target vertex of the base mesh based on one or more of the first scale value, the second scale value, or the third scale value to determine one or more transform coefficients (1514). V-DMC encoder 200 may utilize the selected scale values to adapt prediction and update weights used in the lifting transform. In some examples, V-DMC encoder 200 simplifies the calculation of these weights to avoid computationally expensive operations. For instance, V-DMC encoder 200 may calculate an update scale (Uscale) as k2− 1 and a prediction scale (Pscale) as k1− 1, where k represents the selected scale value (e.g., scalel, scale2, or scale3). This simplification avoids two-step calculations involving multiple hard-coded constants found in other approaches.
[0152] V-DMC encoder 200 may selects the specific scale value (fc) to apply to a given target vertex by calculating a deviation value (e.g., a Z-score numerator) and comparing the deviation value to a standard deviation associated with the mesh patch. V-DMC encoder 200 may simplify this comparison by comparing the absolute difference between the signal and the mean directly to multiples of the standard deviation (e.g., 1σ, 2σ), thereby avoiding a division operation for a Z-score calculation. V-DMC encoder 200 encodes the one or more transform coefficients to determine encoded transform coefficients (1516).1616-614WO01Qualcomm Ref. No. 2502081 WO 93 / 114
[0153] V-DMC encoder 200 generates the bitstream of encoded mesh data (1518). The bitstream includes a first syntax element indicating the base value (e.g., vltp directional lifting scale base) and a second syntax element indicating the exponent value (e.g., vltp directional lifting scale exp). The bitstream additionally includes syntax elements indicating the encoded transform coefficients. By signaling the base and exponent, V-DMC encoder 200 enables a decoder to reconstruct the delta scale value and subsequently derive the first, second, and third scale values required to inverse the directional lifting process.
[0154] FIG. 16 is a flowchart illustrating an example process for decoding a compressed bitstream of mesh data. Although described with respect to V-DMC decoder 300 (FIGS.1 and 3), processing circuitry of other devices may be configured to perform the process of FIG. 16.
[0155] In the example of FIG. 16, V-DMC decoder 300 receives, in the bitstream of encoded mesh data, a first syntax element indicating a base value (1602). V-DMC decoder 300 also receives, in the bitstream of encoded mesh data, a second syntax element indicating an exponent value (1604). These syntax elements may be received in a lifting transform parameter set, such as part of an Atlas Sequence Parameter Set (ASPS) or a mesh patch data unit. For example, the first syntax element may correspond to vltp directional lifting scale base, and the second syntax element may correspond to vltp directional lifting scale exp.
[0156] V-DMC decoder 300 determines a delta scale value based on the base value and the exponent value (1606). In some examples, V-DMC decoder 300 determines the delta scale value (e.g., Ascale) as follows: Δscale = base + 10−exp, where base represents the base value and exp represents the exponent value.
[0157] V-DMC decoder 300 determines a first scale value, a second scale value, and a third scale value based on the delta scale value. V-DMC decoder 300 may determine the first scale value (scalel) such that scalel equals 1 minus the delta scale value (scalel = 1 - Ascale). V-DMC decoder 300 may determine the second scale value (scale2) such that scale2 equals the first scale value plus half of the delta scale value (scale2 = scalel + Ascale / 2). V-DMC decoder 300 may determine the third scale value (scale3) such that scale3 equals the second scale value plus a fraction of the delta scale value (e.g., scale3 = scale2 + Ascale / 2 or scale3 = scale2 + Ascale / 3).
[0158] V-DMC decoder 300 performs an inverse directional lifting transform to determine a displacement vector for a target vertex of a base mesh based on one or more 1616-614WO01Qualcomm Ref. No. 2502081 WO 94 / 114of the first scale value, the second scale value, or the third scale value determined based on the delta scale value (1608). To perform the inverse directional lifting transform, V-DMC decoder 300 may determine a wavelet coefficient of the target vertex. Determining the wavelet coefficient may include demultiplexing a displacement sub-bitstream from the bitstream of encoded mesh data, decoding the displacement sub-bitstream to generate quantized wavelet coefficients, and applying inverse quantization to the quantized wavelet coefficients to determine the wavelet coefficient of the target vertex.
[0159] To apply the transform, V-DMC decoder 300 determines a deviation value for the wavelet coefficient of the target vertex based on a mean value associated with a mesh patch. Determining the deviation value may include determining an absolute difference between a first component of the wavelet coefficient of the target vertex and the mean value. V-DMC decoder 300 selects one of the first scale value, the second scale value, or the third scale value as a selected scale value based on a comparison of the deviation value to a standard deviation value associated with the mesh patch. For example, V-DMC decoder 300 may select the first scale value if the deviation value is less than the standard deviation value, select the second scale value if the deviation value is less than two times the standard deviation value, and select the third scale value otherwise. V-DMC decoder 300 applies the inverse directional lifting transform to the wavelet coefficient based on the selected scale value to determine the displacement vector.
[0160] V-DMC decoder 300 determines a coherence of the target vertex with respect to a first neighboring vertex and a second neighboring vertex. Determining the coherence may include comparing a first component of the first neighboring vertex to a first component of the second neighboring vertex. V-DMC decoder 300 determines an adaptive weight based on the selected scale value.
[0161] In a prediction step of the inverse directional lifting transform, V-DMC decoder 300 applies the adaptive weight to modify a contribution to the prediction step of one of the first neighboring vertex or the second neighboring vertex based on the coherence. V-DMC decoder 300 selects one of the first neighboring vertex or the second neighboring vertex as a selected neighboring vertex based on the coherence. V-DMC decoder 300 determines a weighted value based on multiplying a wavelet coefficient of the selected neighboring vertex with the adaptive weight and adds the weighted value to the wavelet coefficient of the target vertex.
[0162] In an update step of the inverse directional lifting transform, V-DMC decoder 300 applies the adaptive weight to modify a contribution to the update step of one of the first 1616-614WO01Qualcomm Ref. No. 2502081 WO 95 / 114neighboring vertex or the second neighboring vertex based on the coherence. V-DMC decoder 300 selects one of the first neighboring vertex or the second neighboring vertex as a selected neighboring vertex based on the coherence. V-DMC decoder 300 determines a weighted value based on multiplying a wavelet coefficient of the target vertex with the adaptive weight and subtracts the weighted value from a wavelet coefficient of the selected neighboring vertex.
[0163] V-DMC decoder 300 deforms the base mesh based on the displacement vector to determine a deformed base mesh (1610). V-DMC decoder 300 determines a decoded mesh based on the deformed base mesh (1612). V-DMC decoder 300 may further determine attribute values for vertices of the decoded mesh. V-DMC decoder 300 may cause a display to present imagery based on the decoded mesh.
[0164] Clause 1 A: A device for decoding encoded mesh data, the device comprising: one or more memory units; one or more processing units implemented in circuitry, coupled to the one or more memory units, and configured to: determine, based on the encoded mesh data, a base mesh with a first set of vertices; subdivide the base mesh to determine an additional set of vertices for the base mesh; determine one or more displacement vectors according to any technique of this disclosure; deform the base mesh, wherein to deform the base mesh, the one or more processing units are configured to modify locations of the additional set of vertices based on the one or more displacement vectors; and determine a decoded mesh based on the deformed base mesh.
[0165] Clause 2 A. The device of clause 1 A, wherein the one or more processing units are further configured to determine attribute values for vertices of the decoded mesh.
[0166] Clause 3 A. A device for encoding encoded mesh data, the device comprising: one or more memory units; and one or more processing units implemented in circuitry, coupled to the one or more memory units, and configured to: receive an input mesh; determine a base mesh based on the input mesh; determine a set of displacement vectors based on the input mesh and the base mesh according to any technique of this disclosure; and output an encoded bitstream that includes an encoded representation of the base mesh and an encoded representation of the displacement vectors according to any technique of this disclosure.
[0167] Clause 4A. The device of clause 3 A, wherein the one or more processing units are further configured to determine a set of attribute values for the input mesh and include an encoded representation of the attribute values in the encoded bitstream.1616-614WO01Qualcomm Ref. No. 2502081 WO 96 / 114
[0168] Clause 5 A. A method of decoding encoded mesh data, the method comprising: determining, based on the encoded mesh data, a base mesh with a first set of vertices; subdividing the base mesh to determine an additional set of vertices for the base mesh; determining one or more displacement vectors according to any technique of this disclosure; deforming the base mesh, wherein deforming the base mesh comprising modifying locations of the additional set of vertices based on the one or more displacement vectors; and determining a decoded mesh based on the deformed base mesh.
[0169] Clause 6A. The method of clause 5A, further comprising determining attribute values for vertices of the decoded mesh.
[0170] Clause 7A. A method of encoding encoded mesh data, the method comprising: receiving an input mesh; determining a base mesh based on the input mesh; determining a set of displacement vectors based on the input mesh and the base mesh according to any technique of this disclosure; and outputting an encoded bitstream that includes an encoded representation of the base mesh and an encoded representation of the displacement vectors according to any technique of this disclosure.
[0171] Clause 8A. The method of clause 7A, further comprising determining a set of attribute values for the input mesh and include an encoded representation of the attribute values in the encoded bitstream.
[0172] Clause 9A. Computer-readable storage media storing instructions thereon that when executed cause one or more processors to perform the method of any of clauses 5A-8A.
[0173] Clause IB: A device for decoding a bitstream of encoded mesh data, the device comprising: one or more memory units; one or more processing units implemented in circuitry, coupled to the one or more memory units, and configured to: receive, in the bitstream of encoded mesh data, a first syntax element indicating a base value; receive, in the bitstream of encoded mesh data, a second syntax element indicating an exponent value; determine a delta scale value based on the base value and the exponent value; perform an inverse directional lifting transform to determine a displacement vector for a target vertex of a base mesh based on one or more of a first scale value, a second scale value, or a third scale value determined based on the delta scale value; deform the base mesh based on the displacement vector to determine a deformed base mesh; and determine a decoded mesh based on the deformed base mesh.
[0174] Clause 2B: The device of clause IB, wherein the one or more processing units are configured to: determine a deviation value for a wavelet coefficient of the target vertex 1616-614WO01Qualcomm Ref. No. 2502081 WO 97 / 114based on a mean value associated with a mesh patch; and select one of the first scale value, the second scale value, or the third scale value as a selected scale value based on a comparison of the deviation value to a standard deviation value associated with the mesh patch, wherein to perform the inverse directional lifting transform, the one or more processing units are configured to apply the inverse directional lifting transform to the wavelet coefficient based on the selected scale value to determine the displacement vector for the target vertex of the base m esh.
[0175] Clause 3B: The device of clause 2B, wherein to apply the inverse directional lifting transform to the wavelet coefficient based on the selected scale value, the one or more processing units are configured to: determine a coherence of the target vertex with respect to a first neighboring vertex and a second neighboring vertex; determine an adaptive weight based on the selected scale value; and apply the adaptive weight to a prediction step of the inverse directional lifting transform to modify a contribution to the prediction step of one of the first neighboring vertex or the second neighboring vertex based on the coherence.
[0176] Clause 4B: The device of clause 3B, wherein to apply the adaptive weight to the prediction step of the inverse directional lifting transform, the one or more processing units are configured to: select one of the first neighboring vertex or the second neighboring vertex as a selected neighboring vertex based on the coherence; determine a weighted value based on multiplying a wavelet coefficient of the selected neighboring vertex with the adaptive weight; and add the weighted value to the wavelet coefficient of the target vertex.
[0177] Clause 5B: The device of clause 2B, wherein to apply the inverse directional lifting transform to the wavelet coefficient based on the selected scale value, the one or more processing units are configured to: determine a coherence of the target vertex with respect to a first neighboring vertex and a second neighboring vertex; determine an adaptive weight based on the selected scale value; and apply the adaptive weight to an update step of the inverse directional lifting transform to modify a contribution to the update step of one of the first neighboring vertex or the second neighboring vertex based on the coherence.
[0178] Clause 6B: The device of clause 5B, wherein to apply the adaptive weight to the update step of the inverse directional lifting transform, the one or more processing units are configured to: select one of the first neighboring vertex or the second neighboring vertex as a selected neighboring vertex based on the coherence; determine a weighted 1616-614WO01Qualcomm Ref. No. 2502081 WO 98 / 114value based on multiplying a wavelet coefficient of the target vertex with the adaptive weight; and subtract the weighted value from a wavelet coefficient of the selected neighboring vertex.
[0179] Clause 7B: The device of any of clauses 2B-6B, wherein the one or more processing units are further configured to determine the wavelet coefficient of the target vertex by: demultiplexing a displacement sub-bitstream from the bitstream of encoded mesh data; decoding the displacement sub-bitstream to generate quantized wavelet coefficients; and applying inverse quantization to the quantized wavelet coefficients to determine the wavelet coefficient of the target vertex.
[0180] Clause 8B: The device of any of clauses 2B-7B, wherein to determine the deviation value for the wavelet coefficient of the target vertex, the one or more processing units are configured to determine an absolute difference between a first component of the wavelet coefficient of the target vertex and the mean value associated with the mesh patch.
[0181] Clause 9B: The device of any of clauses 1B-8B, wherein to determine the delta scale value based on the base value and the exponent value, the one or more processing units are configured to determine the delta scale value as follows: Δscale = base + 10−exp, wherein Ascale equals the delta scale value, base equals the base value, and exp equals the exponent value.
[0182] Clause 10B: The device of any of clauses 1B-9B, wherein to determine the first scale value based on the delta scale value, the one or more processing units are configured to determine the first scale value as follows: scale1 = 1 - Δscale wherein scale1 equals the first scale value.
[0183] Clause 11B: The device of any of clauses 1B-10B, wherein to determine the second scale value based on the delta scale value, the one or more processing units are configured to determine the second scale value as follows: scale2 = scale1 +Δscale / 2wherein scale2 equals the second scale value.
[0184] Clause 12B: The device of clause 11B, wherein to determine the third scale value based on the delta scale value, the one or more processing units are configured to determine the third scale value as follows: scale3 = scale2 +Δscale / xwherein scale3 equals the third scale value and x equals one of 2 or 3.
[0185] Clause 13B: The device of any of clauses 1B-12B, further comprising a display to present imagery based on the decoded mesh.1616-614WO01Qualcomm Ref. No. 2502081 WO 99 / 114
[0186] Clause 14B: A method of decoding a bitstream of encoded mesh data, the method comprising: receiving, in the bitstream of encoded mesh data, a first syntax element indicating a base value; receiving, in the bitstream of encoded mesh data, a second syntax element indicating an exponent value; determining a delta scale value based on the base value and the exponent value; performing an inverse directional lifting transform to determine a displacement vector for a target vertex of a base mesh based on one or more of a first scale value, a second scale value, or a third scale value determined based on the delta scale value; deforming the base mesh based on the displacement vector to determine a deformed base mesh; and determining a decoded mesh based on the deformed base mesh.
[0187] Clause 15B: The method of clause 14B, further comprising: determining a deviation value for a wavelet coefficient of the target vertex based on a mean value associated with a mesh patch; and selecting one of the first scale value, the second scale value, or the third scale value as a selected scale value based on a comparison of the deviation value to a standard deviation value associated with the mesh patch, wherein performing the inverse directional lifting transform comprises applying the inverse directional lifting transform to the wavelet coefficient based on the selected scale value to determine the displacement vector for the target vertex of the base mesh.
[0188] Clause 16B: The method of clause 15B, wherein applying the inverse directional lifting transform to the wavelet coefficient based on the selected scale value comprises: determining a coherence of the target vertex with respect to a first neighboring vertex and a second neighboring vertex; determining an adaptive weight based on the selected scale value; and applying the adaptive weight to a prediction step of the inverse directional lifting transform to modify a contribution to the prediction step of one of the first neighboring vertex or the second neighboring vertex based on the coherence.
[0189] Clause 17B: The method of clause 16B, wherein applying the adaptive weight to the prediction step of the inverse directional lifting transform comprises: selecting one of the first neighboring vertex or the second neighboring vertex as a selected neighboring vertex based on the coherence; determining a weighted value based on multiplying a wavelet coefficient of the selected neighboring vertex with the adaptive weight; and adding the weighted value to the wavelet coefficient of the target vertex.
[0190] Clause 18B: The method of clause 15B, wherein applying the inverse directional lifting transform to the wavelet coefficient based on the selected scale value comprises: determining a coherence of the target vertex with respect to a first neighboring vertex and 1616-614WO01Qualcomm Ref. No. 2502081 WO 100 / 114a second neighboring vertex; determining an adaptive weight based on the selected scale value; and applying the adaptive weight to an update step of the inverse directional lifting transform to modify a contribution to the update step of one of the first neighboring vertex or the second neighboring vertex based on the coherence.
[0191] Clause 19B: The method of clause 18B, wherein applying the adaptive weight to the update step of the inverse directional lifting transform comprises: selecting one of the first neighboring vertex or the second neighboring vertex as a selected neighboring vertex based on the coherence; determining a weighted value based on multiplying a wavelet coefficient of the target vertex with the adaptive weight; and subtracting the weighted value from a wavelet coefficient of the selected neighboring vertex.
[0192] Clause 20B: The method of any of clauses 15B-19B, further comprising determining the wavelet coefficient of the target vertex by: demultiplexing a displacement sub-bitstream from the bitstream of encoded mesh data; decoding the displacement subbitstream to generate quantized wavelet coefficients; and applying inverse quantization to the quantized wavelet coefficients to determine the wavelet coefficient of the target vertex.
[0193] Clause 2 IB: The method of any of clauses 15B-20B, wherein determining the deviation value for the wavelet coefficient of the target vertex comprises determining an absolute difference between a first component of the wavelet coefficient of the target vertex and the mean value associated with the mesh patch.
[0194] Clause 22B: The method of any of clauses 14B-20B, wherein determining the delta scale value based on the base value and the exponent value comprises determining the delta scale value as follows: Δscale = base + 10−exp, wherein Ascale equals the delta scale value, base equals the base value, and exp equals the exponent value.
[0195] Clause 23B: The method of any of clauses 14B-22B, wherein determining the first scale value based on the delta scale value comprises determining the first scale value as follows: scale1 = 1 - Δscale wherein scale1 equals the first scale value.
[0196] Clause 24B: The method of clause 23B, wherein determining the second scale value based on the delta scale value comprises determining the second scale value as follows: scale2 = scale1 +Δscale / 2wherein scale2 equals the second scale value.
[0197] Clause 25B: The method of clause 24B, wherein determining the third scale value based on the delta scale value comprises determining the third scale value as follows:1616-614WO01Qualcomm Ref. No. 2502081 WO 101 / 114scaled = scale2 + — - —, wherein scale3 equals the third scale value and x equals oneof 2 or 3.
[0198] Clause 26B: A non-transitory computer-readable medium storing instructions that, when executed by processing circuitry, cause the processing circuitry to: receive, in a bitstream of encoded mesh data, a first syntax element indicating a base value; receive, in the bitstream of encoded mesh data, a second syntax element indicating an exponent value; determine a delta scale value based on the base value and the exponent value; perform an inverse directional lifting transform to determine a displacement vector for a target vertex of a base mesh based on one or more of a first scale value, a second scale value, or a third scale value determined based on the delta scale value; deform the base mesh based on the displacement vector to determine a deformed base mesh; and determine a decoded mesh based on the deformed base mesh.
[0199] Clause 27B: The non-transitory computer-readable medium of clause 26B, wherein to determine the displacement vector based on the first scale value, the second scale value, and the third scale value, the processing circuitry is further configured to: determine a deviation value for a wavelet coefficient of the target vertex based on a mean value associated with a mesh patch; select one of the first scale value, the second scale value, or the third scale value as a selected scale value based on a comparison of the deviation value to a standard deviation value associated with the mesh patch; and apply the inverse directional lifting transform to the wavelet coefficient based on the selected scale value, wherein to apply the inverse directional lifting transform to the wavelet coefficient based on the selected scale value, the processing circuitry is further configured to: determine a coherence of the target vertex with respect to a first neighboring vertex and a second neighboring vertex; determine an adaptive weight based on the selected scale value; and apply the adaptive weight to a prediction step of the inverse directional lifting transform to modify a contribution from one of the first neighboring vertex or the second neighboring vertex based on the coherence.
[0200] Clause 28B: The non-transitory computer-readable medium of clause 27B, wherein to determine the delta scale value based on the base value and the exponent value, determine the first scale value based on the delta scale value, determine the second scale value based on the delta scale value, determine the third scale value based on the delta scale value, the processing circuitry is further configured to determine the delta scale value, the first scale value, the second scale value, and the third scale value as follows:1616-614WO01Qualcomm Ref. No. 2502081 WO 102 / 114Ascale = base +lo'exp, wherein Ascale equals the delta scale value, base equals the base value, and exp equals the exponent value; scale1 = 1 - Δscale, wherein scalel equals the first scale value; scale2 = scale1 +Δscale / 2wherein scale2 equals the second scale value; and scale3 = scale2 +&sc^lleiwherein scale3 equals the third scale value, and x equals one of 2 or 3.
[0201] Clause 29B: A device for generating a bitstream of encoded mesh data, the device comprising: one or more memory units; one or more processing units implemented in circuitry, coupled to the one or more memory units, and configured to: perform a plurality of forward directional lifting transforms on a displacement vector for a target vertex of a base mesh using different scale values to determine a first scale value, a second scale value, and a third scale value; determine a delta scale value based on the first scale value, the second scale value, and the third scale value; determine a base value based on the delta scale value; determine an exponent value based on the delta scale value; perform a forward directional lifting transform on the displacement vector for the target vertex of the base mesh based on one or more of the first scale value, the second scale value, or the third scale value to determine one or more transform coefficients; encode the one or more transform coefficients to determine encoded transform coefficients; and generate the bitstream of encoded mesh data, the bitstream comprising a first syntax element indicating the base value, a second syntax element indicating the exponent value, and additionally syntax elements indicating the encoded transform coefficients.
[0202] Clause 30B: The device of clause 29B, wherein to determine the delta scale value based on the first scale value, the second scale value, and the third scale value, the one or more processing units are configured to determine the delta scale value in accordance with the following: Δscale = base + 10−exp, wherein Ascale equals the delta scale value, base equals the base value, and exp equals the exponent value; scale1 = 1 - Δscale, wherein scalel equals the first scale value; scale2 = scale1 +Δscale / 2wherein scale2 equals the second scale value; and scale3 = scale2 + ^sc^letwherein scale3 equals the third scale value, and x equals one of 2 or 3.
[0203] It is to be recognized that depending on the example, certain acts or events of any of the techniques described herein can be performed in a different sequence, may be added, merged, or left out altogether (e.g., not all described acts or events are necessary for the practice of the techniques). Moreover, in certain examples, acts or events may be1616-614WO01Qualcomm Ref. No. 2502081 WO 103 / 114performed concurrently, e.g., through multi-threaded processing, interrupt processing, or multiple processors, rather than sequentially.
[0204] In one or more examples, the functions described may be implemented in hardware, software, firmware, or any combination thereof. If implemented in software, the functions may be stored on or transmitted over as one or more instructions or code on a computer-readable medium and executed by a hardware-based processing unit. Computer-readable media may include computer-readable storage media, which corresponds to a tangible medium such as data storage media, or communication media including any medium that facilitates transfer of a computer program from one place to another, e.g., according to a communication protocol. In this manner, computer-readable media generally may correspond to (1) tangible computer-readable storage media which is non-transitory or (2) a communication medium such as a signal or carrier wave. Data storage media may be any available media that can be accessed by one or more computers or one or more processors to retrieve instructions, code and / or data structures for implementation of the techniques described in this disclosure. A computer program product may include a computer-readable medium.
[0205] By way of example, and not limitation, such computer-readable storage media can comprise RAM, ROM, EEPROM, CD-ROM or other optical disk storage, magnetic disk storage, or other magnetic storage devices, flash memory, or any other medium that can be used to store desired program code in the form of instructions or data structures and that can be accessed by a computer. Also, any connection is properly termed a computer-readable medium. For example, if instructions are transmitted from a website, server, or other remote source using a coaxial cable, fiber optic cable, twisted pair, digital subscriber line (DSL), or wireless technologies such as infrared, radio, and microwave, then the coaxial cable, fiber optic cable, twisted pair, DSL, or wireless technologies such as infrared, radio, and microwave are included in the definition of medium. It should be understood, however, that computer-readable storage media and data storage media do not include connections, carrier waves, signals, or other transitory media, but are instead directed to non-transitory, tangible storage media. Disk and disc, as used herein, includes compact disc (CD), laser disc, optical disc, digital versatile disc (DVD), floppy disk and Blu-ray disc, where disks usually reproduce data magnetically, while discs reproduce data optically with lasers. Combinations of the above should also be included within the scope of computer-readable media.1616-614WO01Qualcomm Ref. No. 2502081 WO 104 / 114
[0206] Instructions may be executed by one or more processors, such as one or more digital signal processors (DSPs), general purpose microprocessors, application specific integrated circuits (ASICs), field programmable gate arrays (FPGAs), or other equivalent integrated or discrete logic circuitry. Accordingly, the terms “processor” and “processing circuitry,” as used herein may refer to any of the foregoing structures or any other structure suitable for implementation of the techniques described herein. In addition, in some aspects, the functionality described herein may be provided within dedicated hardware and / or software modules configured for encoding and decoding, or incorporated in a combined codec. Also, the techniques could be fully implemented in one or more circuits or logic elements.
[0207] The techniques of this disclosure may be implemented in a wide variety of devices or apparatuses, including a wireless handset, an integrated circuit (IC) or a set of ICs (e.g., a chip set). Various components, modules, or units are described in this disclosure to emphasize functional aspects of devices configured to perform the disclosed techniques, but do not necessarily require realization by different hardware units. Rather, as described above, various units may be combined in a codec hardware unit or provided by a collection of interoperative hardware units, including one or more processors as described above, in conjunction with suitable software and / or firmware.
[0208] Various examples have been described. These and other examples are within the scope of the following claims.1616-614WO01
Claims
Qualcomm Ref. No. 2502081 WO 105 / 114WHAT IS CLAIMED IS:
1. A device for decoding a bitstream of encoded mesh data, the device comprising:one or more memory units;one or more processing units implemented in circuitry, coupled to the one or more memory units, and configured to:receive, in the bitstream of encoded mesh data, a first syntax element indicating a base value;receive, in the bitstream of encoded mesh data, a second syntax element indicating an exponent value;determine a delta scale value based on the base value and the exponent value;perform an inverse directional lifting transform to determine a displacement vector for a target vertex of a base mesh based on one or more of a first scale value, a second scale value, or a third scale value determined based on the delta scale value;deform the base mesh based on the displacement vector to determine a deformed base mesh; anddetermine a decoded mesh based on the deformed base mesh.
2. The device of claim 1, wherein the one or more processing units are configured to:determine a deviation value for a wavelet coefficient of the target vertex based on a mean value associated with a mesh patch; andselect one of the first scale value, the second scale value, or the third scale value as a selected scale value based on a comparison of the deviation value to a standard deviation value associated with the mesh patch,wherein to perform the inverse directional lifting transform, the one or more processing units are configured to apply the inverse directional lifting transform to the wavelet coefficient based on the selected scale value to determine the displacement vector for the target vertex of the base mesh.1616-614WO01Qualcomm Ref. No. 2502081 WO 106 / 1143. The device of claim 2, wherein to apply the inverse directional lifting transform to the wavelet coefficient based on the selected scale value, the one or more processing units are configured to:determine a coherence of the target vertex with respect to a first neighboring vertex and a second neighboring vertex;determine an adaptive weight based on the selected scale value; andapply the adaptive weight to a prediction step of the inverse directional lifting transform to modify a contribution to the prediction step of one of the first neighboring vertex or the second neighboring vertex based on the coherence.
4. The device of claim 3, wherein to apply the adaptive weight to the prediction step of the inverse directional lifting transform, the one or more processing units are configured to:select one of the first neighboring vertex or the second neighboring vertex as a selected neighboring vertex based on the coherence;determine a weighted value based on multiplying a wavelet coefficient of the selected neighboring vertex with the adaptive weight; andadd the weighted value to the wavelet coefficient of the target vertex.
5. The device of claim 2, wherein to apply the inverse directional lifting transform to the wavelet coefficient based on the selected scale value, the one or more processing units are configured to:determine a coherence of the target vertex with respect to a first neighboring vertex and a second neighboring vertex;determine an adaptive weight based on the selected scale value; andapply the adaptive weight to an update step of the inverse directional lifting transform to modify a contribution to the update step of one of the first neighboring vertex or the second neighboring vertex based on the coherence.1616-614WO01Qualcomm Ref. No. 2502081 WO 107 / 1146. The device of claim 5, wherein to apply the adaptive weight to the update step of the inverse directional lifting transform, the one or more processing units are configured to:select one of the first neighboring vertex or the second neighboring vertex as a selected neighboring vertex based on the coherence;determine a weighted value based on multiplying a wavelet coefficient of the target vertex with the adaptive weight; andsubtract the weighted value from a wavelet coefficient of the selected neighboring vertex.
7. The device of claim 2, wherein the one or more processing units are further configured to determine the wavelet coefficient of the target vertex by:demultiplexing a displacement sub-bitstream from the bitstream of encoded mesh data;decoding the displacement sub-bitstream to generate quantized wavelet coefficients; andapplying inverse quantization to the quantized wavelet coefficients to determine the wavelet coefficient of the target vertex.
8. The device of claim 2, wherein to determine the deviation value for the wavelet coefficient of the target vertex, the one or more processing units are configured to determine an absolute difference between a first component of the wavelet coefficient of the target vertex and the mean value associated with the mesh patch.
9. The device of claim 1, wherein to determine the delta scale value based on the base value and the exponent value, the one or more processing units are configured to determine the delta scale value as follows:Δscale = base + 10−exp, wherein Ascale equals the delta scale value, base equals the base value, and exp equals the exponent value.
10. The device of claim 1, wherein to determine the first scale value based on the delta scale value, the one or more processing units are configured to determine the first scale value as follows:scale1 = 1 - Δscale wherein scale1 equals the first scale value.1616-614WO01Qualcomm Ref. No. 2502081 WO 108 / 11411. The device of claim 10, wherein to determine the second scale value based on the delta scale value, the one or more processing units are configured to determine the second scale value as follows:. „.. scale..... < < < scalez = scale 1 + — - —, wherein scalez equals the second scale value.
12. The device of claim 11, wherein to determine the third scale value based on the delta scale value, the one or more processing units are configured to determine the third scale value as follows:scale3 = scale2 + Δscale / x, wherein scale3 equals the third scale value and xequals one of 2 or 3.
13. The device of claim 1, further comprising a display to present imagery based on the decoded mesh.
14. A method of decoding a bitstream of encoded mesh data, the method comprising:receiving, in the bitstream of encoded mesh data, a first syntax element indicating a base value;receiving, in the bitstream of encoded mesh data, a second syntax element indicating an exponent value;determining a delta scale value based on the base value and the exponent value; performing an inverse directional lifting transform to determine a displacement vector for a target vertex of a base mesh based on one or more of a first scale value, a second scale value, or a third scale value determined based on the delta scale value; deforming the base mesh based on the displacement vector to determine a deformed base mesh; anddetermining a decoded mesh based on the deformed base mesh.
15. The method of claim 14, further comprising:determining a deviation value for a wavelet coefficient of the target vertex based on a mean value associated with a mesh patch; and1616-614WO01Qualcomm Ref. No. 2502081 WO 109 / 114selecting one of the first scale value, the second scale value, or the third scale value as a selected scale value based on a comparison of the deviation value to a standard deviation value associated with the mesh patch,wherein performing the inverse directional lifting transform comprises applying the inverse directional lifting transform to the wavelet coefficient based on the selected scale value to determine the displacement vector for the target vertex of the base mesh.
16. The method of claim 15, wherein applying the inverse directional lifting transform to the wavelet coefficient based on the selected scale value comprises:determining a coherence of the target vertex with respect to a first neighboring vertex and a second neighboring vertex;determining an adaptive weight based on the selected scale value; and applying the adaptive weight to a prediction step of the inverse directional lifting transform to modify a contribution to the prediction step of one of the first neighboring vertex or the second neighboring vertex based on the coherence.
17. The method of claim 16, wherein applying the adaptive weight to the prediction step of the inverse directional lifting transform comprises:selecting one of the first neighboring vertex or the second neighboring vertex as a selected neighboring vertex based on the coherence;determining a weighted value based on multiplying a wavelet coefficient of the selected neighboring vertex with the adaptive weight; andadding the weighted value to the wavelet coefficient of the target vertex.
18. The method of claim 15, wherein applying the inverse directional lifting transform to the wavelet coefficient based on the selected scale value comprises:determining a coherence of the target vertex with respect to a first neighboring vertex and a second neighboring vertex;determining an adaptive weight based on the selected scale value; and applying the adaptive weight to an update step of the inverse directional lifting transform to modify a contribution to the update step of one of the first neighboring vertex or the second neighboring vertex based on the coherence.1616-614WO01Qualcomm Ref. No. 2502081 WO 110 / 11419. The method of claim 18, wherein applying the adaptive weight to the update step of the inverse directional lifting transform comprises:selecting one of the first neighboring vertex or the second neighboring vertex as a selected neighboring vertex based on the coherence;determining a weighted value based on multiplying a wavelet coefficient of the target vertex with the adaptive weight; andsubtracting the weighted value from a wavelet coefficient of the selected neighboring vertex.
20. The method of claim 15, further comprising determining the wavelet coefficient of the target vertex by:demultiplexing a displacement sub-bitstream from the bitstream of encoded mesh data;decoding the displacement sub-bitstream to generate quantized wavelet coefficients; andapplying inverse quantization to the quantized wavelet coefficients to determine the wavelet coefficient of the target vertex.
21. The method of claim 15, wherein determining the deviation value for the wavelet coefficient of the target vertex comprises determining an absolute difference between a first component of the wavelet coefficient of the target vertex and the mean value associated with the mesh patch.
22. The method of claim 14, wherein determining the delta scale value based on the base value and the exponent value comprises determining the delta scale value as follows:Δscale = base + 10−exp, wherein Ascale equals the delta scale value, base equals the base value, and exp equals the exponent value.
23. The method of claim 14, wherein determining the first scale value based on the delta scale value comprises determining the first scale value as follows:scale1 = 1 - Δscale wherein scale1 equals the first scale value.
24. The method of claim 23, wherein determining the second scale value based on the delta scale value comprises determining the second scale value as follows:1616-614WO01Qualcomm Ref. No. 2502081 WO 111 / 114scale2 = scalel + wherein scale2 equals the second scale value.
225. The method of claim 24, wherein determining the third scale value based on the delta scale value comprises determining the third scale value as follows:scale3 = scale2 + ^sc^le^ wherein scale3 equals the third scale value and x equals one of 2 or 3.
26. A non-transitory computer-readable medium storing instructions that, when executed by processing circuitry, cause the processing circuitry to:receive, in a bitstream of encoded mesh data, a first syntax element indicating a base value;receive, in the bitstream of encoded mesh data, a second syntax element indicating an exponent value;determine a delta scale value based on the base value and the exponent value; perform an inverse directional lifting transform to determine a displacement vector for a target vertex of a base mesh based on one or more of a first scale value, a second scale value, or a third scale value determined based on the delta scale value; deform the base mesh based on the displacement vector to determine a deformed base mesh; anddetermine a decoded mesh based on the deformed base mesh.1616-614WO01Qualcomm Ref. No. 2502081 WO 112 / 11427. The non-transitory computer-readable medium of claim 26, wherein to determine the displacement vector based on the first scale value, the second scale value, and the third scale value, the processing circuitry is further configured to:determine a deviation value for a wavelet coefficient of the target vertex based on a mean value associated with a mesh patch;select one of the first scale value, the second scale value, or the third scale value as a selected scale value based on a comparison of the deviation value to a standard deviation value associated with the mesh patch; andapply the inverse directional lifting transform to the wavelet coefficient based on the selected scale value, wherein to apply the inverse directional lifting transform to the wavelet coefficient based on the selected scale value, the processing circuitry is further configured to:determine a coherence of the target vertex with respect to a first neighboring vertex and a second neighboring vertex;determine an adaptive weight based on the selected scale value; andapply the adaptive weight to a prediction step of the inverse directional lifting transform to modify a contribution from one of the first neighboring vertex or the second neighboring vertex based on the coherence.
28. The non-transitory computer-readable medium of claim 27, wherein to determine the delta scale value based on the base value and the exponent value, determine the first scale value based on the delta scale value, determine the second scale value based on the delta scale value, determine the third scale value based on the delta scale value, the processing circuitry is further configured to determine the delta scale value, the first scale value, the second scale value, and the third scale value as follows:Δscale = base + 10−exp, wherein Ascale equals the delta scale value, base equals the base value, and exp equals the exponent value;scale1 = 1 - Δscale, wherein scalel equals the first scale value;scale2 = scale1 +Δscale / 2wherein scale2 equals the second scale value; and scale3 = scale2 +&sc^lleiwherein scale3 equals the third scale value, and x equals one of 2 or 3.1616-614WO01Qualcomm Ref. No. 2502081 WO 113 / 11429. A device for generating a bitstream of encoded mesh data, the device comprising:one or more memory units;one or more processing units implemented in circuitry, coupled to the one or more memory units, and configured to:perform a plurality of forward directional lifting transforms on a displacement vector for a target vertex of a base mesh using different scale values to determine a first scale value, a second scale value, and a third scale value; determine a delta scale value based on the first scale value, the second scale value, and the third scale value;determine a base value based on the delta scale value;determine an exponent value based on the delta scale value; perform a forward directional lifting transform on the displacement vector for the target vertex of the base mesh based on one or more of the first scale value, the second scale value, or the third scale value to determine one or more transform coefficients;encode the one or more transform coefficients to determine encoded transform coefficients; andgenerate the bitstream of encoded mesh data, the bitstream comprising a first syntax element indicating the base value, a second syntax element indicating the exponent value, and additionally syntax elements indicating the encoded transform coefficients.
30. The device of claim 29, wherein to determine the delta scale value based on the first scale value, the second scale value, and the third scale value, the one or more processing units are configured to determine the delta scale value in accordance with the following:Δscale = base + 10−exp, wherein Ascale equals the delta scale value, base equals the base value, and exp equals the exponent value;scale1 = 1 - Δscale, wherein scalel equals the first scale value;scale2 = scale1 +Δscale / 2wherein scale2 equals the second scale value; andscale3 = scale2 + Δscale / x, wherein scale3 equals the third scale value, and x equals one of 2 or 3.1616-614WO01