Coverage Report

Created: 2026-07-16 06:32

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.91M
  {
61
213M
    for( ; firstTestPos >= 0; firstTestPos-- )
62
212M
    {
63
212M
      if( zeroOutForThres && ( tuPars.m_scanId2BlkPos[firstTestPos].x >= zeroOutWidth ||
64
26.9M
                              tuPars.m_scanId2BlkPos[firstTestPos].y >= zeroOutHeight ) )
65
0
      {
66
0
        continue;
67
0
      }
68
212M
      if( abs( tCoeff[tuPars.m_scanId2BlkPos[firstTestPos].idx] ) > defaultTh )
69
797k
      {
70
797k
        break;
71
797k
      }
72
212M
    }
73
1.91M
  }
74
75
  void Rom::xInitScanArrays()
76
19.4k
  {
77
19.4k
    if( m_scansInitialized )
78
0
    {
79
0
      return;
80
0
    }
81
19.4k
    ::memset( m_scanId2NbInfoSbbArray, 0, sizeof(m_scanId2NbInfoSbbArray) );
82
19.4k
    ::memset( m_scanId2NbInfoOutArray, 0, sizeof(m_scanId2NbInfoOutArray) );
83
19.4k
    ::memset( m_tuParameters,          0, sizeof(m_tuParameters) );
84
85
19.4k
    uint32_t raster2id[ MAX_CU_SIZE * MAX_CU_SIZE ];
86
19.4k
    ::memset(raster2id, 0, sizeof(raster2id));
87
88
155k
    for( int hd = 0; hd < MAX_TU_SIZE_IDX; hd++ )
89
136k
    {
90
1.08M
      for( int vd = 0; vd < MAX_TU_SIZE_IDX; vd++ )
91
953k
      {
92
953k
        if( (hd == 0 && vd <= 1) || (hd <= 1 && vd == 0) )
93
58.3k
        {
94
58.3k
          continue;
95
58.3k
        }
96
894k
        const uint32_t      blockWidth    = (1 << hd);
97
894k
        const uint32_t      blockHeight   = (1 << vd);
98
894k
        const uint32_t      log2CGWidth   = g_log2SbbSize[hd][vd][0];
99
894k
        const uint32_t      log2CGHeight  = g_log2SbbSize[hd][vd][1];
100
894k
        const uint32_t      groupWidth    = 1 << log2CGWidth;
101
894k
        const uint32_t      groupHeight   = 1 << log2CGHeight;
102
894k
        const uint32_t      groupSize     = groupWidth * groupHeight;
103
894k
        const SizeType      blkWidthIdx   = Log2( blockWidth );
104
894k
        const SizeType      blkHeightIdx  = Log2( blockHeight );
105
894k
        const ScanElement * scanId2RP     = getScanOrder( SCAN_GROUPED_4x4, blkWidthIdx, blkHeightIdx );
106
894k
        NbInfoSbb*&         sId2NbSbb     = m_scanId2NbInfoSbbArray[hd][vd];
107
894k
        NbInfoOut*&         sId2NbOut     = m_scanId2NbInfoOutArray[hd][vd];
108
        // consider only non-zero-out region
109
894k
        const uint32_t      blkWidthNZOut = std::min<unsigned>( JVET_C0024_ZERO_OUT_TH, blockWidth  );
110
894k
        const uint32_t      blkHeightNZOut= std::min<unsigned>( JVET_C0024_ZERO_OUT_TH, blockHeight );
111
894k
        const uint32_t      totalValues   = blkWidthNZOut * blkHeightNZOut;
112
113
894k
        sId2NbSbb = new NbInfoSbb[ totalValues ];
114
894k
        sId2NbOut = new NbInfoOut[ totalValues ];
115
116
176M
        for( uint32_t scanId = 0; scanId < totalValues; scanId++ )
117
175M
        {
118
175M
          raster2id[scanId2RP[scanId].idx] = scanId;
119
175M
          sId2NbSbb[scanId].numInv = 0;
120
175M
        }
121
122
176M
        for( unsigned scanId = 0; scanId < totalValues; scanId++ )
123
175M
        {
124
175M
          const int posX = scanId2RP[scanId].x;
125
175M
          const int posY = scanId2RP[scanId].y;
126
175M
          const int rpos = scanId2RP[scanId].idx;
127
175M
          {
128
            //===== inside subband neighbours =====
129
175M
            const int      begSbb = scanId - ( scanId & (groupSize-1) ); // first pos in current subblock
130
175M
            int            cpos[5];
131
132
175M
            cpos[0] = ( posX + 1 < blkWidthNZOut                              ? ( raster2id[rpos+1           ] < groupSize + begSbb ? raster2id[rpos+1           ] - begSbb : 0 ) : 0 );
133
175M
            cpos[1] = ( posX + 2 < blkWidthNZOut                              ? ( raster2id[rpos+2           ] < groupSize + begSbb ? raster2id[rpos+2           ] - begSbb : 0 ) : 0 );
134
175M
            cpos[2] = ( posX + 1 < blkWidthNZOut && posY + 1 < blkHeightNZOut ? ( raster2id[rpos+1+blockWidth] < groupSize + begSbb ? raster2id[rpos+1+blockWidth] - begSbb : 0 ) : 0 );
135
175M
            cpos[3] = ( posY + 1 < blkHeightNZOut                             ? ( raster2id[rpos+  blockWidth] < groupSize + begSbb ? raster2id[rpos+  blockWidth] - begSbb : 0 ) : 0 );
136
175M
            cpos[4] = ( posY + 2 < blkHeightNZOut                             ? ( raster2id[rpos+2*blockWidth] < groupSize + begSbb ? raster2id[rpos+2*blockWidth] - begSbb : 0 ) : 0 );
137
138
175M
            int num = 0;
139
175M
            int inPos[5] = { 0, };
140
141
704M
            while( true )
142
704M
            {
143
704M
              int nk = -1;
144
4.22G
              for( int k = 0; k < 5; k++ )
145
3.52G
              {
146
3.52G
                if( cpos[k] != 0 && ( nk < 0 || cpos[k] < cpos[nk] ) )
147
791M
                {
148
791M
                  nk = k;
149
791M
                }
150
3.52G
              }
151
704M
              if( nk < 0 )
152
175M
              {
153
175M
                break;
154
175M
              }
155
528M
              inPos[ num++ ] = uint8_t( cpos[nk] );
156
528M
              cpos[nk] = 0;
157
528M
            }
158
524M
            for( int k = num; k < 5; k++ )
159
348M
            {
160
348M
              inPos[k] = 0;
161
348M
            }
162
704M
            for( int k = 0; k < num; k++ )
163
528M
            {
164
528M
              CHECK( sId2NbSbb[begSbb + inPos[k]].numInv >= 5, "" );
165
528M
              sId2NbSbb[begSbb + inPos[k]].invInPos[sId2NbSbb[begSbb + inPos[k]].numInv++] = scanId & ( groupSize - 1 );
166
528M
            }
167
175M
          }
168
175M
          {
169
            //===== outside subband neighbours =====
170
175M
            NbInfoOut&     nbOut  = sId2NbOut[ scanId ];
171
175M
            const int      begSbb = scanId - ( scanId & (groupSize-1) ); // first pos in current subblock
172
175M
            int            cpos[5];
173
174
175M
            cpos[0] = ( posX + 1 < blkWidthNZOut                              ? ( raster2id[rpos+1           ] >= groupSize + begSbb ? raster2id[rpos+1           ] : 0 ) : 0 );
175
175M
            cpos[1] = ( posX + 2 < blkWidthNZOut                              ? ( raster2id[rpos+2           ] >= groupSize + begSbb ? raster2id[rpos+2           ] : 0 ) : 0 );
176
175M
            cpos[2] = ( posX + 1 < blkWidthNZOut && posY + 1 < blkHeightNZOut ? ( raster2id[rpos+1+blockWidth] >= groupSize + begSbb ? raster2id[rpos+1+blockWidth] : 0 ) : 0 );
177
175M
            cpos[3] = ( posY + 1 < blkHeightNZOut                             ? ( raster2id[rpos+  blockWidth] >= groupSize + begSbb ? raster2id[rpos+  blockWidth] : 0 ) : 0 );
178
175M
            cpos[4] = ( posY + 2 < blkHeightNZOut                             ? ( raster2id[rpos+2*blockWidth] >= groupSize + begSbb ? raster2id[rpos+2*blockWidth] : 0 ) : 0 );
179
180
425M
            for( nbOut.num = 0; true; )
181
425M
            {
182
425M
              int nk = -1;
183
2.55G
              for( int k = 0; k < 5; k++ )
184
2.12G
              {
185
2.12G
                if( cpos[k] != 0 && ( nk < 0 || cpos[k] < cpos[nk] ) )
186
367M
                {
187
367M
                  nk = k;
188
367M
                }
189
2.12G
              }
190
425M
              if( nk < 0 )
191
175M
              {
192
175M
                break;
193
175M
              }
194
250M
              nbOut.outPos[ nbOut.num++ ] = uint16_t( cpos[nk] );
195
250M
              cpos[nk] = 0;
196
250M
            }
197
802M
            for( int k = nbOut.num; k < 5; k++ )
198
627M
            {
199
627M
              nbOut.outPos[k] = 0;
200
627M
            }
201
175M
            nbOut.maxDist = ( scanId == 0 ? 0 : sId2NbOut[scanId-1].maxDist );
202
425M
            for( int k = 0; k < nbOut.num; k++ )
203
250M
            {
204
250M
              if( nbOut.outPos[k] > nbOut.maxDist )
205
27.0M
              {
206
27.0M
                nbOut.maxDist = nbOut.outPos[k];
207
27.0M
              }
208
250M
            }
209
175M
          }
210
175M
        }
211
212
        // make it relative
213
176M
        for( unsigned scanId = 0; scanId < totalValues; scanId++ )
214
175M
        {
215
175M
          NbInfoOut& nbOut  = sId2NbOut[scanId];
216
175M
          const int  begSbb = scanId - ( scanId & (groupSize-1) ); // first pos in current subblock
217
425M
          for( int k = 0; k < nbOut.num; k++ )
218
250M
          {
219
250M
            CHECK(begSbb > nbOut.outPos[k], "Position must be past sub block begin");
220
250M
            nbOut.outPos[k] -= begSbb;
221
250M
          }
222
175M
          nbOut.maxDist -= scanId;
223
175M
        }
224
225
2.68M
        for( int chId = 0; chId < MAX_NUM_CH; chId++ )
226
1.78M
        {
227
1.78M
          m_tuParameters[hd][vd][chId] = new TUParameters( *this, blockWidth, blockHeight, ChannelType(chId) );
228
1.78M
        }
229
894k
      }
230
136k
    }
231
19.4k
    m_scansInitialized = true;
232
19.4k
  }
233
234
  void Rom::xUninitScanArrays()
235
19.4k
  {
236
19.4k
    if( !m_scansInitialized )
237
0
    {
238
0
      return;
239
0
    }
240
155k
    for( int hd = 0; hd < MAX_TU_SIZE_IDX; hd++ )
241
136k
    {
242
1.08M
      for( int vd = 0; vd < MAX_TU_SIZE_IDX; vd++ )
243
953k
      {
244
953k
        NbInfoSbb*& sId2NbSbb = m_scanId2NbInfoSbbArray[hd][vd];
245
953k
        NbInfoOut*& sId2NbOut = m_scanId2NbInfoOutArray[hd][vd];
246
953k
        if( sId2NbSbb )
247
894k
        {
248
894k
          delete [] sId2NbSbb;
249
894k
        }
250
953k
        if( sId2NbOut )
251
894k
        {
252
894k
          delete [] sId2NbOut;
253
894k
        }
254
2.86M
        for( int chId = 0; chId < MAX_NUM_CH; chId++ )
255
1.90M
        {
256
1.90M
          TUParameters*& tuPars = m_tuParameters[hd][vd][chId];
257
1.90M
          if( tuPars )
258
1.78M
          {
259
1.78M
            delete tuPars;
260
1.78M
          }
261
1.90M
        }
262
953k
      }
263
136k
    }
264
19.4k
    m_scansInitialized = false;
265
19.4k
  }
266
267
268
  TUParameters::TUParameters( const Rom& rom, const unsigned width, const unsigned height, const ChannelType chType )
269
1.78M
  {
270
1.78M
    m_chType              = chType;
271
1.78M
    m_width               = width;
272
1.78M
    m_height              = height;
273
1.78M
    const uint32_t nonzeroWidth  = std::min<uint32_t>(JVET_C0024_ZERO_OUT_TH, m_width);
274
1.78M
    const uint32_t nonzeroHeight = std::min<uint32_t>(JVET_C0024_ZERO_OUT_TH, m_height);
275
1.78M
    m_numCoeff                   = nonzeroWidth * nonzeroHeight;
276
1.78M
    m_log2SbbWidth        = g_log2SbbSize[ Log2(m_width) ][ Log2(m_height) ][0];
277
1.78M
    m_log2SbbHeight       = g_log2SbbSize[ Log2(m_width) ][ Log2(m_height) ][1];
278
1.78M
    m_log2SbbSize         = m_log2SbbWidth + m_log2SbbHeight;
279
1.78M
    m_sbbSize             = ( 1 << m_log2SbbSize );
280
1.78M
    m_sbbMask             = m_sbbSize - 1;
281
1.78M
    m_widthInSbb  = nonzeroWidth >> m_log2SbbWidth;
282
1.78M
    m_heightInSbb = nonzeroHeight >> m_log2SbbHeight;
283
1.78M
    m_numSbb              = m_widthInSbb * m_heightInSbb;
284
1.78M
    SizeType        hsbb  = Log2( m_widthInSbb  );
285
1.78M
    SizeType        vsbb  = Log2( m_heightInSbb );
286
1.78M
    SizeType        hsId  = Log2( m_width  );
287
1.78M
    SizeType        vsId  = Log2( m_height );
288
1.78M
    m_scanSbbId2SbbPos    = getScanOrder( SCAN_UNGROUPED   , hsbb , vsbb );
289
1.78M
    m_scanId2BlkPos       = getScanOrder( SCAN_GROUPED_4x4 , hsId , vsId );
290
1.78M
    int log2W             = Log2( m_width  );
291
1.78M
    int log2H             = Log2( m_height );
292
1.78M
    m_scanId2NbInfoSbb    = rom.getNbInfoSbb( log2W, log2H );
293
1.78M
    m_scanId2NbInfoOut    = rom.getNbInfoOut( log2W, log2H );
294
1.78M
    m_scanInfo            = new ScanInfo[ m_numCoeff ];
295
352M
    for( int scanIdx = 0; scanIdx < m_numCoeff; scanIdx++ )
296
350M
    {
297
350M
      xSetScanInfo( m_scanInfo[scanIdx], scanIdx );
298
350M
    }
299
1.78M
  }
300
301
302
  void TUParameters::xSetScanInfo( ScanInfo& scanInfo, int scanIdx )
303
350M
  {
304
350M
    scanInfo.sbbSize    = m_sbbSize;
305
350M
    scanInfo.numSbb     = m_numSbb;
306
350M
    scanInfo.scanIdx    = scanIdx;
307
350M
    scanInfo.rasterPos  = m_scanId2BlkPos[scanIdx].idx;
308
350M
    scanInfo.sbbPos     = m_scanSbbId2SbbPos[scanIdx >> m_log2SbbSize].idx;
309
350M
    scanInfo.insidePos  = scanIdx & m_sbbMask;
310
350M
    scanInfo.spt        = SCAN_ISCSBB;
311
350M
    if(  scanInfo.insidePos == m_sbbMask && scanIdx > scanInfo.sbbSize && scanIdx < m_numCoeff - 1 )
312
18.9M
      scanInfo.spt      = SCAN_SOCSBB;
313
331M
    else if( scanInfo.insidePos == 0 && scanIdx > 0 && scanIdx < m_numCoeff - m_sbbSize )
314
18.9M
      scanInfo.spt      = SCAN_EOCSBB;
315
350M
    scanInfo.posX = m_scanId2BlkPos[scanIdx].x;
316
350M
    scanInfo.posY = m_scanId2BlkPos[scanIdx].y;
317
350M
    if( scanIdx )
318
349M
    {
319
349M
      const int nextScanIdx = scanIdx - 1;
320
349M
      const int diag        = m_scanId2BlkPos[nextScanIdx].x + m_scanId2BlkPos[nextScanIdx].y;
321
349M
      if( m_chType == CH_L )
322
174M
      {
323
174M
        scanInfo.sigCtxOffsetNext = ( diag < 2 ? 8 : diag < 5 ?  4 : 0 );
324
174M
        scanInfo.gtxCtxOffsetNext = ( diag < 1 ? 16 : diag < 3 ? 11 : diag < 10 ? 6 : 1 );
325
174M
      }
326
174M
      else
327
174M
      {
328
174M
        scanInfo.sigCtxOffsetNext = ( diag < 2 ? 4 : 0 );
329
174M
        scanInfo.gtxCtxOffsetNext = ( diag < 1 ? 6 : 1 );
330
174M
      }
331
349M
      scanInfo.nextInsidePos      = nextScanIdx & m_sbbMask;
332
349M
      scanInfo.currNbInfoSbb      = m_scanId2NbInfoSbb[ scanIdx ];
333
349M
      if( scanInfo.insidePos == 0 )
334
20.3M
      {
335
20.3M
        const int nextSbbPos  = m_scanSbbId2SbbPos[nextScanIdx >> m_log2SbbSize].idx;
336
20.3M
        const int nextSbbPosY = nextSbbPos               / m_widthInSbb;
337
20.3M
        const int nextSbbPosX = nextSbbPos - nextSbbPosY * m_widthInSbb;
338
20.3M
        scanInfo.nextSbbRight = ( nextSbbPosX < m_widthInSbb  - 1 ? nextSbbPos + 1            : 0 );
339
20.3M
        scanInfo.nextSbbBelow = ( nextSbbPosY < m_heightInSbb - 1 ? nextSbbPos + m_widthInSbb : 0 );
340
20.3M
      }
341
349M
    }
342
350M
  }
343
344
  void RateEstimator::initCtx( const TUParameters& tuPars, const TransformUnit& tu, const ComponentID compID, const FracBitsAccess& fracBitsAccess )
345
797k
  {
346
797k
    m_scanId2Pos = tuPars.m_scanId2BlkPos;
347
797k
    xSetSigSbbFracBits  ( fracBitsAccess, tuPars.m_chType );
348
797k
    xSetSigFlagBits     ( fracBitsAccess, tuPars.m_chType );
349
797k
    xSetGtxFlagBits     ( fracBitsAccess, tuPars.m_chType );
350
797k
    xSetLastCoeffOffset ( fracBitsAccess, tuPars, tu, compID );
351
797k
  }
352
353
  void RateEstimator::xSetLastCoeffOffset( const FracBitsAccess& fracBitsAccess, const TUParameters& tuPars, const TransformUnit& tu, const ComponentID compID )
354
797k
  {
355
797k
    const ChannelType chType = ( compID == COMP_Y ? CH_L : CH_C );
356
797k
    int32_t cbfDeltaBits = 0;
357
797k
    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
797k
    else
363
797k
    {
364
797k
      BinFracBits bits;
365
797k
      bool prevLumaCbf           = false;
366
797k
      bool lastCbfIsInferred     = false;
367
797k
      bool useIntraSubPartitions = tu.cu->ispMode && isLuma(chType);
368
797k
      if( useIntraSubPartitions )
369
11.6k
      {
370
11.6k
        bool rootCbfSoFar = false;
371
11.6k
        bool isLastSubPartition = CU::isISPLast(*tu.cu, tu.Y(), compID);
372
11.6k
        uint32_t nTus = tu.cu->ispMode == HOR_INTRA_SUBPARTITIONS ? tu.cu->lheight() >> Log2(tu.lheight()) : tu.cu->lwidth() >> Log2(tu.lwidth());
373
11.6k
        if( isLastSubPartition )
374
212
        {
375
212
          TransformUnit* tuPointer = tu.cu->firstTU;
376
848
          for( int tuIdx = 0; tuIdx < nTus - 1; tuIdx++ )
377
636
          {
378
636
            rootCbfSoFar |= TU::getCbfAtDepth(*tuPointer, COMP_Y, tu.depth);
379
636
            tuPointer     = tuPointer->next;
380
636
          }
381
212
          if( !rootCbfSoFar )
382
0
          {
383
0
            lastCbfIsInferred = true;
384
0
          }
385
212
        }
386
11.6k
        if( !lastCbfIsInferred )
387
11.6k
        {
388
11.6k
          prevLumaCbf = TU::getPrevTuCbfAtDepth(tu, compID, tu.depth);
389
11.6k
        }
390
11.6k
        bits = fracBitsAccess.getFracBitsArray(Ctx::QtCbf[compID](DeriveCtx::CtxQtCbf(compID, prevLumaCbf, true)));
391
11.6k
      }
392
786k
      else
393
786k
      {
394
786k
        bits = fracBitsAccess.getFracBitsArray(Ctx::QtCbf[compID](DeriveCtx::CtxQtCbf(compID, tu.cbf[COMP_Cb])));
395
786k
      }
396
797k
      cbfDeltaBits = lastCbfIsInferred ? 0 : int32_t(bits.intBits[1]) - int32_t(bits.intBits[0]);
397
797k
    }
398
399
797k
    static const unsigned prefixCtx[] = { 0, 0, 0, 3, 6, 10, 15, 21 };
400
797k
    uint32_t              ctxBits  [ LAST_SIGNIFICANT_GROUPS ];
401
2.39M
    for( unsigned xy = 0; xy < 2; xy++ )
402
1.59M
    {
403
1.59M
      int32_t             bitOffset   = ( xy ? cbfDeltaBits : 0 );
404
1.59M
      int32_t*            lastBits    = ( xy ? m_lastBitsY : m_lastBitsX );
405
1.59M
      const unsigned      size        = ( xy ? tuPars.m_height : tuPars.m_width );
406
1.59M
      const unsigned      log2Size    = Log2( size );
407
1.59M
      const bool          useYCtx     = ( xy != 0 );
408
1.59M
      const CtxSet&       ctxSetLast  = ( useYCtx ? Ctx::LastY : Ctx::LastX )[ chType ];
409
1.59M
      const unsigned      lastShift   = ( compID == COMP_Y ? (log2Size+1)>>2 : Clip3<unsigned>(0,2,size>>3) );
410
1.59M
      const unsigned      lastOffset  = ( compID == COMP_Y ? ( prefixCtx[log2Size] ) : 0 );
411
1.59M
      uint32_t            sumFBits    = 0;
412
1.59M
      unsigned            maxCtxId    = g_uiGroupIdx[std::min<unsigned>(JVET_C0024_ZERO_OUT_TH, size) - 1];
413
10.6M
      for( unsigned ctxId = 0; ctxId < maxCtxId; ctxId++ )
414
9.06M
      {
415
9.06M
        const BinFracBits bits  = fracBitsAccess.getFracBitsArray( ctxSetLast( lastOffset + ( ctxId >> lastShift ) ) );
416
9.06M
        ctxBits[ ctxId ]        = sumFBits + bits.intBits[0] + ( ctxId>3 ? ((ctxId-2)>>1)<<SCALE_BITS : 0 ) + bitOffset;
417
9.06M
        sumFBits               +=            bits.intBits[1];
418
9.06M
      }
419
1.59M
      ctxBits  [ maxCtxId ]     = sumFBits + ( maxCtxId>3 ? ((maxCtxId-2)>>1)<<SCALE_BITS : 0 ) + bitOffset;
420
22.1M
      for (unsigned pos = 0; pos < std::min<unsigned>(JVET_C0024_ZERO_OUT_TH, size); pos++)
421
20.5M
      {
422
20.5M
        lastBits[ pos ]         = ctxBits[ g_uiGroupIdx[ pos ] ];
423
20.5M
      }
424
1.59M
    }
425
797k
  }
426
427
  void RateEstimator::xSetSigSbbFracBits( const FracBitsAccess& fracBitsAccess, ChannelType chType )
428
797k
  {
429
797k
    const CtxSet& ctxSet = Ctx::SigCoeffGroup[ chType ];
430
2.39M
    for( unsigned ctxId = 0; ctxId < sm_maxNumSigSbbCtx; ctxId++ )
431
1.59M
    {
432
1.59M
      m_sigSbbFracBits[ ctxId ] = fracBitsAccess.getFracBitsArray( ctxSet( ctxId ) );
433
1.59M
    }
434
797k
  }
435
436
  void RateEstimator::xSetSigFlagBits( const FracBitsAccess& fracBitsAccess, ChannelType chType )
437
797k
  {
438
3.19M
    for( unsigned ctxSetId = 0; ctxSetId < sm_numCtxSetsSig; ctxSetId++ )
439
2.39M
    {
440
2.39M
      BinFracBits*    bits    = m_sigFracBits [ ctxSetId ];
441
2.39M
      const CtxSet&   ctxSet  = Ctx::SigFlag  [ chType + 2*ctxSetId ];
442
2.39M
      const unsigned  numCtx  = ( chType == CH_L ? 12 : 8 );
443
21.9M
      for( unsigned ctxId = 0; ctxId < numCtx; ctxId++ )
444
19.5M
      {
445
19.5M
        bits[ ctxId ] = fracBitsAccess.getFracBitsArray( ctxSet( ctxId ) );
446
19.5M
      }
447
2.39M
    }
448
797k
  }
449
450
  void RateEstimator::xSetGtxFlagBits( const FracBitsAccess& fracBitsAccess, ChannelType chType )
451
797k
  {
452
797k
    const CtxSet&   ctxSetPar   = Ctx::ParFlag [     chType ];
453
797k
    const CtxSet&   ctxSetGt1   = Ctx::GtxFlag [ 2 + chType ];
454
797k
    const CtxSet&   ctxSetGt2   = Ctx::GtxFlag [     chType ];
455
797k
    const unsigned  numCtx      = ( chType == CH_L ? 21 : 11 );
456
9.88M
    for( unsigned ctxId = 0; ctxId < numCtx; ctxId++ )
457
9.08M
    {
458
9.08M
      BinFracBits     fbPar = fracBitsAccess.getFracBitsArray( ctxSetPar( ctxId ) );
459
9.08M
      BinFracBits     fbGt1 = fracBitsAccess.getFracBitsArray( ctxSetGt1( ctxId ) );
460
9.08M
      BinFracBits     fbGt2 = fracBitsAccess.getFracBitsArray( ctxSetGt2( ctxId ) );
461
9.08M
      CoeffFracBits&  cb    = m_gtxFracBits[ ctxId ];
462
9.08M
      int32_t         par0  = (1<<SCALE_BITS) + int32_t(fbPar.intBits[0]);
463
9.08M
      int32_t         par1  = (1<<SCALE_BITS) + int32_t(fbPar.intBits[1]);
464
9.08M
      cb.bits[0] = 0;
465
9.08M
      cb.bits[1] = fbGt1.intBits[0] + (1 << SCALE_BITS);
466
9.08M
      cb.bits[2] = fbGt1.intBits[1] + par0 + fbGt2.intBits[0];
467
9.08M
      cb.bits[3] = fbGt1.intBits[1] + par1 + fbGt2.intBits[0];
468
9.08M
      cb.bits[4] = fbGt1.intBits[1] + par0 + fbGt2.intBits[1];
469
9.08M
      cb.bits[5] = fbGt1.intBits[1] + par1 + fbGt2.intBits[1];
470
9.08M
    }
471
797k
  }
472
473
  void CommonCtx::update( const ScanInfo& scanInfo, const int prevId, int stateId, StateMem& curr )
474
125k
  {
475
125k
    uint8_t*    sbbFlags  = m_currSbbCtx[stateId].sbbFlags;
476
125k
    uint8_t*    levels    = m_currSbbCtx[stateId].levels;
477
125k
    uint16_t    maxDist   = m_nbInfo[scanInfo.scanIdx - 1].maxDist;
478
125k
    uint16_t    sbbSize   = scanInfo.sbbSize;
479
125k
    std::size_t setCpSize = ( maxDist > sbbSize ? maxDist - sbbSize : 0 ) * sizeof( uint8_t );
480
125k
    if( prevId >= 0 )
481
104k
    {
482
104k
      ::memcpy( sbbFlags, m_prevSbbCtx[prevId].sbbFlags, scanInfo.numSbb * sizeof( uint8_t ) );
483
104k
      ::memcpy( levels + scanInfo.scanIdx + sbbSize, m_prevSbbCtx[prevId].levels + scanInfo.scanIdx + sbbSize, setCpSize );
484
104k
    }
485
21.6k
    else
486
21.6k
    {
487
21.6k
      ::memset( sbbFlags, 0, scanInfo.numSbb * sizeof( uint8_t ) );
488
21.6k
      ::memset( levels + scanInfo.scanIdx + sbbSize, 0, setCpSize );
489
21.6k
    }
490
125k
    sbbFlags[scanInfo.sbbPos] = !!curr.numSig[stateId];
491
492
125k
    const int       sigNSbb = ( ( scanInfo.nextSbbRight ? sbbFlags[scanInfo.nextSbbRight] : false ) || ( scanInfo.nextSbbBelow ? sbbFlags[scanInfo.nextSbbBelow] : false ) ? 1 : 0 );
493
125k
    curr.refSbbCtxId[stateId] = stateId;
494
125k
    const BinFracBits sbbBits = m_sbbFlagBits[sigNSbb];
495
496
125k
    curr.sbbBits0[stateId] = sbbBits.intBits[0];
497
125k
    curr.sbbBits1[stateId] = sbbBits.intBits[1];
498
499
125k
    if( sigNSbb || ( ( scanInfo.nextSbbRight && scanInfo.nextSbbBelow ) ? sbbFlags[scanInfo.nextSbbBelow + 1] : false ) )
500
79.5k
    {
501
79.5k
      const int         scanBeg = scanInfo.scanIdx - scanInfo.sbbSize;
502
79.5k
      const NbInfoOut* nbOut = m_nbInfo + scanBeg;
503
79.5k
      const uint8_t* absLevels = levels + scanBeg;
504
505
1.35M
      for( int id = 0; id < scanInfo.sbbSize; id++, nbOut++ )
506
1.27M
      {
507
1.27M
        if( nbOut->num )
508
852k
        {
509
852k
          TCoeff sumAbs = 0, sumAbs1 = 0, sumNum = 0;
510
2.06M
#define UPDATE(k) {TCoeff t=absLevels[nbOut->outPos[k]]; sumAbs+=t; sumAbs1+=std::min<TCoeff>(4+(t&1),t); sumNum+=!!t; }
511
852k
          switch( nbOut->num )
512
852k
          {
513
0
          default:
514
54.5k
          case 5:
515
54.5k
            UPDATE( 4 );
516
163k
          case 4:
517
163k
            UPDATE( 3 );
518
455k
          case 3:
519
455k
            UPDATE( 2 );
520
535k
          case 2:
521
535k
            UPDATE( 1 );
522
852k
          case 1:
523
852k
            UPDATE( 0 );
524
852k
          }
525
852k
#undef UPDATE
526
852k
          curr.tplAcc[id][stateId] = ( sumNum << 5 ) | sumAbs1;
527
852k
          curr.sum1st[id][stateId] = ( uint8_t ) std::min( 255, sumAbs );
528
852k
        }
529
1.27M
      }
530
79.5k
    }
531
125k
  }
532
533
  void Quantizer::initQuantBlock(const TransformUnit& tu, const ComponentID compID, const QpParam& cQP, const double lambda, int gValue)
534
1.91M
  {
535
1.91M
    CHECKD( lambda <= 0.0, "Lambda must be greater than 0" );
536
537
1.91M
    const int         qpDQ                  = cQP.Qp(tu.mtsIdx[compID]==MTS_SKIP) + 1;
538
1.91M
    const int         qpPer                 = qpDQ / 6;
539
1.91M
    const int         qpRem                 = qpDQ - 6 * qpPer;
540
1.91M
    const SPS&        sps                   = *tu.cs->sps;
541
1.91M
    const CompArea&   area                  = tu.blocks[ compID ];
542
1.91M
    const ChannelType chType                = toChannelType( compID );
543
1.91M
    const int         channelBitDepth       = sps.bitDepths[ chType ];
544
1.91M
    const int         maxLog2TrDynamicRange = sps.getMaxLog2TrDynamicRange();
545
1.91M
    const int         nomTransformShift     = getTransformShift( channelBitDepth, area.size(), maxLog2TrDynamicRange );
546
1.91M
    const bool    needsSqrt2ScaleAdjustment = TU::needsSqrt2Scale(tu, compID);
547
1.91M
    const int         transformShift        = nomTransformShift + (needsSqrt2ScaleAdjustment?-1:0);
548
    // quant parameters
549
1.91M
    m_QShift                    = QUANT_SHIFT  - 1 + qpPer + transformShift;
550
1.91M
    m_QAdd                      = -( ( 3 << m_QShift ) >> 1 );
551
1.91M
    Intermediate_Int  invShift  = IQUANT_SHIFT + 1 - qpPer - transformShift;
552
1.91M
    m_QScale                    = g_quantScales[needsSqrt2ScaleAdjustment?1:0][ qpRem ];
553
1.91M
    const unsigned    qIdxBD    = std::min<unsigned>( maxLog2TrDynamicRange + 1, 8*sizeof(Intermediate_Int) + invShift - IQUANT_SHIFT - 1 );
554
1.91M
    m_maxQIdx                   = ( 1 << (qIdxBD-1) ) - 4;
555
1.91M
    if( m_QShift )
556
1.91M
      m_thresLast               = TCoeff((int64_t(m_DqThrVal) << (m_QShift-1)));
557
18.4E
    else
558
18.4E
      m_thresLast               = TCoeff((int64_t(m_DqThrVal>>1) << m_QShift));
559
1.91M
    m_thresSSbb                 = TCoeff((int64_t(3) << m_QShift));
560
    // distortion calculation parameters
561
18.4E
    const int64_t qScale        = (gValue==-1) ? m_QScale : gValue;
562
1.91M
    const int nomDShift =
563
1.91M
      SCALE_BITS - 2 * (nomTransformShift + DISTORTION_PRECISION_ADJUSTMENT(channelBitDepth)) + m_QShift + (needsSqrt2ScaleAdjustment ? 1 : 0);
564
1.91M
    const double  qScale2       = double( qScale * qScale );
565
1.91M
    const double  nomDistFactor = ( nomDShift < 0 ? 1.0/(double(int64_t(1)<<(-nomDShift))*qScale2*lambda) : double(int64_t(1)<<nomDShift)/(qScale2*lambda) );
566
1.91M
    const uint32_t pow2dfShift   = (uint32_t)( nomDistFactor * qScale2 ) + 1;
567
1.91M
    const int     dfShift       = ceilLog2( pow2dfShift );
568
1.91M
    m_DistShift                 = 62 + m_QShift - 2*maxLog2TrDynamicRange - dfShift;
569
1.91M
    m_DistAdd                   = (int64_t(1) << m_DistShift) >> 1;
570
1.91M
    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.91M
    m_DistOrgFact               = (int64_t)( nomDistFactor * double(int64_t(1)<<(m_DistShift+1       )) + .5 );
572
1.91M
  }
573
574
  void Quantizer::dequantBlock( const TransformUnit& tu, const ComponentID compID, const QpParam& cQP, CoeffBuf& recCoeff, bool enableScalingLists, int* piDequantCoef) const
575
787k
  {
576
577
    //----- set basic parameters -----
578
787k
    const CompArea&     area      = tu.blocks[ compID ];
579
787k
    const int           numCoeff  = area.area();
580
787k
    const SizeType      hsId      = Log2( area.width );
581
787k
    const SizeType      vsId      = Log2( area.height );
582
787k
    const ScanElement  *scan      = getScanOrder( SCAN_GROUPED_4x4, hsId, vsId );
583
787k
    const TCoeffSig*    qCoeff    = tu.getCoeffs( compID ).buf;
584
787k
          TCoeff*       tCoeff    = recCoeff.buf;
585
586
    //----- reset coefficients and get last scan index -----
587
787k
    ::memset( tCoeff, 0, numCoeff * sizeof( TCoeff ) );
588
787k
    int lastScanIdx = tu.lastPos[compID];
589
787k
    if( lastScanIdx < 0 )
590
0
    {
591
0
      return;
592
0
    }
593
594
    //----- set dequant parameters -----
595
787k
    const int         qpDQ                  = cQP.Qp(tu.mtsIdx[compID]==MTS_SKIP) + 1;
596
787k
    const int         qpPer                 = qpDQ / 6;
597
787k
    const int         qpRem                 = qpDQ - 6 * qpPer;
598
787k
    const SPS&        sps                   = *tu.cs->sps;
599
787k
    const ChannelType chType                = toChannelType( compID );
600
787k
    const int         channelBitDepth       = sps.bitDepths[ chType ];
601
787k
    const int         maxLog2TrDynamicRange = sps.getMaxLog2TrDynamicRange();
602
787k
    const TCoeff      minTCoeff             = -( 1 << maxLog2TrDynamicRange );
603
787k
    const TCoeff      maxTCoeff             =  ( 1 << maxLog2TrDynamicRange ) - 1;
604
787k
    const int         nomTransformShift     = getTransformShift( channelBitDepth, area.size(), maxLog2TrDynamicRange );
605
787k
    const bool    needsSqrt2ScaleAdjustment = TU::needsSqrt2Scale(tu, compID);
606
787k
    const int         transformShift        = nomTransformShift + (needsSqrt2ScaleAdjustment?-1:0);
607
787k
    Intermediate_Int  shift                 = IQUANT_SHIFT + 1 - qpPer - transformShift + (enableScalingLists ? LOG2_SCALING_LIST_NEUTRAL_VALUE : 0);
608
787k
    Intermediate_Int  invQScale             = g_invQuantScales[needsSqrt2ScaleAdjustment?1:0][ qpRem ];
609
787k
    Intermediate_Int  add                   = (shift < 0) ? 0 : ((1 << shift) >> 1);
610
    //----- dequant coefficients -----
611
8.34M
    for( int state = 0, scanIdx = lastScanIdx; scanIdx >= 0; scanIdx-- )
612
7.56M
    {
613
7.56M
      const unsigned   rasterPos = scan[scanIdx].idx;
614
7.56M
      const TCoeffSig& level     = qCoeff[ rasterPos ];
615
7.56M
      if( level )
616
6.82M
      {
617
6.82M
        if (enableScalingLists)
618
0
          invQScale = piDequantCoef[rasterPos];//scalingfactor*levelScale
619
6.82M
        if (shift < 0 && (enableScalingLists || scanIdx == lastScanIdx))
620
396k
        {
621
396k
          invQScale <<= -shift;
622
396k
        }
623
6.82M
        Intermediate_Int qIdx = 2 * level + (level > 0 ? -(state>>1) : (state>>1));
624
6.82M
        int64_t  nomTCoeff          = ((int64_t)qIdx * (int64_t)invQScale + add) >> ((shift < 0) ? 0 : shift);
625
6.82M
        tCoeff[rasterPos]           = (TCoeff)Clip3<int64_t>(minTCoeff, maxTCoeff, nomTCoeff);
626
6.82M
      }
627
7.56M
      state = ( 32040 >> ((state<<2)+((level&1)<<1)) ) & 3;   // the 16-bit value "32040" represent the state transition table
628
7.56M
    }
629
787k
  }
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.38M
  {
684
6.38M
    state.rdCost[stateId]         = DQIntern::rdCostInit;
685
6.38M
    state.ctx.cff[stateId]        =  0;
686
6.38M
    state.ctx.sig[stateId]        =  0;
687
6.38M
    state.numSig[stateId]         =  0;
688
6.38M
    state.refSbbCtxId[stateId]    = -1;
689
6.38M
    state.remRegBins[stateId]     =  4;
690
6.38M
    state.cffBitsCtxOffset        =  0;
691
6.38M
    state.m_goRicePar[stateId]    =  0;
692
6.38M
    state.m_goRiceZero[stateId]   =  0;
693
6.38M
    state.sbbBits0[stateId]       =  0;
694
6.38M
    state.sbbBits1[stateId]       =  0;
695
6.38M
  }
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
25.7M
  {
700
25.7M
    const int32_t* goRiceTab = DQIntern::g_goRiceBits[state.m_goRicePar[stateId]];
701
25.7M
    int64_t         rdCostA = state.rdCost[stateId] + pqDataA.deltaDist;
702
25.7M
    int64_t         rdCostB = state.rdCost[stateId] + pqDataB.deltaDist;
703
25.7M
    int64_t         rdCostZ = state.rdCost[stateId];
704
705
25.7M
    if( rrgEnsured || state.remRegBins[stateId] >= 4 )
706
25.2M
    {
707
25.2M
      const CoeffFracBits& cffBits = state.m_gtxFracBitsArray[state.ctx.cff[stateId]];
708
25.2M
      const BinFracBits    sigBits = state.m_sigFracBitsArray[stateId][state.ctx.sig[stateId]];
709
710
25.2M
      if( pqDataA.absLevel < 4 )
711
5.75M
        rdCostA += cffBits.bits[pqDataA.absLevel];
712
19.4M
      else
713
19.4M
      {
714
19.4M
        const unsigned value = ( pqDataA.absLevel - 4 ) >> 1;
715
19.4M
        rdCostA += cffBits.bits[pqDataA.absLevel - ( value << 1 )] + goRiceTab[std::min<unsigned>( value, RICEMAX - 1 )];
716
19.4M
      }
717
718
25.2M
      if( pqDataB.absLevel < 4 )
719
7.19M
        rdCostB += cffBits.bits[pqDataB.absLevel];
720
18.0M
      else
721
18.0M
      {
722
18.0M
        const unsigned value = ( pqDataB.absLevel - 4 ) >> 1;
723
18.0M
        rdCostB += cffBits.bits[pqDataB.absLevel - ( value << 1 )] + goRiceTab[std::min<unsigned>( value, RICEMAX - 1 )];
724
18.0M
      }
725
726
25.2M
      if( spt == SCAN_ISCSBB )
727
25.1M
      {
728
25.1M
        rdCostA += sigBits.intBits[1];
729
25.1M
        rdCostB += sigBits.intBits[1];
730
25.1M
        rdCostZ += sigBits.intBits[0];
731
25.1M
      }
732
75.9k
      else if( spt == SCAN_SOCSBB )
733
13.9k
      {
734
13.9k
        rdCostA += state.sbbBits1[stateId] + sigBits.intBits[1];
735
13.9k
        rdCostB += state.sbbBits1[stateId] + sigBits.intBits[1];
736
13.9k
        rdCostZ += state.sbbBits1[stateId] + sigBits.intBits[0];
737
13.9k
      }
738
62.0k
      else if( state.numSig[stateId] )
739
60.8k
      {
740
60.8k
        rdCostA += sigBits.intBits[1];
741
60.8k
        rdCostB += sigBits.intBits[1];
742
60.8k
        rdCostZ += sigBits.intBits[0];
743
60.8k
      }
744
1.22k
      else
745
1.22k
      {
746
1.22k
        rdCostZ = rdCostInit;
747
1.22k
      }
748
25.2M
    }
749
481k
    else
750
481k
    {
751
481k
      rdCostA += ( 1 << SCALE_BITS ) + goRiceTab[pqDataA.absLevel <= state.m_goRiceZero[stateId] ? pqDataA.absLevel - 1 : std::min<int>( pqDataA.absLevel, RICEMAX - 1 )];
752
481k
      rdCostB += ( 1 << SCALE_BITS ) + goRiceTab[pqDataB.absLevel <= state.m_goRiceZero[stateId] ? pqDataB.absLevel - 1 : std::min<int>( pqDataB.absLevel, RICEMAX - 1 )];
753
481k
      rdCostZ += goRiceTab[state.m_goRiceZero[stateId]];
754
481k
    }
755
756
25.7M
    if( rdCostA < rdCostZ && rdCostA < decisions.rdCost[idxAZ] )
757
16.0M
    {
758
16.0M
      decisions.rdCost[idxAZ] = rdCostA;
759
16.0M
      decisions.absLevel[idxAZ] = pqDataA.absLevel;
760
16.0M
      decisions.prevId[idxAZ] = stateId;
761
16.0M
    }
762
9.63M
    else if( rdCostZ < decisions.rdCost[idxAZ] )
763
309k
    {
764
309k
      decisions.rdCost[idxAZ] = rdCostZ;
765
309k
      decisions.absLevel[idxAZ] = 0;
766
309k
      decisions.prevId[idxAZ] = stateId;
767
309k
    }
768
769
25.7M
    if( rdCostB < decisions.rdCost[idxB] )
770
16.3M
    {
771
16.3M
      decisions.rdCost[idxB] = rdCostB;
772
16.3M
      decisions.absLevel[idxB] = pqDataB.absLevel;
773
16.3M
      decisions.prevId[idxB] = stateId;
774
16.3M
    }
775
25.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.31M
  {
700
4.31M
    const int32_t* goRiceTab = DQIntern::g_goRiceBits[state.m_goRicePar[stateId]];
701
4.31M
    int64_t         rdCostA = state.rdCost[stateId] + pqDataA.deltaDist;
702
4.31M
    int64_t         rdCostB = state.rdCost[stateId] + pqDataB.deltaDist;
703
4.31M
    int64_t         rdCostZ = state.rdCost[stateId];
704
705
4.31M
    if( rrgEnsured || state.remRegBins[stateId] >= 4 )
706
4.31M
    {
707
4.31M
      const CoeffFracBits& cffBits = state.m_gtxFracBitsArray[state.ctx.cff[stateId]];
708
4.31M
      const BinFracBits    sigBits = state.m_sigFracBitsArray[stateId][state.ctx.sig[stateId]];
709
710
4.31M
      if( pqDataA.absLevel < 4 )
711
4.31M
        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.31M
      if( pqDataB.absLevel < 4 )
719
4.31M
        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.31M
      if( spt == SCAN_ISCSBB )
727
4.28M
      {
728
4.28M
        rdCostA += sigBits.intBits[1];
729
4.28M
        rdCostB += sigBits.intBits[1];
730
4.28M
        rdCostZ += sigBits.intBits[0];
731
4.28M
      }
732
29.8k
      else if( spt == SCAN_SOCSBB )
733
11.5k
      {
734
11.5k
        rdCostA += state.sbbBits1[stateId] + sigBits.intBits[1];
735
11.5k
        rdCostB += state.sbbBits1[stateId] + sigBits.intBits[1];
736
11.5k
        rdCostZ += state.sbbBits1[stateId] + sigBits.intBits[0];
737
11.5k
      }
738
18.2k
      else if( state.numSig[stateId] )
739
17.4k
      {
740
17.4k
        rdCostA += sigBits.intBits[1];
741
17.4k
        rdCostB += sigBits.intBits[1];
742
17.4k
        rdCostZ += sigBits.intBits[0];
743
17.4k
      }
744
832
      else
745
832
      {
746
832
        rdCostZ = rdCostInit;
747
832
      }
748
4.31M
    }
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.31M
    if( rdCostA < rdCostZ && rdCostA < decisions.rdCost[idxAZ] )
757
2.83M
    {
758
2.83M
      decisions.rdCost[idxAZ] = rdCostA;
759
2.83M
      decisions.absLevel[idxAZ] = pqDataA.absLevel;
760
2.83M
      decisions.prevId[idxAZ] = stateId;
761
2.83M
    }
762
1.48M
    else if( rdCostZ < decisions.rdCost[idxAZ] )
763
308k
    {
764
308k
      decisions.rdCost[idxAZ] = rdCostZ;
765
308k
      decisions.absLevel[idxAZ] = 0;
766
308k
      decisions.prevId[idxAZ] = stateId;
767
308k
    }
768
769
4.31M
    if( rdCostB < decisions.rdCost[idxB] )
770
3.14M
    {
771
3.14M
      decisions.rdCost[idxB] = rdCostB;
772
3.14M
      decisions.absLevel[idxB] = pqDataB.absLevel;
773
3.14M
      decisions.prevId[idxB] = stateId;
774
3.14M
    }
775
4.31M
  }
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
21.4M
  {
700
21.4M
    const int32_t* goRiceTab = DQIntern::g_goRiceBits[state.m_goRicePar[stateId]];
701
21.4M
    int64_t         rdCostA = state.rdCost[stateId] + pqDataA.deltaDist;
702
21.4M
    int64_t         rdCostB = state.rdCost[stateId] + pqDataB.deltaDist;
703
21.4M
    int64_t         rdCostZ = state.rdCost[stateId];
704
705
21.4M
    if( rrgEnsured || state.remRegBins[stateId] >= 4 )
706
20.9M
    {
707
20.9M
      const CoeffFracBits& cffBits = state.m_gtxFracBitsArray[state.ctx.cff[stateId]];
708
20.9M
      const BinFracBits    sigBits = state.m_sigFracBitsArray[stateId][state.ctx.sig[stateId]];
709
710
20.9M
      if( pqDataA.absLevel < 4 )
711
1.43M
        rdCostA += cffBits.bits[pqDataA.absLevel];
712
19.4M
      else
713
19.4M
      {
714
19.4M
        const unsigned value = ( pqDataA.absLevel - 4 ) >> 1;
715
19.4M
        rdCostA += cffBits.bits[pqDataA.absLevel - ( value << 1 )] + goRiceTab[std::min<unsigned>( value, RICEMAX - 1 )];
716
19.4M
      }
717
718
20.9M
      if( pqDataB.absLevel < 4 )
719
2.88M
        rdCostB += cffBits.bits[pqDataB.absLevel];
720
18.0M
      else
721
18.0M
      {
722
18.0M
        const unsigned value = ( pqDataB.absLevel - 4 ) >> 1;
723
18.0M
        rdCostB += cffBits.bits[pqDataB.absLevel - ( value << 1 )] + goRiceTab[std::min<unsigned>( value, RICEMAX - 1 )];
724
18.0M
      }
725
726
20.9M
      if( spt == SCAN_ISCSBB )
727
20.8M
      {
728
20.8M
        rdCostA += sigBits.intBits[1];
729
20.8M
        rdCostB += sigBits.intBits[1];
730
20.8M
        rdCostZ += sigBits.intBits[0];
731
20.8M
      }
732
46.1k
      else if( spt == SCAN_SOCSBB )
733
2.37k
      {
734
2.37k
        rdCostA += state.sbbBits1[stateId] + sigBits.intBits[1];
735
2.37k
        rdCostB += state.sbbBits1[stateId] + sigBits.intBits[1];
736
2.37k
        rdCostZ += state.sbbBits1[stateId] + sigBits.intBits[0];
737
2.37k
      }
738
43.7k
      else if( state.numSig[stateId] )
739
43.3k
      {
740
43.3k
        rdCostA += sigBits.intBits[1];
741
43.3k
        rdCostB += sigBits.intBits[1];
742
43.3k
        rdCostZ += sigBits.intBits[0];
743
43.3k
      }
744
392
      else
745
392
      {
746
392
        rdCostZ = rdCostInit;
747
392
      }
748
20.9M
    }
749
481k
    else
750
481k
    {
751
481k
      rdCostA += ( 1 << SCALE_BITS ) + goRiceTab[pqDataA.absLevel <= state.m_goRiceZero[stateId] ? pqDataA.absLevel - 1 : std::min<int>( pqDataA.absLevel, RICEMAX - 1 )];
752
481k
      rdCostB += ( 1 << SCALE_BITS ) + goRiceTab[pqDataB.absLevel <= state.m_goRiceZero[stateId] ? pqDataB.absLevel - 1 : std::min<int>( pqDataB.absLevel, RICEMAX - 1 )];
753
481k
      rdCostZ += goRiceTab[state.m_goRiceZero[stateId]];
754
481k
    }
755
756
21.4M
    if( rdCostA < rdCostZ && rdCostA < decisions.rdCost[idxAZ] )
757
13.2M
    {
758
13.2M
      decisions.rdCost[idxAZ] = rdCostA;
759
13.2M
      decisions.absLevel[idxAZ] = pqDataA.absLevel;
760
13.2M
      decisions.prevId[idxAZ] = stateId;
761
13.2M
    }
762
8.15M
    else if( rdCostZ < decisions.rdCost[idxAZ] )
763
449
    {
764
449
      decisions.rdCost[idxAZ] = rdCostZ;
765
449
      decisions.absLevel[idxAZ] = 0;
766
449
      decisions.prevId[idxAZ] = stateId;
767
449
    }
768
769
21.4M
    if( rdCostB < decisions.rdCost[idxB] )
770
13.2M
    {
771
13.2M
      decisions.rdCost[idxB] = rdCostB;
772
13.2M
      decisions.absLevel[idxB] = pqDataB.absLevel;
773
13.2M
      decisions.prevId[idxB] = stateId;
774
13.2M
    }
775
21.4M
  }
776
777
  void checkAllRdCosts( const DQIntern::ScanPosType spt, const DQIntern::PQData* pqData, DQIntern::Decisions& decisions, const DQIntern::StateMem& state )
778
1.07M
  {
779
1.07M
    checkRdCosts<true>( 0, spt, pqData[0], pqData[2], decisions, 0, 2, state );
780
1.07M
    checkRdCosts<true>( 1, spt, pqData[0], pqData[2], decisions, 2, 0, state );
781
1.07M
    checkRdCosts<true>( 2, spt, pqData[3], pqData[1], decisions, 1, 3, state );
782
1.07M
    checkRdCosts<true>( 3, spt, pqData[3], pqData[1], decisions, 3, 1, state );
783
1.07M
  }
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
4.88M
  {
788
4.88M
    int64_t         rdCostA = state.rdCost[stateId] + deltaDist;
789
4.88M
    int64_t         rdCostZ = state.rdCost[stateId];
790
791
4.88M
    if( rrgEnsured || state.remRegBins[stateId] >= 4 )
792
4.88M
    {
793
4.88M
      const BinFracBits sigBits = state.m_sigFracBitsArray[stateId][state.ctx.sig[stateId]];
794
795
4.88M
      rdCostA += state.cffBits1[state.ctx.cff[stateId]];
796
797
4.88M
      if( spt == SCAN_ISCSBB )
798
4.76M
      {
799
4.76M
        rdCostA += sigBits.intBits[1];
800
4.76M
        rdCostZ += sigBits.intBits[0];
801
4.76M
      }
802
126k
      else if( spt == SCAN_SOCSBB )
803
82.9k
      {
804
82.9k
        rdCostA += state.sbbBits1[stateId] + sigBits.intBits[1];
805
82.9k
        rdCostZ += state.sbbBits1[stateId] + sigBits.intBits[0];
806
82.9k
      }
807
43.7k
      else if( state.numSig[stateId] )
808
8.91k
      {
809
8.91k
        rdCostA += sigBits.intBits[1];
810
8.91k
        rdCostZ += sigBits.intBits[0];
811
8.91k
      }
812
34.7k
      else
813
34.7k
      {
814
34.7k
        rdCostZ = rdCostInit;
815
34.7k
      }
816
4.88M
    }
817
1.92k
    else
818
1.92k
    {
819
1.92k
      const int32_t* goRiceTab = g_goRiceBits[state.m_goRicePar[stateId]];
820
821
1.92k
      rdCostA += ( 1 << SCALE_BITS ) + goRiceTab[0];
822
1.92k
      rdCostZ += goRiceTab[state.m_goRiceZero[stateId]];
823
1.92k
    }
824
825
4.88M
    if( rdCostA < decisions.rdCost[idxA] )
826
2.90M
    {
827
2.90M
      decisions.rdCost[idxA] = rdCostA;
828
2.90M
      decisions.absLevel[idxA] = 1;
829
2.90M
      decisions.prevId[idxA] = stateId;
830
2.90M
    }
831
832
4.88M
    if( rdCostZ < decisions.rdCost[idxZ] )
833
3.46M
    {
834
3.46M
      decisions.rdCost[idxZ] = rdCostZ;
835
3.46M
      decisions.absLevel[idxZ] = 0;
836
3.46M
      decisions.prevId[idxZ] = stateId;
837
3.46M
    }
838
4.88M
  }
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.55M
  {
788
4.55M
    int64_t         rdCostA = state.rdCost[stateId] + deltaDist;
789
4.55M
    int64_t         rdCostZ = state.rdCost[stateId];
790
791
4.55M
    if( rrgEnsured || state.remRegBins[stateId] >= 4 )
792
4.55M
    {
793
4.55M
      const BinFracBits sigBits = state.m_sigFracBitsArray[stateId][state.ctx.sig[stateId]];
794
795
4.55M
      rdCostA += state.cffBits1[state.ctx.cff[stateId]];
796
797
4.55M
      if( spt == SCAN_ISCSBB )
798
4.43M
      {
799
4.43M
        rdCostA += sigBits.intBits[1];
800
4.43M
        rdCostZ += sigBits.intBits[0];
801
4.43M
      }
802
125k
      else if( spt == SCAN_SOCSBB )
803
82.7k
      {
804
82.7k
        rdCostA += state.sbbBits1[stateId] + sigBits.intBits[1];
805
82.7k
        rdCostZ += state.sbbBits1[stateId] + sigBits.intBits[0];
806
82.7k
      }
807
43.2k
      else if( state.numSig[stateId] )
808
8.91k
      {
809
8.91k
        rdCostA += sigBits.intBits[1];
810
8.91k
        rdCostZ += sigBits.intBits[0];
811
8.91k
      }
812
34.3k
      else
813
34.3k
      {
814
34.3k
        rdCostZ = rdCostInit;
815
34.3k
      }
816
4.55M
    }
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.55M
    if( rdCostA < decisions.rdCost[idxA] )
826
2.90M
    {
827
2.90M
      decisions.rdCost[idxA] = rdCostA;
828
2.90M
      decisions.absLevel[idxA] = 1;
829
2.90M
      decisions.prevId[idxA] = stateId;
830
2.90M
    }
831
832
4.55M
    if( rdCostZ < decisions.rdCost[idxZ] )
833
3.46M
    {
834
3.46M
      decisions.rdCost[idxZ] = rdCostZ;
835
3.46M
      decisions.absLevel[idxZ] = 0;
836
3.46M
      decisions.prevId[idxZ] = stateId;
837
3.46M
    }
838
4.55M
  }
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
330k
  {
788
330k
    int64_t         rdCostA = state.rdCost[stateId] + deltaDist;
789
330k
    int64_t         rdCostZ = state.rdCost[stateId];
790
791
330k
    if( rrgEnsured || state.remRegBins[stateId] >= 4 )
792
328k
    {
793
328k
      const BinFracBits sigBits = state.m_sigFracBitsArray[stateId][state.ctx.sig[stateId]];
794
795
328k
      rdCostA += state.cffBits1[state.ctx.cff[stateId]];
796
797
328k
      if( spt == SCAN_ISCSBB )
798
328k
      {
799
328k
        rdCostA += sigBits.intBits[1];
800
328k
        rdCostZ += sigBits.intBits[0];
801
328k
      }
802
649
      else if( spt == SCAN_SOCSBB )
803
189
      {
804
189
        rdCostA += state.sbbBits1[stateId] + sigBits.intBits[1];
805
189
        rdCostZ += state.sbbBits1[stateId] + sigBits.intBits[0];
806
189
      }
807
460
      else if( state.numSig[stateId] )
808
0
      {
809
0
        rdCostA += sigBits.intBits[1];
810
0
        rdCostZ += sigBits.intBits[0];
811
0
      }
812
460
      else
813
460
      {
814
460
        rdCostZ = rdCostInit;
815
460
      }
816
328k
    }
817
1.92k
    else
818
1.92k
    {
819
1.92k
      const int32_t* goRiceTab = g_goRiceBits[state.m_goRicePar[stateId]];
820
821
1.92k
      rdCostA += ( 1 << SCALE_BITS ) + goRiceTab[0];
822
1.92k
      rdCostZ += goRiceTab[state.m_goRiceZero[stateId]];
823
1.92k
    }
824
825
330k
    if( rdCostA < decisions.rdCost[idxA] )
826
1.40k
    {
827
1.40k
      decisions.rdCost[idxA] = rdCostA;
828
1.40k
      decisions.absLevel[idxA] = 1;
829
1.40k
      decisions.prevId[idxA] = stateId;
830
1.40k
    }
831
832
330k
    if( rdCostZ < decisions.rdCost[idxZ] )
833
2.17k
    {
834
2.17k
      decisions.rdCost[idxZ] = rdCostZ;
835
2.17k
      decisions.absLevel[idxZ] = 0;
836
2.17k
      decisions.prevId[idxZ] = stateId;
837
2.17k
    }
838
330k
  }
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.13M
  {
842
1.13M
    checkRdCostsOdd1<true>( 0, spt, pq_b_dist, decisions, 2, 0, state );
843
1.13M
    checkRdCostsOdd1<true>( 1, spt, pq_b_dist, decisions, 0, 2, state );
844
1.13M
    checkRdCostsOdd1<true>( 2, spt, pq_a_dist, decisions, 3, 1, state );
845
1.13M
    checkRdCostsOdd1<true>( 3, spt, pq_a_dist, decisions, 1, 3, state );
846
1.13M
  }
847
848
  static inline void checkRdCostStart( int32_t lastOffset, const PQData& pqData, Decisions& decisions, int idx, const StateMem& state )
849
14.0M
  {
850
14.0M
    const CoeffFracBits& cffBits = state.m_gtxFracBitsArray[0];
851
852
14.0M
    int64_t rdCost = pqData.deltaDist + lastOffset;
853
14.0M
    if( pqData.absLevel < 4 )
854
4.67M
    {
855
4.67M
      rdCost += cffBits.bits[pqData.absLevel];
856
4.67M
    }
857
9.40M
    else
858
9.40M
    {
859
9.40M
      const unsigned value = ( pqData.absLevel - 4 ) >> 1;
860
9.40M
      rdCost += cffBits.bits[pqData.absLevel - ( value << 1 )] + g_goRiceBits[0][value < RICEMAX ? value : RICEMAX - 1];
861
9.40M
    }
862
863
14.0M
    if( rdCost < decisions.rdCost[idx] )
864
1.83M
    {
865
1.83M
      decisions.rdCost[idx]   = rdCost;
866
1.83M
      decisions.absLevel[idx] = pqData.absLevel;
867
1.83M
      decisions.prevId[idx]   = -1;
868
1.83M
    }
869
14.0M
  }
870
871
  static inline void checkRdCostSkipSbb( const int stateId, Decisions& decisions, int idx, const StateMem& state )
872
120k
  {
873
120k
    int64_t rdCost = state.rdCost[stateId] + state.sbbBits0[stateId];
874
120k
    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
120k
  }
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
21.2M
  {
892
21.2M
    if( state.remRegBins[stateId] < 4 || ge4 )
893
19.9M
    {
894
19.9M
      TCoeff  sumAbs = state.sum1st[scanInfo.insidePos][stateId];
895
19.9M
      int sumSub     = state.remRegBins[stateId] < 4 ? 0 : 4 * 5;
896
19.9M
      int sumAll     = std::max( std::min( 31, ( int ) sumAbs - sumSub ), 0 );
897
19.9M
      state.m_goRicePar[stateId]
898
19.9M
                     = g_auiGoRiceParsCoeff[sumAll];
899
900
19.9M
      if( state.remRegBins[stateId] < 4 )
901
482k
      {
902
482k
        state.m_goRiceZero[stateId] = g_auiGoRicePosCoeff0( stateId, state.m_goRicePar[stateId] );
903
482k
      }
904
19.9M
    }
905
21.2M
  }
906
907
  static void update1State( int stateId, const DQIntern::ScanInfo& scanInfo, const DQIntern::Decisions& decisions, DQIntern::StateMem& curr, DQIntern::StateMem& prev )
908
27.2M
  {
909
27.2M
    curr.rdCost[stateId] = decisions.rdCost[stateId];
910
27.2M
    if( decisions.prevId[stateId] > -2 )
911
26.1M
    {
912
26.1M
      if( decisions.prevId[stateId] >= 0 )
913
24.8M
      {
914
24.8M
        const int prevId          = decisions.prevId[stateId];
915
24.8M
        curr.numSig[stateId]      = prev.numSig[prevId] + !!decisions.absLevel[stateId];
916
24.8M
        curr.refSbbCtxId[stateId] = prev.refSbbCtxId[prevId];
917
24.8M
        curr.sbbBits0[stateId]    = prev.sbbBits0[prevId];
918
24.8M
        curr.sbbBits1[stateId]    = prev.sbbBits1[prevId];
919
24.8M
        curr.remRegBins[stateId]  = prev.remRegBins[prevId] - 1;
920
921
24.8M
        if( curr.remRegBins[stateId] >= 4 )
922
24.6M
        {
923
24.6M
          curr.remRegBins[stateId] -= ( decisions.absLevel[stateId] < 2 ? decisions.absLevel[stateId] : 3 );
924
24.6M
        }
925
926
423M
        for( int i = 0; i < 16; i++ )
927
398M
        {
928
398M
          curr.tplAcc[i][stateId] = prev.tplAcc[i][prevId];
929
398M
          curr.sum1st[i][stateId] = prev.sum1st[i][prevId];
930
398M
          curr.absVal[i][stateId] = prev.absVal[i][prevId];
931
398M
        }
932
24.8M
      }
933
1.27M
      else
934
1.27M
      {
935
1.27M
        curr.numSig[stateId]      =  1;
936
1.27M
        curr.refSbbCtxId[stateId] = -1;
937
1.27M
        curr.remRegBins[stateId]  = prev.initRemRegBins;
938
1.27M
        curr.remRegBins[stateId] -= ( decisions.absLevel[stateId] < 2 ? decisions.absLevel[stateId] : 3 );
939
940
21.6M
        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.27M
      }
947
948
26.1M
      if( decisions.absLevel[stateId] )
949
23.2M
      {
950
23.2M
        curr.absVal[scanInfo.insidePos][stateId] = ( uint8_t ) std::min<TCoeff>( 126 + ( decisions.absLevel[stateId] & 1 ), decisions.absLevel[stateId] );
951
952
23.2M
        if( scanInfo.currNbInfoSbb.numInv )
953
23.2M
        {
954
23.2M
          int min4_or_5 = std::min<TCoeff>( 4 + ( decisions.absLevel[stateId] & 1 ), decisions.absLevel[stateId] );
955
956
23.2M
          auto adds8 = []( uint8_t a, uint8_t b )
957
68.0M
          {
958
68.0M
            uint8_t c = a + b;
959
68.0M
            if( c < a ) c = -1;
960
68.0M
            return c;
961
68.0M
          };
962
963
23.2M
          auto update_deps = [&]( int k )
964
68.0M
          {
965
68.0M
            curr.tplAcc[scanInfo.currNbInfoSbb.invInPos[k]][stateId] += 32 + min4_or_5;
966
68.0M
            curr.sum1st[scanInfo.currNbInfoSbb.invInPos[k]][stateId] = adds8( curr.sum1st[scanInfo.currNbInfoSbb.invInPos[k]][stateId], decisions.absLevel[stateId] );
967
68.0M
          };
968
969
23.2M
          switch( scanInfo.currNbInfoSbb.numInv )
970
23.2M
          {
971
0
          default:
972
3.86M
          case 5:
973
3.86M
            update_deps( 4 );
974
9.70M
          case 4:
975
9.70M
            update_deps( 3 );
976
11.7M
          case 3:
977
11.7M
            update_deps( 2 );
978
19.3M
          case 2:
979
19.3M
            update_deps( 1 );
980
23.2M
          case 1:
981
23.2M
            update_deps( 0 );
982
23.2M
          }
983
23.2M
        }
984
23.2M
      }
985
986
26.1M
      if( curr.remRegBins[stateId] >= 4 )
987
25.7M
      {
988
25.7M
        TCoeff  sumAbs1 = curr.tplAcc[scanInfo.nextInsidePos][stateId] & 31;
989
25.7M
        TCoeff  sumNum  = curr.tplAcc[scanInfo.nextInsidePos][stateId] >> 5u;
990
25.7M
        int sumGt1 = sumAbs1 - sumNum;
991
992
25.7M
        curr.ctx.sig[stateId] = scanInfo.sigCtxOffsetNext + std::min( ( sumAbs1 + 1 ) >> 1, 3 );
993
25.7M
        curr.ctx.cff[stateId] = scanInfo.gtxCtxOffsetNext + std::min( sumGt1, 4 );
994
25.7M
      }
995
467k
      else
996
467k
      {
997
467k
        curr.anyRemRegBinsLt4 = true;
998
467k
      }
999
26.1M
    }
1000
27.2M
  }
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
127k
  {
1004
127k
    curr.rdCost[stateId] = decisions.rdCost[stateId];
1005
1006
127k
    if( decisions.prevId[stateId] > -2 )
1007
125k
    {
1008
125k
      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
85.4k
      else if( decisions.prevId[stateId] >= 0 )
1023
83.5k
      {
1024
83.5k
        const int prevId          = decisions.prevId[stateId];
1025
83.5k
        curr.numSig[stateId]      = prev.numSig[prevId] + !!decisions.absLevel[stateId];
1026
83.5k
        curr.refSbbCtxId[stateId] = prev.refSbbCtxId[prevId];
1027
83.5k
        curr.remRegBins[stateId]  = prev.remRegBins[prevId] - 1;
1028
1029
83.5k
        if( curr.remRegBins[stateId] >= 4 )
1030
68.4k
        {
1031
68.4k
          curr.remRegBins[stateId] -= ( decisions.absLevel[stateId] < 2 ? decisions.absLevel[stateId] : 3 );
1032
68.4k
        }
1033
1034
1.42M
        for( int i = 0; i < 16; i++ )
1035
1.33M
        {
1036
1.33M
          curr.absVal[i][stateId] = prev.absVal[i][prevId];
1037
1.33M
        }
1038
83.5k
      }
1039
1.85k
      else
1040
1.85k
      {
1041
1.85k
        curr.numSig[stateId]      =  1;
1042
1.85k
        curr.refSbbCtxId[stateId] = -1;
1043
1.85k
        curr.remRegBins[stateId]  = prev.initRemRegBins;
1044
1.85k
        curr.remRegBins[stateId] -= ( decisions.absLevel[stateId] < 2 ? decisions.absLevel[stateId] : 3 );
1045
1046
31.5k
        for( int i = 0; i < 16; i++ )
1047
29.6k
        {
1048
29.6k
          curr.absVal[i][stateId] = 0;
1049
29.6k
        }
1050
1.85k
      }
1051
1052
125k
      curr.absVal[scanInfo.insidePos][stateId] = ( uint8_t ) std::min<TCoeff>( 126 + ( decisions.absLevel[stateId] & 1 ), decisions.absLevel[stateId] );
1053
1054
125k
      uint8_t* levels[4];
1055
125k
      commonCtx.getLevelPtrs( scanInfo, levels[0], levels[1], levels[2], levels[3] );
1056
2.14M
      for( int i = 0; i < 16; i++ )
1057
2.01M
      {
1058
        // save abs levels to commonCtx
1059
2.01M
        levels[stateId][i] = curr.absVal[i][stateId];
1060
        // clean the SBB ctx
1061
2.01M
        curr.tplAcc[i][stateId] = 0;
1062
2.01M
        curr.sum1st[i][stateId] = 0;
1063
2.01M
        curr.absVal[i][stateId] = 0;
1064
2.01M
      }
1065
1066
125k
      commonCtx.update( scanInfo, curr.refSbbCtxId[stateId], stateId, curr );
1067
1068
125k
      curr.numSig[stateId] = 0;
1069
1070
125k
      if( curr.remRegBins[stateId] >= 4 )
1071
110k
      {
1072
110k
        TCoeff  sumAbs1 = curr.tplAcc[scanInfo.nextInsidePos][stateId] & 31;
1073
110k
        TCoeff  sumNum  = curr.tplAcc[scanInfo.nextInsidePos][stateId] >> 5u;
1074
110k
        int sumGt1 = sumAbs1 - sumNum;
1075
1076
110k
        curr.ctx.sig[stateId] = scanInfo.sigCtxOffsetNext + std::min( ( sumAbs1 + 1 ) >> 1, 3 );
1077
110k
        curr.ctx.cff[stateId] = scanInfo.gtxCtxOffsetNext + std::min( sumGt1, 4 );
1078
110k
      }
1079
15.3k
      else
1080
15.3k
      {
1081
15.3k
        curr.anyRemRegBinsLt4 = true;
1082
15.3k
      }
1083
125k
    }
1084
127k
  }
1085
1086
  static void updateStates( const DQIntern::ScanInfo& scanInfo, const DQIntern::Decisions& decisions, DQIntern::StateMem& curr )
1087
6.82M
  {
1088
6.82M
    DQIntern::StateMem prev = curr;
1089
6.82M
    curr.anyRemRegBinsLt4   = false;
1090
1091
6.82M
    update1State( 0, scanInfo, decisions, curr, prev );
1092
6.82M
    update1State( 1, scanInfo, decisions, curr, prev );
1093
6.82M
    update1State( 2, scanInfo, decisions, curr, prev );
1094
6.82M
    update1State( 3, scanInfo, decisions, curr, prev );
1095
1096
6.82M
    curr.cffBitsCtxOffset = scanInfo.gtxCtxOffsetNext;
1097
6.82M
  }
1098
1099
  static void updateStatesEOS( const DQIntern::ScanInfo& scanInfo, const DQIntern::Decisions& decisions, const DQIntern::StateMem& skip, DQIntern::StateMem& curr, DQIntern::CommonCtx& commonCtx )
1100
31.8k
  {
1101
31.8k
    DQIntern::StateMem prev = curr;
1102
31.8k
    curr.anyRemRegBinsLt4   = false;
1103
1104
31.8k
    update1StateEOS( 0, scanInfo, decisions, skip, curr, prev, commonCtx );
1105
31.8k
    update1StateEOS( 1, scanInfo, decisions, skip, curr, prev, commonCtx );
1106
31.8k
    update1StateEOS( 2, scanInfo, decisions, skip, curr, prev, commonCtx );
1107
31.8k
    update1StateEOS( 3, scanInfo, decisions, skip, curr, prev, commonCtx );
1108
1109
31.8k
    curr.cffBitsCtxOffset = scanInfo.gtxCtxOffsetNext;
1110
31.8k
  }
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.91M
{
1131
1.91M
  using namespace DQIntern;
1132
  
1133
  //===== reset / pre-init =====
1134
1.91M
  const TUParameters& tuPars  = *m_scansRom->getTUPars( tu.blocks[compID], compID );
1135
1.91M
  m_quant.initQuantBlock    ( tu, compID, cQP, lambda );
1136
1.91M
  TCoeffSig*    qCoeff      = tu.getCoeffs( compID ).buf;
1137
1.91M
  const TCoeff* tCoeff      = srcCoeff.buf;
1138
1.91M
  const int     numCoeff    = tu.blocks[compID].area();
1139
1.91M
  ::memset( qCoeff, 0x00, numCoeff * sizeof( TCoeffSig ) );
1140
1.91M
  absSum                    = 0;
1141
1142
1.91M
  const CompArea& area      = tu.blocks[ compID ];
1143
1.91M
  const uint32_t  width     = area.width;
1144
1.91M
  const uint32_t  height    = area.height;
1145
1.91M
  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.91M
  bool zeroOut = false;
1153
1.91M
  bool zeroOutforThres = false;
1154
1.91M
  int effWidth = tuPars.m_width, effHeight = tuPars.m_height;
1155
1.91M
  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.91M
  zeroOutforThres = zeroOut || ( 32 < tuPars.m_height || 32 < tuPars.m_width );
1162
  //===== find first test position =====
1163
1.91M
  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.91M
  if( lfnstIdx > 0 && tu.mtsIdx[compID] != MTS_SKIP && width >= 4 && height >= 4 )
1165
1.18M
  {
1166
1.18M
    firstTestPos = ( ( width == 4 && height == 4 ) || ( width == 8 && height == 8 ) )  ? 7 : 15 ;
1167
1.18M
  }
1168
1169
1.91M
  const TCoeff defaultQuantisationCoefficient = (TCoeff)m_quant.getQScale();
1170
1.91M
  const TCoeff thres = m_quant.getLastThreshold();
1171
1.91M
  const int zeroOutWidth  = ( tuPars.m_width  == 32 && zeroOut ) ? 16 : 32;
1172
1.91M
  const int zeroOutHeight = ( tuPars.m_height == 32 && zeroOut ) ? 16 : 32;
1173
1174
1.91M
  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.91M
  else
1186
1.91M
  {
1187
1.91M
    const TCoeff defaultTh = TCoeff( thres / ( defaultQuantisationCoefficient << 2 ) );
1188
1189
1.91M
    m_findFirstPos( firstTestPos, tCoeff, tuPars, defaultTh, zeroOutforThres, zeroOutWidth, zeroOutHeight );
1190
1.91M
  }
1191
1192
1.91M
  if( firstTestPos < 0 )
1193
1.11M
  {
1194
1.11M
    tu.lastPos[compID] = -1;
1195
1.11M
    return;
1196
1.11M
  }
1197
1198
  //===== real init =====
1199
797k
  RateEstimator::initCtx( tuPars, tu, compID, ctx.getFracBitsAcess() );
1200
797k
  m_commonCtx.reset( tuPars, *this );
1201
3.98M
  for( int k = 0; k < 4; k++ )
1202
3.19M
  {
1203
3.19M
    DQIntern::initStates( k, m_state_curr );
1204
3.19M
    DQIntern::initStates( k, m_state_skip );
1205
3.19M
    m_state_curr.m_sigFracBitsArray[k] = RateEstimator::sigFlagBits(k);
1206
3.19M
  }
1207
1208
797k
  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
797k
  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
797k
  const int numCtx = isLuma( compID ) ? 21 : 11;
1214
797k
  const CoeffFracBits* const cffBits = gtxFracBits();
1215
9.88M
  for( int i = 0; i < numCtx; i++ )
1216
9.08M
  {
1217
9.08M
    m_state_curr.cffBits1[i] = cffBits[i].bits[1];
1218
9.08M
  }
1219
1220
797k
  int effectWidth  = std::min( 32, effWidth );
1221
797k
  int effectHeight = std::min( 32, effHeight );
1222
797k
  m_state_curr.initRemRegBins   = ( effectWidth * effectHeight * MAX_TU_LEVEL_CTX_CODED_BIN_CONSTRAINT ) / 16;
1223
797k
  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.44M
  for( int scanIdx = firstTestPos; scanIdx >= 0; scanIdx-- )
1228
7.65M
  {
1229
7.65M
    const ScanInfo& scanInfo = tuPars.m_scanInfo[ scanIdx ];
1230
7.65M
    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.65M
    else
1236
7.65M
      xDecideAndUpdate( abs( tCoeff[scanInfo.rasterPos] ), scanInfo, zeroOut && ( scanInfo.posX >= effWidth || scanInfo.posY >= effHeight ), defaultQuantisationCoefficient );
1237
7.65M
  }
1238
1239
  //===== find best path =====
1240
797k
  int       prevId      = -1;
1241
797k
  int64_t   minPathCost =  0;
1242
3.98M
  for( int8_t stateId = 0; stateId < 4; stateId++ )
1243
3.19M
  {
1244
3.19M
    int64_t pathCost = m_trellis[0][0].rdCost[stateId];
1245
3.19M
    if( pathCost < minPathCost )
1246
1.36M
    {
1247
1.36M
      prevId      = stateId;
1248
1.36M
      minPathCost = pathCost;
1249
1.36M
    }
1250
3.19M
  }
1251
1252
  //===== backward scanning =====
1253
797k
  int scanIdx = 0;
1254
8.35M
  for( ; prevId >= 0; scanIdx++ )
1255
7.56M
  {
1256
7.56M
    TCoeffSig absLevel = m_trellis[scanIdx][prevId >> 2].absLevel[prevId & 3];
1257
7.56M
    int32_t blkpos     = tuPars.m_scanId2BlkPos[scanIdx].idx;
1258
7.56M
    qCoeff[ blkpos ]   = TCoeffSig( tCoeff[blkpos] < 0 ? -absLevel : absLevel );
1259
7.56M
    absSum            += absLevel;
1260
7.56M
    prevId             = m_trellis[scanIdx][prevId >> 2].prevId[prevId & 3];
1261
7.56M
  }
1262
1263
797k
  tu.lastPos[compID] = scanIdx - 1;
1264
797k
}
1265
1266
void DepQuant::xDecide( const DQIntern::ScanInfo& scanInfo, const TCoeff absCoeff, const int lastOffset, DQIntern::Decisions& decisions, bool zeroOut, int quantCoeff )
1267
7.65M
{
1268
7.65M
  using namespace DQIntern;
1269
1270
7.65M
  ::memcpy( &decisions, startDec, sizeof( Decisions ) );
1271
1272
7.65M
  StateMem& skip = m_state_skip;
1273
1274
7.65M
  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.65M
  StateMem& prev = m_state_curr;
1287
1288
  /// start inline prequant
1289
7.65M
  int64_t scaledOrg = int64_t( absCoeff ) * quantCoeff;
1290
7.65M
  TCoeff  qIdx      = TCoeff( ( scaledOrg + m_quant.m_QAdd ) >> m_quant.m_QShift );
1291
1292
7.65M
  if( qIdx < 0 )
1293
1.22M
  {
1294
1.22M
    int64_t scaledAdd = m_quant.m_DistStepAdd - scaledOrg * m_quant.m_DistOrgFact;
1295
1.22M
    int64_t pq_a_dist = ( ( scaledAdd + 0 * m_quant.m_DistStepAdd ) * 1 + m_quant.m_DistAdd ) >> m_quant.m_DistShift;
1296
1.22M
    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.22M
    if( prev.anyRemRegBinsLt4 )
1300
82.6k
    {
1301
82.6k
      setRiceParam( 0, scanInfo, prev, false );
1302
82.6k
      checkRdCostsOdd1( 0, scanInfo.spt, pq_b_dist, decisions, 2, 0, prev );
1303
1304
82.6k
      setRiceParam( 1, scanInfo, prev, false );
1305
82.6k
      checkRdCostsOdd1( 1, scanInfo.spt, pq_b_dist, decisions, 0, 2, prev );
1306
1307
82.6k
      setRiceParam( 2, scanInfo, prev, false );
1308
82.6k
      checkRdCostsOdd1( 2, scanInfo.spt, pq_a_dist, decisions, 3, 1, prev );
1309
1310
82.6k
      setRiceParam( 3, scanInfo, prev, false );
1311
82.6k
      checkRdCostsOdd1( 3, scanInfo.spt, pq_a_dist, decisions, 1, 3, prev );
1312
82.6k
    }
1313
1.13M
    else
1314
1.13M
    {
1315
      // has to be called as a first check, assumes no decision has been made yet
1316
1.13M
      m_checkAllRdCostsOdd1( scanInfo.spt, pq_a_dist, pq_b_dist, decisions, prev );
1317
1.13M
    }
1318
1319
1.22M
    checkRdCostStart( lastOffset, PQData{ 1, pq_b_dist }, decisions, 2, prev );
1320
1.22M
  }
1321
6.42M
  else
1322
6.42M
  {
1323
    /// start inline prequant
1324
6.42M
    qIdx = std::max<TCoeff>( 1, std::min<TCoeff>( m_quant.m_maxQIdx, qIdx ) );
1325
6.42M
    int64_t scaledAdd = qIdx * m_quant.m_DistStepAdd - scaledOrg * m_quant.m_DistOrgFact;
1326
1327
6.42M
    PQData  pqData[4];
1328
1329
6.42M
    PQData& pq_a = pqData[( qIdx + 0 ) & 3];
1330
6.42M
    PQData& pq_b = pqData[( qIdx + 1 ) & 3];
1331
6.42M
    PQData& pq_c = pqData[( qIdx + 2 ) & 3];
1332
6.42M
    PQData& pq_d = pqData[( qIdx + 3 ) & 3];
1333
1334
6.42M
    pq_a.deltaDist = ( ( scaledAdd + 0 * m_quant.m_DistStepAdd ) * ( qIdx + 0 ) + m_quant.m_DistAdd ) >> m_quant.m_DistShift;
1335
6.42M
    pq_a.absLevel = ( qIdx + 1 ) >> 1;
1336
1337
6.42M
    pq_b.deltaDist = ( ( scaledAdd + 1 * m_quant.m_DistStepAdd ) * ( qIdx + 1 ) + m_quant.m_DistAdd ) >> m_quant.m_DistShift;
1338
6.42M
    pq_b.absLevel = ( qIdx + 2 ) >> 1;
1339
1340
6.42M
    pq_c.deltaDist = ( ( scaledAdd + 2 * m_quant.m_DistStepAdd ) * ( qIdx + 2 ) + m_quant.m_DistAdd ) >> m_quant.m_DistShift;
1341
6.42M
    pq_c.absLevel = ( qIdx + 3 ) >> 1;
1342
1343
6.42M
    pq_d.deltaDist = ( ( scaledAdd + 3 * m_quant.m_DistStepAdd ) * ( qIdx + 3 ) + m_quant.m_DistAdd ) >> m_quant.m_DistShift;
1344
6.42M
    pq_d.absLevel = ( qIdx + 4 ) >> 1;
1345
    /// stop inline prequant
1346
1347
6.42M
    bool cff02ge4 = pqData[0].absLevel >= 4/* || pqData[2].absLevel >= 4 */;
1348
6.42M
    bool cff13ge4 = /* pqData[1].absLevel >= 4 || */ pqData[3].absLevel >= 4;
1349
1350
6.42M
    if( cff02ge4 || cff13ge4 || prev.anyRemRegBinsLt4 )
1351
5.35M
    {
1352
5.35M
      if( prev.anyRemRegBinsLt4 || cff02ge4 )
1353
5.11M
      {
1354
5.11M
        setRiceParam( 0, scanInfo, prev, cff02ge4 );
1355
5.11M
        setRiceParam( 1, scanInfo, prev, cff02ge4 );
1356
5.11M
      }
1357
1358
5.35M
      if( prev.anyRemRegBinsLt4 || cff13ge4 )
1359
5.35M
      {
1360
5.35M
        setRiceParam( 2, scanInfo, prev, cff13ge4 );
1361
5.35M
        setRiceParam( 3, scanInfo, prev, cff13ge4 );
1362
5.35M
      }
1363
1364
5.35M
      checkRdCosts( 0, scanInfo.spt, pqData[0], pqData[2], decisions, 0, 2, prev );
1365
5.35M
      checkRdCosts( 1, scanInfo.spt, pqData[0], pqData[2], decisions, 2, 0, prev );
1366
5.35M
      checkRdCosts( 2, scanInfo.spt, pqData[3], pqData[1], decisions, 1, 3, prev );
1367
5.35M
      checkRdCosts( 3, scanInfo.spt, pqData[3], pqData[1], decisions, 3, 1, prev );
1368
5.35M
    }
1369
1.07M
    else
1370
1.07M
    {
1371
      // has to be called as a first check, assumes no decision has been made yet
1372
1.07M
      m_checkAllRdCosts( scanInfo.spt, pqData, decisions, prev );
1373
1.07M
    }
1374
1375
6.42M
    checkRdCostStart( lastOffset, pqData[0], decisions, 0, prev );
1376
6.42M
    checkRdCostStart( lastOffset, pqData[2], decisions, 2, prev );
1377
6.42M
  }
1378
1379
7.65M
  if( scanInfo.spt == SCAN_EOCSBB )
1380
30.0k
  {
1381
30.0k
    checkRdCostSkipSbb( 0, decisions, 0, skip );
1382
30.0k
    checkRdCostSkipSbb( 1, decisions, 1, skip );
1383
30.0k
    checkRdCostSkipSbb( 2, decisions, 2, skip );
1384
30.0k
    checkRdCostSkipSbb( 3, decisions, 3, skip );
1385
30.0k
  }
1386
7.65M
}
1387
1388
void DepQuant::xDecideAndUpdate( const TCoeff absCoeff, const DQIntern::ScanInfo& scanInfo, bool zeroOut, int quantCoeff )
1389
7.65M
{
1390
7.65M
  using namespace DQIntern;
1391
1392
7.65M
  Decisions* decisions = &m_trellis[scanInfo.scanIdx][0];
1393
1394
7.65M
  xDecide( scanInfo, absCoeff, lastOffset( scanInfo.scanIdx ), *decisions, zeroOut, quantCoeff );
1395
1396
7.65M
  if( scanInfo.scanIdx )
1397
6.85M
  {
1398
6.85M
    if( scanInfo.spt == SCAN_SOCSBB )
1399
26.6k
    {
1400
26.6k
      memcpy( &m_state_skip, &m_state_curr, DQIntern::StateMemSkipCpySize );
1401
26.6k
    }
1402
1403
6.85M
    if( scanInfo.insidePos == 0 )
1404
31.8k
    {
1405
31.8k
      m_commonCtx.swap();
1406
31.8k
      m_updateStatesEOS( scanInfo, *decisions, m_state_skip, m_state_curr, m_commonCtx );
1407
31.8k
      ::memcpy( decisions + 1, decisions, sizeof( Decisions ) );
1408
31.8k
    }
1409
6.82M
    else if( !zeroOut )
1410
6.82M
    {
1411
6.82M
      m_updateStates( scanInfo, *decisions, m_state_curr );
1412
6.82M
    }
1413
6.85M
  }
1414
7.65M
}
1415
1416
void DepQuant::xDequantDQ( const TransformUnit& tu,  CoeffBuf& recCoeff, const ComponentID compID, const QpParam& cQP, bool enableScalingLists, int* piDequantCoef )
1417
787k
{
1418
787k
  m_quant.dequantBlock( tu, compID, cQP, recCoeff, enableScalingLists, piDequantCoef );
1419
787k
}
1420
1421
19.4k
DepQuant::DepQuant( const Quant* other, bool enc, bool useScalingLists, bool enableOpt ) : QuantRDOQ2( other, useScalingLists ), RateEstimator(), m_commonCtx()
1422
19.4k
{
1423
19.4k
  const DepQuant* dq = dynamic_cast<const DepQuant*>( other );
1424
19.4k
  CHECK( other && !dq, "The DepQuant cast must be successfull!" );
1425
1426
19.4k
  if( !dq )
1427
19.4k
  {
1428
19.4k
    m_scansRom = std::make_shared<DQIntern::Rom>();
1429
19.4k
    m_scansRom->init();
1430
19.4k
  }
1431
0
  else
1432
0
  {
1433
0
    m_scansRom = dq->m_scansRom;
1434
0
  }
1435
1436
79.7M
  for( int t = 0; t < ( MAX_TB_SIZEY * MAX_TB_SIZEY ); t++ )
1437
79.6M
  {
1438
79.6M
    memcpy( m_trellis[t], startDec, sizeof( startDec ) );
1439
79.6M
  }
1440
1441
19.4k
  m_checkAllRdCosts     = DQIntern::checkAllRdCosts;
1442
19.4k
  m_checkAllRdCostsOdd1 = DQIntern::checkAllRdCostsOdd1;
1443
19.4k
  m_updateStatesEOS     = DQIntern::updateStatesEOS;
1444
19.4k
  m_updateStates        = DQIntern::updateStates;
1445
19.4k
  m_findFirstPos        = DQIntern::findFirstPos;
1446
1447
19.4k
  if( enableOpt )
1448
19.4k
  {
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.4k
  }
1456
19.4k
}
1457
1458
DepQuant::~DepQuant()
1459
19.4k
{
1460
19.4k
}
1461
1462
void DepQuant::quant( TransformUnit& tu, const ComponentID compID, const CCoeffBuf& pSrc, TCoeff& uiAbsSum, const QpParam& cQP, const Ctx& ctx )
1463
2.01M
{
1464
2.01M
  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
2.01M
  else if( tu.cs->slice->depQuantEnabled && tu.mtsIdx[compID] != MTS_SKIP )
1470
1.91M
  {
1471
    //===== scaling matrix ====
1472
1.91M
    const int         qpDQ            = cQP.Qp(tu.mtsIdx[compID]==MTS_SKIP) + 1;
1473
1.91M
    const int         qpPer           = qpDQ / 6;
1474
1.91M
    const int         qpRem           = qpDQ - 6 * qpPer;
1475
1.91M
    const CompArea    &rect           = tu.blocks[compID];
1476
1.91M
    const int         width           = rect.width;
1477
1.91M
    const int         height          = rect.height;
1478
1.91M
    uint32_t          scalingListType = getScalingListType(tu.cu->predMode, compID);
1479
1.91M
    CHECK(scalingListType >= SCALING_LIST_NUM, "Invalid scaling list");
1480
1.91M
    const uint32_t    log2TrWidth     = Log2(width);
1481
1.91M
    const uint32_t    log2TrHeight    = Log2(height);
1482
1.91M
    const bool isLfnstApplied         = tu.cu->lfnstIdx > 0 && (CU::isSepTree(*tu.cu) ? true : isLuma(compID));
1483
1.91M
    const bool enableScalingLists     = getUseScalingList(width, height, (tu.mtsIdx[compID] == MTS_SKIP), isLfnstApplied);
1484
1.91M
    xQuantDQ( tu, pSrc, compID, cQP, Quant::m_dLambda, ctx, uiAbsSum, enableScalingLists, Quant::getQuantCoeff(scalingListType, qpRem, log2TrWidth, log2TrHeight) );
1485
1.91M
  }
1486
104k
  else
1487
104k
  {
1488
104k
    QuantRDOQ2::quant( tu, compID, pSrc, uiAbsSum, cQP, ctx );
1489
104k
  }
1490
2.01M
}
1491
1492
void DepQuant::dequant( const TransformUnit& tu, CoeffBuf& dstCoeff, const ComponentID compID, const QpParam& cQP )
1493
836k
{
1494
836k
  if( tu.cs->slice->depQuantEnabled && (tu.mtsIdx[compID] != MTS_SKIP) )
1495
787k
  {
1496
787k
    const int         qpDQ            = cQP.Qp(tu.mtsIdx[compID]==MTS_SKIP) + 1;
1497
787k
    const int         qpPer           = qpDQ / 6;
1498
787k
    const int         qpRem           = qpDQ - 6 * qpPer;
1499
787k
    const CompArea    &rect           = tu.blocks[compID];
1500
787k
    const int         width           = rect.width;
1501
787k
    const int         height          = rect.height;
1502
787k
    uint32_t          scalingListType = getScalingListType(tu.cu->predMode, compID);
1503
787k
    CHECK(scalingListType >= SCALING_LIST_NUM, "Invalid scaling list");
1504
787k
    const uint32_t    log2TrWidth    = Log2(width);
1505
787k
    const uint32_t    log2TrHeight   = Log2(height);
1506
787k
    const bool isLfnstApplied        = tu.cu->lfnstIdx > 0 && (CU::isSepTree(*tu.cu) ? true : isLuma(compID));
1507
787k
    const bool enableScalingLists    = getUseScalingList(width, height, (tu.mtsIdx[compID] == MTS_SKIP), isLfnstApplied);
1508
787k
    xDequantDQ( tu, dstCoeff, compID, cQP, enableScalingLists, Quant::getDequantCoeff(scalingListType, qpRem, log2TrWidth, log2TrHeight) );
1509
787k
  }
1510
49.3k
  else
1511
49.3k
  {
1512
49.3k
    QuantRDOQ::dequant( tu, dstCoeff, compID, cQP );
1513
49.3k
  }
1514
836k
}
1515
1516
void DepQuant::init( int rdoq, bool useRDOQTS, int thrVal )
1517
19.4k
{
1518
19.4k
  QuantRDOQ2::init( rdoq, useRDOQTS, thrVal );
1519
19.4k
  m_quant.init( thrVal );
1520
19.4k
}
1521
1522
} // namespace vvenc
1523
1524
//! \}
1525