Index: source/libvpx/vp9/encoder/vp9_onyx_int.h |
=================================================================== |
--- source/libvpx/vp9/encoder/vp9_onyx_int.h (revision 251189) |
+++ source/libvpx/vp9/encoder/vp9_onyx_int.h (working copy) |
@@ -8,41 +8,46 @@ |
* be found in the AUTHORS file in the root of the source tree. |
*/ |
- |
#ifndef VP9_ENCODER_VP9_ONYX_INT_H_ |
#define VP9_ENCODER_VP9_ONYX_INT_H_ |
#include <stdio.h> |
+ |
#include "./vpx_config.h" |
+#include "vpx_ports/mem.h" |
+#include "vpx/internal/vpx_codec_internal.h" |
+ |
+#include "vp9/common/vp9_entropy.h" |
+#include "vp9/common/vp9_entropymode.h" |
#include "vp9/common/vp9_onyx.h" |
-#include "vp9/encoder/vp9_treewriter.h" |
-#include "vp9/encoder/vp9_tokenize.h" |
#include "vp9/common/vp9_onyxc_int.h" |
-#include "vp9/encoder/vp9_variance.h" |
+ |
#include "vp9/encoder/vp9_encodemb.h" |
-#include "vp9/encoder/vp9_quantize.h" |
-#include "vp9/common/vp9_entropy.h" |
-#include "vp9/common/vp9_entropymode.h" |
-#include "vpx_ports/mem.h" |
-#include "vpx/internal/vpx_codec_internal.h" |
-#include "vp9/encoder/vp9_mcomp.h" |
+#include "vp9/encoder/vp9_firstpass.h" |
#include "vp9/encoder/vp9_lookahead.h" |
+#include "vp9/encoder/vp9_mbgraph.h" |
+#include "vp9/encoder/vp9_mcomp.h" |
+#include "vp9/encoder/vp9_quantize.h" |
+#include "vp9/encoder/vp9_ratectrl.h" |
+#include "vp9/encoder/vp9_tokenize.h" |
+#include "vp9/encoder/vp9_treewriter.h" |
+#include "vp9/encoder/vp9_variance.h" |
#ifdef __cplusplus |
extern "C" { |
#endif |
-#define DISABLE_RC_LONG_TERM_MEM 0 |
// #define MODE_TEST_HIT_STATS |
-// #define SPEEDSTATS 1 |
#if CONFIG_MULTIPLE_ARF |
// Set MIN_GF_INTERVAL to 1 for the full decomposition. |
#define MIN_GF_INTERVAL 2 |
#else |
#define MIN_GF_INTERVAL 4 |
#endif |
-#define DEFAULT_GF_INTERVAL 7 |
+#define DEFAULT_GF_INTERVAL 10 |
+#define DEFAULT_KF_BOOST 2000 |
+#define DEFAULT_GF_BOOST 2000 |
#define KEY_FRAME_CONTEXT 5 |
@@ -75,54 +80,6 @@ |
FRAME_CONTEXT fc; |
} CODING_CONTEXT; |
-typedef struct { |
- double frame; |
- double intra_error; |
- double coded_error; |
- double sr_coded_error; |
- double ssim_weighted_pred_err; |
- double pcnt_inter; |
- double pcnt_motion; |
- double pcnt_second_ref; |
- double pcnt_neutral; |
- double MVr; |
- double mvr_abs; |
- double MVc; |
- double mvc_abs; |
- double MVrv; |
- double MVcv; |
- double mv_in_out_count; |
- double new_mv_count; |
- double duration; |
- double count; |
-} FIRSTPASS_STATS; |
- |
-typedef struct { |
- int frames_so_far; |
- double frame_intra_error; |
- double frame_coded_error; |
- double frame_pcnt_inter; |
- double frame_pcnt_motion; |
- double frame_mvr; |
- double frame_mvr_abs; |
- double frame_mvc; |
- double frame_mvc_abs; |
-} ONEPASS_FRAMESTATS; |
- |
-typedef struct { |
- struct { |
- int err; |
- union { |
- int_mv mv; |
- MB_PREDICTION_MODE mode; |
- } m; |
- } ref[MAX_REF_FRAMES]; |
-} MBGRAPH_MB_STATS; |
- |
-typedef struct { |
- MBGRAPH_MB_STATS *mb_stats; |
-} MBGRAPH_FRAME_STATS; |
- |
// This enumerator type needs to be kept aligned with the mode order in |
// const MODE_DEFINITION vp9_mode_order[MAX_MODES] used in the rd code. |
typedef enum { |
@@ -190,6 +147,12 @@ |
} TX_SIZE_SEARCH_METHOD; |
typedef enum { |
+ NOT_IN_USE = 0, |
+ RELAXED_NEIGHBORING_MIN_MAX = 1, |
+ STRICT_NEIGHBORING_MIN_MAX = 2 |
+} AUTO_MIN_MAX_MODE; |
+ |
+typedef enum { |
// Values should be powers of 2 so that they can be selected as bits of |
// an integer flags field |
@@ -234,18 +197,34 @@ |
LAST_FRAME_PARTITION_ALL = 2 |
} LAST_FRAME_PARTITION_METHOD; |
+typedef enum { |
+ // No recode. |
+ DISALLOW_RECODE = 0, |
+ // Allow recode for KF and exceeding maximum frame bandwidth. |
+ ALLOW_RECODE_KFMAXBW = 1, |
+ // Allow recode only for KF/ARF/GF frames. |
+ ALLOW_RECODE_KFARFGF = 2, |
+ // Allow recode for all frames based on bitrate constraints. |
+ ALLOW_RECODE = 3, |
+} RECODE_LOOP_TYPE; |
+ |
+typedef enum { |
+ // encode_breakout is disabled. |
+ ENCODE_BREAKOUT_DISABLED = 0, |
+ // encode_breakout is enabled. |
+ ENCODE_BREAKOUT_ENABLED = 1, |
+ // encode_breakout is enabled with small max_thresh limit. |
+ ENCODE_BREAKOUT_LIMITED = 2 |
+} ENCODE_BREAKOUT_TYPE; |
+ |
typedef struct { |
- // This flag refers to whether or not to perform rd optimization. |
- int RD; |
+ // Frame level coding parameter update |
+ int frame_parameter_update; |
// Motion search method (Diamond, NSTEP, Hex, Big Diamond, Square, etc). |
SEARCH_METHODS search_method; |
- // Recode_loop can be: |
- // 0 means we only encode a frame once |
- // 1 means we can re-encode based on bitrate constraints on any frame |
- // 2 means we can only recode gold, alt, and key frames. |
- int recode_loop; |
+ RECODE_LOOP_TYPE recode_loop; |
// Subpel_search_method can only be subpel_tree which does a subpixel |
// logarithmic search that keeps stepping at 1/2 pixel units until |
@@ -346,9 +325,8 @@ |
BLOCK_SIZE always_this_block_size; |
// Sets min and max partition sizes for this 64x64 region based on the |
- // same superblock in last encoded frame, and the left and above neighbor |
- // in this block. |
- int auto_min_max_partition_size; |
+ // same 64x64 in last encoded frame, and the left and above neighbor. |
+ AUTO_MIN_MAX_MODE auto_min_max_partition_size; |
// Min and max partition size we enable (block_size) as per auto |
// min max, but also used by adjust partitioning, and pick_partitioning. |
@@ -368,11 +346,6 @@ |
// inter modes or to enable it always. |
int disable_split_mask; |
- // TODO(jbb): Remove this and everything that uses it. It's only valid if |
- // we were doing small to large partition checks. We currently do the |
- // reverse. |
- int using_small_partition_info; |
- |
// TODO(jingning): combine the related motion search speed features |
// This allows us to use motion search at other sizes as a starting |
// point for this motion search and limits the search range around it. |
@@ -420,69 +393,25 @@ |
// This feature limits the number of coefficients updates we actually do |
// by only looking at counts from 1/2 the bands. |
int use_fast_coef_updates; // 0: 2-loop, 1: 1-loop, 2: 1-loop reduced |
+ |
+ // This flag controls the use of non-RD mode decision. |
+ int use_pick_mode; |
+ |
+ // This variable sets the encode_breakout threshold. Currently, it is only |
+ // enabled in real time mode. |
+ int encode_breakout_thresh; |
} SPEED_FEATURES; |
typedef struct { |
- // Rate targetting variables |
- int this_frame_target; |
- int projected_frame_size; |
- int sb64_target_rate; |
- int last_q[3]; // Separate values for Intra/Inter/ARF-GF |
- int last_boosted_qindex; // Last boosted GF/KF/ARF q |
+ RATE_CONTROL rc; |
+ int target_bandwidth; |
+ int64_t starting_buffer_level; |
+ int64_t optimal_buffer_level; |
+ int64_t maximum_buffer_size; |
+ double framerate; |
+ int avg_frame_size; |
+} LAYER_CONTEXT; |
- int gfu_boost; |
- int last_boost; |
- int kf_boost; |
- |
- double rate_correction_factor; |
- double key_frame_rate_correction_factor; |
- double gf_rate_correction_factor; |
- |
- unsigned int frames_since_golden; |
- unsigned int frames_till_gf_update_due; // Count down till next GF |
- unsigned int max_gf_interval; |
- unsigned int baseline_gf_interval; |
- unsigned int frames_to_key; |
- unsigned int frames_since_key; |
- unsigned int this_key_frame_forced; |
- unsigned int next_key_frame_forced; |
- unsigned int source_alt_ref_pending; |
- unsigned int source_alt_ref_active; |
- unsigned int is_src_frame_alt_ref; |
- |
- 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 used for any frame |
- int max_frame_bandwidth; // Maximum burst rate allowed for a frame. |
- |
- int ni_av_qi; |
- int ni_tot_qi; |
- int ni_frames; |
- int avg_frame_qindex[3]; // 0 - KEY, 1 - INTER, 2 - ARF/GF |
- double tot_q; |
- double avg_q; |
- |
- int buffer_level; |
- int bits_off_target; |
- |
- int decimation_factor; |
- int decimation_count; |
- |
- int rolling_target_bits; |
- int rolling_actual_bits; |
- |
- int long_rolling_target_bits; |
- int long_rolling_actual_bits; |
- |
- int64_t total_actual_bits; |
- int total_target_vs_actual; // debug stats |
- |
- int worst_quality; |
- int active_worst_quality; |
- int best_quality; |
- // int active_best_quality; |
-} RATE_CONTROL; |
- |
typedef struct VP9_COMP { |
DECLARE_ALIGNED(16, int16_t, y_quant[QINDEX_RANGE][8]); |
DECLARE_ALIGNED(16, int16_t, y_quant_shift[QINDEX_RANGE][8]); |
@@ -504,7 +433,6 @@ |
MACROBLOCK mb; |
VP9_COMMON common; |
VP9_CONFIG oxcf; |
- struct rdcost_block_args rdcost_stack; |
struct lookahead_ctx *lookahead; |
struct lookahead_entry *source; |
#if CONFIG_MULTIPLE_ARF |
@@ -528,9 +456,6 @@ |
int gld_fb_idx; |
int alt_fb_idx; |
- int current_layer; |
- int use_svc; |
- |
#if CONFIG_MULTIPLE_ARF |
int alt_ref_fb_idx[REF_FRAMES - 3]; |
#endif |
@@ -606,14 +531,8 @@ |
vp9_coeff_probs_model frame_coef_probs[TX_SIZES][PLANE_TYPES]; |
vp9_coeff_stats frame_branch_ct[TX_SIZES][PLANE_TYPES]; |
- int64_t target_bandwidth; |
struct vpx_codec_pkt_list *output_pkt_list; |
-#if 0 |
- // Experimental code for lagged and one pass |
- ONEPASS_FRAMESTATS one_pass_frame_stats[MAX_LAG_BUFFERS]; |
- int one_pass_frame_index; |
-#endif |
MBGRAPH_FRAME_STATS mbgraph_stats[MAX_LAG_BUFFERS]; |
int mbgraph_n_frames; // number of frames filled in the above |
int static_mb_pct; // % forced skip mbs by segmentation |
@@ -621,12 +540,11 @@ |
// for real time encoding |
int speed; |
- int compressor_speed; |
int cpu_used; |
int pass; |
- vp9_prob last_skip_false_probs[3][MBSKIP_CONTEXTS]; |
+ vp9_prob last_skip_false_probs[3][SKIP_CONTEXTS]; |
int last_skip_probs_q[3]; |
int ref_frame_flags; |
@@ -636,6 +554,13 @@ |
unsigned int max_mv_magnitude; |
int mv_step_param; |
+ // Default value is 1. From first pass stats, encode_breakout may be disabled. |
+ ENCODE_BREAKOUT_TYPE allow_encode_breakout; |
+ |
+ // Get threshold from external input. In real time mode, it can be |
+ // overwritten according to encoding speed. |
+ int encode_breakout; |
+ |
unsigned char *segmentation_map; |
// segment threashold for encode breakout |
@@ -657,47 +582,8 @@ |
uint64_t time_pick_lpf; |
uint64_t time_encode_sb_row; |
- struct twopass_rc { |
- unsigned int section_intra_rating; |
- 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; |
- FIRSTPASS_STATS total_left_stats; |
- int first_pass_done; |
- int64_t bits_left; |
- int64_t clip_bits_total; |
- double avg_iiratio; |
- double modified_error_min; |
- double modified_error_max; |
- double modified_error_total; |
- double modified_error_left; |
- double kf_intra_err_min; |
- double gf_intra_err_min; |
- int static_scene_max_gf_interval; |
- int kf_bits; |
- // Remaining error from uncoded frames in a gf group. Two pass use only |
- int64_t gf_group_error_left; |
+ struct twopass_rc twopass; |
- // 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; |
- |
- // Projected Bits available for a group of frames including 1 GF or ARF |
- int64_t gf_group_bits; |
- // Bits for the golden frame or ARF - 2 pass only |
- int gf_bits; |
- int alt_extra_bits; |
- |
- int sr_update_lag; |
- |
- int kf_zeromotion_pct; |
- int gf_zeromotion_pct; |
- } twopass; |
- |
YV12_BUFFER_CONFIG alt_ref_buffer; |
YV12_BUFFER_CONFIG *frames[MAX_LAG_BUFFERS]; |
int fixed_divide[512]; |
@@ -753,10 +639,18 @@ |
int initial_width; |
int initial_height; |
- int number_spatial_layers; |
- int enable_encode_breakout; // Default value is 1. From first pass stats, |
- // encode_breakout may be disabled. |
+ int use_svc; |
+ struct svc { |
+ int spatial_layer_id; |
+ int temporal_layer_id; |
+ int number_spatial_layers; |
+ int number_temporal_layers; |
+ // Layer context used for rate control in CBR mode, only defined for |
+ // temporal layers for now. |
+ LAYER_CONTEXT layer_context[VPX_TS_MAX_LAYERS]; |
+ } svc; |
+ |
#if CONFIG_MULTIPLE_ARF |
// ARF tracking variables. |
int multi_arf_enabled; |
@@ -802,15 +696,14 @@ |
static YV12_BUFFER_CONFIG *get_ref_frame_buffer(VP9_COMP *cpi, |
MV_REFERENCE_FRAME ref_frame) { |
VP9_COMMON *const cm = &cpi->common; |
- return &cm->yv12_fb[cm->ref_frame_map[get_ref_frame_idx(cpi, ref_frame)]]; |
+ return &cm->frame_bufs[cm->ref_frame_map[get_ref_frame_idx(cpi, |
+ ref_frame)]].buf; |
} |
void vp9_encode_frame(VP9_COMP *cpi); |
void vp9_pack_bitstream(VP9_COMP *cpi, uint8_t *dest, size_t *size); |
-void vp9_activity_masking(VP9_COMP *cpi, MACROBLOCK *x); |
- |
void vp9_set_speed_features(VP9_COMP *cpi); |
int vp9_calc_ss_err(const YV12_BUFFER_CONFIG *source, |
@@ -826,8 +719,10 @@ |
static void set_ref_ptrs(VP9_COMMON *cm, MACROBLOCKD *xd, |
MV_REFERENCE_FRAME ref0, MV_REFERENCE_FRAME ref1) { |
- xd->block_refs[0] = &cm->frame_refs[ref0 - LAST_FRAME]; |
- xd->block_refs[1] = &cm->frame_refs[ref1 - LAST_FRAME]; |
+ xd->block_refs[0] = &cm->frame_refs[ref0 >= LAST_FRAME ? ref0 - LAST_FRAME |
+ : 0]; |
+ xd->block_refs[1] = &cm->frame_refs[ref1 >= LAST_FRAME ? ref1 - LAST_FRAME |
+ : 0]; |
} |
#ifdef __cplusplus |