Re: [x265] fix chroma lambda weighting
Thanks, very interesting fix. Can you give us some background here? Where did we the divide by 3.0 come from? On Tue, Mar 25, 2014 at 9:01 AM, Satoshi Nakagawa nakagawa...@oki.comwrote: # HG changeset patch # User Satoshi Nakagawa nakagawa...@oki.com # Date 1395672158 -32400 # Mon Mar 24 23:42:38 2014 +0900 # Node ID 08584b5913bce6a5f9d2f0d408fcdace6aa83a65 # Parent fdd7c6168cf42a11240ff1c7fc7b401605524db2 fix chroma lambda weighting diff -r fdd7c6168cf4 -r 08584b5913bc source/encoder/frameencoder.cpp --- a/source/encoder/frameencoder.cpp Fri Mar 21 14:44:35 2014 -0500 +++ b/source/encoder/frameencoder.cpp Mon Mar 24 23:42:38 2014 +0900 @@ -335,11 +335,10 @@ // instead we weight the distortion of chroma. int chromaQPOffset = slice-getPPS()-getChromaCbQpOffset() + slice-getSliceQpDeltaCb(); int qpc = Clip3(0, MAX_MAX_QP, qp + chromaQPOffset); -double cbWeight = pow(2.0, (qp - g_chromaScale[chFmt][qpc])); // takes into account of the chroma qp mapping and chroma qp Offset - +double cbWeight = pow(2.0, (qp - g_chromaScale[chFmt][qpc]) / 3.0); // takes into account of the chroma qp mapping and chroma qp Offset chromaQPOffset = slice-getPPS()-getChromaCrQpOffset() + slice-getSliceQpDeltaCr(); qpc = Clip3(0, MAX_MAX_QP, qp + chromaQPOffset); -double crWeight = pow(2.0, (qp - g_chromaScale[chFmt][qpc])); // takes into account of the chroma qp mapping and chroma qp Offset +double crWeight = pow(2.0, (qp - g_chromaScale[chFmt][qpc]) / 3.0); // takes into account of the chroma qp mapping and chroma qp Offset double chromaLambda = lambda / crWeight; m_rows[row].m_search.setQPLambda(qp, lambda, chromaLambda); @@ -376,10 +375,10 @@ int qpc; int chromaQPOffset = slice-getPPS()-getChromaCbQpOffset() + slice-getSliceQpDeltaCb(); qpc = Clip3(0, MAX_MAX_QP, qp + chromaQPOffset); -double cbWeight = pow(2.0, (qp - g_chromaScale[chFmt][qpc])); // takes into account of the chroma qp mapping and chroma qp Offset +double cbWeight = pow(2.0, (qp - g_chromaScale[chFmt][qpc]) / 3.0); // takes into account of the chroma qp mapping and chroma qp Offset chromaQPOffset = slice-getPPS()-getChromaCrQpOffset() + slice-getSliceQpDeltaCr(); qpc = Clip3(0, MAX_MAX_QP, qp + chromaQPOffset); -double crWeight = pow(2.0, (qp - g_chromaScale[chFmt][qpc])); // takes into account of the chroma qp mapping and chroma qp Offset +double crWeight = pow(2.0, (qp - g_chromaScale[chFmt][qpc]) / 3.0); // takes into account of the chroma qp mapping and chroma qp Offset double chromaLambda = lambda / crWeight; // NOTE: set SAO lambda every Frame ___ x265-devel mailing list x265-devel@videolan.org https://mailman.videolan.org/listinfo/x265-devel ___ x265-devel mailing list x265-devel@videolan.org https://mailman.videolan.org/listinfo/x265-devel
Re: [x265] fix chroma lambda weighting
lambda for RDO is proportional to pow(2.0, qp / 3.0). so, the qp offset here also needs to be devided by 3.0. From: x265-devel [mailto:x265-devel-boun...@videolan.org] On Behalf Of Deepthi Nandakumar Sent: Tuesday, March 25, 2014 7:55 PM To: Development for x265 Subject: Re: [x265] fix chroma lambda weighting Thanks, very interesting fix. Can you give us some background here? Where did we the divide by 3.0 come from? On Tue, Mar 25, 2014 at 9:01 AM, Satoshi Nakagawa nakagawa...@oki.com wrote: # HG changeset patch # User Satoshi Nakagawa nakagawa...@oki.com # Date 1395672158 -32400 # Mon Mar 24 23:42:38 2014 +0900 # Node ID 08584b5913bce6a5f9d2f0d408fcdace6aa83a65 # Parent fdd7c6168cf42a11240ff1c7fc7b401605524db2 fix chroma lambda weighting diff -r fdd7c6168cf4 -r 08584b5913bc source/encoder/frameencoder.cpp --- a/source/encoder/frameencoder.cpp Fri Mar 21 14:44:35 2014 -0500 +++ b/source/encoder/frameencoder.cpp Mon Mar 24 23:42:38 2014 +0900 @@ -335,11 +335,10 @@ // instead we weight the distortion of chroma. int chromaQPOffset = slice-getPPS()-getChromaCbQpOffset() + slice-getSliceQpDeltaCb(); int qpc = Clip3(0, MAX_MAX_QP, qp + chromaQPOffset); -double cbWeight = pow(2.0, (qp - g_chromaScale[chFmt][qpc])); // takes into account of the chroma qp mapping and chroma qp Offset - +double cbWeight = pow(2.0, (qp - g_chromaScale[chFmt][qpc]) / 3.0); // takes into account of the chroma qp mapping and chroma qp Offset chromaQPOffset = slice-getPPS()-getChromaCrQpOffset() + slice-getSliceQpDeltaCr(); qpc = Clip3(0, MAX_MAX_QP, qp + chromaQPOffset); -double crWeight = pow(2.0, (qp - g_chromaScale[chFmt][qpc])); // takes into account of the chroma qp mapping and chroma qp Offset +double crWeight = pow(2.0, (qp - g_chromaScale[chFmt][qpc]) / 3.0); // takes into account of the chroma qp mapping and chroma qp Offset double chromaLambda = lambda / crWeight; m_rows[row].m_search.setQPLambda(qp, lambda, chromaLambda); @@ -376,10 +375,10 @@ int qpc; int chromaQPOffset = slice-getPPS()-getChromaCbQpOffset() + slice-getSliceQpDeltaCb(); qpc = Clip3(0, MAX_MAX_QP, qp + chromaQPOffset); -double cbWeight = pow(2.0, (qp - g_chromaScale[chFmt][qpc])); // takes into account of the chroma qp mapping and chroma qp Offset +double cbWeight = pow(2.0, (qp - g_chromaScale[chFmt][qpc]) / 3.0); // takes into account of the chroma qp mapping and chroma qp Offset chromaQPOffset = slice-getPPS()-getChromaCrQpOffset() + slice-getSliceQpDeltaCr(); qpc = Clip3(0, MAX_MAX_QP, qp + chromaQPOffset); -double crWeight = pow(2.0, (qp - g_chromaScale[chFmt][qpc])); // takes into account of the chroma qp mapping and chroma qp Offset +double crWeight = pow(2.0, (qp - g_chromaScale[chFmt][qpc]) / 3.0); // takes into account of the chroma qp mapping and chroma qp Offset double chromaLambda = lambda / crWeight; // NOTE: set SAO lambda every Frame ___ x265-devel mailing list x265-devel@videolan.org https://mailman.videolan.org/listinfo/x265-devel ___ x265-devel mailing list x265-devel@videolan.org https://mailman.videolan.org/listinfo/x265-devel
[x265] fix chroma lambda weighting
# HG changeset patch # User Satoshi Nakagawa nakagawa...@oki.com # Date 1395672158 -32400 # Mon Mar 24 23:42:38 2014 +0900 # Node ID 08584b5913bce6a5f9d2f0d408fcdace6aa83a65 # Parent fdd7c6168cf42a11240ff1c7fc7b401605524db2 fix chroma lambda weighting diff -r fdd7c6168cf4 -r 08584b5913bc source/encoder/frameencoder.cpp --- a/source/encoder/frameencoder.cpp Fri Mar 21 14:44:35 2014 -0500 +++ b/source/encoder/frameencoder.cpp Mon Mar 24 23:42:38 2014 +0900 @@ -335,11 +335,10 @@ // instead we weight the distortion of chroma. int chromaQPOffset = slice-getPPS()-getChromaCbQpOffset() + slice-getSliceQpDeltaCb(); int qpc = Clip3(0, MAX_MAX_QP, qp + chromaQPOffset); -double cbWeight = pow(2.0, (qp - g_chromaScale[chFmt][qpc])); // takes into account of the chroma qp mapping and chroma qp Offset - +double cbWeight = pow(2.0, (qp - g_chromaScale[chFmt][qpc]) / 3.0); // takes into account of the chroma qp mapping and chroma qp Offset chromaQPOffset = slice-getPPS()-getChromaCrQpOffset() + slice-getSliceQpDeltaCr(); qpc = Clip3(0, MAX_MAX_QP, qp + chromaQPOffset); -double crWeight = pow(2.0, (qp - g_chromaScale[chFmt][qpc])); // takes into account of the chroma qp mapping and chroma qp Offset +double crWeight = pow(2.0, (qp - g_chromaScale[chFmt][qpc]) / 3.0); // takes into account of the chroma qp mapping and chroma qp Offset double chromaLambda = lambda / crWeight; m_rows[row].m_search.setQPLambda(qp, lambda, chromaLambda); @@ -376,10 +375,10 @@ int qpc; int chromaQPOffset = slice-getPPS()-getChromaCbQpOffset() + slice-getSliceQpDeltaCb(); qpc = Clip3(0, MAX_MAX_QP, qp + chromaQPOffset); -double cbWeight = pow(2.0, (qp - g_chromaScale[chFmt][qpc])); // takes into account of the chroma qp mapping and chroma qp Offset +double cbWeight = pow(2.0, (qp - g_chromaScale[chFmt][qpc]) / 3.0); // takes into account of the chroma qp mapping and chroma qp Offset chromaQPOffset = slice-getPPS()-getChromaCrQpOffset() + slice-getSliceQpDeltaCr(); qpc = Clip3(0, MAX_MAX_QP, qp + chromaQPOffset); -double crWeight = pow(2.0, (qp - g_chromaScale[chFmt][qpc])); // takes into account of the chroma qp mapping and chroma qp Offset +double crWeight = pow(2.0, (qp - g_chromaScale[chFmt][qpc]) / 3.0); // takes into account of the chroma qp mapping and chroma qp Offset double chromaLambda = lambda / crWeight; // NOTE: set SAO lambda every Frame ___ x265-devel mailing list x265-devel@videolan.org https://mailman.videolan.org/listinfo/x265-devel