Updated document for algorithm description Change-Id: I16936b7b0339588316ecba421f69b4a10b031181
diff --git a/doc/AlgorithmDescription.md b/doc/AlgorithmDescription.md index b12f053..3d2bde3 100644 --- a/doc/AlgorithmDescription.md +++ b/doc/AlgorithmDescription.md
@@ -47,9 +47,12 @@ multiple transform units. The transform unit partitioning can be done in a recursive manner with the partitioning depth up to 2 levels. The transform partitioning supports 1:1 (square), 1:2/2:1, and 1:4/4:1 transform unit sizes -ranging from 4×4 to 64×64. The transform unit partitioning only applies to -luma component, for chroma blocks, the transform unit is identical to the coding -block size. +ranging from 4×4 to 64×64. If the coding block is smaller than or equal to +64x64, the transform block partitioning can only apply to luma component, for +chroma blocks, the transform block size is identical to the coding block size. +Otherwise, if the coding block width or height is greater than 64, then both the +luma and chroma coding blocks will implicitly split into multiples of min(W, +64)x min(H, 64) and min(W, 32)x min(H, 32) transform blocks, respectively. ## Intra Prediction @@ -58,7 +61,7 @@ Directional intra prediction modes are applied in intra prediction, which models local textures using a given direction pattern. Directional intra prediction modes are represented by nominal modes and angle delta. The nominal modes are -the same set of intra predictio angle used in VP9, which includes 8 angles. The +the same set of intra prediction angle used in VP9, which includes 8 angles. The index value of angle delta is ranging from -3 ~ +3, and zero delta angle indicates a nominal mode. The prediction angle is represented by a nominal intra angle plus an angle delta. In total, there are 56 directional intra prediction @@ -86,7 +89,7 @@ generated using quadratic interpolation along vertical, horizontal directions, or the average thereof. The samples used in the quadratic interpolation include reconstructed samples from the top and left neighboring blocks and samples from -the right and bottom boundaries which are aspproxmated by top reconstructed +the right and bottom boundaries which are approximated by top reconstructed samples and the left reconstructed samples. In `PAETH predictor` mode, the prediction for each sample is assigned as one @@ -115,15 +118,19 @@ ### Chroma from Luma mode -Chroma from Luma (CfL) is a chroma intra preddiction mode, which models chroma -samples as a linear function of co-located reconstructed luma samples. To algin -the resolution between luma and chroma samples for differnt chroma sampling +Chroma from Luma (CfL) is a chroma intra prediction mode, which models chroma +samples as a linear function of co-located reconstructed luma samples. To align +the resolution between luma and chroma samples for different chroma sampling format, e.g., 4:2:0 and 4:2:2, reconstructed luma pixels may need to be -subsampled before being used in CfL mode. In addition, the DC component is -removed to form the AC contribution. In CfL mode, the model parameters whihc -specify the linear function between two color compoennts are optimized by +sub-sampled before being used in CfL mode. In addition, the DC component is +removed to form the AC contribution. In CfL mode, the model parameters which +specify the linear function between two color components are optimized by encoder signalled in the bitstream. +<figure class="image"> <center><img src="img\intra_cfl.svg" +alt="Directional intra" width="700" /> <figcaption>Figure 5: CfL +prediction</figcaption> </figure> + ## Inter Prediction ### Motion vector prediction @@ -141,10 +148,10 @@ neighbors which are close but not directly adjacent to the current block. The two sets of spatial neighboring blocks are illustrated in an example shown in Figure 5.<figure class="image"> <center><img src="img\inter_spatial_mvp.svg" -alt="Directional intra" width="350" /><figcaption>Figure 5: Motion field +alt="Directional intra" width="350" /><figcaption>Figure 6: Motion field estimation by linear projection</figcaption></figure> For each set of spatial neighbors, the top row will be checked from left to right and then the left -column will be checked from top to down. For the adjacent spatial neighors, an +column will be checked from top to down. For the adjacent spatial neighbors, an additional top-right block will be also checked after checking the left column neighboring blocks. For the non-adjacent spatial neighbors, the top-left block located at (-1, -1) position will be checked first, then the top row and left @@ -166,19 +173,19 @@ 8x8 block are identified and stored together with the reference frame index in a temporal MV buffer. In an example shown in Figure 5, the MV of reference frame 1 (R1) pointing from R1 to a reference frame of R1 is identified, i.e., MVref, -which passes the a 8x8 block (shaded in blue dots) of current frame. Then this +which passes a 8x8 block (shaded in blue dots) of current frame. Then this MVref is stored in the temporal MV buffer associated with this 8x8 block. <figure class="image"> <center><img src="img\inter_motion_field.svg" -alt="Directional intra" width="800" /><figcaption>Figure 5: Motion field +alt="Directional intra" width="800" /><figcaption>Figure 7: Motion field estimation by linear projection</figcaption></figure> Finally, given a couple of pre-defined block coordinates, the associated MVs stored in the temporal MV buffer are identified and projected accordingly to derive a temporal MV predictor which points from the current block to its reference frame, e.g., MV0 -in Figure 5. In Figure 6, the pre-defined block positions for derviging temporal +in Figure 5. In Figure 6, the pre-defined block positions for deriving temporal MV predictors of a 16x16 block are shown and up to 7 blocks will be checked to find valid temporal MV predictors.<figure class="image"> <center><img src="img\inter_tmvp_positions.svg" alt="Directional intra" width="300" -/><figcaption>Figure 5: Block positions for deriving temporal MV +/><figcaption>Figure 8: Block positions for deriving temporal MV predictors</figcaption></figure> The temporal MV predictors are checked after the nearest spatial MV predictors but before the non-adjacent spatial MV predictors. @@ -235,9 +242,126 @@ ## Transform -<mark>[Ed.: to be added]</mark> +The separable 2D transform process is applied on prediction residuals. For the +forward transform, a 1-D vertical transform is performed first on each column of +the input residual block, then a horizontal transform is performed on each row +of the vertical transform output. For the backward transform, a 1-D horizontal +transform is performed first on each row of the input de-quantized coefficient +block, then a vertical transform is performed on each column of the horizontal +transform output. The primary 1-D transforms include four different types of +transform: a) 4-point, 8-point, 16-point, 32-point, 64-point DCT-2; b) 4-point, +8-point, 16-point asymmetric DST’s (DST-4, DST-7) and c) their flipped +versions; d) 4-point, 8-point, 16-point, 32-point identity transforms. When +transform size is 4-point, ADST refers to DST-7, otherwise, when transform size +is greater than 4-point, ADST refers to DST-4. -## Quantization <mark>[Ed.: to be added]</mark> + +<center> + +Table 1: Transform basis functions (DCT-2, DST-4 and DST-7 for N-point input. + +| Transform Type | Basis function T<sub>_i_</sub>(_j_), _i_, _j_=0, 1,…, N−1 | +|-------------------------|:--------------------------------------------------------------:| +| DCT-2 | T<sub>_i_;</sub>(_j_) = ω<sub>0</sub> ⋅ _`sqrt`_(2/N) + _`cos`_( π⋅_i_⋅(2⋅_j_ +1) ) / (2N) )<br>where ω<sub>0</sub> = (_i_==0) ? _`sqrt`_(N/2) : 1 +| DST-4 | T<sub>_i_;</sub>(_j_) = _`sqrt`_(2/N) + _`sin`_( π⋅(2⋅_i_+1)⋅(2⋅_j_+1) ) / (4⋅N) ) | +| DST-7 | T<sub>_i_;</sub>(_j_) = _`sqrt`_(4/(2⋅N+1)) + _`sin`_( π⋅_i_⋅(_j_+1) ) / (2⋅N+1) ) | +| Identity (IDT) | T<sub>_i_;</sub>(_j_) = (_i_==_j_) ? 1 : 0 | +||| +</center> + +For luma component, each transform block can select one pair of horizontal and +vertical transform combination given a pre-defined set of transform type +candidates, and the selection is explicitly signalled into the bitstream. When +the maximum of transform block width and height is greater than or equal to 32, +the set of transform type candidates depend on the prediction mode, as described +in Table 2. Otherwise, when the maximum of transform block width and height is +smaller than 32, the set of transform type candidates depend on the prediction +mode, as described in Table 3. + +<center> + +Table 2: Transform type candidates for luma component when max(width, height) +is greater than or equal to 32. + +| Max(width, height) | Intra | Inter | +|:-----------------------:|:--------------------------:|:-----------------------------:| +| 32 | _DCTOnly_ | _DCTOnly_, _IDTX_ | +| 64 | _DCTOnly_ | _DCTOnly_ | +</center> + +<center> + +Table 3: Transform type candidates for luma component when max(width, height) +is smaller than 32. + +| Min(width, height) | Intra | Inter | +|:-----------------------:|:--------------------------:|:-----------------------------:| +| 4 | _DTT4_, _IDTX_, _1DDCT_ | _ALL16_ | +| 8 | _DTT4_, _IDTX_, _1DDCT_ | _ALL16_ | +| 16 | _DTT4_, _IDTX_ | _DTT9, _IDTX_, _1DDCT_ | +</center> + +The set of transform type candidates (namely transform set) is defined in +Table 3. + +<center> + +Table 3: Definition of transform set. + +| Transform set | Vertical transform | Horizontal transform | +|---------------|:------------------:|:--------------------:| +| _DCTOnly_ | DCT | DCT | +| _IDTX_ | IDT | IDT | +| _1DDCT_ | DCT <br> IDT | IDT <br> DCT | +| _DTT4_ | ADST <br> ADST <br> DCT <br> DCT | ADST <br> DCT <br> ADST <br> DCT | +| _DTT9_ | DCT <br> DCT <br> DCT <br> ADST <br> ADST <br> ADST <br> Flipped ADST <br> Flipped ADST <br> Flipped ADST | DCT <br> ADST <br> Flipped ADST <br> DCT <br> ADST <br> Flipped ADST <br> DCT <br> ADST <br> Flipped ADST <br> | +| _ALL16_ | DCT <br> DCT <br> DCT <br> DCT <br> ADST <br> ADST <br>ADST <br> ADST <br> Flipped ADST <br> Flipped ADST <br> Flipped ADST <br> Flipped ADST <br> IDT <br> IDT <br> IDT <br> IDT <br> | DCT <br> ADST <br> Flipped ADST <br> IDT <br> DCT <br> ADST <br> Flipped ADST <br> IDT <br> DCT <br> ADST <br> Flipped ADST <br> IDT <br> DCT <br> ADST <br> Flipped ADST <br> IDT <br> | +|| +</center> + +For chroma component, the transform type selection is done in an implicit way. +For intra prediction residuals, the transform type is selected according to the +intra prediction mode, as specified in Table 4. For inter prediction residuals, +the transform type is selected according to the transform type selection of the +co-located luma block. Therefore, for chroma component, there is no transform +type signalling in the bitstream. + +<center> + +Table 4: Transform type selection for chroma component intra prediction residuals. + + +| Intra Prediction Mode | Vertical transform | Horizontal transform | +|-----------------------|:------------------:|:--------------------:| +| DC_PRED | DCT | DCT | +| V_PRED | ADST | DCT | +| H_PRED | DCT | ADST | +| D45_PRED | DCT | DCT | +| D135_PRED | ADST | ADST | +| D113_PRED | ADST | DCT | +| D157_PRED | DCT | ADST | +| D203_PRED | DCT | ADST | +| D67_PRED | ADST | DCT | +| SMOOTH_PRED | ADST | ADST | +| SMOOTH_V_PRED | ADST | DCT | +| SMOOTH_H_PRED | DCT | ADST | +| PAETH_PRED | ADST | ADST | +|| +</center> + +The computational cost of large size (e.g., 64-point) transforms is further +reduced by zeroing out all the coefficients except the following two cases: + +1. The top-left 32×32 quadrant for 64×64/64×32/32×64 DCT_DCT hybrid transforms +2. The top-left 16×16 quadrant for 64×16/16×64 DCT_DCT hybrid transforms. + +Both the DCT-2 and ADST (DST-4, DST-7) are implemented using butterfly structure +[1], which included multiple stages of butterfly operations. Each butterfly +operations can be calculated in parallel and different stages are cascaded in a +sequential order. + +## Quantization +<mark>[Ed.: to be added]</mark> ## Entropy Coding @@ -262,7 +386,7 @@ the lower-level and middle-level planes are coded together in backward scan order, and the scan order refers to zig-zag scan applied on the entire transform unit basis. Then the sign plane and higher-level plane are coded together in -forward scan order. After that, the remainder (coefficenit level minus 14) is +forward scan order. After that, the remainder (coefficient level minus 14) is entropy coded using Exp-Golomb code. The context model applied to the lower level plane depends on the primary @@ -317,8 +441,12 @@ <mark>[Ed.: to be added]</mark> -### Pallete mode +### Palette mode <mark>[Ed.: to be added]</mark> -# References \ No newline at end of file +# References + +[1] J. Han, Y. Xu and D. Mukherjee, "A butterfly structured design of the hybrid +transform coding scheme," 2013 Picture Coding Symposium (PCS), San Jose, CA, +2013, pp. 17-20. \ No newline at end of file
diff --git a/doc/img/intra_cfl.svg b/doc/img/intra_cfl.svg new file mode 100644 index 0000000..1153a28 --- /dev/null +++ b/doc/img/intra_cfl.svg
@@ -0,0 +1,193 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<!-- Generated by Microsoft Visio, SVG Export CfL_prediction.svg Page-1 --> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" + xmlns:v="http://schemas.microsoft.com/visio/2003/SVGExtensions/" width="6.52269in" height="1.90714in" + viewBox="0 0 469.634 137.314" xml:space="preserve" color-interpolation-filters="sRGB" class="st13"> + <v:documentProperties v:langID="1033" v:viewMarkup="false"/> + + <style type="text/css"> + <![CDATA[ + .st1 {fill:#ff00ff;fill-opacity:0;stroke:#000000;stroke-opacity:0;stroke-width:0.75} + .st2 {fill:#ffffff;stroke:#000000;stroke-width:0.75} + .st3 {fill:#000000;font-family:Calibri;font-size:0.75em} + .st4 {marker-end:url(#mrkr4-22);stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:1} + .st5 {fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1;stroke-width:0.28409090909091} + .st6 {fill:none;stroke:#000000;stroke-width:0.75} + .st7 {fill:#000000;font-family:Calibri;font-size:1.99999em} + .st8 {fill:#000000;font-family:Calibri;font-size:1.5em} + .st9 {fill:none;stroke:none;stroke-width:0.25} + .st10 {font-size:1em} + .st11 {fill:#000000;font-family:SimSun;font-size:0.75em} + .st12 {font-family:Calibri;font-size:1em} + .st13 {fill:none;fill-rule:evenodd;font-size:12px;overflow:visible;stroke-linecap:square;stroke-miterlimit:3} + ]]> + </style> + + <defs id="Markers"> + <g id="lend4"> + <path d="M 2 1 L 0 0 L 2 -1 L 2 1 " style="stroke:none"/> + </g> + <marker id="mrkr4-22" class="st5" v:arrowType="4" v:arrowSize="2" v:setback="7.04" refX="-7.04" orient="auto" + markerUnits="strokeWidth" overflow="visible"> + <use xlink:href="#lend4" transform="scale(-3.52,-3.52) "/> + </marker> + </defs> + <g v:mID="0" v:index="1" v:groupContext="foregroundPage"> + <title>Page-1</title> + <v:pageProperties v:drawingScale="0.0393701" v:pageScale="0.0393701" v:drawingUnits="24" v:shadowOffsetX="4.25197" + v:shadowOffsetY="-4.25197"/> + <v:layer v:name="Flowchart" v:index="0"/> + <v:layer v:name="Connector" v:index="1"/> + <g id="group5-1" transform="translate(111.581,-86.9232)" v:mID="5" v:groupContext="group" v:layerMember="0"> + <v:custProps> + <v:cp v:nameU="Cost" v:lbl="Cost" v:type="7" v:format="@" v:langID="1033"/> + <v:cp v:nameU="Duration" v:lbl="Duration" v:type="2" v:langID="1033"/> + <v:cp v:nameU="Resources" v:lbl="Resources" v:langID="1033"/> + </v:custProps> + <v:userDefs> + <v:ud v:nameU="ScaleFactor" v:val="VT0(1):26"/> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <title>Tagged process</title> + <g id="shape6-2" v:mID="6" v:groupContext="shape" transform="translate(0.566929,0)"> + <title>Sheet.6</title> + <path d="M53.15 137.31 L70.87 137.31 L70.87 128.46 L70.87 116.05 L0 116.05 L0 137.31 L53.15 137.31 Z" class="st1"/> + </g> + <g id="shape7-4" v:mID="7" v:groupContext="shape" v:layerMember="0" transform="translate(54.9213,0)"> + <title>Sheet.7</title> + </g> + <g id="shape8-6" v:mID="8" v:groupContext="shape" v:layerMember="0"> + <title>Sheet.8</title> + <desc>Sub-Sample</desc> + <v:textBlock v:margins="rect(2,2,2,2)" v:tabSpace="42.5197"/> + <v:textRect cx="35.4331" cy="126.684" width="70.87" height="21.2598"/> + <path d="M0 137.31 L70.87 137.31 L70.87 121.37 L70.87 116.05 L0 116.05 L0 137.31 Z" class="st2"/> + <text x="13.81" y="129.38" class="st3" v:langID="2052"><v:paragraph v:horizAlign="1"/><v:tabList/>Sub-Sample</text> </g> + </g> + <g id="group9-9" transform="translate(224.967,-86.9232)" v:mID="9" v:groupContext="group" v:layerMember="0"> + <v:custProps> + <v:cp v:nameU="Cost" v:lbl="Cost" v:type="7" v:format="@" v:langID="1033"/> + <v:cp v:nameU="Duration" v:lbl="Duration" v:type="2" v:langID="1033"/> + <v:cp v:nameU="Resources" v:lbl="Resources" v:langID="1033"/> + </v:custProps> + <v:userDefs> + <v:ud v:nameU="ScaleFactor" v:val="VT0(1):26"/> + <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> + </v:userDefs> + <title>Tagged process.9</title> + <g id="shape10-10" v:mID="10" v:groupContext="shape" transform="translate(0.566929,0)"> + <title>Sheet.10</title> + <path d="M53.15 137.31 L70.87 137.31 L70.87 128.46 L70.87 116.05 L0 116.05 L0 137.31 L53.15 137.31 Z" class="st1"/> + </g> + <g id="shape11-12" v:mID="11" v:groupContext="shape" v:layerMember="0" transform="translate(54.9213,0)"> + <title>Sheet.11</title> + </g> + <g id="shape12-14" v:mID="12" v:groupContext="shape" v:layerMember="0"> + <title>Sheet.12</title> + <desc>Average</desc> + <v:textBlock v:margins="rect(2,2,2,2)" v:tabSpace="42.5197"/> + <v:textRect cx="35.4331" cy="126.684" width="70.87" height="21.2598"/> + <path d="M0 137.31 L70.87 137.31 L70.87 121.37 L70.87 116.05 L0 116.05 L0 137.31 Z" class="st2"/> + <text x="20.48" y="129.38" class="st3" v:langID="2052"><v:paragraph v:horizAlign="1"/><v:tabList/>Average</text> </g> + </g> + <g id="shape27-17" v:mID="27" v:groupContext="shape" transform="translate(182.447,-97.5531)"> + <title>Sheet.27</title> + <path d="M0 137.31 L35.48 137.31" class="st4"/> + </g> + <g id="shape28-23" v:mID="28" v:groupContext="shape" transform="translate(295.833,-97.5531)"> + <title>Sheet.28</title> + <path d="M0 137.31 L35.48 137.31" class="st4"/> + </g> + <g id="shape29-28" v:mID="29" v:groupContext="shape" transform="translate(341.47,-86.9232)"> + <title>Sheet.29</title> + <desc>-</desc> + <v:textBlock v:margins="rect(2,2,2,2)" v:tabSpace="42.5197"/> + <v:textRect cx="11.1968" cy="126.117" width="22.4" height="22.3937"/> + <ellipse cx="11.1968" cy="126.117" rx="11.1968" ry="11.1968" class="st6"/> + <text x="7.52" y="133.32" class="st7" v:langID="2052"><v:paragraph v:horizAlign="1"/><v:tabList/>- </text> </g> + <g id="shape34-31" v:mID="34" v:groupContext="shape" v:layerMember="1" transform="translate(147.014,-101.663)"> + <title>Dynamic connector</title> + <path d="M0 130.79 L0 109.53 L205.65 109.53 L205.65 122.62" class="st4"/> + </g> + <g id="shape35-36" v:mID="35" v:groupContext="shape" transform="translate(34.2657,-97.5531)"> + <title>Sheet.35</title> + <path d="M0 137.31 L70.27 137.31" class="st4"/> + </g> + <g id="shape36-41" v:mID="36" v:groupContext="shape" transform="translate(341.329,-43.2697)"> + <title>Sheet.36</title> + <desc>×</desc> + <v:textBlock v:margins="rect(2,2,2,2)" v:tabSpace="42.5197"/> + <v:textRect cx="11.1968" cy="126.117" width="22.4" height="22.3937"/> + <ellipse cx="11.1968" cy="126.117" rx="11.1968" ry="11.1968" class="st6"/> + <text x="6.71" y="131.52" class="st8" v:langID="2052"><v:paragraph v:horizAlign="1"/><v:tabList/>× </text> </g> + <g id="shape37-44" v:mID="37" v:groupContext="shape" transform="translate(34.2657,-53.5676)"> + <title>Sheet.37</title> + <path d="M0 137.31 L300.06 137.31" class="st4"/> + </g> + <g id="shape38-49" v:mID="38" v:groupContext="shape" transform="translate(489.499,50.3067) rotate(89.9693)"> + <title>Sheet.38</title> + <path d="M0 137.31 L14.24 137.31" class="st4"/> + </g> + <g id="shape39-54" v:mID="39" v:groupContext="shape" transform="translate(341.329,-0.75)"> + <title>Sheet.39</title> + <desc>+</desc> + <v:textBlock v:margins="rect(2,2,2,2)" v:tabSpace="42.5197"/> + <v:textRect cx="11.1968" cy="126.117" width="22.4" height="22.3937"/> + <ellipse cx="11.1968" cy="126.117" rx="11.1968" ry="11.1968" class="st6"/> + <text x="6.71" y="131.52" class="st8" v:langID="2052"><v:paragraph v:horizAlign="1"/><v:tabList/>+ </text> </g> + <g id="shape40-57" v:mID="40" v:groupContext="shape" transform="translate(34.2657,-11.9539)"> + <title>Sheet.40</title> + <path d="M0 137.31 L300.02 137.31" class="st4"/> + </g> + <g id="shape41-62" v:mID="41" v:groupContext="shape" v:layerMember="1" transform="translate(345.51,-86.9234)"> + <title>Dynamic connector.41</title> + <path d="M7.09 137.31 L7.09 151.53" class="st4"/> + </g> + <g id="shape74-67" v:mID="74" v:groupContext="shape" v:layerMember="1" transform="translate(345.439,-43.2697)"> + <title>Dynamic connector.74</title> + <path d="M7.09 137.31 L7.09 150.4" class="st4"/> + </g> + <g id="shape75-72" v:mID="75" v:groupContext="shape" transform="translate(363.722,-11.9551)"> + <title>Sheet.75</title> + <path d="M0 137.31 L35.48 137.31" class="st4"/> + </g> + <g id="shape78-77" v:mID="78" v:groupContext="shape" transform="translate(3.08465,-17.2788)"> + <title>Sheet.78</title> + <desc>Chroma DC Prediction</desc> + <v:textBlock v:margins="rect(2,2,2,2)" v:tabSpace="42.5197"/> + <v:textRect cx="70.3916" cy="131.314" width="140.79" height="12"/> + <rect x="0" y="125.314" width="140.783" height="12" class="st9"/> + <text x="30.02" y="134.01" class="st3" v:langID="2052"><v:paragraph v:horizAlign="1"/><v:tabList/>Chroma DC Prediction</text> </g> + <g id="shape82-80" v:mID="82" v:groupContext="shape" transform="translate(0.25,-60.75)"> + <title>Sheet.82</title> + <desc>Scaling parameter α</desc> + <v:textBlock v:margins="rect(2,2,2,2)" v:tabSpace="42.5197"/> + <v:textRect cx="70.3916" cy="131.314" width="140.79" height="12"/> + <rect x="0" y="125.314" width="140.783" height="12" class="st9"/> + <text x="33.74" y="134.01" class="st3" v:langID="2052"><v:paragraph v:horizAlign="1"/><v:tabList/>Scaling parameter α </text> </g> + <g id="shape83-83" v:mID="83" v:groupContext="shape" transform="translate(30.0138,-102.514)"> + <title>Sheet.83</title> + <desc>Luma reconstructed samples</desc> + <v:textBlock v:margins="rect(2,2,2,2)" v:tabSpace="42.5197"/> + <v:textRect cx="43.937" cy="131.314" width="87.88" height="12"/> + <rect x="0" y="125.314" width="87.874" height="12" class="st9"/> + <text x="7.25" y="128.61" class="st3" v:langID="2052"><v:paragraph v:horizAlign="1"/><v:tabList/>Luma reconstructed <tspan + x="29.03" dy="1.2em" class="st10">samples</tspan></text> </g> + <g id="shape84-87" v:mID="84" v:groupContext="shape" transform="translate(398.518,-5.47437)"> + <title>Sheet.84</title> + <desc>CfL Prediction</desc> + <v:textBlock v:margins="rect(2,2,2,2)" v:tabSpace="42.5197"/> + <v:textRect cx="35.4331" cy="131.314" width="70.87" height="12"/> + <rect x="0" y="125.314" width="70.8661" height="12" class="st9"/> + <text x="10.04" y="134.01" class="st3" v:langID="2052"><v:paragraph v:horizAlign="1"/><v:tabList/>CfL Prediction</text> </g> + <g id="shape85-90" v:mID="85" v:groupContext="shape" transform="translate(354.581,-72.75)"> + <title>Sheet.85</title> + <desc>“AC” contribution</desc> + <v:textBlock v:margins="rect(2,2,2,2)" v:tabSpace="42.5197"/> + <v:textRect cx="40.3937" cy="131.314" width="80.79" height="12"/> + <rect x="0" y="125.314" width="80.7874" height="12" class="st9"/> + <text x="2.62" y="134.31" class="st11" v:langID="2052"><v:paragraph v:horizAlign="1"/><v:tabList/>“<tspan class="st12">AC</tspan>”<tspan + class="st12"> </tspan><tspan class="st12">contribution</tspan></text> </g> + </g> +</svg>
diff --git a/doc/img/partition_codingblock.svg b/doc/img/partition_codingblock.svg index e8a3f40..872692d 100644 --- a/doc/img/partition_codingblock.svg +++ b/doc/img/partition_codingblock.svg
@@ -3,7 +3,7 @@ <!-- Generated by Microsoft Visio, SVG Export partition_codingblock.svg Page-1 --> <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" xmlns:v="http://schemas.microsoft.com/visio/2003/SVGExtensions/" width="8.02083in" height="8.51563in" - viewBox="0 0 577.5 613.125" xml:space="preserve" color-interpolation-filters="sRGB" class="st5"> + viewBox="0 0 577.5 613.125" xml:space="preserve" color-interpolation-filters="sRGB" class="st6"> <v:documentProperties v:langID="1033" v:viewMarkup="false"/> <style type="text/css"> @@ -12,7 +12,8 @@ .st2 {fill:none;stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75} .st3 {fill:#000000;font-family:Consolas;font-size:1.16666em} .st4 {font-size:1em} - .st5 {fill:none;fill-rule:evenodd;font-size:12px;overflow:visible;stroke-linecap:square;stroke-miterlimit:3} + .st5 {stroke:#0070c0;stroke-dasharray:1.5,3;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.5} + .st6 {fill:none;fill-rule:evenodd;font-size:12px;overflow:visible;stroke-linecap:square;stroke-miterlimit:3} ]]> </style> @@ -26,280 +27,84 @@ </v:userDefs> <rect x="0" y="469.125" width="144" height="144" class="st1"/> </g> - <g id="shape2-3" v:mID="2" v:groupContext="shape" transform="translate(0.75,-540.375)"> - <title>Square.2</title> - <v:userDefs> - <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> - </v:userDefs> - <rect x="0" y="541.125" width="72" height="72" class="st1"/> - </g> - <g id="shape3-5" v:mID="3" v:groupContext="shape" transform="translate(72.75,-540.375)"> - <title>Square.3</title> - <v:userDefs> - <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> - </v:userDefs> - <rect x="0" y="541.125" width="72" height="72" class="st1"/> - </g> - <g id="shape4-7" v:mID="4" v:groupContext="shape" transform="translate(0.75,-468.375)"> - <title>Square.4</title> - <v:userDefs> - <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> - </v:userDefs> - <rect x="0" y="541.125" width="72" height="72" class="st1"/> - </g> - <g id="shape5-9" v:mID="5" v:groupContext="shape" transform="translate(72.75,-468.375)"> - <title>Square.5</title> - <v:userDefs> - <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> - </v:userDefs> - <rect x="0" y="541.125" width="72" height="72" class="st1"/> - </g> - <g id="shape6-11" v:mID="6" v:groupContext="shape" transform="translate(216.75,-468.375)"> + <g id="shape6-3" v:mID="6" v:groupContext="shape" transform="translate(216.75,-468.375)"> <title>Square.6</title> <v:userDefs> <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> </v:userDefs> <rect x="0" y="469.125" width="144" height="144" class="st1"/> </g> - <g id="shape11-13" v:mID="11" v:groupContext="shape" transform="translate(216.75,-468.375)"> - <title>Rectangle</title> - <v:userDefs> - <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> - </v:userDefs> - <rect x="0" y="469.125" width="36" height="144" class="st1"/> - </g> - <g id="shape12-15" v:mID="12" v:groupContext="shape" transform="translate(252.75,-468.375)"> - <title>Rectangle.12</title> - <v:userDefs> - <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> - </v:userDefs> - <rect x="0" y="469.125" width="36" height="144" class="st1"/> - </g> - <g id="shape13-17" v:mID="13" v:groupContext="shape" transform="translate(288.75,-468.375)"> - <title>Rectangle.13</title> - <v:userDefs> - <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> - </v:userDefs> - <rect x="0" y="469.125" width="36" height="144" class="st1"/> - </g> - <g id="shape14-19" v:mID="14" v:groupContext="shape" transform="translate(324.75,-468.375)"> - <title>Rectangle.14</title> - <v:userDefs> - <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> - </v:userDefs> - <rect x="0" y="469.125" width="36" height="144" class="st1"/> - </g> - <g id="shape15-21" v:mID="15" v:groupContext="shape" transform="translate(432.75,-468.375)"> + <g id="shape15-5" v:mID="15" v:groupContext="shape" transform="translate(432.75,-468.375)"> <title>Square.15</title> <v:userDefs> <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> </v:userDefs> <rect x="0" y="469.125" width="144" height="144" class="st1"/> </g> - <g id="shape16-23" v:mID="16" v:groupContext="shape" transform="translate(432.75,-576.375)"> - <title>Rectangle.16</title> - <v:userDefs> - <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> - </v:userDefs> - <rect x="0" y="577.125" width="144" height="36" class="st1"/> - </g> - <g id="shape20-25" v:mID="20" v:groupContext="shape" transform="translate(432.75,-540.375)"> - <title>Rectangle.20</title> - <v:userDefs> - <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> - </v:userDefs> - <rect x="0" y="577.125" width="144" height="36" class="st1"/> - </g> - <g id="shape21-27" v:mID="21" v:groupContext="shape" transform="translate(432.75,-504.375)"> - <title>Rectangle.21</title> - <v:userDefs> - <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> - </v:userDefs> - <rect x="0" y="577.125" width="144" height="36" class="st1"/> - </g> - <g id="shape22-29" v:mID="22" v:groupContext="shape" transform="translate(432.75,-468.375)"> - <title>Rectangle.22</title> - <v:userDefs> - <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> - </v:userDefs> - <rect x="0" y="577.125" width="144" height="36" class="st1"/> - </g> - <g id="shape24-31" v:mID="24" v:groupContext="shape" transform="translate(0.75,-252.375)"> + <g id="shape24-7" v:mID="24" v:groupContext="shape" transform="translate(0.75,-252.375)"> <title>Square.24</title> <v:userDefs> <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> </v:userDefs> <rect x="0" y="469.125" width="144" height="144" class="st1"/> </g> - <g id="shape27-33" v:mID="27" v:groupContext="shape" transform="translate(0.75,-252.375)"> - <title>Square.27</title> - <v:userDefs> - <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> - </v:userDefs> - <rect x="0" y="541.125" width="72" height="72" class="st1"/> - </g> - <g id="shape28-35" v:mID="28" v:groupContext="shape" transform="translate(72.75,-252.375)"> - <title>Square.28</title> - <v:userDefs> - <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> - </v:userDefs> - <rect x="0" y="541.125" width="72" height="72" class="st1"/> - </g> - <g id="shape29-37" v:mID="29" v:groupContext="shape" transform="translate(0.75,-324.375)"> - <title>Rectangle.29</title> - <v:userDefs> - <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> - </v:userDefs> - <rect x="0" y="541.125" width="144" height="72" class="st1"/> - </g> - <g id="shape30-39" v:mID="30" v:groupContext="shape" transform="translate(216.75,-252.375)"> + <g id="shape30-9" v:mID="30" v:groupContext="shape" transform="translate(216.75,-252.375)"> <title>Square.30</title> <v:userDefs> <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> </v:userDefs> <rect x="0" y="469.125" width="144" height="144" class="st1"/> </g> - <g id="shape31-41" v:mID="31" v:groupContext="shape" transform="translate(216.75,-324.375)"> - <title>Square.31</title> - <v:userDefs> - <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> - </v:userDefs> - <rect x="0" y="541.125" width="72" height="72" class="st1"/> - </g> - <g id="shape32-43" v:mID="32" v:groupContext="shape" transform="translate(216.75,-252.375)"> - <title>Square.32</title> - <v:userDefs> - <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> - </v:userDefs> - <rect x="0" y="541.125" width="72" height="72" class="st1"/> - </g> - <g id="shape33-45" v:mID="33" v:groupContext="shape" transform="translate(288.75,-252.375)"> - <title>Rectangle.33</title> - <v:userDefs> - <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> - </v:userDefs> - <rect x="0" y="469.125" width="72" height="144" class="st1"/> - </g> - <g id="shape34-47" v:mID="34" v:groupContext="shape" transform="translate(432.75,-252.375)"> + <g id="shape34-11" v:mID="34" v:groupContext="shape" transform="translate(432.75,-252.375)"> <title>Square.34</title> <v:userDefs> <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> </v:userDefs> <rect x="0" y="469.125" width="144" height="144" class="st1"/> </g> - <g id="shape35-49" v:mID="35" v:groupContext="shape" transform="translate(432.75,-324.375)"> - <title>Square.35</title> - <v:userDefs> - <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> - </v:userDefs> - <rect x="0" y="541.125" width="72" height="72" class="st1"/> - </g> - <g id="shape36-51" v:mID="36" v:groupContext="shape" transform="translate(504.75,-324.375)"> - <title>Square.36</title> - <v:userDefs> - <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> - </v:userDefs> - <rect x="0" y="541.125" width="72" height="72" class="st1"/> - </g> - <g id="shape37-53" v:mID="37" v:groupContext="shape" transform="translate(432.75,-252.375)"> - <title>Rectangle.37</title> - <v:userDefs> - <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> - </v:userDefs> - <rect x="0" y="541.125" width="144" height="72" class="st1"/> - </g> - <g id="shape38-55" v:mID="38" v:groupContext="shape" transform="translate(0.75,-36.375)"> + <g id="shape38-13" v:mID="38" v:groupContext="shape" transform="translate(0.75,-36.375)"> <title>Square.38</title> <v:userDefs> <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> </v:userDefs> <rect x="0" y="469.125" width="144" height="144" class="st1"/> </g> - <g id="shape39-57" v:mID="39" v:groupContext="shape" transform="translate(72.75,-36.375)"> - <title>Square.39</title> - <v:userDefs> - <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> - </v:userDefs> - <rect x="0" y="541.125" width="72" height="72" class="st1"/> - </g> - <g id="shape40-59" v:mID="40" v:groupContext="shape" transform="translate(72.75,-108.375)"> - <title>Square.40</title> - <v:userDefs> - <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> - </v:userDefs> - <rect x="0" y="541.125" width="72" height="72" class="st1"/> - </g> - <g id="shape41-61" v:mID="41" v:groupContext="shape" transform="translate(0.75,-36.375)"> - <title>Rectangle.41</title> - <v:userDefs> - <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> - </v:userDefs> - <rect x="0" y="469.125" width="72" height="144" class="st1"/> - </g> - <g id="shape42-63" v:mID="42" v:groupContext="shape" transform="translate(216.75,-36.375)"> + <g id="shape42-15" v:mID="42" v:groupContext="shape" transform="translate(216.75,-36.375)"> <title>Square.42</title> <v:userDefs> <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> </v:userDefs> <rect x="0" y="469.125" width="144" height="144" class="st1"/> </g> - <g id="shape45-65" v:mID="45" v:groupContext="shape" transform="translate(216.75,-108.375)"> - <title>Rectangle.45</title> - <v:userDefs> - <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> - </v:userDefs> - <rect x="0" y="541.125" width="144" height="72" class="st1"/> - </g> - <g id="shape46-67" v:mID="46" v:groupContext="shape" transform="translate(216.75,-36.375)"> - <title>Rectangle.46</title> - <v:userDefs> - <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> - </v:userDefs> - <rect x="0" y="541.125" width="144" height="72" class="st1"/> - </g> - <g id="shape47-69" v:mID="47" v:groupContext="shape" transform="translate(432.75,-36.375)"> + <g id="shape47-17" v:mID="47" v:groupContext="shape" transform="translate(432.75,-36.375)"> <title>Square.47</title> <v:userDefs> <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> </v:userDefs> <rect x="0" y="469.125" width="144" height="144" class="st1"/> </g> - <g id="shape48-71" v:mID="48" v:groupContext="shape" transform="translate(432.75,-36.375)"> - <title>Rectangle.48</title> - <v:userDefs> - <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> - </v:userDefs> - <rect x="0" y="469.125" width="72" height="144" class="st1"/> - </g> - <g id="shape49-73" v:mID="49" v:groupContext="shape" transform="translate(504.75,-36.375)"> - <title>Rectangle.49</title> - <v:userDefs> - <v:ud v:nameU="visVersion" v:val="VT0(15):26"/> - </v:userDefs> - <rect x="0" y="469.125" width="72" height="144" class="st1"/> - </g> - <g id="shape50-75" v:mID="50" v:groupContext="shape" transform="translate(0.75,-436.875)"> + <g id="shape50-19" v:mID="50" v:groupContext="shape" transform="translate(0.75,-436.875)"> <title>Sheet.50</title> <desc>PARTITION_SPLIT</desc> <v:textBlock v:margins="rect(4,4,4,4)"/> <v:textRect cx="72" cy="599.625" width="144.01" height="27"/> <rect x="0" y="586.125" width="144" height="27" class="st2"/> <text x="14.27" y="610.43" class="st3" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>PARTITION_SPLIT</text> </g> - <g id="shape51-78" v:mID="51" v:groupContext="shape" transform="translate(216.75,-436.875)"> + <g id="shape51-22" v:mID="51" v:groupContext="shape" transform="translate(216.75,-436.875)"> <title>Sheet.51</title> <desc>PARTITION_VERT_4</desc> <v:textBlock v:margins="rect(4,4,4,4)"/> <v:textRect cx="72" cy="599.625" width="144.01" height="27"/> <rect x="0" y="586.125" width="144" height="27" class="st2"/> <text x="10.42" y="610.43" class="st3" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>PARTITION_VERT_4</text> </g> - <g id="shape52-81" v:mID="52" v:groupContext="shape" transform="translate(432.75,-436.875)"> + <g id="shape52-25" v:mID="52" v:groupContext="shape" transform="translate(432.75,-436.875)"> <title>Sheet.52</title> <desc>PARTITION_HORZ_4</desc> <v:textBlock v:margins="rect(4,4,4,4)"/> <v:textRect cx="72" cy="599.625" width="144.01" height="27"/> <rect x="0" y="586.125" width="144" height="27" class="st2"/> <text x="10.42" y="610.43" class="st3" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>PARTITION_HORZ_4</text> </g> - <g id="shape60-84" v:mID="60" v:groupContext="shape" transform="translate(0.75,-220.875)"> + <g id="shape60-28" v:mID="60" v:groupContext="shape" transform="translate(0.75,-220.875)"> <title>Sheet.60</title> <desc>PARTITION_HORZ_B</desc> <v:textBlock v:margins="rect(4,4,4,4)"/> @@ -307,21 +112,21 @@ <rect x="0" y="586.125" width="144" height="27" class="st2"/> <text x="10.42" y="604.32" class="st3" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>PARTITION_HORZ_<tspan class="st4" v:langID="2052">B</tspan></text> </g> - <g id="shape61-88" v:mID="61" v:groupContext="shape" transform="translate(216.75,-220.875)"> + <g id="shape61-32" v:mID="61" v:groupContext="shape" transform="translate(216.75,-220.875)"> <title>Sheet.61</title> <desc>PARTITION_VERT_A</desc> <v:textBlock v:margins="rect(4,4,4,4)"/> <v:textRect cx="72" cy="599.625" width="144.01" height="27"/> <rect x="0" y="586.125" width="144" height="27" class="st2"/> <text x="10.42" y="604.32" class="st3" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>PARTITION_VERT_A</text> </g> - <g id="shape62-91" v:mID="62" v:groupContext="shape" transform="translate(432.75,-220.875)"> + <g id="shape62-35" v:mID="62" v:groupContext="shape" transform="translate(432.75,-220.875)"> <title>Sheet.62</title> <desc>PARTITION_HORZ_A</desc> <v:textBlock v:margins="rect(4,4,4,4)"/> <v:textRect cx="72" cy="599.625" width="144.01" height="27"/> <rect x="0" y="586.125" width="144" height="27" class="st2"/> <text x="10.42" y="604.32" class="st3" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>PARTITION_HORZ_A</text> </g> - <g id="shape63-94" v:mID="63" v:groupContext="shape" transform="translate(0.75,-0.375)"> + <g id="shape63-38" v:mID="63" v:groupContext="shape" transform="translate(0.75,-0.375)"> <title>Sheet.63</title> <desc>PARTITION_VERT_B</desc> <v:textBlock v:margins="rect(4,4,4,4)"/> @@ -329,14 +134,14 @@ <rect x="0" y="586.125" width="144" height="27" class="st2"/> <text x="10.42" y="604.32" class="st3" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>PARTITION_VERT_<tspan class="st4" v:langID="2052">B</tspan></text> </g> - <g id="shape64-98" v:mID="64" v:groupContext="shape" transform="translate(216.75,-0.375)"> + <g id="shape64-42" v:mID="64" v:groupContext="shape" transform="translate(216.75,-0.375)"> <title>Sheet.64</title> <desc>PARTITION_HORZ</desc> <v:textBlock v:margins="rect(4,4,4,4)"/> <v:textRect cx="72" cy="599.625" width="144.01" height="27"/> <rect x="0" y="586.125" width="144" height="27" class="st2"/> <text x="18.12" y="604.32" class="st3" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>PARTITION_HORZ</text> </g> - <g id="shape65-101" v:mID="65" v:groupContext="shape" transform="translate(432.75,-0.375)"> + <g id="shape65-45" v:mID="65" v:groupContext="shape" transform="translate(432.75,-0.375)"> <title>Sheet.65</title> <desc>PARTITION_VERT</desc> <v:textBlock v:margins="rect(4,4,4,4)"/> @@ -344,5 +149,77 @@ <rect x="0" y="586.125" width="144" height="27" class="st2"/> <text x="18.12" y="604.32" class="st3" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>PARTITION_<tspan class="st4" v:langID="2052">VERT</tspan></text> </g> + <g id="shape66-49" v:mID="66" v:groupContext="shape" transform="translate(685.875,0.75) rotate(90)"> + <title>Sheet.66</title> + <path d="M0 613.13 L144 613.13" class="st5"/> + </g> + <g id="shape67-52" v:mID="67" v:groupContext="shape" transform="translate(0.75,-540.375)"> + <title>Sheet.67</title> + <path d="M0 613.13 L144 613.13" class="st5"/> + </g> + <g id="shape68-55" v:mID="68" v:groupContext="shape" transform="translate(865.875,0.750007) rotate(90)"> + <title>Sheet.68</title> + <path d="M0 613.13 L144 613.13" class="st5"/> + </g> + <g id="shape69-58" v:mID="69" v:groupContext="shape" transform="translate(901.875,0.750007) rotate(90)"> + <title>Sheet.69</title> + <path d="M0 613.13 L144 613.13" class="st5"/> + </g> + <g id="shape70-61" v:mID="70" v:groupContext="shape" transform="translate(937.875,0.750007) rotate(90)"> + <title>Sheet.70</title> + <path d="M0 613.13 L144 613.13" class="st5"/> + </g> + <g id="shape71-64" v:mID="71" v:groupContext="shape" transform="translate(432.75,-504.375)"> + <title>Sheet.71</title> + <path d="M0 613.13 L144 613.13" class="st5"/> + </g> + <g id="shape72-67" v:mID="72" v:groupContext="shape" transform="translate(432.75,-540.375)"> + <title>Sheet.72</title> + <path d="M0 613.13 L144 613.13" class="st5"/> + </g> + <g id="shape73-70" v:mID="73" v:groupContext="shape" transform="translate(432.75,-576.375)"> + <title>Sheet.73</title> + <path d="M0 613.13 L144 613.13" class="st5"/> + </g> + <g id="shape74-73" v:mID="74" v:groupContext="shape" transform="translate(0.75,-324.375)"> + <title>Sheet.74</title> + <path d="M0 613.13 L144 613.13" class="st5"/> + </g> + <g id="shape75-76" v:mID="75" v:groupContext="shape" transform="translate(685.875,288.75) rotate(90)"> + <title>Sheet.75</title> + <path d="M0 613.13 L72 613.13" class="st5"/> + </g> + <g id="shape76-79" v:mID="76" v:groupContext="shape" transform="translate(901.875,216.75) rotate(90)"> + <title>Sheet.76</title> + <path d="M0 613.13 L144 613.13" class="st5"/> + </g> + <g id="shape77-82" v:mID="77" v:groupContext="shape" transform="translate(216.75,-324.375)"> + <title>Sheet.77</title> + <path d="M0 613.13 L72 613.13" class="st5"/> + </g> + <g id="shape78-85" v:mID="78" v:groupContext="shape" transform="translate(432.75,-324.375)"> + <title>Sheet.78</title> + <path d="M0 613.13 L144 613.13" class="st5"/> + </g> + <g id="shape79-88" v:mID="79" v:groupContext="shape" transform="translate(1117.88,216.75) rotate(90)"> + <title>Sheet.79</title> + <path d="M0 613.13 L72 613.13" class="st5"/> + </g> + <g id="shape80-91" v:mID="80" v:groupContext="shape" transform="translate(685.875,432.75) rotate(90)"> + <title>Sheet.80</title> + <path d="M0 613.13 L144 613.13" class="st5"/> + </g> + <g id="shape81-94" v:mID="81" v:groupContext="shape" transform="translate(72.75,-108.375)"> + <title>Sheet.81</title> + <path d="M0 613.13 L72 613.13" class="st5"/> + </g> + <g id="shape82-97" v:mID="82" v:groupContext="shape" transform="translate(216.75,-108.375)"> + <title>Sheet.82</title> + <path d="M0 613.13 L144 613.13" class="st5"/> + </g> + <g id="shape83-100" v:mID="83" v:groupContext="shape" transform="translate(1117.88,432.75) rotate(90)"> + <title>Sheet.83</title> + <path d="M0 613.13 L144 613.13" class="st5"/> + </g> </g> </svg>