/*
 * Copyright (c) 2022, 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_PEF_H_
#define AOM_AV1_COMMON_PEF_H_

#include "config/aom_config.h"

#include "aom_ports/mem.h"
#include "av1/common/blockd.h"
#include "av1/common/seg_common.h"

#ifdef __cplusplus
extern "C" {
#endif

#define PEF_SHIFT 11
#define PEF_QTHR 150
#define PEF_DELTA 2
#define PEF_THR_SHIFT 3
#define PEF_DELTA_SCALE 8
#define PEF_BD_FACTOR 24
#define PEF_MCU_SZ 8

// Structure for PEF parameters
typedef struct {
  int filter_level[2];
  int filter_level_u;
  int filter_level_v;
  int delta_q_luma[2];
  int delta_side_luma[2];
  int delta_q_u;
  int delta_side_u;
  int delta_q_v;
  int delta_side_v;
  int pef_delta;
} PefParams;

// Structure for intermediate thresholds
typedef struct {
  uint16_t q_thr[MAX_MB_PLANE][2];
  uint16_t side_thr[MAX_MB_PLANE][2];
} PefInfo;

// Structure for PEF function input
typedef struct {
  // 0 for OPFL prediciton, 1 for TIP prediciton, 2 for TIP frame, 3 for
  // refinemv prediction, 4 for extended warp filter
  int pef_mode;
  int plane;
  int bw;
  int bh;
  int ss_x;
  int ss_y;
  int bit_depth;
  uint16_t *dst;
  int dst_stride;
  int_mv *mv_refined;
#if CONFIG_REFINEMV
  REFINEMV_SUBMB_INFO *refinemv_subinfo;
#endif  // CONFIG_REFINEMV
} PefFuncInput;

typedef void (*filt_func)(uint16_t *s, int stride, int bd, uint16_t q_thresh,
                          uint16_t side_thresh, int q_mult, int w_mult, int n,
                          int filt_len);

// Initialize PEF parameters
void init_pef_parameter(struct AV1Common *const cm, int plane_start,
                        int plane_end);

// enhance TIP frame
void enhance_tip_frame(struct AV1Common *const cm, MACROBLOCKD *xd);

// enhance prediction blocks
void enhance_prediction(const struct AV1Common *cm, MACROBLOCKD *xd, int plane,
                        uint16_t *dst, int dst_stride, int bw, int bh
#if CONFIG_OPTFLOW_REFINEMENT
                        ,
                        int_mv *const mv_refined, int use_opfl
#endif  // CONFIG_OPTFLOW_REFINEMENT
#if CONFIG_REFINEMV
                        ,
                        int use_refinemv, REFINEMV_SUBMB_INFO *refinemv_subinfo
#endif  // CONFIG_REFINEMV
#if CONFIG_EXT_WARP_FILTER
                        ,
                        bool ext_warp_used
#endif  // CONFIG_EXT_WARP_FILTER
);

#ifdef __cplusplus
}  // extern "C"
#endif

#endif  // AOM_AV1_COMMON_PEF_H_
