[x265] [PATCH RFC] psyrd: use psyrdcost for selecting best mode across depth
Deepthi Nandakumar
deepthi at multicorewareinc.com
Mon May 26 12:56:36 CEST 2014
On Mon, May 26, 2014 at 3:02 PM, <sumalatha at multicorewareinc.com> wrote:
> # HG changeset patch
> # User Sumalatha Polureddy<sumalatha at multicorewareinc.com>
> # Date 1401087565 -19800
> # Node ID cbe5cc0e48b4122518ca732a1b32de16ba25c467
> # Parent 5134e76aa729b6fece18701fdc00390c2f2ffb32
> psyrd: use psyrdcost for selecting best mode across depth
>
> diff -r 5134e76aa729 -r cbe5cc0e48b4 source/Lib/TLibCommon/TComDataCU.cpp
> --- a/source/Lib/TLibCommon/TComDataCU.cpp Thu May 22 21:46:21 2014
> -0500
> +++ b/source/Lib/TLibCommon/TComDataCU.cpp Mon May 26 12:29:25 2014
> +0530
> @@ -218,6 +218,7 @@
> m_sa8dCost = MAX_INT64;
> m_totalDistortion = 0;
> m_totalBits = 0;
> + m_psyCost = 0;
> m_numPartitions = pic->getNumPartInCU();
> char* qp = pic->getCU(getAddr())->getQP();
> m_baseQp = pic->getCU(getAddr())->m_baseQp;
> @@ -309,6 +310,7 @@
> m_sa8dCost = MAX_INT64;
> m_totalDistortion = 0;
> m_totalBits = 0;
> + m_psyCost = 0;
>
> uint8_t cuSize = g_maxCUSize >> depth;
>
> @@ -345,6 +347,7 @@
> m_sa8dCost = MAX_INT64;
> m_totalDistortion = 0;
> m_totalBits = 0;
> + m_psyCost = 0;
>
> uint8_t cuSize = g_maxCUSize >> depth;
>
> @@ -393,6 +396,7 @@
> m_sa8dCost = MAX_INT64;
> m_totalDistortion = 0;
> m_totalBits = 0;
> + m_psyCost = 0;
> m_numPartitions = cu->getTotalNumPart() >> 2;
>
> for (int i = 0; i < 4; i++)
> @@ -457,6 +461,7 @@
> m_sa8dCost = MAX_INT64;
> m_totalDistortion = 0;
> m_totalBits = 0;
> + m_psyCost = 0;
> m_numPartitions = cu->getTotalNumPart() >> 2;
>
> for (int i = 0; i < 4; i++)
> @@ -520,6 +525,7 @@
> m_sa8dCost = MAX_INT64;
> m_totalDistortion = 0;
> m_totalBits = 0;
> + m_psyCost = 0;
> m_numPartitions = cu->getTotalNumPart() >> 2;
>
> TComDataCU* rpcCU = m_pic->getCU(m_cuAddr);
> @@ -550,6 +556,7 @@
>
> m_totalDistortion += cu->m_totalDistortion;
> m_totalBits += cu->m_totalBits;
> + m_psyCost += cu->m_psyCost;
>
> uint32_t offset = cu->getTotalNumPart() * partUnitIdx;
> uint32_t numPartition = cu->getTotalNumPart();
> @@ -610,6 +617,7 @@
> rpcCU->m_totalCost = m_totalCost;
> rpcCU->m_totalDistortion = m_totalDistortion;
> rpcCU->m_totalBits = m_totalBits;
> + rpcCU->m_psyCost = m_psyCost;
>
> int sizeInBool = sizeof(bool) * m_numPartitions;
> int sizeInChar = sizeof(char) * m_numPartitions;
> @@ -695,6 +703,7 @@
> cu->m_totalCost = m_totalCost;
> cu->m_totalDistortion = m_totalDistortion;
> cu->m_totalBits = m_totalBits;
> + cu->m_psyCost = m_psyCost;
>
> int sizeInBool = sizeof(bool) * qNumPart;
> int sizeInChar = sizeof(char) * qNumPart;
> diff -r 5134e76aa729 -r cbe5cc0e48b4 source/Lib/TLibCommon/TComDataCU.h
> --- a/source/Lib/TLibCommon/TComDataCU.h Thu May 22 21:46:21 2014
> -0500
> +++ b/source/Lib/TLibCommon/TComDataCU.h Mon May 26 12:29:25 2014
> +0530
> @@ -168,6 +168,7 @@
> uint64_t m_totalCost; ///< sum of partition RD costs
> uint32_t m_totalDistortion; ///< sum of partition distortion
> uint32_t m_totalBits; ///< sum of partition signal bits
> + uint32_t m_psyCost;
> uint64_t m_avgCost[4]; // stores the avg cost of CU's in
> frame for each depth
> uint32_t m_count[4];
> uint64_t m_sa8dCost;
> diff -r 5134e76aa729 -r cbe5cc0e48b4 source/Lib/TLibEncoder/TEncCu.cpp
> --- a/source/Lib/TLibEncoder/TEncCu.cpp Thu May 22 21:46:21 2014 -0500
> +++ b/source/Lib/TLibEncoder/TEncCu.cpp Mon May 26 12:29:25 2014 +0530
> @@ -601,7 +601,14 @@
> m_entropyCoder->resetBits();
> m_entropyCoder->encodeSplitFlag(outBestCU, 0, depth);
> outBestCU->m_totalBits +=
> m_entropyCoder->getNumberOfWrittenBits(); // split bits
> - outBestCU->m_totalCost =
> m_rdCost->calcRdCost(outBestCU->m_totalDistortion, outBestCU->m_totalBits);
> + if (m_rdCost->psyRdEnabled())
> + {
> + outBestCU->m_totalCost =
> m_rdCost->calcPsyRdCost(outBestCU->m_totalDistortion,
> outBestCU->m_totalBits, outBestCU->m_psyCost);
>
If our objective is to catch unintended comparisons between psyCost and
regular RD cost, you should save the above cost (with psyRd enabled) into
m_psyCost.
+ }
> + else
> + {
> + outBestCU->m_totalCost =
> m_rdCost->calcRdCost(outBestCU->m_totalDistortion, outBestCU->m_totalBits);
> + }
> }
>
> outTempCU->initEstData(depth);
> @@ -648,7 +655,14 @@
> m_entropyCoder->encodeSplitFlag(outTempCU, 0, depth);
> outTempCU->m_totalBits +=
> m_entropyCoder->getNumberOfWrittenBits(); // split bits
> }
> - outTempCU->m_totalCost =
> m_rdCost->calcRdCost(outTempCU->m_totalDistortion, outTempCU->m_totalBits);
> + if (m_rdCost->psyRdEnabled())
> + {
> + outTempCU->m_totalCost =
> m_rdCost->calcPsyRdCost(outTempCU->m_totalDistortion,
> outTempCU->m_totalBits, outTempCU->m_psyCost);
> + }
> + else
> + {
> + outTempCU->m_totalCost =
> m_rdCost->calcRdCost(outTempCU->m_totalDistortion, outTempCU->m_totalBits);
> + }
>
> if ((g_maxCUSize >> depth) == slice->getPPS()->getMinCuDQPSize()
> && slice->getPPS()->getUseDQP())
> {
> @@ -923,7 +937,14 @@
> m_entropyCoder->resetBits();
> m_entropyCoder->encodeSplitFlag(outBestCU, 0, depth);
> outBestCU->m_totalBits +=
> m_entropyCoder->getNumberOfWrittenBits(); // split bits
> - outBestCU->m_totalCost =
> m_rdCost->calcRdCost(outBestCU->m_totalDistortion, outBestCU->m_totalBits);
> + if (m_rdCost->psyRdEnabled())
> + {
> + outBestCU->m_totalCost =
> m_rdCost->calcPsyRdCost(outBestCU->m_totalDistortion,
> outBestCU->m_totalBits, outBestCU->m_psyCost);
> + }
> + else
> + {
> + outBestCU->m_totalCost =
> m_rdCost->calcRdCost(outBestCU->m_totalDistortion, outBestCU->m_totalBits);
> + }
>
> // Early CU determination
> if (outBestCU->isSkipped(0))
> @@ -982,7 +1003,14 @@
> m_entropyCoder->encodeSplitFlag(outTempCU, 0, depth);
> outTempCU->m_totalBits +=
> m_entropyCoder->getNumberOfWrittenBits(); // split bits
> }
> - outTempCU->m_totalCost =
> m_rdCost->calcRdCost(outTempCU->m_totalDistortion, outTempCU->m_totalBits);
> + if(m_rdCost->psyRdEnabled())
> + {
> + outTempCU->m_totalCost =
> m_rdCost->calcPsyRdCost(outTempCU->m_totalDistortion,
> outTempCU->m_totalBits, outTempCU->m_psyCost);
> + }
> + else
> + {
> + outTempCU->m_totalCost =
> m_rdCost->calcRdCost(outTempCU->m_totalDistortion, outTempCU->m_totalBits);
> + }
>
> if ((g_maxCUSize >> depth) == slice->getPPS()->getMinCuDQPSize()
> && slice->getPPS()->getUseDQP())
> {
> @@ -1391,6 +1419,7 @@
> int part = g_convertToBit[outTempCU->getCUSize(0)];
> uint32_t psyRdCost = m_rdCost->psyCost(part,
> m_origYuv[depth]->getLumaAddr(), m_origYuv[depth]->getStride(),
>
> m_tmpRecoYuv[depth]->getLumaAddr(), m_tmpRecoYuv[depth]->getStride());
> + outTempCU->m_psyCost = psyRdCost;
> outTempCU->m_totalCost =
> m_rdCost->calcPsyRdCost(outTempCU->m_totalDistortion,
> outTempCU->m_totalBits, psyRdCost);
> }
> else
> @@ -1438,6 +1467,7 @@
> int part = g_convertToBit[outTempCU->getCUSize(0)];
> uint32_t psyRdCost = m_rdCost->psyCost(part,
> m_origYuv[depth]->getLumaAddr(), m_origYuv[depth]->getStride(),
>
> m_tmpRecoYuv[depth]->getLumaAddr(), m_tmpRecoYuv[depth]->getStride());
> + outTempCU->m_psyCost = psyRdCost;
> outTempCU->m_totalCost =
> m_rdCost->calcPsyRdCost(outTempCU->m_totalDistortion,
> outTempCU->m_totalBits, psyRdCost);
> }
> else
> diff -r 5134e76aa729 -r cbe5cc0e48b4 source/Lib/TLibEncoder/TEncSearch.cpp
> --- a/source/Lib/TLibEncoder/TEncSearch.cpp Thu May 22 21:46:21 2014
> -0500
> +++ b/source/Lib/TLibEncoder/TEncSearch.cpp Mon May 26 12:29:25 2014
> +0530
> @@ -2698,6 +2698,7 @@
> int size = g_convertToBit[cu->getCUSize(0)];
> uint32_t psyRdCost = m_rdCost->psyCost(size,
> fencYuv->getLumaAddr(), fencYuv->getStride(),
>
> outReconYuv->getLumaAddr(), outReconYuv->getStride());
> + cu->m_psyCost = psyRdCost;
> cu->m_totalCost =
> m_rdCost->calcPsyRdCost(cu->m_totalDistortion, cu->m_totalBits, psyRdCost);
> }
> else
> @@ -2789,6 +2790,7 @@
> int size = g_convertToBit[cu->getCUSize(0)];
> uint32_t psyRdCost = m_rdCost->psyCost(size,
> fencYuv->getLumaAddr(), fencYuv->getStride(),
>
> outReconYuv->getLumaAddr(), outReconYuv->getStride());
> + cu->m_psyCost = psyRdCost;
> bcost = m_rdCost->calcPsyRdCost(bdist, bestBits, psyRdCost);
> }
> else
> _______________________________________________
> x265-devel mailing list
> x265-devel at videolan.org
> https://mailman.videolan.org/listinfo/x265-devel
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/x265-devel/attachments/20140526/7e5dd80f/attachment.html>
More information about the x265-devel
mailing list