Commit 6544f48f authored by Zuxy Meng's avatar Zuxy Meng Committed by Benoit Fouet

Pure, const and malloc attributes to libavutil.

Patch by Zuxy Meng: zuxy meng gmail com
Original thread:
[FFmpeg-devel] [PATCH] Pure, const and malloc attributes to libavutil
Date: 03/18/2008 6:09 AM

Originally committed as revision 12489 to svn://svn.ffmpeg.org/ffmpeg/trunk
parent 38c669d8
...@@ -24,6 +24,6 @@ ...@@ -24,6 +24,6 @@
#include <stdint.h> #include <stdint.h>
unsigned long av_adler32_update(unsigned long adler, const uint8_t *buf, unsigned long av_adler32_update(unsigned long adler, const uint8_t *buf,
unsigned int len); unsigned int len) av_pure;
#endif /* FFMPEG_ADLER32_H */ #endif /* FFMPEG_ADLER32_H */
...@@ -40,7 +40,7 @@ ...@@ -40,7 +40,7 @@
# define LEGACY_REGS "=q" # define LEGACY_REGS "=q"
#endif #endif
static av_always_inline uint16_t bswap_16(uint16_t x) static av_always_inline av_const uint16_t bswap_16(uint16_t x)
{ {
#if defined(ARCH_X86) #if defined(ARCH_X86)
__asm("rorw $8, %0" : __asm("rorw $8, %0" :
...@@ -54,7 +54,7 @@ static av_always_inline uint16_t bswap_16(uint16_t x) ...@@ -54,7 +54,7 @@ static av_always_inline uint16_t bswap_16(uint16_t x)
return x; return x;
} }
static av_always_inline uint32_t bswap_32(uint32_t x) static av_always_inline av_const uint32_t bswap_32(uint32_t x)
{ {
#if defined(ARCH_X86) #if defined(ARCH_X86)
#ifdef HAVE_BSWAP #ifdef HAVE_BSWAP
...@@ -93,7 +93,7 @@ static av_always_inline uint32_t bswap_32(uint32_t x) ...@@ -93,7 +93,7 @@ static av_always_inline uint32_t bswap_32(uint32_t x)
return x; return x;
} }
static inline uint64_t bswap_64(uint64_t x) static inline uint64_t av_const bswap_64(uint64_t x)
{ {
#if 0 #if 0
x= ((x<< 8)&0xFF00FF00FF00FF00ULL) | ((x>> 8)&0x00FF00FF00FF00FFULL); x= ((x<< 8)&0xFF00FF00FF00FF00ULL) | ((x>> 8)&0x00FF00FF00FF00FFULL);
......
...@@ -57,6 +57,22 @@ ...@@ -57,6 +57,22 @@
#endif #endif
#endif #endif
#ifndef av_pure
#if defined(__GNUC__) && (__GNUC__ > 3 || __GNUC__ == 3 && __GNUC_MINOR__ > 0)
# define av_pure __attribute__((pure))
#else
# define av_pure
#endif
#endif
#ifndef av_const
#if defined(__GNUC__) && (__GNUC__ > 2 || __GNUC__ == 2 && __GNUC_MINOR__ > 5)
# define av_const __attribute__((const))
#else
# define av_const
#endif
#endif
#ifdef HAVE_AV_CONFIG_H #ifdef HAVE_AV_CONFIG_H
# include "internal.h" # include "internal.h"
#endif /* HAVE_AV_CONFIG_H */ #endif /* HAVE_AV_CONFIG_H */
...@@ -94,7 +110,7 @@ ...@@ -94,7 +110,7 @@
/* misc math functions */ /* misc math functions */
extern const uint8_t ff_log2_tab[256]; extern const uint8_t ff_log2_tab[256];
static inline int av_log2(unsigned int v) static inline av_const int av_log2(unsigned int v)
{ {
int n = 0; int n = 0;
if (v & 0xffff0000) { if (v & 0xffff0000) {
...@@ -110,7 +126,7 @@ static inline int av_log2(unsigned int v) ...@@ -110,7 +126,7 @@ static inline int av_log2(unsigned int v)
return n; return n;
} }
static inline int av_log2_16bit(unsigned int v) static inline av_const int av_log2_16bit(unsigned int v)
{ {
int n = 0; int n = 0;
if (v & 0xff00) { if (v & 0xff00) {
...@@ -123,7 +139,7 @@ static inline int av_log2_16bit(unsigned int v) ...@@ -123,7 +139,7 @@ static inline int av_log2_16bit(unsigned int v)
} }
/* median of 3 */ /* median of 3 */
static inline int mid_pred(int a, int b, int c) static inline av_const int mid_pred(int a, int b, int c)
{ {
#ifdef HAVE_CMOV #ifdef HAVE_CMOV
int i=b; int i=b;
...@@ -170,7 +186,7 @@ static inline int mid_pred(int a, int b, int c) ...@@ -170,7 +186,7 @@ static inline int mid_pred(int a, int b, int c)
* @param amax maximum value of the clip range * @param amax maximum value of the clip range
* @return clipped value * @return clipped value
*/ */
static inline int av_clip(int a, int amin, int amax) static inline av_const int av_clip(int a, int amin, int amax)
{ {
if (a < amin) return amin; if (a < amin) return amin;
else if (a > amax) return amax; else if (a > amax) return amax;
...@@ -182,7 +198,7 @@ static inline int av_clip(int a, int amin, int amax) ...@@ -182,7 +198,7 @@ static inline int av_clip(int a, int amin, int amax)
* @param a value to clip * @param a value to clip
* @return clipped value * @return clipped value
*/ */
static inline uint8_t av_clip_uint8(int a) static inline av_const uint8_t av_clip_uint8(int a)
{ {
if (a&(~255)) return (-a)>>31; if (a&(~255)) return (-a)>>31;
else return a; else return a;
...@@ -193,19 +209,19 @@ static inline uint8_t av_clip_uint8(int a) ...@@ -193,19 +209,19 @@ static inline uint8_t av_clip_uint8(int a)
* @param a value to clip * @param a value to clip
* @return clipped value * @return clipped value
*/ */
static inline int16_t av_clip_int16(int a) static inline av_const int16_t av_clip_int16(int a)
{ {
if ((a+32768) & ~65535) return (a>>31) ^ 32767; if ((a+32768) & ~65535) return (a>>31) ^ 32767;
else return a; else return a;
} }
/* math */ /* math */
int64_t ff_gcd(int64_t a, int64_t b); int64_t av_const ff_gcd(int64_t a, int64_t b);
/** /**
* converts fourcc string to int * converts fourcc string to int
*/ */
static inline int ff_get_fourcc(const char *s){ static inline av_pure int ff_get_fourcc(const char *s){
#ifdef HAVE_AV_CONFIG_H #ifdef HAVE_AV_CONFIG_H
assert( strlen(s)==4 ); assert( strlen(s)==4 );
#endif #endif
......
...@@ -37,7 +37,7 @@ typedef enum { ...@@ -37,7 +37,7 @@ typedef enum {
int av_crc_init(AVCRC *ctx, int le, int bits, uint32_t poly, int ctx_size); int av_crc_init(AVCRC *ctx, int le, int bits, uint32_t poly, int ctx_size);
const AVCRC *av_crc_get_table(AVCRCId crc_id); const AVCRC *av_crc_get_table(AVCRCId crc_id);
uint32_t av_crc(const AVCRC *ctx, uint32_t start_crc, const uint8_t *buffer, size_t length); uint32_t av_crc(const AVCRC *ctx, uint32_t start_crc, const uint8_t *buffer, size_t length) av_pure;
#endif /* FFMPEG_CRC_H */ #endif /* FFMPEG_CRC_H */
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/ */
#include <inttypes.h> #include <inttypes.h>
#include "common.h"
#include "des.h" #include "des.h"
#define T(a, b, c, d, e, f, g, h) 64-a,64-b,64-c,64-d,64-e,64-f,64-g,64-h #define T(a, b, c, d, e, f, g, h) 64-a,64-b,64-c,64-d,64-e,64-f,64-g,64-h
......
...@@ -34,6 +34,6 @@ ...@@ -34,6 +34,6 @@
* If your input data is in 8-bit blocks treat it as big-endian * If your input data is in 8-bit blocks treat it as big-endian
* (use e.g. AV_RB64 and AV_WB64). * (use e.g. AV_RB64 and AV_WB64).
*/ */
uint64_t ff_des_encdec(uint64_t in, uint64_t key, int decrypt); uint64_t ff_des_encdec(uint64_t in, uint64_t key, int decrypt) av_const;
#endif /* FFMPEG_DES_H */ #endif /* FFMPEG_DES_H */
...@@ -36,26 +36,26 @@ typedef struct AVInteger{ ...@@ -36,26 +36,26 @@ typedef struct AVInteger{
uint16_t v[AV_INTEGER_SIZE]; uint16_t v[AV_INTEGER_SIZE];
} AVInteger; } AVInteger;
AVInteger av_add_i(AVInteger a, AVInteger b); AVInteger av_add_i(AVInteger a, AVInteger b) av_const;
AVInteger av_sub_i(AVInteger a, AVInteger b); AVInteger av_sub_i(AVInteger a, AVInteger b) av_const;
/** /**
* returns the rounded down value of the logarithm of base 2 of the given AVInteger. * returns the rounded down value of the logarithm of base 2 of the given AVInteger.
* this is simply the index of the most significant bit which is 1. Or 0 of all bits are 0 * this is simply the index of the most significant bit which is 1. Or 0 of all bits are 0
*/ */
int av_log2_i(AVInteger a); int av_log2_i(AVInteger a) av_const;
AVInteger av_mul_i(AVInteger a, AVInteger b); AVInteger av_mul_i(AVInteger a, AVInteger b) av_const;
/** /**
* returns 0 if a==b, 1 if a>b and -1 if a<b. * returns 0 if a==b, 1 if a>b and -1 if a<b.
*/ */
int av_cmp_i(AVInteger a, AVInteger b); int av_cmp_i(AVInteger a, AVInteger b) av_const;
/** /**
* bitwise shift. * bitwise shift.
* @param s the number of bits by which the value should be shifted right, may be negative for shifting left * @param s the number of bits by which the value should be shifted right, may be negative for shifting left
*/ */
AVInteger av_shr_i(AVInteger a, int s); AVInteger av_shr_i(AVInteger a, int s) av_const;
/** /**
* returns a % b. * returns a % b.
...@@ -66,18 +66,18 @@ AVInteger av_mod_i(AVInteger *quot, AVInteger a, AVInteger b); ...@@ -66,18 +66,18 @@ AVInteger av_mod_i(AVInteger *quot, AVInteger a, AVInteger b);
/** /**
* returns a/b. * returns a/b.
*/ */
AVInteger av_div_i(AVInteger a, AVInteger b); AVInteger av_div_i(AVInteger a, AVInteger b) av_const;
/** /**
* converts the given int64_t to an AVInteger. * converts the given int64_t to an AVInteger.
*/ */
AVInteger av_int2i(int64_t a); AVInteger av_int2i(int64_t a) av_const;
/** /**
* converts the given AVInteger to an int64_t. * converts the given AVInteger to an int64_t.
* if the AVInteger is too large to fit into an int64_t, * if the AVInteger is too large to fit into an int64_t,
* then only the least significant 64bit will be used * then only the least significant 64bit will be used
*/ */
int64_t av_i2int(AVInteger a); int64_t av_i2int(AVInteger a) av_const;
#endif /* FFMPEG_INTEGER_H */ #endif /* FFMPEG_INTEGER_H */
...@@ -172,7 +172,7 @@ extern const uint8_t ff_sqrt_tab[256]; ...@@ -172,7 +172,7 @@ extern const uint8_t ff_sqrt_tab[256];
static inline int av_log2_16bit(unsigned int v); static inline int av_log2_16bit(unsigned int v);
static inline unsigned int ff_sqrt(unsigned int a) static inline av_const unsigned int ff_sqrt(unsigned int a)
{ {
unsigned int b; unsigned int b;
...@@ -267,35 +267,35 @@ if((y)<(x)){\ ...@@ -267,35 +267,35 @@ if((y)<(x)){\
} }
#ifndef HAVE_LLRINT #ifndef HAVE_LLRINT
static av_always_inline long long llrint(double x) static av_always_inline av_const long long llrint(double x)
{ {
return rint(x); return rint(x);
} }
#endif /* HAVE_LLRINT */ #endif /* HAVE_LLRINT */
#ifndef HAVE_LRINT #ifndef HAVE_LRINT
static av_always_inline long int lrint(double x) static av_always_inline av_const long int lrint(double x)
{ {
return rint(x); return rint(x);
} }
#endif /* HAVE_LRINT */ #endif /* HAVE_LRINT */
#ifndef HAVE_LRINTF #ifndef HAVE_LRINTF
static av_always_inline long int lrintf(float x) static av_always_inline av_const long int lrintf(float x)
{ {
return (int)(rint(x)); return (int)(rint(x));
} }
#endif /* HAVE_LRINTF */ #endif /* HAVE_LRINTF */
#ifndef HAVE_ROUND #ifndef HAVE_ROUND
static av_always_inline double round(double x) static av_always_inline av_const double round(double x)
{ {
return (x > 0) ? floor(x + 0.5) : ceil(x - 0.5); return (x > 0) ? floor(x + 0.5) : ceil(x - 0.5);
} }
#endif /* HAVE_ROUND */ #endif /* HAVE_ROUND */
#ifndef HAVE_ROUNDF #ifndef HAVE_ROUNDF
static av_always_inline float roundf(float x) static av_always_inline av_const float roundf(float x)
{ {
return (x > 0) ? floor(x + 0.5) : ceil(x - 0.5); return (x > 0) ? floor(x + 0.5) : ceil(x - 0.5);
} }
......
...@@ -30,11 +30,11 @@ typedef struct AVExtFloat { ...@@ -30,11 +30,11 @@ typedef struct AVExtFloat {
uint8_t mantissa[8]; uint8_t mantissa[8];
} AVExtFloat; } AVExtFloat;
double av_int2dbl(int64_t v); double av_int2dbl(int64_t v) av_const;
float av_int2flt(int32_t v); float av_int2flt(int32_t v) av_const;
double av_ext2dbl(const AVExtFloat ext); double av_ext2dbl(const AVExtFloat ext) av_const;
int64_t av_dbl2int(double d); int64_t av_dbl2int(double d) av_const;
int32_t av_flt2int(float d); int32_t av_flt2int(float d) av_const;
AVExtFloat av_dbl2ext(double d); AVExtFloat av_dbl2ext(double d) av_const;
#endif /* FFMPEG_INTFLOAT_READWRITE_H */ #endif /* FFMPEG_INTFLOAT_READWRITE_H */
...@@ -36,17 +36,17 @@ enum AVRounding { ...@@ -36,17 +36,17 @@ enum AVRounding {
* rescale a 64bit integer with rounding to nearest. * rescale a 64bit integer with rounding to nearest.
* a simple a*b/c isn't possible as it can overflow * a simple a*b/c isn't possible as it can overflow
*/ */
int64_t av_rescale(int64_t a, int64_t b, int64_t c); int64_t av_rescale(int64_t a, int64_t b, int64_t c) av_const;
/** /**
* rescale a 64bit integer with specified rounding. * rescale a 64bit integer with specified rounding.
* a simple a*b/c isn't possible as it can overflow * a simple a*b/c isn't possible as it can overflow
*/ */
int64_t av_rescale_rnd(int64_t a, int64_t b, int64_t c, enum AVRounding); int64_t av_rescale_rnd(int64_t a, int64_t b, int64_t c, enum AVRounding) av_const;
/** /**
* rescale a 64bit integer by 2 rational numbers. * rescale a 64bit integer by 2 rational numbers.
*/ */
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq); int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq) av_const;
#endif /* FFMPEG_MATHEMATICS_H */ #endif /* FFMPEG_MATHEMATICS_H */
...@@ -42,6 +42,12 @@ ...@@ -42,6 +42,12 @@
#define DECLARE_ASM_CONST(n,t,v) static const t v #define DECLARE_ASM_CONST(n,t,v) static const t v
#endif #endif
#ifdef __GNUC__
#define av_malloc_attrib __attribute__((__malloc__))
#else
#define av_malloc_attrib
#endif
/** /**
* Allocate a block of \p size bytes with alignment suitable for all * Allocate a block of \p size bytes with alignment suitable for all
* memory accesses (including vectors if available on the CPU). * memory accesses (including vectors if available on the CPU).
...@@ -50,7 +56,7 @@ ...@@ -50,7 +56,7 @@
* it. * it.
* @see av_mallocz() * @see av_mallocz()
*/ */
void *av_malloc(unsigned int size); void *av_malloc(unsigned int size) av_malloc_attrib;
/** /**
* Allocate or reallocate a block of memory. * Allocate or reallocate a block of memory.
...@@ -85,7 +91,7 @@ void av_free(void *ptr); ...@@ -85,7 +91,7 @@ void av_free(void *ptr);
* it. * it.
* @see av_malloc() * @see av_malloc()
*/ */
void *av_mallocz(unsigned int size); void *av_mallocz(unsigned int size) av_malloc_attrib;
/** /**
* Duplicate the string \p s. * Duplicate the string \p s.
...@@ -93,7 +99,7 @@ void *av_mallocz(unsigned int size); ...@@ -93,7 +99,7 @@ void *av_mallocz(unsigned int size);
* @return Pointer to a newly allocated string containing a * @return Pointer to a newly allocated string containing a
* copy of \p s or NULL if it cannot be allocated. * copy of \p s or NULL if it cannot be allocated.
*/ */
char *av_strdup(const char *s); char *av_strdup(const char *s) av_malloc_attrib;
/** /**
* Free a memory block which has been allocated with av_malloc(z)() or * Free a memory block which has been allocated with av_malloc(z)() or
......
...@@ -78,7 +78,7 @@ int av_reduce(int *dst_nom, int *dst_den, int64_t nom, int64_t den, int64_t max) ...@@ -78,7 +78,7 @@ int av_reduce(int *dst_nom, int *dst_den, int64_t nom, int64_t den, int64_t max)
* @param c second rational. * @param c second rational.
* @return b*c. * @return b*c.
*/ */
AVRational av_mul_q(AVRational b, AVRational c); AVRational av_mul_q(AVRational b, AVRational c) av_const;
/** /**
* Divides one rational by another. * Divides one rational by another.
...@@ -86,7 +86,7 @@ AVRational av_mul_q(AVRational b, AVRational c); ...@@ -86,7 +86,7 @@ AVRational av_mul_q(AVRational b, AVRational c);
* @param c second rational. * @param c second rational.
* @return b/c. * @return b/c.
*/ */
AVRational av_div_q(AVRational b, AVRational c); AVRational av_div_q(AVRational b, AVRational c) av_const;
/** /**
* Adds two rationals. * Adds two rationals.
...@@ -94,7 +94,7 @@ AVRational av_div_q(AVRational b, AVRational c); ...@@ -94,7 +94,7 @@ AVRational av_div_q(AVRational b, AVRational c);
* @param c second rational. * @param c second rational.
* @return b+c. * @return b+c.
*/ */
AVRational av_add_q(AVRational b, AVRational c); AVRational av_add_q(AVRational b, AVRational c) av_const;
/** /**
* Subtracts one rational from another. * Subtracts one rational from another.
...@@ -102,7 +102,7 @@ AVRational av_add_q(AVRational b, AVRational c); ...@@ -102,7 +102,7 @@ AVRational av_add_q(AVRational b, AVRational c);
* @param c second rational. * @param c second rational.
* @return b-c. * @return b-c.
*/ */
AVRational av_sub_q(AVRational b, AVRational c); AVRational av_sub_q(AVRational b, AVRational c) av_const;
/** /**
* Converts a double precision floating point number to a rational. * Converts a double precision floating point number to a rational.
...@@ -110,6 +110,6 @@ AVRational av_sub_q(AVRational b, AVRational c); ...@@ -110,6 +110,6 @@ AVRational av_sub_q(AVRational b, AVRational c);
* @param max the maximum allowed numerator and denominator * @param max the maximum allowed numerator and denominator
* @return (AVRational) d. * @return (AVRational) d.
*/ */
AVRational av_d2q(double d, int max); AVRational av_d2q(double d, int max) av_const;
#endif /* FFMPEG_RATIONAL_H */ #endif /* FFMPEG_RATIONAL_H */
...@@ -32,7 +32,7 @@ typedef struct SoftFloat{ ...@@ -32,7 +32,7 @@ typedef struct SoftFloat{
int32_t mant; int32_t mant;
}SoftFloat; }SoftFloat;
static SoftFloat av_normalize_sf(SoftFloat a){ static av_const SoftFloat av_normalize_sf(SoftFloat a){
if(a.mant){ if(a.mant){
#if 1 #if 1
while((a.mant + 0x20000000U)<0x40000000U){ while((a.mant + 0x20000000U)<0x40000000U){
...@@ -54,7 +54,7 @@ static SoftFloat av_normalize_sf(SoftFloat a){ ...@@ -54,7 +54,7 @@ static SoftFloat av_normalize_sf(SoftFloat a){
return a; return a;
} }
static inline SoftFloat av_normalize1_sf(SoftFloat a){ static inline av_const SoftFloat av_normalize1_sf(SoftFloat a){
#if 1 #if 1
if(a.mant + 0x40000000 < 0){ if(a.mant + 0x40000000 < 0){
a.exp++; a.exp++;
...@@ -76,7 +76,7 @@ static inline SoftFloat av_normalize1_sf(SoftFloat a){ ...@@ -76,7 +76,7 @@ static inline SoftFloat av_normalize1_sf(SoftFloat a){
* normalized then the output wont be worse then the other input * normalized then the output wont be worse then the other input
* if both are normalized then the output will be normalized * if both are normalized then the output will be normalized
*/ */
static inline SoftFloat av_mul_sf(SoftFloat a, SoftFloat b){ static inline av_const SoftFloat av_mul_sf(SoftFloat a, SoftFloat b){
a.exp += b.exp; a.exp += b.exp;
a.mant = (a.mant * (int64_t)b.mant) >> ONE_BITS; a.mant = (a.mant * (int64_t)b.mant) >> ONE_BITS;
return av_normalize1_sf(a); return av_normalize1_sf(a);
...@@ -87,31 +87,31 @@ static inline SoftFloat av_mul_sf(SoftFloat a, SoftFloat b){ ...@@ -87,31 +87,31 @@ static inline SoftFloat av_mul_sf(SoftFloat a, SoftFloat b){
* b has to be normalized and not zero * b has to be normalized and not zero
* @return will not be more denormalized then a * @return will not be more denormalized then a
*/ */
static SoftFloat av_div_sf(SoftFloat a, SoftFloat b){ static av_const SoftFloat av_div_sf(SoftFloat a, SoftFloat b){
a.exp -= b.exp+1; a.exp -= b.exp+1;
a.mant = ((int64_t)a.mant<<(ONE_BITS+1)) / b.mant; a.mant = ((int64_t)a.mant<<(ONE_BITS+1)) / b.mant;
return av_normalize1_sf(a); return av_normalize1_sf(a);
} }
static inline int av_cmp_sf(SoftFloat a, SoftFloat b){ static inline av_const int av_cmp_sf(SoftFloat a, SoftFloat b){
int t= a.exp - b.exp; int t= a.exp - b.exp;
if(t<0) return (a.mant >> (-t)) - b.mant ; if(t<0) return (a.mant >> (-t)) - b.mant ;
else return a.mant - (b.mant >> t); else return a.mant - (b.mant >> t);
} }
static inline SoftFloat av_add_sf(SoftFloat a, SoftFloat b){ static inline av_const SoftFloat av_add_sf(SoftFloat a, SoftFloat b){
int t= a.exp