ref: ca28740570a9becaacead42aaeb4e1e126f17955
parent: 2640f25072884abb363a011268e411e46e652da5
author: Jerome Jiang <jianj@google.com>
date: Wed Feb 21 10:28:54 EST 2018
VP8: Fix out of range index for mvcost. Clamp index between 0 and MVvals. Bit exact for speed -8, -6 and -4 on RTC set. BUG=b/72510002 Change-Id: I61bdb02a0924e157b3c1980f74fbbfe5ce51bc44
--- a/vp8/encoder/mcomp.c
+++ b/vp8/encoder/mcomp.c
@@ -34,10 +34,11 @@
* NEAREST for subsequent blocks. The "Weight" parameter allows, to a
* limited extent, for some account to be taken of these factors.
*/
- return ((mvcost[0][(mv->as_mv.row - ref->as_mv.row) >> 1] +
- mvcost[1][(mv->as_mv.col - ref->as_mv.col) >> 1]) *
- Weight) >>
- 7;
+ const int mv_idx_row =
+ clamp((mv->as_mv.row - ref->as_mv.row) >> 1, 0, MVvals);
+ const int mv_idx_col =
+ clamp((mv->as_mv.col - ref->as_mv.col) >> 1, 0, MVvals);
+ return ((mvcost[0][mv_idx_row] + mvcost[1][mv_idx_col]) * Weight) >> 7;
}
static int mv_err_cost(int_mv *mv, int_mv *ref, int *mvcost[2],
@@ -44,9 +45,11 @@
int error_per_bit) {
/* 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 +
+ const int mv_idx_row =
+ clamp((mv->as_mv.row - ref->as_mv.row) >> 1, 0, MVvals);
+ const int mv_idx_col =
+ clamp((mv->as_mv.col - ref->as_mv.col) >> 1, 0, MVvals);
+ return ((mvcost[0][mv_idx_row] + mvcost[1][mv_idx_col]) * error_per_bit +
128) >>
8;
}