Coverage Report

Created: 2026-09-01 06:57

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