/* * 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; }