[x265] [PATCH] add support for hdr-opt even when aq-mode is disabled
gopi.satykrishna at multicorewareinc.com
gopi.satykrishna at multicorewareinc.com
Fri Jun 9 13:52:22 CEST 2017
# HG changeset patch
# User Gopi Satykrishna Akisetty <gopi.satykrishna at multicorewareinc.com>
# Date 1497000305 -19800
# Fri Jun 09 14:55:05 2017 +0530
# Node ID 7d2ddd4c43e6424d5f234786751e6ccebf2368fd
# Parent e75d5f5eeae3413057437af9f7d3ba9bc10fa3fa
add support for hdr-opt even when aq-mode is disabled
diff -r e75d5f5eeae3 -r 7d2ddd4c43e6 doc/reST/cli.rst
--- a/doc/reST/cli.rst Mon Jun 05 15:20:44 2017 +0530
+++ b/doc/reST/cli.rst Fri Jun 09 14:55:05 2017 +0530
@@ -1966,6 +1966,7 @@
Add luma and chroma offsets for HDR/WCG content.
Input video should be 10 bit 4:2:0. Applicable for HDR content.
+ It is recommended to use this feature along with AQ mode.
Default disabled. **Experimental Feature**
.. option:: --dhdr10-info <filename>
diff -r e75d5f5eeae3 -r 7d2ddd4c43e6 source/common/frame.cpp
--- a/source/common/frame.cpp Mon Jun 05 15:20:44 2017 +0530
+++ b/source/common/frame.cpp Fri Jun 09 14:55:05 2017 +0530
@@ -78,7 +78,7 @@
}
if (m_fencPic->create(param->sourceWidth, param->sourceHeight, param->internalCsp) &&
- m_lowres.create(m_fencPic, param->bframes, !!param->rc.aqMode || !!param->bAQMotion, param->rc.qgSize))
+ m_lowres.create(m_fencPic, param->bframes, !!param->rc.aqMode || !!param->bAQMotion || !!param->bHDROpt, param->rc.qgSize))
{
X265_CHECK((m_reconColCount == NULL), "m_reconColCount was initialized");
m_numRows = (m_fencPic->m_picHeight + g_maxCUSize - 1) / g_maxCUSize;
diff -r e75d5f5eeae3 -r 7d2ddd4c43e6 source/encoder/encoder.cpp
--- a/source/encoder/encoder.cpp Mon Jun 05 15:20:44 2017 +0530
+++ b/source/encoder/encoder.cpp Fri Jun 09 14:55:05 2017 +0530
@@ -2066,7 +2066,7 @@
{
bool bIsVbv = m_param->rc.vbvBufferSize > 0 && m_param->rc.vbvMaxBitrate > 0;
- if (!m_param->bLossless && (m_param->rc.aqMode || bIsVbv || m_param->bAQMotion))
+ if (!m_param->bLossless && (m_param->rc.aqMode || bIsVbv || m_param->bAQMotion || m_param->bHDROpt))
{
pps->bUseDQP = true;
pps->maxCuDQPDepth = g_log2Size[m_param->maxCUSize] - g_log2Size[m_param->rc.qgSize];
@@ -2446,7 +2446,7 @@
x265_log(p, X265_LOG_WARNING, "limit-tu disabled, requires tu-inter-depth > 1\n");
}
bool bIsVbv = m_param->rc.vbvBufferSize > 0 && m_param->rc.vbvMaxBitrate > 0;
- if (!m_param->bLossless && (m_param->rc.aqMode || bIsVbv || m_param->bAQMotion))
+ if (!m_param->bLossless && (m_param->rc.aqMode || bIsVbv || m_param->bAQMotion || m_param->bHDROpt))
{
if (p->rc.qgSize < X265_MAX(8, p->minCUSize))
{
diff -r e75d5f5eeae3 -r 7d2ddd4c43e6 source/encoder/ratecontrol.cpp
--- a/source/encoder/ratecontrol.cpp Mon Jun 05 15:20:44 2017 +0530
+++ b/source/encoder/ratecontrol.cpp Fri Jun 09 14:55:05 2017 +0530
@@ -2592,7 +2592,7 @@
int64_t actualBits = bits;
Slice *slice = curEncData.m_slice;
- if (m_param->rc.aqMode || m_isVbv || m_param->bAQMotion)
+ if (m_param->rc.aqMode || m_isVbv || m_param->bAQMotion || m_param->bHDROpt)
{
if (m_isVbv && !(m_2pass && m_param->rc.rateControlMode == X265_RC_CRF))
{
@@ -2606,7 +2606,7 @@
rce->qpaRc = curEncData.m_avgQpRc;
}
- if (m_param->rc.aqMode || m_param->bAQMotion)
+ if (m_param->rc.aqMode || m_param->bAQMotion || m_param->bHDROpt)
{
double avgQpAq = 0;
/* determine actual avg encoded QP, after AQ/cutree adjustments */
diff -r e75d5f5eeae3 -r 7d2ddd4c43e6 source/encoder/slicetype.cpp
--- a/source/encoder/slicetype.cpp Mon Jun 05 15:20:44 2017 +0530
+++ b/source/encoder/slicetype.cpp Fri Jun 09 14:55:05 2017 +0530
@@ -243,29 +243,6 @@
qp_adj = strength * (X265_LOG2(X265_MAX(energy, 1)) - (modeOneConst + 2 * (X265_DEPTH - 8)));
}
- if (param->bHDROpt)
- {
- uint32_t sum = lumaSumCu(curFrame, blockX, blockY, param->rc.qgSize);
- uint32_t lumaAvg = sum / (loopIncr * loopIncr);
- if (lumaAvg < 301)
- qp_adj += 3;
- else if (lumaAvg >= 301 && lumaAvg < 367)
- qp_adj += 2;
- else if (lumaAvg >= 367 && lumaAvg < 434)
- qp_adj += 1;
- else if (lumaAvg >= 501 && lumaAvg < 567)
- qp_adj -= 1;
- else if (lumaAvg >= 567 && lumaAvg < 634)
- qp_adj -= 2;
- else if (lumaAvg >= 634 && lumaAvg < 701)
- qp_adj -= 3;
- else if (lumaAvg >= 701 && lumaAvg < 767)
- qp_adj -= 4;
- else if (lumaAvg >= 767 && lumaAvg < 834)
- qp_adj -= 5;
- else if (lumaAvg >= 834)
- qp_adj -= 6;
- }
if (quantOffsets != NULL)
qp_adj += quantOffsets[blockXY];
curFrame->m_lowres.qpAqOffset[blockXY] = qp_adj;
@@ -276,6 +253,43 @@
}
}
+ if (param->bHDROpt)
+ {
+ double qp_adj;
+ blockXY = 0;
+ for (blockY = 0; blockY < maxRow; blockY += loopIncr)
+ {
+ for (blockX = 0; blockX < maxCol; blockX += loopIncr)
+ {
+ qp_adj = 0;
+ uint32_t sum = lumaSumCu(curFrame, blockX, blockY, param->rc.qgSize);
+ uint32_t lumaAvg = sum / (loopIncr * loopIncr);
+ if (lumaAvg < 301)
+ qp_adj = 3;
+ else if (lumaAvg >= 301 && lumaAvg < 367)
+ qp_adj = 2;
+ else if (lumaAvg >= 367 && lumaAvg < 434)
+ qp_adj = 1;
+ else if (lumaAvg >= 501 && lumaAvg < 567)
+ qp_adj = -1;
+ else if (lumaAvg >= 567 && lumaAvg < 634)
+ qp_adj = -2;
+ else if (lumaAvg >= 634 && lumaAvg < 701)
+ qp_adj = -3;
+ else if (lumaAvg >= 701 && lumaAvg < 767)
+ qp_adj = -4;
+ else if (lumaAvg >= 767 && lumaAvg < 834)
+ qp_adj = -5;
+ else if (lumaAvg >= 834)
+ qp_adj = -6;
+ curFrame->m_lowres.qpAqOffset[blockXY] += qp_adj;
+ curFrame->m_lowres.qpCuTreeOffset[blockXY] += qp_adj;
+ curFrame->m_lowres.invQscaleFactor[blockXY] = x265_exp2fix8(curFrame->m_lowres.qpAqOffset[blockXY]);
+ blockXY++;
+ }
+ }
+ }
+
if (param->rc.qgSize == 8)
{
for (int cuY = 0; cuY < heightInCU; cuY++)
@@ -602,7 +616,7 @@
m_lastKeyframe = -m_param->keyframeMax;
m_sliceTypeBusy = false;
m_fullQueueSize = X265_MAX(1, m_param->lookaheadDepth);
- m_bAdaptiveQuant = m_param->rc.aqMode || m_param->bEnableWeightedPred || m_param->bEnableWeightedBiPred || m_param->bAQMotion;
+ m_bAdaptiveQuant = m_param->rc.aqMode || m_param->bEnableWeightedPred || m_param->bEnableWeightedBiPred || m_param->bAQMotion || m_param->bHDROpt;
/* If we have a thread pool and are using --b-adapt 2, it is generally
* preferable to perform all motion searches for each lowres frame in large
@@ -911,7 +925,7 @@
uint32_t widthInLowresCu = (uint32_t)m_8x8Width, heightInLowresCu = (uint32_t)m_8x8Height;
double *qp_offset = 0;
/* Factor in qpoffsets based on Aq/Cutree in CU costs */
- if (m_param->rc.aqMode || m_param->bAQMotion)
+ if (m_param->rc.aqMode || m_param->bAQMotion || m_param->bHDROpt)
qp_offset = (frames[b]->sliceType == X265_TYPE_B || !m_param->rc.cuTree) ? frames[b]->qpAqOffset : frames[b]->qpCuTreeOffset;
for (uint32_t row = 0; row < numCuInHeight; row++)
@@ -1305,7 +1319,7 @@
CostEstimateGroup estGroup(*this, frames);
int64_t cost = estGroup.singleCost(p0, p1, b);
- if (m_param->rc.aqMode || m_param->bAQMotion)
+ if (m_param->rc.aqMode || m_param->bAQMotion || m_param->bHDROpt)
{
if (m_param->rc.cuTree)
return frameCostRecalculate(frames, p0, p1, b);
diff -r e75d5f5eeae3 -r 7d2ddd4c43e6 source/x265cli.h
--- a/source/x265cli.h Mon Jun 05 15:20:44 2017 +0530
+++ b/source/x265cli.h Fri Jun 09 14:55:05 2017 +0530
@@ -502,7 +502,7 @@
H0(" format: G(x,y)B(x,y)R(x,y)WP(x,y)L(max,min)\n");
H0(" --max-cll <string> Emit content light level info SEI as \"cll,fall\" (HDR)\n");
H0(" --[no-]hdr Control dumping of HDR SEI packet. If max-cll or master-display has non-zero values, this is enabled. Default %s\n", OPT(param->bEmitHDRSEI));
- H0(" --[no-]hdr-opt Add luma and chroma offsets for HDR/WCG content. Default %s\n", OPT(param->bHDROpt));
+ H0(" --[no-]hdr-opt Add luma and chroma offsets for HDR/WCG content. Recommended to use this along with AQ Mode. Default %s\n", OPT(param->bHDROpt));
H0(" --min-luma <integer> Minimum luma plane value of input source picture\n");
H0(" --max-luma <integer> Maximum luma plane value of input source picture\n");
H0("\nBitstream options:\n");
-------------- next part --------------
A non-text attachment was scrubbed...
Name: x265.patch
Type: text/x-patch
Size: 9324 bytes
Desc: not available
URL: <http://mailman.videolan.org/pipermail/x265-devel/attachments/20170609/f4386227/attachment.bin>
More information about the x265-devel
mailing list