ext_tile: add AV1D_EXT_TILE_DEBUG API

Added AV1D_EXT_TILE_DEBUG API in the decoder. With ext_tile_debug = 1,
it enables the ext-tile software debug and testing code in the decoder,
which provides reference results for ext-tile hardware decoder.

Change-Id: Id7a41266d3161f53773ba4db09a269965629f487
diff --git a/aom/aomdx.h b/aom/aomdx.h
index bada98d..8e0284b 100644
--- a/aom/aomdx.h
+++ b/aom/aomdx.h
@@ -160,6 +160,10 @@
    * bitstream. This provides a way to access a specific tile's bitstream data.
    */
   AV1D_GET_TILE_DATA,
+  /** control function to enable the ext-tile software debug and testing code in
+   * the decoder.
+   */
+  AV1D_EXT_TILE_DEBUG,
 
   /** control function to indicate whether bitstream is in Annex-B format. */
   AV1D_SET_IS_ANNEXB,
@@ -215,6 +219,8 @@
 #define AOM_CTRL_AV1_SET_TILE_MODE
 AOM_CTRL_USE_TYPE(AV1D_GET_TILE_DATA, aom_tile_data *)
 #define AOM_CTRL_AV1D_GET_TILE_DATA
+AOM_CTRL_USE_TYPE(AV1D_EXT_TILE_DEBUG, unsigned int)
+#define AOM_CTRL_AV1D_EXT_TILE_DEBUG
 AOM_CTRL_USE_TYPE(AV1D_SET_IS_ANNEXB, unsigned int)
 #define AOM_CTRL_AV1D_SET_IS_ANNEXB
 AOM_CTRL_USE_TYPE(AV1D_SET_OPERATING_POINT, int)
diff --git a/av1/av1_dx_iface.c b/av1/av1_dx_iface.c
index e52da46..5cbc60b 100644
--- a/av1/av1_dx_iface.c
+++ b/av1/av1_dx_iface.c
@@ -61,6 +61,7 @@
   unsigned int tile_mode;
   unsigned int is_annexb;
   int operating_point;
+  unsigned int ext_tile_debug;
 
   AVxWorker *frame_workers;
   int num_frame_workers;
@@ -418,6 +419,8 @@
     frame_worker_data->pbi->dec_tile_row = ctx->decode_tile_row;
     frame_worker_data->pbi->dec_tile_col = ctx->decode_tile_col;
     frame_worker_data->pbi->operating_point = ctx->operating_point;
+    frame_worker_data->pbi->ext_tile_debug = ctx->ext_tile_debug;
+
     worker->hook = (AVxWorkerHook)frame_worker_hook;
     if (!winterface->reset(worker)) {
       set_error_detail(ctx, "Frame Worker thread creation failed");
@@ -476,7 +479,7 @@
   frame_worker_data->pbi->common.large_scale_tile = ctx->tile_mode;
   frame_worker_data->pbi->dec_tile_row = ctx->decode_tile_row;
   frame_worker_data->pbi->dec_tile_col = ctx->decode_tile_col;
-
+  frame_worker_data->pbi->ext_tile_debug = ctx->ext_tile_debug;
   frame_worker_data->pbi->common.is_annexb = ctx->is_annexb;
 
   worker->had_error = 0;
@@ -1037,6 +1040,12 @@
 #endif
 }
 
+static aom_codec_err_t ctrl_ext_tile_debug(aom_codec_alg_priv_t *ctx,
+                                           va_list args) {
+  ctx->ext_tile_debug = va_arg(args, int);
+  return AOM_CODEC_OK;
+}
+
 static aom_codec_ctrl_fn_map_t decoder_ctrl_maps[] = {
   { AV1_COPY_REFERENCE, ctrl_copy_reference },
 
@@ -1056,6 +1065,7 @@
   { AV1D_SET_IS_ANNEXB, ctrl_set_is_annexb },
   { AV1D_SET_OPERATING_POINT, ctrl_set_operating_point },
   { AV1_SET_INSPECTION_CALLBACK, ctrl_set_inspection_callback },
+  { AV1D_EXT_TILE_DEBUG, ctrl_ext_tile_debug },
 
   // Getters
   { AOMD_GET_FRAME_CORRUPTED, ctrl_get_frame_corrupted },
diff --git a/av1/decoder/decoder.h b/av1/decoder/decoder.h
index e6e61f7..4bd200c 100644
--- a/av1/decoder/decoder.h
+++ b/av1/decoder/decoder.h
@@ -108,6 +108,7 @@
   // State if the camera frame header is already decoded while
   // large_scale_tile = 1.
   int camera_frame_header_ready;
+  int ext_tile_debug;  // for ext-tile software debug & testing
 } AV1Decoder;
 
 int av1_receive_compressed_data(struct AV1Decoder *pbi, size_t size,