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

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

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.3, Thu Mar 21 00:28:33 2002 UTC revision 1.9, Thu Sep 5 21:32:30 2002 UTC
# Line 1  Line 1 
1    /*****************************************************************************
2     *
3     *  XVID MPEG-4 VIDEO CODEC
4     *  - Aligned memory allocator -
5     *
6     *  Copyright(C) 2002 Michael Militzer
7     *               2002 Edouard Gomez
8     *
9     *  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     * $Id$
33     *
34     ****************************************************************************/
35    
36  #include <stdlib.h>  #include <stdlib.h>
37  #include <stdio.h>  #include <stdio.h>
38  #include "mem_align.h"  #include "mem_align.h"
39    
40  void *xvid_malloc(size_t size, uint8_t alignment)  /*****************************************************************************
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    void *
58    xvid_malloc(size_t size,
59                            uint8_t alignment)
60  {  {
61          uint8_t *mem_ptr;          uint8_t *mem_ptr;
62    
63          if(alignment == 0)          if (!alignment) {
64          {  
65                    /* We have not to satisfy any alignment */
66                  if((mem_ptr = (uint8_t *) malloc(size + 1)) != NULL) {                  if((mem_ptr = (uint8_t *) malloc(size + 1)) != NULL) {
67    
68                            /* Store (mem_ptr - "real allocated memory") in *(mem_ptr-1) */
69                          *mem_ptr = 0;                          *mem_ptr = 0;
70    
71                            /* Return the mem_ptr pointer */
72                          return (void *) mem_ptr++;                          return (void *) mem_ptr++;
73    
74                  }                  }
75          }  
76          else          } else {
         {  
77                  uint8_t *tmp;                  uint8_t *tmp;
78    
79                    /*
80                     * Allocate the required size memory + alignment so we
81                     * can realign the data if necessary
82                     */
83    
84                  if((tmp = (uint8_t *) malloc(size + alignment)) != NULL) {                  if((tmp = (uint8_t *) malloc(size + alignment)) != NULL) {
85                          mem_ptr = (uint8_t *)((uint32_t)(tmp + alignment - 1)&(~(uint32_t)(alignment - 1)));  
86                            /* Align the tmp pointer */
87                            mem_ptr =
88                                    (uint8_t *) ((ptr_t) (tmp + alignment - 1) &
89                                                             (~(ptr_t) (alignment - 1)));
90    
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                            if (mem_ptr == tmp)
99                                    mem_ptr += alignment;
100    
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                          *(mem_ptr - 1) = (uint8_t)(mem_ptr - tmp);                          *(mem_ptr - 1) = (uint8_t)(mem_ptr - tmp);
106    
107                            /* Return the aligned pointer */
108                          return (void *) mem_ptr;                          return (void *) mem_ptr;
109    
110                  }                  }
111          }          }
112    
# Line 28  Line 114 
114    
115  }  }
116    
117  void xvid_free(void *mem_ptr)  /*****************************************************************************
118  {   * xvid_free
119     *
120          uint8_t *real_ptr;   * Free a previously 'xvid_malloc' allocated block. Does not free NULL
121     * references.
122     *
123     * Returned value : None.
124     *
125     ****************************************************************************/
126    
127          real_ptr = (uint8_t*)mem_ptr;  void
128    xvid_free(void *mem_ptr)
129    {
130    
131          free(real_ptr - *(real_ptr -1));          /* *(mem_ptr - 1) give us the offset to the real malloc block */
132            if (mem_ptr)
133                    free((uint8_t *) mem_ptr - *((uint8_t *) mem_ptr - 1));
134    
135  }  }

Legend:
Removed from v.1.3  
changed lines
  Added in v.1.9

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