diff options
author | John Koleszar <jkoleszar@google.com> | 2012-11-05 12:37:14 -0800 |
---|---|---|
committer | John Koleszar <jkoleszar@google.com> | 2012-11-06 12:04:53 -0800 |
commit | 83b1d907daef1db08834093806f125e56fba3370 (patch) | |
tree | 11831ecc5fd5612b5e3b47e342cd2d752c9abfc3 /vpx/src/vpx_image.c | |
parent | 807acf17baf7ba839ecc0038cdaee5d17964e612 (diff) | |
download | libvpx-83b1d907daef1db08834093806f125e56fba3370.tar libvpx-83b1d907daef1db08834093806f125e56fba3370.tar.gz libvpx-83b1d907daef1db08834093806f125e56fba3370.tar.bz2 libvpx-83b1d907daef1db08834093806f125e56fba3370.zip |
vpx: merge with master
Change-Id: I44b3ad780cef6f448fa17ff8e28fea87ef9cd518
Diffstat (limited to 'vpx/src/vpx_image.c')
-rw-r--r-- | vpx/src/vpx_image.c | 49 |
1 files changed, 44 insertions, 5 deletions
diff --git a/vpx/src/vpx_image.c b/vpx/src/vpx_image.c index 4903789f2..36eda958e 100644 --- a/vpx/src/vpx_image.c +++ b/vpx/src/vpx_image.c @@ -13,10 +13,38 @@ #include <string.h> #include "vpx/vpx_image.h" +#define ADDRESS_STORAGE_SIZE sizeof(size_t) +/*returns an addr aligned to the byte boundary specified by align*/ +#define align_addr(addr,align) (void*)(((size_t)(addr) + ((align) - 1)) & (size_t)-(align)) + +/* Memalign code is copied from vpx_mem.c */ +static void *img_buf_memalign(size_t align, size_t size) { + void *addr, + * x = NULL; + + addr = malloc(size + align - 1 + ADDRESS_STORAGE_SIZE); + + if (addr) { + x = align_addr((unsigned char *)addr + ADDRESS_STORAGE_SIZE, (int)align); + /* save the actual malloc address */ + ((size_t *)x)[-1] = (size_t)addr; + } + + return x; +} + +static void img_buf_free(void *memblk) { + if (memblk) { + void *addr = (void *)(((size_t *)memblk)[-1]); + free(addr); + } +} + static vpx_image_t *img_alloc_helper(vpx_image_t *img, vpx_img_fmt_t fmt, unsigned int d_w, unsigned int d_h, + unsigned int buf_align, unsigned int stride_align, unsigned char *img_data) { @@ -24,6 +52,14 @@ static vpx_image_t *img_alloc_helper(vpx_image_t *img, int align; /* Treat align==0 like align==1 */ + if (!buf_align) + buf_align = 1; + + /* Validate alignment (must be power of 2) */ + if (buf_align & (buf_align - 1)) + goto fail; + + /* Treat align==0 like align==1 */ if (!stride_align) stride_align = 1; @@ -111,7 +147,8 @@ static vpx_image_t *img_alloc_helper(vpx_image_t *img, img->img_data = img_data; if (!img_data) { - img->img_data = malloc((fmt & VPX_IMG_FMT_PLANAR) ? h * w * bps / 8 : h * s); + img->img_data = img_buf_memalign(buf_align, ((fmt & VPX_IMG_FMT_PLANAR) ? + h * s * bps / 8 : h * s)); img->img_data_owner = 1; } @@ -142,8 +179,8 @@ vpx_image_t *vpx_img_alloc(vpx_image_t *img, vpx_img_fmt_t fmt, unsigned int d_w, unsigned int d_h, - unsigned int stride_align) { - return img_alloc_helper(img, fmt, d_w, d_h, stride_align, NULL); + unsigned int align) { + return img_alloc_helper(img, fmt, d_w, d_h, align, align, NULL); } vpx_image_t *vpx_img_wrap(vpx_image_t *img, @@ -152,7 +189,9 @@ vpx_image_t *vpx_img_wrap(vpx_image_t *img, unsigned int d_h, unsigned int stride_align, unsigned char *img_data) { - return img_alloc_helper(img, fmt, d_w, d_h, stride_align, img_data); + /* By setting buf_align = 1, we don't change buffer alignment in this + * function. */ + return img_alloc_helper(img, fmt, d_w, d_h, 1, stride_align, img_data); } int vpx_img_set_rect(vpx_image_t *img, @@ -232,7 +271,7 @@ void vpx_img_flip(vpx_image_t *img) { void vpx_img_free(vpx_image_t *img) { if (img) { if (img->img_data && img->img_data_owner) - free(img->img_data); + img_buf_free(img->img_data); if (img->self_allocd) free(img); |