| 
									
										
										
										
											2006-09-10 14:02:42 +00:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at> | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2006-10-07 15:30:46 +00:00
										 |  |  |  * This file is part of FFmpeg. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * FFmpeg is free software; you can redistribute it and/or | 
					
						
							| 
									
										
										
										
											2006-09-10 14:02:42 +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. | 
					
						
							| 
									
										
										
										
											2006-09-10 14:02:42 +00:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2006-10-07 15:30:46 +00:00
										 |  |  |  * FFmpeg is distributed in the hope that it will be useful, | 
					
						
							| 
									
										
										
										
											2006-09-10 14:02:42 +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-09-10 14:02:42 +00:00
										 |  |  |  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-07-16 16:32:48 +00:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @file internal.h | 
					
						
							|  |  |  |  * common internal api header. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifndef INTERNAL_H
 | 
					
						
							|  |  |  | #define INTERNAL_H
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-12-06 21:27:08 +00:00
										 |  |  | #ifndef attribute_used
 | 
					
						
							|  |  |  | #if defined(__GNUC__) && (__GNUC__ > 3 || __GNUC__ == 3 && __GNUC_MINOR__ > 0)
 | 
					
						
							|  |  |  | #    define attribute_used __attribute__((used))
 | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  | #    define attribute_used
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-12-06 23:23:20 +00:00
										 |  |  | #ifndef M_PI
 | 
					
						
							|  |  |  | #define M_PI    3.14159265358979323846
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifndef INT16_MIN
 | 
					
						
							|  |  |  | #define INT16_MIN       (-0x7fff-1)
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifndef INT16_MAX
 | 
					
						
							|  |  |  | #define INT16_MAX       0x7fff
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifndef INT32_MIN
 | 
					
						
							|  |  |  | #define INT32_MIN       (-0x7fffffff-1)
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifndef INT32_MAX
 | 
					
						
							|  |  |  | #define INT32_MAX       0x7fffffff
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifndef UINT32_MAX
 | 
					
						
							|  |  |  | #define UINT32_MAX      0xffffffff
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifndef INT64_MIN
 | 
					
						
							|  |  |  | #define INT64_MIN       (-0x7fffffffffffffffLL-1)
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifndef INT64_MAX
 | 
					
						
							| 
									
										
										
										
											2006-12-06 23:46:11 +00:00
										 |  |  | #define INT64_MAX INT64_C(9223372036854775807)
 | 
					
						
							| 
									
										
										
										
											2006-12-06 23:23:20 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifndef UINT64_MAX
 | 
					
						
							| 
									
										
										
										
											2006-12-06 23:46:11 +00:00
										 |  |  | #define UINT64_MAX UINT64_C(0xFFFFFFFFFFFFFFFF)
 | 
					
						
							| 
									
										
										
										
											2006-12-06 23:23:20 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifndef INT_BIT
 | 
					
						
							|  |  |  | #    if INT_MAX != 2147483647
 | 
					
						
							|  |  |  | #        define INT_BIT 64
 | 
					
						
							|  |  |  | #    else
 | 
					
						
							|  |  |  | #        define INT_BIT 32
 | 
					
						
							|  |  |  | #    endif
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-07-16 16:32:48 +00:00
										 |  |  | #if ( defined(__PIC__) || defined(__pic__) ) && ! defined(PIC)
 | 
					
						
							|  |  |  | #    define PIC
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-12-03 16:35:30 +00:00
										 |  |  | #include "intreadwrite.h"
 | 
					
						
							| 
									
										
										
										
											2006-07-21 19:36:59 +00:00
										 |  |  | #include "bswap.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-07-16 16:32:48 +00:00
										 |  |  | #include <stddef.h>
 | 
					
						
							|  |  |  | #ifndef offsetof
 | 
					
						
							| 
									
										
										
										
											2006-11-14 03:35:50 +00:00
										 |  |  | #    define offsetof(T,F) ((unsigned int)((char *)&((T *)0)->F))
 | 
					
						
							| 
									
										
										
										
											2006-07-16 16:32:48 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef __MINGW32__
 | 
					
						
							|  |  |  | #    ifdef _DEBUG
 | 
					
						
							|  |  |  | #        define DEBUG
 | 
					
						
							|  |  |  | #    endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #    define snprintf _snprintf
 | 
					
						
							|  |  |  | #    define vsnprintf _vsnprintf
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* __MINGW32__ end */ | 
					
						
							|  |  |  | #elif defined (CONFIG_OS2)
 | 
					
						
							|  |  |  | /* OS/2 EMX */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-11-14 03:35:50 +00:00
										 |  |  | #    include <float.h>
 | 
					
						
							| 
									
										
										
										
											2006-07-16 16:32:48 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #endif /* !__MINGW32__ && CONFIG_OS2 */
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-11-14 03:35:50 +00:00
										 |  |  | #ifdef USE_FASTMEMCPY
 | 
					
						
							|  |  |  | #    include "libvo/fastmemcpy.h"
 | 
					
						
							| 
									
										
										
										
											2007-06-05 14:33:27 +00:00
										 |  |  | #    define memcpy(a,b,c) fast_memcpy(a,b,c)
 | 
					
						
							| 
									
										
										
										
											2006-11-14 03:35:50 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2006-07-16 16:32:48 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | // Use rip-relative addressing if compiling PIC code on x86-64.
 | 
					
						
							| 
									
										
										
										
											2006-11-14 03:35:50 +00:00
										 |  |  | #if defined(__MINGW32__) || defined(__CYGWIN__) || \
 | 
					
						
							|  |  |  |     defined(__OS2__) || (defined (__OpenBSD__) && !defined(__ELF__)) | 
					
						
							|  |  |  | #    if defined(ARCH_X86_64) && defined(PIC)
 | 
					
						
							|  |  |  | #        define MANGLE(a) "_" #a"(%%rip)"
 | 
					
						
							| 
									
										
										
										
											2006-07-16 16:32:48 +00:00
										 |  |  | #    else
 | 
					
						
							| 
									
										
										
										
											2006-11-14 03:35:50 +00:00
										 |  |  | #        define MANGLE(a) "_" #a
 | 
					
						
							| 
									
										
										
										
											2006-07-16 16:32:48 +00:00
										 |  |  | #    endif
 | 
					
						
							| 
									
										
										
										
											2006-11-14 03:35:50 +00:00
										 |  |  | #else
 | 
					
						
							|  |  |  | #    if defined(ARCH_X86_64) && defined(PIC)
 | 
					
						
							|  |  |  | #        define MANGLE(a) #a"(%%rip)"
 | 
					
						
							|  |  |  | #    elif defined(CONFIG_DARWIN)
 | 
					
						
							|  |  |  | #        define MANGLE(a) "_" #a
 | 
					
						
							|  |  |  | #    else
 | 
					
						
							|  |  |  | #        define MANGLE(a) #a
 | 
					
						
							|  |  |  | #    endif
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2006-07-16 16:32:48 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* debug stuff */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-11-14 03:35:50 +00:00
										 |  |  | #if !defined(DEBUG) && !defined(NDEBUG)
 | 
					
						
							|  |  |  | #    define NDEBUG
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #include <assert.h>
 | 
					
						
							| 
									
										
										
										
											2006-07-16 16:32:48 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* dprintf macros */ | 
					
						
							| 
									
										
										
										
											2006-11-14 03:35:50 +00:00
										 |  |  | #ifdef DEBUG
 | 
					
						
							| 
									
										
										
										
											2007-03-12 12:36:41 +00:00
										 |  |  | #    define dprintf(pctx, ...) av_log(pctx, AV_LOG_DEBUG, __VA_ARGS__)
 | 
					
						
							| 
									
										
										
										
											2006-11-14 03:35:50 +00:00
										 |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2007-03-12 12:36:41 +00:00
										 |  |  | #    define dprintf(pctx, ...)
 | 
					
						
							| 
									
										
										
										
											2006-11-14 03:35:50 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2006-07-16 16:32:48 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-11-14 03:35:50 +00:00
										 |  |  | #define av_abort()      do { av_log(NULL, AV_LOG_ERROR, "Abort at %s:%d\n", __FILE__, __LINE__); abort(); } while (0)
 | 
					
						
							| 
									
										
										
										
											2006-07-16 16:32:48 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-11-14 21:57:27 +00:00
										 |  |  | /* math */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-11-12 18:49:36 +00:00
										 |  |  | extern const uint32_t ff_inverse[256]; | 
					
						
							| 
									
										
										
										
											2006-07-16 16:32:48 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-11-01 18:34:40 +00:00
										 |  |  | #if defined(ARCH_X86)
 | 
					
						
							| 
									
										
										
										
											2006-07-16 16:32:48 +00:00
										 |  |  | #    define FASTDIV(a,b) \
 | 
					
						
							|  |  |  |     ({\ | 
					
						
							|  |  |  |         int ret,dmy;\ | 
					
						
							|  |  |  |         asm volatile(\ | 
					
						
							|  |  |  |             "mull %3"\ | 
					
						
							|  |  |  |             :"=d"(ret),"=a"(dmy)\ | 
					
						
							| 
									
										
										
										
											2006-11-12 18:49:36 +00:00
										 |  |  |             :"1"(a),"g"(ff_inverse[b])\ | 
					
						
							| 
									
										
										
										
											2006-07-16 16:32:48 +00:00
										 |  |  |             );\ | 
					
						
							|  |  |  |         ret;\ | 
					
						
							|  |  |  |     }) | 
					
						
							| 
									
										
										
										
											2006-09-28 08:04:16 +00:00
										 |  |  | #elif defined(ARCH_ARMV4L)
 | 
					
						
							|  |  |  | #    define FASTDIV(a,b) \
 | 
					
						
							|  |  |  |     ({\ | 
					
						
							|  |  |  |         int ret,dmy;\ | 
					
						
							|  |  |  |         asm volatile(\ | 
					
						
							|  |  |  |             "umull %1, %0, %2, %3"\ | 
					
						
							|  |  |  |             :"=&r"(ret),"=&r"(dmy)\ | 
					
						
							| 
									
										
										
										
											2006-11-12 18:49:36 +00:00
										 |  |  |             :"r"(a),"r"(ff_inverse[b])\ | 
					
						
							| 
									
										
										
										
											2006-09-28 08:04:16 +00:00
										 |  |  |             );\ | 
					
						
							|  |  |  |         ret;\ | 
					
						
							|  |  |  |     }) | 
					
						
							| 
									
										
										
										
											2006-07-16 16:32:48 +00:00
										 |  |  | #elif defined(CONFIG_FASTDIV)
 | 
					
						
							| 
									
										
										
										
											2006-11-12 18:49:36 +00:00
										 |  |  | #    define FASTDIV(a,b)   ((uint32_t)((((uint64_t)a)*ff_inverse[b])>>32))
 | 
					
						
							| 
									
										
										
										
											2006-07-16 16:32:48 +00:00
										 |  |  | #else
 | 
					
						
							|  |  |  | #    define FASTDIV(a,b)   ((a)/(b))
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-12-07 19:27:00 +00:00
										 |  |  | extern const uint8_t ff_sqrt_tab[128]; | 
					
						
							| 
									
										
										
										
											2006-07-16 16:32:48 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | static inline int ff_sqrt(int a) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     int ret=0; | 
					
						
							| 
									
										
										
										
											2007-05-04 22:35:56 +00:00
										 |  |  |     int s, b; | 
					
						
							| 
									
										
										
										
											2006-07-16 16:32:48 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if(a<128) return ff_sqrt_tab[a]; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-05-04 22:35:56 +00:00
										 |  |  |     for(s=30; s>=0; s-=2){ | 
					
						
							|  |  |  |         ret+=ret; | 
					
						
							|  |  |  |         b= (1+2*ret)<<s; | 
					
						
							| 
									
										
										
										
											2006-07-16 16:32:48 +00:00
										 |  |  |         if(b<=a){ | 
					
						
							| 
									
										
										
										
											2007-05-04 21:22:43 +00:00
										 |  |  |             a-=b; | 
					
						
							| 
									
										
										
										
											2007-05-04 22:35:56 +00:00
										 |  |  |             ret++; | 
					
						
							| 
									
										
										
										
											2006-07-16 16:32:48 +00:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return ret; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-11-01 18:34:40 +00:00
										 |  |  | #if defined(ARCH_X86)
 | 
					
						
							| 
									
										
										
										
											2006-07-16 16:32:48 +00:00
										 |  |  | #define MASK_ABS(mask, level)\
 | 
					
						
							|  |  |  |             asm volatile(\ | 
					
						
							|  |  |  |                 "cdq                    \n\t"\ | 
					
						
							|  |  |  |                 "xorl %1, %0            \n\t"\ | 
					
						
							|  |  |  |                 "subl %1, %0            \n\t"\ | 
					
						
							|  |  |  |                 : "+a" (level), "=&d" (mask)\ | 
					
						
							|  |  |  |             ); | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  | #define MASK_ABS(mask, level)\
 | 
					
						
							|  |  |  |             mask= level>>31;\ | 
					
						
							|  |  |  |             level= (level^mask)-mask; | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-10-20 17:53:19 +00:00
										 |  |  | #ifdef HAVE_CMOV
 | 
					
						
							| 
									
										
										
										
											2006-07-16 16:32:48 +00:00
										 |  |  | #define COPY3_IF_LT(x,y,a,b,c,d)\
 | 
					
						
							|  |  |  | asm volatile (\ | 
					
						
							|  |  |  |     "cmpl %0, %3        \n\t"\ | 
					
						
							|  |  |  |     "cmovl %3, %0       \n\t"\ | 
					
						
							|  |  |  |     "cmovl %4, %1       \n\t"\ | 
					
						
							|  |  |  |     "cmovl %5, %2       \n\t"\ | 
					
						
							| 
									
										
										
										
											2007-04-03 11:21:16 +00:00
										 |  |  |     : "+&r" (x), "+&r" (a), "+r" (c)\ | 
					
						
							| 
									
										
										
										
											2006-07-16 16:32:48 +00:00
										 |  |  |     : "r" (y), "r" (b), "r" (d)\ | 
					
						
							|  |  |  | ); | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  | #define COPY3_IF_LT(x,y,a,b,c,d)\
 | 
					
						
							|  |  |  | if((y)<(x)){\ | 
					
						
							|  |  |  |      (x)=(y);\ | 
					
						
							|  |  |  |      (a)=(b);\ | 
					
						
							|  |  |  |      (c)=(d);\ | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* avoid usage of various functions */ | 
					
						
							|  |  |  | #define malloc please_use_av_malloc
 | 
					
						
							|  |  |  | #define free please_use_av_free
 | 
					
						
							|  |  |  | #define realloc please_use_av_realloc
 | 
					
						
							|  |  |  | #define time time_is_forbidden_due_to_security_issues
 | 
					
						
							|  |  |  | #define rand rand_is_forbidden_due_to_state_trashing
 | 
					
						
							|  |  |  | #define srand srand_is_forbidden_due_to_state_trashing
 | 
					
						
							|  |  |  | #define sprintf sprintf_is_forbidden_due_to_security_issues_use_snprintf
 | 
					
						
							|  |  |  | #define strcat strcat_is_forbidden_due_to_security_issues_use_pstrcat
 | 
					
						
							| 
									
										
										
										
											2007-03-27 21:47:03 +00:00
										 |  |  | #define exit exit_is_forbidden
 | 
					
						
							| 
									
										
										
										
											2006-07-16 16:32:48 +00:00
										 |  |  | #if !(defined(LIBAVFORMAT_BUILD) || defined(_FRAMEHOOK_H))
 | 
					
						
							|  |  |  | #define printf please_use_av_log
 | 
					
						
							|  |  |  | #define fprintf please_use_av_log
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define CHECKED_ALLOCZ(p, size)\
 | 
					
						
							|  |  |  | {\ | 
					
						
							|  |  |  |     p= av_mallocz(size);\ | 
					
						
							|  |  |  |     if(p==NULL && (size)!=0){\ | 
					
						
							|  |  |  |         perror("malloc");\ | 
					
						
							|  |  |  |         goto fail;\ | 
					
						
							|  |  |  |     }\ | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifndef HAVE_LRINTF
 | 
					
						
							|  |  |  | /* XXX: add ISOC specific test to avoid specific BSD testing. */ | 
					
						
							|  |  |  | /* better than nothing implementation. */ | 
					
						
							|  |  |  | /* btw, rintf() is existing on fbsd too -- alex */ | 
					
						
							| 
									
										
										
										
											2006-12-08 00:35:08 +00:00
										 |  |  | static av_always_inline long int lrintf(float x) | 
					
						
							| 
									
										
										
										
											2006-07-16 16:32:48 +00:00
										 |  |  | { | 
					
						
							|  |  |  | #ifdef __MINGW32__
 | 
					
						
							| 
									
										
										
										
											2006-11-01 17:01:33 +00:00
										 |  |  | #  ifdef ARCH_X86_32
 | 
					
						
							| 
									
										
										
										
											2006-07-16 16:32:48 +00:00
										 |  |  |     int32_t i; | 
					
						
							|  |  |  |     asm volatile( | 
					
						
							|  |  |  |         "fistpl %0\n\t" | 
					
						
							|  |  |  |         : "=m" (i) : "t" (x) : "st" | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  |     return i; | 
					
						
							|  |  |  | #  else
 | 
					
						
							|  |  |  |     /* XXX: incorrect, but make it compile */ | 
					
						
							|  |  |  |     return (int)(x + (x < 0 ? -0.5 : 0.5)); | 
					
						
							| 
									
										
										
										
											2006-11-01 17:01:33 +00:00
										 |  |  | #  endif /* ARCH_X86_32 */
 | 
					
						
							| 
									
										
										
										
											2006-07-16 16:32:48 +00:00
										 |  |  | #else
 | 
					
						
							|  |  |  |     return (int)(rint(x)); | 
					
						
							|  |  |  | #endif /* __MINGW32__ */
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | #endif /* HAVE_LRINTF */
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif /* INTERNAL_H */
 |