[x265] [PATCH 3 of 4] add functions for Intra residual transform and quantization without rd
deepthidevaki at multicorewareinc.com
deepthidevaki at multicorewareinc.com
Tue Dec 10 13:14:25 CET 2013
# HG changeset patch
# User Deepthi Devaki <deepthidevaki at multicorewareinc.com>
# Date 1386677442 -19800
# Node ID f9ebf328eb5a319a9bf0e25313c6317e917a5aca
# Parent 4c81122118f571af5edebf470d189944faa7da22
add functions for Intra residual transform and quantization without rd
diff -r 4c81122118f5 -r f9ebf328eb5a source/Lib/TLibEncoder/TEncSearch.cpp
--- a/source/Lib/TLibEncoder/TEncSearch.cpp Tue Dec 10 17:40:00 2013 +0530
+++ b/source/Lib/TLibEncoder/TEncSearch.cpp Tue Dec 10 17:40:42 2013 +0530
@@ -983,6 +983,142 @@
rdCost += singleCost;
}
+void TEncSearch::residualTransformQuantIntra(TComDataCU* cu,
+ uint32_t trDepth,
+ uint32_t absPartIdx,
+ bool bLumaOnly,
+ TComYuv* fencYuv,
+ TComYuv* predYuv,
+ TShortYUV* resiYuv,
+ TComYuv* reconYuv)
+{
+ uint32_t fullDepth = cu->getDepth(0) + trDepth;
+ uint32_t trSizeLog2 = g_convertToBit[cu->getSlice()->getSPS()->getMaxCUWidth() >> fullDepth] + 2;
+ bool bCheckFull = (trSizeLog2 <= cu->getSlice()->getSPS()->getQuadtreeTULog2MaxSize());
+ bool bCheckSplit = (trSizeLog2 > cu->getQuadtreeTULog2MinSizeInCU(absPartIdx));
+
+ int maxTuSize = cu->getSlice()->getSPS()->getQuadtreeTULog2MaxSize();
+ int isIntraSlice = (cu->getSlice()->getSliceType() == I_SLICE);
+
+ // don't check split if TU size is less or equal to max TU size
+ bool noSplitIntraMaxTuSize = bCheckFull;
+
+ if (m_cfg->param.rdPenalty && !isIntraSlice)
+ {
+ // in addition don't check split if TU size is less or equal to 16x16 TU size for non-intra slice
+ noSplitIntraMaxTuSize = (trSizeLog2 <= X265_MIN(maxTuSize, 4));
+
+ // if maximum RD-penalty don't check TU size 32x32
+ if (m_cfg->param.rdPenalty == 2)
+ {
+ bCheckFull = (trSizeLog2 <= X265_MIN(maxTuSize, 4));
+ }
+ }
+ if (bCheckFull)
+ {
+ cu->setTransformSkipSubParts(0, TEXT_LUMA, absPartIdx, fullDepth);
+
+ //----- code luma block with given intra prediction mode and store Cbf-----
+ uint32_t lumaPredMode = cu->getLumaIntraDir(absPartIdx);
+ uint32_t fullDepth = cu->getDepth(0) + trDepth;
+ uint32_t width = cu->getWidth(0) >> trDepth;
+ uint32_t height = cu->getHeight(0) >> trDepth;
+ uint32_t stride = fencYuv->getStride();
+ Pel* fenc = fencYuv->getLumaAddr(absPartIdx);
+ Pel* pred = predYuv->getLumaAddr(absPartIdx);
+ int16_t* residual = resiYuv->getLumaAddr(absPartIdx);
+ Pel* recon = reconYuv->getLumaAddr(absPartIdx);
+
+ uint32_t trSizeLog2 = g_convertToBit[cu->getSlice()->getSPS()->getMaxCUWidth() >> fullDepth] + 2;
+ uint32_t qtLayer = cu->getSlice()->getSPS()->getQuadtreeTULog2MaxSize() - trSizeLog2;
+ uint32_t numCoeffPerInc = cu->getSlice()->getSPS()->getMaxCUWidth() * cu->getSlice()->getSPS()->getMaxCUHeight() >> (cu->getSlice()->getSPS()->getMaxCUDepth() << 1);
+ TCoeff* coeff = m_qtTempCoeffY[qtLayer] + numCoeffPerInc * absPartIdx;
+
+ int16_t* reconQt = m_qtTempTComYuv[qtLayer].getLumaAddr(absPartIdx);
+ assert(m_qtTempTComYuv[qtLayer].m_width == MAX_CU_SIZE);
+
+ uint32_t zorder = cu->getZorderIdxInCU() + absPartIdx;
+ Pel* reconIPred = cu->getPic()->getPicYuvRec()->getLumaAddr(cu->getAddr(), zorder);
+ uint32_t reconIPredStride = cu->getPic()->getPicYuvRec()->getStride();
+
+ bool useTransformSkip = cu->getTransformSkip(absPartIdx, TEXT_LUMA);
+
+ //===== init availability pattern =====
+
+ cu->getPattern()->initPattern(cu, trDepth, absPartIdx);
+ cu->getPattern()->initAdiPattern(cu, absPartIdx, trDepth, m_predBuf, m_predBufStride, m_predBufHeight, refAbove, refLeft, refAboveFlt, refLeftFlt);
+ //===== get prediction signal =====
+ predIntraLumaAng(lumaPredMode, pred, stride, width);
+
+ //===== get residual signal =====
+ assert(!((uint32_t)(size_t)fenc & (width - 1)));
+ assert(!((uint32_t)(size_t)pred & (width - 1)));
+ assert(!((uint32_t)(size_t)residual & (width - 1)));
+ primitives.calcresidual[(int)g_convertToBit[width]](fenc, pred, residual, stride);
+
+ //===== transform and quantization =====
+ uint32_t absSum = 0;
+ int lastPos = -1;
+ cu->setTrIdxSubParts(trDepth, absPartIdx, fullDepth);
+
+ m_trQuant->setQPforQuant(cu->getQP(0), TEXT_LUMA, cu->getSlice()->getSPS()->getQpBDOffsetY(), 0);
+ m_trQuant->selectLambda(TEXT_LUMA);
+ absSum = m_trQuant->transformNxN(cu, residual, stride, coeff, width, height, TEXT_LUMA, absPartIdx, &lastPos, useTransformSkip);
+
+ //--- set coded block flag ---
+ cu->setCbfSubParts((absSum ? 1 : 0) << trDepth, TEXT_LUMA, absPartIdx, fullDepth);
+
+ //--- inverse transform ---
+ int size = g_convertToBit[width];
+ if (absSum)
+ {
+ int scalingListType = 0 + g_eTTable[(int)TEXT_LUMA];
+ assert(scalingListType < 6);
+ m_trQuant->invtransformNxN(cu->getCUTransquantBypass(absPartIdx), cu->getLumaIntraDir(absPartIdx), residual, stride, coeff, width, height, scalingListType, useTransformSkip, lastPos);
+ }
+ else
+ {
+ int16_t* resiTmp = residual;
+ memset(coeff, 0, sizeof(TCoeff) * width * height);
+ primitives.blockfill_s[size](resiTmp, stride, 0);
+ }
+
+ //Generate Recon
+ assert(width <= 32);
+ primitives.calcrecon[size](pred, residual, recon, reconQt, reconIPred, stride, MAX_CU_SIZE, reconIPredStride);
+ }
+
+ if (bCheckSplit && !bCheckFull)
+ {
+ //----- code splitted block -----
+
+ uint32_t qPartsDiv = cu->getPic()->getNumPartInCU() >> ((fullDepth + 1) << 1);
+ uint32_t absPartIdxSub = absPartIdx;
+ uint32_t splitCbfY = 0;
+
+ for (uint32_t part = 0; part < 4; part++, absPartIdxSub += qPartsDiv)
+ {
+ residualTransformQuantIntra(cu, trDepth + 1, absPartIdxSub, bLumaOnly, fencYuv, predYuv, resiYuv, reconYuv);
+ splitCbfY |= cu->getCbf(absPartIdxSub, TEXT_LUMA, trDepth + 1);
+ }
+
+ for (uint32_t offs = 0; offs < 4 * qPartsDiv; offs++)
+ {
+ cu->getCbf(TEXT_LUMA)[absPartIdx + offs] |= (splitCbfY << trDepth);
+ }
+
+ return;
+ }
+
+ //Copy coeffs to cu
+ uint32_t qtlayer = cu->getSlice()->getSPS()->getQuadtreeTULog2MaxSize() - trSizeLog2;
+ uint32_t numCoeffY = (cu->getSlice()->getSPS()->getMaxCUWidth() * cu->getSlice()->getSPS()->getMaxCUHeight()) >> (fullDepth << 1);
+ uint32_t numCoeffIncY = (cu->getSlice()->getSPS()->getMaxCUWidth() * cu->getSlice()->getSPS()->getMaxCUHeight()) >> (cu->getSlice()->getSPS()->getMaxCUDepth() << 1);
+ TCoeff* coeffSrcY = m_qtTempCoeffY[qtlayer] + (numCoeffIncY * absPartIdx);
+ TCoeff* coeffDestY = cu->getCoeffY() + (numCoeffIncY * absPartIdx);
+ ::memcpy(coeffDestY, coeffSrcY, sizeof(TCoeff) * numCoeffY);
+}
+
void TEncSearch::xSetIntraResultQT(TComDataCU* cu, uint32_t trDepth, uint32_t absPartIdx, bool bLumaOnly, TComYuv* reconYuv)
{
uint32_t fullDepth = cu->getDepth(0) + trDepth;
@@ -1478,6 +1614,156 @@
}
}
+void TEncSearch::residualQTIntrachroma(TComDataCU* cu,
+ uint32_t trDepth,
+ uint32_t absPartIdx,
+ TComYuv* fencYuv,
+ TComYuv* predYuv,
+ TShortYUV* resiYuv,
+ TComYuv* reconYuv)
+{
+ bool bChromaSame = false;
+ uint32_t fullDepth = cu->getDepth(0) + trDepth;
+ uint32_t trMode = cu->getTransformIdx(absPartIdx);
+ if (trMode == trDepth)
+ {
+ uint32_t trSizeLog2 = g_convertToBit[cu->getSlice()->getSPS()->getMaxCUWidth() >> fullDepth] + 2;
+ uint32_t actualTrDepth = trDepth;
+ bChromaSame = false;
+ if (trSizeLog2 == 2)
+ {
+ assert(trDepth > 0);
+ actualTrDepth--;
+ uint32_t qpdiv = cu->getPic()->getNumPartInCU() >> ((cu->getDepth(0) + actualTrDepth) << 1);
+ bool bFirstQ = ((absPartIdx % qpdiv) == 0);
+ if (!bFirstQ)
+ {
+ return;
+ }
+ bChromaSame = true;
+ }
+
+ cu->setTransformSkipSubParts(0, TEXT_CHROMA_U, absPartIdx, cu->getDepth(0) + actualTrDepth);
+ cu->setTransformSkipSubParts(0, TEXT_CHROMA_V, absPartIdx, cu->getDepth(0) + actualTrDepth);
+ uint32_t qtlayer = cu->getSlice()->getSPS()->getQuadtreeTULog2MaxSize() - trSizeLog2;
+ uint32_t width = cu->getWidth(0) >> (trDepth + m_hChromaShift);
+ uint32_t height = cu->getHeight(0) >> (trDepth + m_vChromaShift);
+ uint32_t stride = fencYuv->getCStride();
+
+ for (uint32_t chromaId = 0; chromaId < 2; chromaId++)
+ {
+ TextType ttype = (chromaId > 0 ? TEXT_CHROMA_V : TEXT_CHROMA_U);
+ uint32_t chromaPredMode = cu->getChromaIntraDir(absPartIdx);
+ Pel* fenc = (chromaId > 0 ? fencYuv->getCrAddr(absPartIdx) : fencYuv->getCbAddr(absPartIdx));
+ Pel* pred = (chromaId > 0 ? predYuv->getCrAddr(absPartIdx) : predYuv->getCbAddr(absPartIdx));
+ int16_t* residual = (chromaId > 0 ? resiYuv->getCrAddr(absPartIdx) : resiYuv->getCbAddr(absPartIdx));
+ Pel* recon = (chromaId > 0 ? reconYuv->getCrAddr(absPartIdx) : reconYuv->getCbAddr(absPartIdx));
+ uint32_t numCoeffPerInc = (cu->getSlice()->getSPS()->getMaxCUWidth() * cu->getSlice()->getSPS()->getMaxCUHeight() >> (cu->getSlice()->getSPS()->getMaxCUDepth() << 1)) >> 2;
+ TCoeff* coeff = (chromaId > 0 ? m_qtTempCoeffCr[qtlayer] : m_qtTempCoeffCb[qtlayer]) + numCoeffPerInc * absPartIdx;
+ int16_t* reconQt = (chromaId > 0 ? m_qtTempTComYuv[qtlayer].getCrAddr(absPartIdx) : m_qtTempTComYuv[qtlayer].getCbAddr(absPartIdx));
+ assert(m_qtTempTComYuv[qtlayer].m_cwidth == MAX_CU_SIZE / 2);
+
+ uint32_t zorder = cu->getZorderIdxInCU() + absPartIdx;
+ Pel* reconIPred = (chromaId > 0 ? cu->getPic()->getPicYuvRec()->getCrAddr(cu->getAddr(), zorder) : cu->getPic()->getPicYuvRec()->getCbAddr(cu->getAddr(), zorder));
+ uint32_t reconIPredStride = cu->getPic()->getPicYuvRec()->getCStride();
+ bool useTransformSkipChroma = cu->getTransformSkip(absPartIdx, ttype);
+ //===== update chroma mode =====
+ if (chromaPredMode == DM_CHROMA_IDX)
+ {
+ chromaPredMode = cu->getLumaIntraDir(0);
+ }
+ //===== init availability pattern =====
+ cu->getPattern()->initPattern(cu, trDepth, absPartIdx);
+ cu->getPattern()->initAdiPatternChroma(cu, absPartIdx, trDepth, m_predBuf, m_predBufStride, m_predBufHeight);
+ Pel* chromaPred = (chromaId > 0 ? cu->getPattern()->getAdiCrBuf(width, height, m_predBuf) : cu->getPattern()->getAdiCbBuf(width, height, m_predBuf));
+
+ //===== get prediction signal =====
+ predIntraChromaAng(chromaPred, chromaPredMode, pred, stride, width);
+
+ //===== get residual signal =====
+ assert(!((uint32_t)(size_t)fenc & (width - 1)));
+ assert(!((uint32_t)(size_t)pred & (width - 1)));
+ assert(!((uint32_t)(size_t)residual & (width - 1)));
+ int size = g_convertToBit[width];
+ primitives.calcresidual[size](fenc, pred, residual, stride);
+
+ //--- transform and quantization ---
+ uint32_t absSum = 0;
+ int lastPos = -1;
+
+ int curChromaQpOffset;
+ if (ttype == TEXT_CHROMA_U)
+ {
+ curChromaQpOffset = cu->getSlice()->getPPS()->getChromaCbQpOffset() + cu->getSlice()->getSliceQpDeltaCb();
+ }
+ else
+ {
+ curChromaQpOffset = cu->getSlice()->getPPS()->getChromaCrQpOffset() + cu->getSlice()->getSliceQpDeltaCr();
+ }
+ m_trQuant->setQPforQuant(cu->getQP(0), TEXT_CHROMA, cu->getSlice()->getSPS()->getQpBDOffsetC(), curChromaQpOffset);
+
+ m_trQuant->selectLambda(TEXT_CHROMA);
+
+ absSum = m_trQuant->transformNxN(cu, residual, stride, coeff, width, height, ttype, absPartIdx, &lastPos, useTransformSkipChroma);
+
+ //--- set coded block flag ---
+ cu->setCbfSubParts((absSum ? 1 : 0) << trDepth, ttype, absPartIdx, cu->getDepth(0) + trDepth);
+
+ //--- inverse transform ---
+ if (absSum)
+ {
+ int scalingListType = 0 + g_eTTable[(int)ttype];
+ assert(scalingListType < 6);
+ m_trQuant->invtransformNxN(cu->getCUTransquantBypass(absPartIdx), REG_DCT, residual, stride, coeff, width, height, scalingListType, useTransformSkipChroma, lastPos);
+ }
+ else
+ {
+ int16_t* resiTmp = residual;
+ memset(coeff, 0, sizeof(TCoeff) * width * height);
+ primitives.blockfill_s[size](resiTmp, stride, 0);
+ }
+
+ //===== reconstruction =====
+ assert(((uint32_t)(size_t)residual & (width - 1)) == 0);
+ assert(width <= 32);
+ primitives.calcrecon[size](pred, residual, recon, reconQt, reconIPred, stride, MAX_CU_SIZE / 2, reconIPredStride);
+ }
+
+ //===== copy transform coefficients =====
+ uint32_t numCoeffC = (cu->getSlice()->getSPS()->getMaxCUWidth() * cu->getSlice()->getSPS()->getMaxCUHeight()) >> (fullDepth << 1);
+ if (!bChromaSame)
+ {
+ numCoeffC >>= 2;
+ }
+ uint32_t numCoeffIncC = (cu->getSlice()->getSPS()->getMaxCUWidth() * cu->getSlice()->getSPS()->getMaxCUHeight()) >> ((cu->getSlice()->getSPS()->getMaxCUDepth() << 1) + 2);
+ TCoeff* coeffSrcU = m_qtTempCoeffCb[qtlayer] + (numCoeffIncC * absPartIdx);
+ TCoeff* coeffSrcV = m_qtTempCoeffCr[qtlayer] + (numCoeffIncC * absPartIdx);
+ TCoeff* coeffDstU = cu->getCoeffCb() + (numCoeffIncC * absPartIdx);
+ TCoeff* coeffDstV = cu->getCoeffCr() + (numCoeffIncC * absPartIdx);
+ ::memcpy(coeffDstU, coeffSrcU, sizeof(TCoeff) * numCoeffC);
+ ::memcpy(coeffDstV, coeffSrcV, sizeof(TCoeff) * numCoeffC);
+ }
+ else
+ {
+ uint32_t splitCbfU = 0;
+ uint32_t splitCbfV = 0;
+ uint32_t qPartsDiv = cu->getPic()->getNumPartInCU() >> ((fullDepth + 1) << 1);
+ uint32_t absPartIdxSub = absPartIdx;
+ for (uint32_t part = 0; part < 4; part++, absPartIdxSub += qPartsDiv)
+ {
+ residualQTIntrachroma(cu, trDepth + 1, absPartIdxSub, fencYuv, predYuv, resiYuv, reconYuv);
+ splitCbfU |= cu->getCbf(absPartIdxSub, TEXT_CHROMA_U, trDepth + 1);
+ splitCbfV |= cu->getCbf(absPartIdxSub, TEXT_CHROMA_V, trDepth + 1);
+ }
+
+ for (uint32_t offs = 0; offs < 4 * qPartsDiv; offs++)
+ {
+ cu->getCbf(TEXT_CHROMA_U)[absPartIdx + offs] |= (splitCbfU << trDepth);
+ cu->getCbf(TEXT_CHROMA_V)[absPartIdx + offs] |= (splitCbfV << trDepth);
+ }
+ }
+}
+
void TEncSearch::preestChromaPredMode(TComDataCU* cu, TComYuv* fencYuv, TComYuv* predYuv)
{
uint32_t width = cu->getWidth(0) >> 1;
@@ -1860,6 +2146,68 @@
cu->m_totalDistortion = overallDistY + overallDistC;
}
+void TEncSearch::getBestIntraModeChroma(TComDataCU* cu, TComYuv* fencYuv, TComYuv* predYuv)
+{
+ uint32_t depth = cu->getDepth(0);
+ uint32_t trDepth = 0;
+ uint32_t absPartIdx = 0;
+ uint32_t bestMode = 0;
+ uint64_t bestCost = MAX_INT64;
+ //----- init mode list -----
+ uint32_t minMode = 0;
+ uint32_t maxMode = NUM_CHROMA_MODE;
+ uint32_t modeList[NUM_CHROMA_MODE];
+
+ uint32_t width = cu->getWidth(0) >> (trDepth + m_hChromaShift);
+ uint32_t height = cu->getHeight(0) >> (trDepth + m_vChromaShift);
+ uint32_t stride = fencYuv->getCStride();
+ int scaleWidth = width;
+ int scaleStride = stride;
+ int costMultiplier = 1;
+
+ if (width > 32)
+ {
+ scaleWidth = 32;
+ scaleStride = 32;
+ costMultiplier = 4;
+ }
+
+ cu->getPattern()->initPattern(cu, trDepth, absPartIdx);
+ cu->getPattern()->initAdiPatternChroma(cu, absPartIdx, trDepth, m_predBuf, m_predBufStride, m_predBufHeight);
+
+ cu->getAllowedChromaDir(0, modeList);
+ //----- check chroma modes -----
+ for (uint32_t mode = minMode; mode < maxMode; mode++)
+ {
+ uint64_t cost = 0;
+ for (int chromaId = 0; chromaId < 2; chromaId++)
+ {
+ int sad = 0;
+ uint32_t chromaPredMode = mode;
+ Pel* fenc = (chromaId > 0 ? fencYuv->getCrAddr(absPartIdx) : fencYuv->getCbAddr(absPartIdx));
+ Pel* pred = (chromaId > 0 ? predYuv->getCrAddr(absPartIdx) : predYuv->getCbAddr(absPartIdx));
+
+ Pel* chromaPred = (chromaId > 0 ? cu->getPattern()->getAdiCrBuf(width, height, m_predBuf) : cu->getPattern()->getAdiCbBuf(width, height, m_predBuf));
+
+ //===== get prediction signal =====
+ predIntraChromaAng(chromaPred, chromaPredMode, pred, stride, width);
+ int log2SizeMinus2 = g_convertToBit[scaleWidth];
+ pixelcmp_t sa8d = primitives.sa8d[log2SizeMinus2];
+ sad = costMultiplier * sa8d(fenc, scaleStride, pred, scaleStride);
+ cost += sad;
+ }
+
+ //----- compare -----
+ if (cost < bestCost)
+ {
+ bestCost = cost;
+ bestMode = modeList[mode];
+ }
+ }
+
+ cu->setChromIntraDirSubParts(bestMode, 0, depth);
+}
+
void TEncSearch::estIntraPredChromaQT(TComDataCU* cu,
TComYuv* fencYuv,
TComYuv* predYuv,
diff -r 4c81122118f5 -r f9ebf328eb5a source/Lib/TLibEncoder/TEncSearch.h
--- a/source/Lib/TLibEncoder/TEncSearch.h Tue Dec 10 17:40:00 2013 +0530
+++ b/source/Lib/TLibEncoder/TEncSearch.h Tue Dec 10 17:40:42 2013 +0530
@@ -143,6 +143,8 @@
void preestChromaPredMode(TComDataCU* cu, TComYuv* fencYuv, TComYuv* predYuv);
void estIntraPredQT(TComDataCU* cu, TComYuv* fencYuv, TComYuv* predYuv, TShortYUV* resiYuv, TComYuv* reconYuv, uint32_t& ruiDistC, bool bLumaOnly);
+ void getBestIntraModeChroma(TComDataCU* cu, TComYuv* fencYuv, TComYuv* predYuv);
+
void estIntraPredChromaQT(TComDataCU* cu, TComYuv* fencYuv, TComYuv* predYuv, TShortYUV* resiYuv,
TComYuv* reconYuv, uint32_t precalcDistC);
@@ -166,7 +168,6 @@
void xRecurIntraCodingQT(TComDataCU* cu, uint32_t trDepth, uint32_t absPartIdx, bool bLumaOnly, TComYuv* fencYuv,
TComYuv* predYuv, TShortYUV* resiYuv, uint32_t& distY, uint32_t& distC, bool bCheckFirst,
uint64_t& dRDCost);
-
void xSetIntraResultQT(TComDataCU* cu, uint32_t trDepth, uint32_t absPartIdx, bool bLumaOnly, TComYuv* reconYuv);
// -------------------------------------------------------------------------------------------------------------------
@@ -195,6 +196,11 @@
void xRecurIntraChromaCodingQT(TComDataCU* cu, uint32_t trDepth, uint32_t absPartIdx, TComYuv* fencYuv,
TComYuv* predYuv, TShortYUV* resiYuv, uint32_t& outDist);
+
+ void residualTransformQuantIntra(TComDataCU* cu, uint32_t trDepth, uint32_t absPartIdx, bool bLumaOnly, TComYuv* fencYuv,
+ TComYuv* predYuv, TShortYUV* resiYuv, TComYuv* reconYuv);
+ void residualQTIntrachroma(TComDataCU* cu, uint32_t trDepth, uint32_t absPartIdx, TComYuv* fencYuv,
+ TComYuv* predYuv, TShortYUV* resiYuv, TComYuv* reconYuv);
void xSetIntraResultChromaQT(TComDataCU* cu, uint32_t trDepth, uint32_t absPartIdx, TComYuv* reconYuv);
More information about the x265-devel
mailing list