Coverage Report

Created: 2025-06-22 08:04

/src/aom/av1/encoder/pickcdef.h
Line
Count
Source (jump to first uncovered line)
1
/*
2
 * Copyright (c) 2016, Alliance for Open Media. All rights reserved.
3
 *
4
 * This source code is subject to the terms of the BSD 2 Clause License and
5
 * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
6
 * was not distributed with this source code in the LICENSE file, you can
7
 * obtain it at www.aomedia.org/license/software. If the Alliance for Open
8
 * Media Patent License 1.0 was not distributed with this source code in the
9
 * PATENTS file, you can obtain it at www.aomedia.org/license/patent.
10
 */
11
#ifndef AOM_AV1_ENCODER_PICKCDEF_H_
12
#define AOM_AV1_ENCODER_PICKCDEF_H_
13
14
#include "av1/common/cdef.h"
15
#include "av1/encoder/speed_features.h"
16
17
#ifdef __cplusplus
18
extern "C" {
19
#endif
20
21
/*!\enum CDEF_CONTROL
22
 * \brief This enum controls to which frames CDEF is applied.
23
 */
24
typedef enum {
25
  CDEF_NONE = 0,      /* Disable CDEF on all frames. */
26
  CDEF_ALL = 1,       /* Enable CDEF for all frames. */
27
  CDEF_REFERENCE = 2, /* Disable CDEF on non reference frames. */
28
  CDEF_ADAPTIVE = 3,  /* Enable CDEF adaptively based on frame qindex */
29
} CDEF_CONTROL;
30
31
/*!\cond */
32
struct MultiThreadInfo;
33
34
#define REDUCED_PRI_STRENGTHS_LVL1 8
35
#define REDUCED_PRI_STRENGTHS_LVL2 5
36
0
#define REDUCED_SEC_STRENGTHS_LVL3 2
37
0
#define REDUCED_SEC_STRENGTHS_LVL5 1
38
#define REDUCED_PRI_STRENGTHS_LVL4 2
39
40
#define REDUCED_TOTAL_STRENGTHS_LVL1 \
41
  (REDUCED_PRI_STRENGTHS_LVL1 * CDEF_SEC_STRENGTHS)
42
#define REDUCED_TOTAL_STRENGTHS_LVL2 \
43
  (REDUCED_PRI_STRENGTHS_LVL2 * CDEF_SEC_STRENGTHS)
44
#define REDUCED_TOTAL_STRENGTHS_LVL3 \
45
  (REDUCED_PRI_STRENGTHS_LVL2 * REDUCED_SEC_STRENGTHS_LVL3)
46
#define REDUCED_TOTAL_STRENGTHS_LVL4 \
47
  (REDUCED_PRI_STRENGTHS_LVL4 * REDUCED_SEC_STRENGTHS_LVL3)
48
#define REDUCED_TOTAL_STRENGTHS_LVL5 \
49
  (REDUCED_PRI_STRENGTHS_LVL4 * REDUCED_SEC_STRENGTHS_LVL5)
50
#define TOTAL_STRENGTHS (CDEF_PRI_STRENGTHS * CDEF_SEC_STRENGTHS)
51
52
static const int priconv_lvl1[REDUCED_PRI_STRENGTHS_LVL1] = { 0, 1, 2,  3,
53
                                                              5, 7, 10, 13 };
54
static const int priconv_lvl2[REDUCED_PRI_STRENGTHS_LVL2] = { 0, 2, 4, 8, 14 };
55
static const int priconv_lvl4[REDUCED_PRI_STRENGTHS_LVL4] = { 0, 11 };
56
static const int priconv_lvl5[REDUCED_PRI_STRENGTHS_LVL4] = { 0, 5 };
57
static const int secconv_lvl3[REDUCED_SEC_STRENGTHS_LVL3] = { 0, 2 };
58
static const int secconv_lvl5[REDUCED_SEC_STRENGTHS_LVL5] = { 0 };
59
static const int nb_cdef_strengths[CDEF_PICK_METHODS] = {
60
  TOTAL_STRENGTHS,
61
  REDUCED_TOTAL_STRENGTHS_LVL1,
62
  REDUCED_TOTAL_STRENGTHS_LVL2,
63
  REDUCED_TOTAL_STRENGTHS_LVL3,
64
  REDUCED_TOTAL_STRENGTHS_LVL4,
65
  REDUCED_TOTAL_STRENGTHS_LVL5,
66
  TOTAL_STRENGTHS
67
};
68
69
typedef void (*copy_fn_t)(uint16_t *dst, int dstride, const uint8_t *src,
70
                          int src_voffset, int src_hoffset, int sstride,
71
                          int vsize, int hsize);
72
typedef uint64_t (*compute_cdef_dist_t)(void *dst, int dstride, uint16_t *src,
73
                                        cdef_list *dlist, int cdef_count,
74
                                        BLOCK_SIZE bsize, int coeff_shift,
75
                                        int row, int col);
76
77
/*! \brief CDEF search context.
78
 */
79
typedef struct {
80
  /*!
81
   * Pointer to the frame buffer holding the source frame
82
   */
83
  const YV12_BUFFER_CONFIG *ref;
84
  /*!
85
   * Pointer to params related to MB_MODE_INFO arrays and related info
86
   */
87
  CommonModeInfoParams *mi_params;
88
  /*!
89
   * Info specific to each plane
90
   */
91
  struct macroblockd_plane plane[MAX_MB_PLANE];
92
  /*!
93
   * Function pointer of copy_fn
94
   */
95
  copy_fn_t copy_fn;
96
  /*!
97
   * Function pointer of compute_cdef_dist_fn
98
   */
99
  compute_cdef_dist_t compute_cdef_dist_fn;
100
  /*!
101
   *  Number of strenghts evaluated in CDEF filter search
102
   */
103
  int total_strengths;
104
  /*!
105
   * Bit-depth dependent shift
106
   */
107
  int coeff_shift;
108
  /*!
109
   * CDEF damping factor
110
   */
111
  int damping;
112
  /*!
113
   * Search method used to select CDEF parameters
114
   */
115
  int pick_method;
116
  /*!
117
   * Number of planes
118
   */
119
  int num_planes;
120
  /*!
121
   * Log2 of width of the MI unit in pixels. mi_wide_l2[i]
122
   * indicates the width of the MI unit in pixels for the ith plane
123
   */
124
  int mi_wide_l2[MAX_MB_PLANE];
125
  /*!
126
   * Log2 of height of the MI unit in pixels. mi_high_l2[i]
127
   * indicates the height of the MI unit in pixels for the ith plane
128
   */
129
  int mi_high_l2[MAX_MB_PLANE];
130
  /*!
131
   * Subsampling in x direction. xdec[i] indicates the subsampling
132
   * for the ith plane
133
   */
134
  int xdec[MAX_MB_PLANE];
135
  /*!
136
   * Subsampling in y direction. ydec[i] indicates the subsampling
137
   * for the ith plane
138
   */
139
  int ydec[MAX_MB_PLANE];
140
  /*!
141
   * bsize[i] indicates the block size of ith plane
142
   */
143
  int bsize[MAX_MB_PLANE];
144
  /*!
145
   * Number of 64x64 blocks in vertical direction of a frame
146
   */
147
  int nvfb;
148
  /*!
149
   * Number of 64x64 blocks in horizontal direction of a frame
150
   */
151
  int nhfb;
152
  /*!
153
   * Pointer to the mean squared error between the CDEF filtered block and the
154
   * source block. mse[i][j][k] stores the MSE of the ith plane (i=0 corresponds
155
   * to Y-plane, i=1 corresponds to U and V planes), jth block and kth strength
156
   * index
157
   */
158
  uint64_t (*mse[2])[TOTAL_STRENGTHS];
159
  /*!
160
   * Holds the position (in units of mi's) of the cdef filtered
161
   * block in raster scan order
162
   */
163
  int *sb_index;
164
  /*!
165
   * Holds the count of cdef filtered blocks
166
   */
167
  int sb_count;
168
  /*!
169
   * Indicates if 16bit frame buffers are to be used i.e., the content bit-depth
170
   * is > 8-bit
171
   */
172
  bool use_highbitdepth;
173
} CdefSearchCtx;
174
175
static inline int sb_all_skip(const CommonModeInfoParams *const mi_params,
176
0
                              int mi_row, int mi_col) {
177
0
  const int maxr = AOMMIN(mi_params->mi_rows - mi_row, MI_SIZE_64X64);
178
0
  const int maxc = AOMMIN(mi_params->mi_cols - mi_col, MI_SIZE_64X64);
179
0
  const int stride = mi_params->mi_stride;
180
0
  MB_MODE_INFO **mbmi = mi_params->mi_grid_base + mi_row * stride + mi_col;
181
0
  for (int r = 0; r < maxr; ++r, mbmi += stride) {
182
0
    for (int c = 0; c < maxc; ++c) {
183
0
      if (!mbmi[c]->skip_txfm) return 0;
184
0
    }
185
0
  }
186
0
  return 1;
187
0
}
Unexecuted instantiation: av1_cx_iface.c:sb_all_skip
Unexecuted instantiation: allintra_vis.c:sb_all_skip
Unexecuted instantiation: av1_quantize.c:sb_all_skip
Unexecuted instantiation: bitstream.c:sb_all_skip
Unexecuted instantiation: context_tree.c:sb_all_skip
Unexecuted instantiation: encodeframe.c:sb_all_skip
Unexecuted instantiation: encodeframe_utils.c:sb_all_skip
Unexecuted instantiation: encodemb.c:sb_all_skip
Unexecuted instantiation: encodemv.c:sb_all_skip
Unexecuted instantiation: encoder.c:sb_all_skip
Unexecuted instantiation: encoder_utils.c:sb_all_skip
Unexecuted instantiation: encodetxb.c:sb_all_skip
Unexecuted instantiation: ethread.c:sb_all_skip
Unexecuted instantiation: firstpass.c:sb_all_skip
Unexecuted instantiation: global_motion_facade.c:sb_all_skip
Unexecuted instantiation: level.c:sb_all_skip
Unexecuted instantiation: lookahead.c:sb_all_skip
Unexecuted instantiation: mcomp.c:sb_all_skip
Unexecuted instantiation: mv_prec.c:sb_all_skip
Unexecuted instantiation: palette.c:sb_all_skip
Unexecuted instantiation: partition_search.c:sb_all_skip
Unexecuted instantiation: partition_strategy.c:sb_all_skip
Unexecuted instantiation: pass2_strategy.c:sb_all_skip
Unexecuted instantiation: pickcdef.c:sb_all_skip
Unexecuted instantiation: picklpf.c:sb_all_skip
Unexecuted instantiation: pickrst.c:sb_all_skip
Unexecuted instantiation: ratectrl.c:sb_all_skip
Unexecuted instantiation: rd.c:sb_all_skip
Unexecuted instantiation: rdopt.c:sb_all_skip
Unexecuted instantiation: nonrd_pickmode.c:sb_all_skip
Unexecuted instantiation: nonrd_opt.c:sb_all_skip
Unexecuted instantiation: segmentation.c:sb_all_skip
Unexecuted instantiation: speed_features.c:sb_all_skip
Unexecuted instantiation: superres_scale.c:sb_all_skip
Unexecuted instantiation: svc_layercontext.c:sb_all_skip
Unexecuted instantiation: temporal_filter.c:sb_all_skip
Unexecuted instantiation: tokenize.c:sb_all_skip
Unexecuted instantiation: tpl_model.c:sb_all_skip
Unexecuted instantiation: tx_search.c:sb_all_skip
Unexecuted instantiation: txb_rdopt.c:sb_all_skip
Unexecuted instantiation: intra_mode_search.c:sb_all_skip
Unexecuted instantiation: var_based_part.c:sb_all_skip
Unexecuted instantiation: av1_noise_estimate.c:sb_all_skip
Unexecuted instantiation: aq_complexity.c:sb_all_skip
Unexecuted instantiation: aq_cyclicrefresh.c:sb_all_skip
Unexecuted instantiation: aq_variance.c:sb_all_skip
Unexecuted instantiation: compound_type.c:sb_all_skip
Unexecuted instantiation: encode_strategy.c:sb_all_skip
Unexecuted instantiation: global_motion.c:sb_all_skip
Unexecuted instantiation: gop_structure.c:sb_all_skip
Unexecuted instantiation: interp_search.c:sb_all_skip
Unexecuted instantiation: motion_search_facade.c:sb_all_skip
188
189
// Checks if cdef processing can be skipped for particular sb.
190
// Inputs:
191
//   cdef_search_ctx: Pointer to the structure containing parameters related to
192
//   CDEF search context.
193
//   fbr: Row index in units of 64x64 block
194
//   fbc: Column index in units of 64x64 block
195
// Returns:
196
//   1/0 will be returned to indicate skip/don't skip cdef processing of sb
197
//   respectively.
198
static inline int cdef_sb_skip(const CommonModeInfoParams *const mi_params,
199
0
                               int fbr, int fbc) {
200
0
  const MB_MODE_INFO *const mbmi =
201
0
      mi_params->mi_grid_base[MI_SIZE_64X64 * fbr * mi_params->mi_stride +
202
0
                              MI_SIZE_64X64 * fbc];
203
  // No filtering if the entire filter block is skipped.
204
0
  if (sb_all_skip(mi_params, fbr * MI_SIZE_64X64, fbc * MI_SIZE_64X64))
205
0
    return 1;
206
  // Skip odd numbered 64x64 block rows(cols) when bsize is BLOCK_128X128,
207
  // BLOCK_64X128(BLOCK_128X128, BLOCK_128X64) as for such blocks CDEF filtering
208
  // is done at the corresponding block sizes.
209
0
  if (((fbc & 1) &&
210
0
       (mbmi->bsize == BLOCK_128X128 || mbmi->bsize == BLOCK_128X64)) ||
211
0
      ((fbr & 1) &&
212
0
       (mbmi->bsize == BLOCK_128X128 || mbmi->bsize == BLOCK_64X128)))
213
0
    return 1;
214
0
  return 0;
215
0
}
Unexecuted instantiation: av1_cx_iface.c:cdef_sb_skip
Unexecuted instantiation: allintra_vis.c:cdef_sb_skip
Unexecuted instantiation: av1_quantize.c:cdef_sb_skip
Unexecuted instantiation: bitstream.c:cdef_sb_skip
Unexecuted instantiation: context_tree.c:cdef_sb_skip
Unexecuted instantiation: encodeframe.c:cdef_sb_skip
Unexecuted instantiation: encodeframe_utils.c:cdef_sb_skip
Unexecuted instantiation: encodemb.c:cdef_sb_skip
Unexecuted instantiation: encodemv.c:cdef_sb_skip
Unexecuted instantiation: encoder.c:cdef_sb_skip
Unexecuted instantiation: encoder_utils.c:cdef_sb_skip
Unexecuted instantiation: encodetxb.c:cdef_sb_skip
Unexecuted instantiation: ethread.c:cdef_sb_skip
Unexecuted instantiation: firstpass.c:cdef_sb_skip
Unexecuted instantiation: global_motion_facade.c:cdef_sb_skip
Unexecuted instantiation: level.c:cdef_sb_skip
Unexecuted instantiation: lookahead.c:cdef_sb_skip
Unexecuted instantiation: mcomp.c:cdef_sb_skip
Unexecuted instantiation: mv_prec.c:cdef_sb_skip
Unexecuted instantiation: palette.c:cdef_sb_skip
Unexecuted instantiation: partition_search.c:cdef_sb_skip
Unexecuted instantiation: partition_strategy.c:cdef_sb_skip
Unexecuted instantiation: pass2_strategy.c:cdef_sb_skip
Unexecuted instantiation: pickcdef.c:cdef_sb_skip
Unexecuted instantiation: picklpf.c:cdef_sb_skip
Unexecuted instantiation: pickrst.c:cdef_sb_skip
Unexecuted instantiation: ratectrl.c:cdef_sb_skip
Unexecuted instantiation: rd.c:cdef_sb_skip
Unexecuted instantiation: rdopt.c:cdef_sb_skip
Unexecuted instantiation: nonrd_pickmode.c:cdef_sb_skip
Unexecuted instantiation: nonrd_opt.c:cdef_sb_skip
Unexecuted instantiation: segmentation.c:cdef_sb_skip
Unexecuted instantiation: speed_features.c:cdef_sb_skip
Unexecuted instantiation: superres_scale.c:cdef_sb_skip
Unexecuted instantiation: svc_layercontext.c:cdef_sb_skip
Unexecuted instantiation: temporal_filter.c:cdef_sb_skip
Unexecuted instantiation: tokenize.c:cdef_sb_skip
Unexecuted instantiation: tpl_model.c:cdef_sb_skip
Unexecuted instantiation: tx_search.c:cdef_sb_skip
Unexecuted instantiation: txb_rdopt.c:cdef_sb_skip
Unexecuted instantiation: intra_mode_search.c:cdef_sb_skip
Unexecuted instantiation: var_based_part.c:cdef_sb_skip
Unexecuted instantiation: av1_noise_estimate.c:cdef_sb_skip
Unexecuted instantiation: aq_complexity.c:cdef_sb_skip
Unexecuted instantiation: aq_cyclicrefresh.c:cdef_sb_skip
Unexecuted instantiation: aq_variance.c:cdef_sb_skip
Unexecuted instantiation: compound_type.c:cdef_sb_skip
Unexecuted instantiation: encode_strategy.c:cdef_sb_skip
Unexecuted instantiation: global_motion.c:cdef_sb_skip
Unexecuted instantiation: gop_structure.c:cdef_sb_skip
Unexecuted instantiation: interp_search.c:cdef_sb_skip
Unexecuted instantiation: motion_search_facade.c:cdef_sb_skip
216
217
void av1_cdef_dealloc_data(CdefSearchCtx *cdef_search_ctx);
218
219
void av1_cdef_mse_calc_block(CdefSearchCtx *cdef_search_ctx,
220
                             struct aom_internal_error_info *error_info,
221
                             int fbr, int fbc, int sb_count);
222
/*!\endcond */
223
224
/*!\brief AV1 CDEF parameter search
225
 *
226
 * \ingroup in_loop_cdef
227
 *
228
 * Searches for optimal CDEF parameters for frame
229
 *
230
 * \param[in,out]  cpi                 Top level encoder structure
231
 *
232
 * \remark Nothing is returned. Instead, optimal CDEF parameters are stored
233
 * in the \c cdef_info structure of type \ref CdefInfo inside \c cm:
234
 * \arg \c cdef_bits: Bits of strength parameters
235
 * \arg \c nb_cdef_strengths: Number of strength parameters
236
 * \arg \c cdef_strengths: list of \c nb_cdef_strengths strength parameters
237
 * for the luma plane.
238
 * \arg \c uv_cdef_strengths: list of \c nb_cdef_strengths strength parameters
239
 * for the chroma planes.
240
 * \arg \c damping_factor: CDEF damping factor.
241
 *
242
 */
243
void av1_cdef_search(struct AV1_COMP *cpi);
244
245
/*!\brief AV1 CDEF level from QP
246
 *
247
 * \ingroup in_loop_cdef
248
 *
249
 * Calculates CDEF levels from frame QP. Only used for speed 7+ with RT mode.
250
 *
251
 * \param[in,out]  cm                 Pointer to top level common structure
252
 * \param[in]      skip_cdef          Flag to skip CDEF filtering
253
 * \param[in]      is_screen_content  Flag indicating screen content
254
 *
255
 */
256
void av1_pick_cdef_from_qp(AV1_COMMON *const cm, int skip_cdef,
257
                           int is_screen_content);
258
259
#ifdef __cplusplus
260
}  // extern "C"
261
#endif
262
#endif  // AOM_AV1_ENCODER_PICKCDEF_H_