Coverage Report

Created: 2026-05-30 06:10

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