| /* | 
 |  * Copyright (c) 2021, Alliance for Open Media. All rights reserved | 
 |  * | 
 |  * This source code is subject to the terms of the BSD 2 Clause License and | 
 |  * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License | 
 |  * was not distributed with this source code in the LICENSE file, you can | 
 |  * obtain it at www.aomedia.org/license/software. If the Alliance for Open | 
 |  * Media Patent License 1.0 was not distributed with this source code in the | 
 |  * PATENTS file, you can obtain it at www.aomedia.org/license/patent. | 
 |  */ | 
 |  | 
 | #include "av1/common/common.h" | 
 | #include "av1/encoder/external_partition.h" | 
 |  | 
 | aom_codec_err_t av1_ext_part_create(aom_ext_part_funcs_t funcs, | 
 |                                     aom_ext_part_config_t config, | 
 |                                     ExtPartController *ext_part_controller) { | 
 |   if (ext_part_controller == NULL) { | 
 |     return AOM_CODEC_INVALID_PARAM; | 
 |   } | 
 |   ext_part_controller->funcs = funcs; | 
 |   ext_part_controller->config = config; | 
 |   const aom_ext_part_status_t status = ext_part_controller->funcs.create_model( | 
 |       ext_part_controller->funcs.priv, &ext_part_controller->config, | 
 |       &ext_part_controller->model); | 
 |   if (status == AOM_EXT_PART_ERROR) { | 
 |     return AOM_CODEC_ERROR; | 
 |   } else if (status == AOM_EXT_PART_TEST) { | 
 |     ext_part_controller->test_mode = 1; | 
 |     ext_part_controller->ready = 0; | 
 |     return AOM_CODEC_OK; | 
 |   } | 
 |   assert(status == AOM_EXT_PART_OK); | 
 |   ext_part_controller->ready = 1; | 
 |   return AOM_CODEC_OK; | 
 | } | 
 |  | 
 | aom_codec_err_t av1_ext_part_init(ExtPartController *ext_part_controller) { | 
 |   if (ext_part_controller == NULL) { | 
 |     return AOM_CODEC_INVALID_PARAM; | 
 |   } | 
 |   av1_zero(ext_part_controller); | 
 |   return AOM_CODEC_OK; | 
 | } | 
 |  | 
 | aom_codec_err_t av1_ext_part_delete(ExtPartController *ext_part_controller) { | 
 |   if (ext_part_controller == NULL) { | 
 |     return AOM_CODEC_INVALID_PARAM; | 
 |   } | 
 |   if (ext_part_controller->ready) { | 
 |     const aom_ext_part_status_t status = | 
 |         ext_part_controller->funcs.delete_model(ext_part_controller->model); | 
 |     if (status != AOM_EXT_PART_OK) { | 
 |       return AOM_CODEC_ERROR; | 
 |     } | 
 |   } | 
 |   return av1_ext_part_init(ext_part_controller); | 
 | } | 
 |  | 
 | bool av1_ext_part_get_partition_decision(ExtPartController *ext_part_controller, | 
 |                                          aom_partition_decision_t *decision) { | 
 |   assert(ext_part_controller != NULL); | 
 |   assert(ext_part_controller->ready); | 
 |   assert(decision != NULL); | 
 |   const aom_ext_part_status_t status = | 
 |       ext_part_controller->funcs.get_partition_decision( | 
 |           ext_part_controller->model, decision); | 
 |   if (status != AOM_EXT_PART_OK) return false; | 
 |   return true; | 
 | } | 
 |  | 
 | bool av1_ext_part_send_partition_stats(ExtPartController *ext_part_controller, | 
 |                                        const aom_partition_stats_t *stats) { | 
 |   assert(ext_part_controller != NULL); | 
 |   assert(ext_part_controller->ready); | 
 |   assert(stats != NULL); | 
 |   const aom_ext_part_status_t status = | 
 |       ext_part_controller->funcs.send_partition_stats( | 
 |           ext_part_controller->model, stats); | 
 |   if (status != AOM_EXT_PART_OK) return false; | 
 |   return true; | 
 | } | 
 |  | 
 | bool av1_ext_part_send_features(ExtPartController *ext_part_controller, | 
 |                                 const aom_partition_features_t *features) { | 
 |   assert(ext_part_controller != NULL); | 
 |   assert(ext_part_controller->ready); | 
 |   assert(features != NULL); | 
 |   const aom_ext_part_status_t status = ext_part_controller->funcs.send_features( | 
 |       ext_part_controller->model, features); | 
 |   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; | 
 | } |