[NORMATIVE] Add tier signaling

BUG=aomedia:1861

Change-Id: I8e376fb39f2a6c3abe82865e3b02366dc087e5c6
diff --git a/av1/av1_dx_iface.c b/av1/av1_dx_iface.c
index e361eb5..98ecf89 100644
--- a/av1/av1_dx_iface.c
+++ b/av1/av1_dx_iface.c
@@ -168,7 +168,8 @@
       int operating_point_idc;
       operating_point_idc = aom_rb_read_literal(rb, OP_POINTS_IDC_BITS);
       if (i == 0) operating_point_idc0 = operating_point_idc;
-      aom_rb_read_literal(rb, LEVEL_BITS);  // level
+      int seq_level_idx = aom_rb_read_literal(rb, LEVEL_BITS);  // level
+      if (seq_level_idx > 7) aom_rb_read_bit(rb);               // tier
 #if !CONFIG_BUFFER_MODEL
       if (aom_rb_read_literal(rb,
                               1)) {   // decoder_rate_model_param_present_flag
diff --git a/av1/common/onyxc_int.h b/av1/common/onyxc_int.h
index d08a2a1..fa8620f 100644
--- a/av1/common/onyxc_int.h
+++ b/av1/common/onyxc_int.h
@@ -232,6 +232,7 @@
   int enable_restoration;  // To turn on/off loop restoration
   int operating_point_idc[MAX_NUM_OPERATING_POINTS];
   BitstreamLevel level[MAX_NUM_OPERATING_POINTS];
+  int tier[MAX_NUM_OPERATING_POINTS];
   int decoder_rate_model_param_present_flag[MAX_NUM_OPERATING_POINTS];
 #if !CONFIG_BUFFER_MODEL
   int decode_to_display_rate_ratio[MAX_NUM_OPERATING_POINTS];
diff --git a/av1/decoder/obu.c b/av1/decoder/obu.c
index 4ffc859..b40ddfb 100644
--- a/av1/decoder/obu.c
+++ b/av1/decoder/obu.c
@@ -170,6 +170,10 @@
           aom_rb_read_literal(rb, OP_POINTS_IDC_BITS);
       if (!read_bitstream_level(&seq_params->level[i], rb))
         return AOM_CODEC_UNSUP_BITSTREAM;
+      if (seq_params->level[i].major > 3)
+        seq_params->tier[i] = aom_rb_read_bit(rb);
+      else
+        seq_params->tier[i] = 0;
 #if !CONFIG_BUFFER_MODEL
       seq_params->decoder_rate_model_param_present_flag[i] =
           aom_rb_read_literal(rb, 1);
diff --git a/av1/encoder/bitstream.c b/av1/encoder/bitstream.c
index 4deb4ce..f4f65d7 100644
--- a/av1/encoder/bitstream.c
+++ b/av1/encoder/bitstream.c
@@ -3584,6 +3584,8 @@
       aom_wb_write_literal(&wb, cm->seq_params.operating_point_idc[i],
                            OP_POINTS_IDC_BITS);
       write_bitstream_level(cm->seq_params.level[i], &wb);
+      if (cm->seq_params.level[i].major > 3)
+        aom_wb_write_bit(&wb, cm->seq_params.tier[i]);
 #if !CONFIG_BUFFER_MODEL
       aom_wb_write_literal(&wb, 0, 1);  // decoder_rate_model_present_flag[i]
 #endif
diff --git a/av1/encoder/encoder.c b/av1/encoder/encoder.c
index 304091c..d22db4d 100644
--- a/av1/encoder/encoder.c
+++ b/av1/encoder/encoder.c
@@ -908,8 +908,8 @@
          height <= lvl_height * lvl_dim_mult;
 }
 
-static void set_bitstream_level(SequenceHeader *seq,
-                                const AV1EncoderConfig *oxcf) {
+static void set_bitstream_level_tier(SequenceHeader *seq,
+                                     const AV1EncoderConfig *oxcf) {
   // TODO(any): This is a placeholder function that only addresses dimensions
   // and max display sample rates.
   // Need to add checks for max bit rate, max decoded luma sample rate, header
@@ -979,6 +979,7 @@
   }
   for (int i = 0; i < MAX_NUM_OPERATING_POINTS; ++i) {
     seq->level[i] = bl;
+    seq->tier[i] = 0;  // setting main tier by default
   }
 }
 
@@ -1013,7 +1014,7 @@
   seq->enable_intra_edge_filter = 1;
   seq->enable_filter_intra = 1;
 
-  set_bitstream_level(seq, oxcf);
+  set_bitstream_level_tier(seq, oxcf);
 }
 
 static void init_config(struct AV1_COMP *cpi, AV1EncoderConfig *oxcf) {