Skip to content

Commit

Permalink
IFP and RC harmonization, fixes for ARM, early GCC 11 (#350)
Browse files Browse the repository at this point in the history
  • Loading branch information
adamjw24 authored Feb 8, 2024
1 parent 513a4e9 commit ac10055
Show file tree
Hide file tree
Showing 39 changed files with 462 additions and 280 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/Build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,6 @@ jobs:
run: |
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release -A "${{ matrix.config.msvc_arch }}"
cmake .. -DCMAKE_BUILD_TYPE=Release -DVVENC_OVERRIDE_COMPILER_CHECK=ON -A "${{ matrix.config.msvc_arch }}"
cmake --build . --config Release
shell: cmd
2 changes: 2 additions & 0 deletions .gitlab-ci-internal.yml
Original file line number Diff line number Diff line change
Expand Up @@ -214,13 +214,15 @@ test_vc193x_Win32:
extends: .build_test_msvc_template
variables:
MSVC_ARCH: Win32
CONFIG_OPTIONS: "-DVVENC_OVERRIDE_COMPILER_CHECK=1"
tags:
- vc193x

test_vc193x:
extends: .build_test_msvc_template
variables:
MSVC_ARCH: x64
CONFIG_OPTIONS: "-DVVENC_OVERRIDE_COMPILER_CHECK=1"
tags:
- vc193x

Expand Down
29 changes: 25 additions & 4 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,31 @@ if( ( "${CMAKE_SYSTEM_PROCESSOR}" MATCHES "aarch64\|arm"
endif()

# we enable x86 intrinsics for all target architectures, because they are implemented through simd-everywhere on non-x86
set( VVENC_ENABLE_X86_SIMD TRUE CACHE BOOL "enable x86 intrinsics" )
set( VVENC_ENABLE_X86_SIMD TRUE CACHE BOOL "enable x86 intrinsics" )
set( VVENC_ENABLE_ARM_SIMD ${VVENC_ARM_SIMD_DEFAULT} CACHE BOOL "enable ARM intrinsics" )

include( vvencCompilerSupport )
check_problematic_compiler( VVENC_PROBLEMATIC_COMPILER "MSVC" 19.38 "" )

if( VVENC_PROBLEMATIC_COMPILER )
set( VVENC_OVERRIDE_COMPILER_CHECK OFF CACHE BOOL "Build with known problematic compiler version" )

if( VVENC_OVERRIDE_COMPILER_CHECK )
set( VVENC_PROBLEMATIC_COMPILER_MSG_TYPE WARNING )
set( VVENC_PROBLEMATIC_COMPILER_MSG_OVERRIDE
"The performance will not be optimal due to workarounds." )
else()
set( VVENC_PROBLEMATIC_COMPILER_MSG_TYPE FATAL_ERROR )
set( VVENC_PROBLEMATIC_COMPILER_MSG_OVERRIDE
"Set -DVVENC_OVERRIDE_COMPILER_CHECK=ON to build with this compiler anyways, which enables workarounds impacting performance.")
endif()

message( ${VVENC_PROBLEMATIC_COMPILER_MSG_TYPE}
"Binaries compiled with ${CMAKE_CXX_COMPILER} version ${CMAKE_CXX_COMPILER_VERSION} are known not to behave as intended. "
"The problematic version range is ${VVENC_PROBLEMATIC_COMPILER_VERSION_RANGE}. Please consider using a different compiler.\n"
${VVENC_PROBLEMATIC_COMPILER_MSG_OVERRIDE} )

endif()

# enable sse4.1 build for all source files for gcc and clang
if( VVENC_ENABLE_X86_SIMD )
Expand Down Expand Up @@ -81,14 +102,14 @@ endif()
# enable install target
set( VVENC_ENABLE_INSTALL ON CACHE BOOL "Enable or disable install target" )

# enable postfix
# enable postfix
set( VVENC_ENABLE_BUILD_TYPE_POSTFIX OFF CACHE BOOL "Enable or disable build type postfix for apps and libs" )

set( VVENC_ENABLE_LINK_TIME_OPT ON CACHE BOOL "Enable link time optimization for release and profile builds" )

set( VVENC_ENABLE_THIRDPARTY_JSON ON CACHE BOOL "Enable use of thirdparty json library" )

set( VVENC_INSTALL_FULLFEATURE_APP OFF CACHE BOOL "Install the full-feature app: vvencFFapp" )
set( VVENC_INSTALL_FULLFEATURE_APP OFF CACHE BOOL "Install the full-feature app: vvencFFapp" )

if( CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR
CMAKE_CXX_COMPILER_ID STREQUAL "Clang" )
Expand Down Expand Up @@ -300,7 +321,7 @@ if( VVENC_ENABLE_INSTALL )

set( CMAKE_INSTALL_RPATH ${RPATH_BASE} ${RPATH_BASE}/${RPATH_REL_DIR} )
message( STATUS "CMAKE_INSTALL_RPATH=${CMAKE_INSTALL_RPATH}" )
endif()
endif()
endif()


Expand Down
4 changes: 4 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,10 @@ ifneq ($(install-ffapp),)
CONFIG_OPTIONS += -DVVENC_INSTALL_FULLFEATURE_APP=$(install-ffapp)
endif

ifneq ($(override-compiler-check),)
CONFIG_OPTIONS += -DVVENC_OVERRIDE_COMPILER_CHECK=$(override-compiler-check)
endif

ifeq ($(j),)
# Query cmake for the number of cores
NUM_JOBS := $(shell cmake -P cmake/modules/vvencNumCores.cmake)
Expand Down
18 changes: 18 additions & 0 deletions cmake/modules/vvencCompilerSupport.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -83,3 +83,21 @@ function( _emscripten_enable_wasm_simd128 )
set( CMAKE_REQUIRED_FLAGS -msimd128 PARENT_SCOPE )
endif()
endfunction()

function( check_problematic_compiler output_var compiler_id first_bad_version first_fixed_version )
if( CMAKE_CXX_COMPILER_ID STREQUAL "${compiler_id}"
AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL "${first_bad_version}"
AND (
NOT "${first_fixed_version}"
OR CMAKE_CXX_COMPILER_VERSION VERSION_LESS "${first_fixed_version}" ) )

set( ${output_var} TRUE PARENT_SCOPE )

if( "${first_fixed_version}" )
set( ${output_var}_VERSION_RANGE "(${first_bad_version}...${first_fixed_version}]" PARENT_SCOPE )
else()
set( ${output_var}_VERSION_RANGE "(${first_bad_version}...)" PARENT_SCOPE )
endif()

endif()
endfunction()
14 changes: 10 additions & 4 deletions include/vvenc/vvencCfg.h
Original file line number Diff line number Diff line change
Expand Up @@ -430,7 +430,7 @@ typedef struct vvenc_config
int m_framesToBeEncoded; // number of encoded frames (default: 0, all)
int m_inputBitDepth[ 2 ]; // bit-depth of input pictures (2d array for luma,chroma)

int m_numThreads; // number of worker threads ( if <0: <720p 4threads, else 8threads (limited to available cores))
int m_numThreads; // number of worker threads ( if <0: <720p 4threads, <5K 2880p 8threads, else 12threads (limited to available cores))

int m_QP; // QP value of key-picture (0-63, default: 32)
int m_RCTargetBitrate; // target bitrate in bps (default: 0 (RC disabled))
Expand Down Expand Up @@ -761,7 +761,7 @@ typedef struct vvenc_config
bool m_picReordering;
bool m_reservedFlag;
bool m_poc0idr;
int8_t m_fppLinesSynchro;
int8_t m_ifpLines;
bool m_blockImportanceMapping;
bool m_saoScc;
bool m_addGOP32refPics;
Expand All @@ -774,8 +774,14 @@ typedef struct vvenc_config
// if negative, the absolute value is interpreted as a 4-bit fixed point multiplier of the target bitrate).
// -24, i.e. -1.1000 binary, means the maxrate would be set to be the 1.5x of the target bitrate.
// for convenience use VVENC_SET_MAXRATE_FACTOR, e.g. VVENC_SET_MAXRATE_FACTOR(1.5), to set the multiplier
int m_forceScc;
double m_reservedDouble[9];
int8_t m_forceScc;
bool m_ifp;

int8_t m_reservedInt8[2];

int m_minIntraDist;
int m_reservedInt;
double m_reservedDouble[8];

// internal state variables
bool m_configDone; // state variable, Private context used for internal data ( do not change )
Expand Down
2 changes: 0 additions & 2 deletions source/Lib/CommonLib/CommonDef.h
Original file line number Diff line number Diff line change
Expand Up @@ -501,8 +501,6 @@ static constexpr uint8_t MAX_TMP_BUFS = 6;

static constexpr int QPA_MAX_NOISE_LEVELS = 8;

static constexpr int FPPLS_ALF_DERIVE_LINES = 1; ///< number of CTU lines for ALF filter derivation
static constexpr int FPPLS_CCALF_DERIVE_LINES = 1; ///< number of CTU lines for CCALF filter derivation


// ====================================================================================================================
Expand Down
6 changes: 3 additions & 3 deletions source/Lib/CommonLib/DepQuant.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1436,7 +1436,7 @@ void DepQuant::quant( TransformUnit& tu, const ComponentID compID, const CCoeffB
const uint32_t log2TrHeight = Log2(height);
const bool isLfnstApplied = tu.cu->lfnstIdx > 0 && (CU::isSepTree(*tu.cu) ? true : isLuma(compID));
const bool enableScalingLists = getUseScalingList(width, height, (tu.mtsIdx[compID] == MTS_SKIP), isLfnstApplied);
static_cast<DQIntern::DepQuant*>(p)->quant( tu, pSrc, compID, cQP, Quant::m_dLambda, ctx, uiAbsSum, enableScalingLists, Quant::getQuantCoeff(scalingListType, qpRem, log2TrWidth, log2TrHeight) );
p->quant( tu, pSrc, compID, cQP, Quant::m_dLambda, ctx, uiAbsSum, enableScalingLists, Quant::getQuantCoeff(scalingListType, qpRem, log2TrWidth, log2TrHeight) );
}
else
{
Expand All @@ -1460,7 +1460,7 @@ void DepQuant::dequant( const TransformUnit& tu, CoeffBuf& dstCoeff, const Compo
const uint32_t log2TrHeight = Log2(height);
const bool isLfnstApplied = tu.cu->lfnstIdx > 0 && (CU::isSepTree(*tu.cu) ? true : isLuma(compID));
const bool enableScalingLists = getUseScalingList(width, height, (tu.mtsIdx[compID] == MTS_SKIP), isLfnstApplied);
static_cast<DQIntern::DepQuant*>(p)->dequant( tu, dstCoeff, compID, cQP, enableScalingLists, Quant::getDequantCoeff(scalingListType, qpRem, log2TrWidth, log2TrHeight) );
p->dequant( tu, dstCoeff, compID, cQP, enableScalingLists, Quant::getDequantCoeff(scalingListType, qpRem, log2TrWidth, log2TrHeight) );
}
else
{
Expand All @@ -1472,7 +1472,7 @@ void DepQuant::init( int rdoq, bool useRDOQTS, int thrVal )
{
QuantRDOQ2::init( rdoq, useRDOQTS, thrVal );

static_cast<DQIntern::DepQuant*>(p)->init( thrVal );
p->init( thrVal );
}

} // namespace vvenc
Expand Down
4 changes: 2 additions & 2 deletions source/Lib/CommonLib/DepQuant.h
Original file line number Diff line number Diff line change
Expand Up @@ -241,8 +241,8 @@ class DepQuantImpl
public:
virtual ~DepQuantImpl() {}
virtual void quant ( TransformUnit& tu, const CCoeffBuf& srcCoeff, const ComponentID compID, const QpParam& cQP, const double lambda, const Ctx& ctx, TCoeff& absSum, bool enableScalingLists, int* quantCoeff ) = 0;
virtual void dequant ( const TransformUnit& tu, CoeffBuf& recCoeff, const ComponentID compID, const QpParam& cQP, bool enableScalingLists, int* quantCoeff );
virtual void init ( int dqTrVal );
void dequant ( const TransformUnit& tu, CoeffBuf& recCoeff, const ComponentID compID, const QpParam& cQP, bool enableScalingLists, int* quantCoeff );
void init ( int dqTrVal );

protected:
DQIntern::Quantizer m_quant;
Expand Down
16 changes: 8 additions & 8 deletions source/Lib/CommonLib/InterPrediction.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -246,7 +246,7 @@ void InterPrediction::destroy()
m_IBCBuffer.destroy();
}

void InterPrediction::init( RdCost* pcRdCost, ChromaFormat chFormat, const int ctuSize, const int fppLinesSynchro )
void InterPrediction::init( RdCost* pcRdCost, ChromaFormat chFormat, const int ctuSize, const int ifpLines )
{
// if it has been initialised before, but the chroma format has changed, release the memory and start again.
if( m_yuvPred[L0].getOrigin( COMP_Y ) != nullptr && m_currChromaFormat != chFormat )
Expand Down Expand Up @@ -279,7 +279,7 @@ void InterPrediction::init( RdCost* pcRdCost, ChromaFormat chFormat, const int c
m_IBCBufferWidth = g_IBCBufferSize / ctuSize;
m_IBCBuffer.create(UnitArea(chFormat, Area(0, 0, m_IBCBufferWidth, ctuSize)));
}
InterPredInterpolation::m_fppLinesSynchro = fppLinesSynchro;
InterPredInterpolation::m_ifpLines = ifpLines;
}

// ====================================================================================================================
Expand Down Expand Up @@ -615,7 +615,7 @@ InterPredInterpolation::InterPredInterpolation()
, m_skipPROF(false)
, m_encOnly(false)
, m_isBi(false)
, m_fppLinesSynchro(0)
, m_ifpLines(0)
{

}
Expand Down Expand Up @@ -727,7 +727,7 @@ void InterPredInterpolation::xPredInterBlk ( const ComponentID compID, const Cod

bool wrapRef = false;
Mv mv(_mv);
CHECKD( m_fppLinesSynchro && !srcPadBuf && !CU::isMvInRangeFPP( cu[compID].y, cu[compID].height, mv.ver, m_fppLinesSynchro, *cu.cs->pcv, getComponentScaleY(compID, chFmt) ), "xPredInterBlk: CTU line-wise FPP MV restriction failed!\n" );
CHECKD( m_ifpLines && !srcPadBuf && cu.cs->picture != refPic && !CU::isMvInRangeFPP( cu[compID].y, cu[compID].height, mv.ver, m_ifpLines, *cu.cs->pcv, getComponentScaleY(compID, chFmt) ), "xPredInterBlk: CTU line-wise FPP MV restriction failed!\n" );
if( !isIBC && cu.cs->pcv->wrapArround )
{
wrapRef = wrapClipMv( mv, cu.blocks[0].pos(), cu.blocks[0].size(), *cu.cs);
Expand Down Expand Up @@ -1796,7 +1796,7 @@ void InterPredInterpolation::xPredAffineBlk(const ComponentID compID, const Codi
iMvScaleTmpVer = curMv.ver;
}

CHECKD( m_fppLinesSynchro && !CU::isMvInRangeFPP( puY + h, blockHeight, iMvScaleTmpVer, m_fppLinesSynchro, *pps.pcv, iScaleY ), "xPredAffineBlk: FPP MV restriction failed!\n" );
CHECKD( m_ifpLines && !CU::isMvInRangeFPP( puY + h, blockHeight, iMvScaleTmpVer, m_ifpLines, *pps.pcv, iScaleY ), "xPredAffineBlk: FPP MV restriction failed!\n" );
// get the MV in high precision
int xFrac, yFrac, xInt, yInt;

Expand Down Expand Up @@ -1896,10 +1896,10 @@ void InterPredInterpolation::xPredAffineBlk(const ComponentID compID, const Codi

}

bool InterPredInterpolation::xIsAffineMvInRangeFPP( const CodingUnit &cu, const Mv* _mv, const int fppLinesSynchro, const int mvPrecShift )
bool InterPredInterpolation::xIsAffineMvInRangeFPP( const CodingUnit &cu, const Mv* _mv, const int ifpLines, const int mvPrecShift )
{
const PreCalcValues& pcv = *cu.cs->pcv;
if( cu.ly() >= ( ( pcv.heightInCtus - 1 - fppLinesSynchro ) << pcv.maxCUSizeLog2 ) )
if( cu.ly() >= ( ( pcv.heightInCtus - 1 - ifpLines ) << pcv.maxCUSizeLog2 ) )
return true;

const ChromaFormat chFmt = cu.chromaFormat;
Expand Down Expand Up @@ -1941,7 +1941,7 @@ bool InterPredInterpolation::xIsAffineMvInRangeFPP( const CodingUnit &cu, const
}
const bool subblkMVSpreadOverLimit = InterPrediction::isSubblockVectorSpreadOverLimit(iDMvHorX, iDMvHorY, iDMvVerX, iDMvVerY, cu.interDir);

const int yRefMax = ( ( ( cu.ly() >> pcv.maxCUSizeLog2 ) + fppLinesSynchro + 1 ) << pcv.maxCUSizeLog2 ) - 1;
const int yRefMax = ( ( ( cu.ly() >> pcv.maxCUSizeLog2 ) + ifpLines + 1 ) << pcv.maxCUSizeLog2 ) - 1;
const int dctifMarginVerBot = 4;

auto roundMvVal = [&](int mvVal, int shift)
Expand Down
6 changes: 3 additions & 3 deletions source/Lib/CommonLib/InterPrediction.h
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ class InterPredInterpolation
InterpolationFilter m_if;
Pel* m_filteredBlock [LUMA_INTERPOLATION_FILTER_SUB_SAMPLE_POSITIONS_SIGNAL][LUMA_INTERPOLATION_FILTER_SUB_SAMPLE_POSITIONS_SIGNAL][MAX_NUM_COMP];
Pel* m_filteredBlockTmp [LUMA_INTERPOLATION_FILTER_SUB_SAMPLE_POSITIONS_SIGNAL][MAX_NUM_COMP];
int m_fppLinesSynchro;
int m_ifpLines;

int xRightShiftMSB ( int numer, int denom );
void xApplyBDOF ( PelBuf& yuvDst, const ClpRng& clpRng );
Expand Down Expand Up @@ -122,7 +122,7 @@ class InterPredInterpolation
PelUnitBuf &predDst, PelUnitBuf &predSrc0, PelUnitBuf &predSrc1);

static bool isSubblockVectorSpreadOverLimit(int a, int b, int c, int d, int predType);
bool xIsAffineMvInRangeFPP (const CodingUnit& cu, const Mv* _mv, const int fppLinesSynchro, const int mvPrecShift = MV_FRACTIONAL_BITS_INTERNAL);
bool xIsAffineMvInRangeFPP (const CodingUnit& cu, const Mv* _mv, const int ifpLines, const int mvPrecShift = MV_FRACTIONAL_BITS_INTERNAL);
};

class DMVR : public InterPredInterpolation
Expand Down Expand Up @@ -171,7 +171,7 @@ class InterPrediction : public DMVR
InterPrediction();
virtual ~InterPrediction();

void init ( RdCost* pcRdCost, ChromaFormat chromaFormatIDC, const int ctuSize, const int fppLinesSynchro = 0 );
void init ( RdCost* pcRdCost, ChromaFormat chromaFormatIDC, const int ctuSize, const int ifpLines = 0 );
void destroy ();

// inter
Expand Down
5 changes: 5 additions & 0 deletions source/Lib/CommonLib/Picture.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,7 @@ Picture::Picture()
, isFinished ( false )
, isLongTerm ( false )
, isFlush ( false )
, isInProcessList ( false )
, precedingDRAP ( false )
, gopEntry ( nullptr )
, refCounter ( 0 )
Expand Down Expand Up @@ -226,6 +227,7 @@ void Picture::reset()
isFinished = false;
isLongTerm = false;
isFlush = false;
isInProcessList = false;
isMeanQPLimited = false;
precedingDRAP = false;

Expand All @@ -236,6 +238,9 @@ void Picture::reset()
gopAdaptedQP = 0;
actualHeadBits = 0;
actualTotalBits = 0;
encRCPic = nullptr;
picApsGlobal = nullptr;
refApsGlobal = nullptr;

std::fill_n( m_sharedBufs, (int)NUM_PIC_TYPES, nullptr );
std::fill_n( m_bufsOrigPrev, NUM_QPA_PREV_FRAMES, nullptr );
Expand Down
2 changes: 2 additions & 0 deletions source/Lib/CommonLib/Picture.h
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,7 @@ struct PicApsGlobal{
int poc;
unsigned tid;
bool initalized = false;
int refCnt = 0;
ParameterSetMap<APS> apsMap;
PicApsGlobal( int _p ) : poc(_p), tid(MAX_UINT), apsMap( MAX_NUM_APS * MAX_NUM_APS_TYPE ) {}
PicApsGlobal( int _p, unsigned _t ) : poc(_p), tid(_t), apsMap( MAX_NUM_APS * MAX_NUM_APS_TYPE ) {}
Expand Down Expand Up @@ -216,6 +217,7 @@ struct Picture : public UnitArea
bool isFinished;
bool isLongTerm;
bool isFlush;
bool isInProcessList;
bool precedingDRAP; // preceding a DRAP picture in decoding order

const GOPEntry* gopEntry;
Expand Down
19 changes: 18 additions & 1 deletion source/Lib/CommonLib/Slice.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -443,7 +443,7 @@ void Slice::updateRefPicCounter( int step )
}
}

bool Slice::checkRefPicsReconstructed() const
bool Slice::checkAllRefPicsReconstructed() const
{
for ( int refList = 0; refList < NUM_REF_PIC_LIST_01; refList++ )
{
Expand All @@ -460,6 +460,23 @@ bool Slice::checkRefPicsReconstructed() const
return true;
}

bool Slice::checkAllRefPicsAccessible() const
{
for ( int refList = 0; refList < NUM_REF_PIC_LIST_01; refList++ )
{
int numOfActiveRef = numRefIdx[ refList ];
for ( int i = 0; i < numOfActiveRef; i++ )
{
if ( ! refPicList[ refList ][ i ]->isInProcessList )
{
return false;
}
}
}

return true;
}

void Slice::checkColRefIdx(uint32_t curSliceSegmentIdx, const Picture* pic) const
{
Slice* curSlice = pic->slices[ curSliceSegmentIdx ];
Expand Down
3 changes: 2 additions & 1 deletion source/Lib/CommonLib/Slice.h
Original file line number Diff line number Diff line change
Expand Up @@ -1265,7 +1265,8 @@ class Slice
void resetSlicePart();
void constructRefPicList(const PicList& rcListPic, bool extBorder, const bool usingLongTerm = true);
void updateRefPicCounter( int step );
bool checkRefPicsReconstructed() const;
bool checkAllRefPicsAccessible() const;
bool checkAllRefPicsReconstructed() const;
void setRefPOCList();
void setSMVDParam();
void checkColRefIdx(uint32_t curSliceSegmentIdx, const Picture* pic) const;
Expand Down
1 change: 1 addition & 0 deletions source/Lib/CommonLib/TimeProfiler.h
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,7 @@ namespace vvenc {
E_( P_INTRA_CHROMA ) \
E_( P_INTRA ) \
E_( P_QUANT ) \
E_( P_DEQUANT ) \
E_( P_TRAFO ) \
E_( P_RESHAPER ) \
E_( P_DEBLOCK_FILTER ) \
Expand Down
2 changes: 1 addition & 1 deletion source/Lib/CommonLib/TrQuant.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -292,7 +292,7 @@ void TrQuant::xDeQuant(const TransformUnit& tu,
const ComponentID &compID,
const QpParam &cQP)
{
PROFILER_SCOPE_AND_STAGE( 1, _TPROF, P_QUANT );
PROFILER_SCOPE_AND_STAGE( 1, _TPROF, P_DEQUANT );
m_quant->dequant( tu, dstCoeff, compID, cQP );
}

Expand Down
Loading

0 comments on commit ac10055

Please sign in to comment.