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