Coverage Report

Created: 2026-06-10 07:00

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
11.6M
{
64
11.6M
  const uint32_t csx = getComponentScaleX(compID, chromaFormat);
65
11.6M
  const uint32_t csy = getComponentScaleY(compID, chromaFormat);
66
67
11.6M
  x      >>= csx;
68
11.6M
  y      >>= csy;
69
11.6M
  width  >>= csx;
70
11.6M
  height >>= csy;
71
11.6M
}
72
73
Position CompArea::chromaPos() const
74
52.1k
{
75
52.1k
  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
52.1k
  else
83
52.1k
  {
84
52.1k
    return *this;
85
52.1k
  }
86
52.1k
}
87
88
Size CompArea::lumaSize() const
89
2.65M
{
90
2.65M
  if( isChroma( compID ) )
91
2.12M
  {
92
2.12M
    uint32_t scaleX = getComponentScaleX( compID, chromaFormat );
93
2.12M
    uint32_t scaleY = getComponentScaleY( compID, chromaFormat );
94
95
2.12M
    return Size( width << scaleX, height << scaleY );
96
2.12M
  }
97
538k
  else
98
538k
  {
99
538k
    return *this;
100
538k
  }
101
2.65M
}
102
103
Size CompArea::chromaSize() const
104
104k
{
105
104k
  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
104k
  else
113
104k
  {
114
104k
    return *this;
115
104k
  }
116
104k
}
117
118
Position CompArea::lumaPos() const
119
1.23M
{
120
1.23M
  if( isChroma( compID ) )
121
978k
  {
122
978k
    uint32_t scaleX = getComponentScaleX( compID, chromaFormat );
123
978k
    uint32_t scaleY = getComponentScaleY( compID, chromaFormat );
124
125
978k
    return Position( x << scaleX, y << scaleY );
126
978k
  }
127
256k
  else
128
256k
  {
129
256k
    return *this;
130
256k
  }
131
1.23M
}
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
789k
UnitArea::UnitArea(const ChromaFormat _chromaFormat) : chromaFormat(_chromaFormat) { }
148
149
4.35M
UnitArea::UnitArea(const ChromaFormat _chromaFormat, const Area& _area) : chromaFormat(_chromaFormat), blocks(getNumberValidComponents(_chromaFormat))
150
4.35M
{
151
4.35M
  const uint32_t numCh = getNumberValidComponents(chromaFormat);
152
153
15.9M
  for (uint32_t i = 0; i < numCh; i++)
154
11.5M
  {
155
11.5M
    new (&blocks[i]) CompArea(ComponentID(i), chromaFormat, _area, true);
156
11.5M
  }
157
4.35M
}
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
498k
{
169
498k
  bool ret = true;
170
498k
  bool any = false;
171
172
498k
  for( const auto &blk : other.blocks )
173
1.49M
  {
174
1.49M
    if( blk.valid() && blocks[blk.compID].valid() )
175
1.23M
    {
176
1.23M
      ret &= blocks[blk.compID].contains( blk );
177
1.23M
      any = true;
178
1.23M
    }
179
1.49M
  }
180
181
498k
  return any && ret;
182
498k
}
183
184
bool UnitArea::contains( const UnitArea& other, const ChannelType chType ) const
185
52.1k
{
186
52.1k
  bool ret = true;
187
52.1k
  bool any = false;
188
189
52.1k
  for( const auto &blk : other.blocks )
190
156k
  {
191
156k
    if( toChannelType( blk.compID ) == chType && blk.valid() && blocks[blk.compID].valid() )
192
104k
    {
193
104k
      ret &= blocks[blk.compID].contains( blk );
194
104k
      any = true;
195
104k
    }
196
156k
  }
197
198
52.1k
  return any && ret;
199
52.1k
}
200
201
void UnitArea::repositionTo(const UnitArea& unitArea)
202
633k
{
203
2.53M
  for(uint32_t i = 0; i < blocks.size(); i++)
204
1.90M
  {
205
1.90M
    blocks[i].repositionTo(unitArea.blocks[i]);
206
1.90M
  }
207
633k
}
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
568k
{
230
568k
  UnitArea ret(chromaFormat);
231
232
568k
  for (const auto &blk : blocks)
233
1.70M
  {
234
1.70M
    if (toChannelType(blk.compID) == chType)
235
781k
    {
236
781k
      ret.blocks.push_back(blk);
237
781k
    }
238
923k
    else
239
923k
    {
240
923k
      ret.blocks.push_back(CompArea());
241
923k
    }
242
1.70M
  }
243
244
568k
  return ret;
245
568k
}
246
247
// ---------------------------------------------------------------------------
248
// coding unit method definitions
249
// ---------------------------------------------------------------------------
250
251
23.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
142k
{
256
142k
  slice             = other.slice;
257
142k
  predMode          = other.predMode;
258
142k
  qtDepth           = other.qtDepth;
259
142k
  depth             = other.depth;
260
142k
  btDepth           = other.btDepth;
261
142k
  mtDepth           = other.mtDepth;
262
142k
  splitSeries       = other.splitSeries;
263
142k
  skip              = other.skip;
264
142k
  mmvdSkip          = other.mmvdSkip;
265
142k
  affine            = other.affine;
266
142k
  affineType        = other.affineType;
267
142k
  colorTransform    = other.colorTransform;
268
142k
  geo               = other.geo;
269
142k
  geo               = other.geo;
270
142k
  bdpcmM[CH_L]      = other.bdpcmM[CH_L];
271
142k
  bdpcmM[CH_C]      = other.bdpcmM[CH_C];
272
142k
  qp                = other.qp;
273
142k
  chromaQpAdj       = other.chromaQpAdj;
274
142k
  rootCbf           = other.rootCbf;
275
142k
  sbtInfo           = other.sbtInfo;
276
142k
  mtsFlag           = other.mtsFlag;
277
142k
  lfnstIdx          = other.lfnstIdx;
278
142k
  tileIdx           = other.tileIdx;
279
142k
  imv               = other.imv;
280
142k
  imvNumCand        = other.imvNumCand;
281
142k
  BcwIdx            = other.BcwIdx;
282
283
142k
  smvdMode          = other.smvdMode;
284
142k
  ispMode           = other.ispMode;
285
142k
  mipFlag           = other.mipFlag;
286
287
142k
  treeType          = other.treeType;
288
142k
  modeType          = other.modeType;
289
142k
  modeTypeSeries    = other.modeTypeSeries;
290
291
142k
  const IntraPredictionData& ipd = other;
292
142k
  *this = ipd;
293
294
142k
  const InterPredictionData& tpd = other;
295
142k
  *this = tpd;
296
142k
  return *this;
297
142k
}
298
299
void CodingUnit::initData()
300
287k
{
301
287k
  predMode          = NUMBER_OF_PREDICTION_MODES;
302
287k
  qtDepth           = 0;
303
287k
  depth             = 0;
304
287k
  btDepth           = 0;
305
287k
  mtDepth           = 0;
306
287k
  splitSeries       = 0;
307
287k
  skip              = false;
308
287k
  mmvdSkip          = false;
309
287k
  affine            = false;
310
287k
  affineType        = 0;
311
287k
  colorTransform    = false;
312
287k
  geo               = false;
313
287k
  bdpcmM[CH_L]      = 0;
314
287k
  bdpcmM[CH_C]      = 0;
315
287k
  qp                = 0;
316
287k
  chromaQpAdj       = 0;
317
287k
  rootCbf           = true;
318
287k
  sbtInfo           = 0;
319
287k
  mtsFlag           = 0;
320
287k
  lfnstIdx          = 0;
321
287k
  tileIdx           = 0;
322
287k
  imv               = IMV_OFF;
323
287k
  imvNumCand        = 0;
324
287k
  BcwIdx            = BCW_DEFAULT;
325
287k
  smvdMode          = 0;
326
287k
  ispMode           = 0;
327
287k
  mipFlag           = false;
328
329
287k
  treeType          = TREE_D;
330
287k
  modeType          = MODE_TYPE_ALL;
331
287k
  modeTypeSeries    = 0;
332
287k
  mcControl         = 0;
333
287k
}
334
335
336
337
338
// ---------------------------------------------------------------------------
339
// prediction unit method definitions
340
// ---------------------------------------------------------------------------
341
342
void CodingUnit::initPuData()
343
167k
{
344
  // intra data - need this default initialization for PCM
345
167k
  intraDir[0]       = DC_IDX;
346
167k
  intraDir[1]       = PLANAR_IDX;
347
167k
  multiRefIdx       = 0;
348
167k
  mipTransposedFlag = false;
349
350
  // inter data
351
167k
  mergeFlag         = false;
352
167k
  ciip              = false;
353
167k
  mvRefine          = false;
354
167k
  mmvdMergeFlag     = false;
355
167k
  mergeIdx          = MAX_UCHAR;
356
167k
  geoSplitDir       = MAX_UCHAR;
357
167k
  geoMergeIdx       = { MAX_SCHAR, MAX_SCHAR };
358
359
167k
  mcControl         = 0;
360
361
167k
  interDir          = MAX_UCHAR;
362
167k
  mmvdMergeIdx.val  = MmvdIdx::INVALID;
363
167k
  mergeType         = MRG_TYPE_DEFAULT_N;
364
365
167k
  if( mvdL0SubPu )
366
67.8k
  {
367
67.8k
    int maxDmvrMvds = std::max<int>( 1, lwidth() >> DMVR_SUBCU_SIZE_LOG2 ) * std::max<int>( 1, lheight() >> DMVR_SUBCU_SIZE_LOG2 );
368
401k
    for (uint32_t i = 0; i < maxDmvrMvds; i++)
369
333k
    {
370
333k
      mvdL0SubPu[i].setZero();
371
333k
    }
372
67.8k
  }
373
374
503k
  for (uint32_t i = 0; i < NUM_REF_PIC_LIST_01; i++)
375
335k
  {
376
335k
    mvpIdx[i] = MAX_UCHAR;
377
335k
    mvpNum[i] = MAX_UCHAR;
378
335k
    refIdx[i] = -1;
379
1.34M
    for( uint32_t j = 0; j < 3; j++ )
380
1.00M
    {
381
1.00M
      mvd[i][j].setZero();
382
1.00M
      mv [i][j].setZero();
383
1.00M
    }
384
335k
  }
385
167k
}
386
387
CodingUnit& CodingUnit::operator=( const IntraPredictionData& other )
388
142k
{
389
428k
  for( uint32_t i = 0; i < MAX_NUM_CH; i++ )
390
285k
  {
391
285k
    intraDir[ i ] = other.intraDir[ i ];
392
285k
  }
393
142k
  mipTransposedFlag = other.mipTransposedFlag;
394
142k
  multiRefIdx       = other.multiRefIdx;
395
142k
  return *this;
396
142k
}
397
398
CodingUnit& CodingUnit::operator=( const InterPredictionData& other )
399
142k
{
400
142k
  mergeFlag         = other.mergeFlag;
401
142k
  mergeIdx          = other.mergeIdx;
402
142k
  geoSplitDir       = other.geoSplitDir;
403
142k
  geoMergeIdx       = other.geoMergeIdx;
404
142k
  mmvdMergeFlag     = other.mmvdMergeFlag;
405
142k
  mmvdMergeIdx      = other.mmvdMergeIdx;
406
142k
  interDir          = other.interDir;
407
142k
  mergeType         = other.mergeType;
408
142k
  mvRefine          = other.mvRefine;
409
410
142k
  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
428k
  for (uint32_t i = 0; i < NUM_REF_PIC_LIST_01; i++)
418
285k
  {
419
285k
    mvpIdx[i]   = other.mvpIdx[i];
420
285k
    mvpNum[i]   = other.mvpNum[i];
421
285k
    refIdx[i]   = other.refIdx[i];
422
1.14M
    for( uint32_t j = 0; j < 3; j++ )
423
856k
    {
424
856k
      mvd[i][j] = other.mvd[i][j];
425
856k
      mv [i][j] = other.mv [i][j];
426
856k
    }
427
285k
  }
428
142k
  ciip = other.ciip;
429
142k
  return *this;
430
142k
}
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
20.6k
{
458
20.6k
  return cs->getMotionBuf( *this );
459
20.6k
}
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
889k
{
493
3.55M
  for( unsigned i = 0; i < MAX_NUM_TBLOCKS; i++ )
494
2.66M
  {
495
2.66M
    cbf[i]      = 0;
496
2.66M
    mtsIdx[i]   = MTS_DCT2_DCT2;
497
2.66M
    lastPos[i]  = 0;
498
2.66M
  }
499
889k
  depth       = 0;
500
889k
  noResidual  = false;
501
889k
  jointCbCr   = 0;
502
889k
  chromaAdj   = 0;
503
889k
}
504
505
void TransformUnit::init(TCoeffSig** coeffs)
506
475k
{
507
475k
  uint32_t numBlocks = getNumberValidComponents( chromaFormat );
508
509
1.90M
  for (uint32_t i = 0; i < numBlocks; i++)
510
1.42M
  {
511
1.42M
    m_coeffs[i] = coeffs[i];
512
1.42M
  }
513
475k
}
514
515
TransformUnit& TransformUnit::operator=( const TransformUnit& other )
516
36.2k
{
517
36.2k
  CHECK( chromaFormat != other.chromaFormat, "Incompatible formats" );
518
519
36.2k
  unsigned numBlocks = getNumberValidTBlocks(*cs->pcv);
520
144k
  for( unsigned i = 0; i < numBlocks; i++ )
521
108k
  {
522
108k
    CHECKD( blocks[i].area() != other.blocks[i].area(), "Transformation units cover different areas" );
523
524
108k
    cbf[i]      = other.cbf[i];
525
108k
    bool cpyRsi = other.cbf[i] || ( i && other.jointCbCr && numBlocks > 1 && ( TU::getCbf( other, COMP_Cb ) || TU::getCbf( other, COMP_Cr ) ) );
526
108k
    if( m_coeffs[i] && other.m_coeffs[i] && m_coeffs[i] != other.m_coeffs[i] && cpyRsi )
527
3.54k
    {
528
3.54k
      uint32_t area = blocks[i].area();
529
3.54k
      memcpy( m_coeffs[i], other.m_coeffs[i], sizeof( TCoeffSig ) * area );
530
3.54k
    }
531
108k
    mtsIdx[i]   = other.mtsIdx[i];
532
108k
    lastPos[i]  = other.lastPos[i];
533
108k
  }
534
36.2k
  depth         = other.depth;
535
36.2k
  noResidual    = other.noResidual;
536
36.2k
  jointCbCr     = other.jointCbCr;
537
36.2k
  return *this;
538
36.2k
}
539
540
void TransformUnit::copyComponentFrom( const TransformUnit& other, const ComponentID i )
541
3.22M
{
542
3.22M
  CHECK( chromaFormat != other.chromaFormat, "Incompatible formats" );
543
3.22M
  CHECKD( blocks[i].area() != other.blocks[i].area(), "Transformation units cover different areas" );
544
545
3.22M
  bool cpyRsi = other.cbf[i] || ( i && other.jointCbCr && blocks.size() > 1 && ( TU::getCbf( other, COMP_Cb ) || TU::getCbf( other, COMP_Cr ) ) );
546
3.22M
  if( m_coeffs[i] && other.m_coeffs[i] && m_coeffs[i] != other.m_coeffs[i] && cpyRsi )
547
1.22M
  {
548
1.22M
    uint32_t area = blocks[i].area();
549
1.22M
    memcpy( m_coeffs[i], other.m_coeffs[i], sizeof( TCoeffSig ) * area );
550
1.22M
  }
551
552
3.22M
  cbf[i]      = other.cbf[i];
553
554
3.22M
  depth       = other.depth;
555
3.22M
  mtsIdx[i]   = other.mtsIdx[i];
556
3.22M
  noResidual  = other.noResidual;
557
3.22M
  jointCbCr   = isChroma( i ) ? other.jointCbCr : jointCbCr;
558
3.22M
  lastPos[i]  = other.lastPos[i];
559
3.22M
}
560
561
void TransformUnit::checkTuNoResidual( unsigned idx )
562
20.6k
{
563
20.6k
  if( CU::getSbtIdx( cu->sbtInfo ) == SBT_OFF_DCT )
564
20.6k
  {
565
20.6k
    return;
566
20.6k
  }
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
809k
{
576
809k
  int tbArea = blocks[compID].width * blocks[compID].height;
577
809k
  int tbZeroOutWidth = blocks[compID].width;
578
809k
  int tbZeroOutHeight = blocks[compID].height;
579
580
809k
  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
809k
  tbZeroOutWidth = std::min<int>(JVET_C0024_ZERO_OUT_TH, tbZeroOutWidth);
586
809k
  tbZeroOutHeight = std::min<int>(JVET_C0024_ZERO_OUT_TH, tbZeroOutHeight);
587
809k
  tbArea = tbZeroOutWidth * tbZeroOutHeight;
588
809k
  return tbArea;
589
809k
}
590
591
} // namespace vvenc
592
593
//! \}
594