00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include <stdlib.h>
00025 #include <inttypes.h>
00026
00027 #include "mpeg2.h"
00028
00029 static void * (* malloc_hook) (unsigned size, mpeg2_alloc_t reason) = NULL;
00030 static int (* free_hook) (void * buf) = NULL;
00031
00032 void * mpeg2_malloc (unsigned size, mpeg2_alloc_t reason)
00033 {
00034 char * buf;
00035
00036 if (malloc_hook) {
00037 buf = (char *) malloc_hook (size, reason);
00038 if (buf)
00039 return buf;
00040 }
00041
00042 if (size) {
00043 buf = (char *) malloc (size + 63 + sizeof (void **));
00044 if (buf) {
00045 char * align_buf;
00046
00047 align_buf = buf + 63 + sizeof (void **);
00048 align_buf -= (long)align_buf & 63;
00049 *(((void **)align_buf) - 1) = buf;
00050 return align_buf;
00051 }
00052 }
00053 return NULL;
00054 }
00055
00056 void mpeg2_free (void * buf)
00057 {
00058 if (free_hook && free_hook (buf))
00059 return;
00060
00061 if (buf)
00062 free (*(((void **)buf) - 1));
00063 }
00064
00065 void mpeg2_malloc_hooks (void * malloc (unsigned, mpeg2_alloc_t),
00066 int free (void *))
00067 {
00068 malloc_hook = malloc;
00069 free_hook = free;
00070 }