summaryrefslogtreecommitdiff
path: root/vp9/encoder
diff options
context:
space:
mode:
authorPengchong Jin <pengchong@google.com>2014-07-31 09:01:06 -0700
committerPengchong Jin <pengchong@google.com>2014-08-04 16:17:47 -0700
commit233e0ccc73eba5f52ddde366f7adae4cff55c3fd (patch)
tree5959da9f0733a757ba3ea7d09d7bb33f83d37966 /vp9/encoder
parenta3b062c56f237e1680e4fdae838842955fc7fdf6 (diff)
downloadlibvpx-233e0ccc73eba5f52ddde366f7adae4cff55c3fd.tar
libvpx-233e0ccc73eba5f52ddde366f7adae4cff55c3fd.tar.gz
libvpx-233e0ccc73eba5f52ddde366f7adae4cff55c3fd.tar.bz2
libvpx-233e0ccc73eba5f52ddde366f7adae4cff55c3fd.zip
Store first pass motion vector directions
Re-organize the one-byte structure for 16x16 first pass block. Add bits to indicate motion vector directions. Change-Id: Id10754ba343dfc712c7fed5bcc85c67fa0bbcb89
Diffstat (limited to 'vp9/encoder')
-rw-r--r--vp9/encoder/vp9_encodeframe.c6
-rw-r--r--vp9/encoder/vp9_firstpass.c61
-rw-r--r--vp9/encoder/vp9_firstpass.h22
3 files changed, 46 insertions, 43 deletions
diff --git a/vp9/encoder/vp9_encodeframe.c b/vp9/encoder/vp9_encodeframe.c
index 74eaae536..95e6dbeb7 100644
--- a/vp9/encoder/vp9_encodeframe.c
+++ b/vp9/encoder/vp9_encodeframe.c
@@ -2087,10 +2087,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 1b574758b..e21ce2354 100644
--- a/vp9/encoder/vp9_firstpass.c
+++ b/vp9/encoder/vp9_firstpass.c
@@ -709,18 +709,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
@@ -758,23 +751,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
@@ -784,8 +767,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 e898abc16..bf8c9fd96 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;