summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohann <johannkoenig@google.com>2014-07-16 02:30:21 -0700
committerJohann <johannkoenig@google.com>2014-07-24 15:30:13 -0700
commite956c00762d9a7955be15ff9ae892227cf3429b4 (patch)
treece9201cf5e3c64ed9441f6ee8d2410a172cfc50d
parent0cf0b02c4c9dd7dc1338a7514a1e47588d74e704 (diff)
downloadlibvpx-e956c00762d9a7955be15ff9ae892227cf3429b4.tar
libvpx-e956c00762d9a7955be15ff9ae892227cf3429b4.tar.gz
libvpx-e956c00762d9a7955be15ff9ae892227cf3429b4.tar.bz2
libvpx-e956c00762d9a7955be15ff9ae892227cf3429b4.zip
Set and use uv_crop_[width|height]
Ensure consistent border extension by rounding uv_crop_* at image creation time. Where it was rounded problems could arise with the right and bottom extensions. When padding = 32, y_width = 64, and y_crop_width = 63: (padding + width - crop_width + 1) / 2 32 + 64 - 63 + 1 should equal 32 *but* 32 + 1 + 1 equals 34 giving a right buffer of 17 instead of 16. By calculating uv_crop_* earlier we round up at the appropriate time and for the same values: (y_crop_width + 1) / 2 63 + 1 / 2 64 (padding / 2) + uv_width - uv_crop_width 16 + 16 - 16 16 Change-Id: If866cd1b63444771440edb1432280ac83875969b
-rw-r--r--vpx_scale/generic/yv12config.c2
-rw-r--r--vpx_scale/generic/yv12extend.c19
2 files changed, 13 insertions, 8 deletions
diff --git a/vpx_scale/generic/yv12config.c b/vpx_scale/generic/yv12config.c
index 675d905ae..827bce789 100644
--- a/vpx_scale/generic/yv12config.c
+++ b/vpx_scale/generic/yv12config.c
@@ -81,6 +81,8 @@ int vp8_yv12_realloc_frame_buffer(YV12_BUFFER_CONFIG *ybf,
ybf->y_height = aligned_height;
ybf->y_stride = y_stride;
+ ybf->uv_crop_width = (width + 1) / 2;
+ ybf->uv_crop_height = (height + 1) / 2;
ybf->uv_width = uv_width;
ybf->uv_height = uv_height;
ybf->uv_stride = uv_stride;
diff --git a/vpx_scale/generic/yv12extend.c b/vpx_scale/generic/yv12extend.c
index 614602a03..036a50537 100644
--- a/vpx_scale/generic/yv12extend.c
+++ b/vpx_scale/generic/yv12extend.c
@@ -56,6 +56,9 @@ static void extend_plane(uint8_t *const src, int src_stride,
}
void vp8_yv12_extend_frame_borders_c(YV12_BUFFER_CONFIG *ybf) {
+ const int uv_border = ybf->border / 2;
+
+ assert(ybf->border % 2 == 0);
assert(ybf->y_height - ybf->y_crop_height < 16);
assert(ybf->y_width - ybf->y_crop_width < 16);
assert(ybf->y_height - ybf->y_crop_height >= 0);
@@ -68,16 +71,16 @@ void vp8_yv12_extend_frame_borders_c(YV12_BUFFER_CONFIG *ybf) {
ybf->border + ybf->y_width - ybf->y_crop_width);
extend_plane(ybf->u_buffer, ybf->uv_stride,
- (ybf->y_crop_width + 1) / 2, (ybf->y_crop_height + 1) / 2,
- ybf->border / 2, ybf->border / 2,
- (ybf->border + ybf->y_height - ybf->y_crop_height + 1) / 2,
- (ybf->border + ybf->y_width - ybf->y_crop_width + 1) / 2);
+ ybf->uv_crop_width, ybf->uv_crop_height,
+ uv_border, uv_border,
+ uv_border + ybf->uv_height - ybf->uv_crop_height,
+ uv_border + ybf->uv_width - ybf->uv_crop_width);
extend_plane(ybf->v_buffer, ybf->uv_stride,
- (ybf->y_crop_width + 1) / 2, (ybf->y_crop_height + 1) / 2,
- ybf->border / 2, ybf->border / 2,
- (ybf->border + ybf->y_height - ybf->y_crop_height + 1) / 2,
- (ybf->border + ybf->y_width - ybf->y_crop_width + 1) / 2);
+ ybf->uv_crop_width, ybf->uv_crop_height,
+ uv_border, uv_border,
+ uv_border + ybf->uv_height - ybf->uv_crop_height,
+ uv_border + ybf->uv_width - ybf->uv_crop_width);
}
#if CONFIG_VP9