Index: source/libvpx/vp9/encoder/vp9_onyx_if.c |
=================================================================== |
--- source/libvpx/vp9/encoder/vp9_onyx_if.c (revision 177019) |
+++ source/libvpx/vp9/encoder/vp9_onyx_if.c (working copy) |
@@ -18,7 +18,7 @@ |
#include "vp9/encoder/vp9_mcomp.h" |
#include "vp9/encoder/vp9_firstpass.h" |
#include "vp9/encoder/vp9_psnr.h" |
-#include "vpx_scale/vpxscale.h" |
+#include "vpx_scale/vpx_scale.h" |
#include "vp9/common/vp9_extend.h" |
#include "vp9/encoder/vp9_ratectrl.h" |
#include "vp9/common/vp9_quant_common.h" |
@@ -49,7 +49,8 @@ |
static void set_default_lf_deltas(VP9_COMP *cpi); |
-#define DEFAULT_INTERP_FILTER EIGHTTAP /* SWITCHABLE for better performance */ |
+#define DEFAULT_INTERP_FILTER SWITCHABLE |
+ |
#define SEARCH_BEST_FILTER 0 /* to search exhaustively for |
best filter */ |
#define RESET_FOREACH_FILTER 0 /* whether to reset the encoder state |
@@ -118,7 +119,7 @@ |
extern unsigned __int64 Sectionbits[500]; |
#endif |
#ifdef MODE_STATS |
-extern INT64 Sectionbits[500]; |
+extern int64_t Sectionbits[500]; |
extern unsigned int y_modes[VP9_YMODES]; |
extern unsigned int i8x8_modes[VP9_I8X8_MODES]; |
extern unsigned int uv_modes[VP9_UV_MODES]; |
@@ -148,7 +149,6 @@ |
double x3, double x2, double x, double c) { |
int i; |
double minqtarget; |
- double thisq; |
minqtarget = ((x3 * maxq * maxq * maxq) + |
(x2 * maxq * maxq) + |
@@ -159,7 +159,6 @@ |
minqtarget = maxq; |
for (i = 0; i < QINDEX_RANGE; i++) { |
- thisq = vp9_convert_qindex_to_q(i); |
if (minqtarget <= vp9_convert_qindex_to_q(i)) |
return i; |
} |
@@ -216,7 +215,7 @@ |
static void init_base_skip_probs(void) { |
int i; |
double q; |
- int skip_prob, t; |
+ int t; |
for (i = 0; i < QINDEX_RANGE; i++) { |
q = vp9_convert_qindex_to_q(i); |
@@ -225,26 +224,9 @@ |
// Based on crude best fit of old table. |
t = (int)(564.25 * pow(2.71828, (-0.012 * q))); |
- skip_prob = t; |
- if (skip_prob < 1) |
- skip_prob = 1; |
- else if (skip_prob > 255) |
- skip_prob = 255; |
- base_skip_false_prob[i][1] = skip_prob; |
- |
- skip_prob = t * 3 / 4; |
- if (skip_prob < 1) |
- skip_prob = 1; |
- else if (skip_prob > 255) |
- skip_prob = 255; |
- base_skip_false_prob[i][2] = skip_prob; |
- |
- skip_prob = t * 5 / 4; |
- if (skip_prob < 1) |
- skip_prob = 1; |
- else if (skip_prob > 255) |
- skip_prob = 255; |
- base_skip_false_prob[i][0] = skip_prob; |
+ base_skip_false_prob[i][1] = clip_prob(t); |
+ base_skip_false_prob[i][2] = clip_prob(t * 3 / 4); |
+ base_skip_false_prob[i][0] = clip_prob(t * 5 / 4); |
} |
} |
@@ -573,43 +555,19 @@ |
} |
static void update_reference_segmentation_map(VP9_COMP *cpi) { |
- VP9_COMMON *cm = &cpi->common; |
- int row, col, sb_rows = (cm->mb_rows + 1) >> 1, sb_cols = (cm->mb_cols + 1) >> 1; |
- MODE_INFO *mi = cm->mi; |
- uint8_t *segmap = cpi->segmentation_map; |
- uint8_t *segcache = cm->last_frame_seg_map; |
+ VP9_COMMON *const cm = &cpi->common; |
+ int row, col; |
+ MODE_INFO *mi, *mi_ptr = cm->mi; |
+ uint8_t *cache_ptr = cm->last_frame_seg_map, *cache; |
- for (row = 0; row < sb_rows; row++) { |
- for (col = 0; col < sb_cols; col++) { |
- MODE_INFO *miptr = mi + col * 2; |
- uint8_t *cache = segcache + col * 2; |
-#if CONFIG_SUPERBLOCKS |
- if (miptr->mbmi.encoded_as_sb) { |
- cache[0] = miptr->mbmi.segment_id; |
- if (!(cm->mb_cols & 1) || col < sb_cols - 1) |
- cache[1] = miptr->mbmi.segment_id; |
- if (!(cm->mb_rows & 1) || row < sb_rows - 1) { |
- cache[cm->mb_cols] = miptr->mbmi.segment_id; |
- if (!(cm->mb_cols & 1) || col < sb_cols - 1) |
- cache[cm->mb_cols + 1] = miptr->mbmi.segment_id; |
- } |
- } else |
-#endif |
- { |
- cache[0] = miptr[0].mbmi.segment_id; |
- if (!(cm->mb_cols & 1) || col < sb_cols - 1) |
- cache[1] = miptr[1].mbmi.segment_id; |
- if (!(cm->mb_rows & 1) || row < sb_rows - 1) { |
- cache[cm->mb_cols] = miptr[cm->mode_info_stride].mbmi.segment_id; |
- if (!(cm->mb_cols & 1) || col < sb_cols - 1) |
- cache[1] = miptr[1].mbmi.segment_id; |
- cache[cm->mb_cols + 1] = miptr[cm->mode_info_stride + 1].mbmi.segment_id; |
- } |
- } |
+ for (row = 0; row < cm->mb_rows; row++) { |
+ mi = mi_ptr; |
+ cache = cache_ptr; |
+ for (col = 0; col < cm->mb_cols; col++, mi++, cache++) { |
+ cache[0] = mi->mbmi.segment_id; |
} |
- segmap += 2 * cm->mb_cols; |
- segcache += 2 * cm->mb_cols; |
- mi += 2 * cm->mode_info_stride; |
+ mi_ptr += cm->mode_info_stride; |
+ cache_ptr += cm->mb_cols; |
} |
} |
@@ -668,7 +626,6 @@ |
sf->first_step = 0; |
sf->max_step_search_steps = MAX_MVSEARCH_STEPS; |
- sf->improved_mv_pred = 1; |
// default thresholds to 0 |
for (i = 0; i < MAX_MODES; i++) |
@@ -676,47 +633,6 @@ |
switch (Mode) { |
case 0: // best quality mode |
-#if CONFIG_PRED_FILTER |
- sf->thresh_mult[THR_ZEROMV ] = 0; |
- sf->thresh_mult[THR_ZEROMV_FILT ] = 0; |
- sf->thresh_mult[THR_ZEROG ] = 0; |
- sf->thresh_mult[THR_ZEROG_FILT ] = 0; |
- sf->thresh_mult[THR_ZEROA ] = 0; |
- sf->thresh_mult[THR_ZEROA_FILT ] = 0; |
- sf->thresh_mult[THR_NEARESTMV ] = 0; |
- sf->thresh_mult[THR_NEARESTMV_FILT] = 0; |
- sf->thresh_mult[THR_NEARESTG ] = 0; |
- sf->thresh_mult[THR_NEARESTG_FILT ] = 0; |
- sf->thresh_mult[THR_NEARESTA ] = 0; |
- sf->thresh_mult[THR_NEARESTA_FILT ] = 0; |
- sf->thresh_mult[THR_NEARMV ] = 0; |
- sf->thresh_mult[THR_NEARMV_FILT ] = 0; |
- sf->thresh_mult[THR_NEARG ] = 0; |
- sf->thresh_mult[THR_NEARG_FILT ] = 0; |
- sf->thresh_mult[THR_NEARA ] = 0; |
- sf->thresh_mult[THR_NEARA_FILT ] = 0; |
- |
- sf->thresh_mult[THR_DC ] = 0; |
- |
- sf->thresh_mult[THR_V_PRED ] = 1000; |
- sf->thresh_mult[THR_H_PRED ] = 1000; |
- sf->thresh_mult[THR_D45_PRED ] = 1000; |
- sf->thresh_mult[THR_D135_PRED] = 1000; |
- sf->thresh_mult[THR_D117_PRED] = 1000; |
- sf->thresh_mult[THR_D153_PRED] = 1000; |
- sf->thresh_mult[THR_D27_PRED ] = 1000; |
- sf->thresh_mult[THR_D63_PRED ] = 1000; |
- sf->thresh_mult[THR_B_PRED ] = 2000; |
- sf->thresh_mult[THR_I8X8_PRED] = 2000; |
- sf->thresh_mult[THR_TM ] = 1000; |
- |
- sf->thresh_mult[THR_NEWMV ] = 1000; |
- sf->thresh_mult[THR_NEWG ] = 1000; |
- sf->thresh_mult[THR_NEWA ] = 1000; |
- sf->thresh_mult[THR_NEWMV_FILT ] = 1000; |
- sf->thresh_mult[THR_NEWG_FILT ] = 1000; |
- sf->thresh_mult[THR_NEWA_FILT ] = 1000; |
-#else |
sf->thresh_mult[THR_ZEROMV ] = 0; |
sf->thresh_mult[THR_ZEROG ] = 0; |
sf->thresh_mult[THR_ZEROA ] = 0; |
@@ -744,7 +660,7 @@ |
sf->thresh_mult[THR_NEWMV ] = 1000; |
sf->thresh_mult[THR_NEWG ] = 1000; |
sf->thresh_mult[THR_NEWA ] = 1000; |
-#endif |
+ |
sf->thresh_mult[THR_SPLITMV ] = 2500; |
sf->thresh_mult[THR_SPLITG ] = 5000; |
sf->thresh_mult[THR_SPLITA ] = 5000; |
@@ -787,14 +703,10 @@ |
sf->search_best_filter = SEARCH_BEST_FILTER; |
break; |
case 1: |
-#if CONFIG_PRED_FILTER |
sf->thresh_mult[THR_NEARESTMV] = 0; |
- sf->thresh_mult[THR_NEARESTMV_FILT] = 0; |
sf->thresh_mult[THR_ZEROMV ] = 0; |
- sf->thresh_mult[THR_ZEROMV_FILT ] = 0; |
sf->thresh_mult[THR_DC ] = 0; |
sf->thresh_mult[THR_NEARMV ] = 0; |
- sf->thresh_mult[THR_NEARMV_FILT ] = 0; |
sf->thresh_mult[THR_V_PRED ] = 1000; |
sf->thresh_mult[THR_H_PRED ] = 1000; |
sf->thresh_mult[THR_D45_PRED ] = 1000; |
@@ -808,18 +720,12 @@ |
sf->thresh_mult[THR_TM ] = 1000; |
sf->thresh_mult[THR_NEARESTG ] = 1000; |
- sf->thresh_mult[THR_NEARESTG_FILT ] = 1000; |
sf->thresh_mult[THR_NEARESTA ] = 1000; |
- sf->thresh_mult[THR_NEARESTA_FILT ] = 1000; |
sf->thresh_mult[THR_ZEROG ] = 1000; |
sf->thresh_mult[THR_ZEROA ] = 1000; |
sf->thresh_mult[THR_NEARG ] = 1000; |
sf->thresh_mult[THR_NEARA ] = 1000; |
- sf->thresh_mult[THR_ZEROG_FILT ] = 1000; |
- sf->thresh_mult[THR_ZEROA_FILT ] = 1000; |
- sf->thresh_mult[THR_NEARG_FILT ] = 1000; |
- sf->thresh_mult[THR_NEARA_FILT ] = 1000; |
sf->thresh_mult[THR_ZEROMV ] = 0; |
sf->thresh_mult[THR_ZEROG ] = 0; |
@@ -830,61 +736,11 @@ |
sf->thresh_mult[THR_NEARMV ] = 0; |
sf->thresh_mult[THR_NEARG ] = 0; |
sf->thresh_mult[THR_NEARA ] = 0; |
- sf->thresh_mult[THR_ZEROMV_FILT ] = 0; |
- sf->thresh_mult[THR_ZEROG_FILT ] = 0; |
- sf->thresh_mult[THR_ZEROA_FILT ] = 0; |
- sf->thresh_mult[THR_NEARESTMV_FILT] = 0; |
- sf->thresh_mult[THR_NEARESTG_FILT ] = 0; |
- sf->thresh_mult[THR_NEARESTA_FILT ] = 0; |
- sf->thresh_mult[THR_NEARMV_FILT ] = 0; |
- sf->thresh_mult[THR_NEARG_FILT ] = 0; |
- sf->thresh_mult[THR_NEARA_FILT ] = 0; |
sf->thresh_mult[THR_NEWMV ] = 1000; |
sf->thresh_mult[THR_NEWG ] = 1000; |
sf->thresh_mult[THR_NEWA ] = 1000; |
- sf->thresh_mult[THR_NEWMV_FILT ] = 1000; |
- sf->thresh_mult[THR_NEWG_FILT ] = 1000; |
- sf->thresh_mult[THR_NEWA_FILT ] = 1000; |
-#else |
- sf->thresh_mult[THR_NEARESTMV] = 0; |
- sf->thresh_mult[THR_ZEROMV ] = 0; |
- sf->thresh_mult[THR_DC ] = 0; |
- sf->thresh_mult[THR_NEARMV ] = 0; |
- sf->thresh_mult[THR_V_PRED ] = 1000; |
- sf->thresh_mult[THR_H_PRED ] = 1000; |
- sf->thresh_mult[THR_D45_PRED ] = 1000; |
- sf->thresh_mult[THR_D135_PRED] = 1000; |
- sf->thresh_mult[THR_D117_PRED] = 1000; |
- sf->thresh_mult[THR_D153_PRED] = 1000; |
- sf->thresh_mult[THR_D27_PRED ] = 1000; |
- sf->thresh_mult[THR_D63_PRED ] = 1000; |
- sf->thresh_mult[THR_B_PRED ] = 2500; |
- sf->thresh_mult[THR_I8X8_PRED] = 2500; |
- sf->thresh_mult[THR_TM ] = 1000; |
- sf->thresh_mult[THR_NEARESTG ] = 1000; |
- sf->thresh_mult[THR_NEARESTA ] = 1000; |
- |
- sf->thresh_mult[THR_ZEROG ] = 1000; |
- sf->thresh_mult[THR_ZEROA ] = 1000; |
- sf->thresh_mult[THR_NEARG ] = 1000; |
- sf->thresh_mult[THR_NEARA ] = 1000; |
- |
- sf->thresh_mult[THR_ZEROMV ] = 0; |
- sf->thresh_mult[THR_ZEROG ] = 0; |
- sf->thresh_mult[THR_ZEROA ] = 0; |
- sf->thresh_mult[THR_NEARESTMV] = 0; |
- sf->thresh_mult[THR_NEARESTG ] = 0; |
- sf->thresh_mult[THR_NEARESTA ] = 0; |
- sf->thresh_mult[THR_NEARMV ] = 0; |
- sf->thresh_mult[THR_NEARG ] = 0; |
- sf->thresh_mult[THR_NEARA ] = 0; |
- |
- sf->thresh_mult[THR_NEWMV ] = 1000; |
- sf->thresh_mult[THR_NEWG ] = 1000; |
- sf->thresh_mult[THR_NEWA ] = 1000; |
-#endif |
sf->thresh_mult[THR_SPLITMV ] = 1700; |
sf->thresh_mult[THR_SPLITG ] = 4500; |
sf->thresh_mult[THR_SPLITA ] = 4500; |
@@ -960,9 +816,6 @@ |
if (cpi->ref_frame_flags & VP9_LAST_FLAG) { |
sf->thresh_mult[THR_NEWMV ] = 2000; |
-#if CONFIG_PRED_FILTER |
- sf->thresh_mult[THR_NEWMV_FILT ] = 2000; |
-#endif |
sf->thresh_mult[THR_SPLITMV ] = 10000; |
sf->thresh_mult[THR_COMP_SPLITLG ] = 20000; |
} |
@@ -972,12 +825,6 @@ |
sf->thresh_mult[THR_ZEROG ] = 1500; |
sf->thresh_mult[THR_NEARG ] = 1500; |
sf->thresh_mult[THR_NEWG ] = 2000; |
-#if CONFIG_PRED_FILTER |
- sf->thresh_mult[THR_NEARESTG_FILT ] = 1500; |
- sf->thresh_mult[THR_ZEROG_FILT ] = 1500; |
- sf->thresh_mult[THR_NEARG_FILT ] = 1500; |
- sf->thresh_mult[THR_NEWG_FILT ] = 2000; |
-#endif |
sf->thresh_mult[THR_SPLITG ] = 20000; |
sf->thresh_mult[THR_COMP_SPLITGA ] = 20000; |
} |
@@ -987,12 +834,6 @@ |
sf->thresh_mult[THR_ZEROA ] = 1500; |
sf->thresh_mult[THR_NEARA ] = 1500; |
sf->thresh_mult[THR_NEWA ] = 2000; |
-#if CONFIG_PRED_FILTER |
- sf->thresh_mult[THR_NEARESTA_FILT ] = 1500; |
- sf->thresh_mult[THR_ZEROA_FILT ] = 1500; |
- sf->thresh_mult[THR_NEARA_FILT ] = 1500; |
- sf->thresh_mult[THR_NEWA_FILT ] = 2000; |
-#endif |
sf->thresh_mult[THR_SPLITA ] = 20000; |
sf->thresh_mult[THR_COMP_SPLITLA ] = 10000; |
} |
@@ -1049,9 +890,6 @@ |
if (cpi->ref_frame_flags & VP9_LAST_FLAG) { |
sf->thresh_mult[THR_NEWMV ] = 2000; |
-#if CONFIG_PRED_FILTER |
- sf->thresh_mult[THR_NEWMV_FILT ] = 2000; |
-#endif |
sf->thresh_mult[THR_SPLITMV ] = 25000; |
sf->thresh_mult[THR_COMP_SPLITLG ] = 50000; |
} |
@@ -1061,12 +899,6 @@ |
sf->thresh_mult[THR_ZEROG ] = 2000; |
sf->thresh_mult[THR_NEARG ] = 2000; |
sf->thresh_mult[THR_NEWG ] = 2500; |
-#if CONFIG_PRED_FILTER |
- sf->thresh_mult[THR_NEARESTG_FILT ] = 2000; |
- sf->thresh_mult[THR_ZEROG_FILT ] = 2000; |
- sf->thresh_mult[THR_NEARG_FILT ] = 2000; |
- sf->thresh_mult[THR_NEWG_FILT ] = 2500; |
-#endif |
sf->thresh_mult[THR_SPLITG ] = 50000; |
sf->thresh_mult[THR_COMP_SPLITGA ] = 50000; |
} |
@@ -1076,12 +908,6 @@ |
sf->thresh_mult[THR_ZEROA ] = 2000; |
sf->thresh_mult[THR_NEARA ] = 2000; |
sf->thresh_mult[THR_NEWA ] = 2500; |
-#if CONFIG_PRED_FILTER |
- sf->thresh_mult[THR_NEARESTA_FILT ] = 2000; |
- sf->thresh_mult[THR_ZEROA_FILT ] = 2000; |
- sf->thresh_mult[THR_NEARA_FILT ] = 2000; |
- sf->thresh_mult[THR_NEWA_FILT ] = 2500; |
-#endif |
sf->thresh_mult[THR_SPLITA ] = 50000; |
sf->thresh_mult[THR_COMP_SPLITLA ] = 25000; |
} |
@@ -1132,12 +958,6 @@ |
sf->thresh_mult[THR_NEARESTMV] = INT_MAX; |
sf->thresh_mult[THR_ZEROMV ] = INT_MAX; |
sf->thresh_mult[THR_NEARMV ] = INT_MAX; |
-#if CONFIG_PRED_FILTER |
- sf->thresh_mult[THR_NEWMV_FILT ] = INT_MAX; |
- sf->thresh_mult[THR_NEARESTMV_FILT] = INT_MAX; |
- sf->thresh_mult[THR_ZEROMV_FILT ] = INT_MAX; |
- sf->thresh_mult[THR_NEARMV_FILT ] = INT_MAX; |
-#endif |
sf->thresh_mult[THR_SPLITMV ] = INT_MAX; |
} |
@@ -1146,12 +966,6 @@ |
sf->thresh_mult[THR_ZEROG ] = INT_MAX; |
sf->thresh_mult[THR_NEARG ] = INT_MAX; |
sf->thresh_mult[THR_NEWG ] = INT_MAX; |
-#if CONFIG_PRED_FILTER |
- sf->thresh_mult[THR_NEARESTG_FILT ] = INT_MAX; |
- sf->thresh_mult[THR_ZEROG_FILT ] = INT_MAX; |
- sf->thresh_mult[THR_NEARG_FILT ] = INT_MAX; |
- sf->thresh_mult[THR_NEWG_FILT ] = INT_MAX; |
-#endif |
#if CONFIG_COMP_INTERINTRA_PRED |
sf->thresh_mult[THR_COMP_INTERINTRA_ZEROG ] = INT_MAX; |
sf->thresh_mult[THR_COMP_INTERINTRA_NEARESTG] = INT_MAX; |
@@ -1166,12 +980,6 @@ |
sf->thresh_mult[THR_ZEROA ] = INT_MAX; |
sf->thresh_mult[THR_NEARA ] = INT_MAX; |
sf->thresh_mult[THR_NEWA ] = INT_MAX; |
-#if CONFIG_PRED_FILTER |
- sf->thresh_mult[THR_NEARESTA_FILT ] = INT_MAX; |
- sf->thresh_mult[THR_ZEROA_FILT ] = INT_MAX; |
- sf->thresh_mult[THR_NEARA_FILT ] = INT_MAX; |
- sf->thresh_mult[THR_NEWA_FILT ] = INT_MAX; |
-#endif |
#if CONFIG_COMP_INTERINTRA_PRED |
sf->thresh_mult[THR_COMP_INTERINTRA_ZEROA ] = INT_MAX; |
sf->thresh_mult[THR_COMP_INTERINTRA_NEARESTA] = INT_MAX; |
@@ -1805,12 +1613,11 @@ |
cm->prob_last_coded = 128; |
cm->prob_gf_coded = 128; |
cm->prob_intra_coded = 63; |
-#if CONFIG_SUPERBLOCKS |
- cm->sb_coded = 200; |
-#endif |
+ cm->sb32_coded = 200; |
+ cm->sb64_coded = 200; |
for (i = 0; i < COMP_PRED_CONTEXTS; i++) |
cm->prob_comppred[i] = 128; |
- for (i = 0; i < TX_SIZE_MAX - 1; i++) |
+ for (i = 0; i < TX_SIZE_MAX_SB - 1; i++) |
cm->prob_tx[i] = 128; |
// Prime the recent reference frame useage counters. |
@@ -1920,10 +1727,7 @@ |
#endif |
-#ifndef LLONG_MAX |
-#define LLONG_MAX 9223372036854775807LL |
-#endif |
- cpi->first_time_stamp_ever = LLONG_MAX; |
+ cpi->first_time_stamp_ever = INT64_MAX; |
cpi->frames_till_gf_update_due = 0; |
cpi->key_frame_count = 1; |
@@ -2007,13 +1811,16 @@ |
cpi->fn_ptr[BT].sdx4df = SDX4DF; |
-#if CONFIG_SUPERBLOCKS |
BFP(BLOCK_32X32, vp9_sad32x32, vp9_variance32x32, vp9_sub_pixel_variance32x32, |
vp9_variance_halfpixvar32x32_h, vp9_variance_halfpixvar32x32_v, |
vp9_variance_halfpixvar32x32_hv, vp9_sad32x32x3, vp9_sad32x32x8, |
vp9_sad32x32x4d) |
-#endif |
+ BFP(BLOCK_64X64, vp9_sad64x64, vp9_variance64x64, vp9_sub_pixel_variance64x64, |
+ vp9_variance_halfpixvar64x64_h, vp9_variance_halfpixvar64x64_v, |
+ vp9_variance_halfpixvar64x64_hv, vp9_sad64x64x3, vp9_sad64x64x8, |
+ vp9_sad64x64x4d) |
+ |
BFP(BLOCK_16X16, vp9_sad16x16, vp9_variance16x16, vp9_sub_pixel_variance16x16, |
vp9_variance_halfpixvar16x16_h, vp9_variance_halfpixvar16x16_v, |
vp9_variance_halfpixvar16x16_hv, vp9_sad16x16x3, vp9_sad16x16x8, |
@@ -2223,11 +2030,11 @@ |
fprintf(fmode, "[VP9_KF_BINTRAMODES][VP9_KF_BINTRAMODES]" |
"[VP9_KF_BINTRAMODES] =\n{\n"); |
- for (i = 0; i < VP8_KF_BINTRAMODES; i++) { |
+ for (i = 0; i < VP9_KF_BINTRAMODES; i++) { |
fprintf(fmode, " { // Above Mode : %d\n", i); |
- for (j = 0; j < VP8_KF_BINTRAMODES; j++) { |
+ for (j = 0; j < VP9_KF_BINTRAMODES; j++) { |
fprintf(fmode, " {"); |
@@ -2312,8 +2119,8 @@ |
} |
-static uint64_t calc_plane_error(unsigned char *orig, int orig_stride, |
- unsigned char *recon, int recon_stride, |
+static uint64_t calc_plane_error(uint8_t *orig, int orig_stride, |
+ uint8_t *recon, int recon_stride, |
unsigned int cols, unsigned int rows) { |
unsigned int row, col; |
uint64_t total_sse = 0; |
@@ -2329,9 +2136,9 @@ |
/* Handle odd-sized width */ |
if (col < cols) { |
- unsigned int border_row, border_col; |
- unsigned char *border_orig = orig; |
- unsigned char *border_recon = recon; |
+ unsigned int border_row, border_col; |
+ uint8_t *border_orig = orig; |
+ uint8_t *border_recon = recon; |
for (border_row = 0; border_row < 16; border_row++) { |
for (border_col = col; border_col < cols; border_col++) { |
@@ -2490,7 +2297,7 @@ |
#ifdef OUTPUT_YUV_SRC |
void vp9_write_yuv_frame(YV12_BUFFER_CONFIG *s) { |
- unsigned char *src = s->y_buffer; |
+ uint8_t *src = s->y_buffer; |
int h = s->y_height; |
do { |
@@ -2519,7 +2326,7 @@ |
#ifdef OUTPUT_YUV_REC |
void vp9_write_yuv_rec_frame(VP9_COMMON *cm) { |
YV12_BUFFER_CONFIG *s = cm->frame_to_show; |
- unsigned char *src = s->y_buffer; |
+ uint8_t *src = s->y_buffer; |
int h = cm->Height; |
do { |
@@ -2692,9 +2499,9 @@ |
int i, j; |
int num_edge_pels = 0; |
int num_pels = (frame->y_height - 2) * (frame->y_width - 2); |
- unsigned char *prev = frame->y_buffer + 1; |
- unsigned char *curr = frame->y_buffer + 1 + frame->y_stride; |
- unsigned char *next = frame->y_buffer + 1 + 2 * frame->y_stride; |
+ uint8_t *prev = frame->y_buffer + 1; |
+ uint8_t *curr = frame->y_buffer + 1 + frame->y_stride; |
+ uint8_t *next = frame->y_buffer + 1 + 2 * frame->y_stride; |
for (i = 1; i < frame->y_height - 1; i++) { |
for (j = 1; j < frame->y_width - 1; j++) { |
/* Sobel hor and ver gradients */ |
@@ -2716,10 +2523,10 @@ |
// Function to test for conditions that indicate we should loop |
// back and recode a frame. |
-static BOOL recode_loop_test(VP9_COMP *cpi, |
- int high_limit, int low_limit, |
- int q, int maxq, int minq) { |
- BOOL force_recode = FALSE; |
+static int recode_loop_test(VP9_COMP *cpi, |
+ int high_limit, int low_limit, |
+ int q, int maxq, int minq) { |
+ int force_recode = FALSE; |
VP9_COMMON *cm = &cpi->common; |
// Is frame recode allowed at all |
@@ -2852,57 +2659,52 @@ |
if (cm->filter_level > 0) { |
vp9_set_alt_lf_level(cpi, cm->filter_level); |
- vp9_loop_filter_frame(cm, &cpi->mb.e_mbd); |
+ vp9_loop_filter_frame(cm, &cpi->mb.e_mbd, cm->filter_level, 0); |
} |
vp8_yv12_extend_frame_borders(cm->frame_to_show); |
} |
-#if CONFIG_PRED_FILTER |
-void select_pred_filter_mode(VP9_COMP *cpi) { |
- VP9_COMMON *cm = &cpi->common; |
+void select_interp_filter_type(VP9_COMP *cpi) { |
+ int i; |
+ int high_filter_index = 0; |
+ unsigned int thresh; |
+ unsigned int high_count = 0; |
+ unsigned int count_sum = 0; |
+ unsigned int *hist = cpi->best_switchable_interp_count; |
- int prob_pred_filter_off = cm->prob_pred_filter_off; |
+ if (DEFAULT_INTERP_FILTER != SWITCHABLE) { |
+ cpi->common.mcomp_filter_type = DEFAULT_INTERP_FILTER; |
+ return; |
+ } |
- // Force filter on/off if probability is extreme |
- if (prob_pred_filter_off >= 255 * 0.95) |
- cm->pred_filter_mode = 0; // Off at the frame level |
- else if (prob_pred_filter_off <= 255 * 0.05) |
- cm->pred_filter_mode = 1; // On at the frame level |
- else |
- cm->pred_filter_mode = 2; // Selectable at the MB level |
-} |
+ // TODO(agrange): Look at using RD criteria to select the interpolation |
+ // filter to use for the next frame rather than this simpler counting scheme. |
-void update_pred_filt_prob(VP9_COMP *cpi) { |
- VP9_COMMON *cm = &cpi->common; |
- int prob_pred_filter_off; |
+ // Select the interpolation filter mode for the next frame |
+ // based on the selection frequency seen in the current frame. |
+ for (i = 0; i < VP9_SWITCHABLE_FILTERS; ++i) { |
+ unsigned int count = hist[i]; |
+ count_sum += count; |
+ if (count > high_count) { |
+ high_count = count; |
+ high_filter_index = i; |
+ } |
+ } |
- // Based on the selection in the previous frame determine what mode |
- // to use for the current frame and work out the signaling probability |
- if (cpi->pred_filter_on_count + cpi->pred_filter_off_count) { |
- prob_pred_filter_off = cpi->pred_filter_off_count * 256 / |
- (cpi->pred_filter_on_count + cpi->pred_filter_off_count); |
+ thresh = (unsigned int)(0.80 * count_sum); |
- if (prob_pred_filter_off < 1) |
- prob_pred_filter_off = 1; |
- |
- if (prob_pred_filter_off > 255) |
- prob_pred_filter_off = 255; |
- |
- cm->prob_pred_filter_off = prob_pred_filter_off; |
- } else |
- cm->prob_pred_filter_off = 128; |
- /* |
- { |
- FILE *fp = fopen("filt_use.txt", "a"); |
- fprintf (fp, "%d %d prob=%d\n", cpi->pred_filter_off_count, |
- cpi->pred_filter_on_count, cm->prob_pred_filter_off); |
- fclose(fp); |
- } |
- */ |
+ if (high_count > thresh) { |
+ // One filter accounts for 80+% of cases so force the next |
+ // frame to use this filter exclusively using frame-level flag. |
+ cpi->common.mcomp_filter_type = vp9_switchable_interp[high_filter_index]; |
+ } else { |
+ // Use a MB-level switchable filter selection strategy. |
+ cpi->common.mcomp_filter_type = SWITCHABLE; |
+ } |
} |
-#endif |
+ |
#if CONFIG_COMP_INTERINTRA_PRED |
static void select_interintra_mode(VP9_COMP *cpi) { |
static const double threshold = 0.01; |
@@ -2917,13 +2719,10 @@ |
} |
#endif |
-static void encode_frame_to_data_rate |
-( |
- VP9_COMP *cpi, |
- unsigned long *size, |
- unsigned char *dest, |
- unsigned int *frame_flags |
-) { |
+static void encode_frame_to_data_rate(VP9_COMP *cpi, |
+ unsigned long *size, |
+ unsigned char *dest, |
+ unsigned int *frame_flags) { |
VP9_COMMON *cm = &cpi->common; |
MACROBLOCKD *xd = &cpi->mb.e_mbd; |
@@ -2933,8 +2732,6 @@ |
int Loop = FALSE; |
int loop_count; |
- int this_q; |
- int last_zbin_oq; |
int q_low; |
int q_high; |
@@ -2948,8 +2745,6 @@ |
int overshoot_seen = FALSE; |
int undershoot_seen = FALSE; |
- int loop_size_estimate = 0; |
- |
SPEED_FEATURES *sf = &cpi->sf; |
#if RESET_FOREACH_FILTER |
int q_low0; |
@@ -2957,6 +2752,7 @@ |
int zbin_oq_high0; |
int zbin_oq_low0 = 0; |
int Q0; |
+ int last_zbin_oq; |
int last_zbin_oq0; |
int active_best_quality0; |
int active_worst_quality0; |
@@ -2966,12 +2762,16 @@ |
/* list of filters to search over */ |
int mcomp_filters_to_search[] = { |
- EIGHTTAP, EIGHTTAP_SHARP, SIXTAP, SWITCHABLE |
+#if CONFIG_ENABLE_6TAP |
+ EIGHTTAP, EIGHTTAP_SHARP, SIXTAP, SWITCHABLE |
+#else |
+ EIGHTTAP, EIGHTTAP_SHARP, EIGHTTAP_SMOOTH, SWITCHABLE |
+#endif |
}; |
int mcomp_filters = sizeof(mcomp_filters_to_search) / |
sizeof(*mcomp_filters_to_search); |
int mcomp_filter_index = 0; |
- INT64 mcomp_filter_cost[4]; |
+ int64_t mcomp_filter_cost[4]; |
// Clear down mmx registers to allow floating point in what follows |
vp9_clear_system_state(); |
@@ -3025,11 +2825,6 @@ |
// Set default state for segment based loop filter update flags |
xd->mode_ref_lf_delta_update = 0; |
-#if CONFIG_NEW_MVREF |
- // Temp defaults probabilities for ecnoding the MV ref id signal |
- vpx_memset(xd->mb_mv_ref_id_probs, 192, |
- sizeof(xd->mb_mv_ref_id_probs)); |
-#endif |
// Set various flags etc to special state if it is a key frame |
if (cm->frame_type == KEY_FRAME) { |
@@ -3169,14 +2964,16 @@ |
if (cpi->active_worst_quality < cpi->active_best_quality) |
cpi->active_worst_quality = cpi->active_best_quality; |
- // Specuial case code to try and match quality with forced key frames |
+ // Special case code to try and match quality with forced key frames |
if ((cm->frame_type == KEY_FRAME) && cpi->this_key_frame_forced) { |
Q = cpi->last_boosted_qindex; |
} else { |
// Determine initial Q to try |
Q = vp9_regulate_q(cpi, cpi->this_frame_target); |
} |
+#if RESET_FOREACH_FILTER |
last_zbin_oq = cpi->zbin_over_quant; |
+#endif |
// Set highest allowed value for Zbin over quant |
if (cm->frame_type == KEY_FRAME) |
@@ -3219,7 +3016,7 @@ |
#if CONFIG_POSTPROC |
if (cpi->oxcf.noise_sensitivity > 0) { |
- unsigned char *src; |
+ uint8_t *src; |
int l = 0; |
switch (cpi->oxcf.noise_sensitivity) { |
@@ -3280,7 +3077,6 @@ |
vp9_clear_system_state(); // __asm emms; |
vp9_set_quantizer(cpi, Q); |
- this_q = Q; |
if (loop_count == 0) { |
@@ -3344,13 +3140,6 @@ |
vp9_clear_system_state(); // __asm emms; |
-#if CONFIG_PRED_FILTER |
- // Update prediction filter on/off probability based on |
- // selection made for the current frame |
- if (cm->frame_type != KEY_FRAME) |
- update_pred_filt_prob(cpi); |
-#endif |
- |
// Dummy pack of the bitstream using up to date stats to get an |
// accurate estimate of output frame size to determine if we need |
// to recode. |
@@ -3516,49 +3305,20 @@ |
// Loop = ((Q != last_q) || (last_zbin_oq != cpi->zbin_over_quant)) ? TRUE : FALSE; |
Loop = ((Q != last_q)) ? TRUE : FALSE; |
+#if RESET_FOREACH_FILTER |
last_zbin_oq = cpi->zbin_over_quant; |
+#endif |
} else |
Loop = FALSE; |
if (cpi->is_src_frame_alt_ref) |
Loop = FALSE; |
- if (cm->frame_type != KEY_FRAME && |
- !sf->search_best_filter && |
- cm->mcomp_filter_type == SWITCHABLE) { |
- int interp_factor = Q / 3; /* denominator is 256 */ |
- int count[VP9_SWITCHABLE_FILTERS]; |
- int tot_count = 0, c = 0, thr; |
- int i, j; |
- for (i = 0; i < VP9_SWITCHABLE_FILTERS; ++i) { |
- count[i] = 0; |
- for (j = 0; j <= VP9_SWITCHABLE_FILTERS; ++j) { |
- count[i] += cpi->switchable_interp_count[j][i]; |
- } |
- tot_count += count[i]; |
- } |
- |
- thr = ((tot_count * interp_factor + 128) >> 8); |
- for (i = 0; i < VP9_SWITCHABLE_FILTERS; ++i) { |
- c += (count[i] >= thr); |
- } |
- if (c == 1) { |
- /* Mostly one filter is used. So set the filter at frame level */ |
- for (i = 0; i < VP9_SWITCHABLE_FILTERS; ++i) { |
- if (count[i]) { |
- cm->mcomp_filter_type = vp9_switchable_interp[i]; |
- Loop = TRUE; /* Make sure to loop since the filter changed */ |
- break; |
- } |
- } |
- } |
- } |
- |
if (Loop == FALSE && cm->frame_type != KEY_FRAME && sf->search_best_filter) { |
if (mcomp_filter_index < mcomp_filters) { |
- INT64 err = vp9_calc_ss_err(cpi->Source, |
+ int64_t err = vp9_calc_ss_err(cpi->Source, |
&cm->yv12_fb[cm->new_fb_idx]); |
- INT64 rate = cpi->projected_frame_size << 8; |
+ int64_t rate = cpi->projected_frame_size << 8; |
mcomp_filter_cost[mcomp_filter_index] = |
(RDCOST(cpi->RDMULT, cpi->RDDIV, rate, err)); |
mcomp_filter_index++; |
@@ -3568,7 +3328,7 @@ |
Loop = TRUE; |
} else { |
int f; |
- INT64 best_cost = mcomp_filter_cost[0]; |
+ int64_t best_cost = mcomp_filter_cost[0]; |
int mcomp_best_filter = mcomp_filters_to_search[0]; |
for (f = 1; f < mcomp_filters; f++) { |
if (mcomp_filter_cost[f] < best_cost) { |
@@ -3608,6 +3368,7 @@ |
if (Loop == TRUE) { |
loop_count++; |
+ |
#if CONFIG_INTERNAL_STATS |
cpi->tot_recode_hits++; |
#endif |
@@ -3683,26 +3444,20 @@ |
update_reference_segmentation_map(cpi); |
} |
-#if CONFIG_PRED_FILTER |
- // Select the prediction filtering mode to use for the |
- // next frame based on the current frame selections |
- if (cm->frame_type != KEY_FRAME) |
- select_pred_filter_mode(cpi); |
-#endif |
- |
update_reference_frames(cm); |
- vp9_copy(cpi->common.fc.coef_counts, cpi->coef_counts); |
- vp9_copy(cpi->common.fc.hybrid_coef_counts, cpi->hybrid_coef_counts); |
+ vp9_copy(cpi->common.fc.coef_counts_4x4, cpi->coef_counts_4x4); |
+ vp9_copy(cpi->common.fc.hybrid_coef_counts_4x4, |
+ cpi->hybrid_coef_counts_4x4); |
vp9_copy(cpi->common.fc.coef_counts_8x8, cpi->coef_counts_8x8); |
- vp9_copy(cpi->common.fc.hybrid_coef_counts_8x8, cpi->hybrid_coef_counts_8x8); |
+ vp9_copy(cpi->common.fc.hybrid_coef_counts_8x8, |
+ cpi->hybrid_coef_counts_8x8); |
vp9_copy(cpi->common.fc.coef_counts_16x16, cpi->coef_counts_16x16); |
vp9_copy(cpi->common.fc.hybrid_coef_counts_16x16, |
cpi->hybrid_coef_counts_16x16); |
+ vp9_copy(cpi->common.fc.coef_counts_32x32, cpi->coef_counts_32x32); |
vp9_adapt_coef_probs(&cpi->common); |
if (cpi->common.frame_type != KEY_FRAME) { |
-#if CONFIG_SUPERBLOCKS |
vp9_copy(cpi->common.fc.sb_ymode_counts, cpi->sb_ymode_count); |
-#endif |
vp9_copy(cpi->common.fc.ymode_counts, cpi->ymode_count); |
vp9_copy(cpi->common.fc.uv_mode_counts, cpi->y_uv_mode_count); |
vp9_copy(cpi->common.fc.bmode_counts, cpi->bmode_count); |
@@ -3730,9 +3485,6 @@ |
* needed in motion search besides loopfilter */ |
cm->last_frame_type = cm->frame_type; |
- // Keep a copy of the size estimate used in the loop |
- loop_size_estimate = cpi->projected_frame_size; |
- |
// Update rate control heuristics |
cpi->total_byte_count += (*size); |
cpi->projected_frame_size = (*size) << 3; |
@@ -3817,19 +3569,6 @@ |
// in this frame. |
update_base_skip_probs(cpi); |
-#if 0 //CONFIG_NEW_MVREF && CONFIG_INTERNAL_STATS |
- { |
- FILE *f = fopen("mv_ref_dist.stt", "a"); |
- unsigned int i; |
- for (i = 0; i < MAX_MV_REFS; ++i) { |
- fprintf(f, "%10d", cpi->best_ref_index_counts[0][i]); |
- } |
- fprintf(f, "\n" ); |
- |
- fclose(f); |
- } |
-#endif |
- |
#if 0// 1 && CONFIG_INTERNAL_STATS |
{ |
FILE *f = fopen("tmp.stt", "a"); |
@@ -3846,7 +3585,7 @@ |
"%6d %5d %5d %5d %8d %8.2f %10d %10.3f" |
"%10.3f %8d %10d %10d %10d\n", |
cpi->common.current_video_frame, cpi->this_frame_target, |
- cpi->projected_frame_size, loop_size_estimate, |
+ cpi->projected_frame_size, 0, //loop_size_estimate, |
(cpi->projected_frame_size - cpi->this_frame_target), |
(int)cpi->total_target_vs_actual, |
(cpi->oxcf.starting_buffer_level - cpi->bits_off_target), |
@@ -3876,7 +3615,7 @@ |
"%8d %10d %10d %10d\n", |
cpi->common.current_video_frame, |
cpi->this_frame_target, cpi->projected_frame_size, |
- loop_size_estimate, |
+ 0, //loop_size_estimate, |
(cpi->projected_frame_size - cpi->this_frame_target), |
(int)cpi->total_target_vs_actual, |
(cpi->oxcf.starting_buffer_level - cpi->bits_off_target), |
@@ -4498,8 +4237,8 @@ |
int i, j; |
int Total = 0; |
- unsigned char *src = source->y_buffer; |
- unsigned char *dst = dest->y_buffer; |
+ uint8_t *src = source->y_buffer; |
+ uint8_t *dst = dest->y_buffer; |
// Loop through the Y plane raw and reconstruction data summing (square differences) |
for (i = 0; i < source->y_height; i += 16) { |