Limit mv search range for first pass and mbgraph
Both first pass and mbgraph search use block size 16x16 for motion estimation. This commit put a limit of motion vector range. The effective range allows the entire 16x16 with required subpel interpolation input to be completely outside image border, but not any further away from image border. Change-Id: Id70a5ed08be49e70959f064859d72adc7d775d08
This commit is contained in:
Родитель
b1c58f57a7
Коммит
35c5d79e6b
|
@ -534,10 +534,11 @@ void vp9_first_pass(VP9_COMP *cpi) {
|
|||
recon_yoffset = (mb_row * recon_y_stride * 16);
|
||||
recon_uvoffset = (mb_row * recon_uv_stride * 8);
|
||||
|
||||
// Set up limit values for motion vectors to prevent them extending outside the UMV borders
|
||||
x->mv_row_min = -((mb_row * 16) + (VP9BORDERINPIXELS - 8));
|
||||
// Set up limit values for motion vectors to prevent them extending
|
||||
// outside the UMV borders
|
||||
x->mv_row_min = -((mb_row * 16) + BORDER_MV_PIXELS_B16);
|
||||
x->mv_row_max = ((cm->mb_rows - 1 - mb_row) * 16)
|
||||
+ (VP9BORDERINPIXELS - 8);
|
||||
+ BORDER_MV_PIXELS_B16;
|
||||
|
||||
// for each macroblock col in image
|
||||
for (mb_col = 0; mb_col < cm->mb_cols; mb_col++) {
|
||||
|
@ -583,9 +584,9 @@ void vp9_first_pass(VP9_COMP *cpi) {
|
|||
intra_error += (int64_t)this_error;
|
||||
|
||||
// Set up limit values for motion vectors to prevent them extending outside the UMV borders
|
||||
x->mv_col_min = -((mb_col * 16) + (VP9BORDERINPIXELS - 8));
|
||||
x->mv_col_min = -((mb_col * 16) + BORDER_MV_PIXELS_B16);
|
||||
x->mv_col_max = ((cm->mb_cols - 1 - mb_col) * 16)
|
||||
+ (VP9BORDERINPIXELS - 8);
|
||||
+ BORDER_MV_PIXELS_B16;
|
||||
|
||||
// Other than for the first frame do a motion search
|
||||
if (cm->current_video_frame > 0) {
|
||||
|
|
|
@ -10,14 +10,17 @@
|
|||
|
||||
#include <limits.h>
|
||||
|
||||
#include <vpx_mem/vpx_mem.h>
|
||||
#include <vp9/encoder/vp9_encodeintra.h>
|
||||
#include <vp9/encoder/vp9_rdopt.h>
|
||||
#include <vp9/common/vp9_blockd.h>
|
||||
#include <vp9/common/vp9_reconinter.h>
|
||||
#include <vp9/common/vp9_reconintra.h>
|
||||
#include <vp9/common/vp9_systemdependent.h>
|
||||
#include <vp9/encoder/vp9_segmentation.h>
|
||||
#include "vpx_mem/vpx_mem.h"
|
||||
#include "vp9/encoder/vp9_encodeintra.h"
|
||||
#include "vp9/encoder/vp9_rdopt.h"
|
||||
#include "vp9/encoder/vp9_segmentation.h"
|
||||
#include "vp9/encoder/vp9_mcomp.h"
|
||||
#include "vp9/common/vp9_blockd.h"
|
||||
#include "vp9/common/vp9_reconinter.h"
|
||||
#include "vp9/common/vp9_reconintra.h"
|
||||
#include "vp9/common/vp9_systemdependent.h"
|
||||
|
||||
|
||||
|
||||
static unsigned int do_16x16_motion_iteration(VP9_COMP *cpi,
|
||||
int_mv *ref_mv,
|
||||
|
@ -246,9 +249,8 @@ static void update_mbgraph_frame_stats(VP9_COMP *cpi,
|
|||
// Set up limit values for motion vectors to prevent them extending outside the UMV borders
|
||||
arf_top_mv.as_int = 0;
|
||||
gld_top_mv.as_int = 0;
|
||||
x->mv_row_min = -(VP9BORDERINPIXELS - 8 - VP9_INTERP_EXTEND);
|
||||
x->mv_row_max = (cm->mb_rows - 1) * 8 + VP9BORDERINPIXELS
|
||||
- 8 - VP9_INTERP_EXTEND;
|
||||
x->mv_row_min = -BORDER_MV_PIXELS_B16;
|
||||
x->mv_row_max = (cm->mb_rows - 1) * 8 + BORDER_MV_PIXELS_B16;
|
||||
xd->up_available = 0;
|
||||
xd->plane[0].dst.stride = buf->y_stride;
|
||||
xd->plane[0].pre[0].stride = buf->y_stride;
|
||||
|
@ -267,9 +269,8 @@ static void update_mbgraph_frame_stats(VP9_COMP *cpi,
|
|||
// Set up limit values for motion vectors to prevent them extending outside the UMV borders
|
||||
arf_left_mv.as_int = arf_top_mv.as_int;
|
||||
gld_left_mv.as_int = gld_top_mv.as_int;
|
||||
x->mv_col_min = -(VP9BORDERINPIXELS - 8 - VP9_INTERP_EXTEND);
|
||||
x->mv_col_max = (cm->mb_cols - 1) * 8 + VP9BORDERINPIXELS
|
||||
- 8 - VP9_INTERP_EXTEND;
|
||||
x->mv_col_min = -BORDER_MV_PIXELS_B16;
|
||||
x->mv_col_max = (cm->mb_cols - 1) * 8 + BORDER_MV_PIXELS_B16;
|
||||
xd->left_available = 0;
|
||||
|
||||
for (mb_col = 0; mb_col < cm->mb_cols; mb_col++) {
|
||||
|
|
|
@ -22,6 +22,10 @@
|
|||
#define MAX_FULL_PEL_VAL ((1 << (MAX_MVSEARCH_STEPS)) - 1)
|
||||
// Maximum size of the first step in full pel units
|
||||
#define MAX_FIRST_STEP (1 << (MAX_MVSEARCH_STEPS-1))
|
||||
// Allowed motion vector pixel distance outside image border
|
||||
// for Block_16x16
|
||||
#define BORDER_MV_PIXELS_B16 (16 + VP9_INTERP_EXTEND)
|
||||
|
||||
|
||||
void vp9_clamp_mv_min_max(MACROBLOCK *x, MV *mv);
|
||||
int vp9_mv_bit_cost(const MV *mv, const MV *ref,
|
||||
|
|
Загрузка…
Ссылка в новой задаче