summaryrefslogtreecommitdiff
path: root/vpx/src/vpx_image.c
diff options
context:
space:
mode:
authorJohn Koleszar <jkoleszar@google.com>2012-11-05 12:37:14 -0800
committerJohn Koleszar <jkoleszar@google.com>2012-11-06 12:04:53 -0800
commit83b1d907daef1db08834093806f125e56fba3370 (patch)
tree11831ecc5fd5612b5e3b47e342cd2d752c9abfc3 /vpx/src/vpx_image.c
parent807acf17baf7ba839ecc0038cdaee5d17964e612 (diff)
downloadlibvpx-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.c49
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);