/*
 * Copyright (c) 2025, Alliance for Open Media. All rights reserved
 *
 * This source code is subject to the terms of the BSD 3-Clause Clear License
 * and the Alliance for Open Media Patent License 1.0. If the BSD 3-Clause Clear
 * License was not distributed with this source code in the LICENSE file, you
 * can obtain it at aomedia.org/license/software-license/bsd-3-c-c/.  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
 * aomedia.org/license/patent-license/.
 */

#ifndef AOM_AV1_COMMON_GDF_H
#define AOM_AV1_COMMON_GDF_H
#include "av1/common/av1_common_int.h"
#include "av1/common/bru.h"
#ifdef __cplusplus
extern "C" {
#endif

enum Direction { GDF_VER, GDF_HOR, GDF_DIAG0, GDF_DIAG1, GDF_NUM_DIRS };

#define GDF_VERBOSE 0
#define GDF_C_CODE_ONLY 0

#define GDF_RDO_QP_NUM_LOG2 2
#define GDF_RDO_SCALE_NUM_LOG2 2
#define GDF_RDO_QP_NUM (1 << GDF_RDO_QP_NUM_LOG2)
#define GDF_RDO_SCALE_NUM (1 << GDF_RDO_SCALE_NUM_LOG2)

/*!\brief Function to initialize information of GDF from cm
 */
void init_gdf(AV1_COMMON *cm);

/*!\brief Function to initialize information of GDF for tests
 */
void init_gdf_test(GdfInfo *gi, int mib_size, int rec_height, int rec_width);

/*!\brief Function to allocate memory storing block's expected coding error of
 * GDF
 */
void alloc_gdf_buffers(GdfInfo *gi);

/*!\brief Function to free memory storing block's expected coding error of GDF
 */
void free_gdf_buffers(GdfInfo *gi);

/*!\brief Function to print paramters of GDF
 */
void gdf_print_info(AV1_COMMON *cm, char *info, int poc);

#if CONFIG_GDF_IMPROVEMENT
/*!\brief Function to extend - pad - the copy guided frame of GDF
 */
void gdf_extend_frame_highbd(uint16_t *data, int width, int height, int stride,
                             int border_horz, int border_vert);

/*!\brief Function to setup reference lines for filtering stripe
 */
void gdf_setup_reference_lines(AV1_COMMON *cm, int i_min, int i_max,
                               int frame_stripe);

/*!\brief Function to unset reference lines for filtering stripe
 */
void gdf_unset_reference_lines(AV1_COMMON *cm, int i_min, int i_max);
#endif
/*!\brief Function to allocate memory and copy guided frame of GDF
 */
void gdf_copy_guided_frame(AV1_COMMON *cm);
/*!\brief Function to free memory for guided frame of GDF
 */
void gdf_free_guided_frame(AV1_COMMON *cm);

/*!\brief Function to calculate block index in list of block on/off flags
 */
int gdf_get_block_idx(const AV1_COMMON *cm, int y_h, int y_w);

/*!\brief Function to calculate indices for lookup tables of GDF
 *        in which index is calculated based on distances to references frames
 *        and tables are weight, bias, clipping, and expected coding error
 */
int gdf_get_ref_dst_idx(const AV1_COMMON *cm);

/*!\brief Function to calculate indices for lookup weight+bias+clipping tables
 * of GDF in which index is calculated based on QP and tables are weight, bias,
 * clipping, and expected coding error
 */
int gdf_get_qp_idx_base(const AV1_COMMON *cm);

/*!\brief Function to apply GDF to whole frame
 */
void gdf_filter_frame(AV1_COMMON *cm);

/*!\brief Function to check whether GDF allowed.
 */
static inline int is_allow_gdf(const AV1_COMMON *cm) {
  return !cm->features.coded_lossless && !cm->tiles.large_scale;
}

/*!\brief Function to check whether GDF enabled.
 */
static inline int is_gdf_enabled(const AV1_COMMON *cm) {
  return is_allow_gdf(cm) && cm->gdf_info.gdf_mode > 0;
}

/*!\brief Function to adjust the GDF block boundary to ensure even alignment.
 * Because the minimum required pixel size in GDF block is 2x2.
 * \param[in]  i_min                The pos of the block's top boundary
 * \param[in]  i_max                The pos of the block's bottom boundary
 * \param[in]  j_min                The pos of the block's left boundary
 * \param[in]  j_max                The pos of the block's right boundary
 * * \return Returns a value indicating whether the block size is valid
 */
static inline int gdf_block_adjust_and_validate(int *i_min, int *i_max,
                                                int *j_min, int *j_max) {
  *i_min = (*i_min + 1) & ~0x1;
  *i_max = *i_max & ~0x1;
  *j_min = (*j_min + 1) & ~0x1;
  *j_max = *j_max & ~0x1;
  return (*i_max > *i_min) && (*j_max > *j_min);
}

/*!\brief Function to copy left/right buffers when disabling filtering
 * across tiles is desired.
 */
void gdf_setup_processing_stripe_leftright_boundary(GdfInfo *gdf, int i_min,
                                                    int i_max, int j_min,
                                                    int j_max,
                                                    int tile_boundary_left,
                                                    int tile_boundary_right);

/*!\brief Function to restore left/right buffers when disabling filtering
 * across tiles is desired.
 */
void gdf_restore_processing_stripe_leftright_boundary(GdfInfo *gdf, int i_min,
                                                      int i_max, int j_min,
                                                      int j_max,
                                                      int tile_boundary_left,
                                                      int tile_boundary_right);
#ifdef __cplusplus
}  // extern "C"
#endif

#endif  // AOM_AV1_COMMON_GDF_H
