AOMedia AV1 Codec
aq_cyclicrefresh.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
12#ifndef AOM_AV1_ENCODER_AQ_CYCLICREFRESH_H_
13#define AOM_AV1_ENCODER_AQ_CYCLICREFRESH_H_
14
15#include "av1/common/blockd.h"
16#include "av1/encoder/block.h"
17#include "av1/encoder/tokenize.h"
18
19#ifdef __cplusplus
20extern "C" {
21#endif
22
23// The segment ids used in cyclic refresh: from base (no boost) to increasing
24// boost (higher delta-qp).
25#define CR_SEGMENT_ID_BASE 0
26#define CR_SEGMENT_ID_BOOST1 1
27#define CR_SEGMENT_ID_BOOST2 2
28
29// Maximum rate target ratio for setting segment delta-qp.
30#define CR_MAX_RATE_TARGET_RATIO 4.0
31
73 int rdmult;
77 int8_t *map;
101
103 int qindex_delta[3];
104 double weight_segment;
105 int apply_cyclic_refresh;
106 int skip_over4x4;
107 int counter_encode_maxq_scene_change;
108 int use_block_sad_scene_det;
110};
111
112struct AV1_COMP;
113
114typedef struct CYCLIC_REFRESH CYCLIC_REFRESH;
115
116CYCLIC_REFRESH *av1_cyclic_refresh_alloc(int mi_rows, int mi_cols);
117
118void av1_cyclic_refresh_free(CYCLIC_REFRESH *cr);
119
135int av1_cyclic_refresh_estimate_bits_at_q(const struct AV1_COMP *cpi,
136 double correction_factor);
137
156int av1_cyclic_refresh_rc_bits_per_mb(const struct AV1_COMP *cpi, int i,
157 double correction_factor);
158
179void av1_cyclic_reset_segment_skip(const struct AV1_COMP *cpi,
180 MACROBLOCK *const x, int mi_row, int mi_col,
181 BLOCK_SIZE bsize);
182
207void av1_cyclic_refresh_update_segment(const struct AV1_COMP *cpi,
208 MACROBLOCK *const x, int mi_row,
209 int mi_col, BLOCK_SIZE bsize,
210 int64_t rate, int64_t dist, int skip,
211 RUN_TYPE dry_run);
212
228
246 CYCLIC_REFRESH *const cyclic_refresh, const MACROBLOCK *const x);
247
258void av1_cyclic_refresh_set_golden_update(struct AV1_COMP *const cpi);
259
275void av1_cyclic_refresh_update_parameters(struct AV1_COMP *const cpi);
276
290void av1_cyclic_refresh_setup(struct AV1_COMP *const cpi);
291
292int av1_cyclic_refresh_get_rdmult(const CYCLIC_REFRESH *cr);
293
294void av1_cyclic_refresh_reset_resize(struct AV1_COMP *const cpi);
295
296int av1_cyclic_refresh_disable_lf_cdef(struct AV1_COMP *const cpi);
297
298static INLINE int cyclic_refresh_segment_id_boosted(int segment_id) {
299 return segment_id == CR_SEGMENT_ID_BOOST1 ||
300 segment_id == CR_SEGMENT_ID_BOOST2;
301}
302
303static INLINE int cyclic_refresh_segment_id(int segment_id) {
304 if (segment_id == CR_SEGMENT_ID_BOOST1)
305 return CR_SEGMENT_ID_BOOST1;
306 else if (segment_id == CR_SEGMENT_ID_BOOST2)
307 return CR_SEGMENT_ID_BOOST2;
308 else
309 return CR_SEGMENT_ID_BASE;
310}
311
312#ifdef __cplusplus
313} // extern "C"
314#endif
315
316#endif // AOM_AV1_ENCODER_AQ_CYCLICREFRESH_H_
int av1_cyclic_refresh_rc_bits_per_mb(const struct AV1_COMP *cpi, int i, double correction_factor)
Estimate the bits per mb, for given q = i and delta-q.
void av1_cyclic_refresh_update_parameters(struct AV1_COMP *const cpi)
Set the global/frame level parameters for cyclic refresh.
void av1_cyclic_refresh_update_segment(const struct AV1_COMP *cpi, MACROBLOCK *const x, int mi_row, int mi_col, BLOCK_SIZE bsize, int64_t rate, int64_t dist, int skip, RUN_TYPE dry_run)
Update segment_id for block based on mode selected.
int av1_cyclic_refresh_estimate_bits_at_q(const struct AV1_COMP *cpi, double correction_factor)
Estimate the bits, incorporating the delta-q from the segments.
void av1_accumulate_cyclic_refresh_counters(CYCLIC_REFRESH *const cyclic_refresh, const MACROBLOCK *const x)
Accumulate cyclic refresh counters.
void av1_cyclic_refresh_set_golden_update(struct AV1_COMP *const cpi)
Set golden frame update interval nased on cyclic refresh.
void av1_init_cyclic_refresh_counters(MACROBLOCK *const x)
Initialize counters used for cyclic refresh.
void av1_cyclic_reset_segment_skip(const struct AV1_COMP *cpi, MACROBLOCK *const x, int mi_row, int mi_col, BLOCK_SIZE bsize)
Update segment_id for blocks are skipped.
void av1_cyclic_refresh_setup(struct AV1_COMP *const cpi)
Setup the cyclic background refresh.
The stucture of CYCLIC_REFRESH.
Definition aq_cyclicrefresh.h:36
int16_t motion_thresh
Definition aq_cyclicrefresh.h:92
int64_t thresh_rate_sb
Definition aq_cyclicrefresh.h:82
int time_for_refresh
Definition aq_cyclicrefresh.h:55
int rdmult
Definition aq_cyclicrefresh.h:73
int max_qdelta_perc
Definition aq_cyclicrefresh.h:45
int8_t * map
Definition aq_cyclicrefresh.h:77
int64_t thresh_dist_sb
Definition aq_cyclicrefresh.h:87
int actual_num_seg2_blocks
Definition aq_cyclicrefresh.h:69
int target_num_seg_blocks
Definition aq_cyclicrefresh.h:59
int sb_index
Definition aq_cyclicrefresh.h:49
int rate_boost_fac
Definition aq_cyclicrefresh.h:100
int percent_refresh
Definition aq_cyclicrefresh.h:41
int actual_num_seg1_blocks
Definition aq_cyclicrefresh.h:64
double rate_ratio_qdelta
Definition aq_cyclicrefresh.h:96
Encoder's parameters related to the current coding block.
Definition block.h:848