| @@ -1,6 +1,6 @@ | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2000-2009 Josh Coalson | |||
| * Copyright (C) 2011-2013 Xiph.Org Foundation | |||
| * Copyright (C) 2011-2014 Xiph.Org Foundation | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions | |||
| @@ -1,6 +1,6 @@ | |||
| /* alloc - Convenience routines for safely allocating memory | |||
| * Copyright (C) 2007-2009 Josh Coalson | |||
| * Copyright (C) 2011-2013 Xiph.Org Foundation | |||
| * Copyright (C) 2011-2014 Xiph.Org Foundation | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions | |||
| @@ -33,7 +33,7 @@ | |||
| #ifndef FLAC__SHARE__ALLOC_H | |||
| #define FLAC__SHARE__ALLOC_H | |||
| #if HAVE_CONFIG_H | |||
| #ifdef HAVE_CONFIG_H | |||
| # include <config.h> | |||
| #endif | |||
| @@ -1,6 +1,6 @@ | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2001-2009 Josh Coalson | |||
| * Copyright (C) 2011-2013 Xiph.Org Foundation | |||
| * Copyright (C) 2011-2014 Xiph.Org Foundation | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions | |||
| @@ -1,6 +1,6 @@ | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2004-2009 Josh Coalson | |||
| * Copyright (C) 2011-2013 Xiph.Org Foundation | |||
| * Copyright (C) 2011-2014 Xiph.Org Foundation | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions | |||
| @@ -1,5 +1,5 @@ | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2012 Xiph.org Foundation | |||
| * Copyright (C) 2012-2014 Xiph.org Foundation | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions | |||
| @@ -73,23 +73,25 @@ | |||
| #endif | |||
| #if defined(_MSC_VER) | |||
| #if _MSC_VER < 1500 | |||
| /* Visual Studio 2008 has restrict. */ | |||
| #define restrict __restrict | |||
| #endif | |||
| #define inline __inline | |||
| #endif | |||
| /* adjust for compilers that can't understand using LLU suffix for uint64_t literals */ | |||
| #ifdef _MSC_VER | |||
| #define FLAC__U64L(x) x | |||
| #if defined __INTEL_COMPILER || (defined _MSC_VER && defined _WIN64) | |||
| /* MSVS generates VERY slow 32-bit code with __restrict */ | |||
| #define flac_restrict __restrict | |||
| #elif defined __GNUC__ | |||
| #define flac_restrict __restrict__ | |||
| #else | |||
| #define FLAC__U64L(x) x##LLU | |||
| #define flac_restrict | |||
| #endif | |||
| #define FLAC__U64L(x) x##ULL | |||
| #if defined _MSC_VER || defined __BORLANDC__ || defined __MINGW32__ | |||
| #define FLAC__STRCASECMP stricmp | |||
| #define FLAC__STRNCASECMP strnicmp | |||
| #else | |||
| #define FLAC__STRCASECMP strcasecmp | |||
| #define FLAC__STRNCASECMP strncasecmp | |||
| #endif | |||
| @@ -139,6 +141,7 @@ | |||
| #ifdef _WIN32 | |||
| /* All char* strings are in UTF-8 format. Added to support Unicode files on Windows */ | |||
| #include "win_utf8_io.h" | |||
| #define flac_printf printf_utf8 | |||
| #define flac_fprintf fprintf_utf8 | |||
| @@ -160,12 +163,7 @@ | |||
| #define flac_utime utime | |||
| #define flac_unlink unlink | |||
| #define flac_rename rename | |||
| #ifdef _WIN32 | |||
| #define flac_stat _stat64 | |||
| #else | |||
| #define flac_stat stat | |||
| #endif | |||
| #endif | |||
| @@ -177,8 +175,14 @@ | |||
| #define flac_fstat fstat | |||
| #endif | |||
| #ifndef M_LN2 | |||
| #define M_LN2 0.69314718055994530942 | |||
| #endif | |||
| #ifndef M_PI | |||
| #define M_PI 3.14159265358979323846 | |||
| #endif | |||
| /* FLAC needs to compile and work correctly on systems with a norrmal ISO C99 | |||
| /* FLAC needs to compile and work correctly on systems with a normal ISO C99 | |||
| * snprintf as well as Microsoft Visual Studio which has an non-standards | |||
| * conformant snprint_s function. | |||
| * | |||
| @@ -188,6 +192,7 @@ | |||
| extern "C" { | |||
| #endif | |||
| int flac_snprintf(char *str, size_t size, const char *fmt, ...); | |||
| int flac_vsnprintf(char *str, size_t size, const char *fmt, va_list va); | |||
| #ifdef __cplusplus | |||
| }; | |||
| #endif | |||
| @@ -1,5 +1,5 @@ | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2012 Xiph.org Foundation | |||
| * Copyright (C) 2012-2014 Xiph.org Foundation | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions | |||
| @@ -33,20 +33,46 @@ | |||
| #if HAVE_BSWAP32 /* GCC and Clang */ | |||
| /* GCC prior to 4.8 didn't provide bswap16 on x86_64 */ | |||
| #if ! HAVE_BSWAP16 | |||
| static inline unsigned short __builtin_bswap16(unsigned short a) | |||
| { | |||
| return (a<<8)|(a>>8); | |||
| } | |||
| #endif | |||
| #define ENDSWAP_16(x) (__builtin_bswap16 (x)) | |||
| #define ENDSWAP_32(x) (__builtin_bswap32 (x)) | |||
| #elif defined _MSC_VER /* Windows. Apparently in <stdlib.h>. */ | |||
| #define ENDSWAP_16(x) (_byteswap_ushort (x)) | |||
| #define ENDSWAP_32(x) (_byteswap_ulong (x)) | |||
| #elif defined HAVE_BYTESWAP_H /* Linux */ | |||
| #include <byteswap.h> | |||
| #define ENDSWAP_16(x) (bswap_16 (x)) | |||
| #define ENDSWAP_32(x) (bswap_32 (x)) | |||
| #else | |||
| #define ENDSWAP_32(x) ((((x) >> 24) & 0xFF) + (((x) >> 8) & 0xFF00) + (((x) & 0xFF00) << 8) + (((x) & 0xFF) << 24)) | |||
| #define ENDSWAP_16(x) ((((x) >> 8) & 0xFF) | (((x) & 0xFF) << 8)) | |||
| #define ENDSWAP_32(x) ((((x) >> 24) & 0xFF) | (((x) >> 8) & 0xFF00) | (((x) & 0xFF00) << 8) | (((x) & 0xFF) << 24)) | |||
| #endif | |||
| /* Host to little-endian byte swapping. */ | |||
| #if CPU_IS_BIG_ENDIAN | |||
| #define H2LE_16(x) ENDSWAP_16 (x) | |||
| #define H2LE_32(x) ENDSWAP_32 (x) | |||
| #else | |||
| #define H2LE_16(x) (x) | |||
| #define H2LE_32(x) (x) | |||
| #endif | |||
| @@ -1,6 +1,6 @@ | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2000-2009 Josh Coalson | |||
| * Copyright (C) 2011-2013 Xiph.Org Foundation | |||
| * Copyright (C) 2011-2014 Xiph.Org Foundation | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions | |||
| @@ -61,9 +61,9 @@ | |||
| #elif defined(_MSC_VER) | |||
| #ifdef FLAC_API_EXPORTS | |||
| #define FLAC_API _declspec(dllexport) | |||
| #define FLAC_API __declspec(dllexport) | |||
| #else | |||
| #define FLAC_API _declspec(dllimport) | |||
| #define FLAC_API __declspec(dllimport) | |||
| #endif | |||
| #elif defined(FLAC__USE_VISIBILITY_ATTR) | |||
| @@ -1,6 +1,6 @@ | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2000-2009 Josh Coalson | |||
| * Copyright (C) 2011-2013 Xiph.Org Foundation | |||
| * Copyright (C) 2011-2014 Xiph.Org Foundation | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions | |||
| @@ -509,9 +509,11 @@ typedef enum { | |||
| FLAC__METADATA_TYPE_PICTURE = 6, | |||
| /**< <A HREF="../format.html#metadata_block_picture">PICTURE</A> block */ | |||
| FLAC__METADATA_TYPE_UNDEFINED = 7 | |||
| FLAC__METADATA_TYPE_UNDEFINED = 7, | |||
| /**< marker to denote beginning of undefined type range; this number will increase as new metadata types are added */ | |||
| FLAC__MAX_METADATA_TYPE = FLAC__MAX_METADATA_TYPE_CODE, | |||
| /**< No type will ever be greater than this. There is not enough room in the protocol block. */ | |||
| } FLAC__MetadataType; | |||
| /** Maps a FLAC__MetadataType to a C string. | |||
| @@ -1,6 +1,6 @@ | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2001-2009 Josh Coalson | |||
| * Copyright (C) 2011-2013 Xiph.Org Foundation | |||
| * Copyright (C) 2011-2014 Xiph.Org Foundation | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions | |||
| @@ -30,12 +30,11 @@ | |||
| * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||
| */ | |||
| #if HAVE_CONFIG_H | |||
| #ifdef HAVE_CONFIG_H | |||
| # include <config.h> | |||
| #endif | |||
| #include "include/private/bitmath.h" | |||
| #include "../assert.h" | |||
| /* An example of what FLAC__bitmath_silog2() computes: | |||
| * | |||
| @@ -1,6 +1,6 @@ | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2000-2009 Josh Coalson | |||
| * Copyright (C) 2011-2013 Xiph.Org Foundation | |||
| * Copyright (C) 2011-2014 Xiph.Org Foundation | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions | |||
| @@ -30,7 +30,7 @@ | |||
| * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||
| */ | |||
| #if HAVE_CONFIG_H | |||
| #ifdef HAVE_CONFIG_H | |||
| # include <config.h> | |||
| #endif | |||
| @@ -73,7 +73,6 @@ | |||
| */ | |||
| static const unsigned FLAC__BITREADER_DEFAULT_CAPACITY = 65536u / FLAC__BITS_PER_WORD; /* in words */ | |||
| /* WATCHOUT: assembly routines rely on the order in which these fields are declared */ | |||
| struct FLAC__BitReader { | |||
| /* any partially-consumed word at the head will stay right-justified as bits are consumed from the left */ | |||
| /* any incomplete word at the tail will be left-justified, and bytes from the read callback are added on the right */ | |||
| @@ -87,7 +86,6 @@ struct FLAC__BitReader { | |||
| unsigned crc16_align; /* the number of bits in the current consumed word that should not be CRC'd */ | |||
| FLAC__BitReaderReadCallback read_callback; | |||
| void *client_data; | |||
| FLAC__CPUInfo cpu_info; | |||
| }; | |||
| static inline void crc16_update_word_(FLAC__BitReader *br, uint32_t word) | |||
| @@ -119,8 +117,7 @@ static inline void crc16_update_word_(FLAC__BitReader *br, uint32_t word) | |||
| br->crc16_align = 0; | |||
| } | |||
| /* would be static except it needs to be called by asm routines */ | |||
| FLAC__bool bitreader_read_from_client_(FLAC__BitReader *br) | |||
| static FLAC__bool bitreader_read_from_client_(FLAC__BitReader *br) | |||
| { | |||
| unsigned start, end; | |||
| size_t bytes; | |||
| @@ -231,7 +228,7 @@ void FLAC__bitreader_delete(FLAC__BitReader *br) | |||
| * | |||
| ***********************************************************************/ | |||
| FLAC__bool FLAC__bitreader_init(FLAC__BitReader *br, FLAC__CPUInfo cpu, FLAC__BitReaderReadCallback rcb, void *cd) | |||
| FLAC__bool FLAC__bitreader_init(FLAC__BitReader *br, FLAC__BitReaderReadCallback rcb, void *cd) | |||
| { | |||
| FLAC__ASSERT(0 != br); | |||
| @@ -243,7 +240,6 @@ FLAC__bool FLAC__bitreader_init(FLAC__BitReader *br, FLAC__CPUInfo cpu, FLAC__Bi | |||
| return false; | |||
| br->read_callback = rcb; | |||
| br->client_data = cd; | |||
| br->cpu_info = cpu; | |||
| return true; | |||
| } | |||
| @@ -1048,9 +1044,9 @@ FLAC__bool FLAC__bitreader_read_utf8_uint64(FLAC__BitReader *br, FLAC__uint64 *v | |||
| return true; | |||
| } | |||
| /* These functions a declared inline in this file but are also callable as | |||
| /* These functions are declared inline in this file but are also callable as | |||
| * externs from elsewhere. | |||
| * According to the C99 sepc, section 6.7.4, simply providing a function | |||
| * According to the C99 spec, section 6.7.4, simply providing a function | |||
| * prototype in a header file without 'inline' and making the function inline | |||
| * in this file should be sufficient. | |||
| * Unfortunately, the Microsoft VS compiler doesn't pick them up externally. To | |||
| @@ -1,6 +1,6 @@ | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2000-2009 Josh Coalson | |||
| * Copyright (C) 2011-2013 Xiph.Org Foundation | |||
| * Copyright (C) 2011-2014 Xiph.Org Foundation | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions | |||
| @@ -30,7 +30,7 @@ | |||
| * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||
| */ | |||
| #if HAVE_CONFIG_H | |||
| #ifdef HAVE_CONFIG_H | |||
| # include <config.h> | |||
| #endif | |||
| @@ -47,8 +47,7 @@ | |||
| /* WATCHOUT: if you change this you must also change the following #defines down to SWAP_BE_WORD_TO_HOST below to match */ | |||
| /* WATCHOUT: there are a few places where the code will not work unless uint32_t is >= 32 bits wide */ | |||
| #define FLAC__BYTES_PER_WORD 4 | |||
| #undef FLAC__BITS_PER_WORD | |||
| #define FLAC__BITS_PER_WORD 32 | |||
| #define FLAC__BITS_PER_WORD (8 * FLAC__BYTES_PER_WORD) | |||
| #define FLAC__WORD_ALL_ONES ((FLAC__uint32)0xffffffff) | |||
| /* SWAP_BE_WORD_TO_HOST swaps bytes in a uint32_t (which is always big-endian) if necessary to match host byte order */ | |||
| #if WORDS_BIGENDIAN | |||
| @@ -524,28 +523,6 @@ FLAC__bool FLAC__bitwriter_write_rice_signed_block(FLAC__BitWriter *bw, const FL | |||
| msbits = uval >> parameter; | |||
| #if 0 /* OPT: can remove this special case if it doesn't make up for the extra compare (doesn't make a statistically significant difference with msvc or gcc/x86) */ | |||
| if(bw->bits && bw->bits + msbits + lsbits <= FLAC__BITS_PER_WORD) { /* i.e. if the whole thing fits in the current uint32_t */ | |||
| /* ^^^ if bw->bits is 0 then we may have filled the buffer and have no free uint32_t to work in */ | |||
| bw->bits = bw->bits + msbits + lsbits; | |||
| uval |= mask1; /* set stop bit */ | |||
| uval &= mask2; /* mask off unused top bits */ | |||
| /* NOT: bw->accum <<= msbits + lsbits because msbits+lsbits could be 32, then the shift would be a NOP */ | |||
| bw->accum <<= msbits; | |||
| bw->accum <<= lsbits; | |||
| bw->accum |= uval; | |||
| if(bw->bits == FLAC__BITS_PER_WORD) { | |||
| bw->buffer[bw->words++] = SWAP_BE_WORD_TO_HOST(bw->accum); | |||
| bw->bits = 0; | |||
| /* burying the capacity check down here means we have to grow the buffer a little if there are more vals to do */ | |||
| if(bw->capacity <= bw->words && nvals > 1 && !bitwriter_grow_(bw, 1)) { | |||
| FLAC__ASSERT(bw->capacity == bw->words); | |||
| return false; | |||
| } | |||
| } | |||
| } | |||
| else { | |||
| #elif 1 /*@@@@@@ OPT: try this version with MSVC6 to see if better, not much difference for gcc-4 */ | |||
| if(bw->bits && bw->bits + msbits + lsbits < FLAC__BITS_PER_WORD) { /* i.e. if the whole thing fits in the current uint32_t */ | |||
| /* ^^^ if bw->bits is 0 then we may have filled the buffer and have no free uint32_t to work in */ | |||
| bw->bits = bw->bits + msbits + lsbits; | |||
| @@ -555,7 +532,6 @@ FLAC__bool FLAC__bitwriter_write_rice_signed_block(FLAC__BitWriter *bw, const FL | |||
| bw->accum |= uval; | |||
| } | |||
| else { | |||
| #endif | |||
| /* slightly pessimistic size check but faster than "<= bw->words + (bw->bits+msbits+lsbits+FLAC__BITS_PER_WORD-1)/FLAC__BITS_PER_WORD" */ | |||
| /* OPT: pessimism may cause flurry of false calls to grow_ which eat up all savings before it */ | |||
| if(bw->capacity <= bw->words + bw->bits + msbits + 1/*lsbits always fit in 1 uint32_t*/ && !bitwriter_grow_(bw, msbits+lsbits)) | |||
| @@ -610,9 +586,7 @@ break1: | |||
| bw->buffer[bw->words++] = SWAP_BE_WORD_TO_HOST(bw->accum); | |||
| bw->accum = uval; | |||
| } | |||
| #if 1 | |||
| } | |||
| #endif | |||
| vals++; | |||
| nvals--; | |||
| } | |||
| @@ -853,9 +827,9 @@ FLAC__bool FLAC__bitwriter_zero_pad_to_byte_boundary(FLAC__BitWriter *bw) | |||
| return true; | |||
| } | |||
| /* These functions a declared inline in this file but are also callable as | |||
| /* These functions are declared inline in this file but are also callable as | |||
| * externs from elsewhere. | |||
| * According to the C99 sepc, section 6.7.4, simply providing a function | |||
| * According to the C99 spec, section 6.7.4, simply providing a function | |||
| * prototype in a header file without 'inline' and making the function inline | |||
| * in this file should be sufficient. | |||
| * Unfortunately, the Microsoft VS compiler doesn't pick them up externally. To | |||
| @@ -1,6 +1,6 @@ | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2001-2009 Josh Coalson | |||
| * Copyright (C) 2011-2013 Xiph.Org Foundation | |||
| * Copyright (C) 2011-2014 Xiph.Org Foundation | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions | |||
| @@ -30,47 +30,47 @@ | |||
| * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||
| */ | |||
| #if HAVE_CONFIG_H | |||
| #ifdef HAVE_CONFIG_H | |||
| # include <config.h> | |||
| #endif | |||
| #include "include/private/cpu.h" | |||
| #include <stdlib.h> | |||
| #include <stdio.h> | |||
| #if 0 | |||
| #include <stdlib.h> | |||
| #include <memory.h> | |||
| #include <stdio.h> | |||
| #endif | |||
| #if defined FLAC__CPU_IA32 | |||
| # include <signal.h> | |||
| #elif defined FLAC__CPU_PPC | |||
| # if !defined FLAC__NO_ASM | |||
| # if defined FLAC__SYS_DARWIN | |||
| # include <sys/sysctl.h> | |||
| # include <mach/mach.h> | |||
| # include <mach/mach_host.h> | |||
| # include <mach/host_info.h> | |||
| # include <mach/machine.h> | |||
| # ifndef CPU_SUBTYPE_POWERPC_970 | |||
| # define CPU_SUBTYPE_POWERPC_970 ((cpu_subtype_t) 100) | |||
| # endif | |||
| # else /* FLAC__SYS_DARWIN */ | |||
| # include <signal.h> | |||
| # include <setjmp.h> | |||
| static sigjmp_buf jmpbuf; | |||
| static volatile sig_atomic_t canjump = 0; | |||
| static void sigill_handler (int sig) | |||
| static void disable_sse(FLAC__CPUInfo *info) | |||
| { | |||
| if (!canjump) { | |||
| signal (sig, SIG_DFL); | |||
| raise (sig); | |||
| } | |||
| canjump = 0; | |||
| siglongjmp (jmpbuf, 1); | |||
| info->ia32.sse = false; | |||
| info->ia32.sse2 = false; | |||
| info->ia32.sse3 = false; | |||
| info->ia32.ssse3 = false; | |||
| info->ia32.sse41 = false; | |||
| info->ia32.sse42 = false; | |||
| } | |||
| static void disable_avx(FLAC__CPUInfo *info) | |||
| { | |||
| info->ia32.avx = false; | |||
| info->ia32.avx2 = false; | |||
| info->ia32.fma = false; | |||
| } | |||
| # endif /* FLAC__SYS_DARWIN */ | |||
| # endif /* FLAC__NO_ASM */ | |||
| #endif /* FLAC__CPU_PPC */ | |||
| #elif defined FLAC__CPU_X86_64 | |||
| static void disable_avx(FLAC__CPUInfo *info) | |||
| { | |||
| info->x86.avx = false; | |||
| info->x86.avx2 = false; | |||
| info->x86.fma = false; | |||
| } | |||
| #endif | |||
| #if defined (__NetBSD__) || defined(__OpenBSD__) | |||
| #include <sys/param.h> | |||
| @@ -87,25 +87,34 @@ static void sigill_handler (int sig) | |||
| /* how to get sysctlbyname()? */ | |||
| #endif | |||
| #ifdef FLAC__CPU_IA32 | |||
| /* these are flags in EDX of CPUID AX=00000001 */ | |||
| static const unsigned FLAC__CPUINFO_IA32_CPUID_CMOV = 0x00008000; | |||
| static const unsigned FLAC__CPUINFO_IA32_CPUID_MMX = 0x00800000; | |||
| static const unsigned FLAC__CPUINFO_IA32_CPUID_FXSR = 0x01000000; | |||
| static const unsigned FLAC__CPUINFO_IA32_CPUID_SSE = 0x02000000; | |||
| static const unsigned FLAC__CPUINFO_IA32_CPUID_SSE2 = 0x04000000; | |||
| #endif | |||
| /* these are flags in ECX of CPUID AX=00000001 */ | |||
| static const unsigned FLAC__CPUINFO_IA32_CPUID_SSE3 = 0x00000001; | |||
| static const unsigned FLAC__CPUINFO_IA32_CPUID_SSSE3 = 0x00000200; | |||
| /* these are flags in EDX of CPUID AX=80000001 */ | |||
| static const unsigned FLAC__CPUINFO_IA32_CPUID_EXTENDED_AMD_3DNOW = 0x80000000; | |||
| static const unsigned FLAC__CPUINFO_IA32_CPUID_EXTENDED_AMD_EXT3DNOW = 0x40000000; | |||
| static const unsigned FLAC__CPUINFO_IA32_CPUID_EXTENDED_AMD_EXTMMX = 0x00400000; | |||
| static const unsigned FLAC__CPUINFO_IA32_CPUID_SSE41 = 0x00080000; | |||
| static const unsigned FLAC__CPUINFO_IA32_CPUID_SSE42 = 0x00100000; | |||
| #if defined FLAC__AVX_SUPPORTED | |||
| /* these are flags in ECX of CPUID AX=00000001 */ | |||
| static const unsigned FLAC__CPUINFO_IA32_CPUID_OSXSAVE = 0x08000000; | |||
| static const unsigned FLAC__CPUINFO_IA32_CPUID_AVX = 0x10000000; | |||
| static const unsigned FLAC__CPUINFO_IA32_CPUID_FMA = 0x00001000; | |||
| /* these are flags in EBX of CPUID AX=00000007 */ | |||
| static const unsigned FLAC__CPUINFO_IA32_CPUID_AVX2 = 0x00000020; | |||
| #endif | |||
| /* | |||
| * Extra stuff needed for detection of OS support for SSE on IA-32 | |||
| */ | |||
| #if defined(FLAC__CPU_IA32) && !defined FLAC__NO_ASM && defined FLAC__HAS_NASM && !defined FLAC__NO_SSE_OS && !defined FLAC__SSE_OS | |||
| #if defined(FLAC__CPU_IA32) && !defined FLAC__NO_ASM && (defined FLAC__HAS_NASM || defined FLAC__HAS_X86INTRIN) && !defined FLAC__NO_SSE_OS && !defined FLAC__SSE_OS | |||
| # if defined(__linux__) | |||
| /* | |||
| * If the OS doesn't support SSE, we will get here with a SIGILL. We | |||
| @@ -120,35 +129,14 @@ static const unsigned FLAC__CPUINFO_IA32_CPUID_EXTENDED_AMD_EXTMMX = 0x00400000; | |||
| * 6 bytes extra in case our estimate is wrong | |||
| * 12 bytes puts us in the NOP "landing zone" | |||
| */ | |||
| # undef USE_OBSOLETE_SIGCONTEXT_FLAVOR /* #define this to use the older signal handler method */ | |||
| # ifdef USE_OBSOLETE_SIGCONTEXT_FLAVOR | |||
| static void sigill_handler_sse_os(int signal, struct sigcontext sc) | |||
| { | |||
| (void)signal; | |||
| sc.eip += 3 + 3 + 6; | |||
| } | |||
| # else | |||
| # include <sys/ucontext.h> | |||
| static void sigill_handler_sse_os(int signal, siginfo_t *si, void *uc) | |||
| { | |||
| (void)signal, (void)si; | |||
| ((ucontext_t*)uc)->uc_mcontext.gregs[14/*REG_EIP*/] += 3 + 3 + 6; | |||
| } | |||
| # endif | |||
| # elif defined(_MSC_VER) | |||
| # include <windows.h> | |||
| # define USE_TRY_CATCH_FLAVOR /* sigill_handler flavor resulted in several crash reports on win32 */ | |||
| # ifdef USE_TRY_CATCH_FLAVOR | |||
| # else | |||
| LONG CALLBACK sigill_handler_sse_os(EXCEPTION_POINTERS *ep) | |||
| { | |||
| if(ep->ExceptionRecord->ExceptionCode == EXCEPTION_ILLEGAL_INSTRUCTION) { | |||
| ep->ContextRecord->Eip += 3 + 3 + 6; | |||
| return EXCEPTION_CONTINUE_EXECUTION; | |||
| } | |||
| return EXCEPTION_CONTINUE_SEARCH; | |||
| } | |||
| # endif | |||
| # endif | |||
| #endif | |||
| @@ -159,261 +147,344 @@ void FLAC__cpu_info(FLAC__CPUInfo *info) | |||
| * IA32-specific | |||
| */ | |||
| #ifdef FLAC__CPU_IA32 | |||
| FLAC__bool ia32_fxsr = false; | |||
| FLAC__bool ia32_osxsave = false; | |||
| (void) ia32_fxsr; (void) ia32_osxsave; /* to avoid warnings about unused variables */ | |||
| memset(info, 0, sizeof(*info)); | |||
| info->type = FLAC__CPUINFO_TYPE_IA32; | |||
| #if !defined FLAC__NO_ASM && defined FLAC__HAS_NASM | |||
| #if !defined FLAC__NO_ASM && (defined FLAC__HAS_NASM || defined FLAC__HAS_X86INTRIN) | |||
| info->use_asm = true; /* we assume a minimum of 80386 with FLAC__CPU_IA32 */ | |||
| info->data.ia32.cpuid = FLAC__cpu_have_cpuid_asm_ia32()? true : false; | |||
| info->data.ia32.bswap = info->data.ia32.cpuid; /* CPUID => BSWAP since it came after */ | |||
| info->data.ia32.cmov = false; | |||
| info->data.ia32.mmx = false; | |||
| info->data.ia32.fxsr = false; | |||
| info->data.ia32.sse = false; | |||
| info->data.ia32.sse2 = false; | |||
| info->data.ia32.sse3 = false; | |||
| info->data.ia32.ssse3 = false; | |||
| info->data.ia32._3dnow = false; | |||
| info->data.ia32.ext3dnow = false; | |||
| info->data.ia32.extmmx = false; | |||
| if(info->data.ia32.cpuid) { | |||
| /* http://www.sandpile.org/ia32/cpuid.htm */ | |||
| FLAC__uint32 flags_edx, flags_ecx; | |||
| FLAC__cpu_info_asm_ia32(&flags_edx, &flags_ecx); | |||
| info->data.ia32.cmov = (flags_edx & FLAC__CPUINFO_IA32_CPUID_CMOV )? true : false; | |||
| info->data.ia32.mmx = (flags_edx & FLAC__CPUINFO_IA32_CPUID_MMX )? true : false; | |||
| info->data.ia32.fxsr = (flags_edx & FLAC__CPUINFO_IA32_CPUID_FXSR )? true : false; | |||
| info->data.ia32.sse = (flags_edx & FLAC__CPUINFO_IA32_CPUID_SSE )? true : false; | |||
| info->data.ia32.sse2 = (flags_edx & FLAC__CPUINFO_IA32_CPUID_SSE2 )? true : false; | |||
| info->data.ia32.sse3 = (flags_ecx & FLAC__CPUINFO_IA32_CPUID_SSE3 )? true : false; | |||
| info->data.ia32.ssse3 = (flags_ecx & FLAC__CPUINFO_IA32_CPUID_SSSE3)? true : false; | |||
| #ifdef FLAC__USE_3DNOW | |||
| flags_edx = FLAC__cpu_info_extended_amd_asm_ia32(); | |||
| info->data.ia32._3dnow = (flags_edx & FLAC__CPUINFO_IA32_CPUID_EXTENDED_AMD_3DNOW )? true : false; | |||
| info->data.ia32.ext3dnow = (flags_edx & FLAC__CPUINFO_IA32_CPUID_EXTENDED_AMD_EXT3DNOW)? true : false; | |||
| info->data.ia32.extmmx = (flags_edx & FLAC__CPUINFO_IA32_CPUID_EXTENDED_AMD_EXTMMX )? true : false; | |||
| #ifdef FLAC__HAS_X86INTRIN | |||
| if(!FLAC__cpu_have_cpuid_x86()) | |||
| return; | |||
| #else | |||
| if(!FLAC__cpu_have_cpuid_asm_ia32()) | |||
| return; | |||
| #endif | |||
| { | |||
| /* http://www.sandpile.org/x86/cpuid.htm */ | |||
| #ifdef FLAC__HAS_X86INTRIN | |||
| FLAC__uint32 flags_eax, flags_ebx, flags_ecx, flags_edx; | |||
| FLAC__cpu_info_x86(1, &flags_eax, &flags_ebx, &flags_ecx, &flags_edx); | |||
| #else | |||
| info->data.ia32._3dnow = info->data.ia32.ext3dnow = info->data.ia32.extmmx = false; | |||
| FLAC__uint32 flags_ecx, flags_edx; | |||
| FLAC__cpu_info_asm_ia32(&flags_edx, &flags_ecx); | |||
| #endif | |||
| info->ia32.cmov = (flags_edx & FLAC__CPUINFO_IA32_CPUID_CMOV )? true : false; | |||
| info->ia32.mmx = (flags_edx & FLAC__CPUINFO_IA32_CPUID_MMX )? true : false; | |||
| ia32_fxsr = (flags_edx & FLAC__CPUINFO_IA32_CPUID_FXSR )? true : false; | |||
| info->ia32.sse = (flags_edx & FLAC__CPUINFO_IA32_CPUID_SSE )? true : false; | |||
| info->ia32.sse2 = (flags_edx & FLAC__CPUINFO_IA32_CPUID_SSE2 )? true : false; | |||
| info->ia32.sse3 = (flags_ecx & FLAC__CPUINFO_IA32_CPUID_SSE3 )? true : false; | |||
| info->ia32.ssse3 = (flags_ecx & FLAC__CPUINFO_IA32_CPUID_SSSE3)? true : false; | |||
| info->ia32.sse41 = (flags_ecx & FLAC__CPUINFO_IA32_CPUID_SSE41)? true : false; | |||
| info->ia32.sse42 = (flags_ecx & FLAC__CPUINFO_IA32_CPUID_SSE42)? true : false; | |||
| #if defined FLAC__HAS_X86INTRIN && defined FLAC__AVX_SUPPORTED | |||
| ia32_osxsave = (flags_ecx & FLAC__CPUINFO_IA32_CPUID_OSXSAVE)? true : false; | |||
| info->ia32.avx = (flags_ecx & FLAC__CPUINFO_IA32_CPUID_AVX )? true : false; | |||
| info->ia32.fma = (flags_ecx & FLAC__CPUINFO_IA32_CPUID_FMA )? true : false; | |||
| FLAC__cpu_info_x86(7, &flags_eax, &flags_ebx, &flags_ecx, &flags_edx); | |||
| info->ia32.avx2 = (flags_ebx & FLAC__CPUINFO_IA32_CPUID_AVX2 )? true : false; | |||
| #endif | |||
| } | |||
| #ifdef DEBUG | |||
| fprintf(stderr, "CPU info (IA-32):\n"); | |||
| fprintf(stderr, " CPUID ...... %c\n", info->data.ia32.cpuid ? 'Y' : 'n'); | |||
| fprintf(stderr, " BSWAP ...... %c\n", info->data.ia32.bswap ? 'Y' : 'n'); | |||
| fprintf(stderr, " CMOV ....... %c\n", info->data.ia32.cmov ? 'Y' : 'n'); | |||
| fprintf(stderr, " MMX ........ %c\n", info->data.ia32.mmx ? 'Y' : 'n'); | |||
| fprintf(stderr, " FXSR ....... %c\n", info->data.ia32.fxsr ? 'Y' : 'n'); | |||
| fprintf(stderr, " SSE ........ %c\n", info->data.ia32.sse ? 'Y' : 'n'); | |||
| fprintf(stderr, " SSE2 ....... %c\n", info->data.ia32.sse2 ? 'Y' : 'n'); | |||
| fprintf(stderr, " SSE3 ....... %c\n", info->data.ia32.sse3 ? 'Y' : 'n'); | |||
| fprintf(stderr, " SSSE3 ...... %c\n", info->data.ia32.ssse3 ? 'Y' : 'n'); | |||
| fprintf(stderr, " 3DNow! ..... %c\n", info->data.ia32._3dnow ? 'Y' : 'n'); | |||
| fprintf(stderr, " 3DNow!-ext . %c\n", info->data.ia32.ext3dnow? 'Y' : 'n'); | |||
| fprintf(stderr, " 3DNow!-MMX . %c\n", info->data.ia32.extmmx ? 'Y' : 'n'); | |||
| fprintf(stderr, "CPU info (IA-32):\n"); | |||
| fprintf(stderr, " CMOV ....... %c\n", info->ia32.cmov ? 'Y' : 'n'); | |||
| fprintf(stderr, " MMX ........ %c\n", info->ia32.mmx ? 'Y' : 'n'); | |||
| fprintf(stderr, " SSE ........ %c\n", info->ia32.sse ? 'Y' : 'n'); | |||
| fprintf(stderr, " SSE2 ....... %c\n", info->ia32.sse2 ? 'Y' : 'n'); | |||
| fprintf(stderr, " SSE3 ....... %c\n", info->ia32.sse3 ? 'Y' : 'n'); | |||
| fprintf(stderr, " SSSE3 ...... %c\n", info->ia32.ssse3 ? 'Y' : 'n'); | |||
| fprintf(stderr, " SSE41 ...... %c\n", info->ia32.sse41 ? 'Y' : 'n'); | |||
| fprintf(stderr, " SSE42 ...... %c\n", info->ia32.sse42 ? 'Y' : 'n'); | |||
| # if defined FLAC__HAS_X86INTRIN && defined FLAC__AVX_SUPPORTED | |||
| fprintf(stderr, " AVX ........ %c\n", info->ia32.avx ? 'Y' : 'n'); | |||
| fprintf(stderr, " FMA ........ %c\n", info->ia32.fma ? 'Y' : 'n'); | |||
| fprintf(stderr, " AVX2 ....... %c\n", info->ia32.avx2 ? 'Y' : 'n'); | |||
| # endif | |||
| #endif | |||
| /* | |||
| * now have to check for OS support of SSE/SSE2 | |||
| */ | |||
| if(info->data.ia32.fxsr || info->data.ia32.sse || info->data.ia32.sse2) { | |||
| /* | |||
| * now have to check for OS support of SSE instructions | |||
| */ | |||
| if(info->ia32.sse) { | |||
| #if defined FLAC__NO_SSE_OS | |||
| /* assume user knows better than us; turn it off */ | |||
| info->data.ia32.fxsr = info->data.ia32.sse = info->data.ia32.sse2 = info->data.ia32.sse3 = info->data.ia32.ssse3 = false; | |||
| /* assume user knows better than us; turn it off */ | |||
| disable_sse(info); | |||
| #elif defined FLAC__SSE_OS | |||
| /* assume user knows better than us; leave as detected above */ | |||
| /* assume user knows better than us; leave as detected above */ | |||
| #elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__) || defined(__APPLE__) | |||
| int sse = 0; | |||
| size_t len; | |||
| /* at least one of these must work: */ | |||
| len = sizeof(sse); sse = sse || (sysctlbyname("hw.instruction_sse", &sse, &len, NULL, 0) == 0 && sse); | |||
| len = sizeof(sse); sse = sse || (sysctlbyname("hw.optional.sse" , &sse, &len, NULL, 0) == 0 && sse); /* __APPLE__ ? */ | |||
| if(!sse) | |||
| info->data.ia32.fxsr = info->data.ia32.sse = info->data.ia32.sse2 = info->data.ia32.sse3 = info->data.ia32.ssse3 = false; | |||
| int sse = 0; | |||
| size_t len; | |||
| /* at least one of these must work: */ | |||
| len = sizeof(sse); sse = sse || (sysctlbyname("hw.instruction_sse", &sse, &len, NULL, 0) == 0 && sse); | |||
| len = sizeof(sse); sse = sse || (sysctlbyname("hw.optional.sse" , &sse, &len, NULL, 0) == 0 && sse); /* __APPLE__ ? */ | |||
| if(!sse) | |||
| disable_sse(info); | |||
| #elif defined(__NetBSD__) || defined (__OpenBSD__) | |||
| # if __NetBSD_Version__ >= 105250000 || (defined __OpenBSD__) | |||
| int val = 0, mib[2] = { CTL_MACHDEP, CPU_SSE }; | |||
| size_t len = sizeof(val); | |||
| if(sysctl(mib, 2, &val, &len, NULL, 0) < 0 || !val) | |||
| info->data.ia32.fxsr = info->data.ia32.sse = info->data.ia32.sse2 = info->data.ia32.sse3 = info->data.ia32.ssse3 = false; | |||
| else { /* double-check SSE2 */ | |||
| mib[1] = CPU_SSE2; | |||
| len = sizeof(val); | |||
| if(sysctl(mib, 2, &val, &len, NULL, 0) < 0 || !val) | |||
| info->data.ia32.sse2 = info->data.ia32.sse3 = info->data.ia32.ssse3 = false; | |||
| int val = 0, mib[2] = { CTL_MACHDEP, CPU_SSE }; | |||
| size_t len = sizeof(val); | |||
| if(sysctl(mib, 2, &val, &len, NULL, 0) < 0 || !val) | |||
| disable_sse(info); | |||
| else { /* double-check SSE2 */ | |||
| mib[1] = CPU_SSE2; | |||
| len = sizeof(val); | |||
| if(sysctl(mib, 2, &val, &len, NULL, 0) < 0 || !val) { | |||
| disable_sse(info); | |||
| info->ia32.sse = true; | |||
| } | |||
| } | |||
| # else | |||
| info->data.ia32.fxsr = info->data.ia32.sse = info->data.ia32.sse2 = info->data.ia32.sse3 = info->data.ia32.ssse3 = false; | |||
| disable_sse(info); | |||
| # endif | |||
| #elif defined(__linux__) | |||
| int sse = 0; | |||
| struct sigaction sigill_save; | |||
| #ifdef USE_OBSOLETE_SIGCONTEXT_FLAVOR | |||
| if(0 == sigaction(SIGILL, NULL, &sigill_save) && signal(SIGILL, (void (*)(int))sigill_handler_sse_os) != SIG_ERR) | |||
| #else | |||
| struct sigaction sigill_sse; | |||
| sigill_sse.sa_sigaction = sigill_handler_sse_os; | |||
| __sigemptyset(&sigill_sse.sa_mask); | |||
| sigill_sse.sa_flags = SA_SIGINFO | SA_RESETHAND; /* SA_RESETHAND just in case our SIGILL return jump breaks, so we don't get stuck in a loop */ | |||
| if(0 == sigaction(SIGILL, &sigill_sse, &sigill_save)) | |||
| #endif | |||
| { | |||
| /* http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html */ | |||
| /* see sigill_handler_sse_os() for an explanation of the following: */ | |||
| asm volatile ( | |||
| "xorl %0,%0\n\t" /* for some reason, still need to do this to clear 'sse' var */ | |||
| "xorps %%xmm0,%%xmm0\n\t" /* will cause SIGILL if unsupported by OS */ | |||
| "incl %0\n\t" /* SIGILL handler will jump over this */ | |||
| /* landing zone */ | |||
| "nop\n\t" /* SIGILL jump lands here if "inc" is 9 bytes */ | |||
| "nop\n\t" | |||
| "nop\n\t" | |||
| "nop\n\t" | |||
| "nop\n\t" | |||
| "nop\n\t" | |||
| "nop\n\t" /* SIGILL jump lands here if "inc" is 3 bytes (expected) */ | |||
| "nop\n\t" | |||
| "nop" /* SIGILL jump lands here if "inc" is 1 byte */ | |||
| : "=r"(sse) | |||
| : "r"(sse) | |||
| ); | |||
| sigaction(SIGILL, &sigill_save, NULL); | |||
| } | |||
| int sse = 0; | |||
| struct sigaction sigill_save; | |||
| struct sigaction sigill_sse; | |||
| sigill_sse.sa_sigaction = sigill_handler_sse_os; | |||
| __sigemptyset(&sigill_sse.sa_mask); | |||
| sigill_sse.sa_flags = SA_SIGINFO | SA_RESETHAND; /* SA_RESETHAND just in case our SIGILL return jump breaks, so we don't get stuck in a loop */ | |||
| if(0 == sigaction(SIGILL, &sigill_sse, &sigill_save)) | |||
| { | |||
| /* http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html */ | |||
| /* see sigill_handler_sse_os() for an explanation of the following: */ | |||
| asm volatile ( | |||
| "xorps %%xmm0,%%xmm0\n\t" /* will cause SIGILL if unsupported by OS */ | |||
| "incl %0\n\t" /* SIGILL handler will jump over this */ | |||
| /* landing zone */ | |||
| "nop\n\t" /* SIGILL jump lands here if "inc" is 9 bytes */ | |||
| "nop\n\t" | |||
| "nop\n\t" | |||
| "nop\n\t" | |||
| "nop\n\t" | |||
| "nop\n\t" | |||
| "nop\n\t" /* SIGILL jump lands here if "inc" is 3 bytes (expected) */ | |||
| "nop\n\t" | |||
| "nop" /* SIGILL jump lands here if "inc" is 1 byte */ | |||
| : "=r"(sse) | |||
| : "0"(sse) | |||
| ); | |||
| if(!sse) | |||
| info->data.ia32.fxsr = info->data.ia32.sse = info->data.ia32.sse2 = info->data.ia32.sse3 = info->data.ia32.ssse3 = false; | |||
| sigaction(SIGILL, &sigill_save, NULL); | |||
| } | |||
| if(!sse) | |||
| disable_sse(info); | |||
| #elif defined(_MSC_VER) | |||
| # ifdef USE_TRY_CATCH_FLAVOR | |||
| _try { | |||
| __asm { | |||
| # if _MSC_VER <= 1200 | |||
| /* VC6 assembler doesn't know SSE, have to emit bytecode instead */ | |||
| _emit 0x0F | |||
| _emit 0x57 | |||
| _emit 0xC0 | |||
| # else | |||
| xorps xmm0,xmm0 | |||
| # endif | |||
| } | |||
| } | |||
| _except(EXCEPTION_EXECUTE_HANDLER) { | |||
| if (_exception_code() == STATUS_ILLEGAL_INSTRUCTION) | |||
| info->data.ia32.fxsr = info->data.ia32.sse = info->data.ia32.sse2 = info->data.ia32.sse3 = info->data.ia32.ssse3 = false; | |||
| } | |||
| # else | |||
| int sse = 0; | |||
| LPTOP_LEVEL_EXCEPTION_FILTER save = SetUnhandledExceptionFilter(sigill_handler_sse_os); | |||
| /* see GCC version above for explanation */ | |||
| /* http://msdn2.microsoft.com/en-us/library/4ks26t93.aspx */ | |||
| /* http://www.codeproject.com/cpp/gccasm.asp */ | |||
| /* http://www.hick.org/~mmiller/msvc_inline_asm.html */ | |||
| __try { | |||
| __asm { | |||
| # if _MSC_VER <= 1200 | |||
| /* VC6 assembler doesn't know SSE, have to emit bytecode instead */ | |||
| _emit 0x0F | |||
| _emit 0x57 | |||
| _emit 0xC0 | |||
| # else | |||
| xorps xmm0,xmm0 | |||
| # endif | |||
| inc sse | |||
| nop | |||
| nop | |||
| nop | |||
| nop | |||
| nop | |||
| nop | |||
| nop | |||
| nop | |||
| nop | |||
| } | |||
| SetUnhandledExceptionFilter(save); | |||
| if(!sse) | |||
| info->data.ia32.fxsr = info->data.ia32.sse = info->data.ia32.sse2 = info->data.ia32.sse3 = info->data.ia32.ssse3 = false; | |||
| # endif | |||
| } | |||
| __except(EXCEPTION_EXECUTE_HANDLER) { | |||
| if (_exception_code() == STATUS_ILLEGAL_INSTRUCTION) | |||
| disable_sse(info); | |||
| } | |||
| #elif defined(__GNUC__) /* MinGW goes here */ | |||
| int sse = 0; | |||
| /* Based on the idea described in Agner Fog's manual "Optimizing subroutines in assembly language" */ | |||
| /* In theory, not guaranteed to detect lack of OS SSE support on some future Intel CPUs, but in practice works (see the aforementioned manual) */ | |||
| if (ia32_fxsr) { | |||
| struct { | |||
| FLAC__uint32 buff[128]; | |||
| } __attribute__((aligned(16))) fxsr; | |||
| FLAC__uint32 old_val, new_val; | |||
| asm volatile ("fxsave %0" : "=m" (fxsr) : "m" (fxsr)); | |||
| old_val = fxsr.buff[50]; | |||
| fxsr.buff[50] ^= 0x0013c0de; /* change value in the buffer */ | |||
| asm volatile ("fxrstor %0" : "=m" (fxsr) : "m" (fxsr)); /* try to change SSE register */ | |||
| fxsr.buff[50] = old_val; /* restore old value in the buffer */ | |||
| asm volatile ("fxsave %0 " : "=m" (fxsr) : "m" (fxsr)); /* old value will be overwritten if SSE register was changed */ | |||
| new_val = fxsr.buff[50]; /* == old_val if FXRSTOR didn't change SSE register and (old_val ^ 0x0013c0de) otherwise */ | |||
| fxsr.buff[50] = old_val; /* again restore old value in the buffer */ | |||
| asm volatile ("fxrstor %0" : "=m" (fxsr) : "m" (fxsr)); /* restore old values of registers */ | |||
| if ((old_val^new_val) == 0x0013c0de) | |||
| sse = 1; | |||
| } | |||
| if(!sse) | |||
| disable_sse(info); | |||
| #else | |||
| /* no way to test, disable to be safe */ | |||
| info->data.ia32.fxsr = info->data.ia32.sse = info->data.ia32.sse2 = info->data.ia32.sse3 = info->data.ia32.ssse3 = false; | |||
| /* no way to test, disable to be safe */ | |||
| disable_sse(info); | |||
| #endif | |||
| #ifdef DEBUG | |||
| fprintf(stderr, " SSE OS sup . %c\n", info->data.ia32.sse ? 'Y' : 'n'); | |||
| fprintf(stderr, " SSE OS sup . %c\n", info->ia32.sse ? 'Y' : 'n'); | |||
| #endif | |||
| } | |||
| else /* info->ia32.sse == false */ | |||
| disable_sse(info); | |||
| } | |||
| /* | |||
| * now have to check for OS support of AVX instructions | |||
| */ | |||
| if(info->ia32.avx && ia32_osxsave) { | |||
| FLAC__uint32 ecr = FLAC__cpu_xgetbv_x86(); | |||
| if ((ecr & 0x6) != 0x6) | |||
| disable_avx(info); | |||
| #ifdef DEBUG | |||
| fprintf(stderr, " AVX OS sup . %c\n", info->ia32.avx ? 'Y' : 'n'); | |||
| #endif | |||
| } | |||
| else /* no OS AVX support*/ | |||
| disable_avx(info); | |||
| #else | |||
| info->use_asm = false; | |||
| #endif | |||
| /* | |||
| * PPC-specific | |||
| * x86-64-specific | |||
| */ | |||
| #elif defined FLAC__CPU_PPC | |||
| info->type = FLAC__CPUINFO_TYPE_PPC; | |||
| # if !defined FLAC__NO_ASM | |||
| #elif defined FLAC__CPU_X86_64 | |||
| FLAC__bool x86_osxsave = false; | |||
| (void) x86_osxsave; /* to avoid warnings about unused variables */ | |||
| memset(info, 0, sizeof(*info)); | |||
| info->type = FLAC__CPUINFO_TYPE_X86_64; | |||
| #if !defined FLAC__NO_ASM && defined FLAC__HAS_X86INTRIN | |||
| info->use_asm = true; | |||
| # ifdef FLAC__USE_ALTIVEC | |||
| # if defined FLAC__SYS_DARWIN | |||
| { | |||
| int val = 0, mib[2] = { CTL_HW, HW_VECTORUNIT }; | |||
| size_t len = sizeof(val); | |||
| info->data.ppc.altivec = !(sysctl(mib, 2, &val, &len, NULL, 0) || !val); | |||
| /* http://www.sandpile.org/x86/cpuid.htm */ | |||
| FLAC__uint32 flags_eax, flags_ebx, flags_ecx, flags_edx; | |||
| FLAC__cpu_info_x86(1, &flags_eax, &flags_ebx, &flags_ecx, &flags_edx); | |||
| info->x86.sse3 = (flags_ecx & FLAC__CPUINFO_IA32_CPUID_SSE3 )? true : false; | |||
| info->x86.ssse3 = (flags_ecx & FLAC__CPUINFO_IA32_CPUID_SSSE3)? true : false; | |||
| info->x86.sse41 = (flags_ecx & FLAC__CPUINFO_IA32_CPUID_SSE41)? true : false; | |||
| info->x86.sse42 = (flags_ecx & FLAC__CPUINFO_IA32_CPUID_SSE42)? true : false; | |||
| #if defined FLAC__AVX_SUPPORTED | |||
| x86_osxsave = (flags_ecx & FLAC__CPUINFO_IA32_CPUID_OSXSAVE)? true : false; | |||
| info->x86.avx = (flags_ecx & FLAC__CPUINFO_IA32_CPUID_AVX )? true : false; | |||
| info->x86.fma = (flags_ecx & FLAC__CPUINFO_IA32_CPUID_FMA )? true : false; | |||
| FLAC__cpu_info_x86(7, &flags_eax, &flags_ebx, &flags_ecx, &flags_edx); | |||
| info->x86.avx2 = (flags_ebx & FLAC__CPUINFO_IA32_CPUID_AVX2 )? true : false; | |||
| #endif | |||
| } | |||
| { | |||
| host_basic_info_data_t hostInfo; | |||
| mach_msg_type_number_t infoCount; | |||
| infoCount = HOST_BASIC_INFO_COUNT; | |||
| host_info(mach_host_self(), HOST_BASIC_INFO, (host_info_t)&hostInfo, &infoCount); | |||
| #ifdef DEBUG | |||
| fprintf(stderr, "CPU info (x86-64):\n"); | |||
| fprintf(stderr, " SSE3 ....... %c\n", info->x86.sse3 ? 'Y' : 'n'); | |||
| fprintf(stderr, " SSSE3 ...... %c\n", info->x86.ssse3 ? 'Y' : 'n'); | |||
| fprintf(stderr, " SSE41 ...... %c\n", info->x86.sse41 ? 'Y' : 'n'); | |||
| fprintf(stderr, " SSE42 ...... %c\n", info->x86.sse42 ? 'Y' : 'n'); | |||
| # if defined FLAC__AVX_SUPPORTED | |||
| fprintf(stderr, " AVX ........ %c\n", info->x86.avx ? 'Y' : 'n'); | |||
| fprintf(stderr, " FMA ........ %c\n", info->x86.fma ? 'Y' : 'n'); | |||
| fprintf(stderr, " AVX2 ....... %c\n", info->x86.avx2 ? 'Y' : 'n'); | |||
| # endif | |||
| #endif | |||
| info->data.ppc.ppc64 = (hostInfo.cpu_type == CPU_TYPE_POWERPC) && (hostInfo.cpu_subtype == CPU_SUBTYPE_POWERPC_970); | |||
| /* | |||
| * now have to check for OS support of AVX instructions | |||
| */ | |||
| if(info->x86.avx && x86_osxsave) { | |||
| FLAC__uint32 ecr = FLAC__cpu_xgetbv_x86(); | |||
| if ((ecr & 0x6) != 0x6) | |||
| disable_avx(info); | |||
| #ifdef DEBUG | |||
| fprintf(stderr, " AVX OS sup . %c\n", info->x86.avx ? 'Y' : 'n'); | |||
| #endif | |||
| } | |||
| # else /* FLAC__USE_ALTIVEC && !FLAC__SYS_DARWIN */ | |||
| { | |||
| /* no Darwin, do it the brute-force way */ | |||
| /* @@@@@@ this is not thread-safe; replace with SSE OS method above or remove */ | |||
| info->data.ppc.altivec = 0; | |||
| info->data.ppc.ppc64 = 0; | |||
| else /* no OS AVX support*/ | |||
| disable_avx(info); | |||
| #else | |||
| info->use_asm = false; | |||
| #endif | |||
| signal (SIGILL, sigill_handler); | |||
| canjump = 0; | |||
| if (!sigsetjmp (jmpbuf, 1)) { | |||
| canjump = 1; | |||
| /* | |||
| * unknown CPU | |||
| */ | |||
| #else | |||
| info->type = FLAC__CPUINFO_TYPE_UNKNOWN; | |||
| info->use_asm = false; | |||
| #endif | |||
| } | |||
| asm volatile ( | |||
| "mtspr 256, %0\n\t" | |||
| "vand %%v0, %%v0, %%v0" | |||
| : | |||
| : "r" (-1) | |||
| ); | |||
| #if (defined FLAC__CPU_IA32 || defined FLAC__CPU_X86_64) && defined FLAC__HAS_X86INTRIN | |||
| info->data.ppc.altivec = 1; | |||
| } | |||
| canjump = 0; | |||
| if (!sigsetjmp (jmpbuf, 1)) { | |||
| int x = 0; | |||
| canjump = 1; | |||
| /* PPC64 hardware implements the cntlzd instruction */ | |||
| asm volatile ("cntlzd %0, %1" : "=r" (x) : "r" (x) ); | |||
| #if defined _MSC_VER | |||
| #include <intrin.h> /* for __cpuid() and _xgetbv() */ | |||
| #elif defined __GNUC__ && defined HAVE_CPUID_H | |||
| #include <cpuid.h> /* for __get_cpuid() and __get_cpuid_max() */ | |||
| #endif | |||
| info->data.ppc.ppc64 = 1; | |||
| } | |||
| signal (SIGILL, SIG_DFL); /*@@@@@@ should save and restore old signal */ | |||
| FLAC__uint32 FLAC__cpu_have_cpuid_x86(void) | |||
| { | |||
| #ifdef FLAC__CPU_X86_64 | |||
| return 1; | |||
| #else | |||
| # if defined _MSC_VER || defined __INTEL_COMPILER /* Do they support CPUs w/o CPUID support (or OSes that work on those CPUs)? */ | |||
| FLAC__uint32 flags1, flags2; | |||
| __asm { | |||
| pushfd | |||
| pushfd | |||
| pop eax | |||
| mov flags1, eax | |||
| xor eax, 0x200000 | |||
| push eax | |||
| popfd | |||
| pushfd | |||
| pop eax | |||
| mov flags2, eax | |||
| popfd | |||
| } | |||
| # endif | |||
| # else /* !FLAC__USE_ALTIVEC */ | |||
| info->data.ppc.altivec = 0; | |||
| info->data.ppc.ppc64 = 0; | |||
| # endif | |||
| if (((flags1^flags2) & 0x200000) != 0) | |||
| return 1; | |||
| else | |||
| return 0; | |||
| # elif defined __GNUC__ && defined HAVE_CPUID_H | |||
| if (__get_cpuid_max(0, 0) != 0) | |||
| return 1; | |||
| else | |||
| return 0; | |||
| # else | |||
| info->use_asm = false; | |||
| return 0; | |||
| # endif | |||
| #endif | |||
| } | |||
| /* | |||
| * unknown CPI | |||
| */ | |||
| void FLAC__cpu_info_x86(FLAC__uint32 level, FLAC__uint32 *eax, FLAC__uint32 *ebx, FLAC__uint32 *ecx, FLAC__uint32 *edx) | |||
| { | |||
| (void) level; | |||
| #if defined _MSC_VER || defined __INTEL_COMPILER | |||
| int cpuinfo[4]; | |||
| int ext = level & 0x80000000; | |||
| __cpuid(cpuinfo, ext); | |||
| if((unsigned)cpuinfo[0] < level) { | |||
| *eax = *ebx = *ecx = *edx = 0; | |||
| return; | |||
| } | |||
| #if defined FLAC__AVX_SUPPORTED | |||
| __cpuidex(cpuinfo, level, 0); /* for AVX2 detection */ | |||
| #else | |||
| info->type = FLAC__CPUINFO_TYPE_UNKNOWN; | |||
| info->use_asm = false; | |||
| __cpuid(cpuinfo, level); /* some old compilers don't support __cpuidex */ | |||
| #endif | |||
| *eax = cpuinfo[0]; *ebx = cpuinfo[1]; *ecx = cpuinfo[2]; *edx = cpuinfo[3]; | |||
| #elif defined __GNUC__ && defined HAVE_CPUID_H | |||
| FLAC__uint32 ext = level & 0x80000000; | |||
| __cpuid(ext, *eax, *ebx, *ecx, *edx); | |||
| if (*eax < level) { | |||
| *eax = *ebx = *ecx = *edx = 0; | |||
| return; | |||
| } | |||
| __cpuid_count(level, 0, *eax, *ebx, *ecx, *edx); | |||
| #else | |||
| *eax = *ebx = *ecx = *edx = 0; | |||
| #endif | |||
| } | |||
| FLAC__uint32 FLAC__cpu_xgetbv_x86(void) | |||
| { | |||
| #if (defined _MSC_VER || defined __INTEL_COMPILER) && defined FLAC__AVX_SUPPORTED | |||
| return (FLAC__uint32)_xgetbv(0); | |||
| #elif defined __GNUC__ | |||
| FLAC__uint32 lo, hi; | |||
| asm volatile (".byte 0x0f, 0x01, 0xd0" : "=a"(lo), "=d"(hi) : "c" (0)); | |||
| return lo; | |||
| #else | |||
| return 0; | |||
| #endif | |||
| } | |||
| #endif /* (FLAC__CPU_IA32 || FLAC__CPU_X86_64) && FLAC__HAS_X86INTRIN */ | |||
| @@ -1,6 +1,6 @@ | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2000-2009 Josh Coalson | |||
| * Copyright (C) 2011-2013 Xiph.Org Foundation | |||
| * Copyright (C) 2011-2014 Xiph.Org Foundation | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions | |||
| @@ -30,7 +30,7 @@ | |||
| * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||
| */ | |||
| #if HAVE_CONFIG_H | |||
| #ifdef HAVE_CONFIG_H | |||
| # include <config.h> | |||
| #endif | |||
| @@ -1,6 +1,6 @@ | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2000-2009 Josh Coalson | |||
| * Copyright (C) 2011-2013 Xiph.Org Foundation | |||
| * Copyright (C) 2011-2014 Xiph.Org Foundation | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions | |||
| @@ -30,21 +30,17 @@ | |||
| * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||
| */ | |||
| #if HAVE_CONFIG_H | |||
| #ifdef HAVE_CONFIG_H | |||
| # include <config.h> | |||
| #endif | |||
| #include <math.h> | |||
| #include <string.h> | |||
| #include "../compat.h" | |||
| #include "include/private/bitmath.h" | |||
| #include "include/private/fixed.h" | |||
| #include "../assert.h" | |||
| #ifndef M_LN2 | |||
| /* math.h in VC++ doesn't seem to have this (how Microsoft is that?) */ | |||
| #define M_LN2 0.69314718055994530942 | |||
| #endif | |||
| #ifdef local_abs | |||
| #undef local_abs | |||
| #endif | |||
| @@ -320,20 +316,11 @@ unsigned FLAC__fixed_compute_best_predictor_wide(const FLAC__int32 data[], unsig | |||
| FLAC__ASSERT(data_len > 0 || total_error_3 == 0); | |||
| FLAC__ASSERT(data_len > 0 || total_error_4 == 0); | |||
| #ifndef FLAC__INTEGER_ONLY_LIBRARY | |||
| #if defined _MSC_VER || defined __MINGW32__ | |||
| /* with MSVC you have to spoon feed it the casting */ | |||
| residual_bits_per_sample[0] = (FLAC__float)((total_error_0 > 0) ? log(M_LN2 * (FLAC__double)(FLAC__int64)total_error_0 / (FLAC__double)data_len) / M_LN2 : 0.0); | |||
| residual_bits_per_sample[1] = (FLAC__float)((total_error_1 > 0) ? log(M_LN2 * (FLAC__double)(FLAC__int64)total_error_1 / (FLAC__double)data_len) / M_LN2 : 0.0); | |||
| residual_bits_per_sample[2] = (FLAC__float)((total_error_2 > 0) ? log(M_LN2 * (FLAC__double)(FLAC__int64)total_error_2 / (FLAC__double)data_len) / M_LN2 : 0.0); | |||
| residual_bits_per_sample[3] = (FLAC__float)((total_error_3 > 0) ? log(M_LN2 * (FLAC__double)(FLAC__int64)total_error_3 / (FLAC__double)data_len) / M_LN2 : 0.0); | |||
| residual_bits_per_sample[4] = (FLAC__float)((total_error_4 > 0) ? log(M_LN2 * (FLAC__double)(FLAC__int64)total_error_4 / (FLAC__double)data_len) / M_LN2 : 0.0); | |||
| #else | |||
| residual_bits_per_sample[0] = (FLAC__float)((total_error_0 > 0) ? log(M_LN2 * (FLAC__double)total_error_0 / (FLAC__double)data_len) / M_LN2 : 0.0); | |||
| residual_bits_per_sample[1] = (FLAC__float)((total_error_1 > 0) ? log(M_LN2 * (FLAC__double)total_error_1 / (FLAC__double)data_len) / M_LN2 : 0.0); | |||
| residual_bits_per_sample[2] = (FLAC__float)((total_error_2 > 0) ? log(M_LN2 * (FLAC__double)total_error_2 / (FLAC__double)data_len) / M_LN2 : 0.0); | |||
| residual_bits_per_sample[3] = (FLAC__float)((total_error_3 > 0) ? log(M_LN2 * (FLAC__double)total_error_3 / (FLAC__double)data_len) / M_LN2 : 0.0); | |||
| residual_bits_per_sample[4] = (FLAC__float)((total_error_4 > 0) ? log(M_LN2 * (FLAC__double)total_error_4 / (FLAC__double)data_len) / M_LN2 : 0.0); | |||
| #endif | |||
| #else | |||
| residual_bits_per_sample[0] = (total_error_0 > 0) ? local__compute_rbps_wide_integerized(total_error_0, data_len) : 0; | |||
| residual_bits_per_sample[1] = (total_error_1 > 0) ? local__compute_rbps_wide_integerized(total_error_1, data_len) : 0; | |||
| @@ -1,6 +1,6 @@ | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2004-2009 Josh Coalson | |||
| * Copyright (C) 2011-2013 Xiph.Org Foundation | |||
| * Copyright (C) 2011-2014 Xiph.Org Foundation | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions | |||
| @@ -30,7 +30,7 @@ | |||
| * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||
| */ | |||
| #if HAVE_CONFIG_H | |||
| #ifdef HAVE_CONFIG_H | |||
| # include <config.h> | |||
| #endif | |||
| @@ -1,6 +1,6 @@ | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2000-2009 Josh Coalson | |||
| * Copyright (C) 2011-2013 Xiph.Org Foundation | |||
| * Copyright (C) 2011-2014 Xiph.Org Foundation | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions | |||
| @@ -30,7 +30,7 @@ | |||
| * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||
| */ | |||
| #if HAVE_CONFIG_H | |||
| #ifdef HAVE_CONFIG_H | |||
| # include <config.h> | |||
| #endif | |||
| @@ -45,12 +45,7 @@ | |||
| /* VERSION should come from configure */ | |||
| FLAC_API const char *FLAC__VERSION_STRING = VERSION; | |||
| #if defined _MSC_VER || defined __BORLANDC__ || defined __MINW32__ | |||
| /* yet one more hack because of MSVC6: */ | |||
| FLAC_API const char *FLAC__VENDOR_STRING = "reference libFLAC 1.3.0 20130526"; | |||
| #else | |||
| FLAC_API const char *FLAC__VENDOR_STRING = "reference libFLAC " VERSION " 20130526"; | |||
| #endif | |||
| FLAC_API const char *FLAC__VENDOR_STRING = "reference libFLAC " VERSION " 20141125"; | |||
| FLAC_API const FLAC__byte FLAC__STREAM_SYNC_STRING[4] = { 'f','L','a','C' }; | |||
| FLAC_API const unsigned FLAC__STREAM_SYNC = 0x664C6143; | |||
| @@ -1,6 +1,6 @@ | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2000-2009 Josh Coalson | |||
| * Copyright (C) 2011-2013 Xiph.Org Foundation | |||
| * Copyright (C) 2011-2014 Xiph.Org Foundation | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions | |||
| @@ -1,6 +1,6 @@ | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2001-2009 Josh Coalson | |||
| * Copyright (C) 2011-2013 Xiph.Org Foundation | |||
| * Copyright (C) 2011-2014 Xiph.Org Foundation | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions | |||
| @@ -34,6 +34,7 @@ | |||
| #define FLAC__PRIVATE__BITMATH_H | |||
| #include "../../../ordinals.h" | |||
| #include "../../../assert.h" | |||
| /* for CHAR_BIT */ | |||
| #include <limits.h> | |||
| @@ -74,16 +75,19 @@ static inline unsigned int FLAC__clz_soft_uint32(unsigned int word) | |||
| static inline unsigned int FLAC__clz_uint32(FLAC__uint32 v) | |||
| { | |||
| /* Never used with input 0 */ | |||
| FLAC__ASSERT(v > 0); | |||
| #if defined(__INTEL_COMPILER) | |||
| return _bit_scan_reverse(v) ^ 31U; | |||
| #elif defined(__GNUC__) && (__GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) | |||
| /* This will translate either to (bsr ^ 31U), clz , ctlz, cntlz, lzcnt depending on | |||
| * -march= setting or to a software rutine in exotic machines. */ | |||
| * -march= setting or to a software routine in exotic machines. */ | |||
| return __builtin_clz(v); | |||
| #elif defined(_MSC_VER) && (_MSC_VER >= 1400) | |||
| FLAC__uint32 idx; | |||
| _BitScanReverse((DWORD*) &idx, v); | |||
| return idx ^ 31U; | |||
| { | |||
| unsigned long idx; | |||
| _BitScanReverse(&idx, v); | |||
| return idx ^ 31U; | |||
| } | |||
| #else | |||
| return FLAC__clz_soft_uint32(v); | |||
| #endif | |||
| @@ -99,7 +103,7 @@ static inline unsigned int FLAC__clz2_uint32(FLAC__uint32 v) | |||
| /* An example of what FLAC__bitmath_ilog2() computes: | |||
| * | |||
| * ilog2( 0) = undefined | |||
| * ilog2( 0) = assertion failure | |||
| * ilog2( 1) = 0 | |||
| * ilog2( 2) = 1 | |||
| * ilog2( 3) = 1 | |||
| @@ -122,45 +126,56 @@ static inline unsigned int FLAC__clz2_uint32(FLAC__uint32 v) | |||
| static inline unsigned FLAC__bitmath_ilog2(FLAC__uint32 v) | |||
| { | |||
| FLAC__ASSERT(v > 0); | |||
| #if defined(__INTEL_COMPILER) | |||
| return _bit_scan_reverse(v); | |||
| #elif defined(_MSC_VER) && (_MSC_VER >= 1400) | |||
| { | |||
| unsigned long idx; | |||
| _BitScanReverse(&idx, v); | |||
| return idx; | |||
| } | |||
| #else | |||
| return sizeof(FLAC__uint32) * CHAR_BIT - 1 - FLAC__clz_uint32(v); | |||
| #endif | |||
| } | |||
| #ifdef FLAC__INTEGER_ONLY_LIBRARY /*Unused otherwise */ | |||
| #ifdef FLAC__INTEGER_ONLY_LIBRARY /* Unused otherwise */ | |||
| static inline unsigned FLAC__bitmath_ilog2_wide(FLAC__uint64 v) | |||
| { | |||
| if (v == 0) | |||
| return 0; | |||
| FLAC__ASSERT(v > 0); | |||
| #if defined(__GNUC__) && (__GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) | |||
| return sizeof(FLAC__uint64) * CHAR_BIT - 1 - __builtin_clzll(v); | |||
| /* Sorry, only supported in win64/Itanium.. */ | |||
| #elif (defined(_MSC_VER) && (_MSC_VER >= 1400)) && (defined(_M_IA64) || defined(_WIN64)) | |||
| FLAC__uint64 idx; | |||
| _BitScanReverse64(&idx, v); | |||
| return idx ^ 63U; | |||
| /* Sorry, only supported in x64/Itanium.. and both have fast FPU which makes integer-only encoder pointless */ | |||
| #elif (defined(_MSC_VER) && (_MSC_VER >= 1400)) && (defined(_M_IA64) || defined(_M_X64)) | |||
| { | |||
| unsigned long idx; | |||
| _BitScanReverse64(&idx, v); | |||
| return idx; | |||
| } | |||
| #else | |||
| /* Brain-damaged compilers will use the fastest possible way that is, | |||
| /* Brain-damaged compilers will use the fastest possible way that is, | |||
| de Bruijn sequences (http://supertech.csail.mit.edu/papers/debruijn.pdf) | |||
| (C) Timothy B. Terriberry (tterribe@xiph.org) 2001-2009 LGPL (v2 or later). | |||
| (C) Timothy B. Terriberry (tterribe@xiph.org) 2001-2009 CC0 (Public domain). | |||
| */ | |||
| static const unsigned char DEBRUIJN_IDX64[64]={ | |||
| 0, 1, 2, 7, 3,13, 8,19, 4,25,14,28, 9,34,20,40, | |||
| 5,17,26,38,15,46,29,48,10,31,35,54,21,50,41,57, | |||
| 63, 6,12,18,24,27,33,39,16,37,45,47,30,53,49,56, | |||
| 62,11,23,32,36,44,52,55,61,22,43,51,60,42,59,58 | |||
| }; | |||
| int ret; | |||
| ret= v>0; | |||
| v|= v>>1; | |||
| v|= v>>2; | |||
| v|= v>>4; | |||
| v|= v>>8; | |||
| v|= v>>16; | |||
| v|= v>>32; | |||
| v= (v>>1)+1; | |||
| ret+=DEBRUIJN_IDX64[v*0x218A392CD3D5DBF>>58&0x3F]; | |||
| return ret; | |||
| { | |||
| static const unsigned char DEBRUIJN_IDX64[64]={ | |||
| 0, 1, 2, 7, 3,13, 8,19, 4,25,14,28, 9,34,20,40, | |||
| 5,17,26,38,15,46,29,48,10,31,35,54,21,50,41,57, | |||
| 63, 6,12,18,24,27,33,39,16,37,45,47,30,53,49,56, | |||
| 62,11,23,32,36,44,52,55,61,22,43,51,60,42,59,58 | |||
| }; | |||
| v|= v>>1; | |||
| v|= v>>2; | |||
| v|= v>>4; | |||
| v|= v>>8; | |||
| v|= v>>16; | |||
| v|= v>>32; | |||
| v= (v>>1)+1; | |||
| return DEBRUIJN_IDX64[v*0x218A392CD3D5DBF>>58&0x3F]; | |||
| } | |||
| #endif | |||
| } | |||
| #endif | |||
| @@ -1,6 +1,6 @@ | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2000-2009 Josh Coalson | |||
| * Copyright (C) 2011-2013 Xiph.Org Foundation | |||
| * Copyright (C) 2011-2014 Xiph.Org Foundation | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions | |||
| @@ -50,7 +50,7 @@ typedef FLAC__bool (*FLAC__BitReaderReadCallback)(FLAC__byte buffer[], size_t *b | |||
| */ | |||
| FLAC__BitReader *FLAC__bitreader_new(void); | |||
| void FLAC__bitreader_delete(FLAC__BitReader *br); | |||
| FLAC__bool FLAC__bitreader_init(FLAC__BitReader *br, FLAC__CPUInfo cpu, FLAC__BitReaderReadCallback rcb, void *cd); | |||
| FLAC__bool FLAC__bitreader_init(FLAC__BitReader *br, FLAC__BitReaderReadCallback rcb, void *cd); | |||
| void FLAC__bitreader_free(FLAC__BitReader *br); /* does not 'free(br)' */ | |||
| FLAC__bool FLAC__bitreader_clear(FLAC__BitReader *br); | |||
| void FLAC__bitreader_dump(const FLAC__BitReader *br, FILE *out); | |||
| @@ -82,19 +82,10 @@ FLAC__bool FLAC__bitreader_read_byte_block_aligned_no_crc(FLAC__BitReader *br, F | |||
| FLAC__bool FLAC__bitreader_read_unary_unsigned(FLAC__BitReader *br, unsigned *val); | |||
| FLAC__bool FLAC__bitreader_read_rice_signed(FLAC__BitReader *br, int *val, unsigned parameter); | |||
| FLAC__bool FLAC__bitreader_read_rice_signed_block(FLAC__BitReader *br, int vals[], unsigned nvals, unsigned parameter); | |||
| #ifndef FLAC__NO_ASM | |||
| # ifdef FLAC__CPU_IA32 | |||
| # ifdef FLAC__HAS_NASM | |||
| FLAC__bool FLAC__bitreader_read_rice_signed_block_asm_ia32_bswap(FLAC__BitReader *br, int vals[], unsigned nvals, unsigned parameter); | |||
| # endif | |||
| # endif | |||
| #endif | |||
| #if 0 /* UNUSED */ | |||
| FLAC__bool FLAC__bitreader_read_golomb_signed(FLAC__BitReader *br, int *val, unsigned parameter); | |||
| FLAC__bool FLAC__bitreader_read_golomb_unsigned(FLAC__BitReader *br, unsigned *val, unsigned parameter); | |||
| #endif | |||
| FLAC__bool FLAC__bitreader_read_utf8_uint32(FLAC__BitReader *br, FLAC__uint32 *val, FLAC__byte *raw, unsigned *rawlen); | |||
| FLAC__bool FLAC__bitreader_read_utf8_uint64(FLAC__BitReader *br, FLAC__uint64 *val, FLAC__byte *raw, unsigned *rawlen); | |||
| FLAC__bool bitreader_read_from_client_(FLAC__BitReader *br); | |||
| #endif | |||
| @@ -1,6 +1,6 @@ | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2000-2009 Josh Coalson | |||
| * Copyright (C) 2011-2013 Xiph.Org Foundation | |||
| * Copyright (C) 2011-2014 Xiph.Org Foundation | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions | |||
| @@ -1,6 +1,6 @@ | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2001-2009 Josh Coalson | |||
| * Copyright (C) 2011-2013 Xiph.Org Foundation | |||
| * Copyright (C) 2011-2014 Xiph.Org Foundation | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions | |||
| @@ -41,49 +41,59 @@ | |||
| typedef enum { | |||
| FLAC__CPUINFO_TYPE_IA32, | |||
| FLAC__CPUINFO_TYPE_PPC, | |||
| FLAC__CPUINFO_TYPE_X86_64, | |||
| FLAC__CPUINFO_TYPE_UNKNOWN | |||
| } FLAC__CPUInfo_Type; | |||
| #if defined FLAC__CPU_IA32 | |||
| typedef struct { | |||
| FLAC__bool cpuid; | |||
| FLAC__bool bswap; | |||
| FLAC__bool cmov; | |||
| FLAC__bool mmx; | |||
| FLAC__bool fxsr; | |||
| FLAC__bool sse; | |||
| FLAC__bool sse2; | |||
| FLAC__bool sse3; | |||
| FLAC__bool ssse3; | |||
| FLAC__bool _3dnow; | |||
| FLAC__bool ext3dnow; | |||
| FLAC__bool extmmx; | |||
| FLAC__bool sse41; | |||
| FLAC__bool sse42; | |||
| FLAC__bool avx; | |||
| FLAC__bool avx2; | |||
| FLAC__bool fma; | |||
| } FLAC__CPUInfo_IA32; | |||
| #elif defined FLAC__CPU_X86_64 | |||
| typedef struct { | |||
| FLAC__bool altivec; | |||
| FLAC__bool ppc64; | |||
| } FLAC__CPUInfo_PPC; | |||
| FLAC__bool sse3; | |||
| FLAC__bool ssse3; | |||
| FLAC__bool sse41; | |||
| FLAC__bool sse42; | |||
| FLAC__bool avx; | |||
| FLAC__bool avx2; | |||
| FLAC__bool fma; | |||
| } FLAC__CPUInfo_x86; | |||
| #endif | |||
| typedef struct { | |||
| FLAC__bool use_asm; | |||
| FLAC__CPUInfo_Type type; | |||
| union { | |||
| FLAC__CPUInfo_IA32 ia32; | |||
| FLAC__CPUInfo_PPC ppc; | |||
| } data; | |||
| #if defined FLAC__CPU_IA32 | |||
| FLAC__CPUInfo_IA32 ia32; | |||
| #elif defined FLAC__CPU_X86_64 | |||
| FLAC__CPUInfo_x86 x86; | |||
| #endif | |||
| } FLAC__CPUInfo; | |||
| void FLAC__cpu_info(FLAC__CPUInfo *info); | |||
| #ifndef FLAC__NO_ASM | |||
| #ifdef FLAC__CPU_IA32 | |||
| #ifdef FLAC__HAS_NASM | |||
| # if defined FLAC__CPU_IA32 && defined FLAC__HAS_NASM | |||
| FLAC__uint32 FLAC__cpu_have_cpuid_asm_ia32(void); | |||
| void FLAC__cpu_info_asm_ia32(FLAC__uint32 *flags_edx, FLAC__uint32 *flags_ecx); | |||
| FLAC__uint32 FLAC__cpu_info_extended_amd_asm_ia32(void); | |||
| #endif | |||
| #endif | |||
| # endif | |||
| # if (defined FLAC__CPU_IA32 || defined FLAC__CPU_X86_64) && defined FLAC__HAS_X86INTRIN | |||
| FLAC__uint32 FLAC__cpu_have_cpuid_x86(void); | |||
| void FLAC__cpu_info_x86(FLAC__uint32 level, FLAC__uint32 *eax, FLAC__uint32 *ebx, FLAC__uint32 *ecx, FLAC__uint32 *edx); | |||
| FLAC__uint32 FLAC__cpu_xgetbv_x86(void); | |||
| # endif | |||
| #endif | |||
| #endif | |||
| @@ -1,6 +1,6 @@ | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2000-2009 Josh Coalson | |||
| * Copyright (C) 2011-2013 Xiph.Org Foundation | |||
| * Copyright (C) 2011-2014 Xiph.Org Foundation | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions | |||
| @@ -51,7 +51,7 @@ FLAC__uint8 FLAC__crc8(const FLAC__byte *data, unsigned len); | |||
| */ | |||
| extern unsigned const FLAC__crc16_table[256]; | |||
| #define FLAC__CRC16_UPDATE(data, crc) (((((crc)<<8) & 0xffff) ^ FLAC__crc16_table[((crc)>>8) ^ (data)])) | |||
| #define FLAC__CRC16_UPDATE(data, crc) ((((crc)<<8) & 0xffff) ^ FLAC__crc16_table[((crc)>>8) ^ (data)]) | |||
| /* this alternate may be faster on some systems/compilers */ | |||
| #if 0 | |||
| #define FLAC__CRC16_UPDATE(data, crc) ((((crc)<<8) ^ FLAC__crc16_table[((crc)>>8) ^ (data)]) & 0xffff) | |||
| @@ -1,6 +1,6 @@ | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2000-2009 Josh Coalson | |||
| * Copyright (C) 2011-2013 Xiph.Org Foundation | |||
| * Copyright (C) 2011-2014 Xiph.Org Foundation | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions | |||
| @@ -37,6 +37,7 @@ | |||
| #include <config.h> | |||
| #endif | |||
| #include "cpu.h" | |||
| #include "float.h" | |||
| #include "../../../format.h" | |||
| @@ -54,14 +55,22 @@ | |||
| */ | |||
| #ifndef FLAC__INTEGER_ONLY_LIBRARY | |||
| unsigned FLAC__fixed_compute_best_predictor(const FLAC__int32 data[], unsigned data_len, FLAC__float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]); | |||
| unsigned FLAC__fixed_compute_best_predictor_wide(const FLAC__int32 data[], unsigned data_len, FLAC__float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]); | |||
| # ifndef FLAC__NO_ASM | |||
| # ifdef FLAC__CPU_IA32 | |||
| # ifdef FLAC__HAS_NASM | |||
| unsigned FLAC__fixed_compute_best_predictor_asm_ia32_mmx_cmov(const FLAC__int32 data[], unsigned data_len, FLAC__float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]); | |||
| # if (defined FLAC__CPU_IA32 || defined FLAC__CPU_X86_64) && defined FLAC__HAS_X86INTRIN | |||
| # ifdef FLAC__SSE2_SUPPORTED | |||
| unsigned FLAC__fixed_compute_best_predictor_intrin_sse2(const FLAC__int32 data[], unsigned data_len, FLAC__float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER + 1]); | |||
| unsigned FLAC__fixed_compute_best_predictor_wide_intrin_sse2(const FLAC__int32 data[], unsigned data_len, FLAC__float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER + 1]); | |||
| # endif | |||
| # ifdef FLAC__SSSE3_SUPPORTED | |||
| unsigned FLAC__fixed_compute_best_predictor_intrin_ssse3(const FLAC__int32 data[], unsigned data_len, FLAC__float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]); | |||
| unsigned FLAC__fixed_compute_best_predictor_wide_intrin_ssse3(const FLAC__int32 data[], unsigned data_len, FLAC__float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER + 1]); | |||
| # endif | |||
| # endif | |||
| # if defined FLAC__CPU_IA32 && defined FLAC__HAS_NASM | |||
| unsigned FLAC__fixed_compute_best_predictor_asm_ia32_mmx_cmov(const FLAC__int32 data[], unsigned data_len, FLAC__float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]); | |||
| # endif | |||
| # endif | |||
| unsigned FLAC__fixed_compute_best_predictor_wide(const FLAC__int32 data[], unsigned data_len, FLAC__float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]); | |||
| #else | |||
| unsigned FLAC__fixed_compute_best_predictor(const FLAC__int32 data[], unsigned data_len, FLAC__fixedpoint residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]); | |||
| unsigned FLAC__fixed_compute_best_predictor_wide(const FLAC__int32 data[], unsigned data_len, FLAC__fixedpoint residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]); | |||
| @@ -1,6 +1,6 @@ | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2004-2009 Josh Coalson | |||
| * Copyright (C) 2011-2013 Xiph.Org Foundation | |||
| * Copyright (C) 2011-2014 Xiph.Org Foundation | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions | |||
| @@ -1,6 +1,6 @@ | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2000-2009 Josh Coalson | |||
| * Copyright (C) 2011-2013 Xiph.Org Foundation | |||
| * Copyright (C) 2011-2014 Xiph.Org Foundation | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions | |||
| @@ -1,6 +1,6 @@ | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2000-2009 Josh Coalson | |||
| * Copyright (C) 2011-2013 Xiph.Org Foundation | |||
| * Copyright (C) 2011-2014 Xiph.Org Foundation | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions | |||
| @@ -37,6 +37,7 @@ | |||
| #include <config.h> | |||
| #endif | |||
| #include "cpu.h" | |||
| #include "float.h" | |||
| #include "../../../format.h" | |||
| @@ -75,7 +76,15 @@ void FLAC__lpc_compute_autocorrelation_asm_ia32(const FLAC__real data[], unsigne | |||
| void FLAC__lpc_compute_autocorrelation_asm_ia32_sse_lag_4(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]); | |||
| void FLAC__lpc_compute_autocorrelation_asm_ia32_sse_lag_8(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]); | |||
| void FLAC__lpc_compute_autocorrelation_asm_ia32_sse_lag_12(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]); | |||
| void FLAC__lpc_compute_autocorrelation_asm_ia32_3dnow(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]); | |||
| void FLAC__lpc_compute_autocorrelation_asm_ia32_sse_lag_16(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]); | |||
| # endif | |||
| # endif | |||
| # if (defined FLAC__CPU_IA32 || defined FLAC__CPU_X86_64) && defined FLAC__HAS_X86INTRIN | |||
| # ifdef FLAC__SSE_SUPPORTED | |||
| void FLAC__lpc_compute_autocorrelation_intrin_sse_lag_4(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]); | |||
| void FLAC__lpc_compute_autocorrelation_intrin_sse_lag_8(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]); | |||
| void FLAC__lpc_compute_autocorrelation_intrin_sse_lag_12(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]); | |||
| void FLAC__lpc_compute_autocorrelation_intrin_sse_lag_16(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]); | |||
| # endif | |||
| # endif | |||
| #endif | |||
| @@ -145,6 +154,22 @@ void FLAC__lpc_compute_residual_from_qlp_coefficients_wide(const FLAC__int32 *da | |||
| # ifdef FLAC__HAS_NASM | |||
| void FLAC__lpc_compute_residual_from_qlp_coefficients_asm_ia32(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]); | |||
| void FLAC__lpc_compute_residual_from_qlp_coefficients_asm_ia32_mmx(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]); | |||
| void FLAC__lpc_compute_residual_from_qlp_coefficients_wide_asm_ia32(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]); | |||
| # endif | |||
| # endif | |||
| # if (defined FLAC__CPU_IA32 || defined FLAC__CPU_X86_64) && defined FLAC__HAS_X86INTRIN | |||
| # ifdef FLAC__SSE2_SUPPORTED | |||
| void FLAC__lpc_compute_residual_from_qlp_coefficients_16_intrin_sse2(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]); | |||
| void FLAC__lpc_compute_residual_from_qlp_coefficients_intrin_sse2(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]); | |||
| # endif | |||
| # ifdef FLAC__SSE4_1_SUPPORTED | |||
| void FLAC__lpc_compute_residual_from_qlp_coefficients_intrin_sse41(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]); | |||
| void FLAC__lpc_compute_residual_from_qlp_coefficients_wide_intrin_sse41(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]); | |||
| # endif | |||
| # ifdef FLAC__AVX2_SUPPORTED | |||
| void FLAC__lpc_compute_residual_from_qlp_coefficients_16_intrin_avx2(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]); | |||
| void FLAC__lpc_compute_residual_from_qlp_coefficients_intrin_avx2(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]); | |||
| void FLAC__lpc_compute_residual_from_qlp_coefficients_wide_intrin_avx2(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]); | |||
| # endif | |||
| # endif | |||
| #endif | |||
| @@ -173,11 +198,17 @@ void FLAC__lpc_restore_signal_wide(const FLAC__int32 residual[], unsigned data_l | |||
| # ifdef FLAC__HAS_NASM | |||
| void FLAC__lpc_restore_signal_asm_ia32(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]); | |||
| void FLAC__lpc_restore_signal_asm_ia32_mmx(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]); | |||
| void FLAC__lpc_restore_signal_wide_asm_ia32(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]); | |||
| # endif /* FLAC__HAS_NASM */ | |||
| # elif defined FLAC__CPU_PPC | |||
| void FLAC__lpc_restore_signal_asm_ppc_altivec_16(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]); | |||
| void FLAC__lpc_restore_signal_asm_ppc_altivec_16_order8(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]); | |||
| # endif/* FLAC__CPU_IA32 || FLAC__CPU_PPC */ | |||
| # endif /* FLAC__CPU_IA32 */ | |||
| # if (defined FLAC__CPU_IA32 || defined FLAC__CPU_X86_64) && defined FLAC__HAS_X86INTRIN | |||
| # ifdef FLAC__SSE2_SUPPORTED | |||
| void FLAC__lpc_restore_signal_16_intrin_sse2(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]); | |||
| # endif | |||
| # ifdef FLAC__SSE4_1_SUPPORTED | |||
| void FLAC__lpc_restore_signal_wide_intrin_sse41(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]); | |||
| # endif | |||
| # endif | |||
| #endif /* FLAC__NO_ASM */ | |||
| #ifndef FLAC__INTEGER_ONLY_LIBRARY | |||
| @@ -28,11 +28,17 @@ | |||
| #include "../../../ordinals.h" | |||
| typedef union { | |||
| FLAC__byte *p8; | |||
| FLAC__int16 *p16; | |||
| FLAC__int32 *p32; | |||
| } FLAC__multibyte; | |||
| typedef struct { | |||
| FLAC__uint32 in[16]; | |||
| FLAC__uint32 buf[4]; | |||
| FLAC__uint32 bytes[2]; | |||
| FLAC__byte *internal_buf; | |||
| FLAC__multibyte internal_buf; | |||
| size_t capacity; | |||
| } FLAC__MD5Context; | |||
| @@ -1,6 +1,6 @@ | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2001-2009 Josh Coalson | |||
| * Copyright (C) 2011-2013 Xiph.Org Foundation | |||
| * Copyright (C) 2011-2014 Xiph.Org Foundation | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions | |||
| @@ -1,6 +1,6 @@ | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2002-2009 Josh Coalson | |||
| * Copyright (C) 2011-2013 Xiph.Org Foundation | |||
| * Copyright (C) 2011-2014 Xiph.Org Foundation | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions | |||
| @@ -0,0 +1,67 @@ | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2000-2009 Josh Coalson | |||
| * Copyright (C) 2011-2014 Xiph.Org Foundation | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions | |||
| * are met: | |||
| * | |||
| * - Redistributions of source code must retain the above copyright | |||
| * notice, this list of conditions and the following disclaimer. | |||
| * | |||
| * - Redistributions in binary form must reproduce the above copyright | |||
| * notice, this list of conditions and the following disclaimer in the | |||
| * documentation and/or other materials provided with the distribution. | |||
| * | |||
| * - Neither the name of the Xiph.org Foundation nor the names of its | |||
| * contributors may be used to endorse or promote products derived from | |||
| * this software without specific prior written permission. | |||
| * | |||
| * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |||
| * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | |||
| * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | |||
| * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR | |||
| * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, | |||
| * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, | |||
| * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR | |||
| * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF | |||
| * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING | |||
| * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | |||
| * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||
| */ | |||
| #ifndef FLAC__PRIVATE__STREAM_ENCODER_H | |||
| #define FLAC__PRIVATE__STREAM_ENCODER_H | |||
| #ifdef HAVE_CONFIG_H | |||
| #include <config.h> | |||
| #endif | |||
| /* | |||
| * This is used to avoid overflow with unusual signals in 32-bit | |||
| * accumulator in the *precompute_partition_info_sums_* functions. | |||
| */ | |||
| #define FLAC__MAX_EXTRA_RESIDUAL_BPS 4 | |||
| #if (defined FLAC__CPU_IA32 || defined FLAC__CPU_X86_64) && defined FLAC__HAS_X86INTRIN | |||
| #include "cpu.h" | |||
| #include "../../../format.h" | |||
| #ifdef FLAC__SSE2_SUPPORTED | |||
| extern void FLAC__precompute_partition_info_sums_intrin_sse2(const FLAC__int32 residual[], FLAC__uint64 abs_residual_partition_sums[], | |||
| unsigned residual_samples, unsigned predictor_order, unsigned min_partition_order, unsigned max_partition_order, unsigned bps); | |||
| #endif | |||
| #ifdef FLAC__SSSE3_SUPPORTED | |||
| extern void FLAC__precompute_partition_info_sums_intrin_ssse3(const FLAC__int32 residual[], FLAC__uint64 abs_residual_partition_sums[], | |||
| unsigned residual_samples, unsigned predictor_order, unsigned min_partition_order, unsigned max_partition_order, unsigned bps); | |||
| #endif | |||
| #ifdef FLAC__AVX2_SUPPORTED | |||
| extern void FLAC__precompute_partition_info_sums_intrin_avx2(const FLAC__int32 residual[], FLAC__uint64 abs_residual_partition_sums[], | |||
| unsigned residual_samples, unsigned predictor_order, unsigned min_partition_order, unsigned max_partition_order, unsigned bps); | |||
| #endif | |||
| #endif | |||
| #endif | |||
| @@ -1,6 +1,6 @@ | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2000-2009 Josh Coalson | |||
| * Copyright (C) 2011-2013 Xiph.Org Foundation | |||
| * Copyright (C) 2011-2014 Xiph.Org Foundation | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions | |||
| @@ -1,6 +1,6 @@ | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2006-2009 Josh Coalson | |||
| * Copyright (C) 2011-2013 Xiph.Org Foundation | |||
| * Copyright (C) 2011-2014 Xiph.Org Foundation | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions | |||
| @@ -65,6 +65,8 @@ void FLAC__window_nuttall(FLAC__real *window, const FLAC__int32 L); | |||
| void FLAC__window_rectangle(FLAC__real *window, const FLAC__int32 L); | |||
| void FLAC__window_triangle(FLAC__real *window, const FLAC__int32 L); | |||
| void FLAC__window_tukey(FLAC__real *window, const FLAC__int32 L, const FLAC__real p); | |||
| void FLAC__window_partial_tukey(FLAC__real *window, const FLAC__int32 L, const FLAC__real p, const FLAC__real start, const FLAC__real end); | |||
| void FLAC__window_punchout_tukey(FLAC__real *window, const FLAC__int32 L, const FLAC__real p, const FLAC__real start, const FLAC__real end); | |||
| void FLAC__window_welch(FLAC__real *window, const FLAC__int32 L); | |||
| #endif /* !defined FLAC__INTEGER_ONLY_LIBRARY */ | |||
| @@ -1,6 +1,6 @@ | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2001-2009 Josh Coalson | |||
| * Copyright (C) 2011-2013 Xiph.Org Foundation | |||
| * Copyright (C) 2011-2014 Xiph.Org Foundation | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions | |||
| @@ -1,6 +1,6 @@ | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2000-2009 Josh Coalson | |||
| * Copyright (C) 2011-2013 Xiph.Org Foundation | |||
| * Copyright (C) 2011-2014 Xiph.Org Foundation | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions | |||
| @@ -40,6 +40,7 @@ | |||
| typedef struct FLAC__StreamDecoderProtected { | |||
| FLAC__StreamDecoderState state; | |||
| FLAC__StreamDecoderInitStatus initstate; | |||
| unsigned channels; | |||
| FLAC__ChannelAssignment channel_assignment; | |||
| unsigned bits_per_sample; | |||
| @@ -1,6 +1,6 @@ | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2001-2009 Josh Coalson | |||
| * Copyright (C) 2011-2013 Xiph.Org Foundation | |||
| * Copyright (C) 2011-2014 Xiph.Org Foundation | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions | |||
| @@ -59,6 +59,8 @@ typedef enum { | |||
| FLAC__APODIZATION_RECTANGLE, | |||
| FLAC__APODIZATION_TRIANGLE, | |||
| FLAC__APODIZATION_TUKEY, | |||
| FLAC__APODIZATION_PARTIAL_TUKEY, | |||
| FLAC__APODIZATION_PUNCHOUT_TUKEY, | |||
| FLAC__APODIZATION_WELCH | |||
| } FLAC__ApodizationFunction; | |||
| @@ -71,6 +73,11 @@ typedef struct { | |||
| struct { | |||
| FLAC__real p; | |||
| } tukey; | |||
| struct { | |||
| FLAC__real p; | |||
| FLAC__real start; | |||
| FLAC__real end; | |||
| } multiple_tukey; | |||
| } parameters; | |||
| } FLAC__ApodizationSpecification; | |||
| @@ -1,6 +1,6 @@ | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2000-2009 Josh Coalson | |||
| * Copyright (C) 2011-2013 Xiph.Org Foundation | |||
| * Copyright (C) 2011-2014 Xiph.Org Foundation | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions | |||
| @@ -30,7 +30,7 @@ | |||
| * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||
| */ | |||
| #if HAVE_CONFIG_H | |||
| #ifdef HAVE_CONFIG_H | |||
| # include <config.h> | |||
| #endif | |||
| @@ -50,11 +50,6 @@ | |||
| #ifndef FLAC__INTEGER_ONLY_LIBRARY | |||
| #ifndef M_LN2 | |||
| /* math.h in VC++ doesn't seem to have this (how Microsoft is that?) */ | |||
| #define M_LN2 0.69314718055994530942 | |||
| #endif | |||
| #if !defined(HAVE_LROUND) | |||
| #if defined(_MSC_VER) | |||
| #include <float.h> | |||
| @@ -65,7 +60,7 @@ | |||
| static inline long int lround(double x) { | |||
| return (long)(x + copysign (0.5, x)); | |||
| } | |||
| //If this fails, we are in the precence of a mid 90's compiler..move along... | |||
| /* If this fails, we are in the presence of a mid 90's compiler, move along... */ | |||
| #endif | |||
| void FLAC__lpc_window_data(const FLAC__int32 in[], const FLAC__real window[], FLAC__real out[], unsigned data_len) | |||
| @@ -160,7 +155,7 @@ void FLAC__lpc_compute_lp_coefficients(const FLAC__real autoc[], unsigned *max_o | |||
| lp_coeff[i][j] = (FLAC__real)(-lpc[j]); /* negate FIR filter coeff to get predictor coeff */ | |||
| error[i] = err; | |||
| /* see SF bug #1601812 http://sourceforge.net/tracker/index.php?func=detail&aid=1601812&group_id=13478&atid=113478 */ | |||
| /* see SF bug https://sourceforge.net/p/flac/bugs/234/ */ | |||
| if(err == 0.0) { | |||
| *max_order = i+1; | |||
| return; | |||
| @@ -264,7 +259,12 @@ int FLAC__lpc_quantize_coefficients(const FLAC__real lp_coeff[], unsigned order, | |||
| return 0; | |||
| } | |||
| void FLAC__lpc_compute_residual_from_qlp_coefficients(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]) | |||
| #if defined(_MSC_VER) | |||
| // silence MSVC warnings about __restrict modifier | |||
| #pragma warning ( disable : 4028 ) | |||
| #endif | |||
| void FLAC__lpc_compute_residual_from_qlp_coefficients(const FLAC__int32 * flac_restrict data, unsigned data_len, const FLAC__int32 * flac_restrict qlp_coeff, unsigned order, int lp_quantization, FLAC__int32 * flac_restrict residual) | |||
| #if defined(FLAC__OVERFLOW_DETECT) || !defined(FLAC__LPC_UNROLLED_FILTER_LOOPS) | |||
| { | |||
| FLAC__int64 sumo; | |||
| @@ -524,7 +524,7 @@ void FLAC__lpc_compute_residual_from_qlp_coefficients(const FLAC__int32 *data, u | |||
| } | |||
| #endif | |||
| void FLAC__lpc_compute_residual_from_qlp_coefficients_wide(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]) | |||
| void FLAC__lpc_compute_residual_from_qlp_coefficients_wide(const FLAC__int32 * flac_restrict data, unsigned data_len, const FLAC__int32 * flac_restrict qlp_coeff, unsigned order, int lp_quantization, FLAC__int32 * flac_restrict residual) | |||
| #if defined(FLAC__OVERFLOW_DETECT) || !defined(FLAC__LPC_UNROLLED_FILTER_LOOPS) | |||
| { | |||
| unsigned i, j; | |||
| @@ -780,7 +780,7 @@ void FLAC__lpc_compute_residual_from_qlp_coefficients_wide(const FLAC__int32 *da | |||
| #endif /* !defined FLAC__INTEGER_ONLY_LIBRARY */ | |||
| void FLAC__lpc_restore_signal(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]) | |||
| void FLAC__lpc_restore_signal(const FLAC__int32 * flac_restrict residual, unsigned data_len, const FLAC__int32 * flac_restrict qlp_coeff, unsigned order, int lp_quantization, FLAC__int32 * flac_restrict data) | |||
| #if defined(FLAC__OVERFLOW_DETECT) || !defined(FLAC__LPC_UNROLLED_FILTER_LOOPS) | |||
| { | |||
| FLAC__int64 sumo; | |||
| @@ -1041,7 +1041,7 @@ void FLAC__lpc_restore_signal(const FLAC__int32 residual[], unsigned data_len, c | |||
| } | |||
| #endif | |||
| void FLAC__lpc_restore_signal_wide(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]) | |||
| void FLAC__lpc_restore_signal_wide(const FLAC__int32 * flac_restrict residual, unsigned data_len, const FLAC__int32 * flac_restrict qlp_coeff, unsigned order, int lp_quantization, FLAC__int32 * flac_restrict data) | |||
| #if defined(FLAC__OVERFLOW_DETECT) || !defined(FLAC__LPC_UNROLLED_FILTER_LOOPS) | |||
| { | |||
| unsigned i, j; | |||
| @@ -1295,6 +1295,10 @@ void FLAC__lpc_restore_signal_wide(const FLAC__int32 residual[], unsigned data_l | |||
| } | |||
| #endif | |||
| #if defined(_MSC_VER) | |||
| #pragma warning ( default : 4028 ) | |||
| #endif | |||
| #ifndef FLAC__INTEGER_ONLY_LIBRARY | |||
| FLAC__double FLAC__lpc_compute_expected_bits_per_residual_sample(FLAC__double lpc_error, unsigned total_samples) | |||
| @@ -1,4 +1,4 @@ | |||
| #if HAVE_CONFIG_H | |||
| #ifdef HAVE_CONFIG_H | |||
| # include <config.h> | |||
| #endif | |||
| @@ -7,6 +7,7 @@ | |||
| #include "include/private/md5.h" | |||
| #include "../alloc.h" | |||
| #include "../endswap.h" | |||
| /* | |||
| * This code implements the MD5 message-digest algorithm. | |||
| @@ -223,7 +224,7 @@ void FLAC__MD5Init(FLAC__MD5Context *ctx) | |||
| ctx->bytes[0] = 0; | |||
| ctx->bytes[1] = 0; | |||
| ctx->internal_buf = 0; | |||
| ctx->internal_buf.p8= 0; | |||
| ctx->capacity = 0; | |||
| } | |||
| @@ -259,9 +260,9 @@ void FLAC__MD5Final(FLAC__byte digest[16], FLAC__MD5Context *ctx) | |||
| byteSwap(ctx->buf, 4); | |||
| memcpy(digest, ctx->buf, 16); | |||
| if(0 != ctx->internal_buf) { | |||
| free(ctx->internal_buf); | |||
| ctx->internal_buf = 0; | |||
| if (0 != ctx->internal_buf.p8) { | |||
| free(ctx->internal_buf.p8); | |||
| ctx->internal_buf.p8= 0; | |||
| ctx->capacity = 0; | |||
| } | |||
| memset(ctx, 0, sizeof(*ctx)); /* In case it's sensitive */ | |||
| @@ -270,58 +271,124 @@ void FLAC__MD5Final(FLAC__byte digest[16], FLAC__MD5Context *ctx) | |||
| /* | |||
| * Convert the incoming audio signal to a byte stream | |||
| */ | |||
| static void format_input_(FLAC__byte *buf, const FLAC__int32 * const signal[], unsigned channels, unsigned samples, unsigned bytes_per_sample) | |||
| static void format_input_(FLAC__multibyte *mbuf, const FLAC__int32 * const signal[], unsigned channels, unsigned samples, unsigned bytes_per_sample) | |||
| { | |||
| FLAC__byte *buf_ = mbuf->p8; | |||
| FLAC__int16 *buf16 = mbuf->p16; | |||
| FLAC__int32 *buf32 = mbuf->p32; | |||
| FLAC__int32 a_word; | |||
| unsigned channel, sample; | |||
| register FLAC__int32 a_word; | |||
| register FLAC__byte *buf_ = buf; | |||
| #if WORDS_BIGENDIAN | |||
| #else | |||
| if(channels == 2 && bytes_per_sample == 2) { | |||
| FLAC__int16 *buf1_ = ((FLAC__int16*)buf_) + 1; | |||
| memcpy(buf_, signal[0], sizeof(FLAC__int32) * samples); | |||
| for(sample = 0; sample < samples; sample++, buf1_+=2) | |||
| *buf1_ = (FLAC__int16)signal[1][sample]; | |||
| } | |||
| else if(channels == 1 && bytes_per_sample == 2) { | |||
| FLAC__int16 *buf1_ = (FLAC__int16*)buf_; | |||
| for(sample = 0; sample < samples; sample++) | |||
| *buf1_++ = (FLAC__int16)signal[0][sample]; | |||
| } | |||
| else | |||
| #endif | |||
| if(bytes_per_sample == 2) { | |||
| if(channels == 2) { | |||
| for(sample = 0; sample < samples; sample++) { | |||
| a_word = signal[0][sample]; | |||
| *buf_++ = (FLAC__byte)a_word; a_word >>= 8; | |||
| *buf_++ = (FLAC__byte)a_word; | |||
| a_word = signal[1][sample]; | |||
| *buf_++ = (FLAC__byte)a_word; a_word >>= 8; | |||
| *buf_++ = (FLAC__byte)a_word; | |||
| /* Storage in the output buffer, buf, is little endian. */ | |||
| #define BYTES_CHANNEL_SELECTOR(bytes, channels) (bytes * 100 + channels) | |||
| /* First do the most commonly used combinations. */ | |||
| switch (BYTES_CHANNEL_SELECTOR (bytes_per_sample, channels)) { | |||
| /* One byte per sample. */ | |||
| case (BYTES_CHANNEL_SELECTOR (1, 1)): | |||
| for (sample = 0; sample < samples; sample++) | |||
| *buf_++ = signal[0][sample]; | |||
| return; | |||
| case (BYTES_CHANNEL_SELECTOR (1, 2)): | |||
| for (sample = 0; sample < samples; sample++) { | |||
| *buf_++ = signal[0][sample]; | |||
| *buf_++ = signal[1][sample]; | |||
| } | |||
| } | |||
| else if(channels == 1) { | |||
| for(sample = 0; sample < samples; sample++) { | |||
| return; | |||
| case (BYTES_CHANNEL_SELECTOR (1, 4)): | |||
| for (sample = 0; sample < samples; sample++) { | |||
| *buf_++ = signal[0][sample]; | |||
| *buf_++ = signal[1][sample]; | |||
| *buf_++ = signal[2][sample]; | |||
| *buf_++ = signal[3][sample]; | |||
| } | |||
| return; | |||
| case (BYTES_CHANNEL_SELECTOR (1, 6)): | |||
| for (sample = 0; sample < samples; sample++) { | |||
| *buf_++ = signal[0][sample]; | |||
| *buf_++ = signal[1][sample]; | |||
| *buf_++ = signal[2][sample]; | |||
| *buf_++ = signal[3][sample]; | |||
| *buf_++ = signal[4][sample]; | |||
| *buf_++ = signal[5][sample]; | |||
| } | |||
| return; | |||
| case (BYTES_CHANNEL_SELECTOR (1, 8)): | |||
| for (sample = 0; sample < samples; sample++) { | |||
| *buf_++ = signal[0][sample]; | |||
| *buf_++ = signal[1][sample]; | |||
| *buf_++ = signal[2][sample]; | |||
| *buf_++ = signal[3][sample]; | |||
| *buf_++ = signal[4][sample]; | |||
| *buf_++ = signal[5][sample]; | |||
| *buf_++ = signal[6][sample]; | |||
| *buf_++ = signal[7][sample]; | |||
| } | |||
| return; | |||
| /* Two bytes per sample. */ | |||
| case (BYTES_CHANNEL_SELECTOR (2, 1)): | |||
| for (sample = 0; sample < samples; sample++) | |||
| *buf16++ = H2LE_16(signal[0][sample]); | |||
| return; | |||
| case (BYTES_CHANNEL_SELECTOR (2, 2)): | |||
| for (sample = 0; sample < samples; sample++) { | |||
| *buf16++ = H2LE_16(signal[0][sample]); | |||
| *buf16++ = H2LE_16(signal[1][sample]); | |||
| } | |||
| return; | |||
| case (BYTES_CHANNEL_SELECTOR (2, 4)): | |||
| for (sample = 0; sample < samples; sample++) { | |||
| *buf16++ = H2LE_16(signal[0][sample]); | |||
| *buf16++ = H2LE_16(signal[1][sample]); | |||
| *buf16++ = H2LE_16(signal[2][sample]); | |||
| *buf16++ = H2LE_16(signal[3][sample]); | |||
| } | |||
| return; | |||
| case (BYTES_CHANNEL_SELECTOR (2, 6)): | |||
| for (sample = 0; sample < samples; sample++) { | |||
| *buf16++ = H2LE_16(signal[0][sample]); | |||
| *buf16++ = H2LE_16(signal[1][sample]); | |||
| *buf16++ = H2LE_16(signal[2][sample]); | |||
| *buf16++ = H2LE_16(signal[3][sample]); | |||
| *buf16++ = H2LE_16(signal[4][sample]); | |||
| *buf16++ = H2LE_16(signal[5][sample]); | |||
| } | |||
| return; | |||
| case (BYTES_CHANNEL_SELECTOR (2, 8)): | |||
| for (sample = 0; sample < samples; sample++) { | |||
| *buf16++ = H2LE_16(signal[0][sample]); | |||
| *buf16++ = H2LE_16(signal[1][sample]); | |||
| *buf16++ = H2LE_16(signal[2][sample]); | |||
| *buf16++ = H2LE_16(signal[3][sample]); | |||
| *buf16++ = H2LE_16(signal[4][sample]); | |||
| *buf16++ = H2LE_16(signal[5][sample]); | |||
| *buf16++ = H2LE_16(signal[6][sample]); | |||
| *buf16++ = H2LE_16(signal[7][sample]); | |||
| } | |||
| return; | |||
| /* Three bytes per sample. */ | |||
| case (BYTES_CHANNEL_SELECTOR (3, 1)): | |||
| for (sample = 0; sample < samples; sample++) { | |||
| a_word = signal[0][sample]; | |||
| *buf_++ = (FLAC__byte)a_word; a_word >>= 8; | |||
| *buf_++ = (FLAC__byte)a_word; a_word >>= 8; | |||
| *buf_++ = (FLAC__byte)a_word; | |||
| } | |||
| } | |||
| else { | |||
| for(sample = 0; sample < samples; sample++) { | |||
| for(channel = 0; channel < channels; channel++) { | |||
| a_word = signal[channel][sample]; | |||
| *buf_++ = (FLAC__byte)a_word; a_word >>= 8; | |||
| *buf_++ = (FLAC__byte)a_word; | |||
| } | |||
| } | |||
| } | |||
| } | |||
| else if(bytes_per_sample == 3) { | |||
| if(channels == 2) { | |||
| for(sample = 0; sample < samples; sample++) { | |||
| return; | |||
| case (BYTES_CHANNEL_SELECTOR (3, 2)): | |||
| for (sample = 0; sample < samples; sample++) { | |||
| a_word = signal[0][sample]; | |||
| *buf_++ = (FLAC__byte)a_word; a_word >>= 8; | |||
| *buf_++ = (FLAC__byte)a_word; a_word >>= 8; | |||
| @@ -331,60 +398,90 @@ static void format_input_(FLAC__byte *buf, const FLAC__int32 * const signal[], u | |||
| *buf_++ = (FLAC__byte)a_word; a_word >>= 8; | |||
| *buf_++ = (FLAC__byte)a_word; | |||
| } | |||
| } | |||
| else if(channels == 1) { | |||
| for(sample = 0; sample < samples; sample++) { | |||
| a_word = signal[0][sample]; | |||
| *buf_++ = (FLAC__byte)a_word; a_word >>= 8; | |||
| *buf_++ = (FLAC__byte)a_word; a_word >>= 8; | |||
| *buf_++ = (FLAC__byte)a_word; | |||
| return; | |||
| /* Four bytes per sample. */ | |||
| case (BYTES_CHANNEL_SELECTOR (4, 1)): | |||
| for (sample = 0; sample < samples; sample++) | |||
| *buf32++ = H2LE_32(signal[0][sample]); | |||
| return; | |||
| case (BYTES_CHANNEL_SELECTOR (4, 2)): | |||
| for (sample = 0; sample < samples; sample++) { | |||
| *buf32++ = H2LE_32(signal[0][sample]); | |||
| *buf32++ = H2LE_32(signal[1][sample]); | |||
| } | |||
| } | |||
| else { | |||
| for(sample = 0; sample < samples; sample++) { | |||
| for(channel = 0; channel < channels; channel++) { | |||
| a_word = signal[channel][sample]; | |||
| *buf_++ = (FLAC__byte)a_word; a_word >>= 8; | |||
| *buf_++ = (FLAC__byte)a_word; a_word >>= 8; | |||
| *buf_++ = (FLAC__byte)a_word; | |||
| } | |||
| return; | |||
| case (BYTES_CHANNEL_SELECTOR (4, 4)): | |||
| for (sample = 0; sample < samples; sample++) { | |||
| *buf32++ = H2LE_32(signal[0][sample]); | |||
| *buf32++ = H2LE_32(signal[1][sample]); | |||
| *buf32++ = H2LE_32(signal[2][sample]); | |||
| *buf32++ = H2LE_32(signal[3][sample]); | |||
| } | |||
| } | |||
| } | |||
| else if(bytes_per_sample == 1) { | |||
| if(channels == 2) { | |||
| for(sample = 0; sample < samples; sample++) { | |||
| a_word = signal[0][sample]; | |||
| *buf_++ = (FLAC__byte)a_word; | |||
| a_word = signal[1][sample]; | |||
| *buf_++ = (FLAC__byte)a_word; | |||
| return; | |||
| case (BYTES_CHANNEL_SELECTOR (4, 6)): | |||
| for (sample = 0; sample < samples; sample++) { | |||
| *buf32++ = H2LE_32(signal[0][sample]); | |||
| *buf32++ = H2LE_32(signal[1][sample]); | |||
| *buf32++ = H2LE_32(signal[2][sample]); | |||
| *buf32++ = H2LE_32(signal[3][sample]); | |||
| *buf32++ = H2LE_32(signal[4][sample]); | |||
| *buf32++ = H2LE_32(signal[5][sample]); | |||
| } | |||
| } | |||
| else if(channels == 1) { | |||
| for(sample = 0; sample < samples; sample++) { | |||
| a_word = signal[0][sample]; | |||
| *buf_++ = (FLAC__byte)a_word; | |||
| return; | |||
| case (BYTES_CHANNEL_SELECTOR (4, 8)): | |||
| for (sample = 0; sample < samples; sample++) { | |||
| *buf32++ = H2LE_32(signal[0][sample]); | |||
| *buf32++ = H2LE_32(signal[1][sample]); | |||
| *buf32++ = H2LE_32(signal[2][sample]); | |||
| *buf32++ = H2LE_32(signal[3][sample]); | |||
| *buf32++ = H2LE_32(signal[4][sample]); | |||
| *buf32++ = H2LE_32(signal[5][sample]); | |||
| *buf32++ = H2LE_32(signal[6][sample]); | |||
| *buf32++ = H2LE_32(signal[7][sample]); | |||
| } | |||
| } | |||
| else { | |||
| for(sample = 0; sample < samples; sample++) { | |||
| for(channel = 0; channel < channels; channel++) { | |||
| return; | |||
| default: | |||
| break; | |||
| } | |||
| /* General version. */ | |||
| switch (bytes_per_sample) { | |||
| case 1: | |||
| for (sample = 0; sample < samples; sample++) | |||
| for (channel = 0; channel < channels; channel++) | |||
| *buf_++ = signal[channel][sample]; | |||
| return; | |||
| case 2: | |||
| for (sample = 0; sample < samples; sample++) | |||
| for (channel = 0; channel < channels; channel++) | |||
| *buf16++ = H2LE_16(signal[channel][sample]); | |||
| return; | |||
| case 3: | |||
| for (sample = 0; sample < samples; sample++) | |||
| for (channel = 0; channel < channels; channel++) { | |||
| a_word = signal[channel][sample]; | |||
| *buf_++ = (FLAC__byte)a_word; a_word >>= 8; | |||
| *buf_++ = (FLAC__byte)a_word; a_word >>= 8; | |||
| *buf_++ = (FLAC__byte)a_word; | |||
| } | |||
| } | |||
| } | |||
| } | |||
| else { /* bytes_per_sample == 4, maybe optimize more later */ | |||
| for(sample = 0; sample < samples; sample++) { | |||
| for(channel = 0; channel < channels; channel++) { | |||
| a_word = signal[channel][sample]; | |||
| *buf_++ = (FLAC__byte)a_word; a_word >>= 8; | |||
| *buf_++ = (FLAC__byte)a_word; a_word >>= 8; | |||
| *buf_++ = (FLAC__byte)a_word; a_word >>= 8; | |||
| *buf_++ = (FLAC__byte)a_word; | |||
| } | |||
| } | |||
| return; | |||
| case 4: | |||
| for (sample = 0; sample < samples; sample++) | |||
| for (channel = 0; channel < channels; channel++) | |||
| *buf32++ = H2LE_32(signal[channel][sample]); | |||
| return; | |||
| default: | |||
| break; | |||
| } | |||
| } | |||
| @@ -396,26 +493,26 @@ FLAC__bool FLAC__MD5Accumulate(FLAC__MD5Context *ctx, const FLAC__int32 * const | |||
| const size_t bytes_needed = (size_t)channels * (size_t)samples * (size_t)bytes_per_sample; | |||
| /* overflow check */ | |||
| if((size_t)channels > SIZE_MAX / (size_t)bytes_per_sample) | |||
| if ((size_t)channels > SIZE_MAX / (size_t)bytes_per_sample) | |||
| return false; | |||
| if((size_t)channels * (size_t)bytes_per_sample > SIZE_MAX / (size_t)samples) | |||
| if ((size_t)channels * (size_t)bytes_per_sample > SIZE_MAX / (size_t)samples) | |||
| return false; | |||
| if(ctx->capacity < bytes_needed) { | |||
| FLAC__byte *tmp = (FLAC__byte*) realloc(ctx->internal_buf, bytes_needed); | |||
| if(0 == tmp) { | |||
| free(ctx->internal_buf); | |||
| if(0 == (ctx->internal_buf = (FLAC__byte*) safe_malloc_(bytes_needed))) | |||
| if (ctx->capacity < bytes_needed) { | |||
| FLAC__byte *tmp = (FLAC__byte*) realloc(ctx->internal_buf.p8, bytes_needed); | |||
| if (0 == tmp) { | |||
| free(ctx->internal_buf.p8); | |||
| if (0 == (ctx->internal_buf.p8= (FLAC__byte*) safe_malloc_(bytes_needed))) | |||
| return false; | |||
| } | |||
| else | |||
| ctx->internal_buf = tmp; | |||
| ctx->internal_buf.p8= tmp; | |||
| ctx->capacity = bytes_needed; | |||
| } | |||
| format_input_(ctx->internal_buf, signal, channels, samples, bytes_per_sample); | |||
| format_input_(&ctx->internal_buf, signal, channels, samples, bytes_per_sample); | |||
| FLAC__MD5Update(ctx, ctx->internal_buf, bytes_needed); | |||
| FLAC__MD5Update(ctx, ctx->internal_buf.p8, bytes_needed); | |||
| return true; | |||
| } | |||
| @@ -1,6 +1,6 @@ | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2001-2009 Josh Coalson | |||
| * Copyright (C) 2011-2013 Xiph.Org Foundation | |||
| * Copyright (C) 2011-2014 Xiph.Org Foundation | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions | |||
| @@ -30,10 +30,14 @@ | |||
| * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||
| */ | |||
| #if HAVE_CONFIG_H | |||
| #ifdef HAVE_CONFIG_H | |||
| # include <config.h> | |||
| #endif | |||
| #ifdef HAVE_STDINT_H | |||
| #include <stdint.h> | |||
| #endif | |||
| #include "include/private/memory.h" | |||
| #include "../assert.h" | |||
| #include "../alloc.h" | |||
| @@ -46,25 +50,8 @@ void *FLAC__memory_alloc_aligned(size_t bytes, void **aligned_address) | |||
| #ifdef FLAC__ALIGN_MALLOC_DATA | |||
| /* align on 32-byte (256-bit) boundary */ | |||
| x = safe_malloc_add_2op_(bytes, /*+*/31); | |||
| #ifdef SIZEOF_VOIDP | |||
| #if SIZEOF_VOIDP == 4 | |||
| /* could do *aligned_address = x + ((unsigned) (32 - (((unsigned)x) & 31))) & 31; */ | |||
| *aligned_address = (void*)(((unsigned)x + 31) & -32); | |||
| #elif SIZEOF_VOIDP == 8 | |||
| *aligned_address = (void*)(((FLAC__uint64)x + 31) & (FLAC__uint64)(-((FLAC__int64)32))); | |||
| #else | |||
| # error Unsupported sizeof(void*) | |||
| #endif | |||
| #else | |||
| /* there's got to be a better way to do this right for all archs */ | |||
| if(sizeof(void*) == sizeof(unsigned)) | |||
| *aligned_address = (void*)(((unsigned)x + 31) & -32); | |||
| else if(sizeof(void*) == sizeof(FLAC__uint64)) | |||
| *aligned_address = (void*)(((FLAC__uint64)x + 31) & (FLAC__uint64)(-((FLAC__int64)32))); | |||
| else | |||
| return 0; | |||
| #endif | |||
| x = safe_malloc_add_2op_(bytes, /*+*/31L); | |||
| *aligned_address = (void*)(((uintptr_t)x + 31L) & -32L); | |||
| #else | |||
| x = safe_malloc_(bytes); | |||
| *aligned_address = x; | |||
| @@ -1,6 +1,6 @@ | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2000-2009 Josh Coalson | |||
| * Copyright (C) 2011-2013 Xiph.Org Foundation | |||
| * Copyright (C) 2011-2014 Xiph.Org Foundation | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions | |||
| @@ -30,7 +30,7 @@ | |||
| * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||
| */ | |||
| #if HAVE_CONFIG_H | |||
| #ifdef HAVE_CONFIG_H | |||
| # include <config.h> | |||
| #endif | |||
| @@ -70,7 +70,7 @@ FLAC_API int FLAC_API_SUPPORTS_OGG_FLAC = | |||
| * | |||
| ***********************************************************************/ | |||
| static FLAC__byte ID3V2_TAG_[3] = { 'I', 'D', '3' }; | |||
| static const FLAC__byte ID3V2_TAG_[3] = { 'I', 'D', '3' }; | |||
| /*********************************************************************** | |||
| * | |||
| @@ -86,7 +86,7 @@ static FLAC__bool find_metadata_(FLAC__StreamDecoder *decoder); | |||
| static FLAC__bool read_metadata_(FLAC__StreamDecoder *decoder); | |||
| static FLAC__bool read_metadata_streaminfo_(FLAC__StreamDecoder *decoder, FLAC__bool is_last, unsigned length); | |||
| static FLAC__bool read_metadata_seektable_(FLAC__StreamDecoder *decoder, FLAC__bool is_last, unsigned length); | |||
| static FLAC__bool read_metadata_vorbiscomment_(FLAC__StreamDecoder *decoder, FLAC__StreamMetadata_VorbisComment *obj); | |||
| static FLAC__bool read_metadata_vorbiscomment_(FLAC__StreamDecoder *decoder, FLAC__StreamMetadata_VorbisComment *obj, unsigned length); | |||
| static FLAC__bool read_metadata_cuesheet_(FLAC__StreamDecoder *decoder, FLAC__StreamMetadata_CueSheet *obj); | |||
| static FLAC__bool read_metadata_picture_(FLAC__StreamDecoder *decoder, FLAC__StreamMetadata_Picture *obj); | |||
| static FLAC__bool skip_id3v2_tag_(FLAC__StreamDecoder *decoder); | |||
| @@ -141,9 +141,6 @@ typedef struct FLAC__StreamDecoderPrivate { | |||
| void (*local_lpc_restore_signal_64bit)(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]); | |||
| /* for use when the signal is <= 16 bits-per-sample, or <= 15 bits-per-sample on a side channel (which requires 1 extra bit): */ | |||
| void (*local_lpc_restore_signal_16bit)(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]); | |||
| /* for use when the signal is <= 16 bits-per-sample, or <= 15 bits-per-sample on a side channel (which requires 1 extra bit), AND order <= 8: */ | |||
| void (*local_lpc_restore_signal_16bit_order8)(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]); | |||
| FLAC__bool (*local_bitreader_read_rice_signed_block)(FLAC__BitReader *br, int vals[], unsigned nvals, unsigned parameter); | |||
| void *client_data; | |||
| FILE *file; /* only used if FLAC__stream_decoder_init_file()/FLAC__stream_decoder_init_file() called, else NULL */ | |||
| FLAC__BitReader *input; | |||
| @@ -380,7 +377,7 @@ static FLAC__StreamDecoderInitStatus init_stream_internal_( | |||
| #if FLAC__HAS_OGG | |||
| decoder->private_->is_ogg = is_ogg; | |||
| if(is_ogg && !FLAC__ogg_decoder_aspect_init(&decoder->protected_->ogg_decoder_aspect)) | |||
| return decoder->protected_->state = FLAC__STREAM_DECODER_OGG_ERROR; | |||
| return decoder->protected_->initstate = FLAC__STREAM_DECODER_INIT_STATUS_ERROR_OPENING_FILE; | |||
| #endif | |||
| /* | |||
| @@ -391,42 +388,44 @@ static FLAC__StreamDecoderInitStatus init_stream_internal_( | |||
| decoder->private_->local_lpc_restore_signal = FLAC__lpc_restore_signal; | |||
| decoder->private_->local_lpc_restore_signal_64bit = FLAC__lpc_restore_signal_wide; | |||
| decoder->private_->local_lpc_restore_signal_16bit = FLAC__lpc_restore_signal; | |||
| decoder->private_->local_lpc_restore_signal_16bit_order8 = FLAC__lpc_restore_signal; | |||
| decoder->private_->local_bitreader_read_rice_signed_block = FLAC__bitreader_read_rice_signed_block; | |||
| /* now override with asm where appropriate */ | |||
| #ifndef FLAC__NO_ASM | |||
| if(decoder->private_->cpuinfo.use_asm) { | |||
| #ifdef FLAC__CPU_IA32 | |||
| FLAC__ASSERT(decoder->private_->cpuinfo.type == FLAC__CPUINFO_TYPE_IA32); | |||
| #ifdef FLAC__HAS_NASM | |||
| #if 1 /*@@@@@@ OPT: not clearly faster, needs more testing */ | |||
| if(decoder->private_->cpuinfo.data.ia32.bswap) | |||
| decoder->private_->local_bitreader_read_rice_signed_block = FLAC__bitreader_read_rice_signed_block_asm_ia32_bswap; | |||
| #endif | |||
| if(decoder->private_->cpuinfo.data.ia32.mmx) { | |||
| decoder->private_->local_lpc_restore_signal_64bit = FLAC__lpc_restore_signal_wide_asm_ia32; /* OPT_IA32: was really necessary for GCC < 4.9 */ | |||
| if(decoder->private_->cpuinfo.ia32.mmx) { | |||
| decoder->private_->local_lpc_restore_signal = FLAC__lpc_restore_signal_asm_ia32; | |||
| decoder->private_->local_lpc_restore_signal_16bit = FLAC__lpc_restore_signal_asm_ia32_mmx; | |||
| decoder->private_->local_lpc_restore_signal_16bit_order8 = FLAC__lpc_restore_signal_asm_ia32_mmx; | |||
| } | |||
| else { | |||
| decoder->private_->local_lpc_restore_signal = FLAC__lpc_restore_signal_asm_ia32; | |||
| decoder->private_->local_lpc_restore_signal_16bit = FLAC__lpc_restore_signal_asm_ia32; | |||
| decoder->private_->local_lpc_restore_signal_16bit_order8 = FLAC__lpc_restore_signal_asm_ia32; | |||
| } | |||
| #endif | |||
| #elif defined FLAC__CPU_PPC | |||
| FLAC__ASSERT(decoder->private_->cpuinfo.type == FLAC__CPUINFO_TYPE_PPC); | |||
| if(decoder->private_->cpuinfo.data.ppc.altivec) { | |||
| decoder->private_->local_lpc_restore_signal_16bit = FLAC__lpc_restore_signal_asm_ppc_altivec_16; | |||
| decoder->private_->local_lpc_restore_signal_16bit_order8 = FLAC__lpc_restore_signal_asm_ppc_altivec_16_order8; | |||
| #ifdef FLAC__HAS_X86INTRIN | |||
| # if defined FLAC__SSE2_SUPPORTED && !defined FLAC__HAS_NASM /* OPT_SSE: not better than MMX asm */ | |||
| if(decoder->private_->cpuinfo.ia32.sse2) { | |||
| decoder->private_->local_lpc_restore_signal_16bit = FLAC__lpc_restore_signal_16_intrin_sse2; | |||
| } | |||
| # endif | |||
| # if defined FLAC__SSE4_1_SUPPORTED | |||
| if(decoder->private_->cpuinfo.ia32.sse41) { | |||
| decoder->private_->local_lpc_restore_signal_64bit = FLAC__lpc_restore_signal_wide_intrin_sse41; | |||
| } | |||
| # endif | |||
| #endif | |||
| #elif defined FLAC__CPU_X86_64 | |||
| FLAC__ASSERT(decoder->private_->cpuinfo.type == FLAC__CPUINFO_TYPE_X86_64); | |||
| /* No useful SSE optimizations yet */ | |||
| #endif | |||
| } | |||
| #endif | |||
| /* from here on, errors are fatal */ | |||
| if(!FLAC__bitreader_init(decoder->private_->input, decoder->private_->cpuinfo, read_callback_, decoder)) { | |||
| if(!FLAC__bitreader_init(decoder->private_->input, read_callback_, decoder)) { | |||
| decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; | |||
| return FLAC__STREAM_DECODER_INIT_STATUS_MEMORY_ALLOCATION_ERROR; | |||
| } | |||
| @@ -528,10 +527,10 @@ static FLAC__StreamDecoderInitStatus init_FILE_internal_( | |||
| FLAC__ASSERT(0 != file); | |||
| if(decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED) | |||
| return (FLAC__StreamDecoderInitStatus) (decoder->protected_->state = (FLAC__StreamDecoderState) FLAC__STREAM_DECODER_INIT_STATUS_ALREADY_INITIALIZED); | |||
| return decoder->protected_->initstate = FLAC__STREAM_DECODER_INIT_STATUS_ALREADY_INITIALIZED; | |||
| if(0 == write_callback || 0 == error_callback) | |||
| return (FLAC__StreamDecoderInitStatus) (decoder->protected_->state = (FLAC__StreamDecoderState) FLAC__STREAM_DECODER_INIT_STATUS_INVALID_CALLBACKS); | |||
| return decoder->protected_->initstate = FLAC__STREAM_DECODER_INIT_STATUS_INVALID_CALLBACKS; | |||
| /* | |||
| * To make sure that our file does not go unclosed after an error, we | |||
| @@ -602,10 +601,10 @@ static FLAC__StreamDecoderInitStatus init_file_internal_( | |||
| * in FLAC__stream_decoder_init_FILE() before the FILE* is assigned. | |||
| */ | |||
| if(decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED) | |||
| return (FLAC__StreamDecoderInitStatus) (decoder->protected_->state = (FLAC__StreamDecoderState) FLAC__STREAM_DECODER_INIT_STATUS_ALREADY_INITIALIZED); | |||
| return decoder->protected_->initstate = FLAC__STREAM_DECODER_INIT_STATUS_ALREADY_INITIALIZED; | |||
| if(0 == write_callback || 0 == error_callback) | |||
| return (FLAC__StreamDecoderInitStatus) (decoder->protected_->state = (FLAC__StreamDecoderState) FLAC__STREAM_DECODER_INIT_STATUS_INVALID_CALLBACKS); | |||
| return decoder->protected_->initstate = FLAC__STREAM_DECODER_INIT_STATUS_INVALID_CALLBACKS; | |||
| file = filename? flac_fopen(filename, "rb") : stdin; | |||
| @@ -652,7 +651,7 @@ FLAC_API FLAC__bool FLAC__stream_decoder_finish(FLAC__StreamDecoder *decoder) | |||
| if(decoder->protected_->state == FLAC__STREAM_DECODER_UNINITIALIZED) | |||
| return true; | |||
| /* see the comment in FLAC__seekable_stream_decoder_reset() as to why we | |||
| /* see the comment in FLAC__stream_decoder_reset() as to why we | |||
| * always call FLAC__MD5Final() | |||
| */ | |||
| FLAC__MD5Final(decoder->private_->computed_md5sum, &decoder->private_->md5context); | |||
| @@ -1316,9 +1315,6 @@ FLAC__bool allocate_output_(FLAC__StreamDecoder *decoder, unsigned size, unsigne | |||
| memset(tmp, 0, sizeof(FLAC__int32)*4); | |||
| decoder->private_->output[i] = tmp + 4; | |||
| /* WATCHOUT: | |||
| * minimum of quadword alignment for PPC vector optimizations is REQUIRED: | |||
| */ | |||
| if(!FLAC__memory_alloc_aligned_int32_array(size, &decoder->private_->residual_unaligned[i], &decoder->private_->residual[i])) { | |||
| decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; | |||
| return false; | |||
| @@ -1348,12 +1344,12 @@ FLAC__bool has_id_filtered_(FLAC__StreamDecoder *decoder, FLAC__byte *id) | |||
| FLAC__bool find_metadata_(FLAC__StreamDecoder *decoder) | |||
| { | |||
| FLAC__uint32 x; | |||
| unsigned i, id_; | |||
| unsigned i, id; | |||
| FLAC__bool first = true; | |||
| FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)); | |||
| for(i = id_ = 0; i < 4; ) { | |||
| for(i = id = 0; i < 4; ) { | |||
| if(decoder->private_->cached) { | |||
| x = (FLAC__uint32)decoder->private_->lookahead; | |||
| decoder->private_->cached = false; | |||
| @@ -1365,19 +1361,23 @@ FLAC__bool find_metadata_(FLAC__StreamDecoder *decoder) | |||
| if(x == FLAC__STREAM_SYNC_STRING[i]) { | |||
| first = true; | |||
| i++; | |||
| id_ = 0; | |||
| id = 0; | |||
| continue; | |||
| } | |||
| if(x == ID3V2_TAG_[id_]) { | |||
| id_++; | |||
| if(id >= 3) | |||
| return false; | |||
| if(x == ID3V2_TAG_[id]) { | |||
| id++; | |||
| i = 0; | |||
| if(id_ == 3) { | |||
| if(id == 3) { | |||
| if(!skip_id3v2_tag_(decoder)) | |||
| return false; /* skip_id3v2_tag_ sets the state for us */ | |||
| } | |||
| continue; | |||
| } | |||
| id_ = 0; | |||
| id = 0; | |||
| if(x == 0xff) { /* MAGIC NUMBER for the first 8 frame sync bits */ | |||
| decoder->private_->header_warmup[0] = (FLAC__byte)x; | |||
| if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8)) | |||
| @@ -1446,6 +1446,7 @@ FLAC__bool read_metadata_(FLAC__StreamDecoder *decoder) | |||
| unsigned real_length = length; | |||
| FLAC__StreamMetadata block; | |||
| memset(&block, 0, sizeof(block)); | |||
| block.is_last = is_last; | |||
| block.type = (FLAC__MetadataType)type; | |||
| block.length = length; | |||
| @@ -1470,36 +1471,37 @@ FLAC__bool read_metadata_(FLAC__StreamDecoder *decoder) | |||
| return false; /* read_callback_ sets the state for us */ | |||
| } | |||
| else { | |||
| FLAC__bool ok = true; | |||
| switch(type) { | |||
| case FLAC__METADATA_TYPE_PADDING: | |||
| /* skip the padding bytes */ | |||
| if(!FLAC__bitreader_skip_byte_block_aligned_no_crc(decoder->private_->input, real_length)) | |||
| return false; /* read_callback_ sets the state for us */ | |||
| ok = false; /* read_callback_ sets the state for us */ | |||
| break; | |||
| case FLAC__METADATA_TYPE_APPLICATION: | |||
| /* remember, we read the ID already */ | |||
| if(real_length > 0) { | |||
| if(0 == (block.data.application.data = (FLAC__byte*) malloc(real_length))) { | |||
| decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; | |||
| return false; | |||
| ok = false; | |||
| } | |||
| if(!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, block.data.application.data, real_length)) | |||
| return false; /* read_callback_ sets the state for us */ | |||
| else if(!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, block.data.application.data, real_length)) | |||
| ok = false; /* read_callback_ sets the state for us */ | |||
| } | |||
| else | |||
| block.data.application.data = 0; | |||
| break; | |||
| case FLAC__METADATA_TYPE_VORBIS_COMMENT: | |||
| if(!read_metadata_vorbiscomment_(decoder, &block.data.vorbis_comment)) | |||
| return false; | |||
| if(!read_metadata_vorbiscomment_(decoder, &block.data.vorbis_comment, real_length)) | |||
| ok = false; | |||
| break; | |||
| case FLAC__METADATA_TYPE_CUESHEET: | |||
| if(!read_metadata_cuesheet_(decoder, &block.data.cue_sheet)) | |||
| return false; | |||
| ok = false; | |||
| break; | |||
| case FLAC__METADATA_TYPE_PICTURE: | |||
| if(!read_metadata_picture_(decoder, &block.data.picture)) | |||
| return false; | |||
| ok = false; | |||
| break; | |||
| case FLAC__METADATA_TYPE_STREAMINFO: | |||
| case FLAC__METADATA_TYPE_SEEKTABLE: | |||
| @@ -1509,16 +1511,16 @@ FLAC__bool read_metadata_(FLAC__StreamDecoder *decoder) | |||
| if(real_length > 0) { | |||
| if(0 == (block.data.unknown.data = (FLAC__byte*) malloc(real_length))) { | |||
| decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; | |||
| return false; | |||
| ok = false; | |||
| } | |||
| if(!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, block.data.unknown.data, real_length)) | |||
| return false; /* read_callback_ sets the state for us */ | |||
| else if(!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, block.data.unknown.data, real_length)) | |||
| ok = false; /* read_callback_ sets the state for us */ | |||
| } | |||
| else | |||
| block.data.unknown.data = 0; | |||
| break; | |||
| } | |||
| if(!decoder->private_->is_seeking && decoder->private_->metadata_callback) | |||
| if(ok && !decoder->private_->is_seeking && decoder->private_->metadata_callback) | |||
| decoder->private_->metadata_callback(decoder, &block, decoder->private_->client_data); | |||
| /* now we have to free any malloc()ed data in the block */ | |||
| @@ -1563,6 +1565,9 @@ FLAC__bool read_metadata_(FLAC__StreamDecoder *decoder) | |||
| free(block.data.unknown.data); | |||
| break; | |||
| } | |||
| if(!ok) /* anything that unsets "ok" should also make sure decoder->protected_->state is updated */ | |||
| return false; | |||
| } | |||
| } | |||
| @@ -1689,58 +1694,88 @@ FLAC__bool read_metadata_seektable_(FLAC__StreamDecoder *decoder, FLAC__bool is_ | |||
| return true; | |||
| } | |||
| FLAC__bool read_metadata_vorbiscomment_(FLAC__StreamDecoder *decoder, FLAC__StreamMetadata_VorbisComment *obj) | |||
| FLAC__bool read_metadata_vorbiscomment_(FLAC__StreamDecoder *decoder, FLAC__StreamMetadata_VorbisComment *obj, unsigned length) | |||
| { | |||
| FLAC__uint32 i; | |||
| FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)); | |||
| /* read vendor string */ | |||
| FLAC__ASSERT(FLAC__STREAM_METADATA_VORBIS_COMMENT_ENTRY_LENGTH_LEN == 32); | |||
| if(!FLAC__bitreader_read_uint32_little_endian(decoder->private_->input, &obj->vendor_string.length)) | |||
| return false; /* read_callback_ sets the state for us */ | |||
| if(obj->vendor_string.length > 0) { | |||
| if(0 == (obj->vendor_string.entry = (FLAC__byte*) safe_malloc_add_2op_(obj->vendor_string.length, /*+*/1))) { | |||
| decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; | |||
| return false; | |||
| } | |||
| if(!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, obj->vendor_string.entry, obj->vendor_string.length)) | |||
| if (length >= 8) { | |||
| length -= 8; /* vendor string length + num comments entries alone take 8 bytes */ | |||
| FLAC__ASSERT(FLAC__STREAM_METADATA_VORBIS_COMMENT_ENTRY_LENGTH_LEN == 32); | |||
| if (!FLAC__bitreader_read_uint32_little_endian(decoder->private_->input, &obj->vendor_string.length)) | |||
| return false; /* read_callback_ sets the state for us */ | |||
| obj->vendor_string.entry[obj->vendor_string.length] = '\0'; | |||
| } | |||
| else | |||
| obj->vendor_string.entry = 0; | |||
| if (obj->vendor_string.length > 0) { | |||
| if (length < obj->vendor_string.length) { | |||
| obj->vendor_string.length = 0; | |||
| obj->vendor_string.entry = 0; | |||
| goto skip; | |||
| } | |||
| else | |||
| length -= obj->vendor_string.length; | |||
| if (0 == (obj->vendor_string.entry = (FLAC__byte*) safe_malloc_add_2op_(obj->vendor_string.length, /*+*/1))) { | |||
| decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; | |||
| return false; | |||
| } | |||
| if (!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, obj->vendor_string.entry, obj->vendor_string.length)) | |||
| return false; /* read_callback_ sets the state for us */ | |||
| obj->vendor_string.entry[obj->vendor_string.length] = '\0'; | |||
| } | |||
| else | |||
| obj->vendor_string.entry = 0; | |||
| /* read num comments */ | |||
| FLAC__ASSERT(FLAC__STREAM_METADATA_VORBIS_COMMENT_NUM_COMMENTS_LEN == 32); | |||
| if(!FLAC__bitreader_read_uint32_little_endian(decoder->private_->input, &obj->num_comments)) | |||
| return false; /* read_callback_ sets the state for us */ | |||
| /* read num comments */ | |||
| FLAC__ASSERT(FLAC__STREAM_METADATA_VORBIS_COMMENT_NUM_COMMENTS_LEN == 32); | |||
| if (!FLAC__bitreader_read_uint32_little_endian(decoder->private_->input, &obj->num_comments)) | |||
| return false; /* read_callback_ sets the state for us */ | |||
| /* read comments */ | |||
| if(obj->num_comments > 0) { | |||
| if(0 == (obj->comments = (FLAC__StreamMetadata_VorbisComment_Entry*) safe_malloc_mul_2op_p(obj->num_comments, /*times*/sizeof(FLAC__StreamMetadata_VorbisComment_Entry)))) { | |||
| decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; | |||
| return false; | |||
| } | |||
| for(i = 0; i < obj->num_comments; i++) { | |||
| FLAC__ASSERT(FLAC__STREAM_METADATA_VORBIS_COMMENT_ENTRY_LENGTH_LEN == 32); | |||
| if(!FLAC__bitreader_read_uint32_little_endian(decoder->private_->input, &obj->comments[i].length)) | |||
| return false; /* read_callback_ sets the state for us */ | |||
| if(obj->comments[i].length > 0) { | |||
| if(0 == (obj->comments[i].entry = (FLAC__byte*) safe_malloc_add_2op_(obj->comments[i].length, /*+*/1))) { | |||
| decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; | |||
| return false; | |||
| /* read comments */ | |||
| if (obj->num_comments > 0) { | |||
| if (0 == (obj->comments = (FLAC__StreamMetadata_VorbisComment_Entry*) safe_malloc_mul_2op_p(obj->num_comments, /*times*/sizeof(FLAC__StreamMetadata_VorbisComment_Entry)))) { | |||
| decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; | |||
| return false; | |||
| } | |||
| for (i = 0; i < obj->num_comments; i++) { | |||
| FLAC__ASSERT(FLAC__STREAM_METADATA_VORBIS_COMMENT_ENTRY_LENGTH_LEN == 32); | |||
| if (length < 4) { | |||
| obj->num_comments = i; | |||
| goto skip; | |||
| } | |||
| if(!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, obj->comments[i].entry, obj->comments[i].length)) | |||
| else | |||
| length -= 4; | |||
| if (!FLAC__bitreader_read_uint32_little_endian(decoder->private_->input, &obj->comments[i].length)) | |||
| return false; /* read_callback_ sets the state for us */ | |||
| obj->comments[i].entry[obj->comments[i].length] = '\0'; | |||
| if (obj->comments[i].length > 0) { | |||
| if (length < obj->comments[i].length) { | |||
| obj->comments[i].length = 0; | |||
| obj->comments[i].entry = 0; | |||
| obj->num_comments = i; | |||
| goto skip; | |||
| } | |||
| else | |||
| length -= obj->comments[i].length; | |||
| if (0 == (obj->comments[i].entry = (FLAC__byte*) safe_malloc_add_2op_(obj->comments[i].length, /*+*/1))) { | |||
| decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; | |||
| return false; | |||
| } | |||
| if (!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, obj->comments[i].entry, obj->comments[i].length)) | |||
| return false; /* read_callback_ sets the state for us */ | |||
| obj->comments[i].entry[obj->comments[i].length] = '\0'; | |||
| } | |||
| else | |||
| obj->comments[i].entry = 0; | |||
| } | |||
| else | |||
| obj->comments[i].entry = 0; | |||
| } | |||
| else | |||
| obj->comments = 0; | |||
| } | |||
| else { | |||
| obj->comments = 0; | |||
| skip: | |||
| if (length > 0) { | |||
| /* This will only happen on files with invalid data in comments */ | |||
| if(!FLAC__bitreader_skip_byte_block_aligned_no_crc(decoder->private_->input, length)) | |||
| return false; /* read_callback_ sets the state for us */ | |||
| } | |||
| return true; | |||
| @@ -2655,12 +2690,8 @@ FLAC__bool read_subframe_lpc_(FLAC__StreamDecoder *decoder, unsigned channel, un | |||
| if( (FLAC__uint64)order * ((((FLAC__uint64)1)<<bps)-1) * ((1<<subframe->qlp_coeff_precision)-1) < (((FLAC__uint64)-1) << 32) ) | |||
| */ | |||
| if(bps + subframe->qlp_coeff_precision + FLAC__bitmath_ilog2(order) <= 32) | |||
| if(bps <= 16 && subframe->qlp_coeff_precision <= 16) { | |||
| if(order <= 8) | |||
| decoder->private_->local_lpc_restore_signal_16bit_order8(decoder->private_->residual[channel], decoder->private_->frame.header.blocksize-order, subframe->qlp_coeff, order, subframe->quantization_level, decoder->private_->output[channel]+order); | |||
| else | |||
| decoder->private_->local_lpc_restore_signal_16bit(decoder->private_->residual[channel], decoder->private_->frame.header.blocksize-order, subframe->qlp_coeff, order, subframe->quantization_level, decoder->private_->output[channel]+order); | |||
| } | |||
| if(bps <= 16 && subframe->qlp_coeff_precision <= 16) | |||
| decoder->private_->local_lpc_restore_signal_16bit(decoder->private_->residual[channel], decoder->private_->frame.header.blocksize-order, subframe->qlp_coeff, order, subframe->quantization_level, decoder->private_->output[channel]+order); | |||
| else | |||
| decoder->private_->local_lpc_restore_signal(decoder->private_->residual[channel], decoder->private_->frame.header.blocksize-order, subframe->qlp_coeff, order, subframe->quantization_level, decoder->private_->output[channel]+order); | |||
| else | |||
| @@ -2708,14 +2739,16 @@ FLAC__bool read_residual_partitioned_rice_(FLAC__StreamDecoder *decoder, unsigne | |||
| if(decoder->private_->frame.header.blocksize < predictor_order) { | |||
| send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC); | |||
| decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; | |||
| return true; | |||
| /* We have received a potentially malicious bit stream. All we can do is error out to avoid a heap overflow. */ | |||
| return false; | |||
| } | |||
| } | |||
| else { | |||
| if(partition_samples < predictor_order) { | |||
| send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC); | |||
| decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; | |||
| return true; | |||
| /* We have received a potentially malicious bit stream. All we can do is error out to avoid a heap overflow. */ | |||
| return false; | |||
| } | |||
| } | |||
| @@ -2732,7 +2765,7 @@ FLAC__bool read_residual_partitioned_rice_(FLAC__StreamDecoder *decoder, unsigne | |||
| if(rice_parameter < pesc) { | |||
| partitioned_rice_contents->raw_bits[partition] = 0; | |||
| u = (partition_order == 0 || partition > 0)? partition_samples : partition_samples - predictor_order; | |||
| if(!decoder->private_->local_bitreader_read_rice_signed_block(decoder->private_->input, residual + sample, u, rice_parameter)) | |||
| if(!FLAC__bitreader_read_rice_signed_block(decoder->private_->input, residual + sample, u, rice_parameter)) | |||
| return false; /* read_callback_ sets the state for us */ | |||
| sample += u; | |||
| } | |||
| @@ -3074,12 +3107,7 @@ FLAC__bool seek_to_absolute_sample_(FLAC__StreamDecoder *decoder, FLAC__uint64 s | |||
| return false; | |||
| } | |||
| #ifndef FLAC__INTEGER_ONLY_LIBRARY | |||
| #if defined _MSC_VER || defined __MINGW32__ | |||
| /* with VC++ you have to spoon feed it the casting */ | |||
| pos = (FLAC__int64)lower_bound + (FLAC__int64)((FLAC__double)(FLAC__int64)(target_sample - lower_bound_sample) / (FLAC__double)(FLAC__int64)(upper_bound_sample - lower_bound_sample) * (FLAC__double)(FLAC__int64)(upper_bound - lower_bound)) - approx_bytes_per_frame; | |||
| #else | |||
| pos = (FLAC__int64)lower_bound + (FLAC__int64)((FLAC__double)(target_sample - lower_bound_sample) / (FLAC__double)(upper_bound_sample - lower_bound_sample) * (FLAC__double)(upper_bound - lower_bound)) - approx_bytes_per_frame; | |||
| #endif | |||
| #else | |||
| /* a little less accurate: */ | |||
| if(upper_bound - lower_bound < 0xffffffff) | |||
| @@ -3203,12 +3231,7 @@ FLAC__bool seek_to_absolute_sample_ogg_(FLAC__StreamDecoder *decoder, FLAC__uint | |||
| } | |||
| else { | |||
| #ifndef FLAC__INTEGER_ONLY_LIBRARY | |||
| #if defined _MSC_VER || defined __MINGW32__ | |||
| /* with MSVC you have to spoon feed it the casting */ | |||
| pos = (FLAC__uint64)((FLAC__double)(FLAC__int64)(target_sample - left_sample) / (FLAC__double)(FLAC__int64)(right_sample - left_sample) * (FLAC__double)(FLAC__int64)(right_pos - left_pos)); | |||
| #else | |||
| pos = (FLAC__uint64)((FLAC__double)(target_sample - left_sample) / (FLAC__double)(right_sample - left_sample) * (FLAC__double)(right_pos - left_pos)); | |||
| #endif | |||
| #else | |||
| /* a little less accurate: */ | |||
| if ((target_sample-left_sample <= 0xffffffff) && (right_pos-left_pos <= 0xffffffff)) | |||
| @@ -1,6 +1,6 @@ | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2000-2009 Josh Coalson | |||
| * Copyright (C) 2011-2013 Xiph.Org Foundation | |||
| * Copyright (C) 2011-2014 Xiph.Org Foundation | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions | |||
| @@ -30,7 +30,7 @@ | |||
| * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||
| */ | |||
| #if HAVE_CONFIG_H | |||
| #ifdef HAVE_CONFIG_H | |||
| # include <config.h> | |||
| #endif | |||
| @@ -55,10 +55,10 @@ | |||
| #include "include/private/ogg_helper.h" | |||
| #include "include/private/ogg_mapping.h" | |||
| #endif | |||
| #include "include/private/stream_encoder.h" | |||
| #include "include/private/stream_encoder_framing.h" | |||
| #include "include/private/window.h" | |||
| #include "../alloc.h" | |||
| #include "../compat.h" | |||
| /* Exact Rice codeword length calculation is off by default. The simple | |||
| @@ -103,16 +103,18 @@ static struct CompressionLevels { | |||
| unsigned min_residual_partition_order; | |||
| unsigned max_residual_partition_order; | |||
| unsigned rice_parameter_search_dist; | |||
| const char *apodization; | |||
| } compression_levels_[] = { | |||
| { false, false, 0, 0, false, false, false, 0, 3, 0 }, | |||
| { true , true , 0, 0, false, false, false, 0, 3, 0 }, | |||
| { true , false, 0, 0, false, false, false, 0, 3, 0 }, | |||
| { false, false, 6, 0, false, false, false, 0, 4, 0 }, | |||
| { true , true , 8, 0, false, false, false, 0, 4, 0 }, | |||
| { true , false, 8, 0, false, false, false, 0, 5, 0 }, | |||
| { true , false, 8, 0, false, false, false, 0, 6, 0 }, | |||
| { true , false, 8, 0, false, false, true , 0, 6, 0 }, | |||
| { true , false, 12, 0, false, false, true , 0, 6, 0 } | |||
| { false, false, 0, 0, false, false, false, 0, 3, 0, "tukey(5e-1)" }, | |||
| { true , true , 0, 0, false, false, false, 0, 3, 0, "tukey(5e-1)" }, | |||
| { true , false, 0, 0, false, false, false, 0, 3, 0, "tukey(5e-1)" }, | |||
| { false, false, 6, 0, false, false, false, 0, 4, 0, "tukey(5e-1)" }, | |||
| { true , true , 8, 0, false, false, false, 0, 4, 0, "tukey(5e-1)" }, | |||
| { true , false, 8, 0, false, false, false, 0, 5, 0, "tukey(5e-1)" }, | |||
| { true , false, 8, 0, false, false, false, 0, 6, 0, "tukey(5e-1);partial_tukey(2)" }, | |||
| { true , false, 12, 0, false, false, false, 0, 6, 0, "tukey(5e-1);partial_tukey(2)" }, | |||
| { true , false, 12, 0, false, false, false, 0, 6, 0, "tukey(5e-1);partial_tukey(2);punchout_tukey(3)" } | |||
| /* here we use locale-independent 5e-1 instead of 0.5 or 0,5 */ | |||
| }; | |||
| @@ -342,10 +344,13 @@ typedef struct FLAC__StreamEncoderPrivate { | |||
| unsigned current_frame_number; | |||
| FLAC__MD5Context md5context; | |||
| FLAC__CPUInfo cpuinfo; | |||
| void (*local_precompute_partition_info_sums)(const FLAC__int32 residual[], FLAC__uint64 abs_residual_partition_sums[], unsigned residual_samples, unsigned predictor_order, unsigned min_partition_order, unsigned max_partition_order, unsigned bps); | |||
| #ifndef FLAC__INTEGER_ONLY_LIBRARY | |||
| unsigned (*local_fixed_compute_best_predictor)(const FLAC__int32 data[], unsigned data_len, FLAC__float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]); | |||
| unsigned (*local_fixed_compute_best_predictor_wide)(const FLAC__int32 data[], unsigned data_len, FLAC__float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]); | |||
| #else | |||
| unsigned (*local_fixed_compute_best_predictor)(const FLAC__int32 data[], unsigned data_len, FLAC__fixedpoint residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]); | |||
| unsigned (*local_fixed_compute_best_predictor_wide)(const FLAC__int32 data[], unsigned data_len, FLAC__fixedpoint residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]); | |||
| #endif | |||
| #ifndef FLAC__INTEGER_ONLY_LIBRARY | |||
| void (*local_lpc_compute_autocorrelation)(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]); | |||
| @@ -873,7 +878,9 @@ static FLAC__StreamEncoderInitStatus init_stream_internal_( | |||
| #ifndef FLAC__INTEGER_ONLY_LIBRARY | |||
| encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation; | |||
| #endif | |||
| encoder->private_->local_precompute_partition_info_sums = precompute_partition_info_sums_; | |||
| encoder->private_->local_fixed_compute_best_predictor = FLAC__fixed_compute_best_predictor; | |||
| encoder->private_->local_fixed_compute_best_predictor_wide = FLAC__fixed_compute_best_predictor_wide; | |||
| #ifndef FLAC__INTEGER_ONLY_LIBRARY | |||
| encoder->private_->local_lpc_compute_residual_from_qlp_coefficients = FLAC__lpc_compute_residual_from_qlp_coefficients; | |||
| encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_64bit = FLAC__lpc_compute_residual_from_qlp_coefficients_wide; | |||
| @@ -886,21 +893,23 @@ static FLAC__StreamEncoderInitStatus init_stream_internal_( | |||
| # ifdef FLAC__CPU_IA32 | |||
| FLAC__ASSERT(encoder->private_->cpuinfo.type == FLAC__CPUINFO_TYPE_IA32); | |||
| # ifdef FLAC__HAS_NASM | |||
| if(encoder->private_->cpuinfo.data.ia32.sse) { | |||
| if(encoder->private_->cpuinfo.ia32.sse) { | |||
| if(encoder->protected_->max_lpc_order < 4) | |||
| encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_asm_ia32_sse_lag_4; | |||
| else if(encoder->protected_->max_lpc_order < 8) | |||
| encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_asm_ia32_sse_lag_8; | |||
| else if(encoder->protected_->max_lpc_order < 12) | |||
| encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_asm_ia32_sse_lag_12; | |||
| else if(encoder->protected_->max_lpc_order < 16) | |||
| encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_asm_ia32_sse_lag_16; | |||
| else | |||
| encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_asm_ia32; | |||
| } | |||
| else if(encoder->private_->cpuinfo.data.ia32._3dnow) | |||
| encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_asm_ia32_3dnow; | |||
| else | |||
| encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_asm_ia32; | |||
| if(encoder->private_->cpuinfo.data.ia32.mmx) { | |||
| encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_64bit = FLAC__lpc_compute_residual_from_qlp_coefficients_wide_asm_ia32; /* OPT_IA32: was really necessary for GCC < 4.9 */ | |||
| if(encoder->private_->cpuinfo.ia32.mmx) { | |||
| encoder->private_->local_lpc_compute_residual_from_qlp_coefficients = FLAC__lpc_compute_residual_from_qlp_coefficients_asm_ia32; | |||
| encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_16bit = FLAC__lpc_compute_residual_from_qlp_coefficients_asm_ia32_mmx; | |||
| } | |||
| @@ -908,16 +917,137 @@ static FLAC__StreamEncoderInitStatus init_stream_internal_( | |||
| encoder->private_->local_lpc_compute_residual_from_qlp_coefficients = FLAC__lpc_compute_residual_from_qlp_coefficients_asm_ia32; | |||
| encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_16bit = FLAC__lpc_compute_residual_from_qlp_coefficients_asm_ia32; | |||
| } | |||
| if(encoder->private_->cpuinfo.data.ia32.mmx && encoder->private_->cpuinfo.data.ia32.cmov) | |||
| if(encoder->private_->cpuinfo.ia32.mmx && encoder->private_->cpuinfo.ia32.cmov) | |||
| encoder->private_->local_fixed_compute_best_predictor = FLAC__fixed_compute_best_predictor_asm_ia32_mmx_cmov; | |||
| # endif /* FLAC__HAS_NASM */ | |||
| # endif /* FLAC__CPU_IA32 */ | |||
| # ifdef FLAC__HAS_X86INTRIN | |||
| # if defined FLAC__SSE_SUPPORTED | |||
| if(encoder->private_->cpuinfo.ia32.sse) { | |||
| if(encoder->protected_->max_lpc_order < 4) | |||
| encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_intrin_sse_lag_4; | |||
| else if(encoder->protected_->max_lpc_order < 8) | |||
| encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_intrin_sse_lag_8; | |||
| else if(encoder->protected_->max_lpc_order < 12) | |||
| encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_intrin_sse_lag_12; | |||
| else if(encoder->protected_->max_lpc_order < 16) | |||
| encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_intrin_sse_lag_16; | |||
| else | |||
| encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation; | |||
| } | |||
| # endif | |||
| # ifdef FLAC__SSE2_SUPPORTED | |||
| if(encoder->private_->cpuinfo.ia32.sse2) { | |||
| encoder->private_->local_lpc_compute_residual_from_qlp_coefficients = FLAC__lpc_compute_residual_from_qlp_coefficients_intrin_sse2; | |||
| encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_16bit = FLAC__lpc_compute_residual_from_qlp_coefficients_16_intrin_sse2; | |||
| } | |||
| # endif | |||
| # ifdef FLAC__SSE4_1_SUPPORTED | |||
| if(encoder->private_->cpuinfo.ia32.sse41) { | |||
| encoder->private_->local_lpc_compute_residual_from_qlp_coefficients = FLAC__lpc_compute_residual_from_qlp_coefficients_intrin_sse41; | |||
| encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_64bit = FLAC__lpc_compute_residual_from_qlp_coefficients_wide_intrin_sse41; | |||
| } | |||
| # endif | |||
| # ifdef FLAC__AVX2_SUPPORTED | |||
| if(encoder->private_->cpuinfo.ia32.avx2) { | |||
| encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_16bit = FLAC__lpc_compute_residual_from_qlp_coefficients_16_intrin_avx2; | |||
| encoder->private_->local_lpc_compute_residual_from_qlp_coefficients = FLAC__lpc_compute_residual_from_qlp_coefficients_intrin_avx2; | |||
| encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_64bit = FLAC__lpc_compute_residual_from_qlp_coefficients_wide_intrin_avx2; | |||
| } | |||
| # endif | |||
| # ifdef FLAC__SSE2_SUPPORTED | |||
| if (encoder->private_->cpuinfo.ia32.sse2) { | |||
| encoder->private_->local_fixed_compute_best_predictor = FLAC__fixed_compute_best_predictor_intrin_sse2; | |||
| encoder->private_->local_fixed_compute_best_predictor_wide = FLAC__fixed_compute_best_predictor_wide_intrin_sse2; | |||
| } | |||
| # endif | |||
| # ifdef FLAC__SSSE3_SUPPORTED | |||
| if (encoder->private_->cpuinfo.ia32.ssse3) { | |||
| encoder->private_->local_fixed_compute_best_predictor = FLAC__fixed_compute_best_predictor_intrin_ssse3; | |||
| encoder->private_->local_fixed_compute_best_predictor_wide = FLAC__fixed_compute_best_predictor_wide_intrin_ssse3; | |||
| } | |||
| # endif | |||
| # endif /* FLAC__HAS_X86INTRIN */ | |||
| # elif defined FLAC__CPU_X86_64 | |||
| FLAC__ASSERT(encoder->private_->cpuinfo.type == FLAC__CPUINFO_TYPE_X86_64); | |||
| # ifdef FLAC__HAS_X86INTRIN | |||
| # ifdef FLAC__SSE_SUPPORTED | |||
| if(encoder->protected_->max_lpc_order < 4) | |||
| encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_intrin_sse_lag_4; | |||
| else if(encoder->protected_->max_lpc_order < 8) | |||
| encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_intrin_sse_lag_8; | |||
| else if(encoder->protected_->max_lpc_order < 12) | |||
| encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_intrin_sse_lag_12; | |||
| else if(encoder->protected_->max_lpc_order < 16) | |||
| encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_intrin_sse_lag_16; | |||
| # endif | |||
| # ifdef FLAC__SSE2_SUPPORTED | |||
| encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_16bit = FLAC__lpc_compute_residual_from_qlp_coefficients_16_intrin_sse2; | |||
| # endif | |||
| # ifdef FLAC__SSE4_1_SUPPORTED | |||
| if(encoder->private_->cpuinfo.x86.sse41) { | |||
| encoder->private_->local_lpc_compute_residual_from_qlp_coefficients = FLAC__lpc_compute_residual_from_qlp_coefficients_intrin_sse41; | |||
| } | |||
| # endif | |||
| # ifdef FLAC__AVX2_SUPPORTED | |||
| if(encoder->private_->cpuinfo.x86.avx2) { | |||
| encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_16bit = FLAC__lpc_compute_residual_from_qlp_coefficients_16_intrin_avx2; | |||
| encoder->private_->local_lpc_compute_residual_from_qlp_coefficients = FLAC__lpc_compute_residual_from_qlp_coefficients_intrin_avx2; | |||
| encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_64bit = FLAC__lpc_compute_residual_from_qlp_coefficients_wide_intrin_avx2; | |||
| } | |||
| # endif | |||
| # ifdef FLAC__SSE2_SUPPORTED | |||
| encoder->private_->local_fixed_compute_best_predictor = FLAC__fixed_compute_best_predictor_intrin_sse2; | |||
| encoder->private_->local_fixed_compute_best_predictor_wide = FLAC__fixed_compute_best_predictor_wide_intrin_sse2; | |||
| # endif | |||
| # ifdef FLAC__SSSE3_SUPPORTED | |||
| if (encoder->private_->cpuinfo.x86.ssse3) { | |||
| encoder->private_->local_fixed_compute_best_predictor = FLAC__fixed_compute_best_predictor_intrin_ssse3; | |||
| encoder->private_->local_fixed_compute_best_predictor_wide = FLAC__fixed_compute_best_predictor_wide_intrin_ssse3; | |||
| } | |||
| # endif | |||
| # endif /* FLAC__HAS_X86INTRIN */ | |||
| # endif /* FLAC__CPU_... */ | |||
| } | |||
| # endif /* !FLAC__NO_ASM */ | |||
| #endif /* !FLAC__INTEGER_ONLY_LIBRARY */ | |||
| #if !defined FLAC__NO_ASM && defined FLAC__HAS_X86INTRIN | |||
| if(encoder->private_->cpuinfo.use_asm) { | |||
| # if defined FLAC__CPU_IA32 | |||
| # ifdef FLAC__SSE2_SUPPORTED | |||
| if(encoder->private_->cpuinfo.ia32.sse2) | |||
| encoder->private_->local_precompute_partition_info_sums = FLAC__precompute_partition_info_sums_intrin_sse2; | |||
| # endif | |||
| # ifdef FLAC__SSSE3_SUPPORTED | |||
| if(encoder->private_->cpuinfo.ia32.ssse3) | |||
| encoder->private_->local_precompute_partition_info_sums = FLAC__precompute_partition_info_sums_intrin_ssse3; | |||
| # endif | |||
| # ifdef FLAC__AVX2_SUPPORTED | |||
| if(encoder->private_->cpuinfo.ia32.avx2) | |||
| encoder->private_->local_precompute_partition_info_sums = FLAC__precompute_partition_info_sums_intrin_avx2; | |||
| # endif | |||
| # elif defined FLAC__CPU_X86_64 | |||
| # ifdef FLAC__SSE2_SUPPORTED | |||
| encoder->private_->local_precompute_partition_info_sums = FLAC__precompute_partition_info_sums_intrin_sse2; | |||
| # endif | |||
| # ifdef FLAC__SSSE3_SUPPORTED | |||
| if(encoder->private_->cpuinfo.x86.ssse3) | |||
| encoder->private_->local_precompute_partition_info_sums = FLAC__precompute_partition_info_sums_intrin_ssse3; | |||
| # endif | |||
| # ifdef FLAC__AVX2_SUPPORTED | |||
| if(encoder->private_->cpuinfo.x86.avx2) | |||
| encoder->private_->local_precompute_partition_info_sums = FLAC__precompute_partition_info_sums_intrin_avx2; | |||
| # endif | |||
| # endif /* FLAC__CPU_... */ | |||
| } | |||
| #endif /* !FLAC__NO_ASM && FLAC__HAS_X86INTRIN */ | |||
| /* finally override based on wide-ness if necessary */ | |||
| if(encoder->private_->use_wide_by_block) { | |||
| encoder->private_->local_fixed_compute_best_predictor = FLAC__fixed_compute_best_predictor_wide; | |||
| encoder->private_->local_fixed_compute_best_predictor = encoder->private_->local_fixed_compute_best_predictor_wide; | |||
| } | |||
| /* set state to OK; from here on, errors are fatal and we'll override the state then */ | |||
| @@ -1152,7 +1282,7 @@ static FLAC__StreamEncoderInitStatus init_FILE_internal_( | |||
| FLAC__StreamEncoder *encoder, | |||
| FILE *file, | |||
| FLAC__StreamEncoderProgressCallback progress_callback, | |||
| void * /*client_data*/, | |||
| void *client_data, | |||
| FLAC__bool is_ogg | |||
| ) | |||
| { | |||
| @@ -1178,6 +1308,13 @@ static FLAC__StreamEncoderInitStatus init_FILE_internal_( | |||
| if(file == stdout) | |||
| file = get_binary_stdout_(); /* just to be safe */ | |||
| #ifdef _WIN32 | |||
| /* | |||
| * Windows can suffer quite badly from disk fragmentation. This can be | |||
| * reduced significantly by setting the output buffer size to be 10MB. | |||
| */ | |||
| setvbuf(file, NULL, _IOFBF, 10*1024*1024); | |||
| #endif | |||
| encoder->private_->file = file; | |||
| encoder->private_->progress_callback = progress_callback; | |||
| @@ -1447,11 +1584,10 @@ FLAC_API FLAC__bool FLAC__stream_encoder_set_compression_level(FLAC__StreamEncod | |||
| ok &= FLAC__stream_encoder_set_do_mid_side_stereo (encoder, compression_levels_[value].do_mid_side_stereo); | |||
| ok &= FLAC__stream_encoder_set_loose_mid_side_stereo (encoder, compression_levels_[value].loose_mid_side_stereo); | |||
| #ifndef FLAC__INTEGER_ONLY_LIBRARY | |||
| #if 0 | |||
| /* was: */ | |||
| #if 1 | |||
| ok &= FLAC__stream_encoder_set_apodization (encoder, compression_levels_[value].apodization); | |||
| /* but it's too hard to specify the string in a locale-specific way */ | |||
| #else | |||
| /* equivalent to -A tukey(0.5) */ | |||
| encoder->protected_->num_apodizations = 1; | |||
| encoder->protected_->apodizations[0].type = FLAC__APODIZATION_TUKEY; | |||
| encoder->protected_->apodizations[0].parameters.tukey.p = 0.5; | |||
| @@ -1555,6 +1691,48 @@ FLAC_API FLAC__bool FLAC__stream_encoder_set_apodization(FLAC__StreamEncoder *en | |||
| encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_TUKEY; | |||
| } | |||
| } | |||
| else if(n>15 && 0 == strncmp("partial_tukey(" , specification, 14)) { | |||
| FLAC__int32 tukey_parts = (FLAC__int32)strtod(specification+14, 0); | |||
| const char *si_1 = strchr(specification, '/'); | |||
| FLAC__real overlap = si_1?flac_min((FLAC__real)strtod(si_1+1, 0),0.99f):0.1f; | |||
| FLAC__real overlap_units = 1.0f/(1.0f - overlap) - 1.0f; | |||
| const char *si_2 = strchr((si_1?(si_1+1):specification), '/'); | |||
| FLAC__real tukey_p = si_2?(FLAC__real)strtod(si_2+1, 0):0.2f; | |||
| if (tukey_parts <= 1) { | |||
| encoder->protected_->apodizations[encoder->protected_->num_apodizations].parameters.tukey.p = tukey_p; | |||
| encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_TUKEY; | |||
| }else if (encoder->protected_->num_apodizations + tukey_parts < 32){ | |||
| FLAC__int32 m; | |||
| for(m = 0; m < tukey_parts; m++){ | |||
| encoder->protected_->apodizations[encoder->protected_->num_apodizations].parameters.multiple_tukey.p = tukey_p; | |||
| encoder->protected_->apodizations[encoder->protected_->num_apodizations].parameters.multiple_tukey.start = m/(tukey_parts+overlap_units); | |||
| encoder->protected_->apodizations[encoder->protected_->num_apodizations].parameters.multiple_tukey.end = (m+1+overlap_units)/(tukey_parts+overlap_units); | |||
| encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_PARTIAL_TUKEY; | |||
| } | |||
| } | |||
| } | |||
| else if(n>16 && 0 == strncmp("punchout_tukey(" , specification, 15)) { | |||
| FLAC__int32 tukey_parts = (FLAC__int32)strtod(specification+15, 0); | |||
| const char *si_1 = strchr(specification, '/'); | |||
| FLAC__real overlap = si_1?flac_min((FLAC__real)strtod(si_1+1, 0),0.99f):0.2f; | |||
| FLAC__real overlap_units = 1.0f/(1.0f - overlap) - 1.0f; | |||
| const char *si_2 = strchr((si_1?(si_1+1):specification), '/'); | |||
| FLAC__real tukey_p = si_2?(FLAC__real)strtod(si_2+1, 0):0.2f; | |||
| if (tukey_parts <= 1) { | |||
| encoder->protected_->apodizations[encoder->protected_->num_apodizations].parameters.tukey.p = tukey_p; | |||
| encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_TUKEY; | |||
| }else if (encoder->protected_->num_apodizations + tukey_parts < 32){ | |||
| FLAC__int32 m; | |||
| for(m = 0; m < tukey_parts; m++){ | |||
| encoder->protected_->apodizations[encoder->protected_->num_apodizations].parameters.multiple_tukey.p = tukey_p; | |||
| encoder->protected_->apodizations[encoder->protected_->num_apodizations].parameters.multiple_tukey.start = m/(tukey_parts+overlap_units); | |||
| encoder->protected_->apodizations[encoder->protected_->num_apodizations].parameters.multiple_tukey.end = (m+1+overlap_units)/(tukey_parts+overlap_units); | |||
| encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_PUNCHOUT_TUKEY; | |||
| } | |||
| } | |||
| } | |||
| else if(n==5 && 0 == strncmp("welch" , specification, n)) | |||
| encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_WELCH; | |||
| if (encoder->protected_->num_apodizations == 32) | |||
| @@ -2236,8 +2414,8 @@ FLAC__bool resize_buffers_(FLAC__StreamEncoder *encoder, unsigned new_blocksize) | |||
| ok = true; | |||
| /* WATCHOUT: FLAC__lpc_compute_residual_from_qlp_coefficients_asm_ia32_mmx() | |||
| * requires that the input arrays (in our case the integer signals) | |||
| /* WATCHOUT: FLAC__lpc_compute_residual_from_qlp_coefficients_asm_ia32_mmx() and ..._intrin_sse2() | |||
| * require that the input arrays (in our case the integer signals) | |||
| * have a buffer of up to 3 zeroes in front (at negative indices) for | |||
| * alignment purposes; we use 4 in front to keep the data well-aligned. | |||
| */ | |||
| @@ -2334,6 +2512,12 @@ FLAC__bool resize_buffers_(FLAC__StreamEncoder *encoder, unsigned new_blocksize) | |||
| case FLAC__APODIZATION_TUKEY: | |||
| FLAC__window_tukey(encoder->private_->window[i], new_blocksize, encoder->protected_->apodizations[i].parameters.tukey.p); | |||
| break; | |||
| case FLAC__APODIZATION_PARTIAL_TUKEY: | |||
| FLAC__window_partial_tukey(encoder->private_->window[i], new_blocksize, encoder->protected_->apodizations[i].parameters.multiple_tukey.p, encoder->protected_->apodizations[i].parameters.multiple_tukey.start, encoder->protected_->apodizations[i].parameters.multiple_tukey.end); | |||
| break; | |||
| case FLAC__APODIZATION_PUNCHOUT_TUKEY: | |||
| FLAC__window_punchout_tukey(encoder->private_->window[i], new_blocksize, encoder->protected_->apodizations[i].parameters.multiple_tukey.p, encoder->protected_->apodizations[i].parameters.multiple_tukey.start, encoder->protected_->apodizations[i].parameters.multiple_tukey.end); | |||
| break; | |||
| case FLAC__APODIZATION_WELCH: | |||
| FLAC__window_welch(encoder->private_->window[i], new_blocksize); | |||
| break; | |||
| @@ -3165,7 +3349,7 @@ FLAC__bool process_subframe_( | |||
| #endif | |||
| #ifndef FLAC__INTEGER_ONLY_LIBRARY | |||
| FLAC__double lpc_residual_bits_per_sample; | |||
| FLAC__real autoc[FLAC__MAX_LPC_ORDER+1]; /* WATCHOUT: the size is important even though encoder->protected_->max_lpc_order might be less; some asm routines need all the space */ | |||
| FLAC__real autoc[FLAC__MAX_LPC_ORDER+1]; /* WATCHOUT: the size is important even though encoder->protected_->max_lpc_order might be less; some asm and x86 intrinsic routines need all the space */ | |||
| FLAC__double lpc_error[FLAC__MAX_LPC_ORDER]; | |||
| unsigned min_lpc_order, max_lpc_order, lpc_order; | |||
| unsigned min_qlp_coeff_precision, max_qlp_coeff_precision, qlp_coeff_precision; | |||
| @@ -3318,9 +3502,9 @@ FLAC__bool process_subframe_( | |||
| } | |||
| if(encoder->protected_->do_qlp_coeff_prec_search) { | |||
| min_qlp_coeff_precision = FLAC__MIN_QLP_COEFF_PRECISION; | |||
| /* try to ensure a 32-bit datapath throughout for 16bps(+1bps for side channel) or less */ | |||
| if(subframe_bps <= 17) { | |||
| max_qlp_coeff_precision = flac_min(32 - subframe_bps - lpc_order, FLAC__MAX_QLP_COEFF_PRECISION); | |||
| /* try to keep qlp coeff precision such that only 32-bit math is required for decode of <=16bps streams */ | |||
| if(subframe_bps <= 16) { | |||
| max_qlp_coeff_precision = flac_min(32 - subframe_bps - FLAC__bitmath_ilog2(lpc_order), FLAC__MAX_QLP_COEFF_PRECISION); | |||
| max_qlp_coeff_precision = flac_max(max_qlp_coeff_precision, min_qlp_coeff_precision); | |||
| } | |||
| else | |||
| @@ -3556,7 +3740,7 @@ unsigned evaluate_lpc_subframe_( | |||
| FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents | |||
| ) | |||
| { | |||
| FLAC__int32 qlp_coeff[FLAC__MAX_LPC_ORDER]; | |||
| FLAC__int32 qlp_coeff[FLAC__MAX_LPC_ORDER]; /* WATCHOUT: the size is important; some x86 intrinsic routines need more than lpc order elements */ | |||
| unsigned i, residual_bits, estimate; | |||
| int quantization, ret; | |||
| const unsigned residual_samples = blocksize - order; | |||
| @@ -3671,7 +3855,7 @@ unsigned find_best_partition_order_( | |||
| max_partition_order = FLAC__format_get_max_rice_partition_order_from_blocksize_limited_max_and_predictor_order(max_partition_order, blocksize, predictor_order); | |||
| min_partition_order = flac_min(min_partition_order, max_partition_order); | |||
| precompute_partition_info_sums_(residual, abs_residual_partition_sums, residual_samples, predictor_order, min_partition_order, max_partition_order, bps); | |||
| private_->local_precompute_partition_info_sums(residual, abs_residual_partition_sums, residual_samples, predictor_order, min_partition_order, max_partition_order, bps); | |||
| if(do_escape_coding) | |||
| precompute_partition_info_escapes_(residual, raw_bits_per_partition, residual_samples, predictor_order, min_partition_order, max_partition_order); | |||
| @@ -3743,17 +3927,6 @@ unsigned find_best_partition_order_( | |||
| return best_residual_bits; | |||
| } | |||
| #if defined(FLAC__CPU_IA32) && !defined FLAC__NO_ASM && defined FLAC__HAS_NASM | |||
| extern void precompute_partition_info_sums_32bit_asm_ia32_( | |||
| const FLAC__int32 residual[], | |||
| FLAC__uint64 abs_residual_partition_sums[], | |||
| unsigned blocksize, | |||
| unsigned predictor_order, | |||
| unsigned min_partition_order, | |||
| unsigned max_partition_order | |||
| ); | |||
| #endif | |||
| void precompute_partition_info_sums_( | |||
| const FLAC__int32 residual[], | |||
| FLAC__uint64 abs_residual_partition_sums[], | |||
| @@ -3769,21 +3942,12 @@ void precompute_partition_info_sums_( | |||
| FLAC__ASSERT(default_partition_samples > predictor_order); | |||
| #if defined(FLAC__CPU_IA32) && !defined FLAC__NO_ASM && defined FLAC__HAS_NASM | |||
| /* slightly pessimistic but still catches all common cases */ | |||
| /* WATCHOUT: "+ bps" is an assumption that the average residual magnitude will not be more than "bps" bits */ | |||
| if(FLAC__bitmath_ilog2(default_partition_samples) + bps < 32) { | |||
| precompute_partition_info_sums_32bit_asm_ia32_(residual, abs_residual_partition_sums, residual_samples + predictor_order, predictor_order, min_partition_order, max_partition_order); | |||
| return; | |||
| } | |||
| #endif | |||
| /* first do max_partition_order */ | |||
| { | |||
| unsigned partition, residual_sample, end = (unsigned)(-(int)predictor_order); | |||
| /* slightly pessimistic but still catches all common cases */ | |||
| /* WATCHOUT: "+ bps" is an assumption that the average residual magnitude will not be more than "bps" bits */ | |||
| if(FLAC__bitmath_ilog2(default_partition_samples) + bps < 32) { | |||
| /* WATCHOUT: "+ bps + FLAC__MAX_EXTRA_RESIDUAL_BPS" is the maximum | |||
| * assumed size of the average residual magnitude */ | |||
| if(FLAC__bitmath_ilog2(default_partition_samples) + bps + FLAC__MAX_EXTRA_RESIDUAL_BPS < 32) { | |||
| FLAC__uint32 abs_residual_partition_sum; | |||
| for(partition = residual_sample = 0; partition < partitions; partition++) { | |||
| @@ -4027,8 +4191,35 @@ FLAC__bool set_partitioned_rice_( | |||
| * in the partition, so the actual mean is | |||
| * mean/partition_samples | |||
| */ | |||
| #if 0 /* old simple code */ | |||
| for(rice_parameter = 0, k = partition_samples; k < mean; rice_parameter++, k <<= 1) | |||
| ; | |||
| #else | |||
| #if defined FLAC__CPU_X86_64 /* and other 64-bit arch, too */ | |||
| if(mean <= 0x80000000/512) { /* 512: more or less optimal for both 16- and 24-bit input */ | |||
| #else | |||
| if(mean <= 0x80000000/8) { /* 32-bit arch: use 32-bit math if possible */ | |||
| #endif | |||
| FLAC__uint32 k2, mean2 = (FLAC__uint32) mean; | |||
| rice_parameter = 0; k2 = partition_samples; | |||
| while(k2*8 < mean2) { /* requires: mean <= (2^31)/8 */ | |||
| rice_parameter += 4; k2 <<= 4; /* tuned for 16-bit input */ | |||
| } | |||
| while(k2 < mean2) { /* requires: mean <= 2^31 */ | |||
| rice_parameter++; k2 <<= 1; | |||
| } | |||
| } | |||
| else { | |||
| rice_parameter = 0; k = partition_samples; | |||
| if(mean <= FLAC__U64L(0x8000000000000000)/128) /* usually mean is _much_ smaller than this value */ | |||
| while(k*128 < mean) { /* requires: mean <= (2^63)/128 */ | |||
| rice_parameter += 8; k <<= 8; /* tuned for 24-bit input */ | |||
| } | |||
| while(k < mean) { /* requires: mean <= 2^63 */ | |||
| rice_parameter++; k <<= 1; | |||
| } | |||
| } | |||
| #endif | |||
| if(rice_parameter >= rice_parameter_limit) { | |||
| #ifdef DEBUG_VERBOSE | |||
| fprintf(stderr, "clipping rice_parameter (%u -> %u) @6\n", rice_parameter, rice_parameter_limit - 1); | |||
| @@ -1,6 +1,6 @@ | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2000-2009 Josh Coalson | |||
| * Copyright (C) 2011-2013 Xiph.Org Foundation | |||
| * Copyright (C) 2011-2014 Xiph.Org Foundation | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions | |||
| @@ -30,7 +30,7 @@ | |||
| * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||
| */ | |||
| #if HAVE_CONFIG_H | |||
| #ifdef HAVE_CONFIG_H | |||
| # include <config.h> | |||
| #endif | |||
| @@ -1,6 +1,6 @@ | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2006-2009 Josh Coalson | |||
| * Copyright (C) 2011-2013 Xiph.Org Foundation | |||
| * Copyright (C) 2011-2014 Xiph.Org Foundation | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions | |||
| @@ -30,7 +30,7 @@ | |||
| * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||
| */ | |||
| #if HAVE_CONFIG_H | |||
| #ifdef HAVE_CONFIG_H | |||
| # include <config.h> | |||
| #endif | |||
| @@ -41,11 +41,6 @@ | |||
| #ifndef FLAC__INTEGER_ONLY_LIBRARY | |||
| #ifndef M_PI | |||
| /* math.h in VC++ doesn't seem to have this (how Microsoft is that?) */ | |||
| #define M_PI 3.14159265358979323846 | |||
| #endif | |||
| void FLAC__window_bartlett(FLAC__real *window, const FLAC__int32 L) | |||
| { | |||
| @@ -62,7 +57,7 @@ void FLAC__window_bartlett(FLAC__real *window, const FLAC__int32 L) | |||
| for (n = 0; n <= L/2-1; n++) | |||
| window[n] = 2.0f * n / (float)N; | |||
| for (; n <= N; n++) | |||
| window[n] = 2.0f - 2.0f * (N-n) / (float)N; | |||
| window[n] = 2.0f - 2.0f * n / (float)N; | |||
| } | |||
| } | |||
| @@ -72,7 +67,7 @@ void FLAC__window_bartlett_hann(FLAC__real *window, const FLAC__int32 L) | |||
| FLAC__int32 n; | |||
| for (n = 0; n < L; n++) | |||
| window[n] = (FLAC__real)(0.62f - 0.48f * fabs((float)n/(float)N+0.5f) + 0.38f * cos(2.0f * M_PI * ((float)n/(float)N+0.5f))); | |||
| window[n] = (FLAC__real)(0.62f - 0.48f * fabs((float)n/(float)N-0.5f) - 0.38f * cos(2.0f * M_PI * ((float)n/(float)N))); | |||
| } | |||
| void FLAC__window_blackman(FLAC__real *window, const FLAC__int32 L) | |||
| @@ -177,16 +172,16 @@ void FLAC__window_triangle(FLAC__real *window, const FLAC__int32 L) | |||
| FLAC__int32 n; | |||
| if (L & 1) { | |||
| for (n = 1; n <= L+1/2; n++) | |||
| for (n = 1; n <= (L+1)/2; n++) | |||
| window[n-1] = 2.0f * n / ((float)L + 1.0f); | |||
| for (; n <= L; n++) | |||
| window[n-1] = - (float)(2 * (L - n + 1)) / ((float)L + 1.0f); | |||
| window[n-1] = (float)(2 * (L - n + 1)) / ((float)L + 1.0f); | |||
| } | |||
| else { | |||
| for (n = 1; n <= L/2; n++) | |||
| window[n-1] = 2.0f * n / (float)L; | |||
| window[n-1] = 2.0f * n / ((float)L + 1.0f); | |||
| for (; n <= L; n++) | |||
| window[n-1] = ((float)(2 * (L - n)) + 1.0f) / (float)L; | |||
| window[n-1] = (float)(2 * (L - n + 1)) / ((float)L + 1.0f); | |||
| } | |||
| } | |||
| @@ -211,6 +206,66 @@ void FLAC__window_tukey(FLAC__real *window, const FLAC__int32 L, const FLAC__rea | |||
| } | |||
| } | |||
| void FLAC__window_partial_tukey(FLAC__real *window, const FLAC__int32 L, const FLAC__real p, const FLAC__real start, const FLAC__real end) | |||
| { | |||
| const FLAC__int32 start_n = (FLAC__int32)(start * L); | |||
| const FLAC__int32 end_n = (FLAC__int32)(end * L); | |||
| const FLAC__int32 N = end_n - start_n; | |||
| FLAC__int32 Np, n, i; | |||
| if (p <= 0.0f) | |||
| FLAC__window_partial_tukey(window, L, 0.05f, start, end); | |||
| else if (p >= 1.0f) | |||
| FLAC__window_partial_tukey(window, L, 0.95f, start, end); | |||
| else { | |||
| Np = (FLAC__int32)(p / 2.0f * N); | |||
| for (n = 0; n < start_n && n < L; n++) | |||
| window[n] = 0.0f; | |||
| for (i = 1; n < (start_n+Np) && n < L; n++, i++) | |||
| window[n] = (FLAC__real)(0.5f - 0.5f * cos(M_PI * i / Np)); | |||
| for (; n < (end_n-Np) && n < L; n++) | |||
| window[n] = 1.0f; | |||
| for (i = Np; n < end_n && n < L; n++, i--) | |||
| window[n] = (FLAC__real)(0.5f - 0.5f * cos(M_PI * i / Np)); | |||
| for (; n < L; n++) | |||
| window[n] = 0.0f; | |||
| } | |||
| } | |||
| void FLAC__window_punchout_tukey(FLAC__real *window, const FLAC__int32 L, const FLAC__real p, const FLAC__real start, const FLAC__real end) | |||
| { | |||
| const FLAC__int32 start_n = (FLAC__int32)(start * L); | |||
| const FLAC__int32 end_n = (FLAC__int32)(end * L); | |||
| FLAC__int32 Ns, Ne, n, i; | |||
| if (p <= 0.0f) | |||
| FLAC__window_punchout_tukey(window, L, 0.05f, start, end); | |||
| else if (p >= 1.0f) | |||
| FLAC__window_punchout_tukey(window, L, 0.95f, start, end); | |||
| else { | |||
| Ns = (FLAC__int32)(p / 2.0f * start_n); | |||
| Ne = (FLAC__int32)(p / 2.0f * (L - end_n)); | |||
| for (n = 0, i = 1; n < Ns && n < L; n++, i++) | |||
| window[n] = (FLAC__real)(0.5f - 0.5f * cos(M_PI * i / Ns)); | |||
| for (; n < start_n-Ns && n < L; n++) | |||
| window[n] = 1.0f; | |||
| for (i = Ns; n < start_n && n < L; n++, i--) | |||
| window[n] = (FLAC__real)(0.5f - 0.5f * cos(M_PI * i / Ns)); | |||
| for (; n < end_n && n < L; n++) | |||
| window[n] = 0.0f; | |||
| for (i = 1; n < end_n+Ne && n < L; n++, i++) | |||
| window[n] = (FLAC__real)(0.5f - 0.5f * cos(M_PI * i / Ne)); | |||
| for (; n < L - (Ne) && n < L; n++) | |||
| window[n] = 1.0f; | |||
| for (i = Ne; n < L; n++, i--) | |||
| window[n] = (FLAC__real)(0.5f - 0.5f * cos(M_PI * i / Ne)); | |||
| } | |||
| } | |||
| void FLAC__window_welch(FLAC__real *window, const FLAC__int32 L) | |||
| { | |||
| const FLAC__int32 N = L - 1; | |||
| @@ -1,6 +1,6 @@ | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2001-2009 Josh Coalson | |||
| * Copyright (C) 2011-2013 Xiph.Org Foundation | |||
| * Copyright (C) 2011-2014 Xiph.Org Foundation | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions | |||
| @@ -500,7 +500,7 @@ FLAC_API FLAC__MetadataType FLAC__metadata_simple_iterator_get_block_type(const | |||
| * \retval unsigned | |||
| * The length of the metadata block at the current iterator position. | |||
| * The is same length as that in the | |||
| * <a href="http://flac.sourceforge.net/format.html#metadata_block_header">metadata block header</a>, | |||
| * <a href="http://xiph.org/flac/format.html#metadata_block_header">metadata block header</a>, | |||
| * i.e. the length of the metadata body that follows the header. | |||
| */ | |||
| FLAC_API unsigned FLAC__metadata_simple_iterator_get_block_length(const FLAC__Metadata_SimpleIterator *iterator); | |||
| @@ -1,6 +1,6 @@ | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2000-2009 Josh Coalson | |||
| * Copyright (C) 2011-2013 Xiph.Org Foundation | |||
| * Copyright (C) 2011-2014 Xiph.Org Foundation | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions | |||
| @@ -1,6 +1,6 @@ | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2000-2009 Josh Coalson | |||
| * Copyright (C) 2011-2013 Xiph.Org Foundation | |||
| * Copyright (C) 2011-2014 Xiph.Org Foundation | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions | |||
| @@ -1,6 +1,6 @@ | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2000-2009 Josh Coalson | |||
| * Copyright (C) 2011-2013 Xiph.Org Foundation | |||
| * Copyright (C) 2011-2014 Xiph.Org Foundation | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions | |||
| @@ -830,28 +830,28 @@ FLAC_API FLAC__bool FLAC__stream_encoder_set_sample_rate(FLAC__StreamEncoder *en | |||
| * The actual values set for each level are: | |||
| * <table> | |||
| * <tr> | |||
| * <td><b>level</b><td> | |||
| * <td>do mid-side stereo<td> | |||
| * <td>loose mid-side stereo<td> | |||
| * <td>apodization<td> | |||
| * <td>max lpc order<td> | |||
| * <td>qlp coeff precision<td> | |||
| * <td>qlp coeff prec search<td> | |||
| * <td>escape coding<td> | |||
| * <td>exhaustive model search<td> | |||
| * <td>min residual partition order<td> | |||
| * <td>max residual partition order<td> | |||
| * <td>rice parameter search dist<td> | |||
| * <td><b>level</b></td> | |||
| * <td>do mid-side stereo</td> | |||
| * <td>loose mid-side stereo</td> | |||
| * <td>apodization</td> | |||
| * <td>max lpc order</td> | |||
| * <td>qlp coeff precision</td> | |||
| * <td>qlp coeff prec search</td> | |||
| * <td>escape coding</td> | |||
| * <td>exhaustive model search</td> | |||
| * <td>min residual partition order</td> | |||
| * <td>max residual partition order</td> | |||
| * <td>rice parameter search dist</td> | |||
| * </tr> | |||
| * <tr> <td><b>0</b><td> <td>false<td> <td>false<td> <td>tukey(0.5)<td> <td>0<td> <td>0<td> <td>false<td> <td>false<td> <td>false<td> <td>0<td> <td>3<td> <td>0<td> </tr> | |||
| * <tr> <td><b>1</b><td> <td>true<td> <td>true<td> <td>tukey(0.5)<td> <td>0<td> <td>0<td> <td>false<td> <td>false<td> <td>false<td> <td>0<td> <td>3<td> <td>0<td> </tr> | |||
| * <tr> <td><b>2</b><td> <td>true<td> <td>false<td> <td>tukey(0.5)<td> <td>0<td> <td>0<td> <td>false<td> <td>false<td> <td>false<td> <td>0<td> <td>3<td> <td>0<td> </tr> | |||
| * <tr> <td><b>3</b><td> <td>false<td> <td>false<td> <td>tukey(0.5)<td> <td>6<td> <td>0<td> <td>false<td> <td>false<td> <td>false<td> <td>0<td> <td>4<td> <td>0<td> </tr> | |||
| * <tr> <td><b>4</b><td> <td>true<td> <td>true<td> <td>tukey(0.5)<td> <td>8<td> <td>0<td> <td>false<td> <td>false<td> <td>false<td> <td>0<td> <td>4<td> <td>0<td> </tr> | |||
| * <tr> <td><b>5</b><td> <td>true<td> <td>false<td> <td>tukey(0.5)<td> <td>8<td> <td>0<td> <td>false<td> <td>false<td> <td>false<td> <td>0<td> <td>5<td> <td>0<td> </tr> | |||
| * <tr> <td><b>6</b><td> <td>true<td> <td>false<td> <td>tukey(0.5)<td> <td>8<td> <td>0<td> <td>false<td> <td>false<td> <td>false<td> <td>0<td> <td>6<td> <td>0<td> </tr> | |||
| * <tr> <td><b>7</b><td> <td>true<td> <td>false<td> <td>tukey(0.5)<td> <td>8<td> <td>0<td> <td>false<td> <td>false<td> <td>true<td> <td>0<td> <td>6<td> <td>0<td> </tr> | |||
| * <tr> <td><b>8</b><td> <td>true<td> <td>false<td> <td>tukey(0.5)<td> <td>12<td> <td>0<td> <td>false<td> <td>false<td> <td>true<td> <td>0<td> <td>6<td> <td>0<td> </tr> | |||
| * <tr> <td><b>0</b></td> <td>false</td> <td>false</td> <td>tukey(0.5)<td> <td>0</td> <td>0</td> <td>false</td> <td>false</td> <td>false</td> <td>0</td> <td>3</td> <td>0</td> </tr> | |||
| * <tr> <td><b>1</b></td> <td>true</td> <td>true</td> <td>tukey(0.5)<td> <td>0</td> <td>0</td> <td>false</td> <td>false</td> <td>false</td> <td>0</td> <td>3</td> <td>0</td> </tr> | |||
| * <tr> <td><b>2</b></td> <td>true</td> <td>false</td> <td>tukey(0.5)<td> <td>0</td> <td>0</td> <td>false</td> <td>false</td> <td>false</td> <td>0</td> <td>3</td> <td>0</td> </tr> | |||
| * <tr> <td><b>3</b></td> <td>false</td> <td>false</td> <td>tukey(0.5)<td> <td>6</td> <td>0</td> <td>false</td> <td>false</td> <td>false</td> <td>0</td> <td>4</td> <td>0</td> </tr> | |||
| * <tr> <td><b>4</b></td> <td>true</td> <td>true</td> <td>tukey(0.5)<td> <td>8</td> <td>0</td> <td>false</td> <td>false</td> <td>false</td> <td>0</td> <td>4</td> <td>0</td> </tr> | |||
| * <tr> <td><b>5</b></td> <td>true</td> <td>false</td> <td>tukey(0.5)<td> <td>8</td> <td>0</td> <td>false</td> <td>false</td> <td>false</td> <td>0</td> <td>5</td> <td>0</td> </tr> | |||
| * <tr> <td><b>6</b></td> <td>true</td> <td>false</td> <td>tukey(0.5);partial_tukey(2)<td> <td>8</td> <td>0</td> <td>false</td> <td>false</td> <td>false</td> <td>0</td> <td>6</td> <td>0</td> </tr> | |||
| * <tr> <td><b>7</b></td> <td>true</td> <td>false</td> <td>tukey(0.5);partial_tukey(2)<td> <td>12</td> <td>0</td> <td>false</td> <td>false</td> <td>false</td> <td>0</td> <td>6</td> <td>0</td> </tr> | |||
| * <tr> <td><b>8</b></td> <td>true</td> <td>false</td> <td>tukey(0.5);partial_tukey(2);punchout_tukey(3)</td> <td>12</td> <td>0</td> <td>false</td> <td>false</td> <td>false</td> <td>0</td> <td>6</td> <td>0</td> </tr> | |||
| * </table> | |||
| * | |||
| * \default \c 5 | |||
| @@ -920,7 +920,8 @@ FLAC_API FLAC__bool FLAC__stream_encoder_set_loose_mid_side_stereo(FLAC__StreamE | |||
| * The available functions are \c bartlett, \c bartlett_hann, | |||
| * \c blackman, \c blackman_harris_4term_92db, \c connes, \c flattop, | |||
| * \c gauss(STDDEV), \c hamming, \c hann, \c kaiser_bessel, \c nuttall, | |||
| * \c rectangle, \c triangle, \c tukey(P), \c welch. | |||
| * \c rectangle, \c triangle, \c tukey(P), \c partial_tukey(n[/ov[/P]]), | |||
| * \c punchout_tukey(n[/ov[/P]]), \c welch. | |||
| * | |||
| * For \c gauss(STDDEV), STDDEV specifies the standard deviation | |||
| * (0<STDDEV<=0.5). | |||
| @@ -929,6 +930,24 @@ FLAC_API FLAC__bool FLAC__stream_encoder_set_loose_mid_side_stereo(FLAC__StreamE | |||
| * tapered (0<=P<=1). P=0 corresponds to \c rectangle and P=1 | |||
| * corresponds to \c hann. | |||
| * | |||
| * Specifying \c partial_tukey or \c punchout_tukey works a little | |||
| * different. These do not specify a single apodization function, but | |||
| * a series of them with some overlap. partial_tukey specifies a series | |||
| * of small windows (all treated separately) while punchout_tukey | |||
| * specifies a series of windows that have a hole in them. In this way, | |||
| * the predictor is constructed with only a part of the block, which | |||
| * helps in case a block consists of dissimilar parts. | |||
| * | |||
| * The three parameters that can be specified for the functions are | |||
| * n, ov and P. n is the number of functions to add, ov is the overlap | |||
| * of the windows in case of partial_tukey and the overlap in the gaps | |||
| * in case of punchout_tukey. P is the fraction of the window that is | |||
| * tapered, like with a regular tukey window. The function can be | |||
| * specified with only a number, a number and an overlap, or a number | |||
| * an overlap and a P, for example, partial_tukey(3), partial_tukey(3/0.3) | |||
| * and partial_tukey(3/0.3/0.5) are all valid. ov should be smaller than 1 | |||
| * and can be negative. | |||
| * | |||
| * Example specifications are \c "blackman" or | |||
| * \c "hann;triangle;tukey(0.5);tukey(0.25);tukey(0.125)" | |||
| * | |||
| @@ -941,7 +960,9 @@ FLAC_API FLAC__bool FLAC__stream_encoder_set_loose_mid_side_stereo(FLAC__StreamE | |||
| * results in the smallest compressed subframe. | |||
| * | |||
| * Note that each function specified causes the encoder to occupy a | |||
| * floating point array in which to store the window. | |||
| * floating point array in which to store the window. Also note that the | |||
| * values of P, STDDEV and ov are locale-specific, so if the comma | |||
| * separator specified by the locale is a comma, a comma should be used. | |||
| * | |||
| * \default \c "tukey(0.5)" | |||
| * \param encoder An encoder instance to set. | |||
| @@ -0,0 +1,69 @@ | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2013-2014 Xiph.Org Foundation | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions | |||
| * are met: | |||
| * | |||
| * - Redistributions of source code must retain the above copyright | |||
| * notice, this list of conditions and the following disclaimer. | |||
| * | |||
| * - Redistributions in binary form must reproduce the above copyright | |||
| * notice, this list of conditions and the following disclaimer in the | |||
| * documentation and/or other materials provided with the distribution. | |||
| * | |||
| * - Neither the name of the Xiph.org Foundation nor the names of its | |||
| * contributors may be used to endorse or promote products derived from | |||
| * this software without specific prior written permission. | |||
| * | |||
| * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |||
| * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | |||
| * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | |||
| * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR | |||
| * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, | |||
| * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, | |||
| * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR | |||
| * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF | |||
| * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING | |||
| * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | |||
| * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||
| */ | |||
| #ifdef _WIN32 | |||
| #ifndef flac__win_utf8_io_h | |||
| #define flac__win_utf8_io_h | |||
| #ifdef __cplusplus | |||
| extern "C" { | |||
| #endif | |||
| #include <stdio.h> | |||
| #include <sys/stat.h> | |||
| #include <stdarg.h> | |||
| #include <windows.h> | |||
| int get_utf8_argv(int *argc, char ***argv); | |||
| int printf_utf8(const char *format, ...); | |||
| int fprintf_utf8(FILE *stream, const char *format, ...); | |||
| int vfprintf_utf8(FILE *stream, const char *format, va_list argptr); | |||
| FILE *fopen_utf8(const char *filename, const char *mode); | |||
| int stat_utf8(const char *path, struct stat *buffer); | |||
| int _stat64_utf8(const char *path, struct __stat64 *buffer); | |||
| int chmod_utf8(const char *filename, int pmode); | |||
| int utime_utf8(const char *filename, struct utimbuf *times); | |||
| int unlink_utf8(const char *filename); | |||
| int rename_utf8(const char *oldname, const char *newname); | |||
| size_t strlen_utf8(const char *str); | |||
| int win_get_console_width(void); | |||
| int print_console(FILE *stream, const wchar_t *text, size_t len); | |||
| HANDLE WINAPI CreateFile_utf8(const char *lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile); | |||
| #ifdef __cplusplus | |||
| } /* extern "C" */ | |||
| #endif | |||
| #endif | |||
| #endif | |||