diff options
Diffstat (limited to 'apps/codecs/Tremor/oggmalloc.c')
| -rw-r--r-- | apps/codecs/Tremor/oggmalloc.c | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/apps/codecs/Tremor/oggmalloc.c b/apps/codecs/Tremor/oggmalloc.c new file mode 100644 index 0000000..eae3d3f --- /dev/null +++ b/apps/codecs/Tremor/oggmalloc.c @@ -0,0 +1,71 @@ +#include <os_types.h> + +static unsigned char *mallocbuf; +static long bufsize, tmp_ptr, mem_ptr; + +void ogg_malloc_init(void) +{ + mallocbuf = (unsigned char *)ci->get_codec_memory((size_t *)&bufsize); + tmp_ptr = bufsize & ~3; + mem_ptr = 0; +} + +void *ogg_malloc(size_t size) +{ + void* x; + + if (mem_ptr + (long)size > tmp_ptr) + return NULL; + + x = &mallocbuf[mem_ptr]; + mem_ptr += (size + 3) & ~3; /* Keep memory 32-bit aligned */ + + return x; +} + +void *ogg_tmpmalloc(size_t size) +{ + if (mem_ptr + (long)size > tmp_ptr) + return NULL; + + tmp_ptr -= (size + 3) & ~3; + return &mallocbuf[tmp_ptr]; +} + +void *ogg_calloc(size_t nmemb, size_t size) +{ + void *x; + x = ogg_malloc(nmemb * size); + if (x == NULL) + return NULL; + ci->memset(x, 0, nmemb * size); + return x; +} + +void *ogg_tmpcalloc(size_t nmemb, size_t size) +{ + void *x; + x = ogg_tmpmalloc(nmemb * size); + if (x == NULL) + return NULL; + ci->memset(x, 0, nmemb * size); + return x; +} + +void *ogg_realloc(void *ptr, size_t size) +{ + void *x; + (void)ptr; + x = ogg_malloc(size); + return x; +} + +long ogg_tmpmalloc_pos(void) +{ + return tmp_ptr; +} + +void ogg_tmpmalloc_free(long pos) +{ + tmp_ptr = pos; +} |