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**********************************************************************************/
39void *
40mem_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*******************************************************************************/
95void
96mem_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