pickcdef.h (8852B)
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 #define REDUCED_SEC_STRENGTHS_LVL3 2 37 #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 int mi_row, int mi_col) { 177 const int maxr = AOMMIN(mi_params->mi_rows - mi_row, MI_SIZE_64X64); 178 const int maxc = AOMMIN(mi_params->mi_cols - mi_col, MI_SIZE_64X64); 179 const int stride = mi_params->mi_stride; 180 MB_MODE_INFO **mbmi = mi_params->mi_grid_base + mi_row * stride + mi_col; 181 for (int r = 0; r < maxr; ++r, mbmi += stride) { 182 for (int c = 0; c < maxc; ++c) { 183 if (!mbmi[c]->skip_txfm) return 0; 184 } 185 } 186 return 1; 187 } 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 int fbr, int fbc) { 200 const MB_MODE_INFO *const mbmi = 201 mi_params->mi_grid_base[MI_SIZE_64X64 * fbr * mi_params->mi_stride + 202 MI_SIZE_64X64 * fbc]; 203 // No filtering if the entire filter block is skipped. 204 if (sb_all_skip(mi_params, fbr * MI_SIZE_64X64, fbc * MI_SIZE_64X64)) 205 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 if (((fbc & 1) && 210 (mbmi->bsize == BLOCK_128X128 || mbmi->bsize == BLOCK_128X64)) || 211 ((fbr & 1) && 212 (mbmi->bsize == BLOCK_128X128 || mbmi->bsize == BLOCK_64X128))) 213 return 1; 214 return 0; 215 } 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_