Coverage Report

Created: 2026-09-14 06:44

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/work/vvenc/source/Lib/CommonLib/Unit.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
44
/** \file     Unit.cpp
45
 *  \brief    defines unit as a set of blocks and basic unit types (coding, prediction, transform)
46
 */
47
48
#include "Unit.h"
49
#include "Picture.h"
50
#include "UnitTools.h"
51
#include "UnitPartitioner.h"
52
53
//! \ingroup CommonLib
54
//! \{
55
56
namespace vvenc {
57
58
 // ---------------------------------------------------------------------------
59
 // block method definitions
60
 // ---------------------------------------------------------------------------
61
62
void CompArea::xRecalcLumaToChroma()
63
12.5M
{
64
12.5M
  const uint32_t csx = getComponentScaleX(compID, chromaFormat);
65
12.5M
  const uint32_t csy = getComponentScaleY(compID, chromaFormat);
66
67
12.5M
  x      >>= csx;
68
12.5M
  y      >>= csy;
69
12.5M
  width  >>= csx;
70
12.5M
  height >>= csy;
71
12.5M
}
72
73
Position CompArea::chromaPos() const
74
56.6k
{
75
56.6k
  if (isLuma(compID))
76
0
  {
77
0
    uint32_t scaleX = getComponentScaleX(compID, chromaFormat);
78
0
    uint32_t scaleY = getComponentScaleY(compID, chromaFormat);
79
80
0
    return Position(x >> scaleX, y >> scaleY);
81
0
  }
82
56.6k
  else
83
56.6k
  {
84
56.6k
    return *this;
85
56.6k
  }
86
56.6k
}
87
88
Size CompArea::lumaSize() const
89
2.88M
{
90
2.88M
  if( isChroma( compID ) )
91
2.30M
  {
92
2.30M
    uint32_t scaleX = getComponentScaleX( compID, chromaFormat );
93
2.30M
    uint32_t scaleY = getComponentScaleY( compID, chromaFormat );
94
95
2.30M
    return Size( width << scaleX, height << scaleY );
96
2.30M
  }
97
585k
  else
98
585k
  {
99
585k
    return *this;
100
585k
  }
101
2.88M
}
102
103
Size CompArea::chromaSize() const
104
113k
{
105
113k
  if( isLuma( compID ) )
106
0
  {
107
0
    uint32_t scaleX = getComponentScaleX( compID, chromaFormat );
108
0
    uint32_t scaleY = getComponentScaleY( compID, chromaFormat );
109
110
0
    return Size( width >> scaleX, height >> scaleY );
111
0
  }
112
113k
  else
113
113k
  {
114
113k
    return *this;
115
113k
  }
116
113k
}
117
118
Position CompArea::lumaPos() const
119
1.34M
{
120
1.34M
  if( isChroma( compID ) )
121
1.06M
  {
122
1.06M
    uint32_t scaleX = getComponentScaleX( compID, chromaFormat );
123
1.06M
    uint32_t scaleY = getComponentScaleY( compID, chromaFormat );
124
125
1.06M
    return Position( x << scaleX, y << scaleY );
126
1.06M
  }
127
278k
  else
128
278k
  {
129
278k
    return *this;
130
278k
  }
131
1.34M
}
132
133
Position CompArea::compPos( const ComponentID compID ) const
134
0
{
135
0
  return isLuma( compID ) ? lumaPos() : chromaPos();
136
0
}
137
138
Position CompArea::chanPos( const ChannelType chType ) const
139
0
{
140
0
  return isLuma( chType ) ? lumaPos() : chromaPos();
141
0
}
142
143
// ---------------------------------------------------------------------------
144
// unit method definitions
145
// ---------------------------------------------------------------------------
146
147
858k
UnitArea::UnitArea(const ChromaFormat _chromaFormat) : chromaFormat(_chromaFormat) { }
148
149
4.69M
UnitArea::UnitArea(const ChromaFormat _chromaFormat, const Area& _area) : chromaFormat(_chromaFormat), blocks(getNumberValidComponents(_chromaFormat))
150
4.69M
{
151
4.69M
  const uint32_t numCh = getNumberValidComponents(chromaFormat);
152
153
17.1M
  for (uint32_t i = 0; i < numCh; i++)
154
12.4M
  {
155
12.4M
    new (&blocks[i]) CompArea(ComponentID(i), chromaFormat, _area, true);
156
12.4M
  }
157
4.69M
}
158
159
0
UnitArea::UnitArea(const ChromaFormat _chromaFormat, const CompArea&  blkY) : chromaFormat(_chromaFormat), blocks { blkY } {}
160
161
0
UnitArea::UnitArea(const ChromaFormat _chromaFormat,       CompArea&& blkY) : chromaFormat(_chromaFormat), blocks { std::forward<CompArea>(blkY) } {}
162
163
0
UnitArea::UnitArea(const ChromaFormat _chromaFormat, const CompArea&  blkY, const CompArea& blkCb, const CompArea& blkCr)  : chromaFormat(_chromaFormat), blocks { blkY, blkCb, blkCr } {}
164
165
0
UnitArea::UnitArea(const ChromaFormat _chromaFormat,       CompArea&& blkY,      CompArea&& blkCb,      CompArea&& blkCr) : chromaFormat(_chromaFormat), blocks { std::forward<CompArea>(blkY), std::forward<CompArea>(blkCb), std::forward<CompArea>(blkCr) } {}
166
167
bool UnitArea::contains(const UnitArea& other) const
168
541k
{
169
541k
  bool ret = true;
170
541k
  bool any = false;
171
172
541k
  for( const auto &blk : other.blocks )
173
1.62M
  {
174
1.62M
    if( blk.valid() && blocks[blk.compID].valid() )
175
1.34M
    {
176
1.34M
      ret &= blocks[blk.compID].contains( blk );
177
1.34M
      any = true;
178
1.34M
    }
179
1.62M
  }
180
181
541k
  return any && ret;
182
541k
}
183
184
bool UnitArea::contains( const UnitArea& other, const ChannelType chType ) const
185
56.6k
{
186
56.6k
  bool ret = true;
187
56.6k
  bool any = false;
188
189
56.6k
  for( const auto &blk : other.blocks )
190
169k
  {
191
169k
    if( toChannelType( blk.compID ) == chType && blk.valid() && blocks[blk.compID].valid() )
192
113k
    {
193
113k
      ret &= blocks[blk.compID].contains( blk );
194
113k
      any = true;
195
113k
    }
196
169k
  }
197
198
56.6k
  return any && ret;
199
56.6k
}
200
201
void UnitArea::repositionTo(const UnitArea& unitArea)
202
686k
{
203
2.74M
  for(uint32_t i = 0; i < blocks.size(); i++)
204
2.05M
  {
205
2.05M
    blocks[i].repositionTo(unitArea.blocks[i]);
206
2.05M
  }
207
686k
}
208
209
const UnitArea UnitArea::singleComp(const ComponentID compID) const
210
0
{
211
0
  UnitArea ret(chromaFormat);
212
213
0
  for (const auto &blk : blocks)
214
0
  {
215
0
    if (blk.compID == compID)
216
0
    {
217
0
      ret.blocks.push_back(blk);
218
0
    }
219
0
    else
220
0
    {
221
0
      ret.blocks.push_back(CompArea());
222
0
    }
223
0
  }
224
225
0
  return ret;
226
0
}
227
228
const UnitArea UnitArea::singleChan(const ChannelType chType) const
229
617k
{
230
617k
  UnitArea ret(chromaFormat);
231
232
617k
  for (const auto &blk : blocks)
233
1.85M
  {
234
1.85M
    if (toChannelType(blk.compID) == chType)
235
848k
    {
236
848k
      ret.blocks.push_back(blk);
237
848k
    }
238
1.00M
    else
239
1.00M
    {
240
1.00M
      ret.blocks.push_back(CompArea());
241
1.00M
    }
242
1.85M
  }
243
244
617k
  return ret;
245
617k
}
246
247
// ---------------------------------------------------------------------------
248
// coding unit method definitions
249
// ---------------------------------------------------------------------------
250
251
25.1k
CodingUnit::CodingUnit(const UnitArea& unit)                                : UnitArea(unit),                 cs(nullptr), slice(nullptr), chType( CH_L ), next(nullptr), firstTU(nullptr), lastTU(nullptr) { initData(); initPuData(); }
252
0
CodingUnit::CodingUnit(const ChromaFormat _chromaFormat, const Area& _area) : UnitArea(_chromaFormat, _area), cs(nullptr), slice(nullptr), chType( CH_L ), next(nullptr), firstTU(nullptr), lastTU(nullptr) { initData(); initPuData(); }
253
254
CodingUnit& CodingUnit::operator=( const CodingUnit& other )
255
154k
{
256
154k
  slice             = other.slice;
257
154k
  predMode          = other.predMode;
258
154k
  qtDepth           = other.qtDepth;
259
154k
  depth             = other.depth;
260
154k
  btDepth           = other.btDepth;
261
154k
  mtDepth           = other.mtDepth;
262
154k
  splitSeries       = other.splitSeries;
263
154k
  skip              = other.skip;
264
154k
  mmvdSkip          = other.mmvdSkip;
265
154k
  affine            = other.affine;
266
154k
  affineType        = other.affineType;
267
154k
  colorTransform    = other.colorTransform;
268
154k
  geo               = other.geo;
269
154k
  geo               = other.geo;
270
154k
  bdpcmM[CH_L]      = other.bdpcmM[CH_L];
271
154k
  bdpcmM[CH_C]      = other.bdpcmM[CH_C];
272
154k
  qp                = other.qp;
273
154k
  chromaQpAdj       = other.chromaQpAdj;
274
154k
  rootCbf           = other.rootCbf;
275
154k
  sbtInfo           = other.sbtInfo;
276
154k
  mtsFlag           = other.mtsFlag;
277
154k
  lfnstIdx          = other.lfnstIdx;
278
154k
  tileIdx           = other.tileIdx;
279
154k
  imv               = other.imv;
280
154k
  imvNumCand        = other.imvNumCand;
281
154k
  BcwIdx            = other.BcwIdx;
282
283
154k
  smvdMode          = other.smvdMode;
284
154k
  ispMode           = other.ispMode;
285
154k
  mipFlag           = other.mipFlag;
286
287
154k
  treeType          = other.treeType;
288
154k
  modeType          = other.modeType;
289
154k
  modeTypeSeries    = other.modeTypeSeries;
290
291
154k
  const IntraPredictionData& ipd = other;
292
154k
  *this = ipd;
293
294
154k
  const InterPredictionData& tpd = other;
295
154k
  *this = tpd;
296
154k
  return *this;
297
154k
}
298
299
void CodingUnit::initData()
300
312k
{
301
312k
  predMode          = NUMBER_OF_PREDICTION_MODES;
302
312k
  qtDepth           = 0;
303
312k
  depth             = 0;
304
312k
  btDepth           = 0;
305
312k
  mtDepth           = 0;
306
312k
  splitSeries       = 0;
307
312k
  skip              = false;
308
312k
  mmvdSkip          = false;
309
312k
  affine            = false;
310
312k
  affineType        = 0;
311
312k
  colorTransform    = false;
312
312k
  geo               = false;
313
312k
  bdpcmM[CH_L]      = 0;
314
312k
  bdpcmM[CH_C]      = 0;
315
312k
  qp                = 0;
316
312k
  chromaQpAdj       = 0;
317
312k
  rootCbf           = true;
318
312k
  sbtInfo           = 0;
319
312k
  mtsFlag           = 0;
320
312k
  lfnstIdx          = 0;
321
312k
  tileIdx           = 0;
322
312k
  imv               = IMV_OFF;
323
312k
  imvNumCand        = 0;
324
312k
  BcwIdx            = BCW_DEFAULT;
325
312k
  smvdMode          = 0;
326
312k
  ispMode           = 0;
327
312k
  mipFlag           = false;
328
329
312k
  treeType          = TREE_D;
330
312k
  modeType          = MODE_TYPE_ALL;
331
312k
  modeTypeSeries    = 0;
332
312k
  mcControl         = 0;
333
312k
}
334
335
336
337
338
// ---------------------------------------------------------------------------
339
// prediction unit method definitions
340
// ---------------------------------------------------------------------------
341
342
void CodingUnit::initPuData()
343
182k
{
344
  // intra data - need this default initialization for PCM
345
182k
  intraDir[0]       = DC_IDX;
346
182k
  intraDir[1]       = PLANAR_IDX;
347
182k
  multiRefIdx       = 0;
348
182k
  mipTransposedFlag = false;
349
350
  // inter data
351
182k
  mergeFlag         = false;
352
182k
  ciip              = false;
353
182k
  mvRefine          = false;
354
182k
  mmvdMergeFlag     = false;
355
182k
  mergeIdx          = MAX_UCHAR;
356
182k
  geoSplitDir       = MAX_UCHAR;
357
182k
  geoMergeIdx       = { MAX_SCHAR, MAX_SCHAR };
358
359
182k
  mcControl         = 0;
360
361
182k
  interDir          = MAX_UCHAR;
362
182k
  mmvdMergeIdx.val  = MmvdIdx::INVALID;
363
182k
  mergeType         = MRG_TYPE_DEFAULT_N;
364
365
182k
  if( mvdL0SubPu )
366
73.9k
  {
367
73.9k
    int maxDmvrMvds = std::max<int>( 1, lwidth() >> DMVR_SUBCU_SIZE_LOG2 ) * std::max<int>( 1, lheight() >> DMVR_SUBCU_SIZE_LOG2 );
368
444k
    for (uint32_t i = 0; i < maxDmvrMvds; i++)
369
370k
    {
370
370k
      mvdL0SubPu[i].setZero();
371
370k
    }
372
73.9k
  }
373
374
546k
  for (uint32_t i = 0; i < NUM_REF_PIC_LIST_01; i++)
375
364k
  {
376
364k
    mvpIdx[i] = MAX_UCHAR;
377
364k
    mvpNum[i] = MAX_UCHAR;
378
364k
    refIdx[i] = -1;
379
1.45M
    for( uint32_t j = 0; j < 3; j++ )
380
1.09M
    {
381
1.09M
      mvd[i][j].setZero();
382
1.09M
      mv [i][j].setZero();
383
1.09M
    }
384
364k
  }
385
182k
}
386
387
CodingUnit& CodingUnit::operator=( const IntraPredictionData& other )
388
154k
{
389
464k
  for( uint32_t i = 0; i < MAX_NUM_CH; i++ )
390
309k
  {
391
309k
    intraDir[ i ] = other.intraDir[ i ];
392
309k
  }
393
154k
  mipTransposedFlag = other.mipTransposedFlag;
394
154k
  multiRefIdx       = other.multiRefIdx;
395
154k
  return *this;
396
154k
}
397
398
CodingUnit& CodingUnit::operator=( const InterPredictionData& other )
399
154k
{
400
154k
  mergeFlag         = other.mergeFlag;
401
154k
  mergeIdx          = other.mergeIdx;
402
154k
  geoSplitDir       = other.geoSplitDir;
403
154k
  geoMergeIdx       = other.geoMergeIdx;
404
154k
  mmvdMergeFlag     = other.mmvdMergeFlag;
405
154k
  mmvdMergeIdx      = other.mmvdMergeIdx;
406
154k
  interDir          = other.interDir;
407
154k
  mergeType         = other.mergeType;
408
154k
  mvRefine          = other.mvRefine;
409
410
154k
  if( other.mergeFlag && mvdL0SubPu )
411
0
  {
412
0
    const int maxDmvrMvds = std::max<int>( 1, lwidth() >> DMVR_SUBCU_SIZE_LOG2 ) * std::max<int>( 1, lheight() >> DMVR_SUBCU_SIZE_LOG2 );
413
414
0
    memcpy( mvdL0SubPu, other.mvdL0SubPu, sizeof( Mv ) * maxDmvrMvds );
415
0
  }
416
417
464k
  for (uint32_t i = 0; i < NUM_REF_PIC_LIST_01; i++)
418
309k
  {
419
309k
    mvpIdx[i]   = other.mvpIdx[i];
420
309k
    mvpNum[i]   = other.mvpNum[i];
421
309k
    refIdx[i]   = other.refIdx[i];
422
1.23M
    for( uint32_t j = 0; j < 3; j++ )
423
929k
    {
424
929k
      mvd[i][j] = other.mvd[i][j];
425
929k
      mv [i][j] = other.mv [i][j];
426
929k
    }
427
309k
  }
428
154k
  ciip = other.ciip;
429
154k
  return *this;
430
154k
}
431
432
CodingUnit& CodingUnit::operator=( const MotionInfo& mi )
433
0
{
434
0
  interDir = mi.interDir();
435
436
0
  for( uint32_t i = 0; i < NUM_REF_PIC_LIST_01; i++ )
437
0
  {
438
0
    refIdx[i] = mi.miRefIdx[i];
439
0
    mv [i][0] = mi.mv[i];
440
0
  }
441
442
0
  return *this;
443
0
}
444
445
const MotionInfo& CodingUnit::getMotionInfo() const
446
0
{
447
0
  return cs->getMotionInfo( lumaPos() );
448
0
}
449
450
const MotionInfo& CodingUnit::getMotionInfo( const Position& pos ) const
451
0
{
452
0
  CHECKD( !Y().contains( pos ), "Trying to access motion info outsied of PU" );
453
0
  return cs->getMotionInfo( pos );
454
0
}
455
456
MotionBuf CodingUnit::getMotionBuf()
457
22.4k
{
458
22.4k
  return cs->getMotionBuf( *this );
459
22.4k
}
460
461
CMotionBuf CodingUnit::getMotionBuf() const
462
0
{
463
0
  return cs->getMotionBuf( *this );
464
0
}
465
466
467
// ---------------------------------------------------------------------------
468
// transform unit method definitions
469
// ---------------------------------------------------------------------------
470
471
0
TransformUnit::TransformUnit(const UnitArea& unit) : UnitArea(unit), cu(nullptr), cs(nullptr), chType( CH_L ), next( nullptr )
472
0
{
473
0
  for( unsigned i = 0; i < MAX_NUM_TBLOCKS; i++ )
474
0
  {
475
0
    m_coeffs[i] = nullptr;
476
0
  }
477
478
0
  initData();
479
0
}
480
481
0
TransformUnit::TransformUnit(const ChromaFormat _chromaFormat, const Area& _area) : UnitArea(_chromaFormat, _area), cu(nullptr), cs(nullptr), chType( CH_L ), next( nullptr )
482
0
{
483
0
  for( unsigned i = 0; i < MAX_NUM_TBLOCKS; i++ )
484
0
  {
485
0
    m_coeffs[i] = nullptr;
486
0
  }
487
488
0
  initData();
489
0
}
490
491
void TransformUnit::initData()
492
964k
{
493
3.85M
  for( unsigned i = 0; i < MAX_NUM_TBLOCKS; i++ )
494
2.89M
  {
495
2.89M
    cbf[i]      = 0;
496
2.89M
    mtsIdx[i]   = MTS_DCT2_DCT2;
497
2.89M
    lastPos[i]  = 0;
498
2.89M
  }
499
964k
  depth       = 0;
500
964k
  noResidual  = false;
501
964k
  jointCbCr   = 0;
502
964k
  chromaAdj   = 0;
503
964k
}
504
505
void TransformUnit::init(TCoeffSig** coeffs)
506
515k
{
507
515k
  uint32_t numBlocks = getNumberValidComponents( chromaFormat );
508
509
2.06M
  for (uint32_t i = 0; i < numBlocks; i++)
510
1.54M
  {
511
1.54M
    m_coeffs[i] = coeffs[i];
512
1.54M
  }
513
515k
}
514
515
TransformUnit& TransformUnit::operator=( const TransformUnit& other )
516
39.6k
{
517
39.6k
  CHECK( chromaFormat != other.chromaFormat, "Incompatible formats" );
518
519
39.6k
  unsigned numBlocks = getNumberValidTBlocks(*cs->pcv);
520
158k
  for( unsigned i = 0; i < numBlocks; i++ )
521
119k
  {
522
119k
    CHECKD( blocks[i].area() != other.blocks[i].area(), "Transformation units cover different areas" );
523
524
119k
    cbf[i]      = other.cbf[i];
525
119k
    bool cpyRsi = other.cbf[i] || ( i && other.jointCbCr && numBlocks > 1 && ( TU::getCbf( other, COMP_Cb ) || TU::getCbf( other, COMP_Cr ) ) );
526
119k
    if( m_coeffs[i] && other.m_coeffs[i] && m_coeffs[i] != other.m_coeffs[i] && cpyRsi )
527
3.80k
    {
528
3.80k
      uint32_t area = blocks[i].area();
529
3.80k
      memcpy( m_coeffs[i], other.m_coeffs[i], sizeof( TCoeffSig ) * area );
530
3.80k
    }
531
119k
    mtsIdx[i]   = other.mtsIdx[i];
532
119k
    lastPos[i]  = other.lastPos[i];
533
119k
  }
534
39.6k
  depth         = other.depth;
535
39.6k
  noResidual    = other.noResidual;
536
39.6k
  jointCbCr     = other.jointCbCr;
537
39.6k
  return *this;
538
39.6k
}
539
540
void TransformUnit::copyComponentFrom( const TransformUnit& other, const ComponentID i )
541
3.49M
{
542
3.49M
  CHECK( chromaFormat != other.chromaFormat, "Incompatible formats" );
543
3.49M
  CHECKD( blocks[i].area() != other.blocks[i].area(), "Transformation units cover different areas" );
544
545
3.49M
  bool cpyRsi = other.cbf[i] || ( i && other.jointCbCr && blocks.size() > 1 && ( TU::getCbf( other, COMP_Cb ) || TU::getCbf( other, COMP_Cr ) ) );
546
3.49M
  if( m_coeffs[i] && other.m_coeffs[i] && m_coeffs[i] != other.m_coeffs[i] && cpyRsi )
547
1.32M
  {
548
1.32M
    uint32_t area = blocks[i].area();
549
1.32M
    memcpy( m_coeffs[i], other.m_coeffs[i], sizeof( TCoeffSig ) * area );
550
1.32M
  }
551
552
3.49M
  cbf[i]      = other.cbf[i];
553
554
3.49M
  depth       = other.depth;
555
3.49M
  mtsIdx[i]   = other.mtsIdx[i];
556
3.49M
  noResidual  = other.noResidual;
557
3.49M
  jointCbCr   = isChroma( i ) ? other.jointCbCr : jointCbCr;
558
3.49M
  lastPos[i]  = other.lastPos[i];
559
3.49M
}
560
561
void TransformUnit::checkTuNoResidual( unsigned idx )
562
22.4k
{
563
22.4k
  if( CU::getSbtIdx( cu->sbtInfo ) == SBT_OFF_DCT )
564
22.4k
  {
565
22.4k
    return;
566
22.4k
  }
567
568
0
  if( ( CU::getSbtPos( cu->sbtInfo ) == SBT_POS0 && idx == 1 ) || ( CU::getSbtPos( cu->sbtInfo ) == SBT_POS1 && idx == 0 ) )
569
0
  {
570
0
    noResidual = true;
571
0
  }
572
0
}
573
574
int TransformUnit::getTbAreaAfterCoefZeroOut(ComponentID compID) const
575
875k
{
576
875k
  int tbArea = blocks[compID].width * blocks[compID].height;
577
875k
  int tbZeroOutWidth = blocks[compID].width;
578
875k
  int tbZeroOutHeight = blocks[compID].height;
579
580
875k
  if (cs->sps->MTS && cu->sbtInfo != 0 && blocks[compID].width <= 32 && blocks[compID].height <= 32 && compID == COMP_Y)
581
0
  {
582
0
    tbZeroOutWidth = (blocks[compID].width == 32) ? 16 : tbZeroOutWidth;
583
0
    tbZeroOutHeight = (blocks[compID].height == 32) ? 16 : tbZeroOutHeight;
584
0
  }
585
875k
  tbZeroOutWidth = std::min<int>(JVET_C0024_ZERO_OUT_TH, tbZeroOutWidth);
586
875k
  tbZeroOutHeight = std::min<int>(JVET_C0024_ZERO_OUT_TH, tbZeroOutHeight);
587
875k
  tbArea = tbZeroOutWidth * tbZeroOutHeight;
588
875k
  return tbArea;
589
875k
}
590
591
} // namespace vvenc
592
593
//! \}
594