diff --git a/vp9/encoder/vp9_encodeframe.c b/vp9/encoder/vp9_encodeframe.c index 3dbd251896a6f185d97108f023d2e5e4929cfe18..7c82b205c1c15b21ae6b478021cbb155602cf048 100644 --- a/vp9/encoder/vp9_encodeframe.c +++ b/vp9/encoder/vp9_encodeframe.c @@ -2091,10 +2091,10 @@ static void rd_pick_partition(VP9_COMP *cpi, const TileInfo *const tile, for (r = mb_row; r < mb_row_end; r++) { for (c = mb_col; c < mb_col_end; c++) { const int mb_index = r * cm->mb_cols + c; - if ((cpi->twopass.this_frame_mb_stats[mb_index] & - FPMB_NONZERO_MOTION_MASK) || + if (!(cpi->twopass.this_frame_mb_stats[mb_index] & + FPMB_MOTION_ZERO_MASK) || !(cpi->twopass.this_frame_mb_stats[mb_index] & - FPMB_ERROR_LEVEL0_MASK)) { + FPMB_ERROR_SMALL_MASK)) { skip = 0; break; } diff --git a/vp9/encoder/vp9_firstpass.c b/vp9/encoder/vp9_firstpass.c index cf20e78db49a91f306da56f660213964d9ce55d4..0b5bce316d50f7b3f573ac9e6dfd3b7ae6d80587 100644 --- a/vp9/encoder/vp9_firstpass.c +++ b/vp9/encoder/vp9_firstpass.c @@ -689,18 +689,11 @@ void vp9_first_pass(VP9_COMP *cpi) { // intra predication statistics cpi->twopass.frame_mb_stats_buf[mb_index] = 0; cpi->twopass.frame_mb_stats_buf[mb_index] |= FPMB_DCINTRA_MASK; - cpi->twopass.frame_mb_stats_buf[mb_index] &= - ~FPMB_NONZERO_MOTION_MASK; - if (this_error > FPMB_ERROR_LEVEL4_TH) { - cpi->twopass.frame_mb_stats_buf[mb_index] |= FPMB_ERROR_LEVEL4_MASK; - } else if (this_error > FPMB_ERROR_LEVEL3_TH) { - cpi->twopass.frame_mb_stats_buf[mb_index] |= FPMB_ERROR_LEVEL3_MASK; - } else if (this_error > FPMB_ERROR_LEVEL2_TH) { - cpi->twopass.frame_mb_stats_buf[mb_index] |= FPMB_ERROR_LEVEL2_MASK; - } else if (this_error > FPMB_ERROR_LEVEL1_TH) { - cpi->twopass.frame_mb_stats_buf[mb_index] |= FPMB_ERROR_LEVEL1_MASK; - } else { - cpi->twopass.frame_mb_stats_buf[mb_index] |= FPMB_ERROR_LEVEL0_MASK; + cpi->twopass.frame_mb_stats_buf[mb_index] |= FPMB_MOTION_ZERO_MASK; + if (this_error > FPMB_ERROR_LARGE_TH) { + cpi->twopass.frame_mb_stats_buf[mb_index] |= FPMB_ERROR_LARGE_MASK; + } else if (this_error < FPMB_ERROR_SMALL_TH) { + cpi->twopass.frame_mb_stats_buf[mb_index] |= FPMB_ERROR_SMALL_MASK; } } #endif @@ -738,23 +731,13 @@ void vp9_first_pass(VP9_COMP *cpi) { // inter predication statistics cpi->twopass.frame_mb_stats_buf[mb_index] = 0; cpi->twopass.frame_mb_stats_buf[mb_index] &= ~FPMB_DCINTRA_MASK; - cpi->twopass.frame_mb_stats_buf[mb_index] &= - ~FPMB_NONZERO_MOTION_MASK; - if (this_error > FPMB_ERROR_LEVEL4_TH) { - cpi->twopass.frame_mb_stats_buf[mb_index] |= - FPMB_ERROR_LEVEL4_MASK; - } else if (this_error > FPMB_ERROR_LEVEL3_TH) { - cpi->twopass.frame_mb_stats_buf[mb_index] |= - FPMB_ERROR_LEVEL3_MASK; - } else if (this_error > FPMB_ERROR_LEVEL2_TH) { + cpi->twopass.frame_mb_stats_buf[mb_index] |= FPMB_MOTION_ZERO_MASK; + if (this_error > FPMB_ERROR_LARGE_TH) { cpi->twopass.frame_mb_stats_buf[mb_index] |= - FPMB_ERROR_LEVEL2_MASK; - } else if (this_error > FPMB_ERROR_LEVEL1_TH) { + FPMB_ERROR_LARGE_MASK; + } else if (this_error < FPMB_ERROR_SMALL_TH) { cpi->twopass.frame_mb_stats_buf[mb_index] |= - FPMB_ERROR_LEVEL1_MASK; - } else { - cpi->twopass.frame_mb_stats_buf[mb_index] |= - FPMB_ERROR_LEVEL0_MASK; + FPMB_ERROR_SMALL_MASK; } } #endif @@ -764,8 +747,28 @@ void vp9_first_pass(VP9_COMP *cpi) { #if CONFIG_FP_MB_STATS if (cpi->use_fp_mb_stats) { - cpi->twopass.frame_mb_stats_buf[mb_index] |= - FPMB_NONZERO_MOTION_MASK; + cpi->twopass.frame_mb_stats_buf[mb_index] &= + ~FPMB_MOTION_ZERO_MASK; + // check estimated motion direction + if (mv.as_mv.col > 0 && mv.as_mv.col >= abs(mv.as_mv.row)) { + // right direction + cpi->twopass.frame_mb_stats_buf[mb_index] |= + FPMB_MOTION_RIGHT_MASK; + } else if (mv.as_mv.row < 0 && + abs(mv.as_mv.row) >= abs(mv.as_mv.col)) { + // up direction + cpi->twopass.frame_mb_stats_buf[mb_index] |= + FPMB_MOTION_UP_MASK; + } else if (mv.as_mv.col < 0 && + abs(mv.as_mv.col) >= abs(mv.as_mv.row)) { + // left direction + cpi->twopass.frame_mb_stats_buf[mb_index] |= + FPMB_MOTION_LEFT_MASK; + } else { + // down direction + cpi->twopass.frame_mb_stats_buf[mb_index] |= + FPMB_MOTION_DOWN_MASK; + } } #endif diff --git a/vp9/encoder/vp9_firstpass.h b/vp9/encoder/vp9_firstpass.h index e898abc161d63c3c8237b9ba99cecbc9b2ca5c8b..bf8c9fd96a081aeb3e6d65058919238ce1efc9ce 100644 --- a/vp9/encoder/vp9_firstpass.h +++ b/vp9/encoder/vp9_firstpass.h @@ -21,17 +21,17 @@ extern "C" { #if CONFIG_FP_MB_STATS #define FPMB_DCINTRA_MASK 0x01 -#define FPMB_NONZERO_MOTION_MASK 0x02 -#define FPMB_ERROR_LEVEL0_MASK 0x04 -#define FPMB_ERROR_LEVEL1_MASK 0x10 -#define FPMB_ERROR_LEVEL2_MASK 0x20 -#define FPMB_ERROR_LEVEL3_MASK 0x40 -#define FPMB_ERROR_LEVEL4_MASK 0x80 - -#define FPMB_ERROR_LEVEL1_TH 2000 -#define FPMB_ERROR_LEVEL2_TH 8000 -#define FPMB_ERROR_LEVEL3_TH 24000 -#define FPMB_ERROR_LEVEL4_TH 48000 + +#define FPMB_MOTION_ZERO_MASK 0x02 +#define FPMB_MOTION_LEFT_MASK 0x04 +#define FPMB_MOTION_RIGHT_MASK 0x08 +#define FPMB_MOTION_UP_MASK 0x10 +#define FPMB_MOTION_DOWN_MASK 0x20 + +#define FPMB_ERROR_SMALL_MASK 0x40 +#define FPMB_ERROR_LARGE_MASK 0x80 +#define FPMB_ERROR_SMALL_TH 2000 +#define FPMB_ERROR_LARGE_TH 48000 typedef struct { uint8_t *mb_stats_start;