diff options
author | John Koleszar <jkoleszar@google.com> | 2011-04-14 12:35:01 -0700 |
---|---|---|
committer | Code Review <code-review@webmproject.org> | 2011-04-14 12:35:01 -0700 |
commit | 63f15987a5b69d6a77748f369ac807f0933243d5 (patch) | |
tree | 12bf14ac30795b6582c10828df5ecfecbb0aa824 /vp8/common/extend.c | |
parent | e749ae510fc5529ccc71f683eea3b2008f23c94f (diff) | |
parent | 88841f1059ff1f4a8402e8d96eb4d034c900caaf (diff) | |
download | libvpx-63f15987a5b69d6a77748f369ac807f0933243d5.tar libvpx-63f15987a5b69d6a77748f369ac807f0933243d5.tar.gz libvpx-63f15987a5b69d6a77748f369ac807f0933243d5.tar.bz2 libvpx-63f15987a5b69d6a77748f369ac807f0933243d5.zip |
Merge "Refactor lookahead ring buffer"
Diffstat (limited to 'vp8/common/extend.c')
-rw-r--r-- | vp8/common/extend.c | 92 |
1 files changed, 49 insertions, 43 deletions
diff --git a/vp8/common/extend.c b/vp8/common/extend.c index 47207fa79..5b8b4e475 100644 --- a/vp8/common/extend.c +++ b/vp8/common/extend.c @@ -13,10 +13,12 @@ #include "vpx_mem/vpx_mem.h" -static void extend_plane_borders +static void copy_and_extend_plane ( unsigned char *s, /* source */ - int sp, /* pitch */ + int sp, /* source pitch */ + unsigned char *d, /* destination */ + int dp, /* destination pitch */ int h, /* height */ int w, /* width */ int et, /* extend top border */ @@ -25,7 +27,6 @@ static void extend_plane_borders int er /* extend right border */ ) { - int i; unsigned char *src_ptr1, *src_ptr2; unsigned char *dest_ptr1, *dest_ptr2; @@ -34,68 +35,73 @@ static void extend_plane_borders /* copy the left and right most columns out */ src_ptr1 = s; src_ptr2 = s + w - 1; - dest_ptr1 = s - el; - dest_ptr2 = s + w; + dest_ptr1 = d - el; + dest_ptr2 = d + w; for (i = 0; i < h - 0 + 1; i++) { - /* Some linkers will complain if we call vpx_memset with el set to a - * constant 0. - */ - if (el) - vpx_memset(dest_ptr1, src_ptr1[0], el); + vpx_memset(dest_ptr1, src_ptr1[0], el); + vpx_memcpy(dest_ptr1 + el, src_ptr1, w); vpx_memset(dest_ptr2, src_ptr2[0], er); src_ptr1 += sp; src_ptr2 += sp; - dest_ptr1 += sp; - dest_ptr2 += sp; + dest_ptr1 += dp; + dest_ptr2 += dp; } - /* Now copy the top and bottom source lines into each line of the respective borders */ - src_ptr1 = s - el; - src_ptr2 = s + sp * (h - 1) - el; - dest_ptr1 = s + sp * (-et) - el; - dest_ptr2 = s + sp * (h) - el; - linesize = el + er + w + 1; + /* Now copy the top and bottom lines into each line of the respective + * borders + */ + src_ptr1 = d - el; + src_ptr2 = d + dp * (h - 1) - el; + dest_ptr1 = d + dp * (-et) - el; + dest_ptr2 = d + dp * (h) - el; + linesize = el + er + w; - for (i = 0; i < (int)et; i++) + for (i = 0; i < et; i++) { vpx_memcpy(dest_ptr1, src_ptr1, linesize); - dest_ptr1 += sp; + dest_ptr1 += dp; } - for (i = 0; i < (int)eb; i++) + for (i = 0; i < eb; i++) { vpx_memcpy(dest_ptr2, src_ptr2, linesize); - dest_ptr2 += sp; + dest_ptr2 += dp; } } -void vp8_extend_to_multiple_of16(YV12_BUFFER_CONFIG *ybf, int width, int height) +void vp8_copy_and_extend_frame(YV12_BUFFER_CONFIG *src, + YV12_BUFFER_CONFIG *dst) { - int er = 0xf & (16 - (width & 0xf)); - int eb = 0xf & (16 - (height & 0xf)); - - /* check for non multiples of 16 */ - if (er != 0 || eb != 0) - { - extend_plane_borders(ybf->y_buffer, ybf->y_stride, height, width, 0, 0, eb, er); - - /* adjust for uv */ - height = (height + 1) >> 1; - width = (width + 1) >> 1; - er = 0x7 & (8 - (width & 0x7)); - eb = 0x7 & (8 - (height & 0x7)); - - if (er || eb) - { - extend_plane_borders(ybf->u_buffer, ybf->uv_stride, height, width, 0, 0, eb, er); - extend_plane_borders(ybf->v_buffer, ybf->uv_stride, height, width, 0, 0, eb, er); - } - } + int et = dst->border; + int el = dst->border; + int eb = dst->border + dst->y_height - src->y_height; + int er = dst->border + dst->y_width - src->y_width; + + copy_and_extend_plane(src->y_buffer, src->y_stride, + dst->y_buffer, dst->y_stride, + src->y_height, src->y_width, + et, el, eb, er); + + et = (et + 1) >> 1; + el = (el + 1) >> 1; + eb = (eb + 1) >> 1; + er = (er + 1) >> 1; + + copy_and_extend_plane(src->u_buffer, src->uv_stride, + dst->u_buffer, dst->uv_stride, + src->uv_height, src->uv_width, + et, el, eb, er); + + copy_and_extend_plane(src->v_buffer, src->uv_stride, + dst->v_buffer, dst->uv_stride, + src->uv_height, src->uv_width, + et, el, eb, er); } + /* note the extension is only for the last row, for intra prediction purpose */ void vp8_extend_mb_row(YV12_BUFFER_CONFIG *ybf, unsigned char *YPtr, unsigned char *UPtr, unsigned char *VPtr) { |