[x265] [PATCH] aq: new auto variance mode with biasing to dark scenes
santhoshini at multicorewareinc.com
santhoshini at multicorewareinc.com
Wed Jun 17 09:03:15 CEST 2015
# HG changeset patch
# User Santhoshini Sekar<santhoshini at multicorewareinc.com>
# Date 1434522753 -19800
# Wed Jun 17 12:02:33 2015 +0530
# Node ID fb4eecc53e5789094d5a12999c7c2d8e56060b1e
# Parent be0ed447922cc81e809d296e75424bb71822aea7
aq: new auto variance mode with biasing to dark scenes
diff -r be0ed447922c -r fb4eecc53e57 doc/reST/cli.rst
--- a/doc/reST/cli.rst Tue Jun 16 11:15:03 2015 +0530
+++ b/doc/reST/cli.rst Wed Jun 17 12:02:33 2015 +0530
@@ -1179,7 +1179,7 @@
ignored. Slower presets will generally achieve better compression
efficiency (and generate smaller bitstreams). Default disabled.
-.. option:: --aq-mode <0|1|2>
+.. option:: --aq-mode <0|1|2|3>
Adaptive Quantization operating mode. Raise or lower per-block
quantization based on complexity analysis of the source image. The
@@ -1190,6 +1190,7 @@
0. disabled
1. AQ enabled **(default)**
2. AQ enabled with auto-variance
+ 3. AQ enabled with auto-variance and bias to dark scenes
.. option:: --aq-strength <float>
diff -r be0ed447922c -r fb4eecc53e57 source/CMakeLists.txt
--- a/source/CMakeLists.txt Tue Jun 16 11:15:03 2015 +0530
+++ b/source/CMakeLists.txt Wed Jun 17 12:02:33 2015 +0530
@@ -30,7 +30,7 @@
mark_as_advanced(FPROFILE_USE FPROFILE_GENERATE NATIVE_BUILD)
# X265_BUILD must be incremented each time the public API is changed
-set(X265_BUILD 63)
+set(X265_BUILD 64)
configure_file("${PROJECT_SOURCE_DIR}/x265.def.in"
"${PROJECT_BINARY_DIR}/x265.def")
configure_file("${PROJECT_SOURCE_DIR}/x265_config.h.in"
diff -r be0ed447922c -r fb4eecc53e57 source/common/param.cpp
--- a/source/common/param.cpp Tue Jun 16 11:15:03 2015 +0530
+++ b/source/common/param.cpp Wed Jun 17 12:02:33 2015 +0530
@@ -1092,7 +1092,7 @@
"Lookahead depth must be less than 256");
CHECK(param->lookaheadSlices > 16 || param->lookaheadSlices < 0,
"Lookahead slices must between 0 and 16");
- CHECK(param->rc.aqMode < X265_AQ_NONE || X265_AQ_AUTO_VARIANCE < param->rc.aqMode,
+ CHECK(param->rc.aqMode < X265_AQ_NONE || X265_AQ_AUTO_VARIANCE_BIASED < param->rc.aqMode,
"Aq-Mode is out of range");
CHECK(param->rc.aqStrength < 0 || param->rc.aqStrength > 3,
"Aq-Strength is out of range");
diff -r be0ed447922c -r fb4eecc53e57 source/encoder/slicetype.cpp
--- a/source/encoder/slicetype.cpp Tue Jun 16 11:15:03 2015 +0530
+++ b/source/encoder/slicetype.cpp Wed Jun 17 12:02:33 2015 +0530
@@ -131,15 +131,16 @@
{
blockXY = 0;
double avg_adj_pow2 = 0, avg_adj = 0, qp_adj = 0;
- if (param->rc.aqMode == X265_AQ_AUTO_VARIANCE)
+ double bias_strength = 0.f;
+ if (param->rc.aqMode == X265_AQ_AUTO_VARIANCE || param->rc.aqMode == X265_AQ_AUTO_VARIANCE_BIASED)
{
- double bit_depth_correction = pow(1 << (X265_DEPTH - 8), 0.5);
+ double bit_depth_correction = 1.f / (1 << (2*(X265_DEPTH-8)));
for (blockY = 0; blockY < maxRow; blockY += 16)
{
for (blockX = 0; blockX < maxCol; blockX += 16)
{
uint32_t energy = acEnergyCu(curFrame, blockX, blockY, param->internalCsp);
- qp_adj = pow(energy + 1, 0.1);
+ qp_adj = pow(energy * bit_depth_correction + 1, 0.1);
curFrame->m_lowres.qpCuTreeOffset[blockXY] = qp_adj;
avg_adj += qp_adj;
avg_adj_pow2 += qp_adj * qp_adj;
@@ -149,8 +150,9 @@
avg_adj /= blockCount;
avg_adj_pow2 /= blockCount;
- strength = param->rc.aqStrength * avg_adj / bit_depth_correction;
- avg_adj = avg_adj - 0.5f * (avg_adj_pow2 - (11.f * bit_depth_correction)) / avg_adj;
+ strength = param->rc.aqStrength * avg_adj;
+ avg_adj = avg_adj - 0.5f * (avg_adj_pow2 - (11.f)) / avg_adj;
+ bias_strength = param->rc.aqStrength;
}
else
strength = param->rc.aqStrength * 1.0397f;
@@ -160,7 +162,12 @@
{
for (blockX = 0; blockX < maxCol; blockX += 16)
{
- if (param->rc.aqMode == X265_AQ_AUTO_VARIANCE)
+ if(param->rc.aqMode == X265_AQ_AUTO_VARIANCE_BIASED)
+ {
+ qp_adj = curFrame->m_lowres.qpCuTreeOffset[blockXY];
+ qp_adj = strength * (qp_adj - avg_adj) + bias_strength * (1.f - 11.f / (qp_adj * qp_adj));
+ }
+ else if (param->rc.aqMode == X265_AQ_AUTO_VARIANCE)
{
qp_adj = curFrame->m_lowres.qpCuTreeOffset[blockXY];
qp_adj = strength * (qp_adj - avg_adj);
diff -r be0ed447922c -r fb4eecc53e57 source/x265.h
--- a/source/x265.h Tue Jun 16 11:15:03 2015 +0530
+++ b/source/x265.h Wed Jun 17 12:02:33 2015 +0530
@@ -278,6 +278,7 @@
#define X265_AQ_NONE 0
#define X265_AQ_VARIANCE 1
#define X265_AQ_AUTO_VARIANCE 2
+#define X265_AQ_AUTO_VARIANCE_BIASED 3
/* NOTE! For this release only X265_CSP_I420 and X265_CSP_I444 are supported */
diff -r be0ed447922c -r fb4eecc53e57 source/x265cli.h
--- a/source/x265cli.h Tue Jun 16 11:15:03 2015 +0530
+++ b/source/x265cli.h Wed Jun 17 12:02:33 2015 +0530
@@ -360,7 +360,7 @@
H0(" --[no-]strict-cbr Enable stricter conditions and tolerance for bitrate deviations in CBR mode. Default %s\n", OPT(param->rc.bStrictCbr));
H0(" --analysis-mode <string|int> save - Dump analysis info into file, load - Load analysis buffers from the file. Default %d\n", param->analysisMode);
H0(" --analysis-file <filename> Specify file name used for either dumping or reading analysis data.\n");
- H0(" --aq-mode <integer> Mode for Adaptive Quantization - 0:none 1:uniform AQ 2:auto variance. Default %d\n", param->rc.aqMode);
+ H0(" --aq-mode <integer> Mode for Adaptive Quantization - 0:none 1:uniform AQ 2:auto variance 3:auto variance with bias to dark scenes. Default %d\n", param->rc.aqMode);
H0(" --aq-strength <float> Reduces blocking and blurring in flat and textured areas (0 to 3.0). Default %.2f\n", param->rc.aqStrength);
H0(" --qg-size <int> Specifies the size of the quantization group (64, 32, 16). Default %d\n", param->rc.qgSize);
H0(" --[no-]cutree Enable cutree for Adaptive Quantization. Default %s\n", OPT(param->rc.cuTree));
More information about the x265-devel
mailing list