Statistics
| Branch: | Revision:

ffmpeg / libavutil / mem.c @ b76e3424

History | View | Annotate | Download (3.85 KB)

1 d01fe86d Fabrice Bellard
/*
2 cea8f6f3 Luca Abeni
 * default memory allocator for libavutil
3 d01fe86d Fabrice Bellard
 * Copyright (c) 2002 Fabrice Bellard.
4
 *
5 b78e7197 Diego Biurrun
 * This file is part of FFmpeg.
6
 *
7
 * FFmpeg is free software; you can redistribute it and/or
8 d01fe86d Fabrice Bellard
 * modify it under the terms of the GNU Lesser General Public
9
 * License as published by the Free Software Foundation; either
10 b78e7197 Diego Biurrun
 * version 2.1 of the License, or (at your option) any later version.
11 d01fe86d Fabrice Bellard
 *
12 b78e7197 Diego Biurrun
 * FFmpeg is distributed in the hope that it will be useful,
13 d01fe86d Fabrice Bellard
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15
 * Lesser General Public License for more details.
16
 *
17
 * You should have received a copy of the GNU Lesser General Public
18 b78e7197 Diego Biurrun
 * License along with FFmpeg; if not, write to the Free Software
19 5509bffa Diego Biurrun
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 d01fe86d Fabrice Bellard
 */
21 115329f1 Diego Biurrun
22 983e3246 Michael Niedermayer
/**
23
 * @file mem.c
24 cea8f6f3 Luca Abeni
 * default memory allocator for libavutil.
25 983e3246 Michael Niedermayer
 */
26 115329f1 Diego Biurrun
27 cea8f6f3 Luca Abeni
#include "common.h"
28 8e1e6f31 Fabrice Bellard
29 eafcac6a Diego Biurrun
/* here we can use OS dependent allocation functions */
30 8e1e6f31 Fabrice Bellard
#undef malloc
31
#undef free
32
#undef realloc
33
34 d01fe86d Fabrice Bellard
#ifdef HAVE_MALLOC_H
35
#include <malloc.h>
36
#endif
37
38
/* you can redefine av_malloc and av_free in your project to use your
39
   memory allocator. You do not need to suppress this file because the
40
   linker will do it automatically */
41
42 18f77016 Zdenek Kabelac
void *av_malloc(unsigned int size)
43 d01fe86d Fabrice Bellard
{
44
    void *ptr;
45 9ddbcae6 Måns Rullgård
#ifdef CONFIG_MEMALIGN_HACK
46 ed96aeea Dieter
    long diff;
47 88730be6 Måns Rullgård
#endif
48 0ecca7a4 Michael Niedermayer
49 7d77d5f6 Diego Biurrun
    /* let's disallow possible ambiguous cases */
50 0a7c36af Michael Niedermayer
    if(size > (INT_MAX-16) )
51 0ecca7a4 Michael Niedermayer
        return NULL;
52 115329f1 Diego Biurrun
53 9ddbcae6 Måns Rullgård
#ifdef CONFIG_MEMALIGN_HACK
54 a9493601 Herve W
    ptr = malloc(size+16);
55
    if(!ptr)
56
        return ptr;
57 ed96aeea Dieter
    diff= ((-(long)ptr - 1)&15) + 1;
58 90d30570 avcoder
    ptr = (char*)ptr + diff;
59 da9b170c Michael Niedermayer
    ((char*)ptr)[-1]= diff;
60 115329f1 Diego Biurrun
#elif defined (HAVE_MEMALIGN)
61 8f2b21a8 Michael Niedermayer
    ptr = memalign(16,size);
62 115329f1 Diego Biurrun
    /* Why 64?
63 d01fe86d Fabrice Bellard
       Indeed, we should align it:
64
         on 4 for 386
65
         on 16 for 486
66 bb270c08 Diego Biurrun
         on 32 for 586, PPro - k6-III
67
         on 64 for K7 (maybe for P3 too).
68 d01fe86d Fabrice Bellard
       Because L1 and L2 caches are aligned on those values.
69
       But I don't want to code such logic here!
70
     */
71 8f2b21a8 Michael Niedermayer
     /* Why 16?
72 7ce68923 Diego Biurrun
        Because some CPUs need alignment, for example SSE2 on P4, & most RISC CPUs
73 8f2b21a8 Michael Niedermayer
        it will just trigger an exception and the unaligned load will be done in the
74
        exception handler or it will just segfault (SSE2 on P4)
75 2cab6401 Diego Biurrun
        Why not larger? Because I did not see a difference in benchmarks ...
76 8f2b21a8 Michael Niedermayer
     */
77
     /* benchmarks with p3
78 bb270c08 Diego Biurrun
        memalign(64)+1          3071,3051,3032
79
        memalign(64)+2          3051,3032,3041
80
        memalign(64)+4          2911,2896,2915
81
        memalign(64)+8          2545,2554,2550
82
        memalign(64)+16         2543,2572,2563
83
        memalign(64)+32         2546,2545,2571
84
        memalign(64)+64         2570,2533,2558
85 115329f1 Diego Biurrun

86 8f2b21a8 Michael Niedermayer
        btw, malloc seems to do 8 byte alignment by default here
87
     */
88 d01fe86d Fabrice Bellard
#else
89
    ptr = malloc(size);
90
#endif
91
    return ptr;
92
}
93
94 8e1e6f31 Fabrice Bellard
void *av_realloc(void *ptr, unsigned int size)
95
{
96 9ddbcae6 Måns Rullgård
#ifdef CONFIG_MEMALIGN_HACK
97 0a7c36af Michael Niedermayer
    int diff;
98
#endif
99 88730be6 Måns Rullgård
100 7d77d5f6 Diego Biurrun
    /* let's disallow possible ambiguous cases */
101 a9493601 Herve W
    if(size > (INT_MAX-16) )
102 0ecca7a4 Michael Niedermayer
        return NULL;
103
104 9ddbcae6 Måns Rullgård
#ifdef CONFIG_MEMALIGN_HACK
105 0a7c36af Michael Niedermayer
    //FIXME this isn't aligned correctly, though it probably isn't needed
106
    if(!ptr) return av_malloc(size);
107
    diff= ((char*)ptr)[-1];
108 90d30570 avcoder
    return (char*)realloc((char*)ptr - diff, size + diff) + diff;
109 0a7c36af Michael Niedermayer
#else
110
    return realloc(ptr, size);
111 da9b170c Michael Niedermayer
#endif
112 b7a22d84 Michael Niedermayer
}
113
114 d01fe86d Fabrice Bellard
void av_free(void *ptr)
115
{
116
    /* XXX: this test should not be needed on most libcs */
117
    if (ptr)
118 9ddbcae6 Måns Rullgård
#ifdef CONFIG_MEMALIGN_HACK
119 90d30570 avcoder
        free((char*)ptr - ((char*)ptr)[-1]);
120 da9b170c Michael Niedermayer
#else
121 d01fe86d Fabrice Bellard
        free(ptr);
122 da9b170c Michael Niedermayer
#endif
123 d01fe86d Fabrice Bellard
}
124
125 79e47000 Luca Barbato
void av_freep(void *arg)
126
{
127
    void **ptr= (void**)arg;
128
    av_free(*ptr);
129
    *ptr = NULL;
130
}
131
132
void *av_mallocz(unsigned int size)
133
{
134 11362767 Michael Niedermayer
    void *ptr = av_malloc(size);
135 79e47000 Luca Barbato
    if (ptr)
136
        memset(ptr, 0, size);
137
    return ptr;
138
}
139
140
char *av_strdup(const char *s)
141
{
142 fdf35f26 Michael Niedermayer
    char *ptr= NULL;
143
    if(s){
144 19757f61 Michael Niedermayer
        int len = strlen(s) + 1;
145
        ptr = av_malloc(len);
146
        if (ptr)
147
            memcpy(ptr, s, len);
148 fdf35f26 Michael Niedermayer
    }
149 79e47000 Luca Barbato
    return ptr;
150
}