Coverage Report

Created: 2026-10-28 06:18

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/work/vvenc/source/Lib/CommonLib/DepQuant.cpp
Line
Count
Source
1
/* -----------------------------------------------------------------------------
2
The copyright in this software is being made available under the Clear BSD
3
License, included below. No patent rights, trademark rights and/or 
4
other Intellectual Property Rights other than the copyrights concerning 
5
the Software are granted under this license.
6
7
The Clear BSD License
8
9
Copyright (c) 2019-2026, Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. & The VVenC Authors.
10
All rights reserved.
11
12
Redistribution and use in source and binary forms, with or without modification,
13
are permitted (subject to the limitations in the disclaimer below) provided that
14
the following conditions are met:
15
16
     * Redistributions of source code must retain the above copyright notice,
17
     this list of conditions and the following disclaimer.
18
19
     * Redistributions in binary form must reproduce the above copyright
20
     notice, this list of conditions and the following disclaimer in the
21
     documentation and/or other materials provided with the distribution.
22
23
     * Neither the name of the copyright holder nor the names of its
24
     contributors may be used to endorse or promote products derived from this
25
     software without specific prior written permission.
26
27
NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY
28
THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
29
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
30
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
31
PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
32
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
33
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
34
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
35
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
36
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
37
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
38
POSSIBILITY OF SUCH DAMAGE.
39
40
41
------------------------------------------------------------------------------------------- */
42
43
#include "DepQuant.h"
44
#include "TrQuant.h"
45
#include "CodingStructure.h"
46
#include "UnitTools.h"
47
48
#include <bitset>
49
50
//! \ingroup CommonLib
51
//! \{
52
53
namespace vvenc {
54
55
56
namespace DQIntern
57
{
58
  static void findFirstPos( int& firstTestPos, const TCoeff* tCoeff, const DQIntern::TUParameters& tuPars, int defaultTh,
59
                            bool zeroOutForThres, int zeroOutWidth, int zeroOutHeight )
60
2.39M
  {
61
280M
    for( ; firstTestPos >= 0; firstTestPos-- )
62
279M
    {
63
279M
      if( zeroOutForThres && ( tuPars.m_scanId2BlkPos[firstTestPos].x >= zeroOutWidth ||
64
37.2M
                              tuPars.m_scanId2BlkPos[firstTestPos].y >= zeroOutHeight ) )
65
0
      {
66
0
        continue;
67
0
      }
68
279M
      if( abs( tCoeff[tuPars.m_scanId2BlkPos[firstTestPos].idx] ) > defaultTh )
69
986k
      {
70
986k
        break;
71
986k
      }
72
279M
    }
73
2.39M
  }
74
75
  void Rom::xInitScanArrays()
76
1.49k
  {
77
1.49k
    if( m_scansInitialized )
78
0
    {
79
0
      return;
80
0
    }
81
1.49k
    ::memset( m_scanId2NbInfoSbbArray, 0, sizeof(m_scanId2NbInfoSbbArray) );
82
1.49k
    ::memset( m_scanId2NbInfoOutArray, 0, sizeof(m_scanId2NbInfoOutArray) );
83
1.49k
    ::memset( m_tuParameters,          0, sizeof(m_tuParameters) );
84
85
1.49k
    uint32_t raster2id[ MAX_CU_SIZE * MAX_CU_SIZE ];
86
1.49k
    ::memset(raster2id, 0, sizeof(raster2id));
87
88
11.9k
    for( int hd = 0; hd < MAX_TU_SIZE_IDX; hd++ )
89
10.4k
    {
90
83.6k
      for( int vd = 0; vd < MAX_TU_SIZE_IDX; vd++ )
91
73.1k
      {
92
73.1k
        if( (hd == 0 && vd <= 1) || (hd <= 1 && vd == 0) )
93
4.47k
        {
94
4.47k
          continue;
95
4.47k
        }
96
68.6k
        const uint32_t      blockWidth    = (1 << hd);
97
68.6k
        const uint32_t      blockHeight   = (1 << vd);
98
68.6k
        const uint32_t      log2CGWidth   = g_log2SbbSize[hd][vd][0];
99
68.6k
        const uint32_t      log2CGHeight  = g_log2SbbSize[hd][vd][1];
100
68.6k
        const uint32_t      groupWidth    = 1 << log2CGWidth;
101
68.6k
        const uint32_t      groupHeight   = 1 << log2CGHeight;
102
68.6k
        const uint32_t      groupSize     = groupWidth * groupHeight;
103
68.6k
        const SizeType      blkWidthIdx   = Log2( blockWidth );
104
68.6k
        const SizeType      blkHeightIdx  = Log2( blockHeight );
105
68.6k
        const ScanElement * scanId2RP     = getScanOrder( SCAN_GROUPED_4x4, blkWidthIdx, blkHeightIdx );
106
68.6k
        NbInfoSbb*&         sId2NbSbb     = m_scanId2NbInfoSbbArray[hd][vd];
107
68.6k
        NbInfoOut*&         sId2NbOut     = m_scanId2NbInfoOutArray[hd][vd];
108
        // consider only non-zero-out region
109
68.6k
        const uint32_t      blkWidthNZOut = std::min<unsigned>( JVET_C0024_ZERO_OUT_TH, blockWidth  );
110
68.6k
        const uint32_t      blkHeightNZOut= std::min<unsigned>( JVET_C0024_ZERO_OUT_TH, blockHeight );
111
68.6k
        const uint32_t      totalValues   = blkWidthNZOut * blkHeightNZOut;
112
113
68.6k
        sId2NbSbb = new NbInfoSbb[ totalValues ];
114
68.6k
        sId2NbOut = new NbInfoOut[ totalValues ];
115
116
13.5M
        for( uint32_t scanId = 0; scanId < totalValues; scanId++ )
117
13.4M
        {
118
13.4M
          raster2id[scanId2RP[scanId].idx] = scanId;
119
13.4M
          sId2NbSbb[scanId].numInv = 0;
120
13.4M
        }
121
122
13.5M
        for( unsigned scanId = 0; scanId < totalValues; scanId++ )
123
13.4M
        {
124
13.4M
          const int posX = scanId2RP[scanId].x;
125
13.4M
          const int posY = scanId2RP[scanId].y;
126
13.4M
          const int rpos = scanId2RP[scanId].idx;
127
13.4M
          {
128
            //===== inside subband neighbours =====
129
13.4M
            const int      begSbb = scanId - ( scanId & (groupSize-1) ); // first pos in current subblock
130
13.4M
            int            cpos[5];
131
132
13.4M
            cpos[0] = ( posX + 1 < blkWidthNZOut                              ? ( raster2id[rpos+1           ] < groupSize + begSbb ? raster2id[rpos+1           ] - begSbb : 0 ) : 0 );
133
13.4M
            cpos[1] = ( posX + 2 < blkWidthNZOut                              ? ( raster2id[rpos+2           ] < groupSize + begSbb ? raster2id[rpos+2           ] - begSbb : 0 ) : 0 );
134
13.4M
            cpos[2] = ( posX + 1 < blkWidthNZOut && posY + 1 < blkHeightNZOut ? ( raster2id[rpos+1+blockWidth] < groupSize + begSbb ? raster2id[rpos+1+blockWidth] - begSbb : 0 ) : 0 );
135
13.4M
            cpos[3] = ( posY + 1 < blkHeightNZOut                             ? ( raster2id[rpos+  blockWidth] < groupSize + begSbb ? raster2id[rpos+  blockWidth] - begSbb : 0 ) : 0 );
136
13.4M
            cpos[4] = ( posY + 2 < blkHeightNZOut                             ? ( raster2id[rpos+2*blockWidth] < groupSize + begSbb ? raster2id[rpos+2*blockWidth] - begSbb : 0 ) : 0 );
137
138
13.4M
            int num = 0;
139
13.4M
            int inPos[5] = { 0, };
140
141
54.0M
            while( true )
142
54.0M
            {
143
54.0M
              int nk = -1;
144
324M
              for( int k = 0; k < 5; k++ )
145
270M
              {
146
270M
                if( cpos[k] != 0 && ( nk < 0 || cpos[k] < cpos[nk] ) )
147
60.7M
                {
148
60.7M
                  nk = k;
149
60.7M
                }
150
270M
              }
151
54.0M
              if( nk < 0 )
152
13.4M
              {
153
13.4M
                break;
154
13.4M
              }
155
40.5M
              inPos[ num++ ] = uint8_t( cpos[nk] );
156
40.5M
              cpos[nk] = 0;
157
40.5M
            }
158
40.2M
            for( int k = num; k < 5; k++ )
159
26.7M
            {
160
26.7M
              inPos[k] = 0;
161
26.7M
            }
162
54.0M
            for( int k = 0; k < num; k++ )
163
40.5M
            {
164
40.5M
              CHECK( sId2NbSbb[begSbb + inPos[k]].numInv >= 5, "" );
165
40.5M
              sId2NbSbb[begSbb + inPos[k]].invInPos[sId2NbSbb[begSbb + inPos[k]].numInv++] = scanId & ( groupSize - 1 );
166
40.5M
            }
167
13.4M
          }
168
13.4M
          {
169
            //===== outside subband neighbours =====
170
13.4M
            NbInfoOut&     nbOut  = sId2NbOut[ scanId ];
171
13.4M
            const int      begSbb = scanId - ( scanId & (groupSize-1) ); // first pos in current subblock
172
13.4M
            int            cpos[5];
173
174
13.4M
            cpos[0] = ( posX + 1 < blkWidthNZOut                              ? ( raster2id[rpos+1           ] >= groupSize + begSbb ? raster2id[rpos+1           ] : 0 ) : 0 );
175
13.4M
            cpos[1] = ( posX + 2 < blkWidthNZOut                              ? ( raster2id[rpos+2           ] >= groupSize + begSbb ? raster2id[rpos+2           ] : 0 ) : 0 );
176
13.4M
            cpos[2] = ( posX + 1 < blkWidthNZOut && posY + 1 < blkHeightNZOut ? ( raster2id[rpos+1+blockWidth] >= groupSize + begSbb ? raster2id[rpos+1+blockWidth] : 0 ) : 0 );
177
13.4M
            cpos[3] = ( posY + 1 < blkHeightNZOut                             ? ( raster2id[rpos+  blockWidth] >= groupSize + begSbb ? raster2id[rpos+  blockWidth] : 0 ) : 0 );
178
13.4M
            cpos[4] = ( posY + 2 < blkHeightNZOut                             ? ( raster2id[rpos+2*blockWidth] >= groupSize + begSbb ? raster2id[rpos+2*blockWidth] : 0 ) : 0 );
179
180
32.6M
            for( nbOut.num = 0; true; )
181
32.6M
            {
182
32.6M
              int nk = -1;
183
196M
              for( int k = 0; k < 5; k++ )
184
163M
              {
185
163M
                if( cpos[k] != 0 && ( nk < 0 || cpos[k] < cpos[nk] ) )
186
28.1M
                {
187
28.1M
                  nk = k;
188
28.1M
                }
189
163M
              }
190
32.6M
              if( nk < 0 )
191
13.4M
              {
192
13.4M
                break;
193
13.4M
              }
194
19.2M
              nbOut.outPos[ nbOut.num++ ] = uint16_t( cpos[nk] );
195
19.2M
              cpos[nk] = 0;
196
19.2M
            }
197
61.5M
            for( int k = nbOut.num; k < 5; k++ )
198
48.1M
            {
199
48.1M
              nbOut.outPos[k] = 0;
200
48.1M
            }
201
13.4M
            nbOut.maxDist = ( scanId == 0 ? 0 : sId2NbOut[scanId-1].maxDist );
202
32.6M
            for( int k = 0; k < nbOut.num; k++ )
203
19.2M
            {
204
19.2M
              if( nbOut.outPos[k] > nbOut.maxDist )
205
2.07M
              {
206
2.07M
                nbOut.maxDist = nbOut.outPos[k];
207
2.07M
              }
208
19.2M
            }
209
13.4M
          }
210
13.4M
        }
211
212
        // make it relative
213
13.5M
        for( unsigned scanId = 0; scanId < totalValues; scanId++ )
214
13.4M
        {
215
13.4M
          NbInfoOut& nbOut  = sId2NbOut[scanId];
216
13.4M
          const int  begSbb = scanId - ( scanId & (groupSize-1) ); // first pos in current subblock
217
32.6M
          for( int k = 0; k < nbOut.num; k++ )
218
19.2M
          {
219
19.2M
            CHECK(begSbb > nbOut.outPos[k], "Position must be past sub block begin");
220
19.2M
            nbOut.outPos[k] -= begSbb;
221
19.2M
          }
222
13.4M
          nbOut.maxDist -= scanId;
223
13.4M
        }
224
225
206k
        for( int chId = 0; chId < MAX_NUM_CH; chId++ )
226
137k
        {
227
137k
          m_tuParameters[hd][vd][chId] = new TUParameters( *this, blockWidth, blockHeight, ChannelType(chId) );
228
137k
        }
229
68.6k
      }
230
10.4k
    }
231
1.49k
    m_scansInitialized = true;
232
1.49k
  }
233
234
  void Rom::xUninitScanArrays()
235
1.49k
  {
236
1.49k
    if( !m_scansInitialized )
237
0
    {
238
0
      return;
239
0
    }
240
11.9k
    for( int hd = 0; hd < MAX_TU_SIZE_IDX; hd++ )
241
10.4k
    {
242
83.6k
      for( int vd = 0; vd < MAX_TU_SIZE_IDX; vd++ )
243
73.1k
      {
244
73.1k
        NbInfoSbb*& sId2NbSbb = m_scanId2NbInfoSbbArray[hd][vd];
245
73.1k
        NbInfoOut*& sId2NbOut = m_scanId2NbInfoOutArray[hd][vd];
246
73.1k
        if( sId2NbSbb )
247
68.6k
        {
248
68.6k
          delete [] sId2NbSbb;
249
68.6k
        }
250
73.1k
        if( sId2NbOut )
251
68.6k
        {
252
68.6k
          delete [] sId2NbOut;
253
68.6k
        }
254
219k
        for( int chId = 0; chId < MAX_NUM_CH; chId++ )
255
146k
        {
256
146k
          TUParameters*& tuPars = m_tuParameters[hd][vd][chId];
257
146k
          if( tuPars )
258
137k
          {
259
137k
            delete tuPars;
260
137k
          }
261
146k
        }
262
73.1k
      }
263
10.4k
    }
264
1.49k
    m_scansInitialized = false;
265
1.49k
  }
266
267
268
  TUParameters::TUParameters( const Rom& rom, const unsigned width, const unsigned height, const ChannelType chType )
269
137k
  {
270
137k
    m_chType              = chType;
271
137k
    m_width               = width;
272
137k
    m_height              = height;
273
137k
    const uint32_t nonzeroWidth  = std::min<uint32_t>(JVET_C0024_ZERO_OUT_TH, m_width);
274
137k
    const uint32_t nonzeroHeight = std::min<uint32_t>(JVET_C0024_ZERO_OUT_TH, m_height);
275
137k
    m_numCoeff                   = nonzeroWidth * nonzeroHeight;
276
137k
    m_log2SbbWidth        = g_log2SbbSize[ Log2(m_width) ][ Log2(m_height) ][0];
277
137k
    m_log2SbbHeight       = g_log2SbbSize[ Log2(m_width) ][ Log2(m_height) ][1];
278
137k
    m_log2SbbSize         = m_log2SbbWidth + m_log2SbbHeight;
279
137k
    m_sbbSize             = ( 1 << m_log2SbbSize );
280
137k
    m_sbbMask             = m_sbbSize - 1;
281
137k
    m_widthInSbb  = nonzeroWidth >> m_log2SbbWidth;
282
137k
    m_heightInSbb = nonzeroHeight >> m_log2SbbHeight;
283
137k
    m_numSbb              = m_widthInSbb * m_heightInSbb;
284
137k
    SizeType        hsbb  = Log2( m_widthInSbb  );
285
137k
    SizeType        vsbb  = Log2( m_heightInSbb );
286
137k
    SizeType        hsId  = Log2( m_width  );
287
137k
    SizeType        vsId  = Log2( m_height );
288
137k
    m_scanSbbId2SbbPos    = getScanOrder( SCAN_UNGROUPED   , hsbb , vsbb );
289
137k
    m_scanId2BlkPos       = getScanOrder( SCAN_GROUPED_4x4 , hsId , vsId );
290
137k
    int log2W             = Log2( m_width  );
291
137k
    int log2H             = Log2( m_height );
292
137k
    m_scanId2NbInfoSbb    = rom.getNbInfoSbb( log2W, log2H );
293
137k
    m_scanId2NbInfoOut    = rom.getNbInfoOut( log2W, log2H );
294
137k
    m_scanInfo            = new ScanInfo[ m_numCoeff ];
295
27.0M
    for( int scanIdx = 0; scanIdx < m_numCoeff; scanIdx++ )
296
26.9M
    {
297
26.9M
      xSetScanInfo( m_scanInfo[scanIdx], scanIdx );
298
26.9M
    }
299
137k
  }
300
301
302
  void TUParameters::xSetScanInfo( ScanInfo& scanInfo, int scanIdx )
303
26.9M
  {
304
26.9M
    scanInfo.sbbSize    = m_sbbSize;
305
26.9M
    scanInfo.numSbb     = m_numSbb;
306
26.9M
    scanInfo.scanIdx    = scanIdx;
307
26.9M
    scanInfo.rasterPos  = m_scanId2BlkPos[scanIdx].idx;
308
26.9M
    scanInfo.sbbPos     = m_scanSbbId2SbbPos[scanIdx >> m_log2SbbSize].idx;
309
26.9M
    scanInfo.insidePos  = scanIdx & m_sbbMask;
310
26.9M
    scanInfo.spt        = SCAN_ISCSBB;
311
26.9M
    if(  scanInfo.insidePos == m_sbbMask && scanIdx > scanInfo.sbbSize && scanIdx < m_numCoeff - 1 )
312
1.45M
      scanInfo.spt      = SCAN_SOCSBB;
313
25.4M
    else if( scanInfo.insidePos == 0 && scanIdx > 0 && scanIdx < m_numCoeff - m_sbbSize )
314
1.45M
      scanInfo.spt      = SCAN_EOCSBB;
315
26.9M
    scanInfo.posX = m_scanId2BlkPos[scanIdx].x;
316
26.9M
    scanInfo.posY = m_scanId2BlkPos[scanIdx].y;
317
26.9M
    if( scanIdx )
318
26.7M
    {
319
26.7M
      const int nextScanIdx = scanIdx - 1;
320
26.7M
      const int diag        = m_scanId2BlkPos[nextScanIdx].x + m_scanId2BlkPos[nextScanIdx].y;
321
26.7M
      if( m_chType == CH_L )
322
13.3M
      {
323
13.3M
        scanInfo.sigCtxOffsetNext = ( diag < 2 ? 8 : diag < 5 ?  4 : 0 );
324
13.3M
        scanInfo.gtxCtxOffsetNext = ( diag < 1 ? 16 : diag < 3 ? 11 : diag < 10 ? 6 : 1 );
325
13.3M
      }
326
13.3M
      else
327
13.3M
      {
328
13.3M
        scanInfo.sigCtxOffsetNext = ( diag < 2 ? 4 : 0 );
329
13.3M
        scanInfo.gtxCtxOffsetNext = ( diag < 1 ? 6 : 1 );
330
13.3M
      }
331
26.7M
      scanInfo.nextInsidePos      = nextScanIdx & m_sbbMask;
332
26.7M
      scanInfo.currNbInfoSbb      = m_scanId2NbInfoSbb[ scanIdx ];
333
26.7M
      if( scanInfo.insidePos == 0 )
334
1.56M
      {
335
1.56M
        const int nextSbbPos  = m_scanSbbId2SbbPos[nextScanIdx >> m_log2SbbSize].idx;
336
1.56M
        const int nextSbbPosY = nextSbbPos               / m_widthInSbb;
337
1.56M
        const int nextSbbPosX = nextSbbPos - nextSbbPosY * m_widthInSbb;
338
1.56M
        scanInfo.nextSbbRight = ( nextSbbPosX < m_widthInSbb  - 1 ? nextSbbPos + 1            : 0 );
339
1.56M
        scanInfo.nextSbbBelow = ( nextSbbPosY < m_heightInSbb - 1 ? nextSbbPos + m_widthInSbb : 0 );
340
1.56M
      }
341
26.7M
    }
342
26.9M
  }
343
344
  void RateEstimator::initCtx( const TUParameters& tuPars, const TransformUnit& tu, const ComponentID compID, const FracBitsAccess& fracBitsAccess )
345
986k
  {
346
986k
    m_scanId2Pos = tuPars.m_scanId2BlkPos;
347
986k
    xSetSigSbbFracBits  ( fracBitsAccess, tuPars.m_chType );
348
986k
    xSetSigFlagBits     ( fracBitsAccess, tuPars.m_chType );
349
986k
    xSetGtxFlagBits     ( fracBitsAccess, tuPars.m_chType );
350
986k
    xSetLastCoeffOffset ( fracBitsAccess, tuPars, tu, compID );
351
986k
  }
352
353
  void RateEstimator::xSetLastCoeffOffset( const FracBitsAccess& fracBitsAccess, const TUParameters& tuPars, const TransformUnit& tu, const ComponentID compID )
354
986k
  {
355
986k
    const ChannelType chType = ( compID == COMP_Y ? CH_L : CH_C );
356
986k
    int32_t cbfDeltaBits = 0;
357
986k
    if( compID == COMP_Y && !CU::isIntra(*tu.cu) && !tu.depth )
358
299
    {
359
299
      const BinFracBits bits  = fracBitsAccess.getFracBitsArray( Ctx::QtRootCbf() );
360
299
      cbfDeltaBits            = int32_t( bits.intBits[1] ) - int32_t( bits.intBits[0] );
361
299
    }
362
986k
    else
363
986k
    {
364
986k
      BinFracBits bits;
365
986k
      bool prevLumaCbf           = false;
366
986k
      bool lastCbfIsInferred     = false;
367
986k
      bool useIntraSubPartitions = tu.cu->ispMode && isLuma(chType);
368
986k
      if( useIntraSubPartitions )
369
13.3k
      {
370
13.3k
        bool rootCbfSoFar = false;
371
13.3k
        bool isLastSubPartition = CU::isISPLast(*tu.cu, tu.Y(), compID);
372
13.3k
        uint32_t nTus = tu.cu->ispMode == HOR_INTRA_SUBPARTITIONS ? tu.cu->lheight() >> Log2(tu.lheight()) : tu.cu->lwidth() >> Log2(tu.lwidth());
373
13.3k
        if( isLastSubPartition )
374
227
        {
375
227
          TransformUnit* tuPointer = tu.cu->firstTU;
376
908
          for( int tuIdx = 0; tuIdx < nTus - 1; tuIdx++ )
377
681
          {
378
681
            rootCbfSoFar |= TU::getCbfAtDepth(*tuPointer, COMP_Y, tu.depth);
379
681
            tuPointer     = tuPointer->next;
380
681
          }
381
227
          if( !rootCbfSoFar )
382
0
          {
383
0
            lastCbfIsInferred = true;
384
0
          }
385
227
        }
386
13.3k
        if( !lastCbfIsInferred )
387
13.3k
        {
388
13.3k
          prevLumaCbf = TU::getPrevTuCbfAtDepth(tu, compID, tu.depth);
389
13.3k
        }
390
13.3k
        bits = fracBitsAccess.getFracBitsArray(Ctx::QtCbf[compID](DeriveCtx::CtxQtCbf(compID, prevLumaCbf, true)));
391
13.3k
      }
392
972k
      else
393
972k
      {
394
972k
        bits = fracBitsAccess.getFracBitsArray(Ctx::QtCbf[compID](DeriveCtx::CtxQtCbf(compID, tu.cbf[COMP_Cb])));
395
972k
      }
396
986k
      cbfDeltaBits = lastCbfIsInferred ? 0 : int32_t(bits.intBits[1]) - int32_t(bits.intBits[0]);
397
986k
    }
398
399
986k
    static const unsigned prefixCtx[] = { 0, 0, 0, 3, 6, 10, 15, 21 };
400
986k
    uint32_t              ctxBits  [ LAST_SIGNIFICANT_GROUPS ];
401
2.95M
    for( unsigned xy = 0; xy < 2; xy++ )
402
1.97M
    {
403
1.97M
      int32_t             bitOffset   = ( xy ? cbfDeltaBits : 0 );
404
1.97M
      int32_t*            lastBits    = ( xy ? m_lastBitsY : m_lastBitsX );
405
1.97M
      const unsigned      size        = ( xy ? tuPars.m_height : tuPars.m_width );
406
1.97M
      const unsigned      log2Size    = Log2( size );
407
1.97M
      const bool          useYCtx     = ( xy != 0 );
408
1.97M
      const CtxSet&       ctxSetLast  = ( useYCtx ? Ctx::LastY : Ctx::LastX )[ chType ];
409
1.97M
      const unsigned      lastShift   = ( compID == COMP_Y ? (log2Size+1)>>2 : Clip3<unsigned>(0,2,size>>3) );
410
1.97M
      const unsigned      lastOffset  = ( compID == COMP_Y ? ( prefixCtx[log2Size] ) : 0 );
411
1.97M
      uint32_t            sumFBits    = 0;
412
1.97M
      unsigned            maxCtxId    = g_uiGroupIdx[std::min<unsigned>(JVET_C0024_ZERO_OUT_TH, size) - 1];
413
13.3M
      for( unsigned ctxId = 0; ctxId < maxCtxId; ctxId++ )
414
11.3M
      {
415
11.3M
        const BinFracBits bits  = fracBitsAccess.getFracBitsArray( ctxSetLast( lastOffset + ( ctxId >> lastShift ) ) );
416
11.3M
        ctxBits[ ctxId ]        = sumFBits + bits.intBits[0] + ( ctxId>3 ? ((ctxId-2)>>1)<<SCALE_BITS : 0 ) + bitOffset;
417
11.3M
        sumFBits               +=            bits.intBits[1];
418
11.3M
      }
419
1.97M
      ctxBits  [ maxCtxId ]     = sumFBits + ( maxCtxId>3 ? ((maxCtxId-2)>>1)<<SCALE_BITS : 0 ) + bitOffset;
420
28.0M
      for (unsigned pos = 0; pos < std::min<unsigned>(JVET_C0024_ZERO_OUT_TH, size); pos++)
421
26.0M
      {
422
26.0M
        lastBits[ pos ]         = ctxBits[ g_uiGroupIdx[ pos ] ];
423
26.0M
      }
424
1.97M
    }
425
986k
  }
426
427
  void RateEstimator::xSetSigSbbFracBits( const FracBitsAccess& fracBitsAccess, ChannelType chType )
428
986k
  {
429
986k
    const CtxSet& ctxSet = Ctx::SigCoeffGroup[ chType ];
430
2.95M
    for( unsigned ctxId = 0; ctxId < sm_maxNumSigSbbCtx; ctxId++ )
431
1.97M
    {
432
1.97M
      m_sigSbbFracBits[ ctxId ] = fracBitsAccess.getFracBitsArray( ctxSet( ctxId ) );
433
1.97M
    }
434
986k
  }
435
436
  void RateEstimator::xSetSigFlagBits( const FracBitsAccess& fracBitsAccess, ChannelType chType )
437
986k
  {
438
3.94M
    for( unsigned ctxSetId = 0; ctxSetId < sm_numCtxSetsSig; ctxSetId++ )
439
2.95M
    {
440
2.95M
      BinFracBits*    bits    = m_sigFracBits [ ctxSetId ];
441
2.95M
      const CtxSet&   ctxSet  = Ctx::SigFlag  [ chType + 2*ctxSetId ];
442
2.95M
      const unsigned  numCtx  = ( chType == CH_L ? 12 : 8 );
443
27.0M
      for( unsigned ctxId = 0; ctxId < numCtx; ctxId++ )
444
24.1M
      {
445
24.1M
        bits[ ctxId ] = fracBitsAccess.getFracBitsArray( ctxSet( ctxId ) );
446
24.1M
      }
447
2.95M
    }
448
986k
  }
449
450
  void RateEstimator::xSetGtxFlagBits( const FracBitsAccess& fracBitsAccess, ChannelType chType )
451
986k
  {
452
986k
    const CtxSet&   ctxSetPar   = Ctx::ParFlag [     chType ];
453
986k
    const CtxSet&   ctxSetGt1   = Ctx::GtxFlag [ 2 + chType ];
454
986k
    const CtxSet&   ctxSetGt2   = Ctx::GtxFlag [     chType ];
455
986k
    const unsigned  numCtx      = ( chType == CH_L ? 21 : 11 );
456
12.2M
    for( unsigned ctxId = 0; ctxId < numCtx; ctxId++ )
457
11.2M
    {
458
11.2M
      BinFracBits     fbPar = fracBitsAccess.getFracBitsArray( ctxSetPar( ctxId ) );
459
11.2M
      BinFracBits     fbGt1 = fracBitsAccess.getFracBitsArray( ctxSetGt1( ctxId ) );
460
11.2M
      BinFracBits     fbGt2 = fracBitsAccess.getFracBitsArray( ctxSetGt2( ctxId ) );
461
11.2M
      CoeffFracBits&  cb    = m_gtxFracBits[ ctxId ];
462
11.2M
      int32_t         par0  = (1<<SCALE_BITS) + int32_t(fbPar.intBits[0]);
463
11.2M
      int32_t         par1  = (1<<SCALE_BITS) + int32_t(fbPar.intBits[1]);
464
11.2M
      cb.bits[0] = 0;
465
11.2M
      cb.bits[1] = fbGt1.intBits[0] + (1 << SCALE_BITS);
466
11.2M
      cb.bits[2] = fbGt1.intBits[1] + par0 + fbGt2.intBits[0];
467
11.2M
      cb.bits[3] = fbGt1.intBits[1] + par1 + fbGt2.intBits[0];
468
11.2M
      cb.bits[4] = fbGt1.intBits[1] + par0 + fbGt2.intBits[1];
469
11.2M
      cb.bits[5] = fbGt1.intBits[1] + par1 + fbGt2.intBits[1];
470
11.2M
    }
471
986k
  }
472
473
  void CommonCtx::update( const ScanInfo& scanInfo, const int prevId, int stateId, StateMem& curr )
474
141k
  {
475
141k
    uint8_t*    sbbFlags  = m_currSbbCtx[stateId].sbbFlags;
476
141k
    uint8_t*    levels    = m_currSbbCtx[stateId].levels;
477
141k
    uint16_t    maxDist   = m_nbInfo[scanInfo.scanIdx - 1].maxDist;
478
141k
    uint16_t    sbbSize   = scanInfo.sbbSize;
479
141k
    std::size_t setCpSize = ( maxDist > sbbSize ? maxDist - sbbSize : 0 ) * sizeof( uint8_t );
480
141k
    if( prevId >= 0 )
481
117k
    {
482
117k
      ::memcpy( sbbFlags, m_prevSbbCtx[prevId].sbbFlags, scanInfo.numSbb * sizeof( uint8_t ) );
483
117k
      ::memcpy( levels + scanInfo.scanIdx + sbbSize, m_prevSbbCtx[prevId].levels + scanInfo.scanIdx + sbbSize, setCpSize );
484
117k
    }
485
24.0k
    else
486
24.0k
    {
487
24.0k
      ::memset( sbbFlags, 0, scanInfo.numSbb * sizeof( uint8_t ) );
488
24.0k
      ::memset( levels + scanInfo.scanIdx + sbbSize, 0, setCpSize );
489
24.0k
    }
490
141k
    sbbFlags[scanInfo.sbbPos] = !!curr.numSig[stateId];
491
492
141k
    const int       sigNSbb = ( ( scanInfo.nextSbbRight ? sbbFlags[scanInfo.nextSbbRight] : false ) || ( scanInfo.nextSbbBelow ? sbbFlags[scanInfo.nextSbbBelow] : false ) ? 1 : 0 );
493
141k
    curr.refSbbCtxId[stateId] = stateId;
494
141k
    const BinFracBits sbbBits = m_sbbFlagBits[sigNSbb];
495
496
141k
    curr.sbbBits0[stateId] = sbbBits.intBits[0];
497
141k
    curr.sbbBits1[stateId] = sbbBits.intBits[1];
498
499
141k
    if( sigNSbb || ( ( scanInfo.nextSbbRight && scanInfo.nextSbbBelow ) ? sbbFlags[scanInfo.nextSbbBelow + 1] : false ) )
500
84.9k
    {
501
84.9k
      const int         scanBeg = scanInfo.scanIdx - scanInfo.sbbSize;
502
84.9k
      const NbInfoOut* nbOut = m_nbInfo + scanBeg;
503
84.9k
      const uint8_t* absLevels = levels + scanBeg;
504
505
1.44M
      for( int id = 0; id < scanInfo.sbbSize; id++, nbOut++ )
506
1.35M
      {
507
1.35M
        if( nbOut->num )
508
921k
        {
509
921k
          TCoeff sumAbs = 0, sumAbs1 = 0, sumNum = 0;
510
2.24M
#define UPDATE(k) {TCoeff t=absLevels[nbOut->outPos[k]]; sumAbs+=t; sumAbs1+=std::min<TCoeff>(4+(t&1),t); sumNum+=!!t; }
511
921k
          switch( nbOut->num )
512
921k
          {
513
0
          default:
514
60.7k
          case 5:
515
60.7k
            UPDATE( 4 );
516
182k
          case 4:
517
182k
            UPDATE( 3 );
518
497k
          case 3:
519
497k
            UPDATE( 2 );
520
582k
          case 2:
521
582k
            UPDATE( 1 );
522
921k
          case 1:
523
921k
            UPDATE( 0 );
524
921k
          }
525
921k
#undef UPDATE
526
921k
          curr.tplAcc[id][stateId] = ( sumNum << 5 ) | sumAbs1;
527
921k
          curr.sum1st[id][stateId] = ( uint8_t ) std::min( 255, sumAbs );
528
921k
        }
529
1.35M
      }
530
84.9k
    }
531
141k
  }
532
533
  void Quantizer::initQuantBlock(const TransformUnit& tu, const ComponentID compID, const QpParam& cQP, const double lambda, int gValue)
534
2.39M
  {
535
2.39M
    CHECKD( lambda <= 0.0, "Lambda must be greater than 0" );
536
537
2.39M
    const int         qpDQ                  = cQP.Qp(tu.mtsIdx[compID]==MTS_SKIP) + 1;
538
2.39M
    const int         qpPer                 = qpDQ / 6;
539
2.39M
    const int         qpRem                 = qpDQ - 6 * qpPer;
540
2.39M
    const SPS&        sps                   = *tu.cs->sps;
541
2.39M
    const CompArea&   area                  = tu.blocks[ compID ];
542
2.39M
    const ChannelType chType                = toChannelType( compID );
543
2.39M
    const int         channelBitDepth       = sps.bitDepths[ chType ];
544
2.39M
    const int         maxLog2TrDynamicRange = sps.getMaxLog2TrDynamicRange();
545
2.39M
    const int         nomTransformShift     = getTransformShift( channelBitDepth, area.size(), maxLog2TrDynamicRange );
546
2.39M
    const bool    needsSqrt2ScaleAdjustment = TU::needsSqrt2Scale(tu, compID);
547
2.39M
    const int         transformShift        = nomTransformShift + (needsSqrt2ScaleAdjustment?-1:0);
548
    // quant parameters
549
2.39M
    m_QShift                    = QUANT_SHIFT  - 1 + qpPer + transformShift;
550
2.39M
    m_QAdd                      = -( ( 3 << m_QShift ) >> 1 );
551
2.39M
    Intermediate_Int  invShift  = IQUANT_SHIFT + 1 - qpPer - transformShift;
552
2.39M
    m_QScale                    = g_quantScales[needsSqrt2ScaleAdjustment?1:0][ qpRem ];
553
2.39M
    const unsigned    qIdxBD    = std::min<unsigned>( maxLog2TrDynamicRange + 1, 8*sizeof(Intermediate_Int) + invShift - IQUANT_SHIFT - 1 );
554
2.39M
    m_maxQIdx                   = ( 1 << (qIdxBD-1) ) - 4;
555
2.39M
    if( m_QShift )
556
2.39M
      m_thresLast               = TCoeff((int64_t(m_DqThrVal) << (m_QShift-1)));
557
6
    else
558
6
      m_thresLast               = TCoeff((int64_t(m_DqThrVal>>1) << m_QShift));
559
2.39M
    m_thresSSbb                 = TCoeff((int64_t(3) << m_QShift));
560
    // distortion calculation parameters
561
2.39M
    const int64_t qScale        = (gValue==-1) ? m_QScale : gValue;
562
2.39M
    const int nomDShift =
563
2.39M
      SCALE_BITS - 2 * (nomTransformShift + DISTORTION_PRECISION_ADJUSTMENT(channelBitDepth)) + m_QShift + (needsSqrt2ScaleAdjustment ? 1 : 0);
564
2.39M
    const double  qScale2       = double( qScale * qScale );
565
2.39M
    const double  nomDistFactor = ( nomDShift < 0 ? 1.0/(double(int64_t(1)<<(-nomDShift))*qScale2*lambda) : double(int64_t(1)<<nomDShift)/(qScale2*lambda) );
566
2.39M
    const uint32_t pow2dfShift   = (uint32_t)( nomDistFactor * qScale2 ) + 1;
567
2.39M
    const int     dfShift       = ceilLog2( pow2dfShift );
568
2.39M
    m_DistShift                 = 62 + m_QShift - 2*maxLog2TrDynamicRange - dfShift;
569
2.39M
    m_DistAdd                   = (int64_t(1) << m_DistShift) >> 1;
570
2.39M
    m_DistStepAdd               = ((m_DistShift+m_QShift)>=64 ? (int64_t)( nomDistFactor * pow(2,m_DistShift+m_QShift) + .5 ) : (int64_t)( nomDistFactor * double(int64_t(1)<<(m_DistShift+m_QShift)) + .5 ));
571
2.39M
    m_DistOrgFact               = (int64_t)( nomDistFactor * double(int64_t(1)<<(m_DistShift+1       )) + .5 );
572
2.39M
  }
573
574
  void Quantizer::dequantBlock( const TransformUnit& tu, const ComponentID compID, const QpParam& cQP, CoeffBuf& recCoeff, bool enableScalingLists, int* piDequantCoef) const
575
971k
  {
576
577
    //----- set basic parameters -----
578
971k
    const CompArea&     area      = tu.blocks[ compID ];
579
971k
    const int           numCoeff  = area.area();
580
971k
    const SizeType      hsId      = Log2( area.width );
581
971k
    const SizeType      vsId      = Log2( area.height );
582
971k
    const ScanElement  *scan      = getScanOrder( SCAN_GROUPED_4x4, hsId, vsId );
583
971k
    const TCoeffSig*    qCoeff    = tu.getCoeffs( compID ).buf;
584
971k
          TCoeff*       tCoeff    = recCoeff.buf;
585
586
    //----- reset coefficients and get last scan index -----
587
971k
    ::memset( tCoeff, 0, numCoeff * sizeof( TCoeff ) );
588
971k
    int lastScanIdx = tu.lastPos[compID];
589
971k
    if( lastScanIdx < 0 )
590
0
    {
591
0
      return;
592
0
    }
593
594
    //----- set dequant parameters -----
595
971k
    const int         qpDQ                  = cQP.Qp(tu.mtsIdx[compID]==MTS_SKIP) + 1;
596
971k
    const int         qpPer                 = qpDQ / 6;
597
971k
    const int         qpRem                 = qpDQ - 6 * qpPer;
598
971k
    const SPS&        sps                   = *tu.cs->sps;
599
971k
    const ChannelType chType                = toChannelType( compID );
600
971k
    const int         channelBitDepth       = sps.bitDepths[ chType ];
601
971k
    const int         maxLog2TrDynamicRange = sps.getMaxLog2TrDynamicRange();
602
971k
    const TCoeff      minTCoeff             = -( 1 << maxLog2TrDynamicRange );
603
971k
    const TCoeff      maxTCoeff             =  ( 1 << maxLog2TrDynamicRange ) - 1;
604
971k
    const int         nomTransformShift     = getTransformShift( channelBitDepth, area.size(), maxLog2TrDynamicRange );
605
971k
    const bool    needsSqrt2ScaleAdjustment = TU::needsSqrt2Scale(tu, compID);
606
971k
    const int         transformShift        = nomTransformShift + (needsSqrt2ScaleAdjustment?-1:0);
607
971k
    Intermediate_Int  shift                 = IQUANT_SHIFT + 1 - qpPer - transformShift + (enableScalingLists ? LOG2_SCALING_LIST_NEUTRAL_VALUE : 0);
608
971k
    Intermediate_Int  invQScale             = g_invQuantScales[needsSqrt2ScaleAdjustment?1:0][ qpRem ];
609
971k
    Intermediate_Int  add                   = (shift < 0) ? 0 : ((1 << shift) >> 1);
610
    //----- dequant coefficients -----
611
10.2M
    for( int state = 0, scanIdx = lastScanIdx; scanIdx >= 0; scanIdx-- )
612
9.30M
    {
613
9.30M
      const unsigned   rasterPos = scan[scanIdx].idx;
614
9.30M
      const TCoeffSig& level     = qCoeff[ rasterPos ];
615
      // zero levels are not skipped by a (often mispredicted) branch: their qIdx is 0, so they give the 0 of the memset
616
9.30M
      if (enableScalingLists)
617
0
        invQScale = piDequantCoef[rasterPos];//scalingfactor*levelScale
618
9.30M
      if (shift < 0 && level && (enableScalingLists || scanIdx == lastScanIdx))
619
517k
      {
620
517k
        invQScale <<= -shift;
621
517k
      }
622
9.30M
      const int        sign      = (level > 0) - (level < 0);   // -1, 0 or 1
623
9.30M
      Intermediate_Int qIdx      = 2 * level - sign * (state >> 1);
624
9.30M
      int64_t  nomTCoeff          = ((int64_t)qIdx * (int64_t)invQScale + add) >> ((shift < 0) ? 0 : shift);
625
9.30M
      tCoeff[rasterPos]           = (TCoeff)Clip3<int64_t>(minTCoeff, maxTCoeff, nomTCoeff);
626
9.30M
      state = ( 32040 >> ((state<<2)+((level&1)<<1)) ) & 3;   // the 16-bit value "32040" represent the state transition table
627
9.30M
    }
628
971k
  }
629
630
  bool Quantizer::preQuantCoeff( const TCoeff absCoeff, PQData* pqData, int quanCoeff ) const
631
0
  {
632
0
    int64_t scaledOrg = int64_t( absCoeff ) * quanCoeff;
633
0
    TCoeff  qIdx      = TCoeff( ( scaledOrg + m_QAdd ) >> m_QShift );
634
635
0
    if( qIdx < 0 )
636
0
    {
637
0
      int64_t scaledAdd = m_DistStepAdd - scaledOrg * m_DistOrgFact;
638
0
      PQData& pq_a      = pqData[1];
639
0
      PQData& pq_b      = pqData[2];
640
641
0
      pq_a.deltaDist    = ( ( scaledAdd + 0 * m_DistStepAdd ) * 1 + m_DistAdd ) >> m_DistShift;
642
0
      pq_a.absLevel     = 1;
643
644
0
      pq_b.deltaDist    = ( ( scaledAdd + 1 * m_DistStepAdd ) * 2 + m_DistAdd ) >> m_DistShift;
645
0
      pq_b.absLevel     = 1;
646
      
647
0
      return true;
648
0
    }
649
     
650
0
    qIdx              = std::max<TCoeff>( 1, std::min<TCoeff>( m_maxQIdx, qIdx ) );
651
0
    int64_t scaledAdd = qIdx * m_DistStepAdd - scaledOrg * m_DistOrgFact;
652
653
0
    PQData& pq_a      = pqData[( qIdx + 0 ) & 3];
654
0
    PQData& pq_b      = pqData[( qIdx + 1 ) & 3];
655
0
    PQData& pq_c      = pqData[( qIdx + 2 ) & 3];
656
0
    PQData& pq_d      = pqData[( qIdx + 3 ) & 3];
657
658
0
    pq_a.deltaDist    = ( ( scaledAdd + 0 * m_DistStepAdd ) * ( qIdx + 0 ) + m_DistAdd ) >> m_DistShift;
659
0
    pq_a.absLevel     = ( qIdx + 1 ) >> 1;
660
661
0
    pq_b.deltaDist    = ( ( scaledAdd + 1 * m_DistStepAdd ) * ( qIdx + 1 ) + m_DistAdd ) >> m_DistShift;
662
0
    pq_b.absLevel     = ( qIdx + 2 ) >> 1;
663
664
0
    pq_c.deltaDist    = ( ( scaledAdd + 2 * m_DistStepAdd ) * ( qIdx + 2 ) + m_DistAdd ) >> m_DistShift;
665
0
    pq_c.absLevel     = ( qIdx + 3 ) >> 1;
666
667
0
    pq_d.deltaDist    = ( ( scaledAdd + 3 * m_DistStepAdd ) * ( qIdx + 3 ) + m_DistAdd ) >> m_DistShift;
668
0
    pq_d.absLevel     = ( qIdx + 4 ) >> 1;
669
670
0
    return false;
671
0
  }
672
673
  const int32_t g_goRiceBits[4][RICEMAX] =
674
  {
675
    { 32768,  65536,  98304, 131072, 163840, 196608, 262144, 262144, 327680, 327680, 327680, 327680, 393216, 393216, 393216, 393216, 393216, 393216, 393216, 393216, 458752, 458752, 458752, 458752, 458752, 458752, 458752, 458752, 458752, 458752, 458752, 458752},
676
    { 65536,  65536,  98304,  98304, 131072, 131072, 163840, 163840, 196608, 196608, 229376, 229376, 294912, 294912, 294912, 294912, 360448, 360448, 360448, 360448, 360448, 360448, 360448, 360448, 425984, 425984, 425984, 425984, 425984, 425984, 425984, 425984},
677
    { 98304,  98304,  98304,  98304, 131072, 131072, 131072, 131072, 163840, 163840, 163840, 163840, 196608, 196608, 196608, 196608, 229376, 229376, 229376, 229376, 262144, 262144, 262144, 262144, 327680, 327680, 327680, 327680, 327680, 327680, 327680, 327680},
678
    {131072, 131072, 131072, 131072, 131072, 131072, 131072, 131072, 163840, 163840, 163840, 163840, 163840, 163840, 163840, 163840, 196608, 196608, 196608, 196608, 196608, 196608, 196608, 196608, 229376, 229376, 229376, 229376, 229376, 229376, 229376, 229376}
679
  };
680
681
  static inline void initStates( const int stateId, DQIntern::StateMem& state )
682
7.89M
  {
683
7.89M
    state.rdCost[stateId]         = DQIntern::rdCostInit;
684
7.89M
    state.ctx.cff[stateId]        =  0;
685
7.89M
    state.ctx.sig[stateId]        =  0;
686
7.89M
    state.numSig[stateId]         =  0;
687
7.89M
    state.refSbbCtxId[stateId]    = -1;
688
7.89M
    state.remRegBins[stateId]     =  4;
689
7.89M
    state.cffBitsCtxOffset        =  0;
690
7.89M
    state.m_goRicePar[stateId]    =  0;
691
7.89M
    state.m_goRiceZero[stateId]   =  0;
692
7.89M
    state.sbbBits0[stateId]       =  0;
693
7.89M
    state.sbbBits1[stateId]       =  0;
694
7.89M
  }
695
696
  template<bool rrgEnsured = false>
697
  static inline void checkRdCosts( const int stateId, const DQIntern::ScanPosType spt, const DQIntern::PQData& pqDataA, const DQIntern::PQData& pqDataB, DQIntern::Decisions& decisions, int idxAZ, int idxB, const DQIntern::StateMem& state )
698
31.5M
  {
699
31.5M
    const int32_t* goRiceTab = DQIntern::g_goRiceBits[state.m_goRicePar[stateId]];
700
31.5M
    int64_t         rdCostA = state.rdCost[stateId] + pqDataA.deltaDist;
701
31.5M
    int64_t         rdCostB = state.rdCost[stateId] + pqDataB.deltaDist;
702
31.5M
    int64_t         rdCostZ = state.rdCost[stateId];
703
704
31.5M
    if( rrgEnsured || state.remRegBins[stateId] >= 4 )
705
31.0M
    {
706
31.0M
      const CoeffFracBits& cffBits = state.m_gtxFracBitsArray[state.ctx.cff[stateId]];
707
31.0M
      const BinFracBits    sigBits = state.m_sigFracBitsArray[stateId][state.ctx.sig[stateId]];
708
709
31.0M
      if( pqDataA.absLevel < 4 )
710
7.36M
        rdCostA += cffBits.bits[pqDataA.absLevel];
711
23.6M
      else
712
23.6M
      {
713
23.6M
        const unsigned value = ( pqDataA.absLevel - 4 ) >> 1;
714
23.6M
        rdCostA += cffBits.bits[pqDataA.absLevel - ( value << 1 )] + goRiceTab[std::min<unsigned>( value, RICEMAX - 1 )];
715
23.6M
      }
716
717
31.0M
      if( pqDataB.absLevel < 4 )
718
9.23M
        rdCostB += cffBits.bits[pqDataB.absLevel];
719
21.8M
      else
720
21.8M
      {
721
21.8M
        const unsigned value = ( pqDataB.absLevel - 4 ) >> 1;
722
21.8M
        rdCostB += cffBits.bits[pqDataB.absLevel - ( value << 1 )] + goRiceTab[std::min<unsigned>( value, RICEMAX - 1 )];
723
21.8M
      }
724
725
31.0M
      if( spt == SCAN_ISCSBB )
726
30.9M
      {
727
30.9M
        rdCostA += sigBits.intBits[1];
728
30.9M
        rdCostB += sigBits.intBits[1];
729
30.9M
        rdCostZ += sigBits.intBits[0];
730
30.9M
      }
731
81.7k
      else if( spt == SCAN_SOCSBB )
732
13.0k
      {
733
13.0k
        rdCostA += state.sbbBits1[stateId] + sigBits.intBits[1];
734
13.0k
        rdCostB += state.sbbBits1[stateId] + sigBits.intBits[1];
735
13.0k
        rdCostZ += state.sbbBits1[stateId] + sigBits.intBits[0];
736
13.0k
      }
737
68.6k
      else if( state.numSig[stateId] )
738
67.3k
      {
739
67.3k
        rdCostA += sigBits.intBits[1];
740
67.3k
        rdCostB += sigBits.intBits[1];
741
67.3k
        rdCostZ += sigBits.intBits[0];
742
67.3k
      }
743
1.37k
      else
744
1.37k
      {
745
1.37k
        rdCostZ = rdCostInit;
746
1.37k
      }
747
31.0M
    }
748
483k
    else
749
483k
    {
750
483k
      rdCostA += ( 1 << SCALE_BITS ) + goRiceTab[pqDataA.absLevel <= state.m_goRiceZero[stateId] ? pqDataA.absLevel - 1 : std::min<int>( pqDataA.absLevel, RICEMAX - 1 )];
751
483k
      rdCostB += ( 1 << SCALE_BITS ) + goRiceTab[pqDataB.absLevel <= state.m_goRiceZero[stateId] ? pqDataB.absLevel - 1 : std::min<int>( pqDataB.absLevel, RICEMAX - 1 )];
752
483k
      rdCostZ += goRiceTab[state.m_goRiceZero[stateId]];
753
483k
    }
754
755
31.5M
    if( rdCostA < rdCostZ && rdCostA < decisions.rdCost[idxAZ] )
756
19.7M
    {
757
19.7M
      decisions.rdCost[idxAZ] = rdCostA;
758
19.7M
      decisions.absLevel[idxAZ] = pqDataA.absLevel;
759
19.7M
      decisions.prevId[idxAZ] = stateId;
760
19.7M
    }
761
11.8M
    else if( rdCostZ < decisions.rdCost[idxAZ] )
762
387k
    {
763
387k
      decisions.rdCost[idxAZ] = rdCostZ;
764
387k
      decisions.absLevel[idxAZ] = 0;
765
387k
      decisions.prevId[idxAZ] = stateId;
766
387k
    }
767
768
31.5M
    if( rdCostB < decisions.rdCost[idxB] )
769
20.1M
    {
770
20.1M
      decisions.rdCost[idxB] = rdCostB;
771
20.1M
      decisions.absLevel[idxB] = pqDataB.absLevel;
772
20.1M
      decisions.prevId[idxB] = stateId;
773
20.1M
    }
774
31.5M
  }
DepQuant.cpp:void vvenc::DQIntern::checkRdCosts<true>(int, vvenc::DQIntern::ScanPosType, vvenc::DQIntern::PQData const&, vvenc::DQIntern::PQData const&, vvenc::DQIntern::Decisions&, int, int, vvenc::DQIntern::StateMem const&)
Line
Count
Source
698
5.49M
  {
699
5.49M
    const int32_t* goRiceTab = DQIntern::g_goRiceBits[state.m_goRicePar[stateId]];
700
5.49M
    int64_t         rdCostA = state.rdCost[stateId] + pqDataA.deltaDist;
701
5.49M
    int64_t         rdCostB = state.rdCost[stateId] + pqDataB.deltaDist;
702
5.49M
    int64_t         rdCostZ = state.rdCost[stateId];
703
704
5.49M
    if( rrgEnsured || state.remRegBins[stateId] >= 4 )
705
5.49M
    {
706
5.49M
      const CoeffFracBits& cffBits = state.m_gtxFracBitsArray[state.ctx.cff[stateId]];
707
5.49M
      const BinFracBits    sigBits = state.m_sigFracBitsArray[stateId][state.ctx.sig[stateId]];
708
709
5.49M
      if( pqDataA.absLevel < 4 )
710
5.49M
        rdCostA += cffBits.bits[pqDataA.absLevel];
711
0
      else
712
0
      {
713
0
        const unsigned value = ( pqDataA.absLevel - 4 ) >> 1;
714
0
        rdCostA += cffBits.bits[pqDataA.absLevel - ( value << 1 )] + goRiceTab[std::min<unsigned>( value, RICEMAX - 1 )];
715
0
      }
716
717
5.49M
      if( pqDataB.absLevel < 4 )
718
5.49M
        rdCostB += cffBits.bits[pqDataB.absLevel];
719
0
      else
720
0
      {
721
0
        const unsigned value = ( pqDataB.absLevel - 4 ) >> 1;
722
0
        rdCostB += cffBits.bits[pqDataB.absLevel - ( value << 1 )] + goRiceTab[std::min<unsigned>( value, RICEMAX - 1 )];
723
0
      }
724
725
5.49M
      if( spt == SCAN_ISCSBB )
726
5.46M
      {
727
5.46M
        rdCostA += sigBits.intBits[1];
728
5.46M
        rdCostB += sigBits.intBits[1];
729
5.46M
        rdCostZ += sigBits.intBits[0];
730
5.46M
      }
731
30.8k
      else if( spt == SCAN_SOCSBB )
732
10.8k
      {
733
10.8k
        rdCostA += state.sbbBits1[stateId] + sigBits.intBits[1];
734
10.8k
        rdCostB += state.sbbBits1[stateId] + sigBits.intBits[1];
735
10.8k
        rdCostZ += state.sbbBits1[stateId] + sigBits.intBits[0];
736
10.8k
      }
737
19.9k
      else if( state.numSig[stateId] )
738
19.0k
      {
739
19.0k
        rdCostA += sigBits.intBits[1];
740
19.0k
        rdCostB += sigBits.intBits[1];
741
19.0k
        rdCostZ += sigBits.intBits[0];
742
19.0k
      }
743
959
      else
744
959
      {
745
959
        rdCostZ = rdCostInit;
746
959
      }
747
5.49M
    }
748
0
    else
749
0
    {
750
0
      rdCostA += ( 1 << SCALE_BITS ) + goRiceTab[pqDataA.absLevel <= state.m_goRiceZero[stateId] ? pqDataA.absLevel - 1 : std::min<int>( pqDataA.absLevel, RICEMAX - 1 )];
751
0
      rdCostB += ( 1 << SCALE_BITS ) + goRiceTab[pqDataB.absLevel <= state.m_goRiceZero[stateId] ? pqDataB.absLevel - 1 : std::min<int>( pqDataB.absLevel, RICEMAX - 1 )];
752
0
      rdCostZ += goRiceTab[state.m_goRiceZero[stateId]];
753
0
    }
754
755
5.49M
    if( rdCostA < rdCostZ && rdCostA < decisions.rdCost[idxAZ] )
756
3.62M
    {
757
3.62M
      decisions.rdCost[idxAZ] = rdCostA;
758
3.62M
      decisions.absLevel[idxAZ] = pqDataA.absLevel;
759
3.62M
      decisions.prevId[idxAZ] = stateId;
760
3.62M
    }
761
1.87M
    else if( rdCostZ < decisions.rdCost[idxAZ] )
762
386k
    {
763
386k
      decisions.rdCost[idxAZ] = rdCostZ;
764
386k
      decisions.absLevel[idxAZ] = 0;
765
386k
      decisions.prevId[idxAZ] = stateId;
766
386k
    }
767
768
5.49M
    if( rdCostB < decisions.rdCost[idxB] )
769
4.00M
    {
770
4.00M
      decisions.rdCost[idxB] = rdCostB;
771
4.00M
      decisions.absLevel[idxB] = pqDataB.absLevel;
772
4.00M
      decisions.prevId[idxB] = stateId;
773
4.00M
    }
774
5.49M
  }
DepQuant.cpp:void vvenc::DQIntern::checkRdCosts<false>(int, vvenc::DQIntern::ScanPosType, vvenc::DQIntern::PQData const&, vvenc::DQIntern::PQData const&, vvenc::DQIntern::Decisions&, int, int, vvenc::DQIntern::StateMem const&)
Line
Count
Source
698
26.0M
  {
699
26.0M
    const int32_t* goRiceTab = DQIntern::g_goRiceBits[state.m_goRicePar[stateId]];
700
26.0M
    int64_t         rdCostA = state.rdCost[stateId] + pqDataA.deltaDist;
701
26.0M
    int64_t         rdCostB = state.rdCost[stateId] + pqDataB.deltaDist;
702
26.0M
    int64_t         rdCostZ = state.rdCost[stateId];
703
704
26.0M
    if( rrgEnsured || state.remRegBins[stateId] >= 4 )
705
25.5M
    {
706
25.5M
      const CoeffFracBits& cffBits = state.m_gtxFracBitsArray[state.ctx.cff[stateId]];
707
25.5M
      const BinFracBits    sigBits = state.m_sigFracBitsArray[stateId][state.ctx.sig[stateId]];
708
709
25.5M
      if( pqDataA.absLevel < 4 )
710
1.86M
        rdCostA += cffBits.bits[pqDataA.absLevel];
711
23.6M
      else
712
23.6M
      {
713
23.6M
        const unsigned value = ( pqDataA.absLevel - 4 ) >> 1;
714
23.6M
        rdCostA += cffBits.bits[pqDataA.absLevel - ( value << 1 )] + goRiceTab[std::min<unsigned>( value, RICEMAX - 1 )];
715
23.6M
      }
716
717
25.5M
      if( pqDataB.absLevel < 4 )
718
3.73M
        rdCostB += cffBits.bits[pqDataB.absLevel];
719
21.8M
      else
720
21.8M
      {
721
21.8M
        const unsigned value = ( pqDataB.absLevel - 4 ) >> 1;
722
21.8M
        rdCostB += cffBits.bits[pqDataB.absLevel - ( value << 1 )] + goRiceTab[std::min<unsigned>( value, RICEMAX - 1 )];
723
21.8M
      }
724
725
25.5M
      if( spt == SCAN_ISCSBB )
726
25.4M
      {
727
25.4M
        rdCostA += sigBits.intBits[1];
728
25.4M
        rdCostB += sigBits.intBits[1];
729
25.4M
        rdCostZ += sigBits.intBits[0];
730
25.4M
      }
731
50.9k
      else if( spt == SCAN_SOCSBB )
732
2.26k
      {
733
2.26k
        rdCostA += state.sbbBits1[stateId] + sigBits.intBits[1];
734
2.26k
        rdCostB += state.sbbBits1[stateId] + sigBits.intBits[1];
735
2.26k
        rdCostZ += state.sbbBits1[stateId] + sigBits.intBits[0];
736
2.26k
      }
737
48.6k
      else if( state.numSig[stateId] )
738
48.2k
      {
739
48.2k
        rdCostA += sigBits.intBits[1];
740
48.2k
        rdCostB += sigBits.intBits[1];
741
48.2k
        rdCostZ += sigBits.intBits[0];
742
48.2k
      }
743
416
      else
744
416
      {
745
416
        rdCostZ = rdCostInit;
746
416
      }
747
25.5M
    }
748
483k
    else
749
483k
    {
750
483k
      rdCostA += ( 1 << SCALE_BITS ) + goRiceTab[pqDataA.absLevel <= state.m_goRiceZero[stateId] ? pqDataA.absLevel - 1 : std::min<int>( pqDataA.absLevel, RICEMAX - 1 )];
751
483k
      rdCostB += ( 1 << SCALE_BITS ) + goRiceTab[pqDataB.absLevel <= state.m_goRiceZero[stateId] ? pqDataB.absLevel - 1 : std::min<int>( pqDataB.absLevel, RICEMAX - 1 )];
752
483k
      rdCostZ += goRiceTab[state.m_goRiceZero[stateId]];
753
483k
    }
754
755
26.0M
    if( rdCostA < rdCostZ && rdCostA < decisions.rdCost[idxAZ] )
756
16.0M
    {
757
16.0M
      decisions.rdCost[idxAZ] = rdCostA;
758
16.0M
      decisions.absLevel[idxAZ] = pqDataA.absLevel;
759
16.0M
      decisions.prevId[idxAZ] = stateId;
760
16.0M
    }
761
9.93M
    else if( rdCostZ < decisions.rdCost[idxAZ] )
762
598
    {
763
598
      decisions.rdCost[idxAZ] = rdCostZ;
764
598
      decisions.absLevel[idxAZ] = 0;
765
598
      decisions.prevId[idxAZ] = stateId;
766
598
    }
767
768
26.0M
    if( rdCostB < decisions.rdCost[idxB] )
769
16.1M
    {
770
16.1M
      decisions.rdCost[idxB] = rdCostB;
771
16.1M
      decisions.absLevel[idxB] = pqDataB.absLevel;
772
16.1M
      decisions.prevId[idxB] = stateId;
773
16.1M
    }
774
26.0M
  }
775
776
  void checkAllRdCosts( const DQIntern::ScanPosType spt, const DQIntern::PQData* pqData, DQIntern::Decisions& decisions, const DQIntern::StateMem& state )
777
1.37M
  {
778
1.37M
    checkRdCosts<true>( 0, spt, pqData[0], pqData[2], decisions, 0, 2, state );
779
1.37M
    checkRdCosts<true>( 1, spt, pqData[0], pqData[2], decisions, 2, 0, state );
780
1.37M
    checkRdCosts<true>( 2, spt, pqData[3], pqData[1], decisions, 1, 3, state );
781
1.37M
    checkRdCosts<true>( 3, spt, pqData[3], pqData[1], decisions, 3, 1, state );
782
1.37M
  }
783
784
  template<bool rrgEnsured = false>
785
  static void checkRdCostsOdd1( const int stateId, const ScanPosType spt, const int64_t deltaDist, Decisions& decisions, int idxA, int idxZ, const StateMem& state )
786
6.16M
  {
787
6.16M
    int64_t         rdCostA = state.rdCost[stateId] + deltaDist;
788
6.16M
    int64_t         rdCostZ = state.rdCost[stateId];
789
790
6.16M
    if( rrgEnsured || state.remRegBins[stateId] >= 4 )
791
6.16M
    {
792
6.16M
      const BinFracBits sigBits = state.m_sigFracBitsArray[stateId][state.ctx.sig[stateId]];
793
794
6.16M
      rdCostA += state.cffBits1[state.ctx.cff[stateId]];
795
796
6.16M
      if( spt == SCAN_ISCSBB )
797
6.01M
      {
798
6.01M
        rdCostA += sigBits.intBits[1];
799
6.01M
        rdCostZ += sigBits.intBits[0];
800
6.01M
      }
801
151k
      else if( spt == SCAN_SOCSBB )
802
97.5k
      {
803
97.5k
        rdCostA += state.sbbBits1[stateId] + sigBits.intBits[1];
804
97.5k
        rdCostZ += state.sbbBits1[stateId] + sigBits.intBits[0];
805
97.5k
      }
806
53.6k
      else if( state.numSig[stateId] )
807
10.1k
      {
808
10.1k
        rdCostA += sigBits.intBits[1];
809
10.1k
        rdCostZ += sigBits.intBits[0];
810
10.1k
      }
811
43.5k
      else
812
43.5k
      {
813
43.5k
        rdCostZ = rdCostInit;
814
43.5k
      }
815
6.16M
    }
816
1.77k
    else
817
1.77k
    {
818
1.77k
      const int32_t* goRiceTab = g_goRiceBits[state.m_goRicePar[stateId]];
819
820
1.77k
      rdCostA += ( 1 << SCALE_BITS ) + goRiceTab[0];
821
1.77k
      rdCostZ += goRiceTab[state.m_goRiceZero[stateId]];
822
1.77k
    }
823
824
6.16M
    if( rdCostA < decisions.rdCost[idxA] )
825
3.66M
    {
826
3.66M
      decisions.rdCost[idxA] = rdCostA;
827
3.66M
      decisions.absLevel[idxA] = 1;
828
3.66M
      decisions.prevId[idxA] = stateId;
829
3.66M
    }
830
831
6.16M
    if( rdCostZ < decisions.rdCost[idxZ] )
832
4.35M
    {
833
4.35M
      decisions.rdCost[idxZ] = rdCostZ;
834
4.35M
      decisions.absLevel[idxZ] = 0;
835
4.35M
      decisions.prevId[idxZ] = stateId;
836
4.35M
    }
837
6.16M
  }
DepQuant.cpp:void vvenc::DQIntern::checkRdCostsOdd1<true>(int, vvenc::DQIntern::ScanPosType, long, vvenc::DQIntern::Decisions&, int, int, vvenc::DQIntern::StateMem const&)
Line
Count
Source
786
5.73M
  {
787
5.73M
    int64_t         rdCostA = state.rdCost[stateId] + deltaDist;
788
5.73M
    int64_t         rdCostZ = state.rdCost[stateId];
789
790
5.73M
    if( rrgEnsured || state.remRegBins[stateId] >= 4 )
791
5.73M
    {
792
5.73M
      const BinFracBits sigBits = state.m_sigFracBitsArray[stateId][state.ctx.sig[stateId]];
793
794
5.73M
      rdCostA += state.cffBits1[state.ctx.cff[stateId]];
795
796
5.73M
      if( spt == SCAN_ISCSBB )
797
5.58M
      {
798
5.58M
        rdCostA += sigBits.intBits[1];
799
5.58M
        rdCostZ += sigBits.intBits[0];
800
5.58M
      }
801
150k
      else if( spt == SCAN_SOCSBB )
802
97.3k
      {
803
97.3k
        rdCostA += state.sbbBits1[stateId] + sigBits.intBits[1];
804
97.3k
        rdCostZ += state.sbbBits1[stateId] + sigBits.intBits[0];
805
97.3k
      }
806
53.1k
      else if( state.numSig[stateId] )
807
10.1k
      {
808
10.1k
        rdCostA += sigBits.intBits[1];
809
10.1k
        rdCostZ += sigBits.intBits[0];
810
10.1k
      }
811
43.0k
      else
812
43.0k
      {
813
43.0k
        rdCostZ = rdCostInit;
814
43.0k
      }
815
5.73M
    }
816
0
    else
817
0
    {
818
0
      const int32_t* goRiceTab = g_goRiceBits[state.m_goRicePar[stateId]];
819
820
0
      rdCostA += ( 1 << SCALE_BITS ) + goRiceTab[0];
821
0
      rdCostZ += goRiceTab[state.m_goRiceZero[stateId]];
822
0
    }
823
824
5.73M
    if( rdCostA < decisions.rdCost[idxA] )
825
3.65M
    {
826
3.65M
      decisions.rdCost[idxA] = rdCostA;
827
3.65M
      decisions.absLevel[idxA] = 1;
828
3.65M
      decisions.prevId[idxA] = stateId;
829
3.65M
    }
830
831
5.73M
    if( rdCostZ < decisions.rdCost[idxZ] )
832
4.35M
    {
833
4.35M
      decisions.rdCost[idxZ] = rdCostZ;
834
4.35M
      decisions.absLevel[idxZ] = 0;
835
4.35M
      decisions.prevId[idxZ] = stateId;
836
4.35M
    }
837
5.73M
  }
DepQuant.cpp:void vvenc::DQIntern::checkRdCostsOdd1<false>(int, vvenc::DQIntern::ScanPosType, long, vvenc::DQIntern::Decisions&, int, int, vvenc::DQIntern::StateMem const&)
Line
Count
Source
786
433k
  {
787
433k
    int64_t         rdCostA = state.rdCost[stateId] + deltaDist;
788
433k
    int64_t         rdCostZ = state.rdCost[stateId];
789
790
433k
    if( rrgEnsured || state.remRegBins[stateId] >= 4 )
791
431k
    {
792
431k
      const BinFracBits sigBits = state.m_sigFracBitsArray[stateId][state.ctx.sig[stateId]];
793
794
431k
      rdCostA += state.cffBits1[state.ctx.cff[stateId]];
795
796
431k
      if( spt == SCAN_ISCSBB )
797
430k
      {
798
430k
        rdCostA += sigBits.intBits[1];
799
430k
        rdCostZ += sigBits.intBits[0];
800
430k
      }
801
714
      else if( spt == SCAN_SOCSBB )
802
210
      {
803
210
        rdCostA += state.sbbBits1[stateId] + sigBits.intBits[1];
804
210
        rdCostZ += state.sbbBits1[stateId] + sigBits.intBits[0];
805
210
      }
806
504
      else if( state.numSig[stateId] )
807
0
      {
808
0
        rdCostA += sigBits.intBits[1];
809
0
        rdCostZ += sigBits.intBits[0];
810
0
      }
811
504
      else
812
504
      {
813
504
        rdCostZ = rdCostInit;
814
504
      }
815
431k
    }
816
1.77k
    else
817
1.77k
    {
818
1.77k
      const int32_t* goRiceTab = g_goRiceBits[state.m_goRicePar[stateId]];
819
820
1.77k
      rdCostA += ( 1 << SCALE_BITS ) + goRiceTab[0];
821
1.77k
      rdCostZ += goRiceTab[state.m_goRiceZero[stateId]];
822
1.77k
    }
823
824
433k
    if( rdCostA < decisions.rdCost[idxA] )
825
1.33k
    {
826
1.33k
      decisions.rdCost[idxA] = rdCostA;
827
1.33k
      decisions.absLevel[idxA] = 1;
828
1.33k
      decisions.prevId[idxA] = stateId;
829
1.33k
    }
830
831
433k
    if( rdCostZ < decisions.rdCost[idxZ] )
832
2.04k
    {
833
2.04k
      decisions.rdCost[idxZ] = rdCostZ;
834
2.04k
      decisions.absLevel[idxZ] = 0;
835
2.04k
      decisions.prevId[idxZ] = stateId;
836
2.04k
    }
837
433k
  }
838
839
  static void checkAllRdCostsOdd1( const DQIntern::ScanPosType spt, const int64_t pq_a_dist, const int64_t pq_b_dist, DQIntern::Decisions& decisions, const DQIntern::StateMem& state )
840
1.43M
  {
841
1.43M
    checkRdCostsOdd1<true>( 0, spt, pq_b_dist, decisions, 2, 0, state );
842
1.43M
    checkRdCostsOdd1<true>( 1, spt, pq_b_dist, decisions, 0, 2, state );
843
1.43M
    checkRdCostsOdd1<true>( 2, spt, pq_a_dist, decisions, 3, 1, state );
844
1.43M
    checkRdCostsOdd1<true>( 3, spt, pq_a_dist, decisions, 1, 3, state );
845
1.43M
  }
846
847
  static inline void checkRdCostStart( int32_t lastOffset, const PQData& pqData, Decisions& decisions, int idx, const StateMem& state )
848
17.3M
  {
849
17.3M
    const CoeffFracBits& cffBits = state.m_gtxFracBitsArray[0];
850
851
17.3M
    int64_t rdCost = pqData.deltaDist + lastOffset;
852
17.3M
    if( pqData.absLevel < 4 )
853
5.97M
    {
854
5.97M
      rdCost += cffBits.bits[pqData.absLevel];
855
5.97M
    }
856
11.3M
    else
857
11.3M
    {
858
11.3M
      const unsigned value = ( pqData.absLevel - 4 ) >> 1;
859
11.3M
      rdCost += cffBits.bits[pqData.absLevel - ( value << 1 )] + g_goRiceBits[0][value < RICEMAX ? value : RICEMAX - 1];
860
11.3M
    }
861
862
17.3M
    if( rdCost < decisions.rdCost[idx] )
863
2.26M
    {
864
2.26M
      decisions.rdCost[idx]   = rdCost;
865
2.26M
      decisions.absLevel[idx] = pqData.absLevel;
866
2.26M
      decisions.prevId[idx]   = -1;
867
2.26M
    }
868
17.3M
  }
869
870
  static inline void checkRdCostSkipSbb( const int stateId, Decisions& decisions, int idx, const StateMem& state )
871
136k
  {
872
136k
    int64_t rdCost = state.rdCost[stateId] + state.sbbBits0[stateId];
873
136k
    if( rdCost < decisions.rdCost[idx] )
874
50.1k
    {
875
50.1k
      decisions.rdCost[idx]   = rdCost;
876
50.1k
      decisions.absLevel[idx] = 0;
877
50.1k
      decisions.prevId[idx]   = 4 | stateId;
878
50.1k
    }
879
136k
  }
880
881
  static inline void checkRdCostSkipSbbZeroOut( const int stateId, Decisions& decisions, int idx, const StateMem& state )
882
0
  {
883
0
    int64_t rdCost          = state.rdCost[stateId] + state.sbbBits0[stateId];
884
0
    decisions.rdCost[idx]   = rdCost;
885
0
    decisions.absLevel[idx] = 0;
886
0
    decisions.prevId[idx]   = 4 | stateId;
887
0
  }
888
889
  static inline void setRiceParam( const int stateId, const ScanInfo& scanInfo, StateMem& state, bool ge4 )
890
25.8M
  {
891
25.8M
    if( state.remRegBins[stateId] < 4 || ge4 )
892
24.1M
    {
893
24.1M
      TCoeff  sumAbs = state.sum1st[scanInfo.insidePos][stateId];
894
24.1M
      int sumSub     = state.remRegBins[stateId] < 4 ? 0 : 4 * 5;
895
24.1M
      int sumAll     = std::max( std::min( 31, ( int ) sumAbs - sumSub ), 0 );
896
24.1M
      state.m_goRicePar[stateId]
897
24.1M
                     = g_auiGoRiceParsCoeff[sumAll];
898
899
24.1M
      if( state.remRegBins[stateId] < 4 )
900
485k
      {
901
485k
        state.m_goRiceZero[stateId] = g_auiGoRicePosCoeff0( stateId, state.m_goRicePar[stateId] );
902
485k
      }
903
24.1M
    }
904
25.8M
  }
905
906
  static void update1State( int stateId, const DQIntern::ScanInfo& scanInfo, const DQIntern::Decisions& decisions, DQIntern::StateMem& curr, DQIntern::StateMem& prev )
907
33.5M
  {
908
33.5M
    curr.rdCost[stateId] = decisions.rdCost[stateId];
909
33.5M
    if( decisions.prevId[stateId] > -2 )
910
32.2M
    {
911
32.2M
      if( decisions.prevId[stateId] >= 0 )
912
30.6M
      {
913
30.6M
        const int prevId          = decisions.prevId[stateId];
914
30.6M
        curr.numSig[stateId]      = prev.numSig[prevId] + !!decisions.absLevel[stateId];
915
30.6M
        curr.refSbbCtxId[stateId] = prev.refSbbCtxId[prevId];
916
30.6M
        curr.sbbBits0[stateId]    = prev.sbbBits0[prevId];
917
30.6M
        curr.sbbBits1[stateId]    = prev.sbbBits1[prevId];
918
30.6M
        curr.remRegBins[stateId]  = prev.remRegBins[prevId] - 1;
919
920
30.6M
        if( curr.remRegBins[stateId] >= 4 )
921
30.3M
        {
922
30.3M
          curr.remRegBins[stateId] -= ( decisions.absLevel[stateId] < 2 ? decisions.absLevel[stateId] : 3 );
923
30.3M
        }
924
925
520M
        for( int i = 0; i < 16; i++ )
926
490M
        {
927
490M
          curr.tplAcc[i][stateId] = prev.tplAcc[i][prevId];
928
490M
          curr.sum1st[i][stateId] = prev.sum1st[i][prevId];
929
490M
          curr.absVal[i][stateId] = prev.absVal[i][prevId];
930
490M
        }
931
30.6M
      }
932
1.58M
      else
933
1.58M
      {
934
1.58M
        curr.numSig[stateId]      =  1;
935
1.58M
        curr.refSbbCtxId[stateId] = -1;
936
1.58M
        curr.remRegBins[stateId]  = prev.initRemRegBins;
937
1.58M
        curr.remRegBins[stateId] -= ( decisions.absLevel[stateId] < 2 ? decisions.absLevel[stateId] : 3 );
938
939
26.8M
        for( int i = 0; i < 16; i++ )
940
25.3M
        {
941
25.3M
          curr.tplAcc[i][stateId] = 0;
942
25.3M
          curr.sum1st[i][stateId] = 0;
943
25.3M
          curr.absVal[i][stateId] = 0;
944
25.3M
        }
945
1.58M
      }
946
947
32.2M
      if( decisions.absLevel[stateId] )
948
28.6M
      {
949
28.6M
        curr.absVal[scanInfo.insidePos][stateId] = ( uint8_t ) std::min<TCoeff>( 126 + ( decisions.absLevel[stateId] & 1 ), decisions.absLevel[stateId] );
950
951
28.6M
        if( scanInfo.currNbInfoSbb.numInv )
952
28.6M
        {
953
28.6M
          int min4_or_5 = std::min<TCoeff>( 4 + ( decisions.absLevel[stateId] & 1 ), decisions.absLevel[stateId] );
954
955
28.6M
          auto adds8 = []( uint8_t a, uint8_t b )
956
83.5M
          {
957
83.5M
            uint8_t c = a + b;
958
83.5M
            if( c < a ) c = -1;
959
83.5M
            return c;
960
83.5M
          };
961
962
28.6M
          auto update_deps = [&]( int k )
963
83.5M
          {
964
83.5M
            curr.tplAcc[scanInfo.currNbInfoSbb.invInPos[k]][stateId] += 32 + min4_or_5;
965
83.5M
            curr.sum1st[scanInfo.currNbInfoSbb.invInPos[k]][stateId] = adds8( curr.sum1st[scanInfo.currNbInfoSbb.invInPos[k]][stateId], decisions.absLevel[stateId] );
966
83.5M
          };
967
968
28.6M
          switch( scanInfo.currNbInfoSbb.numInv )
969
28.6M
          {
970
0
          default:
971
4.75M
          case 5:
972
4.75M
            update_deps( 4 );
973
11.9M
          case 4:
974
11.9M
            update_deps( 3 );
975
14.4M
          case 3:
976
14.4M
            update_deps( 2 );
977
23.8M
          case 2:
978
23.8M
            update_deps( 1 );
979
28.6M
          case 1:
980
28.6M
            update_deps( 0 );
981
28.6M
          }
982
28.6M
        }
983
28.6M
      }
984
985
32.2M
      if( curr.remRegBins[stateId] >= 4 )
986
31.7M
      {
987
31.7M
        TCoeff  sumAbs1 = curr.tplAcc[scanInfo.nextInsidePos][stateId] & 31;
988
31.7M
        TCoeff  sumNum  = curr.tplAcc[scanInfo.nextInsidePos][stateId] >> 5u;
989
31.7M
        int sumGt1 = sumAbs1 - sumNum;
990
991
31.7M
        curr.ctx.sig[stateId] = scanInfo.sigCtxOffsetNext + std::min( ( sumAbs1 + 1 ) >> 1, 3 );
992
31.7M
        curr.ctx.cff[stateId] = scanInfo.gtxCtxOffsetNext + std::min( sumGt1, 4 );
993
31.7M
      }
994
471k
      else
995
471k
      {
996
471k
        curr.anyRemRegBinsLt4 = true;
997
471k
      }
998
32.2M
    }
999
33.5M
  }
1000
1001
  static void update1StateEOS( const int stateId, const DQIntern::ScanInfo& scanInfo, const DQIntern::Decisions& decisions, const DQIntern::StateMem& skip, DQIntern::StateMem& curr, DQIntern::StateMem& prev, DQIntern::CommonCtx& commonCtx )
1002
142k
  {
1003
142k
    curr.rdCost[stateId] = decisions.rdCost[stateId];
1004
1005
142k
    if( decisions.prevId[stateId] > -2 )
1006
141k
    {
1007
141k
      if( decisions.prevId[stateId] >= 4 )
1008
50.1k
      {
1009
50.1k
        CHECK( decisions.absLevel[stateId] != 0, "cannot happen" );
1010
1011
50.1k
        const int prevId          = decisions.prevId[stateId] - 4;
1012
50.1k
        curr.numSig    [stateId]  = 0;
1013
50.1k
        curr.remRegBins[stateId]  = skip.remRegBins[prevId];
1014
50.1k
        curr.refSbbCtxId[stateId] = prevId;
1015
1016
853k
        for( int i = 0; i < 16; i++ )
1017
803k
        {
1018
803k
          curr.absVal[i][stateId] = 0;
1019
803k
        }
1020
50.1k
      }
1021
91.3k
      else if( decisions.prevId[stateId] >= 0 )
1022
89.2k
      {
1023
89.2k
        const int prevId          = decisions.prevId[stateId];
1024
89.2k
        curr.numSig[stateId]      = prev.numSig[prevId] + !!decisions.absLevel[stateId];
1025
89.2k
        curr.refSbbCtxId[stateId] = prev.refSbbCtxId[prevId];
1026
89.2k
        curr.remRegBins[stateId]  = prev.remRegBins[prevId] - 1;
1027
1028
89.2k
        if( curr.remRegBins[stateId] >= 4 )
1029
75.0k
        {
1030
75.0k
          curr.remRegBins[stateId] -= ( decisions.absLevel[stateId] < 2 ? decisions.absLevel[stateId] : 3 );
1031
75.0k
        }
1032
1033
1.51M
        for( int i = 0; i < 16; i++ )
1034
1.42M
        {
1035
1.42M
          curr.absVal[i][stateId] = prev.absVal[i][prevId];
1036
1.42M
        }
1037
89.2k
      }
1038
2.03k
      else
1039
2.03k
      {
1040
2.03k
        curr.numSig[stateId]      =  1;
1041
2.03k
        curr.refSbbCtxId[stateId] = -1;
1042
2.03k
        curr.remRegBins[stateId]  = prev.initRemRegBins;
1043
2.03k
        curr.remRegBins[stateId] -= ( decisions.absLevel[stateId] < 2 ? decisions.absLevel[stateId] : 3 );
1044
1045
34.5k
        for( int i = 0; i < 16; i++ )
1046
32.5k
        {
1047
32.5k
          curr.absVal[i][stateId] = 0;
1048
32.5k
        }
1049
2.03k
      }
1050
1051
141k
      curr.absVal[scanInfo.insidePos][stateId] = ( uint8_t ) std::min<TCoeff>( 126 + ( decisions.absLevel[stateId] & 1 ), decisions.absLevel[stateId] );
1052
1053
141k
      uint8_t* levels[4];
1054
141k
      commonCtx.getLevelPtrs( scanInfo, levels[0], levels[1], levels[2], levels[3] );
1055
2.40M
      for( int i = 0; i < 16; i++ )
1056
2.26M
      {
1057
        // save abs levels to commonCtx
1058
2.26M
        levels[stateId][i] = curr.absVal[i][stateId];
1059
        // clean the SBB ctx
1060
2.26M
        curr.tplAcc[i][stateId] = 0;
1061
2.26M
        curr.sum1st[i][stateId] = 0;
1062
2.26M
        curr.absVal[i][stateId] = 0;
1063
2.26M
      }
1064
1065
141k
      commonCtx.update( scanInfo, curr.refSbbCtxId[stateId], stateId, curr );
1066
1067
141k
      curr.numSig[stateId] = 0;
1068
1069
141k
      if( curr.remRegBins[stateId] >= 4 )
1070
127k
      {
1071
127k
        TCoeff  sumAbs1 = curr.tplAcc[scanInfo.nextInsidePos][stateId] & 31;
1072
127k
        TCoeff  sumNum  = curr.tplAcc[scanInfo.nextInsidePos][stateId] >> 5u;
1073
127k
        int sumGt1 = sumAbs1 - sumNum;
1074
1075
127k
        curr.ctx.sig[stateId] = scanInfo.sigCtxOffsetNext + std::min( ( sumAbs1 + 1 ) >> 1, 3 );
1076
127k
        curr.ctx.cff[stateId] = scanInfo.gtxCtxOffsetNext + std::min( sumGt1, 4 );
1077
127k
      }
1078
14.4k
      else
1079
14.4k
      {
1080
14.4k
        curr.anyRemRegBinsLt4 = true;
1081
14.4k
      }
1082
141k
    }
1083
142k
  }
1084
1085
  static void updateStates( const DQIntern::ScanInfo& scanInfo, const DQIntern::Decisions& decisions, DQIntern::StateMem& curr )
1086
8.39M
  {
1087
8.39M
    DQIntern::StateMem prev = curr;
1088
8.39M
    curr.anyRemRegBinsLt4   = false;
1089
1090
8.39M
    update1State( 0, scanInfo, decisions, curr, prev );
1091
8.39M
    update1State( 1, scanInfo, decisions, curr, prev );
1092
8.39M
    update1State( 2, scanInfo, decisions, curr, prev );
1093
8.39M
    update1State( 3, scanInfo, decisions, curr, prev );
1094
1095
8.39M
    curr.cffBitsCtxOffset = scanInfo.gtxCtxOffsetNext;
1096
8.39M
  }
1097
1098
  static void updateStatesEOS( const DQIntern::ScanInfo& scanInfo, const DQIntern::Decisions& decisions, const DQIntern::StateMem& skip, DQIntern::StateMem& curr, DQIntern::CommonCtx& commonCtx )
1099
35.7k
  {
1100
35.7k
    DQIntern::StateMem prev = curr;
1101
35.7k
    curr.anyRemRegBinsLt4   = false;
1102
1103
35.7k
    update1StateEOS( 0, scanInfo, decisions, skip, curr, prev, commonCtx );
1104
35.7k
    update1StateEOS( 1, scanInfo, decisions, skip, curr, prev, commonCtx );
1105
35.7k
    update1StateEOS( 2, scanInfo, decisions, skip, curr, prev, commonCtx );
1106
35.7k
    update1StateEOS( 3, scanInfo, decisions, skip, curr, prev, commonCtx );
1107
1108
35.7k
    curr.cffBitsCtxOffset = scanInfo.gtxCtxOffsetNext;
1109
35.7k
  }
1110
}; // namespace DQIntern
1111
1112
static const DQIntern::Decisions startDec[2] =
1113
{
1114
  DQIntern::Decisions
1115
  {
1116
    { DQIntern::rdCostInit >> 2, DQIntern::rdCostInit >> 2, DQIntern::rdCostInit >> 2, DQIntern::rdCostInit >> 2 },
1117
    { -1, -1, -1, -1 },
1118
    { -2, -2, -2, -2 },
1119
  },
1120
  DQIntern::Decisions
1121
  {
1122
    { DQIntern::rdCostInit >> 2, DQIntern::rdCostInit >> 2, DQIntern::rdCostInit >> 2, DQIntern::rdCostInit >> 2 },
1123
    { 0, 0, 0, 0 },
1124
    { 4, 5, 6, 7 },
1125
  }
1126
};
1127
1128
void DepQuant::xQuantDQ( TransformUnit& tu, const CCoeffBuf& srcCoeff, const ComponentID compID, const QpParam& cQP, const double lambda, const Ctx& ctx, TCoeff& absSum, bool enableScalingLists, int* quantCoeff )
1129
2.39M
{
1130
2.39M
  using namespace DQIntern;
1131
  
1132
  //===== reset / pre-init =====
1133
2.39M
  const TUParameters& tuPars  = *m_scansRom->getTUPars( tu.blocks[compID], compID );
1134
2.39M
  m_quant.initQuantBlock    ( tu, compID, cQP, lambda );
1135
2.39M
  TCoeffSig*    qCoeff      = tu.getCoeffs( compID ).buf;
1136
2.39M
  const TCoeff* tCoeff      = srcCoeff.buf;
1137
2.39M
  const int     numCoeff    = tu.blocks[compID].area();
1138
2.39M
  ::memset( qCoeff, 0x00, numCoeff * sizeof( TCoeffSig ) );
1139
2.39M
  absSum                    = 0;
1140
1141
2.39M
  const CompArea& area      = tu.blocks[ compID ];
1142
2.39M
  const uint32_t  width     = area.width;
1143
2.39M
  const uint32_t  height    = area.height;
1144
2.39M
  const uint32_t  lfnstIdx  = tu.cu->lfnstIdx;
1145
  //===== scaling matrix ====
1146
  //const int         qpDQ = cQP.Qp + 1;
1147
  //const int         qpPer = qpDQ / 6;
1148
  //const int         qpRem = qpDQ - 6 * qpPer;
1149
1150
  //TCoeff thresTmp = thres;
1151
2.39M
  bool zeroOut = false;
1152
2.39M
  bool zeroOutforThres = false;
1153
2.39M
  int effWidth = tuPars.m_width, effHeight = tuPars.m_height;
1154
2.39M
  if( ( tu.mtsIdx[compID] > MTS_SKIP || ( tu.cs->sps->MTS && tu.cu->sbtInfo != 0 && tuPars.m_height <= 32 && tuPars.m_width <= 32 ) ) && compID == COMP_Y )
1155
0
  {
1156
0
    effHeight = ( tuPars.m_height == 32 ) ? 16 : tuPars.m_height;
1157
0
    effWidth  = ( tuPars.m_width  == 32 ) ? 16 : tuPars.m_width;
1158
0
    zeroOut   = ( effHeight < tuPars.m_height || effWidth < tuPars.m_width );
1159
0
  }
1160
2.39M
  zeroOutforThres = zeroOut || ( 32 < tuPars.m_height || 32 < tuPars.m_width );
1161
  //===== find first test position =====
1162
2.39M
  int firstTestPos = std::min<int>( tuPars.m_width, JVET_C0024_ZERO_OUT_TH ) * std::min<int>( tuPars.m_height, JVET_C0024_ZERO_OUT_TH ) - 1;
1163
2.39M
  if( lfnstIdx > 0 && tu.mtsIdx[compID] != MTS_SKIP && width >= 4 && height >= 4 )
1164
1.49M
  {
1165
1.49M
    firstTestPos = ( ( width == 4 && height == 4 ) || ( width == 8 && height == 8 ) )  ? 7 : 15 ;
1166
1.49M
  }
1167
1168
2.39M
  const TCoeff defaultQuantisationCoefficient = (TCoeff)m_quant.getQScale();
1169
2.39M
  const TCoeff thres = m_quant.getLastThreshold();
1170
2.39M
  const int zeroOutWidth  = ( tuPars.m_width  == 32 && zeroOut ) ? 16 : 32;
1171
2.39M
  const int zeroOutHeight = ( tuPars.m_height == 32 && zeroOut ) ? 16 : 32;
1172
1173
2.39M
  if( enableScalingLists )
1174
0
  {
1175
0
    for( ; firstTestPos >= 0; firstTestPos-- )
1176
0
    {
1177
0
      if( zeroOutforThres && ( tuPars.m_scanId2BlkPos[firstTestPos].x >= zeroOutWidth || tuPars.m_scanId2BlkPos[firstTestPos].y >= zeroOutHeight ) ) continue;
1178
1179
0
      const TCoeff thresTmp = TCoeff( thres / ( 4 * quantCoeff[tuPars.m_scanId2BlkPos[firstTestPos].idx] ) );
1180
1181
0
      if( abs( tCoeff[tuPars.m_scanId2BlkPos[firstTestPos].idx] ) > thresTmp ) break;
1182
0
    }
1183
0
  }
1184
2.39M
  else
1185
2.39M
  {
1186
2.39M
    const TCoeff defaultTh = TCoeff( thres / ( defaultQuantisationCoefficient << 2 ) );
1187
1188
2.39M
    m_findFirstPos( firstTestPos, tCoeff, tuPars, defaultTh, zeroOutforThres, zeroOutWidth, zeroOutHeight );
1189
2.39M
  }
1190
1191
2.39M
  if( firstTestPos < 0 )
1192
1.40M
  {
1193
1.40M
    tu.lastPos[compID] = -1;
1194
1.40M
    return;
1195
1.40M
  }
1196
1197
  //===== real init =====
1198
986k
  RateEstimator::initCtx( tuPars, tu, compID, ctx.getFracBitsAcess() );
1199
986k
  m_commonCtx.reset( tuPars, *this );
1200
4.93M
  for( int k = 0; k < 4; k++ )
1201
3.94M
  {
1202
3.94M
    DQIntern::initStates( k, m_state_curr );
1203
3.94M
    DQIntern::initStates( k, m_state_skip );
1204
3.94M
    m_state_curr.m_sigFracBitsArray[k] = RateEstimator::sigFlagBits(k);
1205
3.94M
  }
1206
1207
986k
  m_state_curr.m_gtxFracBitsArray = RateEstimator::gtxFracBits();
1208
  //memset( m_state_curr.tplAcc, 0, sizeof( m_state_curr.tplAcc ) ); // will be set in updateStates{,EOS} before first access
1209
986k
  memset( m_state_curr.sum1st, 0, sizeof( m_state_curr.sum1st ) );   // will be accessed in setRiceParam before updateState{,EOS}
1210
  //memset( m_state_curr.absVal, 0, sizeof( m_state_curr.absVal ) ); // will be set in updateStates{,EOS} before first access
1211
1212
986k
  const int numCtx = isLuma( compID ) ? 21 : 11;
1213
986k
  const CoeffFracBits* const cffBits = gtxFracBits();
1214
12.2M
  for( int i = 0; i < numCtx; i++ )
1215
11.2M
  {
1216
11.2M
    m_state_curr.cffBits1[i] = cffBits[i].bits[1];
1217
11.2M
  }
1218
1219
986k
  int effectWidth  = std::min( 32, effWidth );
1220
986k
  int effectHeight = std::min( 32, effHeight );
1221
986k
  m_state_curr.initRemRegBins   = ( effectWidth * effectHeight * MAX_TU_LEVEL_CTX_CODED_BIN_CONSTRAINT ) / 16;
1222
986k
  m_state_curr.anyRemRegBinsLt4 = true; // for the first coeff use scalar impl., because it check against the init state, which
1223
                                        // prohibits some paths
1224
1225
  //===== populate trellis =====
1226
10.4M
  for( int scanIdx = firstTestPos; scanIdx >= 0; scanIdx-- )
1227
9.42M
  {
1228
9.42M
    const ScanInfo& scanInfo = tuPars.m_scanInfo[ scanIdx ];
1229
9.42M
    if( enableScalingLists )
1230
0
    {
1231
0
      m_quant.initQuantBlock( tu, compID, cQP, lambda, quantCoeff[scanInfo.rasterPos] );
1232
0
      xDecideAndUpdate( abs( tCoeff[scanInfo.rasterPos] ), scanInfo, zeroOut && ( scanInfo.posX >= effWidth || scanInfo.posY >= effHeight ), quantCoeff[scanInfo.rasterPos] );
1233
0
    }
1234
9.42M
    else
1235
9.42M
      xDecideAndUpdate( abs( tCoeff[scanInfo.rasterPos] ), scanInfo, zeroOut && ( scanInfo.posX >= effWidth || scanInfo.posY >= effHeight ), defaultQuantisationCoefficient );
1236
9.42M
  }
1237
1238
  //===== find best path =====
1239
986k
  int       prevId      = -1;
1240
986k
  int64_t   minPathCost =  0;
1241
4.93M
  for( int8_t stateId = 0; stateId < 4; stateId++ )
1242
3.94M
  {
1243
3.94M
    int64_t pathCost = m_trellis[0][0].rdCost[stateId];
1244
3.94M
    if( pathCost < minPathCost )
1245
1.67M
    {
1246
1.67M
      prevId      = stateId;
1247
1.67M
      minPathCost = pathCost;
1248
1.67M
    }
1249
3.94M
  }
1250
1251
  //===== backward scanning =====
1252
986k
  int scanIdx = 0;
1253
10.2M
  for( ; prevId >= 0; scanIdx++ )
1254
9.30M
  {
1255
9.30M
    TCoeffSig absLevel = m_trellis[scanIdx][prevId >> 2].absLevel[prevId & 3];
1256
9.30M
    int32_t blkpos     = tuPars.m_scanId2BlkPos[scanIdx].idx;
1257
    // apply the coefficient's sign without a branch: (absLevel ^ m) - m is -absLevel for m = -1 and absLevel for m = 0
1258
9.30M
    const int signMask = -int( tCoeff[blkpos] < 0 );
1259
9.30M
    qCoeff[ blkpos ]   = TCoeffSig( ( absLevel ^ signMask ) - signMask );
1260
9.30M
    absSum            += absLevel;
1261
9.30M
    prevId             = m_trellis[scanIdx][prevId >> 2].prevId[prevId & 3];
1262
9.30M
  }
1263
1264
986k
  tu.lastPos[compID] = scanIdx - 1;
1265
986k
}
1266
1267
void DepQuant::xDecide( const DQIntern::ScanInfo& scanInfo, const TCoeff absCoeff, const int lastOffset, DQIntern::Decisions& decisions, bool zeroOut, int quantCoeff )
1268
9.42M
{
1269
9.42M
  using namespace DQIntern;
1270
1271
9.42M
  ::memcpy( &decisions, startDec, sizeof( Decisions ) );
1272
1273
9.42M
  StateMem& skip = m_state_skip;
1274
1275
9.42M
  if( zeroOut )
1276
0
  {
1277
0
    if( scanInfo.spt == SCAN_EOCSBB )
1278
0
    {
1279
0
      checkRdCostSkipSbbZeroOut( 0, decisions, 0, skip );
1280
0
      checkRdCostSkipSbbZeroOut( 1, decisions, 1, skip );
1281
0
      checkRdCostSkipSbbZeroOut( 2, decisions, 2, skip );
1282
0
      checkRdCostSkipSbbZeroOut( 3, decisions, 3, skip );
1283
0
    }
1284
0
    return;
1285
0
  }
1286
1287
9.42M
  StateMem& prev = m_state_curr;
1288
1289
  /// start inline prequant
1290
9.42M
  int64_t scaledOrg = int64_t( absCoeff ) * quantCoeff;
1291
9.42M
  TCoeff  qIdx      = TCoeff( ( scaledOrg + m_quant.m_QAdd ) >> m_quant.m_QShift );
1292
1293
9.42M
  if( qIdx < 0 )
1294
1.54M
  {
1295
1.54M
    int64_t scaledAdd = m_quant.m_DistStepAdd - scaledOrg * m_quant.m_DistOrgFact;
1296
1.54M
    int64_t pq_a_dist = ( ( scaledAdd + 0 * m_quant.m_DistStepAdd ) * 1 + m_quant.m_DistAdd ) >> m_quant.m_DistShift;
1297
1.54M
    int64_t pq_b_dist = ( ( scaledAdd + 1 * m_quant.m_DistStepAdd ) * 2 + m_quant.m_DistAdd ) >> m_quant.m_DistShift;
1298
    /// stop inline prequant
1299
1300
1.54M
    if( prev.anyRemRegBinsLt4 )
1301
108k
    {
1302
108k
      setRiceParam( 0, scanInfo, prev, false );
1303
108k
      checkRdCostsOdd1( 0, scanInfo.spt, pq_b_dist, decisions, 2, 0, prev );
1304
1305
108k
      setRiceParam( 1, scanInfo, prev, false );
1306
108k
      checkRdCostsOdd1( 1, scanInfo.spt, pq_b_dist, decisions, 0, 2, prev );
1307
1308
108k
      setRiceParam( 2, scanInfo, prev, false );
1309
108k
      checkRdCostsOdd1( 2, scanInfo.spt, pq_a_dist, decisions, 3, 1, prev );
1310
1311
108k
      setRiceParam( 3, scanInfo, prev, false );
1312
108k
      checkRdCostsOdd1( 3, scanInfo.spt, pq_a_dist, decisions, 1, 3, prev );
1313
108k
    }
1314
1.43M
    else
1315
1.43M
    {
1316
      // has to be called as a first check, assumes no decision has been made yet
1317
1.43M
      m_checkAllRdCostsOdd1( scanInfo.spt, pq_a_dist, pq_b_dist, decisions, prev );
1318
1.43M
    }
1319
1320
1.54M
    checkRdCostStart( lastOffset, PQData{ 1, pq_b_dist }, decisions, 2, prev );
1321
1.54M
  }
1322
7.88M
  else
1323
7.88M
  {
1324
    /// start inline prequant
1325
7.88M
    qIdx = std::max<TCoeff>( 1, std::min<TCoeff>( m_quant.m_maxQIdx, qIdx ) );
1326
7.88M
    int64_t scaledAdd = qIdx * m_quant.m_DistStepAdd - scaledOrg * m_quant.m_DistOrgFact;
1327
1328
7.88M
    PQData  pqData[4];
1329
1330
7.88M
    PQData& pq_a = pqData[( qIdx + 0 ) & 3];
1331
7.88M
    PQData& pq_b = pqData[( qIdx + 1 ) & 3];
1332
7.88M
    PQData& pq_c = pqData[( qIdx + 2 ) & 3];
1333
7.88M
    PQData& pq_d = pqData[( qIdx + 3 ) & 3];
1334
1335
7.88M
    pq_a.deltaDist = ( ( scaledAdd + 0 * m_quant.m_DistStepAdd ) * ( qIdx + 0 ) + m_quant.m_DistAdd ) >> m_quant.m_DistShift;
1336
7.88M
    pq_a.absLevel = ( qIdx + 1 ) >> 1;
1337
1338
7.88M
    pq_b.deltaDist = ( ( scaledAdd + 1 * m_quant.m_DistStepAdd ) * ( qIdx + 1 ) + m_quant.m_DistAdd ) >> m_quant.m_DistShift;
1339
7.88M
    pq_b.absLevel = ( qIdx + 2 ) >> 1;
1340
1341
7.88M
    pq_c.deltaDist = ( ( scaledAdd + 2 * m_quant.m_DistStepAdd ) * ( qIdx + 2 ) + m_quant.m_DistAdd ) >> m_quant.m_DistShift;
1342
7.88M
    pq_c.absLevel = ( qIdx + 3 ) >> 1;
1343
1344
7.88M
    pq_d.deltaDist = ( ( scaledAdd + 3 * m_quant.m_DistStepAdd ) * ( qIdx + 3 ) + m_quant.m_DistAdd ) >> m_quant.m_DistShift;
1345
7.88M
    pq_d.absLevel = ( qIdx + 4 ) >> 1;
1346
    /// stop inline prequant
1347
1348
7.88M
    bool cff02ge4 = pqData[0].absLevel >= 4/* || pqData[2].absLevel >= 4 */;
1349
7.88M
    bool cff13ge4 = /* pqData[1].absLevel >= 4 || */ pqData[3].absLevel >= 4;
1350
1351
7.88M
    if( cff02ge4 || cff13ge4 || prev.anyRemRegBinsLt4 )
1352
6.50M
    {
1353
6.50M
      if( prev.anyRemRegBinsLt4 || cff02ge4 )
1354
6.19M
      {
1355
6.19M
        setRiceParam( 0, scanInfo, prev, cff02ge4 );
1356
6.19M
        setRiceParam( 1, scanInfo, prev, cff02ge4 );
1357
6.19M
      }
1358
1359
6.50M
      if( prev.anyRemRegBinsLt4 || cff13ge4 )
1360
6.50M
      {
1361
6.50M
        setRiceParam( 2, scanInfo, prev, cff13ge4 );
1362
6.50M
        setRiceParam( 3, scanInfo, prev, cff13ge4 );
1363
6.50M
      }
1364
1365
6.50M
      checkRdCosts( 0, scanInfo.spt, pqData[0], pqData[2], decisions, 0, 2, prev );
1366
6.50M
      checkRdCosts( 1, scanInfo.spt, pqData[0], pqData[2], decisions, 2, 0, prev );
1367
6.50M
      checkRdCosts( 2, scanInfo.spt, pqData[3], pqData[1], decisions, 1, 3, prev );
1368
6.50M
      checkRdCosts( 3, scanInfo.spt, pqData[3], pqData[1], decisions, 3, 1, prev );
1369
6.50M
    }
1370
1.37M
    else
1371
1.37M
    {
1372
      // has to be called as a first check, assumes no decision has been made yet
1373
1.37M
      m_checkAllRdCosts( scanInfo.spt, pqData, decisions, prev );
1374
1.37M
    }
1375
1376
7.88M
    checkRdCostStart( lastOffset, pqData[0], decisions, 0, prev );
1377
7.88M
    checkRdCostStart( lastOffset, pqData[2], decisions, 2, prev );
1378
7.88M
  }
1379
1380
9.42M
  if( scanInfo.spt == SCAN_EOCSBB )
1381
34.0k
  {
1382
34.0k
    checkRdCostSkipSbb( 0, decisions, 0, skip );
1383
34.0k
    checkRdCostSkipSbb( 1, decisions, 1, skip );
1384
34.0k
    checkRdCostSkipSbb( 2, decisions, 2, skip );
1385
34.0k
    checkRdCostSkipSbb( 3, decisions, 3, skip );
1386
34.0k
  }
1387
9.42M
}
1388
1389
void DepQuant::xDecideAndUpdate( const TCoeff absCoeff, const DQIntern::ScanInfo& scanInfo, bool zeroOut, int quantCoeff )
1390
9.42M
{
1391
9.42M
  using namespace DQIntern;
1392
1393
9.42M
  Decisions* decisions = &m_trellis[scanInfo.scanIdx][0];
1394
1395
9.42M
  xDecide( scanInfo, absCoeff, lastOffset( scanInfo.scanIdx ), *decisions, zeroOut, quantCoeff );
1396
1397
9.42M
  if( scanInfo.scanIdx )
1398
8.43M
  {
1399
8.43M
    if( scanInfo.spt == SCAN_SOCSBB )
1400
29.9k
    {
1401
29.9k
      memcpy( &m_state_skip, &m_state_curr, DQIntern::StateMemSkipCpySize );
1402
29.9k
    }
1403
1404
8.43M
    if( scanInfo.insidePos == 0 )
1405
35.7k
    {
1406
35.7k
      m_commonCtx.swap();
1407
35.7k
      m_updateStatesEOS( scanInfo, *decisions, m_state_skip, m_state_curr, m_commonCtx );
1408
35.7k
      ::memcpy( decisions + 1, decisions, sizeof( Decisions ) );
1409
35.7k
    }
1410
8.39M
    else if( !zeroOut )
1411
8.39M
    {
1412
8.39M
      m_updateStates( scanInfo, *decisions, m_state_curr );
1413
8.39M
    }
1414
8.43M
  }
1415
9.42M
}
1416
1417
void DepQuant::xDequantDQ( const TransformUnit& tu,  CoeffBuf& recCoeff, const ComponentID compID, const QpParam& cQP, bool enableScalingLists, int* piDequantCoef )
1418
971k
{
1419
971k
  m_quant.dequantBlock( tu, compID, cQP, recCoeff, enableScalingLists, piDequantCoef );
1420
971k
}
1421
1422
5.97k
DepQuant::DepQuant( const Quant* other, bool enc, bool useScalingLists, bool enableOpt ) : QuantRDOQ2( other, useScalingLists, enableOpt ), RateEstimator(), m_commonCtx()
1423
5.97k
{
1424
5.97k
  const DepQuant* dq = dynamic_cast<const DepQuant*>( other );
1425
5.97k
  CHECK( other && !dq, "The DepQuant cast must be successfull!" );
1426
1427
5.97k
  if( !dq )
1428
1.49k
  {
1429
1.49k
    m_scansRom = std::make_shared<DQIntern::Rom>();
1430
1.49k
    m_scansRom->init();
1431
1.49k
  }
1432
4.47k
  else
1433
4.47k
  {
1434
4.47k
    m_scansRom = dq->m_scansRom;
1435
4.47k
  }
1436
1437
24.4M
  for( int t = 0; t < ( MAX_TB_SIZEY * MAX_TB_SIZEY ); t++ )
1438
24.4M
  {
1439
24.4M
    memcpy( m_trellis[t], startDec, sizeof( startDec ) );
1440
24.4M
  }
1441
1442
5.97k
  m_checkAllRdCosts     = DQIntern::checkAllRdCosts;
1443
5.97k
  m_checkAllRdCostsOdd1 = DQIntern::checkAllRdCostsOdd1;
1444
5.97k
  m_updateStatesEOS     = DQIntern::updateStatesEOS;
1445
5.97k
  m_updateStates        = DQIntern::updateStates;
1446
5.97k
  m_findFirstPos        = DQIntern::findFirstPos;
1447
1448
5.97k
  if( enableOpt )
1449
5.97k
  {
1450
#if defined( TARGET_SIMD_X86 ) && ENABLE_SIMD_OPT_QUANT
1451
    initDepQuantX86();
1452
#endif
1453
#if defined( TARGET_SIMD_ARM ) && ENABLE_SIMD_OPT_QUANT
1454
    initDepQuantARM();
1455
#endif
1456
5.97k
  }
1457
5.97k
}
1458
1459
DepQuant::~DepQuant()
1460
5.97k
{
1461
5.97k
}
1462
1463
void DepQuant::quant( TransformUnit& tu, const ComponentID compID, const CCoeffBuf& pSrc, TCoeff& uiAbsSum, const QpParam& cQP, const Ctx& ctx )
1464
2.52M
{
1465
2.52M
  if( tu.cs->picture->useSelectiveRdoq && !xNeedRDOQ( tu, compID, pSrc, cQP ) )
1466
0
  {
1467
0
    tu.lastPos[compID] = -1;
1468
0
    uiAbsSum           =  0;
1469
0
  }
1470
2.52M
  else if( tu.cs->slice->depQuantEnabled && tu.mtsIdx[compID] != MTS_SKIP )
1471
2.39M
  {
1472
    //===== scaling matrix ====
1473
2.39M
    const int         qpDQ            = cQP.Qp(tu.mtsIdx[compID]==MTS_SKIP) + 1;
1474
2.39M
    const int         qpPer           = qpDQ / 6;
1475
2.39M
    const int         qpRem           = qpDQ - 6 * qpPer;
1476
2.39M
    const CompArea    &rect           = tu.blocks[compID];
1477
2.39M
    const int         width           = rect.width;
1478
2.39M
    const int         height          = rect.height;
1479
2.39M
    uint32_t          scalingListType = getScalingListType(tu.cu->predMode, compID);
1480
2.39M
    CHECK(scalingListType >= SCALING_LIST_NUM, "Invalid scaling list");
1481
2.39M
    const uint32_t    log2TrWidth     = Log2(width);
1482
2.39M
    const uint32_t    log2TrHeight    = Log2(height);
1483
2.39M
    const bool isLfnstApplied         = tu.cu->lfnstIdx > 0 && (CU::isSepTree(*tu.cu) ? true : isLuma(compID));
1484
2.39M
    const bool enableScalingLists     = getUseScalingList(width, height, (tu.mtsIdx[compID] == MTS_SKIP), isLfnstApplied);
1485
2.39M
    xQuantDQ( tu, pSrc, compID, cQP, Quant::m_dLambda, ctx, uiAbsSum, enableScalingLists, Quant::getQuantCoeff(scalingListType, qpRem, log2TrWidth, log2TrHeight) );
1486
2.39M
  }
1487
126k
  else
1488
126k
  {
1489
126k
    QuantRDOQ2::quant( tu, compID, pSrc, uiAbsSum, cQP, ctx );
1490
126k
  }
1491
2.52M
}
1492
1493
void DepQuant::dequant( const TransformUnit& tu, CoeffBuf& dstCoeff, const ComponentID compID, const QpParam& cQP )
1494
1.03M
{
1495
1.03M
  if( tu.cs->slice->depQuantEnabled && (tu.mtsIdx[compID] != MTS_SKIP) )
1496
971k
  {
1497
971k
    const int         qpDQ            = cQP.Qp(tu.mtsIdx[compID]==MTS_SKIP) + 1;
1498
971k
    const int         qpPer           = qpDQ / 6;
1499
971k
    const int         qpRem           = qpDQ - 6 * qpPer;
1500
971k
    const CompArea    &rect           = tu.blocks[compID];
1501
971k
    const int         width           = rect.width;
1502
971k
    const int         height          = rect.height;
1503
971k
    uint32_t          scalingListType = getScalingListType(tu.cu->predMode, compID);
1504
971k
    CHECK(scalingListType >= SCALING_LIST_NUM, "Invalid scaling list");
1505
971k
    const uint32_t    log2TrWidth    = Log2(width);
1506
971k
    const uint32_t    log2TrHeight   = Log2(height);
1507
971k
    const bool isLfnstApplied        = tu.cu->lfnstIdx > 0 && (CU::isSepTree(*tu.cu) ? true : isLuma(compID));
1508
971k
    const bool enableScalingLists    = getUseScalingList(width, height, (tu.mtsIdx[compID] == MTS_SKIP), isLfnstApplied);
1509
971k
    xDequantDQ( tu, dstCoeff, compID, cQP, enableScalingLists, Quant::getDequantCoeff(scalingListType, qpRem, log2TrWidth, log2TrHeight) );
1510
971k
  }
1511
59.7k
  else
1512
59.7k
  {
1513
59.7k
    QuantRDOQ::dequant( tu, dstCoeff, compID, cQP );
1514
59.7k
  }
1515
1.03M
}
1516
1517
void DepQuant::init( int rdoq, bool useRDOQTS, int thrVal )
1518
5.97k
{
1519
5.97k
  QuantRDOQ2::init( rdoq, useRDOQTS, thrVal );
1520
5.97k
  m_quant.init( thrVal );
1521
5.97k
}
1522
1523
} // namespace vvenc
1524
1525
//! \}
1526