Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
  3.  *
  4.  * This file is part of FFmpeg.
  5.  *
  6.  * FFmpeg is free software; you can redistribute it and/or
  7.  * modify it under the terms of the GNU Lesser General Public
  8.  * License as published by the Free Software Foundation; either
  9.  * version 2.1 of the License, or (at your option) any later version.
  10.  *
  11.  * FFmpeg is distributed in the hope that it will be useful,
  12.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  14.  * Lesser General Public License for more details.
  15.  *
  16.  * You should have received a copy of the GNU Lesser General Public
  17.  * License along with FFmpeg; if not, write to the Free Software
  18.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  19.  */
  20.  
  21. /**
  22.  * @file
  23.  * memory handling functions
  24.  */
  25.  
  26. #ifndef AVUTIL_MEM_H
  27. #define AVUTIL_MEM_H
  28.  
  29. #include <limits.h>
  30. #include <stdint.h>
  31.  
  32. #include "attributes.h"
  33. #include "error.h"
  34. #include "avutil.h"
  35.  
  36. /**
  37.  * @addtogroup lavu_mem
  38.  * @{
  39.  */
  40.  
  41.  
  42. #if defined(__INTEL_COMPILER) && __INTEL_COMPILER < 1110 || defined(__SUNPRO_C)
  43.     #define DECLARE_ALIGNED(n,t,v)      t __attribute__ ((aligned (n))) v
  44.     #define DECLARE_ASM_CONST(n,t,v)    const t __attribute__ ((aligned (n))) v
  45. #elif defined(__TI_COMPILER_VERSION__)
  46.     #define DECLARE_ALIGNED(n,t,v)                      \
  47.         AV_PRAGMA(DATA_ALIGN(v,n))                      \
  48.         t __attribute__((aligned(n))) v
  49.     #define DECLARE_ASM_CONST(n,t,v)                    \
  50.         AV_PRAGMA(DATA_ALIGN(v,n))                      \
  51.         static const t __attribute__((aligned(n))) v
  52. #elif defined(__GNUC__)
  53.     #define DECLARE_ALIGNED(n,t,v)      t __attribute__ ((aligned (n))) v
  54.     #define DECLARE_ASM_CONST(n,t,v)    static const t av_used __attribute__ ((aligned (n))) v
  55. #elif defined(_MSC_VER)
  56.     #define DECLARE_ALIGNED(n,t,v)      __declspec(align(n)) t v
  57.     #define DECLARE_ASM_CONST(n,t,v)    __declspec(align(n)) static const t v
  58. #else
  59.     #define DECLARE_ALIGNED(n,t,v)      t v
  60.     #define DECLARE_ASM_CONST(n,t,v)    static const t v
  61. #endif
  62.  
  63. #if AV_GCC_VERSION_AT_LEAST(3,1)
  64.     #define av_malloc_attrib __attribute__((__malloc__))
  65. #else
  66.     #define av_malloc_attrib
  67. #endif
  68.  
  69. #if AV_GCC_VERSION_AT_LEAST(4,3)
  70.     #define av_alloc_size(...) __attribute__((alloc_size(__VA_ARGS__)))
  71. #else
  72.     #define av_alloc_size(...)
  73. #endif
  74.  
  75. /**
  76.  * Allocate a block of size bytes with alignment suitable for all
  77.  * memory accesses (including vectors if available on the CPU).
  78.  * @param size Size in bytes for the memory block to be allocated.
  79.  * @return Pointer to the allocated block, NULL if the block cannot
  80.  * be allocated.
  81.  * @see av_mallocz()
  82.  */
  83. void *av_malloc(size_t size) av_malloc_attrib av_alloc_size(1);
  84.  
  85. /**
  86.  * Allocate a block of size * nmemb bytes with av_malloc().
  87.  * @param nmemb Number of elements
  88.  * @param size Size of the single element
  89.  * @return Pointer to the allocated block, NULL if the block cannot
  90.  * be allocated.
  91.  * @see av_malloc()
  92.  */
  93. av_alloc_size(1, 2) static inline void *av_malloc_array(size_t nmemb, size_t size)
  94. {
  95.     if (!size || nmemb >= INT_MAX / size)
  96.         return NULL;
  97.     return av_malloc(nmemb * size);
  98. }
  99.  
  100. /**
  101.  * Allocate or reallocate a block of memory.
  102.  * If ptr is NULL and size > 0, allocate a new block. If
  103.  * size is zero, free the memory block pointed to by ptr.
  104.  * @param ptr Pointer to a memory block already allocated with
  105.  * av_realloc() or NULL.
  106.  * @param size Size in bytes of the memory block to be allocated or
  107.  * reallocated.
  108.  * @return Pointer to a newly-reallocated block or NULL if the block
  109.  * cannot be reallocated or the function is used to free the memory block.
  110.  * @warning Pointers originating from the av_malloc() family of functions must
  111.  *          not be passed to av_realloc(). The former can be implemented using
  112.  *          memalign() (or other functions), and there is no guarantee that
  113.  *          pointers from such functions can be passed to realloc() at all.
  114.  *          The situation is undefined according to POSIX and may crash with
  115.  *          some libc implementations.
  116.  * @see av_fast_realloc()
  117.  */
  118. void *av_realloc(void *ptr, size_t size) av_alloc_size(2);
  119.  
  120. /**
  121.  * Allocate or reallocate a block of memory.
  122.  * This function does the same thing as av_realloc, except:
  123.  * - It takes two arguments and checks the result of the multiplication for
  124.  *   integer overflow.
  125.  * - It frees the input block in case of failure, thus avoiding the memory
  126.  *   leak with the classic "buf = realloc(buf); if (!buf) return -1;".
  127.  */
  128. void *av_realloc_f(void *ptr, size_t nelem, size_t elsize);
  129.  
  130. /**
  131.  * Allocate or reallocate a block of memory.
  132.  * If *ptr is NULL and size > 0, allocate a new block. If
  133.  * size is zero, free the memory block pointed to by ptr.
  134.  * @param   ptr Pointer to a pointer to a memory block already allocated
  135.  *          with av_realloc(), or pointer to a pointer to NULL.
  136.  *          The pointer is updated on success, or freed on failure.
  137.  * @param   size Size in bytes for the memory block to be allocated or
  138.  *          reallocated
  139.  * @return  Zero on success, an AVERROR error code on failure.
  140.  * @warning Pointers originating from the av_malloc() family of functions must
  141.  *          not be passed to av_reallocp(). The former can be implemented using
  142.  *          memalign() (or other functions), and there is no guarantee that
  143.  *          pointers from such functions can be passed to realloc() at all.
  144.  *          The situation is undefined according to POSIX and may crash with
  145.  *          some libc implementations.
  146.  */
  147. int av_reallocp(void *ptr, size_t size);
  148.  
  149. /**
  150.  * Allocate or reallocate an array.
  151.  * If ptr is NULL and nmemb > 0, allocate a new block. If
  152.  * nmemb is zero, free the memory block pointed to by ptr.
  153.  * @param ptr Pointer to a memory block already allocated with
  154.  * av_realloc() or NULL.
  155.  * @param nmemb Number of elements
  156.  * @param size Size of the single element
  157.  * @return Pointer to a newly-reallocated block or NULL if the block
  158.  * cannot be reallocated or the function is used to free the memory block.
  159.  * @warning Pointers originating from the av_malloc() family of functions must
  160.  *          not be passed to av_realloc(). The former can be implemented using
  161.  *          memalign() (or other functions), and there is no guarantee that
  162.  *          pointers from such functions can be passed to realloc() at all.
  163.  *          The situation is undefined according to POSIX and may crash with
  164.  *          some libc implementations.
  165.  */
  166. av_alloc_size(2, 3) void *av_realloc_array(void *ptr, size_t nmemb, size_t size);
  167.  
  168. /**
  169.  * Allocate or reallocate an array through a pointer to a pointer.
  170.  * If *ptr is NULL and nmemb > 0, allocate a new block. If
  171.  * nmemb is zero, free the memory block pointed to by ptr.
  172.  * @param ptr Pointer to a pointer to a memory block already allocated
  173.  * with av_realloc(), or pointer to a pointer to NULL.
  174.  * The pointer is updated on success, or freed on failure.
  175.  * @param nmemb Number of elements
  176.  * @param size Size of the single element
  177.  * @return Zero on success, an AVERROR error code on failure.
  178.  * @warning Pointers originating from the av_malloc() family of functions must
  179.  *          not be passed to av_realloc(). The former can be implemented using
  180.  *          memalign() (or other functions), and there is no guarantee that
  181.  *          pointers from such functions can be passed to realloc() at all.
  182.  *          The situation is undefined according to POSIX and may crash with
  183.  *          some libc implementations.
  184.  */
  185. av_alloc_size(2, 3) int av_reallocp_array(void *ptr, size_t nmemb, size_t size);
  186.  
  187. /**
  188.  * Free a memory block which has been allocated with av_malloc(z)() or
  189.  * av_realloc().
  190.  * @param ptr Pointer to the memory block which should be freed.
  191.  * @note ptr = NULL is explicitly allowed.
  192.  * @note It is recommended that you use av_freep() instead.
  193.  * @see av_freep()
  194.  */
  195. void av_free(void *ptr);
  196.  
  197. /**
  198.  * Allocate a block of size bytes with alignment suitable for all
  199.  * memory accesses (including vectors if available on the CPU) and
  200.  * zero all the bytes of the block.
  201.  * @param size Size in bytes for the memory block to be allocated.
  202.  * @return Pointer to the allocated block, NULL if it cannot be allocated.
  203.  * @see av_malloc()
  204.  */
  205. void *av_mallocz(size_t size) av_malloc_attrib av_alloc_size(1);
  206.  
  207. /**
  208.  * Allocate a block of nmemb * size bytes with alignment suitable for all
  209.  * memory accesses (including vectors if available on the CPU) and
  210.  * zero all the bytes of the block.
  211.  * The allocation will fail if nmemb * size is greater than or equal
  212.  * to INT_MAX.
  213.  * @param nmemb
  214.  * @param size
  215.  * @return Pointer to the allocated block, NULL if it cannot be allocated.
  216.  */
  217. void *av_calloc(size_t nmemb, size_t size) av_malloc_attrib;
  218.  
  219. /**
  220.  * Allocate a block of size * nmemb bytes with av_mallocz().
  221.  * @param nmemb Number of elements
  222.  * @param size Size of the single element
  223.  * @return Pointer to the allocated block, NULL if the block cannot
  224.  * be allocated.
  225.  * @see av_mallocz()
  226.  * @see av_malloc_array()
  227.  */
  228. av_alloc_size(1, 2) static inline void *av_mallocz_array(size_t nmemb, size_t size)
  229. {
  230.     if (!size || nmemb >= INT_MAX / size)
  231.         return NULL;
  232.     return av_mallocz(nmemb * size);
  233. }
  234.  
  235. /**
  236.  * Duplicate the string s.
  237.  * @param s string to be duplicated
  238.  * @return Pointer to a newly-allocated string containing a
  239.  * copy of s or NULL if the string cannot be allocated.
  240.  */
  241. char *av_strdup(const char *s) av_malloc_attrib;
  242.  
  243. /**
  244.  * Duplicate the buffer p.
  245.  * @param p buffer to be duplicated
  246.  * @return Pointer to a newly allocated buffer containing a
  247.  * copy of p or NULL if the buffer cannot be allocated.
  248.  */
  249. void *av_memdup(const void *p, size_t size);
  250.  
  251. /**
  252.  * Free a memory block which has been allocated with av_malloc(z)() or
  253.  * av_realloc() and set the pointer pointing to it to NULL.
  254.  * @param ptr Pointer to the pointer to the memory block which should
  255.  * be freed.
  256.  * @see av_free()
  257.  */
  258. void av_freep(void *ptr);
  259.  
  260. /**
  261.  * Add an element to a dynamic array.
  262.  *
  263.  * The array to grow is supposed to be an array of pointers to
  264.  * structures, and the element to add must be a pointer to an already
  265.  * allocated structure.
  266.  *
  267.  * The array is reallocated when its size reaches powers of 2.
  268.  * Therefore, the amortized cost of adding an element is constant.
  269.  *
  270.  * In case of success, the pointer to the array is updated in order to
  271.  * point to the new grown array, and the number pointed to by nb_ptr
  272.  * is incremented.
  273.  * In case of failure, the array is freed, *tab_ptr is set to NULL and
  274.  * *nb_ptr is set to 0.
  275.  *
  276.  * @param tab_ptr pointer to the array to grow
  277.  * @param nb_ptr  pointer to the number of elements in the array
  278.  * @param elem    element to add
  279.  * @see av_dynarray2_add()
  280.  */
  281. void av_dynarray_add(void *tab_ptr, int *nb_ptr, void *elem);
  282.  
  283. /**
  284.  * Add an element of size elem_size to a dynamic array.
  285.  *
  286.  * The array is reallocated when its number of elements reaches powers of 2.
  287.  * Therefore, the amortized cost of adding an element is constant.
  288.  *
  289.  * In case of success, the pointer to the array is updated in order to
  290.  * point to the new grown array, and the number pointed to by nb_ptr
  291.  * is incremented.
  292.  * In case of failure, the array is freed, *tab_ptr is set to NULL and
  293.  * *nb_ptr is set to 0.
  294.  *
  295.  * @param tab_ptr   pointer to the array to grow
  296.  * @param nb_ptr    pointer to the number of elements in the array
  297.  * @param elem_size size in bytes of the elements in the array
  298.  * @param elem_data pointer to the data of the element to add. If NULL, the space of
  299.  *                  the new added element is not filled.
  300.  * @return          pointer to the data of the element to copy in the new allocated space.
  301.  *                  If NULL, the new allocated space is left uninitialized."
  302.  * @see av_dynarray_add()
  303.  */
  304. void *av_dynarray2_add(void **tab_ptr, int *nb_ptr, size_t elem_size,
  305.                        const uint8_t *elem_data);
  306.  
  307. /**
  308.  * Multiply two size_t values checking for overflow.
  309.  * @return  0 if success, AVERROR(EINVAL) if overflow.
  310.  */
  311. static inline int av_size_mult(size_t a, size_t b, size_t *r)
  312. {
  313.     size_t t = a * b;
  314.     /* Hack inspired from glibc: only try the division if nelem and elsize
  315.      * are both greater than sqrt(SIZE_MAX). */
  316.     if ((a | b) >= ((size_t)1 << (sizeof(size_t) * 4)) && a && t / a != b)
  317.         return AVERROR(EINVAL);
  318.     *r = t;
  319.     return 0;
  320. }
  321.  
  322. /**
  323.  * Set the maximum size that may me allocated in one block.
  324.  */
  325. void av_max_alloc(size_t max);
  326.  
  327. /**
  328.  * deliberately overlapping memcpy implementation
  329.  * @param dst destination buffer
  330.  * @param back how many bytes back we start (the initial size of the overlapping window), must be > 0
  331.  * @param cnt number of bytes to copy, must be >= 0
  332.  *
  333.  * cnt > back is valid, this will copy the bytes we just copied,
  334.  * thus creating a repeating pattern with a period length of back.
  335.  */
  336. void av_memcpy_backptr(uint8_t *dst, int back, int cnt);
  337.  
  338. /**
  339.  * @}
  340.  */
  341.  
  342. #endif /* AVUTIL_MEM_H */
  343.