Use full 32-pixel edge for superblock bestrefmv motion vector ordering.
Change-Id: I417e39867c020a17d85370972446a8ce2bbe9a6d
This commit is contained in:
Родитель
722972454c
Коммит
c79ae1713c
|
@ -42,23 +42,39 @@ vp9_prob *vp9_mv_ref_probs(VP9_COMMON *pc,
|
|||
}
|
||||
|
||||
#define SP(x) (((x) & 7) << 1)
|
||||
unsigned int vp9_sad3x16_c(
|
||||
const unsigned char *src_ptr,
|
||||
int src_stride,
|
||||
const unsigned char *ref_ptr,
|
||||
int ref_stride,
|
||||
int max_sad) {
|
||||
unsigned int vp9_sad3x16_c(const unsigned char *src_ptr,
|
||||
int src_stride,
|
||||
const unsigned char *ref_ptr,
|
||||
int ref_stride,
|
||||
int max_sad) {
|
||||
return sad_mx_n_c(src_ptr, src_stride, ref_ptr, ref_stride, 3, 16);
|
||||
}
|
||||
unsigned int vp9_sad16x3_c(
|
||||
const unsigned char *src_ptr,
|
||||
int src_stride,
|
||||
const unsigned char *ref_ptr,
|
||||
int ref_stride,
|
||||
int max_sad) {
|
||||
unsigned int vp9_sad16x3_c(const unsigned char *src_ptr,
|
||||
int src_stride,
|
||||
const unsigned char *ref_ptr,
|
||||
int ref_stride,
|
||||
int max_sad) {
|
||||
return sad_mx_n_c(src_ptr, src_stride, ref_ptr, ref_stride, 16, 3);
|
||||
}
|
||||
|
||||
#if CONFIG_SUPERBLOCKS
|
||||
unsigned int vp9_sad3x32_c(const unsigned char *src_ptr,
|
||||
int src_stride,
|
||||
const unsigned char *ref_ptr,
|
||||
int ref_stride,
|
||||
int max_sad) {
|
||||
return sad_mx_n_c(src_ptr, src_stride, ref_ptr, ref_stride, 3, 32);
|
||||
}
|
||||
|
||||
unsigned int vp9_sad32x3_c(const unsigned char *src_ptr,
|
||||
int src_stride,
|
||||
const unsigned char *ref_ptr,
|
||||
int ref_stride,
|
||||
int max_sad) {
|
||||
return sad_mx_n_c(src_ptr, src_stride, ref_ptr, ref_stride, 32, 3);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if CONFIG_SUBPELREFMV
|
||||
unsigned int vp9_variance2x16_c(const unsigned char *src_ptr,
|
||||
const int source_stride,
|
||||
|
@ -93,7 +109,7 @@ unsigned int vp9_sub_pixel_variance16x2_c(const unsigned char *src_ptr,
|
|||
const unsigned char *dst_ptr,
|
||||
const int dst_pixels_per_line,
|
||||
unsigned int *sse) {
|
||||
unsigned short FData3[16 * 3]; // Temp data bufffer used in filtering
|
||||
unsigned short FData3[16 * 3]; // Temp data buffer used in filtering
|
||||
unsigned char temp2[20 * 16];
|
||||
const short *HFilter, *VFilter;
|
||||
|
||||
|
@ -114,7 +130,7 @@ unsigned int vp9_sub_pixel_variance2x16_c(const unsigned char *src_ptr,
|
|||
const unsigned char *dst_ptr,
|
||||
const int dst_pixels_per_line,
|
||||
unsigned int *sse) {
|
||||
unsigned short FData3[2 * 17]; // Temp data bufffer used in filtering
|
||||
unsigned short FData3[2 * 17]; // Temp data buffer used in filtering
|
||||
unsigned char temp2[2 * 16];
|
||||
const short *HFilter, *VFilter;
|
||||
|
||||
|
@ -127,6 +143,76 @@ unsigned int vp9_sub_pixel_variance2x16_c(const unsigned char *src_ptr,
|
|||
|
||||
return vp9_variance2x16_c(temp2, 2, dst_ptr, dst_pixels_per_line, sse);
|
||||
}
|
||||
|
||||
#if CONFIG_SUPERBLOCKS
|
||||
unsigned int vp9_variance2x32_c(const unsigned char *src_ptr,
|
||||
const int source_stride,
|
||||
const unsigned char *ref_ptr,
|
||||
const int recon_stride,
|
||||
unsigned int *sse) {
|
||||
unsigned int var;
|
||||
int avg;
|
||||
|
||||
variance(src_ptr, source_stride, ref_ptr, recon_stride, 2, 32, &var, &avg);
|
||||
*sse = var;
|
||||
return (var - (((unsigned int)avg * avg) >> 5));
|
||||
}
|
||||
|
||||
unsigned int vp9_variance32x2_c(const unsigned char *src_ptr,
|
||||
const int source_stride,
|
||||
const unsigned char *ref_ptr,
|
||||
const int recon_stride,
|
||||
unsigned int *sse) {
|
||||
unsigned int var;
|
||||
int avg;
|
||||
|
||||
variance(src_ptr, source_stride, ref_ptr, recon_stride, 32, 2, &var, &avg);
|
||||
*sse = var;
|
||||
return (var - (((unsigned int)avg * avg) >> 5));
|
||||
}
|
||||
|
||||
unsigned int vp9_sub_pixel_variance32x2_c(const unsigned char *src_ptr,
|
||||
const int src_pixels_per_line,
|
||||
const int xoffset,
|
||||
const int yoffset,
|
||||
const unsigned char *dst_ptr,
|
||||
const int dst_pixels_per_line,
|
||||
unsigned int *sse) {
|
||||
unsigned short FData3[32 * 3]; // Temp data buffer used in filtering
|
||||
unsigned char temp2[20 * 32];
|
||||
const short *HFilter, *VFilter;
|
||||
|
||||
HFilter = vp9_bilinear_filters[xoffset];
|
||||
VFilter = vp9_bilinear_filters[yoffset];
|
||||
|
||||
var_filter_block2d_bil_first_pass(src_ptr, FData3,
|
||||
src_pixels_per_line, 1, 3, 32, HFilter);
|
||||
var_filter_block2d_bil_second_pass(FData3, temp2, 32, 32, 2, 32, VFilter);
|
||||
|
||||
return vp9_variance16x2_c(temp2, 32, dst_ptr, dst_pixels_per_line, sse);
|
||||
}
|
||||
|
||||
unsigned int vp9_sub_pixel_variance2x16_c(const unsigned char *src_ptr,
|
||||
const int src_pixels_per_line,
|
||||
const int xoffset,
|
||||
const int yoffset,
|
||||
const unsigned char *dst_ptr,
|
||||
const int dst_pixels_per_line,
|
||||
unsigned int *sse) {
|
||||
unsigned short FData3[2 * 33]; // Temp data buffer used in filtering
|
||||
unsigned char temp2[2 * 32];
|
||||
const short *HFilter, *VFilter;
|
||||
|
||||
HFilter = vp9_bilinear_filters[xoffset];
|
||||
VFilter = vp9_bilinear_filters[yoffset];
|
||||
|
||||
var_filter_block2d_bil_first_pass(src_ptr, FData3,
|
||||
src_pixels_per_line, 1, 33, 2, HFilter);
|
||||
var_filter_block2d_bil_second_pass(FData3, temp2, 2, 2, 32, 2, VFilter);
|
||||
|
||||
return vp9_variance2x16_c(temp2, 2, dst_ptr, dst_pixels_per_line, sse);
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* check a list of motion vectors by sad score using a number rows of pixels
|
||||
|
@ -194,15 +280,39 @@ void vp9_find_best_ref_mvs(MACROBLOCKD *xd,
|
|||
offset = ref_y_stride * row_offset + col_offset;
|
||||
score = 0;
|
||||
if (xd->up_available) {
|
||||
vp9_sub_pixel_variance16x2_c(above_ref + offset, ref_y_stride,
|
||||
SP(this_mv.as_mv.col), SP(this_mv.as_mv.row),
|
||||
above_src, xd->dst.y_stride, &sse);
|
||||
#if CONFIG_SUPERBLOCKS
|
||||
if (xd->mode_info_context->mbmi.encoded_as_sb) {
|
||||
vp9_sub_pixel_variance32x2_c(above_ref + offset, ref_y_stride,
|
||||
SP(this_mv.as_mv.col),
|
||||
SP(this_mv.as_mv.row),
|
||||
above_src, xd->dst.y_stride, &sse);
|
||||
} else {
|
||||
#endif
|
||||
vp9_sub_pixel_variance16x2_c(above_ref + offset, ref_y_stride,
|
||||
SP(this_mv.as_mv.col),
|
||||
SP(this_mv.as_mv.row),
|
||||
above_src, xd->dst.y_stride, &sse);
|
||||
#if CONFIG_SUPERBLOCKS
|
||||
}
|
||||
#endif
|
||||
score += sse;
|
||||
}
|
||||
if (xd->left_available) {
|
||||
vp9_sub_pixel_variance2x16_c(left_ref + offset, ref_y_stride,
|
||||
SP(this_mv.as_mv.col), SP(this_mv.as_mv.row),
|
||||
left_src, xd->dst.y_stride, &sse);
|
||||
#if CONFIG_SUPERBLOCKS
|
||||
if (xd->mode_info_context->mbmi.encoded_as_sb) {
|
||||
vp9_sub_pixel_variance2x32_c(left_ref + offset, ref_y_stride,
|
||||
SP(this_mv.as_mv.col),
|
||||
SP(this_mv.as_mv.row),
|
||||
left_src, xd->dst.y_stride, &sse);
|
||||
} else {
|
||||
#endif
|
||||
vp9_sub_pixel_variance2x16_c(left_ref + offset, ref_y_stride,
|
||||
SP(this_mv.as_mv.col),
|
||||
SP(this_mv.as_mv.row),
|
||||
left_src, xd->dst.y_stride, &sse);
|
||||
#if CONFIG_SUPERBLOCKS
|
||||
}
|
||||
#endif
|
||||
score += sse;
|
||||
}
|
||||
#else
|
||||
|
@ -213,12 +323,30 @@ void vp9_find_best_ref_mvs(MACROBLOCKD *xd,
|
|||
offset = ref_y_stride * row_offset + col_offset;
|
||||
score = 0;
|
||||
if (xd->up_available) {
|
||||
score += vp9_sad16x3(above_src, xd->dst.y_stride,
|
||||
above_ref + offset, ref_y_stride, INT_MAX);
|
||||
#if CONFIG_SUPERBLOCKS
|
||||
if (xd->mode_info_context->mbmi.encoded_as_sb) {
|
||||
score += vp9_sad32x3(above_src, xd->dst.y_stride,
|
||||
above_ref + offset, ref_y_stride, INT_MAX);
|
||||
} else {
|
||||
#endif
|
||||
score += vp9_sad16x3(above_src, xd->dst.y_stride,
|
||||
above_ref + offset, ref_y_stride, INT_MAX);
|
||||
#if CONFIG_SUPERBLOCKS
|
||||
}
|
||||
#endif
|
||||
}
|
||||
if (xd->left_available) {
|
||||
score += vp9_sad3x16(left_src, xd->dst.y_stride,
|
||||
left_ref + offset, ref_y_stride, INT_MAX);
|
||||
#if CONFIG_SUPERBLOCKS
|
||||
if (xd->mode_info_context->mbmi.encoded_as_sb) {
|
||||
score += vp9_sad3x32(left_src, xd->dst.y_stride,
|
||||
left_ref + offset, ref_y_stride, INT_MAX);
|
||||
} else {
|
||||
#endif
|
||||
score += vp9_sad3x16(left_src, xd->dst.y_stride,
|
||||
left_ref + offset, ref_y_stride, INT_MAX);
|
||||
#if CONFIG_SUPERBLOCKS
|
||||
}
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
// Add the entry to our list and then resort the list on score.
|
||||
|
|
|
@ -233,6 +233,16 @@ specialize vp9_sad16x3 sse2
|
|||
prototype unsigned int vp9_sad3x16 "const unsigned char *src_ptr, int src_stride, const unsigned char *ref_ptr, int ref_stride, int max_sad"
|
||||
specialize vp9_sad3x16 sse2
|
||||
|
||||
if [ "$CONFIG_SUPERBLOCKS" = "yes" ]; then
|
||||
|
||||
prototype unsigned int vp9_sad32x3 "const unsigned char *src_ptr, int src_stride, const unsigned char *ref_ptr, int ref_stride, int max_sad"
|
||||
specialize vp9_sad32x3
|
||||
|
||||
prototype unsigned int vp9_sad3x32 "const unsigned char *src_ptr, int src_stride, const unsigned char *ref_ptr, int ref_stride, int max_sad"
|
||||
specialize vp9_sad3x32
|
||||
|
||||
fi
|
||||
|
||||
#
|
||||
# Encoder functions below this point.
|
||||
#
|
||||
|
|
Загрузка…
Ссылка в новой задаче