101 lines
3.7 KiB
C
101 lines
3.7 KiB
C
/*
|
|
* 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"
|
|
#include "config/aom_config.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;
|
|
}
|
|
|
|
static aom_codec_err_t 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 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_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;
|
|
}
|
|
|
|
#if CONFIG_PARTITION_SEARCH_ORDER
|
|
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;
|
|
}
|
|
|
|
aom_ext_part_decision_mode_t av1_get_ext_part_decision_mode(
|
|
const ExtPartController *ext_part_controller) {
|
|
return ext_part_controller->funcs.decision_mode;
|
|
}
|
|
#endif // CONFIG_PARTITION_SEARCH_ORDER
|