[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.10 - (view) (download)

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

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