<div dir="ltr"># HG changeset patch<br># User Niranjan <<a href="mailto:niranjan@multicorewareinc.com">niranjan@multicorewareinc.com</a>><br># Date 1582528901 -19800<br>#      Mon Feb 24 12:51:41 2020 +0530<br># Node ID 1a47c3802fa38bdb4606e3d8203b73b4474d1ce6<br># Parent  30eb4de83092bddcb4497a47bc9d2211dfb69cfc<br>Add: aq-mode 5<br><br>This patch does the following:<br>Add AQ mode 5 which is suitable for frames with dark edge content.<br><br>diff -r 30eb4de83092 -r 1a47c3802fa3 doc/reST/cli.rst<br>--- a/doc/reST/cli.rst Wed Jan 29 12:19:07 2020 +0530<br>+++ b/doc/reST/cli.rst  Mon Feb 24 12:51:41 2020 +0530<br>@@ -1703,7 +1703,7 @@<br>        ignored. Slower presets will generally achieve better compression<br>    efficiency (and generate smaller bitstreams). Default disabled.<br> <br>-.. option:: --aq-mode <0|1|2|3|4><br>+.. option:: --aq-mode <0|1|2|3|4|5><br> <br>        Adaptive Quantization operating mode. Raise or lower per-block<br>       quantization based on complexity analysis of the source image. The<br>@@ -1711,13 +1711,15 @@<br>  the tendency of the encoder to spend too many bits on complex areas<br>  and not enough in flat areas.<br> <br>-    0. disabled<br>-  1. AQ enabled <br>-       2. AQ enabled with auto-variance **(default)**<br>+       0. disabled.<br>+ 1. Uniform AQ. <br>+      2. AQ enabled with auto-variance **(default)**.<br>      3. AQ enabled with auto-variance and bias to dark scenes. This is <br>   recommended for 8-bit encodes or low-bitrate 10-bit encodes, to <br>     prevent color banding/blocking. <br>     4. AQ enabled with auto-variance and edge information.<br>+       5. Same as AQ mode 3, but uses edge density instead of auto-variance.<br>+        i.e, AQ with bias towards dark scenes which have high edge density.<br> <br> .. option:: --aq-strength <float><br> <br>diff -r 30eb4de83092 -r 1a47c3802fa3 source/common/frame.cpp<br>--- a/source/common/frame.cpp     Wed Jan 29 12:19:07 2020 +0530<br>+++ b/source/common/frame.cpp   Mon Feb 24 12:51:41 2020 +0530<br>@@ -103,7 +103,7 @@<br>         CHECKED_MALLOC_ZERO(m_classifyCount, uint32_t, size);<br>     }<br> <br>-    if (param->rc.aqMode == X265_AQ_EDGE || (param->rc.zonefileCount && param->rc.aqMode != 0))<br>+    if (param->rc.aqMode == X265_AQ_EDGE || param->rc.aqMode == X265_AQ_EDGE_BIASED || (param->rc.zonefileCount && param->rc.aqMode != 0))<br>     {<br>         uint32_t numCuInWidth = (param->sourceWidth + param->maxCUSize - 1) / param->maxCUSize;<br>         uint32_t numCuInHeight = (param->sourceHeight + param->maxCUSize - 1) / param->maxCUSize;<br>@@ -276,12 +276,9 @@<br>         X265_FREE_ZERO(m_classifyCount);<br>     }<br> <br>-    if (m_param->rc.aqMode == X265_AQ_EDGE || (m_param->rc.zonefileCount && m_param->rc.aqMode != 0))<br>-    {<br>         X265_FREE(m_edgePic);<br>         X265_FREE(m_gaussianPic);<br>         X265_FREE(m_thetaPic);<br>-    }<br> <br>     if (m_param->enableRecursionSkip >= EDGE_BASED_RSKIP)<br>     {<br>diff -r 30eb4de83092 -r 1a47c3802fa3 source/common/param.cpp<br>--- a/source/common/param.cpp   Wed Jan 29 12:19:07 2020 +0530<br>+++ b/source/common/param.cpp   Mon Feb 24 12:51:41 2020 +0530<br>@@ -1619,7 +1619,7 @@<br>           "Lookahead depth must be less than 256");<br>     CHECK(param->lookaheadSlices > 16 || param->lookaheadSlices < 0,<br>           "Lookahead slices must between 0 and 16");<br>-    CHECK(param->rc.aqMode < X265_AQ_NONE || X265_AQ_EDGE < param->rc.aqMode,<br>+    CHECK(param->rc.aqMode < X265_AQ_NONE || param->rc.aqMode > X265_AQ_EDGE_BIASED,<br>           "Aq-Mode is out of range");<br>     CHECK(param->rc.aqStrength < 0 || param->rc.aqStrength > 3,<br>           "Aq-Strength is out of range");<br>diff -r 30eb4de83092 -r 1a47c3802fa3 source/encoder/slicetype.cpp<br>--- a/source/encoder/slicetype.cpp Wed Jan 29 12:19:07 2020 +0530<br>+++ b/source/encoder/slicetype.cpp      Mon Feb 24 12:51:41 2020 +0530<br>@@ -516,7 +516,7 @@<br>                 double bias_strength = 0.f;<br>                 double strength = 0.f;<br> <br>-                if (param->rc.aqMode == X265_AQ_EDGE)<br>+                if (param->rc.aqMode == X265_AQ_EDGE || param->rc.aqMode == X265_AQ_EDGE_BIASED)<br>                     edgeFilter(curFrame, param);<br> <br>                 if (param->rc.aqMode == X265_AQ_EDGE && !param->bHistBasedSceneCut && param->enableRecursionSkip >= EDGE_BASED_RSKIP)<br>@@ -526,7 +526,8 @@<br>                         curFrame->m_fencPic->m_stride, curFrame->m_fencPic->m_picWidth, curFrame->m_fencPic->m_picHeight, SHIFT_TO_BITPLANE);<br>                 }<br> <br>-                if (param->rc.aqMode == X265_AQ_AUTO_VARIANCE || param->rc.aqMode == X265_AQ_AUTO_VARIANCE_BIASED || param->rc.aqMode == X265_AQ_EDGE)<br>+                if (param->rc.aqMode == X265_AQ_AUTO_VARIANCE || param->rc.aqMode == X265_AQ_AUTO_VARIANCE_BIASED ||<br>+                    param->rc.aqMode == X265_AQ_EDGE || param->rc.aqMode == X265_AQ_EDGE_BIASED)<br>                 {<br>                     double bit_depth_correction = 1.f / (1 << (2 * (X265_DEPTH - 8)));<br>                     for (int blockY = 0; blockY < maxRow; blockY += loopIncr)<br>@@ -535,7 +536,7 @@<br>                         {<br>                             uint32_t energy, edgeDensity, avgAngle;<br>                             energy = acEnergyCu(curFrame, blockX, blockY, param->internalCsp, param->rc.qgSize);<br>-                            if (param->rc.aqMode == X265_AQ_EDGE)<br>+                            if (param->rc.aqMode == X265_AQ_EDGE || param->rc.aqMode == X265_AQ_EDGE_BIASED)<br>                             {<br>                                 edgeDensity = edgeDensityCu(curFrame, avgAngle, blockX, blockY, param->rc.qgSize);<br>                                 if (edgeDensity)<br>@@ -594,6 +595,15 @@<br>                             else<br>                                 qp_adj = strength * (qp_adj - avg_adj);<br>                         }<br>+                        else if (param->rc.aqMode == X265_AQ_EDGE_BIASED)<br>+                        {<br>+                            inclinedEdge = curFrame->m_lowres.edgeInclined[blockXY];<br>+                            qp_adj = curFrame->m_lowres.qpCuTreeOffset[blockXY];<br>+                            if (inclinedEdge && (qp_adj - avg_adj > 0))<br>+                                qp_adj = ((strength + AQ_EDGE_BIAS) * (qp_adj - avg_adj)) + bias_strength * (1.f - modeTwoConst / (qp_adj * qp_adj));<br>+                            else<br>+                                qp_adj = strength * (qp_adj - avg_adj) + bias_strength * (1.f - modeTwoConst / (qp_adj * qp_adj));<br>+                        }<br>                         else<br>                         {<br>                             uint32_t energy = acEnergyCu(curFrame, blockX, blockY, param->internalCsp, param->rc.qgSize);<br>diff -r 30eb4de83092 -r 1a47c3802fa3 source/test/regression-tests.txt<br>--- a/source/test/regression-tests.txt Wed Jan 29 12:19:07 2020 +0530<br>+++ b/source/test/regression-tests.txt  Mon Feb 24 12:51:41 2020 +0530<br>@@ -170,6 +170,7 @@<br> crowd_run_1080p50.yuv, --preset fast --ctu 64 --rskip 3 --rskip-edge-threshold 5 --aq-mode 4<br> crowd_run_1080p50.yuv, --preset slow --ctu 32 --rskip 3 --rskip-edge-threshold 5 --hist-scenecut --hist-threshold 0.1<br> crowd_run_1080p50.yuv, --preset slower --ctu 16 --rskip 3 --rskip-edge-threshold 5 --hist-scenecut --hist-threshold 0.1 --aq-mode 4<br>+sintel_trailer_2k_1920x1080_24.yuv, --preset medium --aq-mode 5<br>  <br> # Main12 intraCost overflow bug test<br> 720p50_parkrun_ter.y4m,--preset medium<br>diff -r 30eb4de83092 -r 1a47c3802fa3 source/x265.h<br>--- a/source/x265.h   Wed Jan 29 12:19:07 2020 +0530<br>+++ b/source/x265.h     Mon Feb 24 12:51:41 2020 +0530<br>@@ -574,6 +574,8 @@<br> #define X265_AQ_AUTO_VARIANCE        2<br> #define X265_AQ_AUTO_VARIANCE_BIASED 3<br> #define X265_AQ_EDGE                 4<br>+#define X265_AQ_EDGE_BIASED          5<br>+<br> #define x265_ADAPT_RD_STRENGTH   4<br> #define X265_REFINE_INTER_LEVELS 3<br> /* NOTE! For this release only X265_CSP_I420 and X265_CSP_I444 are supported */<br>diff -r 30eb4de83092 -r 1a47c3802fa3 source/x265cli.h<br>--- a/source/x265cli.h   Wed Jan 29 12:19:07 2020 +0530<br>+++ b/source/x265cli.h  Mon Feb 24 12:51:41 2020 +0530<br>@@ -582,7 +582,14 @@<br>         "                                    - 0 : Disabled.\n"<br>         "                                    - 1 : Store/Load ctu distortion to/from the file specified in analysis-save/load.\n"<br>         "                                Default 0 - Disabled\n");<br>-    H0("   --aq-mode <integer>           Mode for Adaptive Quantization - 0:none 1:uniform AQ 2:auto variance 3:auto variance with bias to dark scenes 4:auto variance with edge information. Default %d\n", param->rc.aqMode);<br>+    H0("   --aq-mode <integer>           Mode for Adaptive Quantization.\n"<br>+       "                                     - 0 : none.\n"<br>+       "                                     - 1 : uniform AQ.\n"<br>+       "                                     - 2 : auto variance.\n"<br>+       "                                     - 3 : auto variance with bias to dark scenes.\n"<br>+       "                                     - 4 : auto variance with edge density.\n"<br>+       "                                     - 5 : auto variance with edge density and bias towards dark scenes.\n"<br>+       "                                 Default %d\n", param->rc.aqMode);<br>     H0("   --[no-]hevc-aq                Mode for HEVC Adaptive Quantization. Default %s\n", OPT(param->rc.hevcAq));<br>     H0("   --aq-strength <float>         Reduces blocking and blurring in flat and textured areas (0 to 3.0). Default %.2f\n", param->rc.aqStrength);<br>     H0("   --qp-adaptation-range <float> Delta QP range by QP adaptation based on a psycho-visual model (1.0 to 6.0). Default %.2f\n", param->rc.qpAdaptationRange);<br><div><div dir="ltr" class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><div><div dir="ltr"><div dir="ltr"><div dir="ltr"><font color="#0c343d" face="verdana, sans-serif">Thanks & Regards</font><div><font color="#0c343d" face="verdana, sans-serif"><b>Niranjan Kumar B</b></font></div><div><font size="1" color="#0c343d" face="verdana, sans-serif">Video Codec Engineer </font></div><div><font size="1" color="#0c343d" face="verdana, sans-serif">Media & AI Analytics</font></div><div><font face="trebuchet ms, sans-serif" color="#0c343d">+91 958 511 1449</font></div><div><a href="https://multicorewareinc.com/" style="color:rgb(17,85,204)" target="_blank"><img src="https://docs.google.com/uc?export=download&id=1kc3RJu9M8bnIf6Xa5rUw2d-eEVUsPBE5&revid=0B7tw9XJBmynaemR1VUpQUi9DVytRVW5SVkRwVTFjb1hBMUcwPQ"></a></div></div></div></div></div></div></div></div></div>