vpx_mem.c 2.53 KB
Newer Older
John Koleszar's avatar
John Koleszar committed
1
/*
2
 *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
John Koleszar's avatar
John Koleszar committed
3
 *
4
 *  Use of this source code is governed by a BSD-style license
5
6
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
7
 *  in the file PATENTS.  All contributing project authors may
8
 *  be found in the AUTHORS file in the root of the source tree.
John Koleszar's avatar
John Koleszar committed
9
10
11
12
13
14
15
16
 */


#include "vpx_mem.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "include/vpx_mem_intrnl.h"
17
#include "vpx/vpx_integer.h"
John Koleszar's avatar
John Koleszar committed
18

John Koleszar's avatar
John Koleszar committed
19
20
21
void *vpx_memalign(size_t align, size_t size) {
  void *addr,
       * x = NULL;
John Koleszar's avatar
John Koleszar committed
22

23
  addr = malloc(size + align - 1 + ADDRESS_STORAGE_SIZE);
John Koleszar's avatar
John Koleszar committed
24

John Koleszar's avatar
John Koleszar committed
25
26
27
28
29
  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;
  }
John Koleszar's avatar
John Koleszar committed
30

John Koleszar's avatar
John Koleszar committed
31
  return x;
John Koleszar's avatar
John Koleszar committed
32
33
}

John Koleszar's avatar
John Koleszar committed
34
35
void *vpx_malloc(size_t size) {
  return vpx_memalign(DEFAULT_ALIGNMENT, size);
John Koleszar's avatar
John Koleszar committed
36
37
}

John Koleszar's avatar
John Koleszar committed
38
39
void *vpx_calloc(size_t num, size_t size) {
  void *x;
John Koleszar's avatar
John Koleszar committed
40

John Koleszar's avatar
John Koleszar committed
41
  x = vpx_memalign(DEFAULT_ALIGNMENT, num * size);
John Koleszar's avatar
John Koleszar committed
42

John Koleszar's avatar
John Koleszar committed
43
  if (x)
44
    memset(x, 0, num * size);
John Koleszar's avatar
John Koleszar committed
45

John Koleszar's avatar
John Koleszar committed
46
  return x;
John Koleszar's avatar
John Koleszar committed
47
48
}

John Koleszar's avatar
John Koleszar committed
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
void *vpx_realloc(void *memblk, size_t size) {
  void *addr,
       * new_addr = NULL;
  int align = DEFAULT_ALIGNMENT;

  /*
  The realloc() function changes the size of the object pointed to by
  ptr to the size specified by size, and returns a pointer to the
  possibly moved block. The contents are unchanged up to the lesser
  of the new and old sizes. If ptr is null, realloc() behaves like
  malloc() for the specified size. If size is zero (0) and ptr is
  not a null pointer, the object pointed to is freed.
  */
  if (!memblk)
    new_addr = vpx_malloc(size);
  else if (!size)
    vpx_free(memblk);
  else {
    addr   = (void *)(((size_t *)memblk)[-1]);
    memblk = NULL;
John Koleszar's avatar
John Koleszar committed
69

70
    new_addr = realloc(addr, size + align + ADDRESS_STORAGE_SIZE);
John Koleszar's avatar
John Koleszar committed
71

John Koleszar's avatar
John Koleszar committed
72
73
74
75
76
77
78
    if (new_addr) {
      addr = new_addr;
      new_addr = (void *)(((size_t)
                           ((unsigned char *)new_addr + ADDRESS_STORAGE_SIZE) + (align - 1)) &
                          (size_t) - align);
      /* save the actual malloc address */
      ((size_t *)new_addr)[-1] = (size_t)addr;
John Koleszar's avatar
John Koleszar committed
79
    }
John Koleszar's avatar
John Koleszar committed
80
  }
John Koleszar's avatar
John Koleszar committed
81

John Koleszar's avatar
John Koleszar committed
82
  return new_addr;
John Koleszar's avatar
John Koleszar committed
83
84
}

John Koleszar's avatar
John Koleszar committed
85
86
87
void vpx_free(void *memblk) {
  if (memblk) {
    void *addr = (void *)(((size_t *)memblk)[-1]);
88
    free(addr);
John Koleszar's avatar
John Koleszar committed
89
  }
John Koleszar's avatar
John Koleszar committed
90
91
}

92
#if CONFIG_VP9_HIGHBITDEPTH
93
void *vpx_memset16(void *dest, int val, size_t length) {
94
  size_t i;
95
  uint16_t *dest16 = (uint16_t *)dest;
96
97
  for (i = 0; i < length; i++)
    *dest16++ = val;
98
  return dest;
99
}
100
#endif  // CONFIG_VP9_HIGHBITDEPTH