Index: source/libvpx/vp9/encoder/vp9_temporal_filter.c |
=================================================================== |
--- source/libvpx/vp9/encoder/vp9_temporal_filter.c (revision 292072) |
+++ source/libvpx/vp9/encoder/vp9_temporal_filter.c (working copy) |
@@ -44,7 +44,7 @@ |
const int which_mv = 0; |
const MV mv = { mv_row, mv_col }; |
const InterpKernel *const kernel = |
- vp9_get_interp_kernel(xd->mi[0]->mbmi.interp_filter); |
+ vp9_get_interp_kernel(xd->mi[0].src_mi->mbmi.interp_filter); |
enum mv_precision mv_precision_uv; |
int uv_stride; |
@@ -149,7 +149,7 @@ |
MV best_ref_mv1 = {0, 0}; |
MV best_ref_mv1_full; /* full-pixel value of best_ref_mv1 */ |
- MV *ref_mv = &x->e_mbd.mi[0]->bmi[0].as_mv[0].as_mv; |
+ MV *ref_mv = &x->e_mbd.mi[0].src_mi->bmi[0].as_mv[0].as_mv; |
// Save input state |
struct buf_2d src = x->plane[0].src; |
@@ -200,8 +200,8 @@ |
int frame; |
int mb_col, mb_row; |
unsigned int filter_weight; |
- int mb_cols = cpi->common.mb_cols; |
- int mb_rows = cpi->common.mb_rows; |
+ int mb_cols = (frames[alt_ref_index]->y_crop_width + 15) >> 4; |
+ int mb_rows = (frames[alt_ref_index]->y_crop_height + 15) >> 4; |
int mb_y_offset = 0; |
int mb_uv_offset = 0; |
DECLARE_ALIGNED_ARRAY(16, unsigned int, accumulator, 16 * 16 * 3); |
@@ -233,7 +233,7 @@ |
// To keep the mv in play for both Y and UV planes the max that it |
// can be on a border is therefore 16 - (2*VP9_INTERP_EXTEND+1). |
cpi->mb.mv_row_min = -((mb_row * 16) + (17 - 2 * VP9_INTERP_EXTEND)); |
- cpi->mb.mv_row_max = ((cpi->common.mb_rows - 1 - mb_row) * 16) |
+ cpi->mb.mv_row_max = ((mb_rows - 1 - mb_row) * 16) |
+ (17 - 2 * VP9_INTERP_EXTEND); |
for (mb_col = 0; mb_col < mb_cols; mb_col++) { |
@@ -244,7 +244,7 @@ |
vpx_memset(count, 0, 16 * 16 * 3 * sizeof(count[0])); |
cpi->mb.mv_col_min = -((mb_col * 16) + (17 - 2 * VP9_INTERP_EXTEND)); |
- cpi->mb.mv_col_max = ((cpi->common.mb_cols - 1 - mb_col) * 16) |
+ cpi->mb.mv_col_max = ((mb_cols - 1 - mb_col) * 16) |
+ (17 - 2 * VP9_INTERP_EXTEND); |
for (frame = 0; frame < frame_count; frame++) { |
@@ -254,8 +254,8 @@ |
if (frames[frame] == NULL) |
continue; |
- mbd->mi[0]->bmi[0].as_mv[0].as_mv.row = 0; |
- mbd->mi[0]->bmi[0].as_mv[0].as_mv.col = 0; |
+ mbd->mi[0].src_mi->bmi[0].as_mv[0].as_mv.row = 0; |
+ mbd->mi[0].src_mi->bmi[0].as_mv[0].as_mv.col = 0; |
if (frame == alt_ref_index) { |
filter_weight = 2; |
@@ -281,8 +281,8 @@ |
frames[frame]->v_buffer + mb_uv_offset, |
frames[frame]->y_stride, |
mb_uv_width, mb_uv_height, |
- mbd->mi[0]->bmi[0].as_mv[0].as_mv.row, |
- mbd->mi[0]->bmi[0].as_mv[0].as_mv.col, |
+ mbd->mi[0].src_mi->bmi[0].as_mv[0].as_mv.row, |
+ mbd->mi[0].src_mi->bmi[0].as_mv[0].as_mv.col, |
predictor, scale, |
mb_col * 16, mb_row * 16); |
@@ -389,10 +389,10 @@ |
// Adjust the strength based on active max q. |
if (cpi->common.current_video_frame > 1) |
q = ((int)vp9_convert_qindex_to_q( |
- cpi->rc.avg_frame_qindex[INTER_FRAME])); |
+ cpi->rc.avg_frame_qindex[INTER_FRAME], cpi->common.bit_depth)); |
else |
q = ((int)vp9_convert_qindex_to_q( |
- cpi->rc.avg_frame_qindex[KEY_FRAME])); |
+ cpi->rc.avg_frame_qindex[KEY_FRAME], cpi->common.bit_depth)); |
if (q > 16) { |
strength = oxcf->arnr_strength; |
} else { |
@@ -454,12 +454,20 @@ |
// In spatial svc the scaling factors might be less then 1/2. So we will use |
// non-normative scaling. |
int frame_used = 0; |
+#if CONFIG_VP9_HIGHBITDEPTH |
vp9_setup_scale_factors_for_frame(&sf, |
get_frame_new_buffer(cm)->y_crop_width, |
get_frame_new_buffer(cm)->y_crop_height, |
get_frame_new_buffer(cm)->y_crop_width, |
+ get_frame_new_buffer(cm)->y_crop_height, |
+ cm->use_highbitdepth); |
+#else |
+ vp9_setup_scale_factors_for_frame(&sf, |
+ get_frame_new_buffer(cm)->y_crop_width, |
+ get_frame_new_buffer(cm)->y_crop_height, |
+ get_frame_new_buffer(cm)->y_crop_width, |
get_frame_new_buffer(cm)->y_crop_height); |
- |
+#endif |
for (frame = 0; frame < frames_to_blur; ++frame) { |
if (cm->mi_cols * MI_SIZE != frames[frame]->y_width || |
cm->mi_rows * MI_SIZE != frames[frame]->y_height) { |
@@ -480,10 +488,21 @@ |
} |
} |
} else { |
+ // ARF is produced at the native frame size and resized when coded. |
+#if CONFIG_VP9_HIGHBITDEPTH |
vp9_setup_scale_factors_for_frame(&sf, |
- get_frame_new_buffer(cm)->y_crop_width, |
- get_frame_new_buffer(cm)->y_crop_height, |
- cm->width, cm->height); |
+ frames[0]->y_crop_width, |
+ frames[0]->y_crop_height, |
+ frames[0]->y_crop_width, |
+ frames[0]->y_crop_height, |
+ cm->use_highbitdepth); |
+#else |
+ vp9_setup_scale_factors_for_frame(&sf, |
+ frames[0]->y_crop_width, |
+ frames[0]->y_crop_height, |
+ frames[0]->y_crop_width, |
+ frames[0]->y_crop_height); |
+#endif |
} |
temporal_filter_iterate_c(cpi, frames, frames_to_blur, |