| 
									
										
										
										
											2002-06-11 13:41:01 +00:00
										 |  |  | /*
 | 
					
						
							| 
									
										
										
										
											2006-07-19 07:28:58 +00:00
										 |  |  |  * default memory allocator for libavutil | 
					
						
							| 
									
										
										
										
											2009-01-19 15:46:40 +00:00
										 |  |  |  * Copyright (c) 2002 Fabrice Bellard | 
					
						
							| 
									
										
										
										
											2002-06-11 13:41:01 +00:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2006-10-07 15:30:46 +00:00
										 |  |  |  * This file is part of FFmpeg. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * FFmpeg is free software; you can redistribute it and/or | 
					
						
							| 
									
										
										
										
											2002-06-11 13:41:01 +00:00
										 |  |  |  * modify it under the terms of the GNU Lesser General Public | 
					
						
							|  |  |  |  * License as published by the Free Software Foundation; either | 
					
						
							| 
									
										
										
										
											2006-10-07 15:30:46 +00:00
										 |  |  |  * version 2.1 of the License, or (at your option) any later version. | 
					
						
							| 
									
										
										
										
											2002-06-11 13:41:01 +00:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2006-10-07 15:30:46 +00:00
										 |  |  |  * FFmpeg is distributed in the hope that it will be useful, | 
					
						
							| 
									
										
										
										
											2002-06-11 13:41:01 +00:00
										 |  |  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 
					
						
							|  |  |  |  * Lesser General Public License for more details. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * You should have received a copy of the GNU Lesser General Public | 
					
						
							| 
									
										
										
										
											2006-10-07 15:30:46 +00:00
										 |  |  |  * License along with FFmpeg; if not, write to the Free Software | 
					
						
							| 
									
										
										
										
											2006-01-12 22:43:26 +00:00
										 |  |  |  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | 
					
						
							| 
									
										
										
										
											2002-06-11 13:41:01 +00:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-03-06 11:32:04 +00:00
										 |  |  | /**
 | 
					
						
							| 
									
										
										
										
											2010-04-20 14:45:34 +00:00
										 |  |  |  * @file | 
					
						
							| 
									
										
										
										
											2009-01-28 00:16:05 +00:00
										 |  |  |  * default memory allocator for libavutil | 
					
						
							| 
									
										
										
										
											2003-03-06 11:32:04 +00:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-24 14:55:30 +00:00
										 |  |  | #include "config.h"
 | 
					
						
							| 
									
										
										
										
											2003-01-23 23:03:09 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-24 14:55:30 +00:00
										 |  |  | #include <limits.h>
 | 
					
						
							| 
									
										
										
										
											2009-01-07 23:36:34 +00:00
										 |  |  | #include <stdlib.h>
 | 
					
						
							| 
									
										
										
										
											2009-01-24 14:55:30 +00:00
										 |  |  | #include <string.h>
 | 
					
						
							| 
									
										
										
										
											2009-01-13 23:44:16 +00:00
										 |  |  | #if HAVE_MALLOC_H
 | 
					
						
							| 
									
										
										
										
											2002-06-11 13:41:01 +00:00
										 |  |  | #include <malloc.h>
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-28 13:06:31 +00:00
										 |  |  | #include "avutil.h"
 | 
					
						
							| 
									
										
										
										
											2009-01-25 22:40:43 +00:00
										 |  |  | #include "mem.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-28 00:16:05 +00:00
										 |  |  | /* here we can use OS-dependent allocation functions */ | 
					
						
							| 
									
										
										
										
											2009-01-25 22:59:05 +00:00
										 |  |  | #undef free
 | 
					
						
							|  |  |  | #undef malloc
 | 
					
						
							|  |  |  | #undef realloc
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-28 13:06:31 +00:00
										 |  |  | #ifdef MALLOC_PREFIX
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define malloc         AV_JOIN(MALLOC_PREFIX, malloc)
 | 
					
						
							|  |  |  | #define memalign       AV_JOIN(MALLOC_PREFIX, memalign)
 | 
					
						
							|  |  |  | #define posix_memalign AV_JOIN(MALLOC_PREFIX, posix_memalign)
 | 
					
						
							|  |  |  | #define realloc        AV_JOIN(MALLOC_PREFIX, realloc)
 | 
					
						
							|  |  |  | #define free           AV_JOIN(MALLOC_PREFIX, free)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void *malloc(size_t size); | 
					
						
							|  |  |  | void *memalign(size_t align, size_t size); | 
					
						
							|  |  |  | int   posix_memalign(void **ptr, size_t align, size_t size); | 
					
						
							|  |  |  | void *realloc(void *ptr, size_t size); | 
					
						
							|  |  |  | void  free(void *ptr); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif /* MALLOC_PREFIX */
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-28 00:16:05 +00:00
										 |  |  | /* You can redefine av_malloc and av_free in your project to use your
 | 
					
						
							| 
									
										
										
										
											2002-06-11 13:41:01 +00:00
										 |  |  |    memory allocator. You do not need to suppress this file because the | 
					
						
							| 
									
										
										
										
											2009-01-28 00:16:05 +00:00
										 |  |  |    linker will do it automatically. */ | 
					
						
							| 
									
										
										
										
											2002-06-11 13:41:01 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-12 15:00:04 +00:00
										 |  |  | void *av_malloc(unsigned int size) | 
					
						
							| 
									
										
										
										
											2002-06-11 13:41:01 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-01-07 23:36:34 +00:00
										 |  |  |     void *ptr = NULL; | 
					
						
							| 
									
										
										
										
											2009-01-13 23:44:16 +00:00
										 |  |  | #if CONFIG_MEMALIGN_HACK
 | 
					
						
							| 
									
										
										
										
											2006-01-30 22:59:09 +00:00
										 |  |  |     long diff; | 
					
						
							| 
									
										
										
										
											2005-02-24 19:08:50 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2005-01-12 00:16:25 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-06-30 02:47:36 +00:00
										 |  |  |     /* let's disallow possible ambiguous cases */ | 
					
						
							| 
									
										
										
										
											2006-08-17 08:18:48 +00:00
										 |  |  |     if(size > (INT_MAX-16) ) | 
					
						
							| 
									
										
										
										
											2005-01-12 00:16:25 +00:00
										 |  |  |         return NULL; | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-13 23:44:16 +00:00
										 |  |  | #if CONFIG_MEMALIGN_HACK
 | 
					
						
							| 
									
										
										
										
											2006-06-30 08:00:01 +00:00
										 |  |  |     ptr = malloc(size+16); | 
					
						
							|  |  |  |     if(!ptr) | 
					
						
							|  |  |  |         return ptr; | 
					
						
							| 
									
										
										
										
											2006-01-30 22:59:09 +00:00
										 |  |  |     diff= ((-(long)ptr - 1)&15) + 1; | 
					
						
							| 
									
										
										
										
											2008-02-14 08:16:07 +00:00
										 |  |  |     ptr = (char*)ptr + diff; | 
					
						
							| 
									
										
										
										
											2004-06-06 03:45:53 +00:00
										 |  |  |     ((char*)ptr)[-1]= diff; | 
					
						
							| 
									
										
										
										
											2009-01-13 23:44:16 +00:00
										 |  |  | #elif HAVE_POSIX_MEMALIGN
 | 
					
						
							| 
									
										
										
										
											2009-02-21 20:38:27 +00:00
										 |  |  |     if (posix_memalign(&ptr,16,size)) | 
					
						
							|  |  |  |         ptr = NULL; | 
					
						
							| 
									
										
										
										
											2009-01-13 23:44:16 +00:00
										 |  |  | #elif HAVE_MEMALIGN
 | 
					
						
							| 
									
										
										
										
											2002-09-15 10:02:15 +00:00
										 |  |  |     ptr = memalign(16,size); | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  |     /* Why 64?
 | 
					
						
							| 
									
										
										
										
											2002-06-11 13:41:01 +00:00
										 |  |  |        Indeed, we should align it: | 
					
						
							|  |  |  |          on 4 for 386 | 
					
						
							|  |  |  |          on 16 for 486 | 
					
						
							| 
									
										
										
										
											2009-01-28 00:16:05 +00:00
										 |  |  |          on 32 for 586, PPro - K6-III | 
					
						
							| 
									
										
										
										
											2005-12-22 01:10:11 +00:00
										 |  |  |          on 64 for K7 (maybe for P3 too). | 
					
						
							| 
									
										
										
										
											2002-06-11 13:41:01 +00:00
										 |  |  |        Because L1 and L2 caches are aligned on those values. | 
					
						
							|  |  |  |        But I don't want to code such logic here! | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2002-09-15 10:02:15 +00:00
										 |  |  |      /* Why 16?
 | 
					
						
							| 
									
										
										
										
											2008-03-10 18:42:09 +00:00
										 |  |  |         Because some CPUs need alignment, for example SSE2 on P4, & most RISC CPUs | 
					
						
							| 
									
										
										
										
											2002-09-15 10:02:15 +00:00
										 |  |  |         it will just trigger an exception and the unaligned load will be done in the | 
					
						
							| 
									
										
										
										
											2009-01-28 00:16:05 +00:00
										 |  |  |         exception handler or it will just segfault (SSE2 on P4). | 
					
						
							| 
									
										
										
										
											2008-03-12 23:58:46 +00:00
										 |  |  |         Why not larger? Because I did not see a difference in benchmarks ... | 
					
						
							| 
									
										
										
										
											2002-09-15 10:02:15 +00:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2009-01-28 00:16:05 +00:00
										 |  |  |      /* benchmarks with P3
 | 
					
						
							| 
									
										
										
										
											2005-12-22 01:10:11 +00:00
										 |  |  |         memalign(64)+1          3071,3051,3032 | 
					
						
							|  |  |  |         memalign(64)+2          3051,3032,3041 | 
					
						
							|  |  |  |         memalign(64)+4          2911,2896,2915 | 
					
						
							|  |  |  |         memalign(64)+8          2545,2554,2550 | 
					
						
							|  |  |  |         memalign(64)+16         2543,2572,2563 | 
					
						
							|  |  |  |         memalign(64)+32         2546,2545,2571 | 
					
						
							|  |  |  |         memalign(64)+64         2570,2533,2558 | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-28 00:16:05 +00:00
										 |  |  |         BTW, malloc seems to do 8-byte alignment by default here. | 
					
						
							| 
									
										
										
										
											2002-09-15 10:02:15 +00:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2002-06-11 13:41:01 +00:00
										 |  |  | #else
 | 
					
						
							|  |  |  |     ptr = malloc(size); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  |     return ptr; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-01-23 23:03:09 +00:00
										 |  |  | void *av_realloc(void *ptr, unsigned int size) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2009-01-13 23:44:16 +00:00
										 |  |  | #if CONFIG_MEMALIGN_HACK
 | 
					
						
							| 
									
										
										
										
											2006-08-17 08:18:48 +00:00
										 |  |  |     int diff; | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2005-02-24 19:08:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-06-30 02:47:36 +00:00
										 |  |  |     /* let's disallow possible ambiguous cases */ | 
					
						
							| 
									
										
										
										
											2006-06-30 08:00:01 +00:00
										 |  |  |     if(size > (INT_MAX-16) ) | 
					
						
							| 
									
										
										
										
											2005-01-12 00:16:25 +00:00
										 |  |  |         return NULL; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-13 23:44:16 +00:00
										 |  |  | #if CONFIG_MEMALIGN_HACK
 | 
					
						
							| 
									
										
										
										
											2006-08-17 08:18:48 +00:00
										 |  |  |     //FIXME this isn't aligned correctly, though it probably isn't needed
 | 
					
						
							|  |  |  |     if(!ptr) return av_malloc(size); | 
					
						
							|  |  |  |     diff= ((char*)ptr)[-1]; | 
					
						
							| 
									
										
										
										
											2008-02-14 08:16:07 +00:00
										 |  |  |     return (char*)realloc((char*)ptr - diff, size + diff) + diff; | 
					
						
							| 
									
										
										
										
											2006-08-17 08:18:48 +00:00
										 |  |  | #else
 | 
					
						
							|  |  |  |     return realloc(ptr, size); | 
					
						
							| 
									
										
										
										
											2004-06-06 03:45:53 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2003-01-21 21:30:48 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-06-11 13:41:01 +00:00
										 |  |  | void av_free(void *ptr) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     /* XXX: this test should not be needed on most libcs */ | 
					
						
							|  |  |  |     if (ptr) | 
					
						
							| 
									
										
										
										
											2009-01-13 23:44:16 +00:00
										 |  |  | #if CONFIG_MEMALIGN_HACK
 | 
					
						
							| 
									
										
										
										
											2008-02-14 08:16:07 +00:00
										 |  |  |         free((char*)ptr - ((char*)ptr)[-1]); | 
					
						
							| 
									
										
										
										
											2004-06-06 03:45:53 +00:00
										 |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2002-06-11 13:41:01 +00:00
										 |  |  |         free(ptr); | 
					
						
							| 
									
										
										
										
											2004-06-06 03:45:53 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2002-06-11 13:41:01 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-09-25 15:23:40 +00:00
										 |  |  | void av_freep(void *arg) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     void **ptr= (void**)arg; | 
					
						
							|  |  |  |     av_free(*ptr); | 
					
						
							|  |  |  |     *ptr = NULL; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void *av_mallocz(unsigned int size) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2008-04-03 19:18:14 +00:00
										 |  |  |     void *ptr = av_malloc(size); | 
					
						
							| 
									
										
										
										
											2006-09-25 15:23:40 +00:00
										 |  |  |     if (ptr) | 
					
						
							|  |  |  |         memset(ptr, 0, size); | 
					
						
							|  |  |  |     return ptr; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | char *av_strdup(const char *s) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2008-05-23 12:37:32 +00:00
										 |  |  |     char *ptr= NULL; | 
					
						
							|  |  |  |     if(s){ | 
					
						
							| 
									
										
										
										
											2008-05-23 12:37:52 +00:00
										 |  |  |         int len = strlen(s) + 1; | 
					
						
							|  |  |  |         ptr = av_malloc(len); | 
					
						
							|  |  |  |         if (ptr) | 
					
						
							|  |  |  |             memcpy(ptr, s, len); | 
					
						
							| 
									
										
										
										
											2008-05-23 12:37:32 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2006-09-25 15:23:40 +00:00
										 |  |  |     return ptr; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 |