| 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);
|
|
|
|
|