Don't read chroma delta_lflevels in mono mode
There are 4 delta_lflevels (FRAME_LF_COUNT=4), corresponding to 2 for the luma
plane and 1 for each of the U and V planes. In monochrome mode we do not need
to use/encode/decode the last two values, and so in this case the for loops all
terminate at FRAME_LF_COUNT - 2 rather than FRAME_LF_COUNT.
BUG=aomedia:1410
Change-Id: Ieb60cce9e39287a385e7f74d9009aac1f0f23e54
diff --git a/av1/encoder/bitstream.c b/av1/encoder/bitstream.c
index 050f8c0..95e576d 100644
--- a/av1/encoder/bitstream.c
+++ b/av1/encoder/bitstream.c
@@ -346,7 +346,8 @@
#if CONFIG_LOOPFILTER_LEVEL
if (cm->delta_lf_multi) {
- assert(lf_id >= 0 && lf_id < FRAME_LF_COUNT);
+ assert(lf_id >= 0 && lf_id < (av1_num_planes(cm) > 1 ? FRAME_LF_COUNT
+ : FRAME_LF_COUNT - 2));
aom_write_symbol(w, AOMMIN(abs, DELTA_LF_SMALL),
ec_ctx->delta_lf_multi_cdf[lf_id], DELTA_LF_PROBS + 1);
} else {
@@ -1120,7 +1121,9 @@
#if CONFIG_LOOPFILTER_LEVEL
if (cm->delta_lf_present_flag) {
if (cm->delta_lf_multi) {
- for (int lf_id = 0; lf_id < FRAME_LF_COUNT; ++lf_id) {
+ const int frame_lf_count =
+ av1_num_planes(cm) > 1 ? FRAME_LF_COUNT : FRAME_LF_COUNT - 2;
+ for (int lf_id = 0; lf_id < frame_lf_count; ++lf_id) {
int reduced_delta_lflevel =
(mbmi->curr_delta_lf[lf_id] - xd->prev_delta_lf[lf_id]) /
cm->delta_lf_res;
@@ -1463,7 +1466,9 @@
#if CONFIG_LOOPFILTER_LEVEL
if (cm->delta_lf_present_flag) {
if (cm->delta_lf_multi) {
- for (int lf_id = 0; lf_id < FRAME_LF_COUNT; ++lf_id) {
+ const int frame_lf_count =
+ av1_num_planes(cm) > 1 ? FRAME_LF_COUNT : FRAME_LF_COUNT - 2;
+ for (int lf_id = 0; lf_id < frame_lf_count; ++lf_id) {
int reduced_delta_lflevel =
(mbmi->curr_delta_lf[lf_id] - xd->prev_delta_lf[lf_id]) /
cm->delta_lf_res;
@@ -2035,7 +2040,9 @@
#if CONFIG_EXT_DELTA_Q
if (cpi->common.delta_lf_present_flag) {
#if CONFIG_LOOPFILTER_LEVEL
- for (int lf_id = 0; lf_id < FRAME_LF_COUNT; ++lf_id)
+ const int frame_lf_count =
+ av1_num_planes(cm) > 1 ? FRAME_LF_COUNT : FRAME_LF_COUNT - 2;
+ for (int lf_id = 0; lf_id < frame_lf_count; ++lf_id)
xd->prev_delta_lf[lf_id] = 0;
#endif // CONFIG_LOOPFILTER_LEVEL
xd->prev_delta_lf_from_base = 0;
@@ -3789,7 +3796,9 @@
xd->prev_delta_lf_from_base = 0;
#if CONFIG_LOOPFILTER_LEVEL
aom_wb_write_bit(wb, cm->delta_lf_multi);
- for (int lf_id = 0; lf_id < FRAME_LF_COUNT; ++lf_id)
+ const int frame_lf_count =
+ av1_num_planes(cm) > 1 ? FRAME_LF_COUNT : FRAME_LF_COUNT - 2;
+ for (int lf_id = 0; lf_id < frame_lf_count; ++lf_id)
xd->prev_delta_lf[lf_id] = 0;
#endif // CONFIG_LOOPFILTER_LEVEL
}
@@ -4202,7 +4211,9 @@
xd->prev_delta_lf_from_base = 0;
#if CONFIG_LOOPFILTER_LEVEL
aom_wb_write_bit(wb, cm->delta_lf_multi);
- for (int lf_id = 0; lf_id < FRAME_LF_COUNT; ++lf_id)
+ const int frame_lf_count =
+ av1_num_planes(cm) > 1 ? FRAME_LF_COUNT : FRAME_LF_COUNT - 2;
+ for (int lf_id = 0; lf_id < frame_lf_count; ++lf_id)
xd->prev_delta_lf[lf_id] = 0;
#endif // CONFIG_LOOPFILTER_LEVEL
}