Implement av1_get_seq_level_idx()

BUG=aomedia:2332

Change-Id: I6b98b910bcf1618487b7c63bf71e714bf5c52854
diff --git a/av1/encoder/level.c b/av1/encoder/level.c
index 0527969..5e49ec0 100644
--- a/av1/encoder/level.c
+++ b/av1/encoder/level.c
@@ -569,10 +569,30 @@
 }
 
 aom_codec_err_t av1_get_seq_level_idx(const AV1_COMP *cpi, int *seq_level_idx) {
-  // TODO(chiyotsai@, kyslov@, huisu@): put in real implementations.
-  (void)cpi;
-  for (int i = 0; i < MAX_NUM_OPERATING_POINTS; ++i) {
-    seq_level_idx[i] = (int)SEQ_LEVEL_MAX;
+  const SequenceHeader *const seq_params = &cpi->common.seq_params;
+  if (!cpi->keep_level_stats) {
+    for (int op = 0; op < seq_params->operating_points_cnt_minus_1 + 1; ++op) {
+      seq_level_idx[op] = (int)SEQ_LEVEL_MAX;
+    }
+    return AOM_CODEC_OK;
+  }
+
+  const int is_still_picture = seq_params->still_picture;
+  for (int op = 0; op < seq_params->operating_points_cnt_minus_1 + 1; ++op) {
+    seq_level_idx[op] = (int)SEQ_LEVEL_MAX;
+    const int tier = seq_params->tier[op];
+    const AV1LevelInfo *const level_info = &cpi->level_info[op];
+    const AV1LevelStats *const level_stats = &level_info->level_stats;
+    const AV1LevelSpec *const level_spec = &level_info->level_spec;
+    for (int level = 0; level < SEQ_LEVELS; ++level) {
+      const AV1LevelSpec *const target_level_spec = av1_level_defs + level;
+      const TARGET_LEVEL_FAIL_ID fail_id = check_level_constraints(
+          target_level_spec, level_spec, level_stats, tier, is_still_picture);
+      if (fail_id == TARGET_LEVEL_OK) {
+        seq_level_idx[op] = level;
+        break;
+      }
+    }
   }
 
   return AOM_CODEC_OK;