Calculate decode and display rate in decoder model

BUG=aomedia:2332

Change-Id: Ia6d640fc1190eaa4839653452b25f79fcad09e6e
diff --git a/av1/encoder/level.c b/av1/encoder/level.c
index 7ca465d..184c977 100644
--- a/av1/encoder/level.c
+++ b/av1/encoder/level.c
@@ -473,6 +473,13 @@
   decoder_model->last_bit_arrival_time = 0.0;
   decoder_model->coded_bits = 0;
 
+  decoder_model->removal_time = INVALID_TIME;
+  decoder_model->presentation_time = INVALID_TIME;
+  decoder_model->decode_samples = 0;
+  decoder_model->display_samples = 0;
+  decoder_model->max_decode_rate = 0.0;
+  decoder_model->max_display_rate = 0.0;
+
   decoder_model->num_frame = -1;
   decoder_model->num_decoded_frame = -1;
   decoder_model->num_shown_frame = -1;
@@ -510,6 +517,7 @@
   aom_clear_system_state();
 
   const AV1_COMMON *const cm = &cpi->common;
+  const int luma_pic_size = cm->superres_upscaled_width * cm->height;
   const int show_existing_frame = cm->show_existing_frame;
   const int show_frame = cm->show_frame || show_existing_frame;
   ++decoder_model->num_frame;
@@ -534,6 +542,16 @@
       return;
     }
 
+    const int previous_decode_samples = decoder_model->decode_samples;
+    const double previous_removal_time = decoder_model->removal_time;
+    assert(previous_removal_time < removal_time);
+    decoder_model->removal_time = removal_time;
+    decoder_model->decode_samples = luma_pic_size;
+    const double this_decode_rate =
+        previous_decode_samples / (removal_time - previous_removal_time);
+    decoder_model->max_decode_rate =
+        AOMMAX(decoder_model->max_decode_rate, this_decode_rate);
+
     // A frame with show_existing_frame being false indicates the end of a DFG.
     // Update the bits arrival time of this DFG.
     const double buffer_delay = (decoder_model->encoder_buffer_delay +
@@ -638,6 +656,19 @@
       decoder_model->status = DISPLAY_FRAME_LATE;
       return;
     }
+
+    const int previous_display_samples = decoder_model->display_samples;
+    const double previous_presentation_time = decoder_model->presentation_time;
+    decoder_model->display_samples = luma_pic_size;
+    decoder_model->presentation_time = presentation_time;
+    if (presentation_time >= 0.0 && previous_presentation_time >= 0.0) {
+      assert(previous_presentation_time < presentation_time);
+      const double this_display_rate =
+          previous_display_samples /
+          (presentation_time - previous_presentation_time);
+      decoder_model->max_display_rate =
+          AOMMAX(decoder_model->max_display_rate, this_display_rate);
+    }
   }
 }
 
diff --git a/av1/encoder/level.h b/av1/encoder/level.h
index 1bdd357..d8964a4 100644
--- a/av1/encoder/level.h
+++ b/av1/encoder/level.h
@@ -136,6 +136,15 @@
   double first_bit_arrival_time;
   double last_bit_arrival_time;
   size_t coded_bits;
+
+  // Information for the frame being processed.
+  double removal_time;
+  double presentation_time;
+  int decode_samples;
+  int display_samples;
+
+  double max_display_rate;
+  double max_decode_rate;
 } DECODER_MODEL;
 
 typedef struct {