Merge "New loop filter interface"
diff --git a/vp8/common/arm/arm_systemdependent.c b/vp8/common/arm/arm_systemdependent.c
index bd5c075..8aab0ff 100644
--- a/vp8/common/arm/arm_systemdependent.c
+++ b/vp8/common/arm/arm_systemdependent.c
@@ -24,14 +24,17 @@
#if CONFIG_RUNTIME_CPU_DETECT
VP8_COMMON_RTCD *rtcd = &ctx->rtcd;
int flags = arm_cpu_caps();
- int has_edsp = flags & HAS_EDSP;
- int has_media = flags & HAS_MEDIA;
- int has_neon = flags & HAS_NEON;
rtcd->flags = flags;
/* Override default functions with fastest ones for this CPU. */
+#if HAVE_ARMV5TE
+ if (flags & HAS_EDSP)
+ {
+ }
+#endif
+
#if HAVE_ARMV6
- if (has_media)
+ if (flags & HAS_MEDIA)
{
rtcd->subpix.sixtap16x16 = vp8_sixtap_predict16x16_armv6;
rtcd->subpix.sixtap8x8 = vp8_sixtap_predict8x8_armv6;
@@ -66,7 +69,7 @@
#endif
#if HAVE_ARMV7
- if (has_neon)
+ if (flags & HAS_NEON)
{
rtcd->subpix.sixtap16x16 = vp8_sixtap_predict16x16_neon;
rtcd->subpix.sixtap8x8 = vp8_sixtap_predict8x8_neon;
diff --git a/vp8/decoder/arm/arm_dsystemdependent.c b/vp8/decoder/arm/arm_dsystemdependent.c
index 51e901d..79e2e1b 100644
--- a/vp8/decoder/arm/arm_dsystemdependent.c
+++ b/vp8/decoder/arm/arm_dsystemdependent.c
@@ -21,12 +21,15 @@
{
#if CONFIG_RUNTIME_CPU_DETECT
int flags = pbi->common.rtcd.flags;
- int has_edsp = flags & HAS_EDSP;
- int has_media = flags & HAS_MEDIA;
- int has_neon = flags & HAS_NEON;
+
+#if HAVE_ARMV5TE
+ if (flags & HAS_EDSP)
+ {
+ }
+#endif
#if HAVE_ARMV6
- if (has_media)
+ if (flags & HAS_MEDIA)
{
pbi->dequant.block = vp8_dequantize_b_v6;
pbi->dequant.idct_add = vp8_dequant_idct_add_v6;
@@ -38,7 +41,7 @@
#endif
#if HAVE_ARMV7
- if (has_neon)
+ if (flags & HAS_NEON)
{
pbi->dequant.block = vp8_dequantize_b_neon;
pbi->dequant.idct_add = vp8_dequant_idct_add_neon;
diff --git a/vp8/encoder/arm/arm_csystemdependent.c b/vp8/encoder/arm/arm_csystemdependent.c
index 56c858c..89f8136 100644
--- a/vp8/encoder/arm/arm_csystemdependent.c
+++ b/vp8/encoder/arm/arm_csystemdependent.c
@@ -22,12 +22,15 @@
{
#if CONFIG_RUNTIME_CPU_DETECT
int flags = cpi->common.rtcd.flags;
- int has_edsp = flags & HAS_EDSP;
- int has_media = flags & HAS_MEDIA;
- int has_neon = flags & HAS_NEON;
+
+#if HAVE_ARMV5TE
+ if (flags & HAS_EDSP)
+ {
+ }
+#endif
#if HAVE_ARMV6
- if (has_media)
+ if (flags & HAS_MEDIA)
{
cpi->rtcd.variance.sad16x16 = vp8_sad16x16_armv6;
/*cpi->rtcd.variance.sad16x8 = vp8_sad16x8_c;
@@ -74,7 +77,7 @@
#endif
#if HAVE_ARMV7
- if (has_neon)
+ if (flags & HAS_NEON)
{
cpi->rtcd.variance.sad16x16 = vp8_sad16x16_neon;
cpi->rtcd.variance.sad16x8 = vp8_sad16x8_neon;
@@ -124,7 +127,7 @@
#if HAVE_ARMV7
#if CONFIG_RUNTIME_CPU_DETECT
- if (has_neon)
+ if (flags & HAS_NEON)
#endif
{
vp8_yv12_copy_partial_frame_ptr = vpxyv12_copy_partial_frame_neon;
diff --git a/vp8/encoder/firstpass.c b/vp8/encoder/firstpass.c
index 4fc6a8a..881481b 100644
--- a/vp8/encoder/firstpass.c
+++ b/vp8/encoder/firstpass.c
@@ -431,6 +431,7 @@
int num00;
int_mv tmp_mv;
+ int_mv ref_mv_full;
int tmp_err;
int step_param = 3; //3; // Dont search over full range for first pass
@@ -447,7 +448,9 @@
// Initial step/diamond search centred on best mv
tmp_mv.as_int = 0;
- tmp_err = cpi->diamond_search_sad(x, b, d, ref_mv, &tmp_mv, step_param,
+ ref_mv_full.as_mv.col = ref_mv->as_mv.col>>3;
+ ref_mv_full.as_mv.row = ref_mv->as_mv.row>>3;
+ tmp_err = cpi->diamond_search_sad(x, b, d, &ref_mv_full, &tmp_mv, step_param,
x->sadperbit16, &num00, &v_fn_ptr,
x->mvcost, ref_mv);
if ( tmp_err < INT_MAX-new_mv_mode_penalty )
@@ -472,7 +475,7 @@
num00--;
else
{
- tmp_err = cpi->diamond_search_sad(x, b, d, ref_mv, &tmp_mv,
+ tmp_err = cpi->diamond_search_sad(x, b, d, &ref_mv_full, &tmp_mv,
step_param + n, x->sadperbit16,
&num00, &v_fn_ptr, x->mvcost,
ref_mv);
diff --git a/vp8/encoder/mcomp.c b/vp8/encoder/mcomp.c
index 6f314a3..4b55ace 100644
--- a/vp8/encoder/mcomp.c
+++ b/vp8/encoder/mcomp.c
@@ -834,7 +834,7 @@
unsigned char *what = (*(b->base_src) + b->src);
int what_stride = b->src_stride;
int in_what_stride = d->pre_stride;
- int br = ref_mv->as_mv.row >> 3, bc = ref_mv->as_mv.col >> 3;
+ int br = ref_mv->as_mv.row, bc = ref_mv->as_mv.col;
int_mv this_mv;
unsigned int bestsad = 0x7fffffff;
unsigned int thissad;
@@ -1011,8 +1011,8 @@
int best_site = 0;
int last_site = 0;
- int ref_row = ref_mv->as_mv.row >> 3;
- int ref_col = ref_mv->as_mv.col >> 3;
+ int ref_row = ref_mv->as_mv.row;
+ int ref_col = ref_mv->as_mv.col;
int this_row_offset;
int this_col_offset;
search_site *ss;
@@ -1130,8 +1130,8 @@
int best_site = 0;
int last_site = 0;
- int ref_row = ref_mv->as_mv.row >> 3;
- int ref_col = ref_mv->as_mv.col >> 3;
+ int ref_row = ref_mv->as_mv.row;
+ int ref_col = ref_mv->as_mv.col;
int this_row_offset;
int this_col_offset;
search_site *ss;
diff --git a/vp8/encoder/pickinter.c b/vp8/encoder/pickinter.c
index fac068f..725e44e 100644
--- a/vp8/encoder/pickinter.c
+++ b/vp8/encoder/pickinter.c
@@ -42,9 +42,7 @@
extern const MV_REFERENCE_FRAME vp8_ref_frame_order[MAX_MODES];
extern const MB_PREDICTION_MODE vp8_mode_order[MAX_MODES];
-
extern unsigned int (*vp8_get4x4sse_cs)(unsigned char *src_ptr, int source_stride, unsigned char *ref_ptr, int recon_stride);
-extern int vp8_rd_pick_best_mbsegmentation(VP8_COMP *cpi, MACROBLOCK *x, MV *best_ref_mv, int best_rd, int *, int *, int *, int, int *mvcost[2], int, int fullpixel);
extern int vp8_cost_mv_ref(MB_PREDICTION_MODE m, const int near_mv_ref_ct[4]);
@@ -575,25 +573,6 @@
continue;
}
- if(cpi->sf.improved_mv_pred && x->e_mbd.mode_info_context->mbmi.mode == NEWMV)
- {
- if(!saddone)
- {
- vp8_cal_sad(cpi,xd,x, recon_yoffset ,&near_sadidx[0] );
- saddone = 1;
- }
-
- vp8_mv_pred(cpi, &x->e_mbd, x->e_mbd.mode_info_context, &mvp,
- x->e_mbd.mode_info_context->mbmi.ref_frame, cpi->common.ref_frame_sign_bias, &sr, &near_sadidx[0]);
-
- /* adjust mvp to make sure it is within MV range */
- vp8_clamp_mv(&mvp,
- best_ref_mv.as_mv.col - (MAX_FULL_PEL_VAL<<3),
- best_ref_mv.as_mv.col + (MAX_FULL_PEL_VAL<<3),
- best_ref_mv.as_mv.row - (MAX_FULL_PEL_VAL<<3),
- best_ref_mv.as_mv.row + (MAX_FULL_PEL_VAL<<3));
- }
-
switch (this_mode)
{
case B_PRED:
@@ -654,11 +633,12 @@
int further_steps;
int n = 0;
int sadpb = x->sadperbit16;
+ int_mv mvp_full;
- int col_min;
- int col_max;
- int row_min;
- int row_max;
+ int col_min = (best_ref_mv.as_mv.col>>3) - MAX_FULL_PEL_VAL + ((best_ref_mv.as_mv.col & 7)?1:0);
+ int row_min = (best_ref_mv.as_mv.row>>3) - MAX_FULL_PEL_VAL + ((best_ref_mv.as_mv.row & 7)?1:0);
+ int col_max = (best_ref_mv.as_mv.col>>3) + MAX_FULL_PEL_VAL;
+ int row_max = (best_ref_mv.as_mv.row>>3) + MAX_FULL_PEL_VAL;
int tmp_col_min = x->mv_col_min;
int tmp_col_max = x->mv_col_max;
@@ -672,24 +652,32 @@
if(cpi->sf.improved_mv_pred)
{
+ if(!saddone)
+ {
+ vp8_cal_sad(cpi,xd,x, recon_yoffset ,&near_sadidx[0] );
+ saddone = 1;
+ }
+
+ vp8_mv_pred(cpi, &x->e_mbd, x->e_mbd.mode_info_context, &mvp,
+ x->e_mbd.mode_info_context->mbmi.ref_frame, cpi->common.ref_frame_sign_bias, &sr, &near_sadidx[0]);
+
sr += speed_adjust;
//adjust search range according to sr from mv prediction
if(sr > step_param)
step_param = sr;
+
+ mvp_full.as_mv.col = mvp.as_mv.col>>3;
+ mvp_full.as_mv.row = mvp.as_mv.row>>3;
+
+ /* adjust mvp to make sure it is within MV range */
+ vp8_clamp_mv(&mvp_full, col_min, col_max, row_min, row_max);
}else
{
mvp.as_int = best_ref_mv.as_int;
+ mvp_full.as_mv.col = best_ref_mv.as_mv.col>>3;
+ mvp_full.as_mv.row = best_ref_mv.as_mv.row>>3;
}
- col_min = (best_ref_mv.as_mv.col < 0)?(-((abs(best_ref_mv.as_mv.col))>>3) - MAX_FULL_PEL_VAL)
- :((best_ref_mv.as_mv.col>>3) - MAX_FULL_PEL_VAL);
- col_max = (best_ref_mv.as_mv.col < 0)?(-((abs(best_ref_mv.as_mv.col))>>3) + MAX_FULL_PEL_VAL)
- :((best_ref_mv.as_mv.col>>3) + MAX_FULL_PEL_VAL);
- row_min = (best_ref_mv.as_mv.row < 0)?(-((abs(best_ref_mv.as_mv.row))>>3) - MAX_FULL_PEL_VAL)
- :((best_ref_mv.as_mv.row>>3) - MAX_FULL_PEL_VAL);
- row_max = (best_ref_mv.as_mv.row < 0)?(-((abs(best_ref_mv.as_mv.row))>>3) + MAX_FULL_PEL_VAL)
- :((best_ref_mv.as_mv.row>>3) + MAX_FULL_PEL_VAL);
-
// Get intersection of UMV window and valid MV window to reduce # of checks in diamond search.
if (x->mv_col_min < col_min )
x->mv_col_min = col_min;
@@ -704,14 +692,14 @@
if (cpi->sf.search_method == HEX)
{
- bestsme = vp8_hex_search(x, b, d, &mvp, &d->bmi.mv, step_param,
+ bestsme = vp8_hex_search(x, b, d, &mvp_full, &d->bmi.mv, step_param,
sadpb, &cpi->fn_ptr[BLOCK_16X16],
x->mvsadcost, x->mvcost, &best_ref_mv);
mode_mv[NEWMV].as_int = d->bmi.mv.as_int;
}
else
{
- bestsme = cpi->diamond_search_sad(x, b, d, &mvp, &d->bmi.mv,
+ bestsme = cpi->diamond_search_sad(x, b, d, &mvp_full, &d->bmi.mv,
step_param, sadpb, &num00,
&cpi->fn_ptr[BLOCK_16X16],
x->mvcost, &best_ref_mv);
@@ -733,7 +721,7 @@
else
{
thissme =
- cpi->diamond_search_sad(x, b, d, &mvp,
+ cpi->diamond_search_sad(x, b, d, &mvp_full,
&d->bmi.mv,
step_param + n,
sadpb, &num00,
diff --git a/vp8/encoder/rdopt.c b/vp8/encoder/rdopt.c
index 355542e..8b18541 100644
--- a/vp8/encoder/rdopt.c
+++ b/vp8/encoder/rdopt.c
@@ -1133,6 +1133,10 @@
{
int sadpb = x->sadperbit4;
+ int_mv mvp_full;
+
+ mvp_full.as_mv.row = bsi->mvp.as_mv.row >>3;
+ mvp_full.as_mv.col = bsi->mvp.as_mv.col >>3;
// find first label
n = vp8_mbsplit_offset[segmentation][i];
@@ -1141,7 +1145,7 @@
e = &x->e_mbd.block[n];
{
- bestsme = cpi->diamond_search_sad(x, c, e, &bsi->mvp,
+ bestsme = cpi->diamond_search_sad(x, c, e, &mvp_full,
&mode_mv[NEW4X4], step_param,
sadpb, &num00, v_fn_ptr,
x->mvcost, bsi->ref_mv);
@@ -1158,7 +1162,7 @@
else
{
thissme = cpi->diamond_search_sad(x, c, e,
- &bsi->mvp, &temp_mv,
+ &mvp_full, &temp_mv,
step_param + n, sadpb,
&num00, v_fn_ptr,
x->mvcost, bsi->ref_mv);
@@ -1177,12 +1181,7 @@
// Should we do a full search (best quality only)
if ((cpi->compressor_speed == 0) && (bestsme >> sseshift) > 4000)
{
- int_mv full_mvp;
-
- full_mvp.as_mv.row = bsi->mvp.as_mv.row >>3;
- full_mvp.as_mv.col = bsi->mvp.as_mv.col >>3;
-
- thissme = cpi->full_search_sad(x, c, e, &full_mvp,
+ thissme = cpi->full_search_sad(x, c, e, &mvp_full,
sadpb, 16, v_fn_ptr,
x->mvcost, bsi->ref_mv);
@@ -1330,14 +1329,10 @@
if (bsi.segment_rd < best_rd)
{
- int col_min = (best_ref_mv->as_mv.col < 0)?(-((abs(best_ref_mv->as_mv.col))>>3) - MAX_FULL_PEL_VAL)
- :((best_ref_mv->as_mv.col>>3) - MAX_FULL_PEL_VAL);
- int col_max = (best_ref_mv->as_mv.col < 0)?(-((abs(best_ref_mv->as_mv.col))>>3) + MAX_FULL_PEL_VAL)
- :((best_ref_mv->as_mv.col>>3) + MAX_FULL_PEL_VAL);
- int row_min = (best_ref_mv->as_mv.row < 0)?(-((abs(best_ref_mv->as_mv.row))>>3) - MAX_FULL_PEL_VAL)
- :((best_ref_mv->as_mv.row>>3) - MAX_FULL_PEL_VAL);
- int row_max = (best_ref_mv->as_mv.row < 0)?(-((abs(best_ref_mv->as_mv.row))>>3) + MAX_FULL_PEL_VAL)
- :((best_ref_mv->as_mv.row>>3) + MAX_FULL_PEL_VAL);
+ int col_min = (best_ref_mv->as_mv.col>>3) - MAX_FULL_PEL_VAL + ((best_ref_mv->as_mv.col & 7)?1:0);
+ int row_min = (best_ref_mv->as_mv.row>>3) - MAX_FULL_PEL_VAL + ((best_ref_mv->as_mv.row & 7)?1:0);
+ int col_max = (best_ref_mv->as_mv.col>>3) + MAX_FULL_PEL_VAL;
+ int row_max = (best_ref_mv->as_mv.row>>3) + MAX_FULL_PEL_VAL;
int tmp_col_min = x->mv_col_min;
int tmp_col_max = x->mv_col_max;
@@ -1869,25 +1864,6 @@
lf_or_gf = frame_lf_or_gf[x->e_mbd.mode_info_context->mbmi.ref_frame];
}
- if(x->e_mbd.mode_info_context->mbmi.mode == NEWMV)
- {
- if(!saddone)
- {
- vp8_cal_sad(cpi,xd,x, recon_yoffset ,&near_sadidx[0] );
- saddone = 1;
- }
-
- vp8_mv_pred(cpi, &x->e_mbd, x->e_mbd.mode_info_context, &mvp,
- x->e_mbd.mode_info_context->mbmi.ref_frame, cpi->common.ref_frame_sign_bias, &sr, &near_sadidx[0]);
-
- /* adjust mvp to make sure it is within MV range */
- vp8_clamp_mv(&mvp,
- best_ref_mv.as_mv.col - (MAX_FULL_PEL_VAL<<3),
- best_ref_mv.as_mv.col + (MAX_FULL_PEL_VAL<<3),
- best_ref_mv.as_mv.row - (MAX_FULL_PEL_VAL<<3),
- best_ref_mv.as_mv.row + (MAX_FULL_PEL_VAL<<3));
- }
-
// Check to see if the testing frequency for this mode is at its max
// If so then prevent it from being tested and increase the threshold for its testing
if (cpi->mode_test_hit_counts[mode_index] && (cpi->mode_check_freq[mode_index] > 1))
@@ -2016,21 +1992,33 @@
we will do a final 1-away diamond refining search */
int sadpb = x->sadperbit16;
+ int_mv mvp_full;
- int col_min = (best_ref_mv.as_mv.col < 0)?(-((abs(best_ref_mv.as_mv.col))>>3) - MAX_FULL_PEL_VAL)
- :((best_ref_mv.as_mv.col>>3) - MAX_FULL_PEL_VAL);
- int col_max = (best_ref_mv.as_mv.col < 0)?(-((abs(best_ref_mv.as_mv.col))>>3) + MAX_FULL_PEL_VAL)
- :((best_ref_mv.as_mv.col>>3) + MAX_FULL_PEL_VAL);
- int row_min = (best_ref_mv.as_mv.row < 0)?(-((abs(best_ref_mv.as_mv.row))>>3) - MAX_FULL_PEL_VAL)
- :((best_ref_mv.as_mv.row>>3) - MAX_FULL_PEL_VAL);
- int row_max = (best_ref_mv.as_mv.row < 0)?(-((abs(best_ref_mv.as_mv.row))>>3) + MAX_FULL_PEL_VAL)
- :((best_ref_mv.as_mv.row>>3) + MAX_FULL_PEL_VAL);
+ int col_min = (best_ref_mv.as_mv.col>>3) - MAX_FULL_PEL_VAL + ((best_ref_mv.as_mv.col & 7)?1:0);
+ int row_min = (best_ref_mv.as_mv.row>>3) - MAX_FULL_PEL_VAL + ((best_ref_mv.as_mv.row & 7)?1:0);
+ int col_max = (best_ref_mv.as_mv.col>>3) + MAX_FULL_PEL_VAL;
+ int row_max = (best_ref_mv.as_mv.row>>3) + MAX_FULL_PEL_VAL;
int tmp_col_min = x->mv_col_min;
int tmp_col_max = x->mv_col_max;
int tmp_row_min = x->mv_row_min;
int tmp_row_max = x->mv_row_max;
+ if(!saddone)
+ {
+ vp8_cal_sad(cpi,xd,x, recon_yoffset ,&near_sadidx[0] );
+ saddone = 1;
+ }
+
+ vp8_mv_pred(cpi, &x->e_mbd, x->e_mbd.mode_info_context, &mvp,
+ x->e_mbd.mode_info_context->mbmi.ref_frame, cpi->common.ref_frame_sign_bias, &sr, &near_sadidx[0]);
+
+ mvp_full.as_mv.col = mvp.as_mv.col>>3;
+ mvp_full.as_mv.row = mvp.as_mv.row>>3;
+
+ /* adjust mvp to make sure it is within MV range */
+ vp8_clamp_mv(&mvp_full, col_min, col_max, row_min, row_max);
+
// Get intersection of UMV window and valid MV window to reduce # of checks in diamond search.
if (x->mv_col_min < col_min )
x->mv_col_min = col_min;
@@ -2047,7 +2035,7 @@
// Initial step/diamond search
{
- bestsme = cpi->diamond_search_sad(x, b, d, &mvp, &d->bmi.mv,
+ bestsme = cpi->diamond_search_sad(x, b, d, &mvp_full, &d->bmi.mv,
step_param, sadpb, &num00,
&cpi->fn_ptr[BLOCK_16X16],
x->mvcost, &best_ref_mv);
@@ -2072,7 +2060,7 @@
num00--;
else
{
- thissme = cpi->diamond_search_sad(x, b, d, &mvp,
+ thissme = cpi->diamond_search_sad(x, b, d, &mvp_full,
&d->bmi.mv, step_param + n, sadpb, &num00,
&cpi->fn_ptr[BLOCK_16X16], x->mvcost,
&best_ref_mv);
diff --git a/vp8/encoder/temporal_filter.c b/vp8/encoder/temporal_filter.c
index c1ca7d4..1c2656e 100644
--- a/vp8/encoder/temporal_filter.c
+++ b/vp8/encoder/temporal_filter.c
@@ -157,6 +157,7 @@
BLOCK *b = &x->block[0];
BLOCKD *d = &x->e_mbd.block[0];
int_mv best_ref_mv1;
+ int_mv best_ref_mv1_full; /* full-pixel value of best_ref_mv1 */
int *mvcost[2] = { &dummy_cost[mv_max+1], &dummy_cost[mv_max+1] };
int *mvsadcost[2] = { &dummy_cost[mv_max+1], &dummy_cost[mv_max+1] };
@@ -170,6 +171,8 @@
int pre_stride = d->pre_stride;
best_ref_mv1.as_int = 0;
+ best_ref_mv1_full.as_mv.col = best_ref_mv1.as_mv.col >>3;
+ best_ref_mv1_full.as_mv.row = best_ref_mv1.as_mv.row >>3;
// Setup frame pointers
b->base_src = &arf_frame->y_buffer;
@@ -197,7 +200,7 @@
/*cpi->sf.search_method == HEX*/
// TODO Check that the 16x16 vf & sdf are selected here
bestsme = vp8_hex_search(x, b, d,
- &best_ref_mv1, &d->bmi.mv,
+ &best_ref_mv1_full, &d->bmi.mv,
step_param,
sadpb,
&cpi->fn_ptr[BLOCK_16X16],