summaryrefslogtreecommitdiff
path: root/vp8
diff options
context:
space:
mode:
authorAdrian Grange <agrange@google.com>2012-04-26 15:41:38 -0700
committerAdrian Grange <agrange@google.com>2012-04-27 08:48:13 -0700
commitf0605f4b7e426013f61927702c971f330e7c3e5b (patch)
tree943b451b8bf8e62eecf4de5efb841235e7285932 /vp8
parent24e7b1b90d802dacea4daeeb03984184c7b74d2a (diff)
downloadlibvpx-f0605f4b7e426013f61927702c971f330e7c3e5b.tar
libvpx-f0605f4b7e426013f61927702c971f330e7c3e5b.tar.gz
libvpx-f0605f4b7e426013f61927702c971f330e7c3e5b.tar.bz2
libvpx-f0605f4b7e426013f61927702c971f330e7c3e5b.zip
Removed MV costing from ARNR filtering
The ARNR filter uses a motion compensated temporal filter, but the motion estimation implementation accounts for the cost of the mv in its decision making process. The ARNR filter uses a dummy cost table initialized to 0 as a way to ignore the mv costs (which are irrelevant to the filter). This CL modifies the ARNR filter implementation so that the mv costing is ignored without the requirement for dummy tables. Change-Id: I4196aa5c24da63f858ff54fbaa5fc85ae1f1957f
Diffstat (limited to 'vp8')
-rw-r--r--vp8/encoder/mcomp.c22
-rw-r--r--vp8/encoder/temporal_filter.c35
2 files changed, 30 insertions, 27 deletions
diff --git a/vp8/encoder/mcomp.c b/vp8/encoder/mcomp.c
index 67e4f7ead..dc0edfbc1 100644
--- a/vp8/encoder/mcomp.c
+++ b/vp8/encoder/mcomp.c
@@ -34,17 +34,23 @@ int vp8_mv_bit_cost(int_mv *mv, int_mv *ref, int *mvcost[2], int Weight)
static int mv_err_cost(int_mv *mv, int_mv *ref, int *mvcost[2], int error_per_bit)
{
- return ((mvcost[0][(mv->as_mv.row - ref->as_mv.row) >> 1] +
- mvcost[1][(mv->as_mv.col - ref->as_mv.col) >> 1])
- * error_per_bit + 128) >> 8;
+ // Ignore mv costing if mvcost is NULL
+ if (mvcost)
+ return ((mvcost[0][(mv->as_mv.row - ref->as_mv.row) >> 1] +
+ mvcost[1][(mv->as_mv.col - ref->as_mv.col) >> 1])
+ * error_per_bit + 128) >> 8;
+ return 0;
}
static int mvsad_err_cost(int_mv *mv, int_mv *ref, int *mvsadcost[2], int error_per_bit)
{
- /* Calculate sad error cost on full pixel basis. */
- return ((mvsadcost[0][(mv->as_mv.row - ref->as_mv.row)] +
- mvsadcost[1][(mv->as_mv.col - ref->as_mv.col)])
- * error_per_bit + 128) >> 8;
+ // Calculate sad error cost on full pixel basis.
+ // Ignore mv costing if mvsadcost is NULL
+ if (mvsadcost)
+ return ((mvsadcost[0][(mv->as_mv.row - ref->as_mv.row)] +
+ mvsadcost[1][(mv->as_mv.col - ref->as_mv.col)])
+ * error_per_bit + 128) >> 8;
+ return 0;
}
void vp8_init_dsmotion_compensation(MACROBLOCK *x, int stride)
@@ -176,7 +182,7 @@ void vp8_init3smotion_compensation(MACROBLOCK *x, int stride)
* 32 cols area that is enough for 16x16 macroblock. Later, for SPLITMV, we
* could reduce the area.
*/
-#define MVC(r,c) (((mvcost[0][(r)-rr] + mvcost[1][(c) - rc]) * error_per_bit + 128 )>>8 ) // estimated cost of a motion vector (r,c)
+#define MVC(r,c) (mvcost ? ((mvcost[0][(r)-rr] + mvcost[1][(c) - rc]) * error_per_bit + 128 )>>8 : 0) // estimated cost of a motion vector (r,c)
#define PRE(r,c) (y + (((r)>>2) * y_stride + ((c)>>2) -(offset))) // pointer to predictor base of a motionvector
#define SP(x) (((x)&3)<<1) // convert motion vector component to offset for svf calc
#define DIST(r,c) vfp->svf( PRE(r,c), y_stride, SP(c),SP(r), z,b->src_stride,&sse) // returns subpixel variance error function.
diff --git a/vp8/encoder/temporal_filter.c b/vp8/encoder/temporal_filter.c
index 20bdf1789..b82ea47cb 100644
--- a/vp8/encoder/temporal_filter.c
+++ b/vp8/encoder/temporal_filter.c
@@ -134,7 +134,6 @@ void vp8_temporal_filter_apply_c
}
#if ALT_REF_MC_ENABLED
-static int dummy_cost[2*mv_max+1];
static int vp8_temporal_filter_find_matching_mb_c
(
@@ -156,9 +155,6 @@ static int vp8_temporal_filter_find_matching_mb_c
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] };
-
// Save input state
unsigned char **base_src = b->base_src;
int src = b->src;
@@ -196,12 +192,11 @@ static int vp8_temporal_filter_find_matching_mb_c
/*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_full, &d->bmi.mv,
- step_param,
- sadpb,
- &cpi->fn_ptr[BLOCK_16X16],
- mvsadcost, mvcost, &best_ref_mv1);
+ // Ignore mv costing by sending NULL cost arrays
+ bestsme = vp8_hex_search(x, b, d, &best_ref_mv1_full, &d->bmi.mv,
+ step_param, sadpb,
+ &cpi->fn_ptr[BLOCK_16X16],
+ NULL, NULL, &best_ref_mv1);
#if ALT_REF_SUBPEL_ENABLED
// Try sub-pixel MC?
@@ -209,10 +204,13 @@ static int vp8_temporal_filter_find_matching_mb_c
{
int distortion;
unsigned int sse;
+ // Ignore mv costing by sending NULL cost array
bestsme = cpi->find_fractional_mv_step(x, b, d,
- &d->bmi.mv, &best_ref_mv1,
- x->errorperbit, &cpi->fn_ptr[BLOCK_16X16],
- mvcost, &distortion, &sse);
+ &d->bmi.mv,
+ &best_ref_mv1,
+ x->errorperbit,
+ &cpi->fn_ptr[BLOCK_16X16],
+ NULL, &distortion, &sse);
}
#endif
@@ -304,12 +302,11 @@ static void vp8_temporal_filter_iterate_c
// Find best match in this frame by MC
err = vp8_temporal_filter_find_matching_mb_c
- (cpi,
- cpi->frames[alt_ref_index],
- cpi->frames[frame],
- mb_y_offset,
- THRESH_LOW);
-
+ (cpi,
+ cpi->frames[alt_ref_index],
+ cpi->frames[frame],
+ mb_y_offset,
+ THRESH_LOW);
#endif
// Assign higher weight to matching MB if it's error
// score is lower. If not applying MC default behavior