Home | History | Annotate | Download | only in encoder
      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 VP9_ENCODER_VP9_FIRSTPASS_H_
     12 #define VP9_ENCODER_VP9_FIRSTPASS_H_
     13 
     14 #include "vp9/encoder/vp9_lookahead.h"
     15 #include "vp9/encoder/vp9_ratectrl.h"
     16 
     17 #ifdef __cplusplus
     18 extern "C" {
     19 #endif
     20 
     21 #if CONFIG_FP_MB_STATS
     22 
     23 #define FPMB_DCINTRA_MASK 0x01
     24 
     25 #define FPMB_MOTION_ZERO_MASK 0x02
     26 #define FPMB_MOTION_LEFT_MASK 0x04
     27 #define FPMB_MOTION_RIGHT_MASK 0x08
     28 #define FPMB_MOTION_UP_MASK 0x10
     29 #define FPMB_MOTION_DOWN_MASK 0x20
     30 
     31 #define FPMB_ERROR_SMALL_MASK 0x40
     32 #define FPMB_ERROR_LARGE_MASK 0x80
     33 #define FPMB_ERROR_SMALL_TH 2000
     34 #define FPMB_ERROR_LARGE_TH 48000
     35 
     36 typedef struct {
     37   uint8_t *mb_stats_start;
     38   uint8_t *mb_stats_end;
     39 } FIRSTPASS_MB_STATS;
     40 #endif
     41 
     42 #define VLOW_MOTION_THRESHOLD 950
     43 
     44 typedef struct {
     45   double frame;
     46   double weight;
     47   double intra_error;
     48   double coded_error;
     49   double sr_coded_error;
     50   double pcnt_inter;
     51   double pcnt_motion;
     52   double pcnt_second_ref;
     53   double pcnt_neutral;
     54   double intra_skip_pct;
     55   double inactive_zone_rows;  // Image mask rows top and bottom.
     56   double inactive_zone_cols;  // Image mask columns at left and right edges.
     57   double MVr;
     58   double mvr_abs;
     59   double MVc;
     60   double mvc_abs;
     61   double MVrv;
     62   double MVcv;
     63   double mv_in_out_count;
     64   double new_mv_count;
     65   double duration;
     66   double count;
     67   int64_t spatial_layer_id;
     68 } FIRSTPASS_STATS;
     69 
     70 typedef enum {
     71   KF_UPDATE = 0,
     72   LF_UPDATE = 1,
     73   GF_UPDATE = 2,
     74   ARF_UPDATE = 3,
     75   OVERLAY_UPDATE = 4,
     76   FRAME_UPDATE_TYPES = 5
     77 } FRAME_UPDATE_TYPE;
     78 
     79 #define FC_ANIMATION_THRESH 0.15
     80 typedef enum {
     81   FC_NORMAL = 0,
     82   FC_GRAPHICS_ANIMATION = 1,
     83   FRAME_CONTENT_TYPES = 2
     84 } FRAME_CONTENT_TYPE;
     85 
     86 typedef struct {
     87   unsigned char index;
     88   RATE_FACTOR_LEVEL rf_level[(MAX_LAG_BUFFERS * 2) + 1];
     89   FRAME_UPDATE_TYPE update_type[(MAX_LAG_BUFFERS * 2) + 1];
     90   unsigned char arf_src_offset[(MAX_LAG_BUFFERS * 2) + 1];
     91   unsigned char arf_update_idx[(MAX_LAG_BUFFERS * 2) + 1];
     92   unsigned char arf_ref_idx[(MAX_LAG_BUFFERS * 2) + 1];
     93   int bit_allocation[(MAX_LAG_BUFFERS * 2) + 1];
     94 } GF_GROUP;
     95 
     96 typedef struct {
     97   unsigned int section_intra_rating;
     98   FIRSTPASS_STATS total_stats;
     99   FIRSTPASS_STATS this_frame_stats;
    100   const FIRSTPASS_STATS *stats_in;
    101   const FIRSTPASS_STATS *stats_in_start;
    102   const FIRSTPASS_STATS *stats_in_end;
    103   FIRSTPASS_STATS total_left_stats;
    104   int first_pass_done;
    105   int64_t bits_left;
    106   double modified_error_min;
    107   double modified_error_max;
    108   double modified_error_left;
    109   double mb_av_energy;
    110 
    111 #if CONFIG_FP_MB_STATS
    112   uint8_t *frame_mb_stats_buf;
    113   uint8_t *this_frame_mb_stats;
    114   FIRSTPASS_MB_STATS firstpass_mb_stats;
    115 #endif
    116   // An indication of the content type of the current frame
    117   FRAME_CONTENT_TYPE fr_content_type;
    118 
    119   // Projected total bits available for a key frame group of frames
    120   int64_t kf_group_bits;
    121 
    122   // Error score of frames still to be coded in kf group
    123   int64_t kf_group_error_left;
    124 
    125   // The fraction for a kf groups total bits allocated to the inter frames
    126   double kfgroup_inter_fraction;
    127 
    128   int sr_update_lag;
    129 
    130   int kf_zeromotion_pct;
    131   int last_kfgroup_zeromotion_pct;
    132   int gf_zeromotion_pct;
    133   int active_worst_quality;
    134   int baseline_active_worst_quality;
    135   int extend_minq;
    136   int extend_maxq;
    137   int extend_minq_fast;
    138 
    139   GF_GROUP gf_group;
    140 } TWO_PASS;
    141 
    142 struct VP9_COMP;
    143 
    144 void vp9_init_first_pass(struct VP9_COMP *cpi);
    145 void vp9_rc_get_first_pass_params(struct VP9_COMP *cpi);
    146 void vp9_first_pass(struct VP9_COMP *cpi, const struct lookahead_entry *source);
    147 void vp9_end_first_pass(struct VP9_COMP *cpi);
    148 
    149 void vp9_init_second_pass(struct VP9_COMP *cpi);
    150 void vp9_rc_get_second_pass_params(struct VP9_COMP *cpi);
    151 void vp9_twopass_postencode_update(struct VP9_COMP *cpi);
    152 
    153 // Post encode update of the rate control parameters for 2-pass
    154 void vp9_twopass_postencode_update(struct VP9_COMP *cpi);
    155 
    156 void calculate_coded_size(struct VP9_COMP *cpi,
    157                           int *scaled_frame_width,
    158                           int *scaled_frame_height);
    159 
    160 #ifdef __cplusplus
    161 }  // extern "C"
    162 #endif
    163 
    164 #endif  // VP9_ENCODER_VP9_FIRSTPASS_H_
    165