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