12 #ifndef AOM_AV1_ENCODER_TEMPORAL_FILTER_H_
13 #define AOM_AV1_ENCODER_TEMPORAL_FILTER_H_
28 #define TF_BLOCK_SIZE BLOCK_32X32
31 #define TF_WINDOW_LENGTH 5
37 #define TF_WEIGHT_SCALE 1000
41 #define TF_WINDOW_BLOCK_BALANCE_WEIGHT 5
47 #define TF_Q_DECAY_THRESHOLD 20
51 #define TF_SEARCH_ERROR_NORM_WEIGHT 20
57 #define TF_STRENGTH_THRESHOLD 4
66 #define TF_SEARCH_DISTANCE_THRESHOLD 0.1
74 #define TF_QINDEX_CUTOFF 128
76 #define NOISE_ESTIMATION_EDGE_THRESHOLD 50
103 struct scale_factors sf;
107 double noise_levels[MAX_MB_PLANE];
152 } TemporalFilterData;
156 #if CONFIG_MULTITHREAD
158 pthread_mutex_t *mutex_;
159 #endif // CONFIG_MULTITHREAD
162 } AV1TemporalFilterSync;
179 const int bit_depth);
222 const int filter_frame_lookahead_idx,
223 FRAME_UPDATE_TYPE update_type,
int is_forward_keyframe,
224 int *show_existing_arf);
228 int av1_get_q(
const struct AV1_COMP *cpi);
237 static AOM_INLINE
void tf_alloc_and_reset_data(TemporalFilterData *tf_data,
239 int is_high_bitdepth) {
240 tf_data->tmp_mbmi = (
MB_MODE_INFO *)malloc(
sizeof(*tf_data->tmp_mbmi));
241 memset(tf_data->tmp_mbmi, 0,
sizeof(*tf_data->tmp_mbmi));
243 (uint32_t *)aom_memalign(16, num_pels *
sizeof(*tf_data->accum));
245 (uint16_t *)aom_memalign(16, num_pels *
sizeof(*tf_data->count));
246 memset(&tf_data->diff, 0,
sizeof(tf_data->diff));
247 if (is_high_bitdepth)
248 tf_data->pred = CONVERT_TO_BYTEPTR(
249 aom_memalign(32, num_pels * 2 *
sizeof(*tf_data->pred)));
252 (uint8_t *)aom_memalign(32, num_pels *
sizeof(*tf_data->pred));
262 static AOM_INLINE
void tf_setup_macroblockd(
MACROBLOCKD *mbd,
263 TemporalFilterData *tf_data,
264 const struct scale_factors *scale) {
267 mbd->
mi = &tf_data->tmp_mbmi;
277 static AOM_INLINE
void tf_dealloc_data(TemporalFilterData *tf_data,
278 int is_high_bitdepth) {
279 if (is_high_bitdepth)
280 tf_data->pred = (uint8_t *)CONVERT_TO_SHORTPTR(tf_data->pred);
281 free(tf_data->tmp_mbmi);
282 aom_free(tf_data->accum);
283 aom_free(tf_data->count);
284 aom_free(tf_data->pred);
297 uint8_t **input_buffer,
int num_planes) {
298 for (
int i = 0; i < num_planes; i++) {
299 input_buffer[i] = mbd->
plane[i].pre[0].buf;
301 *input_mbmi = mbd->
mi;
313 uint8_t **input_buffer,
int num_planes) {
314 for (
int i = 0; i < num_planes; i++) {
315 mbd->
plane[i].pre[0].buf = input_buffer[i];
317 mbd->
mi = input_mbmi;
325 #endif // AOM_AV1_ENCODER_TEMPORAL_FILTER_H_
int mb_cols
Definition: temporal_filter.h:119
Parameters related to temporal filtering.
Definition: temporal_filter.h:83
int check_show_existing
Definition: temporal_filter.h:99
int num_pels
Definition: temporal_filter.h:111
struct macroblockd_plane plane[3]
Definition: blockd.h:613
int filter_frame_idx
Definition: temporal_filter.h:95
int av1_temporal_filter(struct AV1_COMP *cpi, const int filter_frame_lookahead_idx, FRAME_UPDATE_TYPE update_type, int is_forward_keyframe, int *show_existing_arf)
Performs temporal filtering if needed on a source frame. For example to create a filtered alternate r...
const struct scale_factors * block_ref_scale_factors[2]
Definition: blockd.h:694
MOTION_MODE motion_mode
The motion mode used by the inter prediction.
Definition: blockd.h:250
int mb_rows
Definition: temporal_filter.h:115
YV12 frame buffer data structure.
Definition: yv12config.h:38
MB_MODE_INFO ** mi
Definition: blockd.h:624
Variables related to current coding block.
Definition: blockd.h:577
int q_factor
Definition: temporal_filter.h:127
Top level encoder structure.
Definition: encoder.h:2557
Stores the prediction/txfm mode of the current coding block.
Definition: blockd.h:222
int num_frames
Definition: temporal_filter.h:91
int is_highbitdepth
Definition: temporal_filter.h:123
void av1_tf_do_filtering_row(struct AV1_COMP *cpi, struct ThreadData *td, int mb_row)
Does temporal filter for a given macroblock row.
Definition: temporal_filter.c:762