1 /*
2 ** Copyright 2003-2010, VisualOn, Inc.
3 **
4 ** Licensed under the Apache License, Version 2.0 (the "License");
5 ** you may not use this file except in compliance with the License.
6 ** You may obtain a copy of the License at
7 **
8 ** http://www.apache.org/licenses/LICENSE-2.0
9 **
10 ** Unless required by applicable law or agreed to in writing, software
11 ** distributed under the License is distributed on an "AS IS" BASIS,
12 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 ** See the License for the specific language governing permissions and
14 ** limitations under the License.
15 */
16
17 /*******************************************************************************
18 File: mem_align.c
19
20 Content: Memory alloc alignments functions
21
22 *******************************************************************************/
23
24
25 #include "mem_align.h"
26 #ifdef _MSC_VER
27 #include <stddef.h>
28 #else
29 #include <stdint.h>
30 #endif
31
32 /*****************************************************************************
33 *
34 * function name: mem_malloc
35 * description: malloc the alignments memory
36 * returns: the point of the memory
37 *
38 **********************************************************************************/
39 void *
mem_malloc(VO_MEM_OPERATOR * pMemop,unsigned int size,unsigned char alignment,unsigned int CodecID)40 mem_malloc(VO_MEM_OPERATOR *pMemop, unsigned int size, unsigned char alignment, unsigned int CodecID)
41 {
42 int ret;
43 unsigned char *mem_ptr;
44 VO_MEM_INFO MemInfo;
45
46 if (!alignment) {
47
48 MemInfo.Flag = 0;
49 MemInfo.Size = size + 1;
50 ret = pMemop->Alloc(CodecID, &MemInfo);
51 if(ret != 0)
52 return 0;
53 mem_ptr = (unsigned char *)MemInfo.VBuffer;
54
55 pMemop->Set(CodecID, mem_ptr, 0, size + 1);
56
57 *mem_ptr = (unsigned char)1;
58
59 return ((void *)(mem_ptr+1));
60 } else {
61 unsigned char *tmp;
62
63 MemInfo.Flag = 0;
64 MemInfo.Size = size + alignment;
65 ret = pMemop->Alloc(CodecID, &MemInfo);
66 if(ret != 0)
67 return 0;
68
69 tmp = (unsigned char *)MemInfo.VBuffer;
70
71 pMemop->Set(CodecID, tmp, 0, size + alignment);
72
73 mem_ptr =
74 (unsigned char *) ((intptr_t) (tmp + alignment - 1) &
75 (~((intptr_t) (alignment - 1))));
76
77 if (mem_ptr == tmp)
78 mem_ptr += alignment;
79
80 *(mem_ptr - 1) = (unsigned char) (mem_ptr - tmp);
81
82 return ((void *)mem_ptr);
83 }
84
85 return(0);
86 }
87
88
89 /*****************************************************************************
90 *
91 * function name: mem_free
92 * description: free the memory
93 *
94 *******************************************************************************/
95 void
mem_free(VO_MEM_OPERATOR * pMemop,void * mem_ptr,unsigned int CodecID)96 mem_free(VO_MEM_OPERATOR *pMemop, void *mem_ptr, unsigned int CodecID)
97 {
98
99 unsigned char *ptr;
100
101 if (mem_ptr == 0)
102 return;
103
104 ptr = mem_ptr;
105
106 ptr -= *(ptr - 1);
107
108 pMemop->Free(CodecID, ptr);
109 }
110
111
112
113