Change in datatype of cfl_alpha in mb_mode_info
Changed datatype of 'cfl_alpha_idx' and 'cfl_alpha_signs'
from int to uint8_t and int8_t respectively.
Observed memory footprint reduction with no impact on
encoder/decoder performance.
Stream cpu-used Encoder Decoder
BasketballDrill_832x480 1 ~0.2% ~1.2%
parkrun_720p50 3 ~0.2% ~1.4%
Change-Id: Ibcec85fb7d9cce41b4d9da43af91c0e917de4748
diff --git a/av1/common/blockd.h b/av1/common/blockd.h
index ad97d50..0bbeb94 100644
--- a/av1/common/blockd.h
+++ b/av1/common/blockd.h
@@ -227,11 +227,6 @@
int mi_row;
int mi_col;
#endif
- // Index of the alpha Cb and alpha Cr combination
- int cfl_alpha_idx;
- // Joint sign of alpha Cb and alpha Cr
- int cfl_alpha_signs;
-
#if CONFIG_INSPECTION
int16_t tx_skip[TXK_TYPE_BUF_LEN];
#endif
@@ -261,6 +256,10 @@
int8_t angle_delta[PLANE_TYPES];
/* deringing gain *per-superblock* */
int8_t cdef_strength;
+ // Joint sign of alpha Cb and alpha Cr
+ int8_t cfl_alpha_signs;
+ // Index of the alpha Cb and alpha Cr combination
+ uint8_t cfl_alpha_idx;
uint8_t ref_mv_idx;
// Indicate if masked compound is used(1) or not(0).
uint8_t comp_group_idx;
diff --git a/av1/common/cfl.c b/av1/common/cfl.c
index f65e002..5d449a3 100644
--- a/av1/common/cfl.c
+++ b/av1/common/cfl.c
@@ -136,7 +136,7 @@
CFL_SUB_AVG_FN(c)
-static INLINE int cfl_idx_to_alpha(int alpha_idx, int joint_sign,
+static INLINE int cfl_idx_to_alpha(uint8_t alpha_idx, int8_t joint_sign,
CFL_PRED_TYPE pred_type) {
const int alpha_sign = (pred_type == CFL_PRED_U) ? CFL_SIGN_U(joint_sign)
: CFL_SIGN_V(joint_sign);
diff --git a/av1/decoder/decodemv.c b/av1/decoder/decodemv.c
index f8502fa..3880d54 100644
--- a/av1/decoder/decodemv.c
+++ b/av1/decoder/decodemv.c
@@ -129,20 +129,20 @@
return uv_mode;
}
-static int read_cfl_alphas(FRAME_CONTEXT *const ec_ctx, aom_reader *r,
- int *signs_out) {
- const int joint_sign =
+static uint8_t read_cfl_alphas(FRAME_CONTEXT *const ec_ctx, aom_reader *r,
+ int8_t *signs_out) {
+ const int8_t joint_sign =
aom_read_symbol(r, ec_ctx->cfl_sign_cdf, CFL_JOINT_SIGNS, "cfl:signs");
- int idx = 0;
+ uint8_t idx = 0;
// Magnitudes are only coded for nonzero values
if (CFL_SIGN_U(joint_sign) != CFL_SIGN_ZERO) {
aom_cdf_prob *cdf_u = ec_ctx->cfl_alpha_cdf[CFL_CONTEXT_U(joint_sign)];
- idx = aom_read_symbol(r, cdf_u, CFL_ALPHABET_SIZE, "cfl:alpha_u")
+ idx = (uint8_t)aom_read_symbol(r, cdf_u, CFL_ALPHABET_SIZE, "cfl:alpha_u")
<< CFL_ALPHABET_SIZE_LOG2;
}
if (CFL_SIGN_V(joint_sign) != CFL_SIGN_ZERO) {
aom_cdf_prob *cdf_v = ec_ctx->cfl_alpha_cdf[CFL_CONTEXT_V(joint_sign)];
- idx += aom_read_symbol(r, cdf_v, CFL_ALPHABET_SIZE, "cfl:alpha_v");
+ idx += (uint8_t)aom_read_symbol(r, cdf_v, CFL_ALPHABET_SIZE, "cfl:alpha_v");
}
*signs_out = joint_sign;
return idx;
diff --git a/av1/encoder/bitstream.c b/av1/encoder/bitstream.c
index 87bc72a..9c0567a 100644
--- a/av1/encoder/bitstream.c
+++ b/av1/encoder/bitstream.c
@@ -857,8 +857,8 @@
UV_INTRA_MODES - !cfl_allowed);
}
-static void write_cfl_alphas(FRAME_CONTEXT *const ec_ctx, int idx,
- int joint_sign, aom_writer *w) {
+static void write_cfl_alphas(FRAME_CONTEXT *const ec_ctx, uint8_t idx,
+ int8_t joint_sign, aom_writer *w) {
aom_write_symbol(w, joint_sign, ec_ctx->cfl_sign_cdf, CFL_JOINT_SIGNS);
// Magnitudes are only signaled for nonzero codes.
if (CFL_SIGN_U(joint_sign) != CFL_SIGN_ZERO) {
diff --git a/av1/encoder/encodeframe.c b/av1/encoder/encodeframe.c
index b1ffe87..f840032 100644
--- a/av1/encoder/encodeframe.c
+++ b/av1/encoder/encodeframe.c
@@ -875,8 +875,8 @@
UV_INTRA_MODES - !cfl_allowed);
}
if (uv_mode == UV_CFL_PRED) {
- const int joint_sign = mbmi->cfl_alpha_signs;
- const int idx = mbmi->cfl_alpha_idx;
+ const int8_t joint_sign = mbmi->cfl_alpha_signs;
+ const uint8_t idx = mbmi->cfl_alpha_idx;
#if CONFIG_ENTROPY_STATS
++counts->cfl_sign[joint_sign];
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c
index dc21f40..be1ebb0 100644
--- a/av1/encoder/rdopt.c
+++ b/av1/encoder/rdopt.c
@@ -6229,7 +6229,8 @@
// Collect RD stats for an alpha value of zero in this plane.
// Skip i == CFL_SIGN_ZERO as (0, 0) is invalid.
for (int i = CFL_SIGN_NEG; i < CFL_SIGNS; i++) {
- const int joint_sign = PLANE_SIGN_TO_JOINT_SIGN(plane, CFL_SIGN_ZERO, i);
+ const int8_t joint_sign =
+ PLANE_SIGN_TO_JOINT_SIGN(plane, CFL_SIGN_ZERO, i);
if (i == CFL_SIGN_NEG) {
mbmi->cfl_alpha_idx = 0;
mbmi->cfl_alpha_signs = joint_sign;
@@ -6246,7 +6247,7 @@
}
}
- int best_joint_sign = -1;
+ int8_t best_joint_sign = -1;
for (int plane = 0; plane < CFL_PRED_PLANES; plane++) {
for (int pn_sign = CFL_SIGN_NEG; pn_sign < CFL_SIGNS; pn_sign++) {
@@ -6257,7 +6258,7 @@
if (c > 2 && progress < c) break;
av1_init_rd_stats(&rd_stats);
for (int i = 0; i < CFL_SIGNS; i++) {
- const int joint_sign = PLANE_SIGN_TO_JOINT_SIGN(plane, pn_sign, i);
+ const int8_t joint_sign = PLANE_SIGN_TO_JOINT_SIGN(plane, pn_sign, i);
if (i == 0) {
mbmi->cfl_alpha_idx = (c << CFL_ALPHABET_SIZE_LOG2) + c;
mbmi->cfl_alpha_signs = joint_sign;
@@ -6288,7 +6289,7 @@
}
int best_rate_overhead = INT_MAX;
- int ind = 0;
+ uint8_t ind = 0;
if (best_joint_sign >= 0) {
const int u = best_c[best_joint_sign][CFL_PRED_U];
const int v = best_c[best_joint_sign][CFL_PRED_V];