190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/*
2f71323e297a928af368937089d3ed71239786f86Andreas Huber *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *
4f71323e297a928af368937089d3ed71239786f86Andreas Huber *  Use of this source code is governed by a BSD-style license
5f71323e297a928af368937089d3ed71239786f86Andreas Huber *  that can be found in the LICENSE file in the root of the source
6f71323e297a928af368937089d3ed71239786f86Andreas Huber *  tree. An additional intellectual property rights grant can be found
7f71323e297a928af368937089d3ed71239786f86Andreas Huber *  in the file PATENTS.  All contributing project authors may
8f71323e297a928af368937089d3ed71239786f86Andreas Huber *  be found in the AUTHORS file in the root of the source tree.
990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */
1090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
11ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#ifndef VP9_ENCODER_VP9_FIRSTPASS_H_
12ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#define VP9_ENCODER_VP9_FIRSTPASS_H_
1390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
14b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#ifdef __cplusplus
15b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianextern "C" {
16b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#endif
1790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
18b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramaniantypedef struct {
19b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  double frame;
20b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  double intra_error;
21b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  double coded_error;
22b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  double sr_coded_error;
23b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  double ssim_weighted_pred_err;
24b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  double pcnt_inter;
25b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  double pcnt_motion;
26b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  double pcnt_second_ref;
27b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  double pcnt_neutral;
28b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  double MVr;
29b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  double mvr_abs;
30b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  double MVc;
31b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  double mvc_abs;
32b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  double MVrv;
33b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  double MVcv;
34b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  double mv_in_out_count;
35b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  double new_mv_count;
36b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  double duration;
37b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  double count;
386ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  int64_t spatial_layer_id;
39b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian} FIRSTPASS_STATS;
40b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
41b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstruct twopass_rc {
42b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  unsigned int section_intra_rating;
43b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  unsigned int next_iiratio;
44b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  unsigned int this_iiratio;
45b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  FIRSTPASS_STATS total_stats;
46b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  FIRSTPASS_STATS this_frame_stats;
47b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  const FIRSTPASS_STATS *stats_in;
48b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  const FIRSTPASS_STATS *stats_in_start;
49b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  const FIRSTPASS_STATS *stats_in_end;
50b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  FIRSTPASS_STATS total_left_stats;
51b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int first_pass_done;
52b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int64_t bits_left;
53b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int64_t clip_bits_total;
54b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  double avg_iiratio;
55b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  double modified_error_min;
56b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  double modified_error_max;
57b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  double modified_error_total;
58b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  double modified_error_left;
59b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  double kf_intra_err_min;
60b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  double gf_intra_err_min;
61b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int kf_bits;
62b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // Remaining error from uncoded frames in a gf group. Two pass use only
63b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int64_t gf_group_error_left;
64b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
65b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // Projected total bits available for a key frame group of frames
66b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int64_t kf_group_bits;
67b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
68b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // Error score of frames still to be coded in kf group
69b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int64_t kf_group_error_left;
70b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
71b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // Projected Bits available for a group of frames including 1 GF or ARF
72b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int64_t gf_group_bits;
73b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  // Bits for the golden frame or ARF - 2 pass only
74b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int gf_bits;
75b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int alt_extra_bits;
76b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
77b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int sr_update_lag;
78b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
79b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int kf_zeromotion_pct;
80b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int gf_zeromotion_pct;
81b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
82b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int active_worst_quality;
83b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian};
84b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
85b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstruct VP9_COMP;
86b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
87b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianvoid vp9_init_first_pass(struct VP9_COMP *cpi);
88b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianvoid vp9_rc_get_first_pass_params(struct VP9_COMP *cpi);
89b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianvoid vp9_first_pass(struct VP9_COMP *cpi);
90b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianvoid vp9_end_first_pass(struct VP9_COMP *cpi);
91b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
92b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianvoid vp9_init_second_pass(struct VP9_COMP *cpi);
93b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianvoid vp9_rc_get_second_pass_params(struct VP9_COMP *cpi);
94b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianint vp9_twopass_worst_quality(struct VP9_COMP *cpi, FIRSTPASS_STATS *fpstats,
95b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                              int section_target_bandwitdh);
96b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
97b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian// Post encode update of the rate control parameters for 2-pass
986ac915abcdb404a00d927fe6308a47fcf09d9519hkuangvoid vp9_twopass_postencode_update(struct VP9_COMP *cpi);
99b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#ifdef __cplusplus
100b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian}  // extern "C"
101b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#endif
10290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
103ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif  // VP9_ENCODER_VP9_FIRSTPASS_H_
104