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
14ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#include "vp9/encoder/vp9_lookahead.h"
15ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#include "vp9/encoder/vp9_ratectrl.h"
16ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
172ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#ifdef __cplusplus
182ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianextern "C" {
192ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#endif
2090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
21ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#if CONFIG_FP_MB_STATS
22ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
23ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#define FPMB_DCINTRA_MASK 0x01
24ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
25ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#define FPMB_MOTION_ZERO_MASK 0x02
26ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#define FPMB_MOTION_LEFT_MASK 0x04
27ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#define FPMB_MOTION_RIGHT_MASK 0x08
28ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#define FPMB_MOTION_UP_MASK 0x10
29ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#define FPMB_MOTION_DOWN_MASK 0x20
30ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
31ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#define FPMB_ERROR_SMALL_MASK 0x40
32ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#define FPMB_ERROR_LARGE_MASK 0x80
33ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#define FPMB_ERROR_SMALL_TH 2000
34ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#define FPMB_ERROR_LARGE_TH 48000
35ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
36ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramaniantypedef struct {
37ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  uint8_t *mb_stats_start;
38ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  uint8_t *mb_stats_end;
39ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian} FIRSTPASS_MB_STATS;
40ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#endif
41ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
42da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#define VLOW_MOTION_THRESHOLD 950
43da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
442ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramaniantypedef struct {
452ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian  double frame;
46da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  double weight;
472ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian  double intra_error;
482ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian  double coded_error;
492ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian  double sr_coded_error;
502ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian  double pcnt_inter;
512ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian  double pcnt_motion;
522ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian  double pcnt_second_ref;
532ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian  double pcnt_neutral;
54da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  double intra_skip_pct;
55da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  double inactive_zone_rows;  // Image mask rows top and bottom.
56da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  double inactive_zone_cols;  // Image mask columns at left and right edges.
572ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian  double MVr;
582ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian  double mvr_abs;
592ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian  double MVc;
602ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian  double mvc_abs;
612ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian  double MVrv;
622ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian  double MVcv;
632ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian  double mv_in_out_count;
642ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian  double new_mv_count;
652ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian  double duration;
662ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian  double count;
674fb68e5dd4e93c7599dc905d861de11ac39c5585hkuang  int64_t spatial_layer_id;
682ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian} FIRSTPASS_STATS;
692ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian
70ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramaniantypedef enum {
71ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  KF_UPDATE = 0,
72ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  LF_UPDATE = 1,
73ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  GF_UPDATE = 2,
74ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  ARF_UPDATE = 3,
75ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  OVERLAY_UPDATE = 4,
76ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  FRAME_UPDATE_TYPES = 5
77ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian} FRAME_UPDATE_TYPE;
78ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
79da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#define FC_ANIMATION_THRESH 0.15
80da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramaniantypedef enum {
81da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  FC_NORMAL = 0,
82da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  FC_GRAPHICS_ANIMATION = 1,
83da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  FRAME_CONTENT_TYPES = 2
84da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian} FRAME_CONTENT_TYPE;
85da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
86ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramaniantypedef struct {
87ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  unsigned char index;
88ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  RATE_FACTOR_LEVEL rf_level[(MAX_LAG_BUFFERS * 2) + 1];
89ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  FRAME_UPDATE_TYPE update_type[(MAX_LAG_BUFFERS * 2) + 1];
90ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  unsigned char arf_src_offset[(MAX_LAG_BUFFERS * 2) + 1];
91ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  unsigned char arf_update_idx[(MAX_LAG_BUFFERS * 2) + 1];
92ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  unsigned char arf_ref_idx[(MAX_LAG_BUFFERS * 2) + 1];
93ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  int bit_allocation[(MAX_LAG_BUFFERS * 2) + 1];
94ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian} GF_GROUP;
95ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
96ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramaniantypedef struct {
972ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian  unsigned int section_intra_rating;
982ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian  FIRSTPASS_STATS total_stats;
992ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian  FIRSTPASS_STATS this_frame_stats;
1002ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian  const FIRSTPASS_STATS *stats_in;
1012ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian  const FIRSTPASS_STATS *stats_in_start;
1022ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian  const FIRSTPASS_STATS *stats_in_end;
1032ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian  FIRSTPASS_STATS total_left_stats;
1042ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian  int first_pass_done;
1052ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian  int64_t bits_left;
1062ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian  double modified_error_min;
1072ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian  double modified_error_max;
1082ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian  double modified_error_left;
109da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  double mb_av_energy;
110ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
111ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#if CONFIG_FP_MB_STATS
112ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  uint8_t *frame_mb_stats_buf;
113ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  uint8_t *this_frame_mb_stats;
114ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  FIRSTPASS_MB_STATS firstpass_mb_stats;
115ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#endif
116da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  // An indication of the content type of the current frame
117da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  FRAME_CONTENT_TYPE fr_content_type;
1182ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian
1192ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian  // Projected total bits available for a key frame group of frames
1202ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian  int64_t kf_group_bits;
1212ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian
1222ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian  // Error score of frames still to be coded in kf group
1232ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian  int64_t kf_group_error_left;
124da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
125da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  // The fraction for a kf groups total bits allocated to the inter frames
126da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  double kfgroup_inter_fraction;
127da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
1282ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian  int sr_update_lag;
1292ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian
1302ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian  int kf_zeromotion_pct;
131da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  int last_kfgroup_zeromotion_pct;
1322ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian  int gf_zeromotion_pct;
1332ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian  int active_worst_quality;
134da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  int baseline_active_worst_quality;
135da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  int extend_minq;
136da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  int extend_maxq;
137da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  int extend_minq_fast;
138ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
139ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  GF_GROUP gf_group;
140ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian} TWO_PASS;
1412ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian
1422ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianstruct VP9_COMP;
1432ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian
1442ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianvoid vp9_init_first_pass(struct VP9_COMP *cpi);
1452ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianvoid vp9_rc_get_first_pass_params(struct VP9_COMP *cpi);
146da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanianvoid vp9_first_pass(struct VP9_COMP *cpi, const struct lookahead_entry *source);
1472ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianvoid vp9_end_first_pass(struct VP9_COMP *cpi);
1482ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian
1492ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianvoid vp9_init_second_pass(struct VP9_COMP *cpi);
1502ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianvoid vp9_rc_get_second_pass_params(struct VP9_COMP *cpi);
151da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanianvoid vp9_twopass_postencode_update(struct VP9_COMP *cpi);
1522ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian
1532ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian// Post encode update of the rate control parameters for 2-pass
1544fb68e5dd4e93c7599dc905d861de11ac39c5585hkuangvoid vp9_twopass_postencode_update(struct VP9_COMP *cpi);
155da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
156da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanianvoid calculate_coded_size(struct VP9_COMP *cpi,
157da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian                          int *scaled_frame_width,
158da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian                          int *scaled_frame_height);
159da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
1602ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#ifdef __cplusplus
1612ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian}  // extern "C"
1622ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#endif
16390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
164ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif  // VP9_ENCODER_VP9_FIRSTPASS_H_
165