Coverage Report

Created: 2026-10-28 06:18

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