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