diff options
author | Dmitry Kovalev <dkovalev@google.com> | 2013-08-21 11:24:47 -0700 |
---|---|---|
committer | Dmitry Kovalev <dkovalev@google.com> | 2013-08-21 11:24:47 -0700 |
commit | a3ae4c87fdc2eb7723ce6ab54c2fcd9b5f4e3915 (patch) | |
tree | d959cb52f0277f0d87f83396d0ee2ed4492dddca | |
parent | ce28d0ca89832c36c56f22873732582edf9ce9a0 (diff) | |
download | libvpx-a3ae4c87fdc2eb7723ce6ab54c2fcd9b5f4e3915.tar libvpx-a3ae4c87fdc2eb7723ce6ab54c2fcd9b5f4e3915.tar.gz libvpx-a3ae4c87fdc2eb7723ce6ab54c2fcd9b5f4e3915.tar.bz2 libvpx-a3ae4c87fdc2eb7723ce6ab54c2fcd9b5f4e3915.zip |
Adding scale factor check.
We support only [1/16, 2] scale factors, enforcing this now.
Change-Id: I0822eb7cea51720df6814e42d3f35ff340963061
-rw-r--r-- | vp9/common/vp9_reconinter.c | 2 | ||||
-rw-r--r-- | vp9/common/vp9_scale.c | 17 | ||||
-rw-r--r-- | vp9/common/vp9_scale.h | 5 | ||||
-rw-r--r-- | vp9/encoder/vp9_temporal_filter.c | 2 |
4 files changed, 22 insertions, 4 deletions
diff --git a/vp9/common/vp9_reconinter.c b/vp9/common/vp9_reconinter.c index 9a1f5fc07..3c2b2cdf6 100644 --- a/vp9/common/vp9_reconinter.c +++ b/vp9/common/vp9_reconinter.c @@ -210,7 +210,7 @@ void vp9_setup_scale_factors(VP9_COMMON *cm, int i) { vp9_zero(*sf); } else { YV12_BUFFER_CONFIG *const fb = &cm->yv12_fb[ref]; - vp9_setup_scale_factors_for_frame(sf, + vp9_setup_scale_factors_for_frame(cm, sf, fb->y_crop_width, fb->y_crop_height, cm->width, cm->height); diff --git a/vp9/common/vp9_scale.c b/vp9/common/vp9_scale.c index 3f28d2811..12acac1c9 100644 --- a/vp9/common/vp9_scale.c +++ b/vp9/common/vp9_scale.c @@ -10,6 +10,7 @@ #include "./vp9_rtcd.h" #include "vp9/common/vp9_filter.h" +#include "vp9/common/vp9_onyxc_int.h" #include "vp9/common/vp9_scale.h" static INLINE int scaled_x(int val, const struct scale_factors *scale) { @@ -61,9 +62,23 @@ static int get_fixed_point_scale_factor(int other_size, int this_size) { return (other_size << VP9_REF_SCALE_SHIFT) / this_size; } -void vp9_setup_scale_factors_for_frame(struct scale_factors *scale, +static int check_scale_factors(int other_w, int other_h, + int this_w, int this_h) { + return 2 * this_w >= other_w && + 2 * this_h >= other_h && + this_w <= 16 * other_w && + this_h <= 16 * other_h; +} + +void vp9_setup_scale_factors_for_frame(struct VP9Common *cm, + struct scale_factors *scale, int other_w, int other_h, int this_w, int this_h) { + if (!check_scale_factors(other_w, other_h, this_w, this_h)) + vpx_internal_error(&cm->error, VPX_CODEC_UNSUP_BITSTREAM, + "Invalid scale factors"); + + scale->x_scale_fp = get_fixed_point_scale_factor(other_w, this_w); scale->x_offset_q4 = 0; // calculated per block scale->x_step_q4 = scaled_x(16, scale); diff --git a/vp9/common/vp9_scale.h b/vp9/common/vp9_scale.h index 0414dde5e..21a46dd2f 100644 --- a/vp9/common/vp9_scale.h +++ b/vp9/common/vp9_scale.h @@ -14,6 +14,8 @@ #include "vp9/common/vp9_mv.h" #include "vp9/common/vp9_convolve.h" +struct VP9Common; + #define VP9_REF_SCALE_SHIFT 14 #define VP9_REF_NO_SCALE (1 << VP9_REF_SCALE_SHIFT) @@ -33,7 +35,8 @@ struct scale_factors { convolve_fn_t predict[2][2][2]; // horiz, vert, avg }; -void vp9_setup_scale_factors_for_frame(struct scale_factors *scale, +void vp9_setup_scale_factors_for_frame(struct VP9Common *cm, + struct scale_factors *scale, int other_w, int other_h, int this_w, int this_h); diff --git a/vp9/encoder/vp9_temporal_filter.c b/vp9/encoder/vp9_temporal_filter.c index 3052e8f70..74fb07ee3 100644 --- a/vp9/encoder/vp9_temporal_filter.c +++ b/vp9/encoder/vp9_temporal_filter.c @@ -437,7 +437,7 @@ void vp9_temporal_filter_prepare(VP9_COMP *cpi, int distance) { #endif // Setup scaling factors. Scaling on each of the arnr frames is not supported - vp9_setup_scale_factors_for_frame(&cpi->mb.e_mbd.scale_factor[0], + vp9_setup_scale_factors_for_frame(cm, &cpi->mb.e_mbd.scale_factor[0], cm->yv12_fb[cm->new_fb_idx].y_crop_width, cm->yv12_fb[cm->new_fb_idx].y_crop_height, cm->width, cm->height); |