Coverage Report

Created: 2026-09-13 06:34

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