[cvs] / xvidcore / src / utils / mem_align.c Repository:
ViewVC logotype

Annotation of /xvidcore/src/utils/mem_align.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.7 - (view) (download)

1 : edgomez 1.7 /*****************************************************************************
2 :     *
3 :     * XVID MPEG-4 VIDEO CODEC
4 :     * - Aligned memory allocator -
5 :     *
6 :     * This program is an implementation of a part of one or more MPEG-4
7 :     * Video tools as specified in ISO/IEC 14496-2 standard. Those intending
8 :     * to use this software module in hardware or software products are
9 :     * advised that its use may infringe existing patents or copyrights, and
10 :     * any such use would be at such party's own risk. The original
11 :     * developer of this software module and his/her company, and subsequent
12 :     * editors and their companies, will have no liability for use of this
13 :     * software or modifications or derivatives thereof.
14 :     *
15 :     * This program is free software ; you can redistribute it and/or modify
16 :     * it under the terms of the GNU General Public License as published by
17 :     * the Free Software Foundation ; either version 2 of the License, or
18 :     * (at your option) any later version.
19 :     *
20 :     * This program is distributed in the hope that it will be useful,
21 :     * but WITHOUT ANY WARRANTY ; without even the implied warranty of
22 :     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23 :     * GNU General Public License for more details.
24 :     *
25 :     * You should have received a copy of the GNU General Public License
26 :     * along with this program ; if not, write to the Free Software
27 :     * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
28 :     *
29 :     ****************************************************************************/
30 :     /*****************************************************************************
31 :     *
32 :     * History
33 :     *
34 :     * - Thu Jun 13 23:50:07 2002 Added legal header
35 :     *
36 :     * $Id$
37 :     *
38 :     ****************************************************************************/
39 :    
40 :    
41 : Isibaar 1.2 #include <stdlib.h>
42 :     #include <stdio.h>
43 :     #include "mem_align.h"
44 :    
45 : edgomez 1.7 /*****************************************************************************
46 :     * xvid_malloc
47 :     *
48 :     * This function allocates 'size' bytes (usable by the user) on the heap and
49 :     * takes care of the requested 'alignment'.
50 :     * In order to align the allocated memory block, the xvid_malloc allocates
51 :     * 'size' bytes + 'alignment' bytes. So try to keep alignment very small
52 :     * when allocating small pieces of memory.
53 :     *
54 :     * NB : a block allocated by xvid_malloc _must_ be freed with xvid_free
55 :     * (the libc free will return an error)
56 :     *
57 :     * Returned value : - NULL on error
58 :     * - Pointer to the allocated aligned block
59 :     *
60 :     ****************************************************************************/
61 :    
62 : edgomez 1.6 void *
63 :     xvid_malloc(size_t size,
64 :     uint8_t alignment)
65 : Isibaar 1.2 {
66 : edgomez 1.3 uint8_t *mem_ptr;
67 : edgomez 1.6
68 :     if (!alignment) {
69 : edgomez 1.4
70 :     /* We have not to satisfy any alignment */
71 : edgomez 1.6 if ((mem_ptr = (uint8_t *) malloc(size + 1)) != NULL) {
72 : edgomez 1.4
73 :     /* Store (mem_ptr - "real allocated memory") in *(mem_ptr-1) */
74 : edgomez 1.3 *mem_ptr = 0;
75 : edgomez 1.4
76 :     /* Return the mem_ptr pointer */
77 : edgomez 1.3 return (void *) mem_ptr++;
78 : edgomez 1.4
79 : edgomez 1.3 }
80 : edgomez 1.4
81 : edgomez 1.6 } else {
82 : edgomez 1.3 uint8_t *tmp;
83 : edgomez 1.6
84 : edgomez 1.4 /*
85 :     * Allocate the required size memory + alignment so we
86 :     * can realign the data if necessary
87 :     */
88 :    
89 : edgomez 1.6 if ((tmp = (uint8_t *) malloc(size + alignment)) != NULL) {
90 : edgomez 1.4
91 :     /* Align the tmp pointer */
92 : edgomez 1.6 mem_ptr =
93 :     (uint8_t *) ((uint32_t) (tmp + alignment - 1) &
94 :     (~(uint32_t) (alignment - 1)));
95 : edgomez 1.4
96 :     /*
97 :     * Special case where malloc have already satisfied the alignment
98 :     * We must add alignment to mem_ptr because we must store
99 :     * (mem_ptr - tmp) in *(mem_ptr-1)
100 :     * If we do not add alignment to mem_ptr then *(mem_ptr-1) points
101 :     * to a forbidden memory space
102 :     */
103 : edgomez 1.6 if (mem_ptr == tmp)
104 :     mem_ptr += alignment;
105 : edgomez 1.4
106 :     /*
107 :     * (mem_ptr - tmp) is stored in *(mem_ptr-1) so we are able to retrieve
108 :     * the real malloc block allocated and free it in xvid_free
109 :     */
110 : edgomez 1.6 *(mem_ptr - 1) = (uint8_t) (mem_ptr - tmp);
111 : edgomez 1.4
112 :     /* Return the aligned pointer */
113 : edgomez 1.3 return (void *) mem_ptr;
114 : edgomez 1.4
115 : edgomez 1.3 }
116 :     }
117 :    
118 :     return NULL;
119 : Isibaar 1.2
120 :     }
121 : edgomez 1.7
122 :     /*****************************************************************************
123 :     * xvid_free
124 :     *
125 :     * Free a previously 'xvid_malloc' allocated block. Does not free NULL
126 :     * references.
127 :     *
128 :     * Returned value : None.
129 :     *
130 :     ****************************************************************************/
131 : Isibaar 1.2
132 : edgomez 1.6 void
133 :     xvid_free(void *mem_ptr)
134 : Isibaar 1.2 {
135 :    
136 : edgomez 1.4 /* *(mem_ptr - 1) give us the offset to the real malloc block */
137 : edgomez 1.6 if (mem_ptr)
138 :     free((uint8_t *) mem_ptr - *((uint8_t *) mem_ptr - 1));
139 : Isibaar 1.2
140 :     }

No admin address has been configured
ViewVC Help
Powered by ViewVC 1.0.4