summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/codecs/amrwbenc/src/mem_align.c
blob: 3b7853f198542673f385777accc80329bfe73153 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
/*
 ** Copyright 2003-2010, VisualOn, Inc.
 **
 ** Licensed under the Apache License, Version 2.0 (the "License");
 ** you may not use this file except in compliance with the License.
 ** You may obtain a copy of the License at
 **
 **     http://www.apache.org/licenses/LICENSE-2.0
 **
 ** Unless required by applicable law or agreed to in writing, software
 ** distributed under the License is distributed on an "AS IS" BASIS,
 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 ** See the License for the specific language governing permissions and
 ** limitations under the License.
 */

/*******************************************************************************
	File:		mem_align.c

	Content:	Memory alloc alignments functions

*******************************************************************************/


#include	"mem_align.h"
#ifdef _MSC_VER
#include	<stddef.h>
#else
#include	<stdint.h>
#endif

/*****************************************************************************
*
* function name: mem_malloc
* description:  malloc the alignments memory
* returns:      the point of the memory
*
**********************************************************************************/
void *
mem_malloc(VO_MEM_OPERATOR *pMemop, unsigned int size, unsigned char alignment, unsigned int CodecID)
{
	int ret;
	unsigned char *mem_ptr;
	VO_MEM_INFO MemInfo;

	if (!alignment) {

		MemInfo.Flag = 0;
		MemInfo.Size = size + 1;
		ret = pMemop->Alloc(CodecID, &MemInfo);
		if(ret != 0)
			return 0;
		mem_ptr = (unsigned char *)MemInfo.VBuffer;

		pMemop->Set(CodecID, mem_ptr, 0, size + 1);

		*mem_ptr = (unsigned char)1;

		return ((void *)(mem_ptr+1));
	} else {
		unsigned char *tmp;

		MemInfo.Flag = 0;
		MemInfo.Size = size + alignment;
		ret = pMemop->Alloc(CodecID, &MemInfo);
		if(ret != 0)
			return 0;

		tmp = (unsigned char *)MemInfo.VBuffer;

		pMemop->Set(CodecID, tmp, 0, size + alignment);

		mem_ptr =
			(unsigned char *) ((intptr_t) (tmp + alignment - 1) &
					(~((intptr_t) (alignment - 1))));

		if (mem_ptr == tmp)
			mem_ptr += alignment;

		*(mem_ptr - 1) = (unsigned char) (mem_ptr - tmp);

		return ((void *)mem_ptr);
	}

	return(0);
}


/*****************************************************************************
*
* function name: mem_free
* description:  free the memory
*
*******************************************************************************/
void
mem_free(VO_MEM_OPERATOR *pMemop, void *mem_ptr, unsigned int CodecID)
{

	unsigned char *ptr;

	if (mem_ptr == 0)
		return;

	ptr = mem_ptr;

	ptr -= *(ptr - 1);

	pMemop->Free(CodecID, ptr);
}