Disable delta_q frame level if not used in frame
If delta_q is on, but not a sinlge non-zero value has been used in
a frame, reset the delta_q_present flag to 0, in order to save
bits.
Change-Id: I4a67f09f6823dcd877d99c0a9c831bbd5a0c7173
diff --git a/av1/encoder/bitstream.c b/av1/encoder/bitstream.c
index f80f46b..8fceb56 100644
--- a/av1/encoder/bitstream.c
+++ b/av1/encoder/bitstream.c
@@ -3757,6 +3757,11 @@
const uint8_t obu_extension_header =
cm->temporal_layer_id << 5 | cm->spatial_layer_id << 3 | 0;
+ // If no non-zero delta_q has been used, reset delta_q_present_flag
+ if (cm->delta_q_info.delta_q_present_flag && cpi->delta_q_used == 0) {
+ cm->delta_q_info.delta_q_present_flag = 0;
+ }
+
#if CONFIG_BITSTREAM_DEBUG
bitstream_queue_reset_write();
#endif
diff --git a/av1/encoder/encodeframe.c b/av1/encoder/encodeframe.c
index 1c4ef21..a8f299e 100644
--- a/av1/encoder/encodeframe.c
+++ b/av1/encoder/encodeframe.c
@@ -3854,6 +3854,9 @@
av1_init_plane_quantizers(cpi, x, xd->mi[0]->segment_id);
x->rdmult = set_deltaq_rdmult(cpi, xd);
+ // keep track of any non-zero delta-q used
+ cpi->delta_q_used |= (xd->delta_qindex != 0);
+
if (cpi->oxcf.deltaq_mode != NO_DELTA_Q && cpi->oxcf.deltalf_mode) {
const int lfmask = ~(delta_q_info->delta_lf_res - 1);
const int delta_lf_from_base =
@@ -4925,9 +4928,13 @@
// Set delta_q_present_flag before it is used for the first time
cm->delta_q_info.delta_lf_res = DEFAULT_DELTA_LF_RES;
cm->delta_q_info.delta_q_present_flag = cpi->oxcf.deltaq_mode != NO_DELTA_Q;
+ // Reset delta_q_used flag
+ cpi->delta_q_used = 0;
+
cm->delta_q_info.delta_lf_present_flag =
cpi->oxcf.deltaq_mode != NO_DELTA_Q && cpi->oxcf.deltalf_mode;
cm->delta_q_info.delta_lf_multi = DEFAULT_DELTA_LF_MULTI;
+
// update delta_q_present_flag and delta_lf_present_flag based on
// base_qindex
cm->delta_q_info.delta_q_present_flag &= cm->base_qindex > 0;
diff --git a/av1/encoder/encoder.h b/av1/encoder/encoder.h
index cf4f021..95d1ddf 100644
--- a/av1/encoder/encoder.h
+++ b/av1/encoder/encoder.h
@@ -1005,6 +1005,9 @@
// Count the number of OBU_FRAME and OBU_FRAME_HEADER for level calculation.
int frame_header_count;
FrameWindowBuffer frame_window_buffer;
+
+ // whether any no-zero delta_q was actually used
+ int delta_q_used;
} AV1_COMP;
typedef struct {