Coverage Report

Created: 2026-07-30 06:27

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