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 {