AOMedia AV1 Codec
pickcdef.h
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"
16
17#ifdef __cplusplus
18extern "C" {
19#endif
20
24typedef enum {
25 CDEF_NONE = 0,
26 CDEF_ALL = 1,
27 CDEF_REFERENCE = 2,
28} CDEF_CONTROL;
29
31struct MultiThreadInfo;
32
33#define REDUCED_PRI_STRENGTHS_LVL1 8
34#define REDUCED_PRI_STRENGTHS_LVL2 5
35#define REDUCED_SEC_STRENGTHS_LVL3 2
36#define REDUCED_SEC_STRENGTHS_LVL5 1
37#define REDUCED_PRI_STRENGTHS_LVL4 2
38
39#define REDUCED_TOTAL_STRENGTHS_LVL1 \
40 (REDUCED_PRI_STRENGTHS_LVL1 * CDEF_SEC_STRENGTHS)
41#define REDUCED_TOTAL_STRENGTHS_LVL2 \
42 (REDUCED_PRI_STRENGTHS_LVL2 * CDEF_SEC_STRENGTHS)
43#define REDUCED_TOTAL_STRENGTHS_LVL3 \
44 (REDUCED_PRI_STRENGTHS_LVL2 * REDUCED_SEC_STRENGTHS_LVL3)
45#define REDUCED_TOTAL_STRENGTHS_LVL4 \
46 (REDUCED_PRI_STRENGTHS_LVL4 * REDUCED_SEC_STRENGTHS_LVL3)
47#define REDUCED_TOTAL_STRENGTHS_LVL5 \
48 (REDUCED_PRI_STRENGTHS_LVL4 * REDUCED_SEC_STRENGTHS_LVL5)
49#define TOTAL_STRENGTHS (CDEF_PRI_STRENGTHS * CDEF_SEC_STRENGTHS)
50
51static const int priconv_lvl1[REDUCED_PRI_STRENGTHS_LVL1] = { 0, 1, 2, 3,
52 5, 7, 10, 13 };
53static const int priconv_lvl2[REDUCED_PRI_STRENGTHS_LVL2] = { 0, 2, 4, 8, 14 };
54static const int priconv_lvl4[REDUCED_PRI_STRENGTHS_LVL4] = { 0, 11 };
55static const int priconv_lvl5[REDUCED_PRI_STRENGTHS_LVL4] = { 0, 5 };
56static const int secconv_lvl3[REDUCED_SEC_STRENGTHS_LVL3] = { 0, 2 };
57static const int secconv_lvl5[REDUCED_SEC_STRENGTHS_LVL5] = { 0 };
58static const int nb_cdef_strengths[CDEF_PICK_METHODS] = {
59 TOTAL_STRENGTHS,
60 REDUCED_TOTAL_STRENGTHS_LVL1,
61 REDUCED_TOTAL_STRENGTHS_LVL2,
62 REDUCED_TOTAL_STRENGTHS_LVL3,
63 REDUCED_TOTAL_STRENGTHS_LVL4,
64 REDUCED_TOTAL_STRENGTHS_LVL5,
65 TOTAL_STRENGTHS
66};
67
68typedef void (*copy_fn_t)(uint16_t *dst, int dstride, const uint8_t *src,
69 int src_voffset, int src_hoffset, int sstride,
70 int vsize, int hsize);
71typedef uint64_t (*compute_cdef_dist_t)(void *dst, int dstride, uint16_t *src,
72 cdef_list *dlist, int cdef_count,
73 BLOCK_SIZE bsize, int coeff_shift,
74 int row, int col);
75
78typedef struct {
82 const YV12_BUFFER_CONFIG *ref;
86 CommonModeInfoParams *mi_params;
90 struct macroblockd_plane plane[MAX_MB_PLANE];
94 copy_fn_t copy_fn;
98 compute_cdef_dist_t compute_cdef_dist_fn;
102 int total_strengths;
106 int coeff_shift;
110 int damping;
114 int pick_method;
118 int num_planes;
123 int mi_wide_l2[MAX_MB_PLANE];
128 int mi_high_l2[MAX_MB_PLANE];
133 int xdec[MAX_MB_PLANE];
138 int ydec[MAX_MB_PLANE];
142 int bsize[MAX_MB_PLANE];
146 int nvfb;
150 int nhfb;
157 uint64_t (*mse[2])[TOTAL_STRENGTHS];
162 int *sb_index;
166 int sb_count;
171 bool use_highbitdepth;
172} CdefSearchCtx;
173
174static INLINE int sb_all_skip(const CommonModeInfoParams *const mi_params,
175 int mi_row, int mi_col) {
176 const int maxr = AOMMIN(mi_params->mi_rows - mi_row, MI_SIZE_64X64);
177 const int maxc = AOMMIN(mi_params->mi_cols - mi_col, MI_SIZE_64X64);
178 const int stride = mi_params->mi_stride;
179 MB_MODE_INFO **mbmi = mi_params->mi_grid_base + mi_row * stride + mi_col;
180 for (int r = 0; r < maxr; ++r, mbmi += stride) {
181 for (int c = 0; c < maxc; ++c) {
182 if (!mbmi[c]->skip_txfm) return 0;
183 }
184 }
185 return 1;
186}
187
188// Checks if cdef processing can be skipped for particular sb.
189// Inputs:
190// cdef_search_ctx: Pointer to the structure containing parameters related to
191// CDEF search context.
192// fbr: Row index in units of 64x64 block
193// fbc: Column index in units of 64x64 block
194// Returns:
195// 1/0 will be returned to indicate skip/don't skip cdef processing of sb
196// respectively.
197static INLINE int cdef_sb_skip(const CommonModeInfoParams *const mi_params,
198 int fbr, int fbc) {
199 const MB_MODE_INFO *const mbmi =
200 mi_params->mi_grid_base[MI_SIZE_64X64 * fbr * mi_params->mi_stride +
201 MI_SIZE_64X64 * fbc];
202 // No filtering if the entire filter block is skipped.
203 if (sb_all_skip(mi_params, fbr * MI_SIZE_64X64, fbc * MI_SIZE_64X64))
204 return 1;
205 // Skip odd numbered 64x64 block rows(cols) when bsize is BLOCK_128X128,
206 // BLOCK_64X128(BLOCK_128X128, BLOCK_128X64) as for such blocks CDEF filtering
207 // is done at the corresponding block sizes.
208 if (((fbc & 1) &&
209 (mbmi->bsize == BLOCK_128X128 || mbmi->bsize == BLOCK_128X64)) ||
210 ((fbr & 1) &&
211 (mbmi->bsize == BLOCK_128X128 || mbmi->bsize == BLOCK_64X128)))
212 return 1;
213 return 0;
214}
215
216void av1_cdef_dealloc_data(CdefSearchCtx *cdef_search_ctx);
217
218void av1_cdef_mse_calc_block(CdefSearchCtx *cdef_search_ctx,
219 struct aom_internal_error_info *error_info,
220 int fbr, int fbc, int sb_count);
242void av1_cdef_search(struct AV1_COMP *cpi);
243
255void av1_pick_cdef_from_qp(AV1_COMMON *const cm, int skip_cdef,
256 int is_screen_content);
257
258#ifdef __cplusplus
259} // extern "C"
260#endif
261#endif // AOM_AV1_ENCODER_PICKCDEF_H_
void av1_cdef_search(struct AV1_COMP *cpi)
AV1 CDEF parameter search.
void av1_pick_cdef_from_qp(AV1_COMMON *const cm, int skip_cdef, int is_screen_content)
AV1 CDEF level from QP.
Top level common structure used by both encoder and decoder.
Definition av1_common_int.h:752
Top level encoder structure.
Definition encoder.h:2866
Params related to MB_MODE_INFO arrays and related info.
Definition av1_common_int.h:503
int mi_rows
Definition av1_common_int.h:524
int mi_cols
Definition av1_common_int.h:529
int mi_stride
Definition av1_common_int.h:569
MB_MODE_INFO ** mi_grid_base
Definition av1_common_int.h:561
Stores the prediction/txfm mode of the current coding block.
Definition blockd.h:222
BLOCK_SIZE bsize
The block size of the current coding block.
Definition blockd.h:228
Encoder parameters related to multi-threading.
Definition encoder.h:1736
YV12 frame buffer data structure.
Definition yv12config.h:46