Output decoder component timing information

Change-Id: I39bcc42daa5272c3a1d54e29e1cc4c77139c777c
diff --git a/av1/decoder/decodeframe.c b/av1/decoder/decodeframe.c
index a4b786e..d76b1b9 100644
--- a/av1/decoder/decodeframe.c
+++ b/av1/decoder/decodeframe.c
@@ -373,6 +373,9 @@
                                      int mi_col, aom_reader *r,
                                      PARTITION_TYPE partition,
                                      BLOCK_SIZE bsize) {
+#if CONFIG_COLLECT_COMPONENT_TIMING
+  start_timing(pbi, decode_mbmi_block_time);
+#endif
   AV1_COMMON *const cm = &pbi->common;
   const SequenceHeader *const seq_params = cm->seq_params;
   const int bw = mi_size_wide[bsize];
@@ -396,6 +399,9 @@
       aom_internal_error(xd->error_info, AOM_CODEC_CORRUPT_FRAME,
                          "Invalid block size.");
   }
+#if CONFIG_COLLECT_COMPONENT_TIMING
+  end_timing(pbi, decode_mbmi_block_time);
+#endif
 }
 
 typedef struct PadBlock {
@@ -902,6 +908,9 @@
 static inline void decode_token_recon_block(AV1Decoder *const pbi,
                                             ThreadData *const td, aom_reader *r,
                                             BLOCK_SIZE bsize) {
+#if CONFIG_COLLECT_COMPONENT_TIMING
+  start_timing(pbi, decode_token_recon_block_time);
+#endif
   AV1_COMMON *const cm = &pbi->common;
   DecoderCodingBlock *const dcb = &td->dcb;
   MACROBLOCKD *const xd = &dcb->xd;
@@ -909,6 +918,9 @@
   MB_MODE_INFO *mbmi = xd->mi[0];
 
   if (!is_inter_block(mbmi)) {
+#if CONFIG_COLLECT_COMPONENT_TIMING
+    start_timing(pbi, decode_token_recon_block_intra_time);
+#endif
     int row, col;
     assert(bsize == get_plane_block_size(bsize, xd->plane[0].subsampling_x,
                                          xd->plane[0].subsampling_y));
@@ -948,8 +960,20 @@
         }
       }
     }
+#if CONFIG_COLLECT_COMPONENT_TIMING
+    end_timing(pbi, decode_token_recon_block_intra_time);
+#endif
   } else {
+#if CONFIG_COLLECT_COMPONENT_TIMING
+    start_timing(pbi, decode_token_recon_block_inter_time);
+#endif
+#if CONFIG_COLLECT_COMPONENT_TIMING
+    start_timing(pbi, predict_inter_block_time);
+#endif
     td->predict_inter_block_visit(cm, dcb, bsize);
+#if CONFIG_COLLECT_COMPONENT_TIMING
+    end_timing(pbi, predict_inter_block_time);
+#endif
     // Reconstruction
     if (!mbmi->skip_txfm) {
       int eobtotal = 0;
@@ -994,9 +1018,15 @@
                  blk_row += bh_var_tx) {
               for (blk_col = col >> ss_x; blk_col < unit_width;
                    blk_col += bw_var_tx) {
+#if CONFIG_COLLECT_COMPONENT_TIMING
+                start_timing(pbi, decode_reconstruct_tx_inter_time);
+#endif
                 decode_reconstruct_tx(cm, td, r, mbmi, plane, plane_bsize,
                                       blk_row, blk_col, block, max_tx_size,
                                       &eobtotal);
+#if CONFIG_COLLECT_COMPONENT_TIMING
+                end_timing(pbi, decode_reconstruct_tx_inter_time);
+#endif
                 block += step;
               }
             }
@@ -1005,9 +1035,15 @@
       }
     }
     td->cfl_store_inter_block_visit(cm, xd);
+#if CONFIG_COLLECT_COMPONENT_TIMING
+    end_timing(pbi, decode_token_recon_block_inter_time);
+#endif
   }
 
   av1_visit_palette(pbi, xd, r, set_color_index_map_offset);
+#if CONFIG_COLLECT_COMPONENT_TIMING
+  end_timing(pbi, decode_token_recon_block_time);
+#endif
 }
 
 static inline void set_inter_tx_size(MB_MODE_INFO *mbmi, int stride_log2,
@@ -1128,6 +1164,9 @@
                                       int mi_col, aom_reader *r,
                                       PARTITION_TYPE partition,
                                       BLOCK_SIZE bsize) {
+#if CONFIG_COLLECT_COMPONENT_TIMING
+  start_timing(pbi, parse_decode_block_time);
+#endif
   DecoderCodingBlock *const dcb = &td->dcb;
   MACROBLOCKD *const xd = &dcb->xd;
   decode_mbmi_block(pbi, dcb, mi_row, mi_col, r, partition, bsize);
@@ -1180,6 +1219,9 @@
   if (mbmi->skip_txfm) av1_reset_entropy_context(xd, bsize, num_planes);
 
   decode_token_recon_block(pbi, td, r, bsize);
+#if CONFIG_COLLECT_COMPONENT_TIMING
+  end_timing(pbi, parse_decode_block_time);
+#endif
 }
 
 static inline void set_offsets_for_pred_and_recon(AV1Decoder *const pbi,
@@ -2718,6 +2760,9 @@
 
 static inline void decode_tile(AV1Decoder *pbi, ThreadData *const td,
                                int tile_row, int tile_col) {
+#if CONFIG_COLLECT_COMPONENT_TIMING
+  start_timing(pbi, decode_tile_time);
+#endif
   TileInfo tile_info;
 
   AV1_COMMON *const cm = &pbi->common;
@@ -2755,6 +2800,9 @@
   int corrupted =
       (check_trailing_bits_after_symbol_coder(td->bit_reader)) ? 1 : 0;
   aom_merge_corrupted_flag(&dcb->corrupted, corrupted);
+#if CONFIG_COLLECT_COMPONENT_TIMING
+  end_timing(pbi, decode_tile_time);
+#endif
 }
 
 static const uint8_t *decode_tiles(AV1Decoder *pbi, const uint8_t *data,
@@ -5288,6 +5336,9 @@
   if (initialize_flag) setup_frame_info(pbi);
   const int num_planes = av1_num_planes(cm);
 
+#if CONFIG_COLLECT_COMPONENT_TIMING
+  start_timing(pbi, decode_tiles_time);
+#endif
   if (pbi->max_threads > 1 && !(tiles->large_scale && !pbi->ext_tile_debug) &&
       pbi->row_mt)
     *p_data_end =
@@ -5297,6 +5348,9 @@
     *p_data_end = decode_tiles_mt(pbi, data, data_end, start_tile, end_tile);
   else
     *p_data_end = decode_tiles(pbi, data, data_end, start_tile, end_tile);
+#if CONFIG_COLLECT_COMPONENT_TIMING
+  end_timing(pbi, decode_tiles_time);
+#endif
 
   // If the bit stream is monochrome, set the U and V buffers to a constant.
   if (num_planes < 3) {
@@ -5312,11 +5366,17 @@
   av1_alloc_cdef_sync(cm, &pbi->cdef_sync, pbi->num_workers);
 
   if (!cm->features.allow_intrabc && !tiles->single_tile_decoding) {
+#if CONFIG_COLLECT_COMPONENT_TIMING
+    start_timing(pbi, av1_loop_filter_frame_time);
+#endif
     if (cm->lf.filter_level[0] || cm->lf.filter_level[1]) {
       av1_loop_filter_frame_mt(&cm->cur_frame->buf, cm, &pbi->dcb.xd, 0,
                                num_planes, 0, pbi->tile_workers,
                                pbi->num_workers, &pbi->lf_row_sync, 0);
     }
+#if CONFIG_COLLECT_COMPONENT_TIMING
+    end_timing(pbi, av1_loop_filter_frame_time);
+#endif
 
     const int do_cdef =
         !pbi->skip_loop_filter && !cm->features.coded_lossless &&
@@ -5331,6 +5391,10 @@
     // Frame border extension is not required in the decoder
     // as it happens in extend_mc_border().
     int do_extend_border_mt = 0;
+
+#if CONFIG_COLLECT_COMPONENT_TIMING
+    start_timing(pbi, cdef_and_lr_time);
+#endif
     if (!optimized_loop_restoration) {
       if (do_loop_restoration)
         av1_loop_restoration_save_boundary_lines(&pbi->common.cur_frame->buf,
@@ -5380,6 +5444,9 @@
         }
       }
     }
+#if CONFIG_COLLECT_COMPONENT_TIMING
+    end_timing(pbi, cdef_and_lr_time);
+#endif
   }
 
   if (!pbi->dcb.corrupted) {
diff --git a/av1/decoder/decoder.h b/av1/decoder/decoder.h
index b95d00e..67049d8 100644
--- a/av1/decoder/decoder.h
+++ b/av1/decoder/decoder.h
@@ -233,6 +233,17 @@
 #include "aom_ports/aom_timer.h"
 // Adjust the following to add new components.
 enum {
+  decode_mbmi_block_time,
+  decode_token_recon_block_intra_time,
+  predict_inter_block_time,
+  decode_reconstruct_tx_inter_time,
+  decode_token_recon_block_inter_time,
+  decode_token_recon_block_time,
+  parse_decode_block_time,
+  decode_tile_time,
+  decode_tiles_time,
+  av1_loop_filter_frame_time,
+  cdef_and_lr_time,
   av1_decode_tg_tiles_and_wrapup_time,
   aom_decode_frame_from_obus_time,
   kTimingComponents,
@@ -240,6 +251,20 @@
 
 static inline char const *get_component_name(int index) {
   switch (index) {
+    case decode_mbmi_block_time: return "decode_mbmi_block_time";
+    case decode_token_recon_block_intra_time:
+      return "decode_token_recon_block_intra_time";
+    case predict_inter_block_time: return "predict_inter_block_time";
+    case decode_reconstruct_tx_inter_time:
+      return "decode_reconstruct_tx_inter_time";
+    case decode_token_recon_block_inter_time:
+      return "decode_token_recon_block_inter_time";
+    case decode_token_recon_block_time: return "decode_token_recon_block_time";
+    case parse_decode_block_time: return "parse_decode_block_time";
+    case decode_tile_time: return "decode_tile_time";
+    case decode_tiles_time: return "decode_tiles_time";
+    case av1_loop_filter_frame_time: return "av1_loop_filter_frame_time";
+    case cdef_and_lr_time: return "cdef_and_lr_time";
     case av1_decode_tg_tiles_and_wrapup_time:
       return "av1_decode_tg_tiles_and_wrapup_time";
     case aom_decode_frame_from_obus_time: