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
20 extern "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 
42 
47 
55  int sb_index;
79  int rdmult;
83  int8_t *map;
88  int64_t thresh_rate_sb;
93  int64_t thresh_dist_sb;
98  int16_t motion_thresh;
103 
108 
113 
115  int qindex_delta[3];
116  double weight_segment;
117  int apply_cyclic_refresh;
118  int skip_over4x4;
119  int counter_encode_maxq_scene_change;
120  int use_block_sad_scene_det;
122 };
123 
124 struct AV1_COMP;
125 
126 typedef struct CYCLIC_REFRESH CYCLIC_REFRESH;
127 
128 CYCLIC_REFRESH *av1_cyclic_refresh_alloc(int mi_rows, int mi_cols);
129 
130 void av1_cyclic_refresh_free(CYCLIC_REFRESH *cr);
131 
147 int av1_cyclic_refresh_estimate_bits_at_q(const struct AV1_COMP *cpi,
148  double correction_factor);
149 
168 int av1_cyclic_refresh_rc_bits_per_mb(const struct AV1_COMP *cpi, int i,
169  double correction_factor);
170 
193 void av1_cyclic_reset_segment_skip(const struct AV1_COMP *cpi,
194  MACROBLOCK *const x, int mi_row, int mi_col,
195  BLOCK_SIZE bsize, RUN_TYPE dry_run);
196 
221 void av1_cyclic_refresh_update_segment(const struct AV1_COMP *cpi,
222  MACROBLOCK *const x, int mi_row,
223  int mi_col, BLOCK_SIZE bsize,
224  int64_t rate, int64_t dist, int skip,
225  RUN_TYPE dry_run);
226 
242 
260  CYCLIC_REFRESH *const cyclic_refresh, const MACROBLOCK *const x);
261 
272 void av1_cyclic_refresh_set_golden_update(struct AV1_COMP *const cpi);
273 
289 void av1_cyclic_refresh_update_parameters(struct AV1_COMP *const cpi);
290 
304 void av1_cyclic_refresh_setup(struct AV1_COMP *const cpi);
305 
306 int av1_cyclic_refresh_get_rdmult(const CYCLIC_REFRESH *cr);
307 
308 void av1_cyclic_refresh_reset_resize(struct AV1_COMP *const cpi);
309 
310 int av1_cyclic_refresh_disable_lf_cdef(struct AV1_COMP *const cpi);
311 
312 static INLINE int cyclic_refresh_segment_id_boosted(int segment_id) {
313  return segment_id == CR_SEGMENT_ID_BOOST1 ||
314  segment_id == CR_SEGMENT_ID_BOOST2;
315 }
316 
317 static INLINE int cyclic_refresh_segment_id(int segment_id) {
318  if (segment_id == CR_SEGMENT_ID_BOOST1)
319  return CR_SEGMENT_ID_BOOST1;
320  else if (segment_id == CR_SEGMENT_ID_BOOST2)
321  return CR_SEGMENT_ID_BOOST2;
322  else
323  return CR_SEGMENT_ID_BASE;
324 }
325 
326 #ifdef __cplusplus
327 } // extern "C"
328 #endif
329 
330 #endif // AOM_AV1_ENCODER_AQ_CYCLICREFRESH_H_
void av1_cyclic_refresh_update_parameters(struct AV1_COMP *const cpi)
Set the global/frame level parameters for cyclic refresh.
int64_t thresh_dist_sb
Definition: aq_cyclicrefresh.h:93
void av1_cyclic_refresh_setup(struct AV1_COMP *const cpi)
Setup the cyclic background refresh.
int time_for_refresh
Definition: aq_cyclicrefresh.h:61
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 sb_index
Definition: aq_cyclicrefresh.h:55
void av1_cyclic_reset_segment_skip(const struct AV1_COMP *cpi, MACROBLOCK *const x, int mi_row, int mi_col, BLOCK_SIZE bsize, RUN_TYPE dry_run)
Update segment_id for blocks are skipped.
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.
double rate_ratio_qdelta
Definition: aq_cyclicrefresh.h:102
int target_num_seg_blocks
Definition: aq_cyclicrefresh.h:65
double rate_ratio_qdelta_adjustment
Definition: aq_cyclicrefresh.h:107
int16_t motion_thresh
Definition: aq_cyclicrefresh.h:98
int64_t thresh_rate_sb
Definition: aq_cyclicrefresh.h:88
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.
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.
Top level encoder structure.
Definition: encoder.h:2759
int percent_refresh_adjustment
Definition: aq_cyclicrefresh.h:46
int actual_num_seg1_blocks
Definition: aq_cyclicrefresh.h:70
int actual_num_seg2_blocks
Definition: aq_cyclicrefresh.h:75
int rdmult
Definition: aq_cyclicrefresh.h:79
int percent_refresh
Definition: aq_cyclicrefresh.h:41
int max_qdelta_perc
Definition: aq_cyclicrefresh.h:51
The stucture of CYCLIC_REFRESH.
Definition: aq_cyclicrefresh.h:36
Encoder's parameters related to the current coding block.
Definition: block.h:849
int rate_boost_fac
Definition: aq_cyclicrefresh.h:112
int8_t * map
Definition: aq_cyclicrefresh.h:83