Coverage Report

Created: 2024-09-06 07:53

/src/libvpx/vp9/encoder/vp9_firstpass.h
Line
Count
Source (jump to first uncovered line)
1
/*
2
 *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3
 *
4
 *  Use of this source code is governed by a BSD-style license
5
 *  that can be found in the LICENSE file in the root of the source
6
 *  tree. An additional intellectual property rights grant can be found
7
 *  in the file PATENTS.  All contributing project authors may
8
 *  be found in the AUTHORS file in the root of the source tree.
9
 */
10
11
#ifndef VPX_VP9_ENCODER_VP9_FIRSTPASS_H_
12
#define VPX_VP9_ENCODER_VP9_FIRSTPASS_H_
13
14
#include <assert.h>
15
16
#include "vp9/common/vp9_onyxc_int.h"
17
#include "vp9/encoder/vp9_firstpass_stats.h"
18
#include "vp9/encoder/vp9_lookahead.h"
19
#include "vp9/encoder/vp9_ratectrl.h"
20
21
#ifdef __cplusplus
22
extern "C" {
23
#endif
24
25
0
#define INVALID_ROW (-1)
26
27
0
#define MAX_ARF_LAYERS 6
28
0
#define SECTION_NOISE_DEF 250.0
29
30
typedef struct {
31
  double frame_mb_intra_factor;
32
  double frame_mb_brightness_factor;
33
  double frame_mb_neutral_count;
34
} FP_MB_FLOAT_STATS;
35
36
typedef struct {
37
  double intra_factor;
38
  double brightness_factor;
39
  int64_t coded_error;
40
  int64_t sr_coded_error;
41
  int64_t frame_noise_energy;
42
  int64_t intra_error;
43
  int intercount;
44
  int second_ref_count;
45
  double neutral_count;
46
  double intra_count_low;   // Coded intra but low variance
47
  double intra_count_high;  // Coded intra high variance
48
  int intra_skip_count;
49
  int image_data_start_row;
50
  int mvcount;
51
  int sum_mvr;
52
  int sum_mvr_abs;
53
  int sum_mvc;
54
  int sum_mvc_abs;
55
  int64_t sum_mvrs;
56
  int64_t sum_mvcs;
57
  int sum_in_vectors;
58
  int intra_smooth_count;
59
  int new_mv_count;
60
} FIRSTPASS_DATA;
61
62
typedef enum {
63
  KF_UPDATE = 0,
64
  LF_UPDATE = 1,
65
  GF_UPDATE = 2,
66
  ARF_UPDATE = 3,
67
  OVERLAY_UPDATE = 4,
68
  MID_OVERLAY_UPDATE = 5,
69
  USE_BUF_FRAME = 6,  // Use show existing frame, no ref buffer update
70
  FRAME_UPDATE_TYPES = 7
71
} FRAME_UPDATE_TYPE;
72
73
0
#define FC_ANIMATION_THRESH 0.15
74
typedef enum {
75
  FC_NORMAL = 0,
76
  FC_GRAPHICS_ANIMATION = 1,
77
  FRAME_CONTENT_TYPES = 2
78
} FRAME_CONTENT_TYPE;
79
80
typedef struct ExternalRcReference {
81
  int last_index;
82
  int golden_index;
83
  int altref_index;
84
} ExternalRcReference;
85
86
typedef struct {
87
  unsigned char index;
88
  RATE_FACTOR_LEVEL rf_level[MAX_STATIC_GF_GROUP_LENGTH + 2];
89
  FRAME_UPDATE_TYPE update_type[MAX_STATIC_GF_GROUP_LENGTH + 2];
90
  unsigned char arf_src_offset[MAX_STATIC_GF_GROUP_LENGTH + 2];
91
  unsigned char layer_depth[MAX_STATIC_GF_GROUP_LENGTH + 2];
92
  unsigned char frame_gop_index[MAX_STATIC_GF_GROUP_LENGTH + 2];
93
  int bit_allocation[MAX_STATIC_GF_GROUP_LENGTH + 2];
94
  int gfu_boost[MAX_STATIC_GF_GROUP_LENGTH + 2];
95
  int update_ref_idx[MAX_STATIC_GF_GROUP_LENGTH + 2];
96
97
  int frame_start;
98
  int frame_end;
99
  // TODO(jingning): The array size of arf_stack could be reduced.
100
  int arf_index_stack[MAX_LAG_BUFFERS * 2];
101
  int top_arf_idx;
102
  int stack_size;
103
  int gf_group_size;
104
  int max_layer_depth;
105
  int allowed_max_layer_depth;
106
  int group_noise_energy;
107
108
  // Structure to store the reference information from external RC.
109
  // Used to override reference frame decisions in libvpx.
110
  ExternalRcReference ext_rc_ref[MAX_STATIC_GF_GROUP_LENGTH + 2];
111
  int ref_frame_list[MAX_STATIC_GF_GROUP_LENGTH + 2][REFS_PER_FRAME];
112
} GF_GROUP;
113
114
typedef struct {
115
  const FIRSTPASS_STATS *stats;
116
  int num_frames;
117
} FIRST_PASS_INFO;
118
119
static INLINE void fps_init_first_pass_info(FIRST_PASS_INFO *first_pass_info,
120
                                            const FIRSTPASS_STATS *stats,
121
0
                                            int num_frames) {
122
0
  first_pass_info->stats = stats;
123
0
  first_pass_info->num_frames = num_frames;
124
0
}
Unexecuted instantiation: vp9_cx_iface.c:fps_init_first_pass_info
Unexecuted instantiation: vp9_firstpass.c:fps_init_first_pass_info
Unexecuted instantiation: vp9_mcomp.c:fps_init_first_pass_info
Unexecuted instantiation: vp9_encoder.c:fps_init_first_pass_info
Unexecuted instantiation: vp9_picklpf.c:fps_init_first_pass_info
Unexecuted instantiation: vp9_quantize.c:fps_init_first_pass_info
Unexecuted instantiation: vp9_ratectrl.c:fps_init_first_pass_info
Unexecuted instantiation: vp9_rd.c:fps_init_first_pass_info
Unexecuted instantiation: vp9_segmentation.c:fps_init_first_pass_info
Unexecuted instantiation: vp9_speed_features.c:fps_init_first_pass_info
Unexecuted instantiation: vp9_svc_layercontext.c:fps_init_first_pass_info
Unexecuted instantiation: vp9_tokenize.c:fps_init_first_pass_info
Unexecuted instantiation: vp9_aq_variance.c:fps_init_first_pass_info
Unexecuted instantiation: vp9_aq_360.c:fps_init_first_pass_info
Unexecuted instantiation: vp9_aq_cyclicrefresh.c:fps_init_first_pass_info
Unexecuted instantiation: vp9_aq_complexity.c:fps_init_first_pass_info
Unexecuted instantiation: vp9_alt_ref_aq.c:fps_init_first_pass_info
Unexecuted instantiation: vp9_skin_detection.c:fps_init_first_pass_info
Unexecuted instantiation: vp9_noise_estimate.c:fps_init_first_pass_info
Unexecuted instantiation: vp9_ext_ratectrl.c:fps_init_first_pass_info
Unexecuted instantiation: vp9_temporal_filter.c:fps_init_first_pass_info
Unexecuted instantiation: vp9_tpl_model.c:fps_init_first_pass_info
Unexecuted instantiation: vp9_mbgraph.c:fps_init_first_pass_info
Unexecuted instantiation: vp9_bitstream.c:fps_init_first_pass_info
Unexecuted instantiation: vp9_context_tree.c:fps_init_first_pass_info
Unexecuted instantiation: vp9_encodeframe.c:fps_init_first_pass_info
Unexecuted instantiation: vp9_encodemb.c:fps_init_first_pass_info
Unexecuted instantiation: vp9_encodemv.c:fps_init_first_pass_info
Unexecuted instantiation: vp9_ethread.c:fps_init_first_pass_info
Unexecuted instantiation: vp9_frame_scale.c:fps_init_first_pass_info
Unexecuted instantiation: vp9_lookahead.c:fps_init_first_pass_info
Unexecuted instantiation: vp9_multi_thread.c:fps_init_first_pass_info
Unexecuted instantiation: vp9_rdopt.c:fps_init_first_pass_info
Unexecuted instantiation: vp9_pickmode.c:fps_init_first_pass_info
Unexecuted instantiation: temporal_filter_sse4.c:fps_init_first_pass_info
Unexecuted instantiation: highbd_temporal_filter_sse4.c:fps_init_first_pass_info
125
126
0
static INLINE int fps_get_num_frames(const FIRST_PASS_INFO *first_pass_info) {
127
0
  return first_pass_info->num_frames;
128
0
}
Unexecuted instantiation: vp9_cx_iface.c:fps_get_num_frames
Unexecuted instantiation: vp9_firstpass.c:fps_get_num_frames
Unexecuted instantiation: vp9_mcomp.c:fps_get_num_frames
Unexecuted instantiation: vp9_encoder.c:fps_get_num_frames
Unexecuted instantiation: vp9_picklpf.c:fps_get_num_frames
Unexecuted instantiation: vp9_quantize.c:fps_get_num_frames
Unexecuted instantiation: vp9_ratectrl.c:fps_get_num_frames
Unexecuted instantiation: vp9_rd.c:fps_get_num_frames
Unexecuted instantiation: vp9_segmentation.c:fps_get_num_frames
Unexecuted instantiation: vp9_speed_features.c:fps_get_num_frames
Unexecuted instantiation: vp9_svc_layercontext.c:fps_get_num_frames
Unexecuted instantiation: vp9_tokenize.c:fps_get_num_frames
Unexecuted instantiation: vp9_aq_variance.c:fps_get_num_frames
Unexecuted instantiation: vp9_aq_360.c:fps_get_num_frames
Unexecuted instantiation: vp9_aq_cyclicrefresh.c:fps_get_num_frames
Unexecuted instantiation: vp9_aq_complexity.c:fps_get_num_frames
Unexecuted instantiation: vp9_alt_ref_aq.c:fps_get_num_frames
Unexecuted instantiation: vp9_skin_detection.c:fps_get_num_frames
Unexecuted instantiation: vp9_noise_estimate.c:fps_get_num_frames
Unexecuted instantiation: vp9_ext_ratectrl.c:fps_get_num_frames
Unexecuted instantiation: vp9_temporal_filter.c:fps_get_num_frames
Unexecuted instantiation: vp9_tpl_model.c:fps_get_num_frames
Unexecuted instantiation: vp9_mbgraph.c:fps_get_num_frames
Unexecuted instantiation: vp9_bitstream.c:fps_get_num_frames
Unexecuted instantiation: vp9_context_tree.c:fps_get_num_frames
Unexecuted instantiation: vp9_encodeframe.c:fps_get_num_frames
Unexecuted instantiation: vp9_encodemb.c:fps_get_num_frames
Unexecuted instantiation: vp9_encodemv.c:fps_get_num_frames
Unexecuted instantiation: vp9_ethread.c:fps_get_num_frames
Unexecuted instantiation: vp9_frame_scale.c:fps_get_num_frames
Unexecuted instantiation: vp9_lookahead.c:fps_get_num_frames
Unexecuted instantiation: vp9_multi_thread.c:fps_get_num_frames
Unexecuted instantiation: vp9_rdopt.c:fps_get_num_frames
Unexecuted instantiation: vp9_pickmode.c:fps_get_num_frames
Unexecuted instantiation: temporal_filter_sse4.c:fps_get_num_frames
Unexecuted instantiation: highbd_temporal_filter_sse4.c:fps_get_num_frames
129
130
static INLINE const FIRSTPASS_STATS *fps_get_frame_stats(
131
0
    const FIRST_PASS_INFO *first_pass_info, int show_idx) {
132
0
  if (show_idx < 0 || show_idx >= first_pass_info->num_frames) {
133
0
    return NULL;
134
0
  }
135
0
  return &first_pass_info->stats[show_idx];
136
0
}
Unexecuted instantiation: vp9_cx_iface.c:fps_get_frame_stats
Unexecuted instantiation: vp9_firstpass.c:fps_get_frame_stats
Unexecuted instantiation: vp9_mcomp.c:fps_get_frame_stats
Unexecuted instantiation: vp9_encoder.c:fps_get_frame_stats
Unexecuted instantiation: vp9_picklpf.c:fps_get_frame_stats
Unexecuted instantiation: vp9_quantize.c:fps_get_frame_stats
Unexecuted instantiation: vp9_ratectrl.c:fps_get_frame_stats
Unexecuted instantiation: vp9_rd.c:fps_get_frame_stats
Unexecuted instantiation: vp9_segmentation.c:fps_get_frame_stats
Unexecuted instantiation: vp9_speed_features.c:fps_get_frame_stats
Unexecuted instantiation: vp9_svc_layercontext.c:fps_get_frame_stats
Unexecuted instantiation: vp9_tokenize.c:fps_get_frame_stats
Unexecuted instantiation: vp9_aq_variance.c:fps_get_frame_stats
Unexecuted instantiation: vp9_aq_360.c:fps_get_frame_stats
Unexecuted instantiation: vp9_aq_cyclicrefresh.c:fps_get_frame_stats
Unexecuted instantiation: vp9_aq_complexity.c:fps_get_frame_stats
Unexecuted instantiation: vp9_alt_ref_aq.c:fps_get_frame_stats
Unexecuted instantiation: vp9_skin_detection.c:fps_get_frame_stats
Unexecuted instantiation: vp9_noise_estimate.c:fps_get_frame_stats
Unexecuted instantiation: vp9_ext_ratectrl.c:fps_get_frame_stats
Unexecuted instantiation: vp9_temporal_filter.c:fps_get_frame_stats
Unexecuted instantiation: vp9_tpl_model.c:fps_get_frame_stats
Unexecuted instantiation: vp9_mbgraph.c:fps_get_frame_stats
Unexecuted instantiation: vp9_bitstream.c:fps_get_frame_stats
Unexecuted instantiation: vp9_context_tree.c:fps_get_frame_stats
Unexecuted instantiation: vp9_encodeframe.c:fps_get_frame_stats
Unexecuted instantiation: vp9_encodemb.c:fps_get_frame_stats
Unexecuted instantiation: vp9_encodemv.c:fps_get_frame_stats
Unexecuted instantiation: vp9_ethread.c:fps_get_frame_stats
Unexecuted instantiation: vp9_frame_scale.c:fps_get_frame_stats
Unexecuted instantiation: vp9_lookahead.c:fps_get_frame_stats
Unexecuted instantiation: vp9_multi_thread.c:fps_get_frame_stats
Unexecuted instantiation: vp9_rdopt.c:fps_get_frame_stats
Unexecuted instantiation: vp9_pickmode.c:fps_get_frame_stats
Unexecuted instantiation: temporal_filter_sse4.c:fps_get_frame_stats
Unexecuted instantiation: highbd_temporal_filter_sse4.c:fps_get_frame_stats
137
138
typedef struct {
139
  unsigned int section_intra_rating;
140
  unsigned int key_frame_section_intra_rating;
141
  FIRSTPASS_STATS total_stats;
142
  FIRSTPASS_STATS this_frame_stats;
143
  const FIRSTPASS_STATS *stats_in;
144
  const FIRSTPASS_STATS *stats_in_start;
145
  const FIRSTPASS_STATS *stats_in_end;
146
  FIRST_PASS_INFO first_pass_info;
147
  FIRSTPASS_STATS total_left_stats;
148
  int first_pass_done;
149
  int64_t bits_left;
150
  double mean_mod_score;
151
  double normalized_score_left;
152
  double mb_av_energy;
153
  double mb_smooth_pct;
154
155
  FP_MB_FLOAT_STATS *fp_mb_float_stats;
156
157
  // An indication of the content type of the current frame
158
  FRAME_CONTENT_TYPE fr_content_type;
159
160
  // Projected total bits available for a key frame group of frames
161
  int64_t kf_group_bits;
162
163
  // Error score of frames still to be coded in kf group
164
  double kf_group_error_left;
165
166
  double bpm_factor;
167
  int rolling_arf_group_target_bits;
168
  int rolling_arf_group_actual_bits;
169
170
  int sr_update_lag;
171
  int kf_zeromotion_pct;
172
  int last_kfgroup_zeromotion_pct;
173
  int active_worst_quality;
174
  int baseline_active_worst_quality;
175
  int extend_minq;
176
  int extend_maxq;
177
  int extend_minq_fast;
178
  int arnr_strength_adjustment;
179
  int last_qindex_of_arf_layer[MAX_ARF_LAYERS];
180
181
  GF_GROUP gf_group;
182
183
  // Vizeir project experimental two pass rate control parameters.
184
  // When |use_vizier_rc_params| is 1, the following parameters will
185
  // be overwritten by pass in values. Otherwise, they are initialized
186
  // by default values.
187
  int use_vizier_rc_params;
188
  double active_wq_factor;
189
  double err_per_mb;
190
  double sr_default_decay_limit;
191
  double sr_diff_factor;
192
  double kf_err_per_mb;
193
  double kf_frame_min_boost;
194
  double kf_frame_max_boost_first;  // Max for first kf in a chunk.
195
  double kf_frame_max_boost_subs;   // Max for subsequent mid chunk kfs.
196
  double kf_max_total_boost;
197
  double gf_max_total_boost;
198
  double gf_frame_max_boost;
199
  double zm_factor;
200
} TWO_PASS;
201
202
struct VP9_COMP;
203
struct ThreadData;
204
struct TileDataEnc;
205
206
void vp9_init_first_pass(struct VP9_COMP *cpi);
207
void vp9_first_pass(struct VP9_COMP *cpi, const struct lookahead_entry *source);
208
void vp9_end_first_pass(struct VP9_COMP *cpi);
209
210
void vp9_first_pass_encode_tile_mb_row(struct VP9_COMP *cpi,
211
                                       struct ThreadData *td,
212
                                       FIRSTPASS_DATA *fp_acc_data,
213
                                       struct TileDataEnc *tile_data,
214
                                       MV *best_ref_mv, int mb_row);
215
216
void vp9_init_second_pass(struct VP9_COMP *cpi);
217
void vp9_rc_get_second_pass_params(struct VP9_COMP *cpi);
218
void vp9_init_vizier_params(TWO_PASS *const twopass, int screen_area);
219
220
// Post encode update of the rate control parameters for 2-pass
221
void vp9_twopass_postencode_update(struct VP9_COMP *cpi);
222
223
void calculate_coded_size(struct VP9_COMP *cpi, int *scaled_frame_width,
224
                          int *scaled_frame_height);
225
226
struct VP9EncoderConfig;
227
int vp9_get_frames_to_next_key(const struct VP9EncoderConfig *oxcf,
228
                               const TWO_PASS *const twopass, int kf_show_idx,
229
                               int min_gf_interval);
230
#if CONFIG_RATE_CTRL
231
/* Call this function to get info about the next group of pictures.
232
 * This function should be called after vp9_create_compressor() when encoding
233
 * starts or after vp9_get_compressed_data() when the encoding process of
234
 * the last group of pictures is just finished.
235
 */
236
void vp9_get_next_group_of_picture(const struct VP9_COMP *cpi,
237
                                   int *first_is_key_frame, int *use_alt_ref,
238
                                   int *coding_frame_count, int *first_show_idx,
239
                                   int *last_gop_use_alt_ref);
240
241
/*!\brief Call this function before coding a new group of pictures to get
242
 * information about it.
243
 * \param[in] oxcf                 Encoder config
244
 * \param[in] twopass              Twopass info
245
 * \param[in] frame_info           Frame info
246
 * \param[in] rc                   Rate control state
247
 * \param[in] show_idx             Show index of the first frame in the group
248
 * \param[in] multi_layer_arf      Is multi-layer alternate reference used
249
 * \param[in] allow_alt_ref        Is alternate reference allowed
250
 * \param[in] first_is_key_frame   Is the first frame in the group a key frame
251
 * \param[in] last_gop_use_alt_ref Does the last group use alternate reference
252
 *
253
 * \param[out] use_alt_ref         Does this group use alternate reference
254
 *
255
 * \return Returns coding frame count
256
 */
257
int vp9_get_gop_coding_frame_count(const struct VP9EncoderConfig *oxcf,
258
                                   const TWO_PASS *const twopass,
259
                                   const FRAME_INFO *frame_info,
260
                                   const RATE_CONTROL *rc, int show_idx,
261
                                   int multi_layer_arf, int allow_alt_ref,
262
                                   int first_is_key_frame,
263
                                   int last_gop_use_alt_ref, int *use_alt_ref);
264
265
int vp9_get_coding_frame_num(const struct VP9EncoderConfig *oxcf,
266
                             const TWO_PASS *const twopass,
267
                             const FRAME_INFO *frame_info, int multi_layer_arf,
268
                             int allow_alt_ref);
269
270
/*!\brief Compute a key frame binary map indicates whether key frames appear
271
 * in the corresponding positions. The passed in key_frame_map must point to an
272
 * integer array with length equal to twopass->first_pass_info.num_frames,
273
 * which is the number of show frames in the video.
274
 */
275
void vp9_get_key_frame_map(const struct VP9EncoderConfig *oxcf,
276
                           const TWO_PASS *const twopass, int *key_frame_map);
277
#endif  // CONFIG_RATE_CTRL
278
279
FIRSTPASS_STATS vp9_get_frame_stats(const TWO_PASS *twopass);
280
FIRSTPASS_STATS vp9_get_total_stats(const TWO_PASS *twopass);
281
282
#ifdef __cplusplus
283
}  // extern "C"
284
#endif
285
286
#endif  // VPX_VP9_ENCODER_VP9_FIRSTPASS_H_