# HG changeset patch # User Kavitha Sampath <[email protected]> # Date 1390891330 -19800 # Tue Jan 28 12:12:10 2014 +0530 # Node ID 7abfa3ed39001e591c2def68eb05e4282f7e9414 # Parent 3c2441447f2a26fbe087ed9b420fc3fd087163c3 WeightPrediction: Avoid motion compensation when difPoc is large
diff -r 3c2441447f2a -r 7abfa3ed3900 source/encoder/frameencoder.cpp
--- a/source/encoder/frameencoder.cpp Mon Jan 27 14:17:25 2014 -0600
+++ b/source/encoder/frameencoder.cpp Tue Jan 28 12:12:10 2014 +0530
@@ -465,7 +465,7 @@
//------------------------------------------------------------------------------
// Weighted Prediction implemented at Slice level. SliceMode=2 is
not supported yet.
//------------------------------------------------------------------------------
- WeightPrediction wp(slice);
+ WeightPrediction wp(slice, m_cfg->param);
wp.weightAnalyseEnc();
}
diff -r 3c2441447f2a -r 7abfa3ed3900 source/encoder/weightPrediction.cpp
--- a/source/encoder/weightPrediction.cpp Mon Jan 27 14:17:25 2014 -0600
+++ b/source/encoder/weightPrediction.cpp Tue Jan 28 12:12:10 2014 +0530
@@ -188,20 +188,20 @@
{
for (int refIdxTemp = 0; (refIdxTemp <
m_slice->getNumRefIdx(list)) && (numWeighted < 8); refIdxTemp++)
{
+ bool mcFlag = false;
check = 0;
fw = m_wp[list][refIdxTemp];
ref = &m_slice->getRefPic(list, refIdxTemp)->m_lowres;
refPoc = m_slice->getRefPic(list, refIdxTemp)->getPOC();
difPoc = abs(curPoc - refPoc);
- if (difPoc > m_bframes + 1)
- continue;
- else
+ if (difPoc <= m_bframes + 1)
{
m_mvs = fenc->lowresMvs[list][difPoc - 1];
- if (m_mvs[0].x == 0x7FFF)
- continue;
- else
+ if (m_mvs[0].x != 0x7FFF)
+ {
m_mvCost = fenc->lowresMvCosts[0][difPoc - 1];
+ mcFlag = true;
+ }
}
const float epsilon = 1.f / 128.f;
float guessScale[3], fencMean[3], refMean[3];
@@ -245,42 +245,44 @@
switch (yuv)
{
case 0:
- {
+
m_mcbuf = ref->fpelPlane;
m_inbuf = fenc->lowresPlane[0];
- pixel *tempm_buf;
- pixel m_buf8[8 * 8];
- int pixoff = 0, cu = 0;
- intptr_t strd;
- for (int y = 0; y < m_frmHeight; y += 8, pixoff = y *
m_refStride)
+ if (mcFlag)
{
- for (int x = 0; x < m_frmWidth; x += 8, pixoff +=
8, cu++)
+ pixel *tempm_buf;
+ pixel m_buf8[8 * 8];
+ int pixoff = 0, cu = 0;
+ intptr_t strd;
+ for (int y = 0; y < m_frmHeight; y += 8, pixoff =
y * m_refStride)
{
- if (m_mvCost[cu] > fenc->intraCost[cu])
+ for (int x = 0; x < m_frmWidth; x += 8, pixoff
+= 8, cu++)
{
- strd = m_refStride;
- tempm_buf = m_inbuf + pixoff;
+ if (m_mvCost[cu] > fenc->intraCost[cu])
+ {
+ strd = m_refStride;
+ tempm_buf = m_inbuf + pixoff;
+ }
+ else
+ {
+ strd = 8;
+ tempm_buf = ref->lowresMC(pixoff,
m_mvs[cu], m_buf8, strd);
+ ic++;
+ }
+ primitives.blockcpy_pp(8, 8, m_buf + (y *
m_refStride) + x, m_refStride, tempm_buf, strd);
}
- else
- {
- strd = 8;
- tempm_buf = ref->lowresMC(pixoff,
m_mvs[cu], m_buf8, strd);
- ic++;
- }
- primitives.blockcpy_pp(8, 8, m_buf + (y *
m_refStride) + x, m_refStride, tempm_buf, strd);
}
+
+ m_mcbuf = m_buf;
}
-
- m_mcbuf = m_buf;
break;
- }
case 1:
m_mcbuf = m_slice->getRefPic(list,
refIdxTemp)->getPicYuvOrg()->getCbAddr();
m_inbuf =
m_slice->getPic()->getPicYuvOrg()->getCbAddr();
m_blockSize = 8;
- mcChroma();
+ if (mcFlag) mcChroma();
break;
case 2:
@@ -288,7 +290,7 @@
m_mcbuf = m_slice->getRefPic(list,
refIdxTemp)->getPicYuvOrg()->getCrAddr();
m_inbuf =
m_slice->getPic()->getPicYuvOrg()->getCrAddr();
m_blockSize = 8;
- mcChroma();
+ if (mcFlag) mcChroma();
break;
}
weightPrediction.patch
Description: Binary data
_______________________________________________ x265-devel mailing list [email protected] https://mailman.videolan.org/listinfo/x265-devel
