Index: libvpx/source/libvpx/vp8/encoder/onyx_int.h |
diff --git a/libvpx/source/libvpx/vp8/encoder/onyx_int.h b/libvpx/source/libvpx/vp8/encoder/onyx_int.h |
index 127fe5db7d83f0a2e863e0930e3479068e792087..0e53f6803a939555fc6cb0b189ebe8edb4867b0a 100644 |
--- a/libvpx/source/libvpx/vp8/encoder/onyx_int.h |
+++ b/libvpx/source/libvpx/vp8/encoder/onyx_int.h |
@@ -29,7 +29,6 @@ |
#include "mcomp.h" |
#include "temporal_filter.h" |
#include "vp8/common/findnearmv.h" |
-#include "lookahead.h" |
//#define SPEEDSTATS 1 |
#define MIN_GF_INTERVAL 4 |
@@ -47,8 +46,8 @@ |
#define MIN_THRESHMULT 32 |
#define MAX_THRESHMULT 512 |
-#define GF_ZEROMV_ZBIN_BOOST 12 |
-#define LF_ZEROMV_ZBIN_BOOST 6 |
+#define GF_ZEROMV_ZBIN_BOOST 24 |
+#define LF_ZEROMV_ZBIN_BOOST 12 |
#define MV_ZBIN_BOOST 4 |
#define ZBIN_OQ_MAX 192 |
@@ -180,6 +179,9 @@ typedef struct |
int half_pixel_search; |
int quarter_pixel_search; |
int thresh_mult[MAX_MODES]; |
+ int full_freq[2]; |
+ int min_fs_radius; |
+ int max_fs_radius; |
int max_step_search_steps; |
int first_step; |
int optimize_coefficients; |
@@ -215,6 +217,14 @@ typedef struct |
void *ptr1; |
} LPFTHREAD_DATA; |
+typedef struct |
+{ |
+ INT64 source_time_stamp; |
+ INT64 source_end_time_stamp; |
+ |
+ DECLARE_ALIGNED(16, YV12_BUFFER_CONFIG, source_buffer); |
+ unsigned int source_frame_flags; |
+} SOURCE_SAMPLE; |
typedef struct VP8_ENCODER_RTCD |
{ |
@@ -237,21 +247,21 @@ enum |
BLOCK_MAX_SEGMENTS |
}; |
-typedef struct VP8_COMP |
+typedef struct |
{ |
DECLARE_ALIGNED(16, short, Y1quant[QINDEX_RANGE][16]); |
- DECLARE_ALIGNED(16, unsigned char, Y1quant_shift[QINDEX_RANGE][16]); |
+ DECLARE_ALIGNED(16, short, Y1quant_shift[QINDEX_RANGE][16]); |
DECLARE_ALIGNED(16, short, Y1zbin[QINDEX_RANGE][16]); |
DECLARE_ALIGNED(16, short, Y1round[QINDEX_RANGE][16]); |
DECLARE_ALIGNED(16, short, Y2quant[QINDEX_RANGE][16]); |
- DECLARE_ALIGNED(16, unsigned char, Y2quant_shift[QINDEX_RANGE][16]); |
+ DECLARE_ALIGNED(16, short, Y2quant_shift[QINDEX_RANGE][16]); |
DECLARE_ALIGNED(16, short, Y2zbin[QINDEX_RANGE][16]); |
DECLARE_ALIGNED(16, short, Y2round[QINDEX_RANGE][16]); |
DECLARE_ALIGNED(16, short, UVquant[QINDEX_RANGE][16]); |
- DECLARE_ALIGNED(16, unsigned char, UVquant_shift[QINDEX_RANGE][16]); |
+ DECLARE_ALIGNED(16, short, UVquant_shift[QINDEX_RANGE][16]); |
DECLARE_ALIGNED(16, short, UVzbin[QINDEX_RANGE][16]); |
DECLARE_ALIGNED(16, short, UVround[QINDEX_RANGE][16]); |
@@ -270,24 +280,29 @@ typedef struct VP8_COMP |
VP8_CONFIG oxcf; |
- struct lookahead_ctx *lookahead; |
- struct lookahead_entry *source; |
- struct lookahead_entry *alt_ref_source; |
- |
YV12_BUFFER_CONFIG *Source; |
YV12_BUFFER_CONFIG *un_scaled_source; |
+ INT64 source_time_stamp; |
+ INT64 source_end_time_stamp; |
+ unsigned int source_frame_flags; |
YV12_BUFFER_CONFIG scaled_source; |
+ int source_buffer_count; // number of src_buffers in use for lagged encoding |
+ int source_encode_index; // index of buffer in src_buffer to encode |
int source_alt_ref_pending; // frame in src_buffers has been identified to be encoded as an alt ref |
int source_alt_ref_active; // an alt ref frame has been encoded and is usable |
+ int last_alt_ref_sei; // index into src_buffers of frame used as alt reference |
int is_src_frame_alt_ref; // source of frame to encode is an exact copy of an alt ref frame |
+ int is_next_src_alt_ref; // source of next frame to encode is an exact copy of an alt ref frame |
int gold_is_last; // golden frame same as last frame ( short circuit gold searches) |
int alt_is_last; // Alt reference frame same as last ( short circuit altref search) |
int gold_is_alt; // don't do both alt and gold search ( just do gold). |
//int refresh_alt_ref_frame; |
+ SOURCE_SAMPLE src_buffer[MAX_LAG_BUFFERS]; |
+ |
YV12_BUFFER_CONFIG last_frame_uf; |
TOKENEXTRA *tok; |
@@ -307,9 +322,17 @@ typedef struct VP8_COMP |
unsigned int mode_chosen_counts[MAX_MODES]; |
unsigned int mbs_tested_so_far; |
+ unsigned int check_freq[2]; |
+ unsigned int do_full[2]; |
+ |
int rd_thresh_mult[MAX_MODES]; |
int rd_baseline_thresh[MAX_MODES]; |
int rd_threshes[MAX_MODES]; |
+ int mvcostbase; |
+ int mvcostmultiplier; |
+ int subseqblockweight; |
+ int errthresh; |
+ unsigned int activity_avg; |
int RDMULT; |
int RDDIV ; |
@@ -317,10 +340,20 @@ typedef struct VP8_COMP |
CODING_CONTEXT coding_context; |
// Rate targetting variables |
- int64_t prediction_error; |
- int64_t last_prediction_error; |
- int64_t intra_error; |
- int64_t last_intra_error; |
+ long long prediction_error; |
+ long long last_prediction_error; |
+ long long intra_error; |
+ long long last_intra_error; |
+ |
+#if 0 |
+ // Experimental RD code |
+ long long frame_distortion; |
+ long long last_frame_distortion; |
+#endif |
+ |
+ int last_mb_distortion; |
+ |
+ int frames_since_auto_filter; |
int this_frame_target; |
int projected_frame_size; |
@@ -329,30 +362,53 @@ typedef struct VP8_COMP |
double rate_correction_factor; |
double key_frame_rate_correction_factor; |
double gf_rate_correction_factor; |
+ double est_max_qcorrection_factor; |
int frames_till_gf_update_due; // Count down till next GF |
int current_gf_interval; // GF interval chosen when we coded the last GF |
int gf_overspend_bits; // Total bits overspent becasue of GF boost (cumulative) |
+ int gf_group_bits; // Projected Bits available for a group of frames including 1 GF or ARF |
+ int gf_bits; // Bits for the golden frame or ARF - 2 pass only |
+ int mid_gf_extra_bits; // A few extra bits for the frame half way between two gfs. |
+ |
+ // Projected total bits available for a key frame group of frames |
+ long long kf_group_bits; |
+ |
+ // Error score of frames still to be coded in kf group |
+ long long kf_group_error_left; |
+ |
+ // Bits for the key frame in a key frame group - 2 pass only |
+ int kf_bits; |
+ |
int non_gf_bitrate_adjustment; // Used in the few frames following a GF to recover the extra bits spent in that GF |
+ int initial_gf_use; // percentage use of gf 2 frames after gf |
+ |
+ int gf_group_error_left; // Remaining error from uncoded frames in a gf group. Two pass use only |
int kf_overspend_bits; // Extra bits spent on key frames that need to be recovered on inter frames |
int kf_bitrate_adjustment; // Current number of bit s to try and recover on each inter frame. |
int max_gf_interval; |
+ int static_scene_max_gf_interval; |
int baseline_gf_interval; |
+ int gf_decay_rate; |
int active_arnr_frames; // <= cpi->oxcf.arnr_max_frames |
- int64_t key_frame_count; |
+ INT64 key_frame_count; |
+ INT64 tot_key_frame_bits; |
+ int prior_key_frame_size[KEY_FRAME_CONTEXT]; |
int prior_key_frame_distance[KEY_FRAME_CONTEXT]; |
int per_frame_bandwidth; // Current section per frame bandwidth target |
int av_per_frame_bandwidth; // Average frame size target for clip |
int min_frame_bandwidth; // Minimum allocation that should be used for any frame |
+ int last_key_frame_size; |
+ int intra_frame_target; |
int inter_frame_target; |
double output_frame_rate; |
- int64_t last_time_stamp_seen; |
- int64_t last_end_time_stamp_seen; |
- int64_t first_time_stamp_ever; |
+ long long last_time_stamp_seen; |
+ long long last_end_time_stamp_seen; |
+ long long first_time_stamp_ever; |
int ni_av_qi; |
int ni_tot_qi; |
@@ -363,7 +419,7 @@ typedef struct VP8_COMP |
int zbin_mode_boost; |
int zbin_mode_boost_enabled; |
- int64_t total_byte_count; |
+ INT64 total_byte_count; |
int buffered_mode; |
@@ -376,7 +432,7 @@ typedef struct VP8_COMP |
int long_rolling_target_bits; |
int long_rolling_actual_bits; |
- int64_t total_actual_bits; |
+ long long total_actual_bits; |
int total_target_vs_actual; // debug stats |
int worst_quality; |
@@ -385,6 +441,8 @@ typedef struct VP8_COMP |
int active_best_quality; |
int cq_target_quality; |
+ int maxq_max_limit; |
+ int maxq_min_limit; |
int drop_frames_allowed; // Are we permitted to drop frames? |
int drop_frame; // Drop this frame? |
@@ -398,18 +456,45 @@ typedef struct VP8_COMP |
unsigned int MVcount [2] [MVvals]; /* (row,col) MV cts this frame */ |
- unsigned int coef_counts [BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [MAX_ENTROPY_TOKENS]; /* for this frame */ |
- //DECLARE_ALIGNED(16, int, coef_counts_backup [BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [MAX_ENTROPY_TOKENS]); //not used any more |
+ unsigned int coef_counts [BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [vp8_coef_tokens]; /* for this frame */ |
+ //DECLARE_ALIGNED(16, int, coef_counts_backup [BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [vp8_coef_tokens]); //not used any more |
//save vp8_tree_probs_from_distribution result for each frame to avoid repeat calculation |
- vp8_prob frame_coef_probs [BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [ENTROPY_NODES]; |
- unsigned int frame_branch_ct [BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [ENTROPY_NODES][2]; |
+ vp8_prob frame_coef_probs [BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [vp8_coef_tokens-1]; |
+ unsigned int frame_branch_ct [BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [vp8_coef_tokens-1][2]; |
+ |
+ /* Second compressed data partition contains coefficient data. */ |
+ unsigned char *output_partition2; |
+ size_t output_partition2size; |
+ |
+ int frames_to_key; |
int gfu_boost; |
int kf_boost; |
int last_boost; |
+ double total_error_left; |
+ double total_intra_error_left; |
+ double total_coded_error_left; |
+ double start_tot_err_left; |
+ double min_error; |
+ double kf_intra_err_min; |
+ double gf_intra_err_min; |
+ |
+ double modified_error_total; |
+ double modified_error_used; |
+ double modified_error_left; |
+ double clip_bpe; |
+ double observed_bpe; |
+ |
+ double avg_iiratio; |
int target_bandwidth; |
+ long long bits_left; |
+ long long clip_bits_total; |
+ FIRSTPASS_STATS *total_stats; |
+ FIRSTPASS_STATS *this_frame_stats; |
+ FIRSTPASS_STATS *stats_in, *stats_in_end; |
struct vpx_codec_pkt_list *output_pkt_list; |
+ int first_pass_done; |
#if 0 |
// Experimental code for lagged and one pass |
@@ -430,9 +515,14 @@ typedef struct VP8_COMP |
int interquantizer; |
int auto_gold; |
int auto_adjust_gold_quantizer; |
+ int goldquantizer; |
int goldfreq; |
+ int auto_adjust_key_quantizer; |
+ int keyquantizer; |
int auto_worst_q; |
+ int filter_type; |
int cpu_used; |
+ int chroma_boost; |
int horiz_scale; |
int vert_scale; |
int pass; |
@@ -450,11 +540,31 @@ typedef struct VP8_COMP |
int this_frame_percent_intra; |
int last_frame_percent_intra; |
+ int last_key_frame_q; |
+ int last_kffilt_lvl; |
+ |
int ref_frame_flags; |
SPEED_FEATURES sf; |
int error_bins[1024]; |
+ int inter_lvl; |
+ int intra_lvl; |
+ int motion_lvl; |
+ int motion_speed; |
+ int motion_var; |
+ unsigned int next_iiratio; |
+ unsigned int this_iiratio; |
+ int this_frame_modified_error; |
+ |
+ double norm_intra_err_per_mb; |
+ double norm_inter_err_per_mb; |
+ double norm_iidiff_per_mb; |
+ |
+ int last_best_mode_index; // Record of mode index chosen for previous macro block. |
+ int last_auto_filt_val; |
+ int last_auto_filt_q; |
+ |
// Data used for real time conferencing mode to help determine if it would be good to update the gf |
int inter_zz_count; |
int gf_bad_count; |
@@ -462,6 +572,10 @@ typedef struct VP8_COMP |
int skip_true_count; |
int skip_false_count; |
+ int alt_qcount; |
+ |
+ int ready_for_new_frame; |
+ |
unsigned char *segmentation_map; |
signed char segment_feature_data[MB_LVL_MAX][MAX_MB_SEGMENTS]; // Segment data (can be deltas or absolute values) |
int segment_encode_breakout[MAX_MB_SEGMENTS]; // segment threashold for encode breakout |
@@ -480,6 +594,7 @@ typedef struct VP8_COMP |
// multithread data |
int * mt_current_mb_col; |
int mt_sync_range; |
+ int processor_core_count; |
int b_multi_threaded; |
int encoding_thread_count; |
@@ -498,13 +613,11 @@ typedef struct VP8_COMP |
#endif |
TOKENLIST *tplist; |
- unsigned int partition_sz[MAX_PARTITIONS]; |
// end of multithread data |
fractional_mv_step_fp *find_fractional_mv_step; |
vp8_full_search_fn_t full_search_sad; |
- vp8_refining_search_fn_t refining_search_sad; |
vp8_diamond_search_fn_t diamond_search_sad; |
vp8_variance_fn_ptr_t fn_ptr[BLOCK_MAX_SEGMENTS]; |
unsigned int time_receive_data; |
@@ -512,60 +625,25 @@ typedef struct VP8_COMP |
unsigned int time_pick_lpf; |
unsigned int time_encode_mb_row; |
+ unsigned int tempdata1; |
+ unsigned int tempdata2; |
+ |
int base_skip_false_prob[128]; |
+ unsigned int section_intra_rating; |
+ |
+ double section_max_qfactor; |
- struct twopass_rc |
- { |
- unsigned int section_intra_rating; |
- double section_max_qfactor; |
- unsigned int next_iiratio; |
- unsigned int this_iiratio; |
- FIRSTPASS_STATS *total_stats; |
- FIRSTPASS_STATS *this_frame_stats; |
- FIRSTPASS_STATS *stats_in, *stats_in_end, *stats_in_start; |
- int first_pass_done; |
- int64_t bits_left; |
- int64_t clip_bits_total; |
- double avg_iiratio; |
- double modified_error_total; |
- double modified_error_used; |
- double modified_error_left; |
- double total_error_left; |
- double total_intra_error_left; |
- double total_coded_error_left; |
- double start_tot_err_left; |
- double kf_intra_err_min; |
- double gf_intra_err_min; |
- int frames_to_key; |
- int maxq_max_limit; |
- int maxq_min_limit; |
- int gf_decay_rate; |
- int static_scene_max_gf_interval; |
- int kf_bits; |
- int gf_group_error_left; // Remaining error from uncoded frames in a gf group. Two pass use only |
- |
- // Projected total bits available for a key frame group of frames |
- int64_t kf_group_bits; |
- |
- // Error score of frames still to be coded in kf group |
- int64_t kf_group_error_left; |
- |
- int gf_group_bits; // Projected Bits available for a group of frames including 1 GF or ARF |
- int gf_bits; // Bits for the golden frame or ARF - 2 pass only |
- int mid_gf_extra_bits; // A few extra bits for the frame half way between two gfs. |
- double est_max_qcorrection_factor; |
- } twopass; |
#if CONFIG_RUNTIME_CPU_DETECT |
VP8_ENCODER_RTCD rtcd; |
#endif |
#if VP8_TEMPORAL_ALT_REF |
- YV12_BUFFER_CONFIG alt_ref_buffer; |
+ SOURCE_SAMPLE alt_ref_buffer; |
YV12_BUFFER_CONFIG *frames[MAX_LAG_BUFFERS]; |
int fixed_divide[512]; |
#endif |
-#if CONFIG_INTERNAL_STATS |
+#if CONFIG_PSNR |
int count; |
double total_y; |
double total_u; |
@@ -592,18 +670,10 @@ typedef struct VP8_COMP |
#endif |
int b_calculate_psnr; |
- // Per MB activity measurement |
- unsigned int activity_avg; |
- unsigned int * mb_activity_map; |
- int * mb_norm_activity_map; |
- // Record of which MBs still refer to last golden frame either |
- // directly or through 0,0 |
- unsigned char *gf_active_flags; |
+ unsigned char *gf_active_flags; // Record of which MBs still refer to last golden frame either directly or through 0,0 |
int gf_active_count; |
- int output_partition; |
- |
//Store last frame's MV info for next frame MV prediction |
int_mv *lfmv; |
int *lf_ref_frame_sign_bias; |
@@ -612,7 +682,6 @@ typedef struct VP8_COMP |
#if CONFIG_REALTIME_ONLY |
int force_next_frame_intra; /* force next frame to intra when kf_auto says so */ |
#endif |
- int droppable; |
} VP8_COMP; |
void control_data_rate(VP8_COMP *cpi); |
@@ -621,7 +690,7 @@ void vp8_encode_frame(VP8_COMP *cpi); |
void vp8_pack_bitstream(VP8_COMP *cpi, unsigned char *dest, unsigned long *size); |
-void vp8_activity_masking(VP8_COMP *cpi, MACROBLOCK *x); |
+unsigned int vp8_activity_masking(VP8_COMP *cpi, MACROBLOCK *x); |
int rd_cost_intra_mb(MACROBLOCKD *x); |