ExtPart: Add a variable to distinguish deicion mode Change-Id: Ia84f517ee2ba85db79e2689c2745cc26eedc81c4
diff --git a/aom/aom_external_partition.h b/aom/aom_external_partition.h index b6ea96e..daf8fe4 100644 --- a/aom/aom_external_partition.h +++ b/aom/aom_external_partition.h
@@ -81,6 +81,19 @@ */ #define SIZE_PRUNE_4_WAY 18 +/*!\brief Decision mode of the external partition model. + * WHOLE_TREE_DECISION: the external partition model should provide the + * whole partition tree for the superblock. + * + * RECURSIVE_DECISION: the external partition model provides the partition + * decision of the current block only. The decision process starts from + * the superblock size, down to the smallest block size (4x4) recursively. + */ +typedef enum aom_ext_part_decision_mode { + WHOLE_TREE_DECISION = 0, + RECURSIVE_DECISION = 1, +} aom_ext_part_decision_mode_t; + /*!\brief Config information sent to the external partition model. * * For example, the maximum superblock size determined by the sequence header. @@ -368,6 +381,11 @@ aom_ext_part_delete_model_fn_t delete_model; /*! + * The decision mode of the model. + */ + aom_ext_part_decision_mode_t decision_mode; + + /*! * Private data for the external partition model. */ void *priv;
diff --git a/av1/encoder/external_partition.c b/av1/encoder/external_partition.c index 542b2bb..79f8b4c 100644 --- a/av1/encoder/external_partition.c +++ b/av1/encoder/external_partition.c
@@ -91,3 +91,8 @@ if (status != AOM_EXT_PART_OK) return false; return true; } + +aom_ext_part_decision_mode_t av1_get_ext_part_decision_mode( + const ExtPartController *ext_part_controller) { + return ext_part_controller->funcs.decision_mode; +}
diff --git a/av1/encoder/external_partition.h b/av1/encoder/external_partition.h index 20f03ed..f74973e 100644 --- a/av1/encoder/external_partition.h +++ b/av1/encoder/external_partition.h
@@ -47,6 +47,9 @@ bool av1_ext_part_send_features(ExtPartController *ext_part_controller, const aom_partition_features_t *features); +aom_ext_part_decision_mode_t av1_get_ext_part_decision_mode( + const ExtPartController *ext_part_controller); + /*!\endcond */ #ifdef __cplusplus } // extern "C"
diff --git a/av1/encoder/partition_search.c b/av1/encoder/partition_search.c index ccdd8e5..8a1e2aa 100644 --- a/av1/encoder/partition_search.c +++ b/av1/encoder/partition_search.c
@@ -4320,12 +4320,17 @@ RD_STATS *best_rd_cost) { if (cpi->ext_part_controller.ready) { bool valid_search = true; - if (ML_PARTITION_WHOLE_TREE_DECISION) { + const aom_ext_part_decision_mode_t decision_mode = + av1_get_ext_part_decision_mode(&cpi->ext_part_controller); + if (decision_mode == WHOLE_TREE_DECISION) { valid_search = ml_partition_search_whole_tree( cpi, td, tile_data, tp, sms_root, mi_row, mi_col, bsize); - } else { + } else if (decision_mode == RECURSIVE_DECISION) { valid_search = ml_partition_search_partial( cpi, td, tile_data, tp, sms_root, mi_row, mi_col, bsize); + } else { + assert(0 && "Unknown decision mode."); + return false; } if (!valid_search) { assert(0 && "Invalid search from ML model, partition search failed.");
diff --git a/test/av1_external_partition_test.cc b/test/av1_external_partition_test.cc index 45ca847a..20329de 100644 --- a/test/av1_external_partition_test.cc +++ b/test/av1_external_partition_test.cc
@@ -245,6 +245,7 @@ if (video->frame() == 0) { aom_ext_part_funcs_t ext_part_funcs; ext_part_funcs.priv = reinterpret_cast<void *>(&test_data_); + ext_part_funcs.decision_mode = WHOLE_TREE_DECISION; ext_part_funcs.create_model = ext_part_create_model; ext_part_funcs.send_features = ext_part_send_features; ext_part_funcs.get_partition_decision =