| @@ -932,7 +932,7 @@ public: | |||
| } | |||
| const String getDefaultDeviceName (const bool /*preferInputNames*/, | |||
| const int /*numInputChannelsNeeded*/, | |||
| const int /*numInputChannelsNeeded*/, | |||
| const int /*numOutputChannelsNeeded*/) const | |||
| { | |||
| jassert (hasScanned); // need to call scanForDevices() before doing this | |||
| @@ -402,7 +402,7 @@ public: | |||
| const float x3 = CONVERTX (points [next2]); | |||
| const float y3 = CONVERTY (points [next2]); | |||
| if (FT_CURVE_TAG (tags[next1]) != FT_Curve_Tag_Cubic | |||
| if (FT_CURVE_TAG (tags[next1]) != FT_Curve_Tag_Cubic | |||
| || FT_CURVE_TAG (tags[next2]) != FT_Curve_Tag_On) | |||
| return false; | |||
| @@ -1132,7 +1132,7 @@ public: | |||
| } | |||
| const String getDefaultDeviceName (const bool preferInputNames, | |||
| const int numInputChannelsNeeded, | |||
| const int numInputChannelsNeeded, | |||
| const int numOutputChannelsNeeded) const | |||
| { | |||
| jassert (hasScanned); // need to call scanForDevices() before doing this | |||
| @@ -1142,7 +1142,7 @@ public: | |||
| AudioDeviceID deviceID; | |||
| UInt32 size = sizeof (deviceID); | |||
| // if they're asking for any input channels at all, use the default input, so we | |||
| // if they're asking for any input channels at all, use the default input, so we | |||
| // get the built-in mic rather than the built-in output with no inputs.. | |||
| if (AudioHardwareGetProperty (numInputChannelsNeeded > 0 | |||
| ? kAudioHardwarePropertyDefaultInputDevice | |||
| @@ -461,7 +461,7 @@ bool Typeface::findAndAddSystemGlyph (juce_wchar character) throw() | |||
| addKerningPair (g->getCharacter(), character, kerning); | |||
| } | |||
| } | |||
| foundOne = true; | |||
| } | |||
| @@ -1478,7 +1478,7 @@ public: | |||
| } | |||
| const String getDefaultDeviceName (const bool preferInputNames, | |||
| const int /*numInputChannelsNeeded*/, | |||
| const int /*numInputChannelsNeeded*/, | |||
| const int /*numOutputChannelsNeeded*/) const | |||
| { | |||
| jassert (hasScanned); // need to call scanForDevices() before doing this | |||
| @@ -485,7 +485,7 @@ static bool addGlyphToTypeface (HDC dc, | |||
| const WCHAR charToTest[] = { (WCHAR)character, 0 }; | |||
| WORD index = 0; | |||
| if (wGetGlyphIndicesW (dc, charToTest, 1, &index, GGI_MARK_NONEXISTING_GLYPHS) != GDI_ERROR | |||
| if (wGetGlyphIndicesW (dc, charToTest, 1, &index, GGI_MARK_NONEXISTING_GLYPHS) != GDI_ERROR | |||
| && index == 0xffff) | |||
| { | |||
| return false; | |||
| @@ -511,7 +511,7 @@ static bool addGlyphToTypeface (HDC dc, | |||
| const WCHAR charToTest[] = { (WCHAR)character, 0 }; | |||
| WORD index = 0; | |||
| if (GetGlyphIndicesW (dc, charToTest, 1, &index, GGI_MARK_NONEXISTING_GLYPHS) != GDI_ERROR | |||
| if (GetGlyphIndicesW (dc, charToTest, 1, &index, GGI_MARK_NONEXISTING_GLYPHS) != GDI_ERROR | |||
| && index == 0xffff) | |||
| { | |||
| return false; | |||
| @@ -306,10 +306,10 @@ private: | |||
| const MidiInThread& operator= (const MidiInThread&); | |||
| }; | |||
| static void CALLBACK midiInCallback (HMIDIIN, | |||
| UINT uMsg, | |||
| DWORD_PTR dwInstance, | |||
| DWORD_PTR midiMessage, | |||
| static void CALLBACK midiInCallback (HMIDIIN, | |||
| UINT uMsg, | |||
| DWORD_PTR dwInstance, | |||
| DWORD_PTR midiMessage, | |||
| DWORD_PTR timeStamp) | |||
| { | |||
| MidiInThread* const thread = (MidiInThread*) dwInstance; | |||
| @@ -602,7 +602,7 @@ void MidiOutput::sendMessageNow (const MidiMessage& message) | |||
| { | |||
| const MidiOutHandle* const handle = (const MidiOutHandle*) internal; | |||
| if (message.getRawDataSize() > 3 | |||
| if (message.getRawDataSize() > 3 | |||
| || message.isSysEx()) | |||
| { | |||
| MIDIHDR h; | |||
| @@ -71,7 +71,7 @@ void PluginWindow::closeAllCurrentlyOpenWindows() | |||
| delete activePluginWindows.getUnchecked(i); | |||
| } | |||
| PluginWindow* PluginWindow::getWindowFor (AudioProcessorGraph::Node* node, | |||
| PluginWindow* PluginWindow::getWindowFor (AudioProcessorGraph::Node* node, | |||
| bool useGenericView) | |||
| { | |||
| for (int i = activePluginWindows.size(); --i >= 0;) | |||
| @@ -92,7 +92,7 @@ PluginWindow* PluginWindow::getWindowFor (AudioProcessorGraph::Node* node, | |||
| if (useGenericView) | |||
| { | |||
| ui = new GenericAudioProcessorEditor (node->processor); | |||
| } | |||
| } | |||
| if (ui != 0) | |||
| { | |||
| @@ -297,7 +297,7 @@ public: | |||
| if (getParentComponent() != 0) | |||
| getParentComponent()->globalPositionToRelative (x, y); | |||
| graph.setNodePosition (filterID, | |||
| graph.setNodePosition (filterID, | |||
| (x + getWidth() / 2) / (double) getParentWidth(), | |||
| (y + getHeight() / 2) / (double) getParentHeight()); | |||
| @@ -127,7 +127,7 @@ class PluginWindow : public DocumentWindow | |||
| const bool isGeneric_); | |||
| public: | |||
| static PluginWindow* getWindowFor (AudioProcessorGraph::Node* node, | |||
| static PluginWindow* getWindowFor (AudioProcessorGraph::Node* node, | |||
| bool useGenericView); | |||
| static void closeCurrentlyOpenWindowsFor (const uint32 nodeId); | |||
| @@ -134,6 +134,10 @@ static uint32 lastMasterIdleCall = 0; | |||
| BEGIN_JUCE_NAMESPACE | |||
| extern void juce_callAnyTimersSynchronously(); | |||
| #if JUCE_MAC | |||
| extern void juce_setCurrentExecutableFileNameFromBundleId (const String& bundleId) throw(); | |||
| #endif | |||
| #if JUCE_LINUX | |||
| extern Display* display; | |||
| extern bool juce_postMessageToSystemQueue (void* message); | |||
| @@ -351,6 +355,7 @@ public: | |||
| isProcessing = false; | |||
| firstResize = true; | |||
| hasShutdown = false; | |||
| firstProcessCallback = true; | |||
| channels = 0; | |||
| numInChans = JucePlugin_MaxNumInputChannels; | |||
| numOutChans = JucePlugin_MaxNumOutputChannels; | |||
| @@ -591,13 +596,25 @@ public: | |||
| void processReplacing (float** inputs, float** outputs, VstInt32 numSamples) | |||
| { | |||
| // if this fails, the host hasn't called resume() before processing | |||
| jassert (isProcessing); | |||
| if (firstProcessCallback) | |||
| { | |||
| firstProcessCallback = false; | |||
| // if this fails, the host hasn't called resume() before processing | |||
| jassert (isProcessing); | |||
| // (tragically, some hosts actually need this, although it's stupid to have | |||
| // to do it here..) | |||
| if (! isProcessing) | |||
| resume(); | |||
| // (tragically, some hosts actually need this, although it's stupid to have | |||
| // to do it here..) | |||
| if (! isProcessing) | |||
| resume(); | |||
| filter->setNonRealtime (getCurrentProcessLevel() == 4 /* kVstProcessLevelOffline */); | |||
| #if JUCE_WIN32 | |||
| if (GetThreadPriority (GetCurrentThread()) <= THREAD_PRIORITY_NORMAL) | |||
| filter->setNonRealtime (true); | |||
| #endif | |||
| } | |||
| #if JUCE_DEBUG && ! JucePlugin_ProducesMidiOutput | |||
| const int numMidiEventsComingIn = midiEvents.getNumEvents(); | |||
| @@ -716,8 +733,8 @@ public: | |||
| } | |||
| //============================================================================== | |||
| VstInt32 startProcess () { return 0; } | |||
| VstInt32 stopProcess () { return 0;} | |||
| VstInt32 startProcess () { return 0; } | |||
| VstInt32 stopProcess () { return 0;} | |||
| void resume() | |||
| { | |||
| @@ -736,6 +753,10 @@ public: | |||
| const int blockSize = getBlockSize(); | |||
| jassert (blockSize > 0); | |||
| firstProcessCallback = true; | |||
| filter->setNonRealtime (getCurrentProcessLevel() == 4 /* kVstProcessLevelOffline */); | |||
| filter->setPlayConfigDetails (numInChans, numOutChans, | |||
| rate, blockSize); | |||
| @@ -1367,6 +1388,7 @@ private: | |||
| bool isProcessing; | |||
| bool firstResize; | |||
| bool hasShutdown; | |||
| bool firstProcessCallback; | |||
| int diffW, diffH; | |||
| int numInChans, numOutChans; | |||
| float** channels; | |||
| @@ -1462,6 +1484,10 @@ static AEffect* pluginEntryPoint (audioMasterCallback audioMaster) | |||
| { | |||
| initialiseJuce_GUI(); | |||
| #if JUCE_MAC && defined (JucePlugin_CFBundleIdentifier) | |||
| juce_setCurrentExecutableFileNameFromBundleId (JucePlugin_CFBundleIdentifier); | |||
| #endif | |||
| MessageManager::getInstance()->setTimeBeforeShowingWaitCursor (0); | |||
| try | |||
| @@ -29,8 +29,8 @@ | |||
| ============================================================================== | |||
| */ | |||
| #ifndef __JUCER_TEXTBUTTONHANDLER_JUCEHEADER__x | |||
| #define __JUCER_TEXTBUTTONHANDLER_JUCEHEADER__x | |||
| #ifndef __JUCER_IMAGEBUTTONHANDLER_JUCEHEADER__ | |||
| #define __JUCER_IMAGEBUTTONHANDLER_JUCEHEADER__ | |||
| #include "jucer_ButtonHandler.h" | |||
| #include "../../properties/jucer_ComponentColourProperty.h" | |||
| @@ -209,7 +209,7 @@ public: | |||
| public: | |||
| SetImageResourceAction (ImageButton* const button, | |||
| ComponentLayout& layout_, | |||
| const ImageRole role_, | |||
| const ImageRole role_, | |||
| const String& newResource_) | |||
| : ComponentUndoableAction <ImageButton> (button, layout_), | |||
| newResource (newResource_), | |||
| @@ -349,7 +349,7 @@ public: | |||
| public: | |||
| SetImageOpacityAction (ImageButton* const button, | |||
| ComponentLayout& layout_, | |||
| const ImageRole role_, | |||
| const ImageRole role_, | |||
| const float newState_) | |||
| : ComponentUndoableAction <ImageButton> (button, layout_), | |||
| role (role_), | |||
| @@ -401,7 +401,7 @@ public: | |||
| class ImageButtonOpacityProperty : public SliderPropertyComponent | |||
| { | |||
| public: | |||
| ImageButtonOpacityProperty (ComponentLayout& layout_, ImageButton* const owner_, | |||
| ImageButtonOpacityProperty (ComponentLayout& layout_, ImageButton* const owner_, | |||
| const String& name, const ImageRole role_) | |||
| : SliderPropertyComponent (name, 0.0, 1.0, 0.0), | |||
| owner (owner_), | |||
| @@ -433,7 +433,7 @@ public: | |||
| public: | |||
| SetImageColourAction (ImageButton* const button, | |||
| ComponentLayout& layout_, | |||
| const ImageRole role_, | |||
| const ImageRole role_, | |||
| const Colour& newState_) | |||
| : ComponentUndoableAction <ImageButton> (button, layout_), | |||
| role (role_), | |||
| @@ -486,7 +486,7 @@ public: | |||
| public ChangeListener | |||
| { | |||
| public: | |||
| ImageButtonColourProperty (ComponentLayout& layout_, ImageButton* const owner_, | |||
| ImageButtonColourProperty (ComponentLayout& layout_, ImageButton* const owner_, | |||
| const String& name, const ImageRole role_) | |||
| : ColourPropertyComponent (name, false), | |||
| owner (owner_), | |||
| @@ -532,7 +532,7 @@ public: | |||
| Image* over = document.getResources().getImageFromCache (getImageResource (ib, overImage)); | |||
| Image* down = document.getResources().getImageFromCache (getImageResource (ib, downImage)); | |||
| ib->setImages (false, true, doesImageKeepProportions (ib), | |||
| ib->setImages (false, true, doesImageKeepProportions (ib), | |||
| norm, | |||
| getImageOpacity (ib, normalImage), | |||
| getImageColour (ib, normalImage), | |||
| @@ -551,4 +551,4 @@ private: | |||
| }; | |||
| #endif // __JUCER_TEXTBUTTONHANDLER_JUCEHEADER__ | |||
| #endif // __JUCER_IMAGEBUTTONHANDLER_JUCEHEADER__ | |||
| @@ -43,8 +43,8 @@ class ImageResourceProperty : public ChoicePropertyComponent, | |||
| private ChangeListener | |||
| { | |||
| public: | |||
| ImageResourceProperty (JucerDocument& document_, | |||
| ElementType* const element_, | |||
| ImageResourceProperty (JucerDocument& document_, | |||
| ElementType* const element_, | |||
| const String& name, | |||
| const bool allowChoiceOfNoResource_) | |||
| : ChoicePropertyComponent (name), | |||
| @@ -61,7 +61,7 @@ public: | |||
| document_.addChangeListener (this); | |||
| } | |||
| ImageResourceProperty (ElementType* const element_, | |||
| ImageResourceProperty (ElementType* const element_, | |||
| const String& name, | |||
| const bool allowChoiceOfNoResource_ = false) | |||
| : ChoicePropertyComponent (name), | |||
| @@ -141,7 +141,7 @@ | |||
| /** Enabling this builds support for VST audio plugins. | |||
| @see VSTPluginFormat, AudioPluginFormat, AudioPluginFormatManager, JUCE_PLUGINHOST_AU | |||
| */ | |||
| //#define JUCE_PLUGINHOST_VST 1 | |||
| #define JUCE_PLUGINHOST_VST 1 | |||
| /** Enabling this builds support for AudioUnit audio plugins. | |||
| @see AudioUnitPluginFormat, AudioPluginFormat, AudioPluginFormatManager, JUCE_PLUGINHOST_VST | |||
| @@ -1,370 +1,370 @@ | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 Josh Coalson | |||
| * | |||
| * 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__ALL_H | |||
| #define FLAC__ALL_H | |||
| #include "export.h" | |||
| #include "assert.h" | |||
| #include "callback.h" | |||
| #include "format.h" | |||
| #include "metadata.h" | |||
| #include "ordinals.h" | |||
| #include "stream_decoder.h" | |||
| #include "stream_encoder.h" | |||
| /** \mainpage | |||
| * | |||
| * \section intro Introduction | |||
| * | |||
| * This is the documentation for the FLAC C and C++ APIs. It is | |||
| * highly interconnected; this introduction should give you a top | |||
| * level idea of the structure and how to find the information you | |||
| * need. As a prerequisite you should have at least a basic | |||
| * knowledge of the FLAC format, documented | |||
| * <A HREF="../format.html">here</A>. | |||
| * | |||
| * \section c_api FLAC C API | |||
| * | |||
| * The FLAC C API is the interface to libFLAC, a set of structures | |||
| * describing the components of FLAC streams, and functions for | |||
| * encoding and decoding streams, as well as manipulating FLAC | |||
| * metadata in files. The public include files will be installed | |||
| * in your include area (for example /usr/include/FLAC/...). | |||
| * | |||
| * By writing a little code and linking against libFLAC, it is | |||
| * relatively easy to add FLAC support to another program. The | |||
| * library is licensed under <A HREF="../license.html">Xiph's BSD license</A>. | |||
| * Complete source code of libFLAC as well as the command-line | |||
| * encoder and plugins is available and is a useful source of | |||
| * examples. | |||
| * | |||
| * Aside from encoders and decoders, libFLAC provides a powerful | |||
| * metadata interface for manipulating metadata in FLAC files. It | |||
| * allows the user to add, delete, and modify FLAC metadata blocks | |||
| * and it can automatically take advantage of PADDING blocks to avoid | |||
| * rewriting the entire FLAC file when changing the size of the | |||
| * metadata. | |||
| * | |||
| * libFLAC usually only requires the standard C library and C math | |||
| * library. In particular, threading is not used so there is no | |||
| * dependency on a thread library. However, libFLAC does not use | |||
| * global variables and should be thread-safe. | |||
| * | |||
| * libFLAC also supports encoding to and decoding from Ogg FLAC. | |||
| * However the metadata editing interfaces currently have limited | |||
| * read-only support for Ogg FLAC files. | |||
| * | |||
| * \section cpp_api FLAC C++ API | |||
| * | |||
| * The FLAC C++ API is a set of classes that encapsulate the | |||
| * structures and functions in libFLAC. They provide slightly more | |||
| * functionality with respect to metadata but are otherwise | |||
| * equivalent. For the most part, they share the same usage as | |||
| * their counterparts in libFLAC, and the FLAC C API documentation | |||
| * can be used as a supplement. The public include files | |||
| * for the C++ API will be installed in your include area (for | |||
| * example /usr/include/FLAC++/...). | |||
| * | |||
| * libFLAC++ is also licensed under | |||
| * <A HREF="../license.html">Xiph's BSD license</A>. | |||
| * | |||
| * \section getting_started Getting Started | |||
| * | |||
| * A good starting point for learning the API is to browse through | |||
| * the <A HREF="modules.html">modules</A>. Modules are logical | |||
| * groupings of related functions or classes, which correspond roughly | |||
| * to header files or sections of header files. Each module includes a | |||
| * detailed description of the general usage of its functions or | |||
| * classes. | |||
| * | |||
| * From there you can go on to look at the documentation of | |||
| * individual functions. You can see different views of the individual | |||
| * functions through the links in top bar across this page. | |||
| * | |||
| * If you prefer a more hands-on approach, you can jump right to some | |||
| * <A HREF="../documentation_example_code.html">example code</A>. | |||
| * | |||
| * \section porting_guide Porting Guide | |||
| * | |||
| * Starting with FLAC 1.1.3 a \link porting Porting Guide \endlink | |||
| * has been introduced which gives detailed instructions on how to | |||
| * port your code to newer versions of FLAC. | |||
| * | |||
| * \section embedded_developers Embedded Developers | |||
| * | |||
| * libFLAC has grown larger over time as more functionality has been | |||
| * included, but much of it may be unnecessary for a particular embedded | |||
| * implementation. Unused parts may be pruned by some simple editing of | |||
| * src/libFLAC/Makefile.am. In general, the decoders, encoders, and | |||
| * metadata interface are all independent from each other. | |||
| * | |||
| * It is easiest to just describe the dependencies: | |||
| * | |||
| * - All modules depend on the \link flac_format Format \endlink module. | |||
| * - The decoders and encoders depend on the bitbuffer. | |||
| * - The decoder is independent of the encoder. The encoder uses the | |||
| * decoder because of the verify feature, but this can be removed if | |||
| * not needed. | |||
| * - Parts of the metadata interface require the stream decoder (but not | |||
| * the encoder). | |||
| * - Ogg support is selectable through the compile time macro | |||
| * \c FLAC__HAS_OGG. | |||
| * | |||
| * For example, if your application only requires the stream decoder, no | |||
| * encoder, and no metadata interface, you can remove the stream encoder | |||
| * and the metadata interface, which will greatly reduce the size of the | |||
| * library. | |||
| * | |||
| * Also, there are several places in the libFLAC code with comments marked | |||
| * with "OPT:" where a #define can be changed to enable code that might be | |||
| * faster on a specific platform. Experimenting with these can yield faster | |||
| * binaries. | |||
| */ | |||
| /** \defgroup porting Porting Guide for New Versions | |||
| * | |||
| * This module describes differences in the library interfaces from | |||
| * version to version. It assists in the porting of code that uses | |||
| * the libraries to newer versions of FLAC. | |||
| * | |||
| * One simple facility for making porting easier that has been added | |||
| * in FLAC 1.1.3 is a set of \c #defines in \c export.h of each | |||
| * library's includes (e.g. \c include/FLAC/export.h). The | |||
| * \c #defines mirror the libraries' | |||
| * <A HREF="http://www.gnu.org/software/libtool/manual.html#Libtool-versioning">libtool version numbers</A>, | |||
| * e.g. in libFLAC there are \c FLAC_API_VERSION_CURRENT, | |||
| * \c FLAC_API_VERSION_REVISION, and \c FLAC_API_VERSION_AGE. | |||
| * These can be used to support multiple versions of an API during the | |||
| * transition phase, e.g. | |||
| * | |||
| * \code | |||
| * #if !defined(FLAC_API_VERSION_CURRENT) || FLAC_API_VERSION_CURRENT <= 7 | |||
| * legacy code | |||
| * #else | |||
| * new code | |||
| * #endif | |||
| * \endcode | |||
| * | |||
| * The the source will work for multiple versions and the legacy code can | |||
| * easily be removed when the transition is complete. | |||
| * | |||
| * Another available symbol is FLAC_API_SUPPORTS_OGG_FLAC (defined in | |||
| * include/FLAC/export.h), which can be used to determine whether or not | |||
| * the library has been compiled with support for Ogg FLAC. This is | |||
| * simpler than trying to call an Ogg init function and catching the | |||
| * error. | |||
| */ | |||
| /** \defgroup porting_1_1_2_to_1_1_3 Porting from FLAC 1.1.2 to 1.1.3 | |||
| * \ingroup porting | |||
| * | |||
| * \brief | |||
| * This module describes porting from FLAC 1.1.2 to FLAC 1.1.3. | |||
| * | |||
| * The main change between the APIs in 1.1.2 and 1.1.3 is that they have | |||
| * been simplified. First, libOggFLAC has been merged into libFLAC and | |||
| * libOggFLAC++ has been merged into libFLAC++. Second, both the three | |||
| * decoding layers and three encoding layers have been merged into a | |||
| * single stream decoder and stream encoder. That is, the functionality | |||
| * of FLAC__SeekableStreamDecoder and FLAC__FileDecoder has been merged | |||
| * into FLAC__StreamDecoder, and FLAC__SeekableStreamEncoder and | |||
| * FLAC__FileEncoder into FLAC__StreamEncoder. Only the | |||
| * FLAC__StreamDecoder and FLAC__StreamEncoder remain. What this means | |||
| * is there is now a single API that can be used to encode or decode | |||
| * streams to/from native FLAC or Ogg FLAC and the single API can work | |||
| * on both seekable and non-seekable streams. | |||
| * | |||
| * Instead of creating an encoder or decoder of a certain layer, now the | |||
| * client will always create a FLAC__StreamEncoder or | |||
| * FLAC__StreamDecoder. The old layers are now differentiated by the | |||
| * initialization function. For example, for the decoder, | |||
| * FLAC__stream_decoder_init() has been replaced by | |||
| * FLAC__stream_decoder_init_stream(). This init function takes | |||
| * callbacks for the I/O, and the seeking callbacks are optional. This | |||
| * allows the client to use the same object for seekable and | |||
| * non-seekable streams. For decoding a FLAC file directly, the client | |||
| * can use FLAC__stream_decoder_init_file() and pass just a filename | |||
| * and fewer callbacks; most of the other callbacks are supplied | |||
| * internally. For situations where fopen()ing by filename is not | |||
| * possible (e.g. Unicode filenames on Windows) the client can instead | |||
| * open the file itself and supply the FILE* to | |||
| * FLAC__stream_decoder_init_FILE(). The init functions now returns a | |||
| * FLAC__StreamDecoderInitStatus instead of FLAC__StreamDecoderState. | |||
| * Since the callbacks and client data are now passed to the init | |||
| * function, the FLAC__stream_decoder_set_*_callback() functions and | |||
| * FLAC__stream_decoder_set_client_data() are no longer needed. The | |||
| * rest of the calls to the decoder are the same as before. | |||
| * | |||
| * There are counterpart init functions for Ogg FLAC, e.g. | |||
| * FLAC__stream_decoder_init_ogg_stream(). All the rest of the calls | |||
| * and callbacks are the same as for native FLAC. | |||
| * | |||
| * As an example, in FLAC 1.1.2 a seekable stream decoder would have | |||
| * been set up like so: | |||
| * | |||
| * \code | |||
| * FLAC__SeekableStreamDecoder *decoder = FLAC__seekable_stream_decoder_new(); | |||
| * if(decoder == NULL) do_something; | |||
| * FLAC__seekable_stream_decoder_set_md5_checking(decoder, true); | |||
| * [... other settings ...] | |||
| * FLAC__seekable_stream_decoder_set_read_callback(decoder, my_read_callback); | |||
| * FLAC__seekable_stream_decoder_set_seek_callback(decoder, my_seek_callback); | |||
| * FLAC__seekable_stream_decoder_set_tell_callback(decoder, my_tell_callback); | |||
| * FLAC__seekable_stream_decoder_set_length_callback(decoder, my_length_callback); | |||
| * FLAC__seekable_stream_decoder_set_eof_callback(decoder, my_eof_callback); | |||
| * FLAC__seekable_stream_decoder_set_write_callback(decoder, my_write_callback); | |||
| * FLAC__seekable_stream_decoder_set_metadata_callback(decoder, my_metadata_callback); | |||
| * FLAC__seekable_stream_decoder_set_error_callback(decoder, my_error_callback); | |||
| * FLAC__seekable_stream_decoder_set_client_data(decoder, my_client_data); | |||
| * if(FLAC__seekable_stream_decoder_init(decoder) != FLAC__SEEKABLE_STREAM_DECODER_OK) do_something; | |||
| * \endcode | |||
| * | |||
| * In FLAC 1.1.3 it is like this: | |||
| * | |||
| * \code | |||
| * FLAC__StreamDecoder *decoder = FLAC__stream_decoder_new(); | |||
| * if(decoder == NULL) do_something; | |||
| * FLAC__stream_decoder_set_md5_checking(decoder, true); | |||
| * [... other settings ...] | |||
| * if(FLAC__stream_decoder_init_stream( | |||
| * decoder, | |||
| * my_read_callback, | |||
| * my_seek_callback, // or NULL | |||
| * my_tell_callback, // or NULL | |||
| * my_length_callback, // or NULL | |||
| * my_eof_callback, // or NULL | |||
| * my_write_callback, | |||
| * my_metadata_callback, // or NULL | |||
| * my_error_callback, | |||
| * my_client_data | |||
| * ) != FLAC__STREAM_DECODER_INIT_STATUS_OK) do_something; | |||
| * \endcode | |||
| * | |||
| * or you could do; | |||
| * | |||
| * \code | |||
| * [...] | |||
| * FILE *file = fopen("somefile.flac","rb"); | |||
| * if(file == NULL) do_somthing; | |||
| * if(FLAC__stream_decoder_init_FILE( | |||
| * decoder, | |||
| * file, | |||
| * my_write_callback, | |||
| * my_metadata_callback, // or NULL | |||
| * my_error_callback, | |||
| * my_client_data | |||
| * ) != FLAC__STREAM_DECODER_INIT_STATUS_OK) do_something; | |||
| * \endcode | |||
| * | |||
| * or just: | |||
| * | |||
| * \code | |||
| * [...] | |||
| * if(FLAC__stream_decoder_init_file( | |||
| * decoder, | |||
| * "somefile.flac", | |||
| * my_write_callback, | |||
| * my_metadata_callback, // or NULL | |||
| * my_error_callback, | |||
| * my_client_data | |||
| * ) != FLAC__STREAM_DECODER_INIT_STATUS_OK) do_something; | |||
| * \endcode | |||
| * | |||
| * Another small change to the decoder is in how it handles unparseable | |||
| * streams. Before, when the decoder found an unparseable stream | |||
| * (reserved for when the decoder encounters a stream from a future | |||
| * encoder that it can't parse), it changed the state to | |||
| * \c FLAC__STREAM_DECODER_UNPARSEABLE_STREAM. Now the decoder instead | |||
| * drops sync and calls the error callback with a new error code | |||
| * \c FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM. This is | |||
| * more robust. If your error callback does not discriminate on the the | |||
| * error state, your code does not need to be changed. | |||
| * | |||
| * The encoder now has a new setting: | |||
| * FLAC__stream_encoder_set_apodization(). This is for setting the | |||
| * method used to window the data before LPC analysis. You only need to | |||
| * add a call to this function if the default is not suitable. There | |||
| * are also two new convenience functions that may be useful: | |||
| * FLAC__metadata_object_cuesheet_calculate_cddb_id() and | |||
| * FLAC__metadata_get_cuesheet(). | |||
| * | |||
| * The \a bytes parameter to FLAC__StreamDecoderReadCallback, | |||
| * FLAC__StreamEncoderReadCallback, and FLAC__StreamEncoderWriteCallback | |||
| * is now \c size_t instead of \c unsigned. | |||
| */ | |||
| /** \defgroup porting_1_1_3_to_1_1_4 Porting from FLAC 1.1.3 to 1.1.4 | |||
| * \ingroup porting | |||
| * | |||
| * \brief | |||
| * This module describes porting from FLAC 1.1.3 to FLAC 1.1.4. | |||
| * | |||
| * There were no changes to any of the interfaces from 1.1.3 to 1.1.4. | |||
| * There was a slight change in the implementation of | |||
| * FLAC__stream_encoder_set_metadata(); the function now makes a copy | |||
| * of the \a metadata array of pointers so the client no longer needs | |||
| * to maintain it after the call. The objects themselves that are | |||
| * pointed to by the array are still not copied though and must be | |||
| * maintained until the call to FLAC__stream_encoder_finish(). | |||
| */ | |||
| /** \defgroup porting_1_1_4_to_1_2_0 Porting from FLAC 1.1.4 to 1.2.0 | |||
| * \ingroup porting | |||
| * | |||
| * \brief | |||
| * This module describes porting from FLAC 1.1.4 to FLAC 1.2.0. | |||
| * | |||
| * There were only very minor changes to the interfaces from 1.1.4 to 1.2.0. | |||
| * In libFLAC, \c FLAC__format_sample_rate_is_subset() was added. | |||
| * In libFLAC++, \c FLAC::Decoder::Stream::get_decode_position() was added. | |||
| * | |||
| * Finally, value of the constant \c FLAC__FRAME_HEADER_RESERVED_LEN | |||
| * has changed to reflect the conversion of one of the reserved bits | |||
| * into active use. It used to be \c 2 and now is \c 1. However the | |||
| * FLAC frame header length has not changed, so to skip the proper | |||
| * number of bits, use \c FLAC__FRAME_HEADER_RESERVED_LEN + | |||
| * \c FLAC__FRAME_HEADER_BLOCKING_STRATEGY_LEN | |||
| */ | |||
| /** \defgroup flac FLAC C API | |||
| * | |||
| * The FLAC C API is the interface to libFLAC, a set of structures | |||
| * describing the components of FLAC streams, and functions for | |||
| * encoding and decoding streams, as well as manipulating FLAC | |||
| * metadata in files. | |||
| * | |||
| * You should start with the format components as all other modules | |||
| * are dependent on it. | |||
| */ | |||
| #endif | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 Josh Coalson | |||
| * | |||
| * 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__ALL_H | |||
| #define FLAC__ALL_H | |||
| #include "export.h" | |||
| #include "assert.h" | |||
| #include "callback.h" | |||
| #include "format.h" | |||
| #include "metadata.h" | |||
| #include "ordinals.h" | |||
| #include "stream_decoder.h" | |||
| #include "stream_encoder.h" | |||
| /** \mainpage | |||
| * | |||
| * \section intro Introduction | |||
| * | |||
| * This is the documentation for the FLAC C and C++ APIs. It is | |||
| * highly interconnected; this introduction should give you a top | |||
| * level idea of the structure and how to find the information you | |||
| * need. As a prerequisite you should have at least a basic | |||
| * knowledge of the FLAC format, documented | |||
| * <A HREF="../format.html">here</A>. | |||
| * | |||
| * \section c_api FLAC C API | |||
| * | |||
| * The FLAC C API is the interface to libFLAC, a set of structures | |||
| * describing the components of FLAC streams, and functions for | |||
| * encoding and decoding streams, as well as manipulating FLAC | |||
| * metadata in files. The public include files will be installed | |||
| * in your include area (for example /usr/include/FLAC/...). | |||
| * | |||
| * By writing a little code and linking against libFLAC, it is | |||
| * relatively easy to add FLAC support to another program. The | |||
| * library is licensed under <A HREF="../license.html">Xiph's BSD license</A>. | |||
| * Complete source code of libFLAC as well as the command-line | |||
| * encoder and plugins is available and is a useful source of | |||
| * examples. | |||
| * | |||
| * Aside from encoders and decoders, libFLAC provides a powerful | |||
| * metadata interface for manipulating metadata in FLAC files. It | |||
| * allows the user to add, delete, and modify FLAC metadata blocks | |||
| * and it can automatically take advantage of PADDING blocks to avoid | |||
| * rewriting the entire FLAC file when changing the size of the | |||
| * metadata. | |||
| * | |||
| * libFLAC usually only requires the standard C library and C math | |||
| * library. In particular, threading is not used so there is no | |||
| * dependency on a thread library. However, libFLAC does not use | |||
| * global variables and should be thread-safe. | |||
| * | |||
| * libFLAC also supports encoding to and decoding from Ogg FLAC. | |||
| * However the metadata editing interfaces currently have limited | |||
| * read-only support for Ogg FLAC files. | |||
| * | |||
| * \section cpp_api FLAC C++ API | |||
| * | |||
| * The FLAC C++ API is a set of classes that encapsulate the | |||
| * structures and functions in libFLAC. They provide slightly more | |||
| * functionality with respect to metadata but are otherwise | |||
| * equivalent. For the most part, they share the same usage as | |||
| * their counterparts in libFLAC, and the FLAC C API documentation | |||
| * can be used as a supplement. The public include files | |||
| * for the C++ API will be installed in your include area (for | |||
| * example /usr/include/FLAC++/...). | |||
| * | |||
| * libFLAC++ is also licensed under | |||
| * <A HREF="../license.html">Xiph's BSD license</A>. | |||
| * | |||
| * \section getting_started Getting Started | |||
| * | |||
| * A good starting point for learning the API is to browse through | |||
| * the <A HREF="modules.html">modules</A>. Modules are logical | |||
| * groupings of related functions or classes, which correspond roughly | |||
| * to header files or sections of header files. Each module includes a | |||
| * detailed description of the general usage of its functions or | |||
| * classes. | |||
| * | |||
| * From there you can go on to look at the documentation of | |||
| * individual functions. You can see different views of the individual | |||
| * functions through the links in top bar across this page. | |||
| * | |||
| * If you prefer a more hands-on approach, you can jump right to some | |||
| * <A HREF="../documentation_example_code.html">example code</A>. | |||
| * | |||
| * \section porting_guide Porting Guide | |||
| * | |||
| * Starting with FLAC 1.1.3 a \link porting Porting Guide \endlink | |||
| * has been introduced which gives detailed instructions on how to | |||
| * port your code to newer versions of FLAC. | |||
| * | |||
| * \section embedded_developers Embedded Developers | |||
| * | |||
| * libFLAC has grown larger over time as more functionality has been | |||
| * included, but much of it may be unnecessary for a particular embedded | |||
| * implementation. Unused parts may be pruned by some simple editing of | |||
| * src/libFLAC/Makefile.am. In general, the decoders, encoders, and | |||
| * metadata interface are all independent from each other. | |||
| * | |||
| * It is easiest to just describe the dependencies: | |||
| * | |||
| * - All modules depend on the \link flac_format Format \endlink module. | |||
| * - The decoders and encoders depend on the bitbuffer. | |||
| * - The decoder is independent of the encoder. The encoder uses the | |||
| * decoder because of the verify feature, but this can be removed if | |||
| * not needed. | |||
| * - Parts of the metadata interface require the stream decoder (but not | |||
| * the encoder). | |||
| * - Ogg support is selectable through the compile time macro | |||
| * \c FLAC__HAS_OGG. | |||
| * | |||
| * For example, if your application only requires the stream decoder, no | |||
| * encoder, and no metadata interface, you can remove the stream encoder | |||
| * and the metadata interface, which will greatly reduce the size of the | |||
| * library. | |||
| * | |||
| * Also, there are several places in the libFLAC code with comments marked | |||
| * with "OPT:" where a #define can be changed to enable code that might be | |||
| * faster on a specific platform. Experimenting with these can yield faster | |||
| * binaries. | |||
| */ | |||
| /** \defgroup porting Porting Guide for New Versions | |||
| * | |||
| * This module describes differences in the library interfaces from | |||
| * version to version. It assists in the porting of code that uses | |||
| * the libraries to newer versions of FLAC. | |||
| * | |||
| * One simple facility for making porting easier that has been added | |||
| * in FLAC 1.1.3 is a set of \c #defines in \c export.h of each | |||
| * library's includes (e.g. \c include/FLAC/export.h). The | |||
| * \c #defines mirror the libraries' | |||
| * <A HREF="http://www.gnu.org/software/libtool/manual.html#Libtool-versioning">libtool version numbers</A>, | |||
| * e.g. in libFLAC there are \c FLAC_API_VERSION_CURRENT, | |||
| * \c FLAC_API_VERSION_REVISION, and \c FLAC_API_VERSION_AGE. | |||
| * These can be used to support multiple versions of an API during the | |||
| * transition phase, e.g. | |||
| * | |||
| * \code | |||
| * #if !defined(FLAC_API_VERSION_CURRENT) || FLAC_API_VERSION_CURRENT <= 7 | |||
| * legacy code | |||
| * #else | |||
| * new code | |||
| * #endif | |||
| * \endcode | |||
| * | |||
| * The the source will work for multiple versions and the legacy code can | |||
| * easily be removed when the transition is complete. | |||
| * | |||
| * Another available symbol is FLAC_API_SUPPORTS_OGG_FLAC (defined in | |||
| * include/FLAC/export.h), which can be used to determine whether or not | |||
| * the library has been compiled with support for Ogg FLAC. This is | |||
| * simpler than trying to call an Ogg init function and catching the | |||
| * error. | |||
| */ | |||
| /** \defgroup porting_1_1_2_to_1_1_3 Porting from FLAC 1.1.2 to 1.1.3 | |||
| * \ingroup porting | |||
| * | |||
| * \brief | |||
| * This module describes porting from FLAC 1.1.2 to FLAC 1.1.3. | |||
| * | |||
| * The main change between the APIs in 1.1.2 and 1.1.3 is that they have | |||
| * been simplified. First, libOggFLAC has been merged into libFLAC and | |||
| * libOggFLAC++ has been merged into libFLAC++. Second, both the three | |||
| * decoding layers and three encoding layers have been merged into a | |||
| * single stream decoder and stream encoder. That is, the functionality | |||
| * of FLAC__SeekableStreamDecoder and FLAC__FileDecoder has been merged | |||
| * into FLAC__StreamDecoder, and FLAC__SeekableStreamEncoder and | |||
| * FLAC__FileEncoder into FLAC__StreamEncoder. Only the | |||
| * FLAC__StreamDecoder and FLAC__StreamEncoder remain. What this means | |||
| * is there is now a single API that can be used to encode or decode | |||
| * streams to/from native FLAC or Ogg FLAC and the single API can work | |||
| * on both seekable and non-seekable streams. | |||
| * | |||
| * Instead of creating an encoder or decoder of a certain layer, now the | |||
| * client will always create a FLAC__StreamEncoder or | |||
| * FLAC__StreamDecoder. The old layers are now differentiated by the | |||
| * initialization function. For example, for the decoder, | |||
| * FLAC__stream_decoder_init() has been replaced by | |||
| * FLAC__stream_decoder_init_stream(). This init function takes | |||
| * callbacks for the I/O, and the seeking callbacks are optional. This | |||
| * allows the client to use the same object for seekable and | |||
| * non-seekable streams. For decoding a FLAC file directly, the client | |||
| * can use FLAC__stream_decoder_init_file() and pass just a filename | |||
| * and fewer callbacks; most of the other callbacks are supplied | |||
| * internally. For situations where fopen()ing by filename is not | |||
| * possible (e.g. Unicode filenames on Windows) the client can instead | |||
| * open the file itself and supply the FILE* to | |||
| * FLAC__stream_decoder_init_FILE(). The init functions now returns a | |||
| * FLAC__StreamDecoderInitStatus instead of FLAC__StreamDecoderState. | |||
| * Since the callbacks and client data are now passed to the init | |||
| * function, the FLAC__stream_decoder_set_*_callback() functions and | |||
| * FLAC__stream_decoder_set_client_data() are no longer needed. The | |||
| * rest of the calls to the decoder are the same as before. | |||
| * | |||
| * There are counterpart init functions for Ogg FLAC, e.g. | |||
| * FLAC__stream_decoder_init_ogg_stream(). All the rest of the calls | |||
| * and callbacks are the same as for native FLAC. | |||
| * | |||
| * As an example, in FLAC 1.1.2 a seekable stream decoder would have | |||
| * been set up like so: | |||
| * | |||
| * \code | |||
| * FLAC__SeekableStreamDecoder *decoder = FLAC__seekable_stream_decoder_new(); | |||
| * if(decoder == NULL) do_something; | |||
| * FLAC__seekable_stream_decoder_set_md5_checking(decoder, true); | |||
| * [... other settings ...] | |||
| * FLAC__seekable_stream_decoder_set_read_callback(decoder, my_read_callback); | |||
| * FLAC__seekable_stream_decoder_set_seek_callback(decoder, my_seek_callback); | |||
| * FLAC__seekable_stream_decoder_set_tell_callback(decoder, my_tell_callback); | |||
| * FLAC__seekable_stream_decoder_set_length_callback(decoder, my_length_callback); | |||
| * FLAC__seekable_stream_decoder_set_eof_callback(decoder, my_eof_callback); | |||
| * FLAC__seekable_stream_decoder_set_write_callback(decoder, my_write_callback); | |||
| * FLAC__seekable_stream_decoder_set_metadata_callback(decoder, my_metadata_callback); | |||
| * FLAC__seekable_stream_decoder_set_error_callback(decoder, my_error_callback); | |||
| * FLAC__seekable_stream_decoder_set_client_data(decoder, my_client_data); | |||
| * if(FLAC__seekable_stream_decoder_init(decoder) != FLAC__SEEKABLE_STREAM_DECODER_OK) do_something; | |||
| * \endcode | |||
| * | |||
| * In FLAC 1.1.3 it is like this: | |||
| * | |||
| * \code | |||
| * FLAC__StreamDecoder *decoder = FLAC__stream_decoder_new(); | |||
| * if(decoder == NULL) do_something; | |||
| * FLAC__stream_decoder_set_md5_checking(decoder, true); | |||
| * [... other settings ...] | |||
| * if(FLAC__stream_decoder_init_stream( | |||
| * decoder, | |||
| * my_read_callback, | |||
| * my_seek_callback, // or NULL | |||
| * my_tell_callback, // or NULL | |||
| * my_length_callback, // or NULL | |||
| * my_eof_callback, // or NULL | |||
| * my_write_callback, | |||
| * my_metadata_callback, // or NULL | |||
| * my_error_callback, | |||
| * my_client_data | |||
| * ) != FLAC__STREAM_DECODER_INIT_STATUS_OK) do_something; | |||
| * \endcode | |||
| * | |||
| * or you could do; | |||
| * | |||
| * \code | |||
| * [...] | |||
| * FILE *file = fopen("somefile.flac","rb"); | |||
| * if(file == NULL) do_somthing; | |||
| * if(FLAC__stream_decoder_init_FILE( | |||
| * decoder, | |||
| * file, | |||
| * my_write_callback, | |||
| * my_metadata_callback, // or NULL | |||
| * my_error_callback, | |||
| * my_client_data | |||
| * ) != FLAC__STREAM_DECODER_INIT_STATUS_OK) do_something; | |||
| * \endcode | |||
| * | |||
| * or just: | |||
| * | |||
| * \code | |||
| * [...] | |||
| * if(FLAC__stream_decoder_init_file( | |||
| * decoder, | |||
| * "somefile.flac", | |||
| * my_write_callback, | |||
| * my_metadata_callback, // or NULL | |||
| * my_error_callback, | |||
| * my_client_data | |||
| * ) != FLAC__STREAM_DECODER_INIT_STATUS_OK) do_something; | |||
| * \endcode | |||
| * | |||
| * Another small change to the decoder is in how it handles unparseable | |||
| * streams. Before, when the decoder found an unparseable stream | |||
| * (reserved for when the decoder encounters a stream from a future | |||
| * encoder that it can't parse), it changed the state to | |||
| * \c FLAC__STREAM_DECODER_UNPARSEABLE_STREAM. Now the decoder instead | |||
| * drops sync and calls the error callback with a new error code | |||
| * \c FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM. This is | |||
| * more robust. If your error callback does not discriminate on the the | |||
| * error state, your code does not need to be changed. | |||
| * | |||
| * The encoder now has a new setting: | |||
| * FLAC__stream_encoder_set_apodization(). This is for setting the | |||
| * method used to window the data before LPC analysis. You only need to | |||
| * add a call to this function if the default is not suitable. There | |||
| * are also two new convenience functions that may be useful: | |||
| * FLAC__metadata_object_cuesheet_calculate_cddb_id() and | |||
| * FLAC__metadata_get_cuesheet(). | |||
| * | |||
| * The \a bytes parameter to FLAC__StreamDecoderReadCallback, | |||
| * FLAC__StreamEncoderReadCallback, and FLAC__StreamEncoderWriteCallback | |||
| * is now \c size_t instead of \c unsigned. | |||
| */ | |||
| /** \defgroup porting_1_1_3_to_1_1_4 Porting from FLAC 1.1.3 to 1.1.4 | |||
| * \ingroup porting | |||
| * | |||
| * \brief | |||
| * This module describes porting from FLAC 1.1.3 to FLAC 1.1.4. | |||
| * | |||
| * There were no changes to any of the interfaces from 1.1.3 to 1.1.4. | |||
| * There was a slight change in the implementation of | |||
| * FLAC__stream_encoder_set_metadata(); the function now makes a copy | |||
| * of the \a metadata array of pointers so the client no longer needs | |||
| * to maintain it after the call. The objects themselves that are | |||
| * pointed to by the array are still not copied though and must be | |||
| * maintained until the call to FLAC__stream_encoder_finish(). | |||
| */ | |||
| /** \defgroup porting_1_1_4_to_1_2_0 Porting from FLAC 1.1.4 to 1.2.0 | |||
| * \ingroup porting | |||
| * | |||
| * \brief | |||
| * This module describes porting from FLAC 1.1.4 to FLAC 1.2.0. | |||
| * | |||
| * There were only very minor changes to the interfaces from 1.1.4 to 1.2.0. | |||
| * In libFLAC, \c FLAC__format_sample_rate_is_subset() was added. | |||
| * In libFLAC++, \c FLAC::Decoder::Stream::get_decode_position() was added. | |||
| * | |||
| * Finally, value of the constant \c FLAC__FRAME_HEADER_RESERVED_LEN | |||
| * has changed to reflect the conversion of one of the reserved bits | |||
| * into active use. It used to be \c 2 and now is \c 1. However the | |||
| * FLAC frame header length has not changed, so to skip the proper | |||
| * number of bits, use \c FLAC__FRAME_HEADER_RESERVED_LEN + | |||
| * \c FLAC__FRAME_HEADER_BLOCKING_STRATEGY_LEN | |||
| */ | |||
| /** \defgroup flac FLAC C API | |||
| * | |||
| * The FLAC C API is the interface to libFLAC, a set of structures | |||
| * describing the components of FLAC streams, and functions for | |||
| * encoding and decoding streams, as well as manipulating FLAC | |||
| * metadata in files. | |||
| * | |||
| * You should start with the format components as all other modules | |||
| * are dependent on it. | |||
| */ | |||
| #endif | |||
| @@ -1,212 +1,212 @@ | |||
| /* alloc - Convenience routines for safely allocating memory | |||
| * Copyright (C) 2007 Josh Coalson | |||
| * | |||
| * This library is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU Lesser General Public | |||
| * License as published by the Free Software Foundation; either | |||
| * version 2.1 of the License, or (at your option) any later version. | |||
| * | |||
| * This library is distributed in the hope that it will be useful, | |||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||
| * Lesser General Public License for more details. | |||
| * | |||
| * You should have received a copy of the GNU Lesser General Public | |||
| * License along with this library; if not, write to the Free Software | |||
| * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |||
| */ | |||
| #ifndef FLAC__SHARE__ALLOC_H | |||
| #define FLAC__SHARE__ALLOC_H | |||
| #if HAVE_CONFIG_H | |||
| # include <config.h> | |||
| #endif | |||
| /* WATCHOUT: for c++ you may have to #define __STDC_LIMIT_MACROS 1 real early | |||
| * before #including this file, otherwise SIZE_MAX might not be defined | |||
| */ | |||
| #include <limits.h> /* for SIZE_MAX */ | |||
| #if !defined _MSC_VER && !defined __MINGW32__ && !defined __EMX__ | |||
| #include <stdint.h> /* for SIZE_MAX in case limits.h didn't get it */ | |||
| #endif | |||
| #include <stdlib.h> /* for size_t, malloc(), etc */ | |||
| #ifndef SIZE_MAX | |||
| # ifndef SIZE_T_MAX | |||
| # ifdef _MSC_VER | |||
| # define SIZE_T_MAX UINT_MAX | |||
| # else | |||
| # error | |||
| # endif | |||
| # endif | |||
| # define SIZE_MAX SIZE_T_MAX | |||
| #endif | |||
| #ifndef FLaC__INLINE | |||
| #define FLaC__INLINE | |||
| #endif | |||
| /* avoid malloc()ing 0 bytes, see: | |||
| * https://www.securecoding.cert.org/confluence/display/seccode/MEM04-A.+Do+not+make+assumptions+about+the+result+of+allocating+0+bytes?focusedCommentId=5407003 | |||
| */ | |||
| static FLaC__INLINE void *safe_malloc_(size_t size) | |||
| { | |||
| /* malloc(0) is undefined; FLAC src convention is to always allocate */ | |||
| if(!size) | |||
| size++; | |||
| return malloc(size); | |||
| } | |||
| static FLaC__INLINE void *safe_calloc_(size_t nmemb, size_t size) | |||
| { | |||
| if(!nmemb || !size) | |||
| return malloc(1); /* malloc(0) is undefined; FLAC src convention is to always allocate */ | |||
| return calloc(nmemb, size); | |||
| } | |||
| /*@@@@ there's probably a better way to prevent overflows when allocating untrusted sums but this works for now */ | |||
| static FLaC__INLINE void *safe_malloc_add_2op_(size_t size1, size_t size2) | |||
| { | |||
| size2 += size1; | |||
| if(size2 < size1) | |||
| return 0; | |||
| return safe_malloc_(size2); | |||
| } | |||
| static FLaC__INLINE void *safe_malloc_add_3op_(size_t size1, size_t size2, size_t size3) | |||
| { | |||
| size2 += size1; | |||
| if(size2 < size1) | |||
| return 0; | |||
| size3 += size2; | |||
| if(size3 < size2) | |||
| return 0; | |||
| return safe_malloc_(size3); | |||
| } | |||
| static FLaC__INLINE void *safe_malloc_add_4op_(size_t size1, size_t size2, size_t size3, size_t size4) | |||
| { | |||
| size2 += size1; | |||
| if(size2 < size1) | |||
| return 0; | |||
| size3 += size2; | |||
| if(size3 < size2) | |||
| return 0; | |||
| size4 += size3; | |||
| if(size4 < size3) | |||
| return 0; | |||
| return safe_malloc_(size4); | |||
| } | |||
| static FLaC__INLINE void *safe_malloc_mul_2op_(size_t size1, size_t size2) | |||
| #if 0 | |||
| needs support for cases where sizeof(size_t) != 4 | |||
| { | |||
| /* could be faster #ifdef'ing off SIZEOF_SIZE_T */ | |||
| if(sizeof(size_t) == 4) { | |||
| if ((double)size1 * (double)size2 < 4294967296.0) | |||
| return malloc(size1*size2); | |||
| } | |||
| return 0; | |||
| } | |||
| #else | |||
| /* better? */ | |||
| { | |||
| if(!size1 || !size2) | |||
| return malloc(1); /* malloc(0) is undefined; FLAC src convention is to always allocate */ | |||
| if(size1 > SIZE_MAX / size2) | |||
| return 0; | |||
| return malloc(size1*size2); | |||
| } | |||
| #endif | |||
| static FLaC__INLINE void *safe_malloc_mul_3op_(size_t size1, size_t size2, size_t size3) | |||
| { | |||
| if(!size1 || !size2 || !size3) | |||
| return malloc(1); /* malloc(0) is undefined; FLAC src convention is to always allocate */ | |||
| if(size1 > SIZE_MAX / size2) | |||
| return 0; | |||
| size1 *= size2; | |||
| if(size1 > SIZE_MAX / size3) | |||
| return 0; | |||
| return malloc(size1*size3); | |||
| } | |||
| /* size1*size2 + size3 */ | |||
| static FLaC__INLINE void *safe_malloc_mul2add_(size_t size1, size_t size2, size_t size3) | |||
| { | |||
| if(!size1 || !size2) | |||
| return safe_malloc_(size3); | |||
| if(size1 > SIZE_MAX / size2) | |||
| return 0; | |||
| return safe_malloc_add_2op_(size1*size2, size3); | |||
| } | |||
| /* size1 * (size2 + size3) */ | |||
| static FLaC__INLINE void *safe_malloc_muladd2_(size_t size1, size_t size2, size_t size3) | |||
| { | |||
| if(!size1 || (!size2 && !size3)) | |||
| return malloc(1); /* malloc(0) is undefined; FLAC src convention is to always allocate */ | |||
| size2 += size3; | |||
| if(size2 < size3) | |||
| return 0; | |||
| return safe_malloc_mul_2op_(size1, size2); | |||
| } | |||
| static FLaC__INLINE void *safe_realloc_add_2op_(void *ptr, size_t size1, size_t size2) | |||
| { | |||
| size2 += size1; | |||
| if(size2 < size1) | |||
| return 0; | |||
| return realloc(ptr, size2); | |||
| } | |||
| static FLaC__INLINE void *safe_realloc_add_3op_(void *ptr, size_t size1, size_t size2, size_t size3) | |||
| { | |||
| size2 += size1; | |||
| if(size2 < size1) | |||
| return 0; | |||
| size3 += size2; | |||
| if(size3 < size2) | |||
| return 0; | |||
| return realloc(ptr, size3); | |||
| } | |||
| static FLaC__INLINE void *safe_realloc_add_4op_(void *ptr, size_t size1, size_t size2, size_t size3, size_t size4) | |||
| { | |||
| size2 += size1; | |||
| if(size2 < size1) | |||
| return 0; | |||
| size3 += size2; | |||
| if(size3 < size2) | |||
| return 0; | |||
| size4 += size3; | |||
| if(size4 < size3) | |||
| return 0; | |||
| return realloc(ptr, size4); | |||
| } | |||
| static FLaC__INLINE void *safe_realloc_mul_2op_(void *ptr, size_t size1, size_t size2) | |||
| { | |||
| if(!size1 || !size2) | |||
| return realloc(ptr, 0); /* preserve POSIX realloc(ptr, 0) semantics */ | |||
| if(size1 > SIZE_MAX / size2) | |||
| return 0; | |||
| return realloc(ptr, size1*size2); | |||
| } | |||
| /* size1 * (size2 + size3) */ | |||
| static FLaC__INLINE void *safe_realloc_muladd2_(void *ptr, size_t size1, size_t size2, size_t size3) | |||
| { | |||
| if(!size1 || (!size2 && !size3)) | |||
| return realloc(ptr, 0); /* preserve POSIX realloc(ptr, 0) semantics */ | |||
| size2 += size3; | |||
| if(size2 < size3) | |||
| return 0; | |||
| return safe_realloc_mul_2op_(ptr, size1, size2); | |||
| } | |||
| #endif | |||
| /* alloc - Convenience routines for safely allocating memory | |||
| * Copyright (C) 2007 Josh Coalson | |||
| * | |||
| * This library is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU Lesser General Public | |||
| * License as published by the Free Software Foundation; either | |||
| * version 2.1 of the License, or (at your option) any later version. | |||
| * | |||
| * This library is distributed in the hope that it will be useful, | |||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||
| * Lesser General Public License for more details. | |||
| * | |||
| * You should have received a copy of the GNU Lesser General Public | |||
| * License along with this library; if not, write to the Free Software | |||
| * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |||
| */ | |||
| #ifndef FLAC__SHARE__ALLOC_H | |||
| #define FLAC__SHARE__ALLOC_H | |||
| #if HAVE_CONFIG_H | |||
| # include <config.h> | |||
| #endif | |||
| /* WATCHOUT: for c++ you may have to #define __STDC_LIMIT_MACROS 1 real early | |||
| * before #including this file, otherwise SIZE_MAX might not be defined | |||
| */ | |||
| #include <limits.h> /* for SIZE_MAX */ | |||
| #if !defined _MSC_VER && !defined __MINGW32__ && !defined __EMX__ | |||
| #include <stdint.h> /* for SIZE_MAX in case limits.h didn't get it */ | |||
| #endif | |||
| #include <stdlib.h> /* for size_t, malloc(), etc */ | |||
| #ifndef SIZE_MAX | |||
| # ifndef SIZE_T_MAX | |||
| # ifdef _MSC_VER | |||
| # define SIZE_T_MAX UINT_MAX | |||
| # else | |||
| # error | |||
| # endif | |||
| # endif | |||
| # define SIZE_MAX SIZE_T_MAX | |||
| #endif | |||
| #ifndef FLaC__INLINE | |||
| #define FLaC__INLINE | |||
| #endif | |||
| /* avoid malloc()ing 0 bytes, see: | |||
| * https://www.securecoding.cert.org/confluence/display/seccode/MEM04-A.+Do+not+make+assumptions+about+the+result+of+allocating+0+bytes?focusedCommentId=5407003 | |||
| */ | |||
| static FLaC__INLINE void *safe_malloc_(size_t size) | |||
| { | |||
| /* malloc(0) is undefined; FLAC src convention is to always allocate */ | |||
| if(!size) | |||
| size++; | |||
| return malloc(size); | |||
| } | |||
| static FLaC__INLINE void *safe_calloc_(size_t nmemb, size_t size) | |||
| { | |||
| if(!nmemb || !size) | |||
| return malloc(1); /* malloc(0) is undefined; FLAC src convention is to always allocate */ | |||
| return calloc(nmemb, size); | |||
| } | |||
| /*@@@@ there's probably a better way to prevent overflows when allocating untrusted sums but this works for now */ | |||
| static FLaC__INLINE void *safe_malloc_add_2op_(size_t size1, size_t size2) | |||
| { | |||
| size2 += size1; | |||
| if(size2 < size1) | |||
| return 0; | |||
| return safe_malloc_(size2); | |||
| } | |||
| static FLaC__INLINE void *safe_malloc_add_3op_(size_t size1, size_t size2, size_t size3) | |||
| { | |||
| size2 += size1; | |||
| if(size2 < size1) | |||
| return 0; | |||
| size3 += size2; | |||
| if(size3 < size2) | |||
| return 0; | |||
| return safe_malloc_(size3); | |||
| } | |||
| static FLaC__INLINE void *safe_malloc_add_4op_(size_t size1, size_t size2, size_t size3, size_t size4) | |||
| { | |||
| size2 += size1; | |||
| if(size2 < size1) | |||
| return 0; | |||
| size3 += size2; | |||
| if(size3 < size2) | |||
| return 0; | |||
| size4 += size3; | |||
| if(size4 < size3) | |||
| return 0; | |||
| return safe_malloc_(size4); | |||
| } | |||
| static FLaC__INLINE void *safe_malloc_mul_2op_(size_t size1, size_t size2) | |||
| #if 0 | |||
| needs support for cases where sizeof(size_t) != 4 | |||
| { | |||
| /* could be faster #ifdef'ing off SIZEOF_SIZE_T */ | |||
| if(sizeof(size_t) == 4) { | |||
| if ((double)size1 * (double)size2 < 4294967296.0) | |||
| return malloc(size1*size2); | |||
| } | |||
| return 0; | |||
| } | |||
| #else | |||
| /* better? */ | |||
| { | |||
| if(!size1 || !size2) | |||
| return malloc(1); /* malloc(0) is undefined; FLAC src convention is to always allocate */ | |||
| if(size1 > SIZE_MAX / size2) | |||
| return 0; | |||
| return malloc(size1*size2); | |||
| } | |||
| #endif | |||
| static FLaC__INLINE void *safe_malloc_mul_3op_(size_t size1, size_t size2, size_t size3) | |||
| { | |||
| if(!size1 || !size2 || !size3) | |||
| return malloc(1); /* malloc(0) is undefined; FLAC src convention is to always allocate */ | |||
| if(size1 > SIZE_MAX / size2) | |||
| return 0; | |||
| size1 *= size2; | |||
| if(size1 > SIZE_MAX / size3) | |||
| return 0; | |||
| return malloc(size1*size3); | |||
| } | |||
| /* size1*size2 + size3 */ | |||
| static FLaC__INLINE void *safe_malloc_mul2add_(size_t size1, size_t size2, size_t size3) | |||
| { | |||
| if(!size1 || !size2) | |||
| return safe_malloc_(size3); | |||
| if(size1 > SIZE_MAX / size2) | |||
| return 0; | |||
| return safe_malloc_add_2op_(size1*size2, size3); | |||
| } | |||
| /* size1 * (size2 + size3) */ | |||
| static FLaC__INLINE void *safe_malloc_muladd2_(size_t size1, size_t size2, size_t size3) | |||
| { | |||
| if(!size1 || (!size2 && !size3)) | |||
| return malloc(1); /* malloc(0) is undefined; FLAC src convention is to always allocate */ | |||
| size2 += size3; | |||
| if(size2 < size3) | |||
| return 0; | |||
| return safe_malloc_mul_2op_(size1, size2); | |||
| } | |||
| static FLaC__INLINE void *safe_realloc_add_2op_(void *ptr, size_t size1, size_t size2) | |||
| { | |||
| size2 += size1; | |||
| if(size2 < size1) | |||
| return 0; | |||
| return realloc(ptr, size2); | |||
| } | |||
| static FLaC__INLINE void *safe_realloc_add_3op_(void *ptr, size_t size1, size_t size2, size_t size3) | |||
| { | |||
| size2 += size1; | |||
| if(size2 < size1) | |||
| return 0; | |||
| size3 += size2; | |||
| if(size3 < size2) | |||
| return 0; | |||
| return realloc(ptr, size3); | |||
| } | |||
| static FLaC__INLINE void *safe_realloc_add_4op_(void *ptr, size_t size1, size_t size2, size_t size3, size_t size4) | |||
| { | |||
| size2 += size1; | |||
| if(size2 < size1) | |||
| return 0; | |||
| size3 += size2; | |||
| if(size3 < size2) | |||
| return 0; | |||
| size4 += size3; | |||
| if(size4 < size3) | |||
| return 0; | |||
| return realloc(ptr, size4); | |||
| } | |||
| static FLaC__INLINE void *safe_realloc_mul_2op_(void *ptr, size_t size1, size_t size2) | |||
| { | |||
| if(!size1 || !size2) | |||
| return realloc(ptr, 0); /* preserve POSIX realloc(ptr, 0) semantics */ | |||
| if(size1 > SIZE_MAX / size2) | |||
| return 0; | |||
| return realloc(ptr, size1*size2); | |||
| } | |||
| /* size1 * (size2 + size3) */ | |||
| static FLaC__INLINE void *safe_realloc_muladd2_(void *ptr, size_t size1, size_t size2, size_t size3) | |||
| { | |||
| if(!size1 || (!size2 && !size3)) | |||
| return realloc(ptr, 0); /* preserve POSIX realloc(ptr, 0) semantics */ | |||
| size2 += size3; | |||
| if(size2 < size3) | |||
| return 0; | |||
| return safe_realloc_mul_2op_(ptr, size1, size2); | |||
| } | |||
| #endif | |||
| @@ -1,45 +1,45 @@ | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2001,2002,2003,2004,2005,2006,2007 Josh Coalson | |||
| * | |||
| * 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__ASSERT_H | |||
| #define FLAC__ASSERT_H | |||
| /* we need this since some compilers (like MSVC) leave assert()s on release code (and we don't want to use their ASSERT) */ | |||
| #ifdef DEBUG | |||
| #include <assert.h> | |||
| #define FLAC__ASSERT(x) assert(x) | |||
| #define FLAC__ASSERT_DECLARATION(x) x | |||
| #else | |||
| #define FLAC__ASSERT(x) | |||
| #define FLAC__ASSERT_DECLARATION(x) | |||
| #endif | |||
| #endif | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2001,2002,2003,2004,2005,2006,2007 Josh Coalson | |||
| * | |||
| * 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__ASSERT_H | |||
| #define FLAC__ASSERT_H | |||
| /* we need this since some compilers (like MSVC) leave assert()s on release code (and we don't want to use their ASSERT) */ | |||
| #ifdef DEBUG | |||
| #include <assert.h> | |||
| #define FLAC__ASSERT(x) assert(x) | |||
| #define FLAC__ASSERT_DECLARATION(x) x | |||
| #else | |||
| #define FLAC__ASSERT(x) | |||
| #define FLAC__ASSERT_DECLARATION(x) | |||
| #endif | |||
| #endif | |||
| @@ -1,184 +1,184 @@ | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2004,2005,2006,2007 Josh Coalson | |||
| * | |||
| * 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__CALLBACK_H | |||
| #define FLAC__CALLBACK_H | |||
| #include "ordinals.h" | |||
| #include <stdlib.h> /* for size_t */ | |||
| /** \file include/FLAC/callback.h | |||
| * | |||
| * \brief | |||
| * This module defines the structures for describing I/O callbacks | |||
| * to the other FLAC interfaces. | |||
| * | |||
| * See the detailed documentation for callbacks in the | |||
| * \link flac_callbacks callbacks \endlink module. | |||
| */ | |||
| /** \defgroup flac_callbacks FLAC/callback.h: I/O callback structures | |||
| * \ingroup flac | |||
| * | |||
| * \brief | |||
| * This module defines the structures for describing I/O callbacks | |||
| * to the other FLAC interfaces. | |||
| * | |||
| * The purpose of the I/O callback functions is to create a common way | |||
| * for the metadata interfaces to handle I/O. | |||
| * | |||
| * Originally the metadata interfaces required filenames as the way of | |||
| * specifying FLAC files to operate on. This is problematic in some | |||
| * environments so there is an additional option to specify a set of | |||
| * callbacks for doing I/O on the FLAC file, instead of the filename. | |||
| * | |||
| * In addition to the callbacks, a FLAC__IOHandle type is defined as an | |||
| * opaque structure for a data source. | |||
| * | |||
| * The callback function prototypes are similar (but not identical) to the | |||
| * stdio functions fread, fwrite, fseek, ftell, feof, and fclose. If you use | |||
| * stdio streams to implement the callbacks, you can pass fread, fwrite, and | |||
| * fclose anywhere a FLAC__IOCallback_Read, FLAC__IOCallback_Write, or | |||
| * FLAC__IOCallback_Close is required, and a FILE* anywhere a FLAC__IOHandle | |||
| * is required. \warning You generally CANNOT directly use fseek or ftell | |||
| * for FLAC__IOCallback_Seek or FLAC__IOCallback_Tell since on most systems | |||
| * these use 32-bit offsets and FLAC requires 64-bit offsets to deal with | |||
| * large files. You will have to find an equivalent function (e.g. ftello), | |||
| * or write a wrapper. The same is true for feof() since this is usually | |||
| * implemented as a macro, not as a function whose address can be taken. | |||
| * | |||
| * \{ | |||
| */ | |||
| #ifdef __cplusplus | |||
| extern "C" { | |||
| #endif | |||
| /** This is the opaque handle type used by the callbacks. Typically | |||
| * this is a \c FILE* or address of a file descriptor. | |||
| */ | |||
| typedef void* FLAC__IOHandle; | |||
| /** Signature for the read callback. | |||
| * The signature and semantics match POSIX fread() implementations | |||
| * and can generally be used interchangeably. | |||
| * | |||
| * \param ptr The address of the read buffer. | |||
| * \param size The size of the records to be read. | |||
| * \param nmemb The number of records to be read. | |||
| * \param handle The handle to the data source. | |||
| * \retval size_t | |||
| * The number of records read. | |||
| */ | |||
| typedef size_t (*FLAC__IOCallback_Read) (void *ptr, size_t size, size_t nmemb, FLAC__IOHandle handle); | |||
| /** Signature for the write callback. | |||
| * The signature and semantics match POSIX fwrite() implementations | |||
| * and can generally be used interchangeably. | |||
| * | |||
| * \param ptr The address of the write buffer. | |||
| * \param size The size of the records to be written. | |||
| * \param nmemb The number of records to be written. | |||
| * \param handle The handle to the data source. | |||
| * \retval size_t | |||
| * The number of records written. | |||
| */ | |||
| typedef size_t (*FLAC__IOCallback_Write) (const void *ptr, size_t size, size_t nmemb, FLAC__IOHandle handle); | |||
| /** Signature for the seek callback. | |||
| * The signature and semantics mostly match POSIX fseek() WITH ONE IMPORTANT | |||
| * EXCEPTION: the offset is a 64-bit type whereas fseek() is generally 'long' | |||
| * and 32-bits wide. | |||
| * | |||
| * \param handle The handle to the data source. | |||
| * \param offset The new position, relative to \a whence | |||
| * \param whence \c SEEK_SET, \c SEEK_CUR, or \c SEEK_END | |||
| * \retval int | |||
| * \c 0 on success, \c -1 on error. | |||
| */ | |||
| typedef int (*FLAC__IOCallback_Seek) (FLAC__IOHandle handle, FLAC__int64 offset, int whence); | |||
| /** Signature for the tell callback. | |||
| * The signature and semantics mostly match POSIX ftell() WITH ONE IMPORTANT | |||
| * EXCEPTION: the offset is a 64-bit type whereas ftell() is generally 'long' | |||
| * and 32-bits wide. | |||
| * | |||
| * \param handle The handle to the data source. | |||
| * \retval FLAC__int64 | |||
| * The current position on success, \c -1 on error. | |||
| */ | |||
| typedef FLAC__int64 (*FLAC__IOCallback_Tell) (FLAC__IOHandle handle); | |||
| /** Signature for the EOF callback. | |||
| * The signature and semantics mostly match POSIX feof() but WATCHOUT: | |||
| * on many systems, feof() is a macro, so in this case a wrapper function | |||
| * must be provided instead. | |||
| * | |||
| * \param handle The handle to the data source. | |||
| * \retval int | |||
| * \c 0 if not at end of file, nonzero if at end of file. | |||
| */ | |||
| typedef int (*FLAC__IOCallback_Eof) (FLAC__IOHandle handle); | |||
| /** Signature for the close callback. | |||
| * The signature and semantics match POSIX fclose() implementations | |||
| * and can generally be used interchangeably. | |||
| * | |||
| * \param handle The handle to the data source. | |||
| * \retval int | |||
| * \c 0 on success, \c EOF on error. | |||
| */ | |||
| typedef int (*FLAC__IOCallback_Close) (FLAC__IOHandle handle); | |||
| /** A structure for holding a set of callbacks. | |||
| * Each FLAC interface that requires a FLAC__IOCallbacks structure will | |||
| * describe which of the callbacks are required. The ones that are not | |||
| * required may be set to NULL. | |||
| * | |||
| * If the seek requirement for an interface is optional, you can signify that | |||
| * a data sorce is not seekable by setting the \a seek field to \c NULL. | |||
| */ | |||
| typedef struct { | |||
| FLAC__IOCallback_Read read; | |||
| FLAC__IOCallback_Write write; | |||
| FLAC__IOCallback_Seek seek; | |||
| FLAC__IOCallback_Tell tell; | |||
| FLAC__IOCallback_Eof eof; | |||
| FLAC__IOCallback_Close close; | |||
| } FLAC__IOCallbacks; | |||
| /* \} */ | |||
| #ifdef __cplusplus | |||
| } | |||
| #endif | |||
| #endif | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2004,2005,2006,2007 Josh Coalson | |||
| * | |||
| * 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__CALLBACK_H | |||
| #define FLAC__CALLBACK_H | |||
| #include "ordinals.h" | |||
| #include <stdlib.h> /* for size_t */ | |||
| /** \file include/FLAC/callback.h | |||
| * | |||
| * \brief | |||
| * This module defines the structures for describing I/O callbacks | |||
| * to the other FLAC interfaces. | |||
| * | |||
| * See the detailed documentation for callbacks in the | |||
| * \link flac_callbacks callbacks \endlink module. | |||
| */ | |||
| /** \defgroup flac_callbacks FLAC/callback.h: I/O callback structures | |||
| * \ingroup flac | |||
| * | |||
| * \brief | |||
| * This module defines the structures for describing I/O callbacks | |||
| * to the other FLAC interfaces. | |||
| * | |||
| * The purpose of the I/O callback functions is to create a common way | |||
| * for the metadata interfaces to handle I/O. | |||
| * | |||
| * Originally the metadata interfaces required filenames as the way of | |||
| * specifying FLAC files to operate on. This is problematic in some | |||
| * environments so there is an additional option to specify a set of | |||
| * callbacks for doing I/O on the FLAC file, instead of the filename. | |||
| * | |||
| * In addition to the callbacks, a FLAC__IOHandle type is defined as an | |||
| * opaque structure for a data source. | |||
| * | |||
| * The callback function prototypes are similar (but not identical) to the | |||
| * stdio functions fread, fwrite, fseek, ftell, feof, and fclose. If you use | |||
| * stdio streams to implement the callbacks, you can pass fread, fwrite, and | |||
| * fclose anywhere a FLAC__IOCallback_Read, FLAC__IOCallback_Write, or | |||
| * FLAC__IOCallback_Close is required, and a FILE* anywhere a FLAC__IOHandle | |||
| * is required. \warning You generally CANNOT directly use fseek or ftell | |||
| * for FLAC__IOCallback_Seek or FLAC__IOCallback_Tell since on most systems | |||
| * these use 32-bit offsets and FLAC requires 64-bit offsets to deal with | |||
| * large files. You will have to find an equivalent function (e.g. ftello), | |||
| * or write a wrapper. The same is true for feof() since this is usually | |||
| * implemented as a macro, not as a function whose address can be taken. | |||
| * | |||
| * \{ | |||
| */ | |||
| #ifdef __cplusplus | |||
| extern "C" { | |||
| #endif | |||
| /** This is the opaque handle type used by the callbacks. Typically | |||
| * this is a \c FILE* or address of a file descriptor. | |||
| */ | |||
| typedef void* FLAC__IOHandle; | |||
| /** Signature for the read callback. | |||
| * The signature and semantics match POSIX fread() implementations | |||
| * and can generally be used interchangeably. | |||
| * | |||
| * \param ptr The address of the read buffer. | |||
| * \param size The size of the records to be read. | |||
| * \param nmemb The number of records to be read. | |||
| * \param handle The handle to the data source. | |||
| * \retval size_t | |||
| * The number of records read. | |||
| */ | |||
| typedef size_t (*FLAC__IOCallback_Read) (void *ptr, size_t size, size_t nmemb, FLAC__IOHandle handle); | |||
| /** Signature for the write callback. | |||
| * The signature and semantics match POSIX fwrite() implementations | |||
| * and can generally be used interchangeably. | |||
| * | |||
| * \param ptr The address of the write buffer. | |||
| * \param size The size of the records to be written. | |||
| * \param nmemb The number of records to be written. | |||
| * \param handle The handle to the data source. | |||
| * \retval size_t | |||
| * The number of records written. | |||
| */ | |||
| typedef size_t (*FLAC__IOCallback_Write) (const void *ptr, size_t size, size_t nmemb, FLAC__IOHandle handle); | |||
| /** Signature for the seek callback. | |||
| * The signature and semantics mostly match POSIX fseek() WITH ONE IMPORTANT | |||
| * EXCEPTION: the offset is a 64-bit type whereas fseek() is generally 'long' | |||
| * and 32-bits wide. | |||
| * | |||
| * \param handle The handle to the data source. | |||
| * \param offset The new position, relative to \a whence | |||
| * \param whence \c SEEK_SET, \c SEEK_CUR, or \c SEEK_END | |||
| * \retval int | |||
| * \c 0 on success, \c -1 on error. | |||
| */ | |||
| typedef int (*FLAC__IOCallback_Seek) (FLAC__IOHandle handle, FLAC__int64 offset, int whence); | |||
| /** Signature for the tell callback. | |||
| * The signature and semantics mostly match POSIX ftell() WITH ONE IMPORTANT | |||
| * EXCEPTION: the offset is a 64-bit type whereas ftell() is generally 'long' | |||
| * and 32-bits wide. | |||
| * | |||
| * \param handle The handle to the data source. | |||
| * \retval FLAC__int64 | |||
| * The current position on success, \c -1 on error. | |||
| */ | |||
| typedef FLAC__int64 (*FLAC__IOCallback_Tell) (FLAC__IOHandle handle); | |||
| /** Signature for the EOF callback. | |||
| * The signature and semantics mostly match POSIX feof() but WATCHOUT: | |||
| * on many systems, feof() is a macro, so in this case a wrapper function | |||
| * must be provided instead. | |||
| * | |||
| * \param handle The handle to the data source. | |||
| * \retval int | |||
| * \c 0 if not at end of file, nonzero if at end of file. | |||
| */ | |||
| typedef int (*FLAC__IOCallback_Eof) (FLAC__IOHandle handle); | |||
| /** Signature for the close callback. | |||
| * The signature and semantics match POSIX fclose() implementations | |||
| * and can generally be used interchangeably. | |||
| * | |||
| * \param handle The handle to the data source. | |||
| * \retval int | |||
| * \c 0 on success, \c EOF on error. | |||
| */ | |||
| typedef int (*FLAC__IOCallback_Close) (FLAC__IOHandle handle); | |||
| /** A structure for holding a set of callbacks. | |||
| * Each FLAC interface that requires a FLAC__IOCallbacks structure will | |||
| * describe which of the callbacks are required. The ones that are not | |||
| * required may be set to NULL. | |||
| * | |||
| * If the seek requirement for an interface is optional, you can signify that | |||
| * a data sorce is not seekable by setting the \a seek field to \c NULL. | |||
| */ | |||
| typedef struct { | |||
| FLAC__IOCallback_Read read; | |||
| FLAC__IOCallback_Write write; | |||
| FLAC__IOCallback_Seek seek; | |||
| FLAC__IOCallback_Tell tell; | |||
| FLAC__IOCallback_Eof eof; | |||
| FLAC__IOCallback_Close close; | |||
| } FLAC__IOCallbacks; | |||
| /* \} */ | |||
| #ifdef __cplusplus | |||
| } | |||
| #endif | |||
| #endif | |||
| @@ -1,91 +1,91 @@ | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 Josh Coalson | |||
| * | |||
| * 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__EXPORT_H | |||
| #define FLAC__EXPORT_H | |||
| /** \file include/FLAC/export.h | |||
| * | |||
| * \brief | |||
| * This module contains #defines and symbols for exporting function | |||
| * calls, and providing version information and compiled-in features. | |||
| * | |||
| * See the \link flac_export export \endlink module. | |||
| */ | |||
| /** \defgroup flac_export FLAC/export.h: export symbols | |||
| * \ingroup flac | |||
| * | |||
| * \brief | |||
| * This module contains #defines and symbols for exporting function | |||
| * calls, and providing version information and compiled-in features. | |||
| * | |||
| * If you are compiling with MSVC and will link to the static library | |||
| * (libFLAC.lib) you should define FLAC__NO_DLL in your project to | |||
| * make sure the symbols are exported properly. | |||
| * | |||
| * \{ | |||
| */ | |||
| #if defined(FLAC__NO_DLL) || !defined(_MSC_VER) | |||
| #define FLAC_API | |||
| #else | |||
| #ifdef FLAC_API_EXPORTS | |||
| #define FLAC_API _declspec(dllexport) | |||
| #else | |||
| #define FLAC_API _declspec(dllimport) | |||
| #endif | |||
| #endif | |||
| /** These #defines will mirror the libtool-based library version number, see | |||
| * http://www.gnu.org/software/libtool/manual.html#Libtool-versioning | |||
| */ | |||
| #define FLAC_API_VERSION_CURRENT 10 | |||
| #define FLAC_API_VERSION_REVISION 0 /**< see above */ | |||
| #define FLAC_API_VERSION_AGE 2 /**< see above */ | |||
| #ifdef __cplusplus | |||
| extern "C" { | |||
| #endif | |||
| /** \c 1 if the library has been compiled with support for Ogg FLAC, else \c 0. */ | |||
| extern FLAC_API int FLAC_API_SUPPORTS_OGG_FLAC; | |||
| #ifdef __cplusplus | |||
| } | |||
| #endif | |||
| /* \} */ | |||
| #endif | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 Josh Coalson | |||
| * | |||
| * 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__EXPORT_H | |||
| #define FLAC__EXPORT_H | |||
| /** \file include/FLAC/export.h | |||
| * | |||
| * \brief | |||
| * This module contains #defines and symbols for exporting function | |||
| * calls, and providing version information and compiled-in features. | |||
| * | |||
| * See the \link flac_export export \endlink module. | |||
| */ | |||
| /** \defgroup flac_export FLAC/export.h: export symbols | |||
| * \ingroup flac | |||
| * | |||
| * \brief | |||
| * This module contains #defines and symbols for exporting function | |||
| * calls, and providing version information and compiled-in features. | |||
| * | |||
| * If you are compiling with MSVC and will link to the static library | |||
| * (libFLAC.lib) you should define FLAC__NO_DLL in your project to | |||
| * make sure the symbols are exported properly. | |||
| * | |||
| * \{ | |||
| */ | |||
| #if defined(FLAC__NO_DLL) || !defined(_MSC_VER) | |||
| #define FLAC_API | |||
| #else | |||
| #ifdef FLAC_API_EXPORTS | |||
| #define FLAC_API _declspec(dllexport) | |||
| #else | |||
| #define FLAC_API _declspec(dllimport) | |||
| #endif | |||
| #endif | |||
| /** These #defines will mirror the libtool-based library version number, see | |||
| * http://www.gnu.org/software/libtool/manual.html#Libtool-versioning | |||
| */ | |||
| #define FLAC_API_VERSION_CURRENT 10 | |||
| #define FLAC_API_VERSION_REVISION 0 /**< see above */ | |||
| #define FLAC_API_VERSION_AGE 2 /**< see above */ | |||
| #ifdef __cplusplus | |||
| extern "C" { | |||
| #endif | |||
| /** \c 1 if the library has been compiled with support for Ogg FLAC, else \c 0. */ | |||
| extern FLAC_API int FLAC_API_SUPPORTS_OGG_FLAC; | |||
| #ifdef __cplusplus | |||
| } | |||
| #endif | |||
| /* \} */ | |||
| #endif | |||
| @@ -1,155 +1,155 @@ | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2001,2002,2003,2004,2005,2006,2007 Josh Coalson | |||
| * | |||
| * 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. | |||
| */ | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2001,2002,2003,2004,2005,2006,2007 Josh Coalson | |||
| * | |||
| * 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. | |||
| */ | |||
| #include "juce_FlacHeader.h" | |||
| #if JUCE_USE_FLAC | |||
| #if HAVE_CONFIG_H | |||
| # include <config.h> | |||
| #endif | |||
| #include "include/private/bitmath.h" | |||
| #include "../assert.h" | |||
| /* An example of what FLAC__bitmath_ilog2() computes: | |||
| * | |||
| * ilog2( 0) = assertion failure | |||
| * ilog2( 1) = 0 | |||
| * ilog2( 2) = 1 | |||
| * ilog2( 3) = 1 | |||
| * ilog2( 4) = 2 | |||
| * ilog2( 5) = 2 | |||
| * ilog2( 6) = 2 | |||
| * ilog2( 7) = 2 | |||
| * ilog2( 8) = 3 | |||
| * ilog2( 9) = 3 | |||
| * ilog2(10) = 3 | |||
| * ilog2(11) = 3 | |||
| * ilog2(12) = 3 | |||
| * ilog2(13) = 3 | |||
| * ilog2(14) = 3 | |||
| * ilog2(15) = 3 | |||
| * ilog2(16) = 4 | |||
| * ilog2(17) = 4 | |||
| * ilog2(18) = 4 | |||
| */ | |||
| unsigned FLAC__bitmath_ilog2(FLAC__uint32 v) | |||
| { | |||
| unsigned l = 0; | |||
| FLAC__ASSERT(v > 0); | |||
| while(v >>= 1) | |||
| l++; | |||
| return l; | |||
| } | |||
| unsigned FLAC__bitmath_ilog2_wide(FLAC__uint64 v) | |||
| { | |||
| unsigned l = 0; | |||
| FLAC__ASSERT(v > 0); | |||
| while(v >>= 1) | |||
| l++; | |||
| return l; | |||
| } | |||
| /* An example of what FLAC__bitmath_silog2() computes: | |||
| * | |||
| * silog2(-10) = 5 | |||
| * silog2(- 9) = 5 | |||
| * silog2(- 8) = 4 | |||
| * silog2(- 7) = 4 | |||
| * silog2(- 6) = 4 | |||
| * silog2(- 5) = 4 | |||
| * silog2(- 4) = 3 | |||
| * silog2(- 3) = 3 | |||
| * silog2(- 2) = 2 | |||
| * silog2(- 1) = 2 | |||
| * silog2( 0) = 0 | |||
| * silog2( 1) = 2 | |||
| * silog2( 2) = 3 | |||
| * silog2( 3) = 3 | |||
| * silog2( 4) = 4 | |||
| * silog2( 5) = 4 | |||
| * silog2( 6) = 4 | |||
| * silog2( 7) = 4 | |||
| * silog2( 8) = 5 | |||
| * silog2( 9) = 5 | |||
| * silog2( 10) = 5 | |||
| */ | |||
| unsigned FLAC__bitmath_silog2(int v) | |||
| { | |||
| while(1) { | |||
| if(v == 0) { | |||
| return 0; | |||
| } | |||
| else if(v > 0) { | |||
| unsigned l = 0; | |||
| while(v) { | |||
| l++; | |||
| v >>= 1; | |||
| } | |||
| return l+1; | |||
| } | |||
| else if(v == -1) { | |||
| return 2; | |||
| } | |||
| else { | |||
| v++; | |||
| v = -v; | |||
| } | |||
| } | |||
| } | |||
| unsigned FLAC__bitmath_silog2_wide(FLAC__int64 v) | |||
| { | |||
| while(1) { | |||
| if(v == 0) { | |||
| return 0; | |||
| } | |||
| else if(v > 0) { | |||
| unsigned l = 0; | |||
| while(v) { | |||
| l++; | |||
| v >>= 1; | |||
| } | |||
| return l+1; | |||
| } | |||
| else if(v == -1) { | |||
| return 2; | |||
| } | |||
| else { | |||
| v++; | |||
| v = -v; | |||
| } | |||
| } | |||
| } | |||
| #endif | |||
| #if HAVE_CONFIG_H | |||
| # include <config.h> | |||
| #endif | |||
| #include "include/private/bitmath.h" | |||
| #include "../assert.h" | |||
| /* An example of what FLAC__bitmath_ilog2() computes: | |||
| * | |||
| * ilog2( 0) = assertion failure | |||
| * ilog2( 1) = 0 | |||
| * ilog2( 2) = 1 | |||
| * ilog2( 3) = 1 | |||
| * ilog2( 4) = 2 | |||
| * ilog2( 5) = 2 | |||
| * ilog2( 6) = 2 | |||
| * ilog2( 7) = 2 | |||
| * ilog2( 8) = 3 | |||
| * ilog2( 9) = 3 | |||
| * ilog2(10) = 3 | |||
| * ilog2(11) = 3 | |||
| * ilog2(12) = 3 | |||
| * ilog2(13) = 3 | |||
| * ilog2(14) = 3 | |||
| * ilog2(15) = 3 | |||
| * ilog2(16) = 4 | |||
| * ilog2(17) = 4 | |||
| * ilog2(18) = 4 | |||
| */ | |||
| unsigned FLAC__bitmath_ilog2(FLAC__uint32 v) | |||
| { | |||
| unsigned l = 0; | |||
| FLAC__ASSERT(v > 0); | |||
| while(v >>= 1) | |||
| l++; | |||
| return l; | |||
| } | |||
| unsigned FLAC__bitmath_ilog2_wide(FLAC__uint64 v) | |||
| { | |||
| unsigned l = 0; | |||
| FLAC__ASSERT(v > 0); | |||
| while(v >>= 1) | |||
| l++; | |||
| return l; | |||
| } | |||
| /* An example of what FLAC__bitmath_silog2() computes: | |||
| * | |||
| * silog2(-10) = 5 | |||
| * silog2(- 9) = 5 | |||
| * silog2(- 8) = 4 | |||
| * silog2(- 7) = 4 | |||
| * silog2(- 6) = 4 | |||
| * silog2(- 5) = 4 | |||
| * silog2(- 4) = 3 | |||
| * silog2(- 3) = 3 | |||
| * silog2(- 2) = 2 | |||
| * silog2(- 1) = 2 | |||
| * silog2( 0) = 0 | |||
| * silog2( 1) = 2 | |||
| * silog2( 2) = 3 | |||
| * silog2( 3) = 3 | |||
| * silog2( 4) = 4 | |||
| * silog2( 5) = 4 | |||
| * silog2( 6) = 4 | |||
| * silog2( 7) = 4 | |||
| * silog2( 8) = 5 | |||
| * silog2( 9) = 5 | |||
| * silog2( 10) = 5 | |||
| */ | |||
| unsigned FLAC__bitmath_silog2(int v) | |||
| { | |||
| while(1) { | |||
| if(v == 0) { | |||
| return 0; | |||
| } | |||
| else if(v > 0) { | |||
| unsigned l = 0; | |||
| while(v) { | |||
| l++; | |||
| v >>= 1; | |||
| } | |||
| return l+1; | |||
| } | |||
| else if(v == -1) { | |||
| return 2; | |||
| } | |||
| else { | |||
| v++; | |||
| v = -v; | |||
| } | |||
| } | |||
| } | |||
| unsigned FLAC__bitmath_silog2_wide(FLAC__int64 v) | |||
| { | |||
| while(1) { | |||
| if(v == 0) { | |||
| return 0; | |||
| } | |||
| else if(v > 0) { | |||
| unsigned l = 0; | |||
| while(v) { | |||
| l++; | |||
| v >>= 1; | |||
| } | |||
| return l+1; | |||
| } | |||
| else if(v == -1) { | |||
| return 2; | |||
| } | |||
| else { | |||
| v++; | |||
| v = -v; | |||
| } | |||
| } | |||
| } | |||
| #endif | |||
| @@ -1,423 +1,423 @@ | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2001,2002,2003,2004,2005,2006,2007 Josh Coalson | |||
| * | |||
| * 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. | |||
| */ | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2001,2002,2003,2004,2005,2006,2007 Josh Coalson | |||
| * | |||
| * 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. | |||
| */ | |||
| #include "juce_FlacHeader.h" | |||
| #if JUCE_USE_FLAC | |||
| #if HAVE_CONFIG_H | |||
| # include <config.h> | |||
| #endif | |||
| #include "include/private/cpu.h" | |||
| #include <stdlib.h> | |||
| #include <stdio.h> | |||
| #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) | |||
| { | |||
| if (!canjump) { | |||
| signal (sig, SIG_DFL); | |||
| raise (sig); | |||
| } | |||
| canjump = 0; | |||
| siglongjmp (jmpbuf, 1); | |||
| } | |||
| # endif /* FLAC__SYS_DARWIN */ | |||
| # endif /* FLAC__NO_ASM */ | |||
| #endif /* FLAC__CPU_PPC */ | |||
| #if defined (__NetBSD__) || defined(__OpenBSD__) | |||
| #include <sys/param.h> | |||
| #include <sys/sysctl.h> | |||
| #include <machine/cpu.h> | |||
| #endif | |||
| #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__) | |||
| #include <sys/types.h> | |||
| #include <sys/sysctl.h> | |||
| #endif | |||
| #if defined(__APPLE__) | |||
| /* how to get sysctlbyname()? */ | |||
| #endif | |||
| /* 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; | |||
| /* 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; | |||
| /* | |||
| * 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(__linux__) | |||
| /* | |||
| * If the OS doesn't support SSE, we will get here with a SIGILL. We | |||
| * modify the return address to jump over the offending SSE instruction | |||
| * and also the operation following it that indicates the instruction | |||
| * executed successfully. In this way we use no global variables and | |||
| * stay thread-safe. | |||
| * | |||
| * 3 + 3 + 6: | |||
| * 3 bytes for "xorps xmm0,xmm0" | |||
| * 3 bytes for estimate of how long the follwing "inc var" instruction is | |||
| * 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> | |||
| # undef USE_TRY_CATCH_FLAVOR /* #define this to use the try/catch method for catching illegal opcode exception */ | |||
| # 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 | |||
| void FLAC__cpu_info(FLAC__CPUInfo *info) | |||
| { | |||
| /* | |||
| * IA32-specific | |||
| */ | |||
| #ifdef FLAC__CPU_IA32 | |||
| info->type = FLAC__CPUINFO_TYPE_IA32; | |||
| #if !defined FLAC__NO_ASM && defined FLAC__HAS_NASM | |||
| 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; | |||
| #else | |||
| info->data.ia32._3dnow = info->data.ia32.ext3dnow = info->data.ia32.extmmx = 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'); | |||
| #endif | |||
| /* | |||
| * now have to check for OS support of SSE/SSE2 | |||
| */ | |||
| if(info->data.ia32.fxsr || info->data.ia32.sse || info->data.ia32.sse2) { | |||
| #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; | |||
| #elif defined FLAC__SSE_OS | |||
| /* 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; | |||
| #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; | |||
| } | |||
| # else | |||
| info->data.ia32.fxsr = info->data.ia32.sse = info->data.ia32.sse2 = info->data.ia32.sse3 = info->data.ia32.ssse3 = false; | |||
| # 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); | |||
| } | |||
| if(!sse) | |||
| info->data.ia32.fxsr = info->data.ia32.sse = info->data.ia32.sse2 = info->data.ia32.sse3 = info->data.ia32.ssse3 = false; | |||
| #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 */ | |||
| __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 | |||
| #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; | |||
| #endif | |||
| #ifdef DEBUG | |||
| fprintf(stderr, " SSE OS sup . %c\n", info->data.ia32.sse ? 'Y' : 'n'); | |||
| #endif | |||
| } | |||
| } | |||
| #else | |||
| info->use_asm = false; | |||
| #endif | |||
| /* | |||
| * PPC-specific | |||
| */ | |||
| #elif defined FLAC__CPU_PPC | |||
| info->type = FLAC__CPUINFO_TYPE_PPC; | |||
| # if !defined FLAC__NO_ASM | |||
| 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); | |||
| } | |||
| { | |||
| 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); | |||
| info->data.ppc.ppc64 = (hostInfo.cpu_type == CPU_TYPE_POWERPC) && (hostInfo.cpu_subtype == CPU_SUBTYPE_POWERPC_970); | |||
| } | |||
| # 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; | |||
| signal (SIGILL, sigill_handler); | |||
| canjump = 0; | |||
| if (!sigsetjmp (jmpbuf, 1)) { | |||
| canjump = 1; | |||
| asm volatile ( | |||
| "mtspr 256, %0\n\t" | |||
| "vand %%v0, %%v0, %%v0" | |||
| : | |||
| : "r" (-1) | |||
| ); | |||
| 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) ); | |||
| info->data.ppc.ppc64 = 1; | |||
| } | |||
| signal (SIGILL, SIG_DFL); /*@@@@@@ should save and restore old signal */ | |||
| } | |||
| # endif | |||
| # else /* !FLAC__USE_ALTIVEC */ | |||
| info->data.ppc.altivec = 0; | |||
| info->data.ppc.ppc64 = 0; | |||
| # endif | |||
| # else | |||
| info->use_asm = false; | |||
| # endif | |||
| /* | |||
| * unknown CPI | |||
| */ | |||
| #else | |||
| info->type = FLAC__CPUINFO_TYPE_UNKNOWN; | |||
| info->use_asm = false; | |||
| #endif | |||
| } | |||
| #endif | |||
| #if HAVE_CONFIG_H | |||
| # include <config.h> | |||
| #endif | |||
| #include "include/private/cpu.h" | |||
| #include <stdlib.h> | |||
| #include <stdio.h> | |||
| #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) | |||
| { | |||
| if (!canjump) { | |||
| signal (sig, SIG_DFL); | |||
| raise (sig); | |||
| } | |||
| canjump = 0; | |||
| siglongjmp (jmpbuf, 1); | |||
| } | |||
| # endif /* FLAC__SYS_DARWIN */ | |||
| # endif /* FLAC__NO_ASM */ | |||
| #endif /* FLAC__CPU_PPC */ | |||
| #if defined (__NetBSD__) || defined(__OpenBSD__) | |||
| #include <sys/param.h> | |||
| #include <sys/sysctl.h> | |||
| #include <machine/cpu.h> | |||
| #endif | |||
| #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__) | |||
| #include <sys/types.h> | |||
| #include <sys/sysctl.h> | |||
| #endif | |||
| #if defined(__APPLE__) | |||
| /* how to get sysctlbyname()? */ | |||
| #endif | |||
| /* 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; | |||
| /* 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; | |||
| /* | |||
| * 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(__linux__) | |||
| /* | |||
| * If the OS doesn't support SSE, we will get here with a SIGILL. We | |||
| * modify the return address to jump over the offending SSE instruction | |||
| * and also the operation following it that indicates the instruction | |||
| * executed successfully. In this way we use no global variables and | |||
| * stay thread-safe. | |||
| * | |||
| * 3 + 3 + 6: | |||
| * 3 bytes for "xorps xmm0,xmm0" | |||
| * 3 bytes for estimate of how long the follwing "inc var" instruction is | |||
| * 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> | |||
| # undef USE_TRY_CATCH_FLAVOR /* #define this to use the try/catch method for catching illegal opcode exception */ | |||
| # 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 | |||
| void FLAC__cpu_info(FLAC__CPUInfo *info) | |||
| { | |||
| /* | |||
| * IA32-specific | |||
| */ | |||
| #ifdef FLAC__CPU_IA32 | |||
| info->type = FLAC__CPUINFO_TYPE_IA32; | |||
| #if !defined FLAC__NO_ASM && defined FLAC__HAS_NASM | |||
| 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; | |||
| #else | |||
| info->data.ia32._3dnow = info->data.ia32.ext3dnow = info->data.ia32.extmmx = 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'); | |||
| #endif | |||
| /* | |||
| * now have to check for OS support of SSE/SSE2 | |||
| */ | |||
| if(info->data.ia32.fxsr || info->data.ia32.sse || info->data.ia32.sse2) { | |||
| #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; | |||
| #elif defined FLAC__SSE_OS | |||
| /* 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; | |||
| #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; | |||
| } | |||
| # else | |||
| info->data.ia32.fxsr = info->data.ia32.sse = info->data.ia32.sse2 = info->data.ia32.sse3 = info->data.ia32.ssse3 = false; | |||
| # 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); | |||
| } | |||
| if(!sse) | |||
| info->data.ia32.fxsr = info->data.ia32.sse = info->data.ia32.sse2 = info->data.ia32.sse3 = info->data.ia32.ssse3 = false; | |||
| #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 */ | |||
| __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 | |||
| #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; | |||
| #endif | |||
| #ifdef DEBUG | |||
| fprintf(stderr, " SSE OS sup . %c\n", info->data.ia32.sse ? 'Y' : 'n'); | |||
| #endif | |||
| } | |||
| } | |||
| #else | |||
| info->use_asm = false; | |||
| #endif | |||
| /* | |||
| * PPC-specific | |||
| */ | |||
| #elif defined FLAC__CPU_PPC | |||
| info->type = FLAC__CPUINFO_TYPE_PPC; | |||
| # if !defined FLAC__NO_ASM | |||
| 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); | |||
| } | |||
| { | |||
| 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); | |||
| info->data.ppc.ppc64 = (hostInfo.cpu_type == CPU_TYPE_POWERPC) && (hostInfo.cpu_subtype == CPU_SUBTYPE_POWERPC_970); | |||
| } | |||
| # 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; | |||
| signal (SIGILL, sigill_handler); | |||
| canjump = 0; | |||
| if (!sigsetjmp (jmpbuf, 1)) { | |||
| canjump = 1; | |||
| asm volatile ( | |||
| "mtspr 256, %0\n\t" | |||
| "vand %%v0, %%v0, %%v0" | |||
| : | |||
| : "r" (-1) | |||
| ); | |||
| 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) ); | |||
| info->data.ppc.ppc64 = 1; | |||
| } | |||
| signal (SIGILL, SIG_DFL); /*@@@@@@ should save and restore old signal */ | |||
| } | |||
| # endif | |||
| # else /* !FLAC__USE_ALTIVEC */ | |||
| info->data.ppc.altivec = 0; | |||
| info->data.ppc.ppc64 = 0; | |||
| # endif | |||
| # else | |||
| info->use_asm = false; | |||
| # endif | |||
| /* | |||
| * unknown CPI | |||
| */ | |||
| #else | |||
| info->type = FLAC__CPUINFO_TYPE_UNKNOWN; | |||
| info->use_asm = false; | |||
| #endif | |||
| } | |||
| #endif | |||
| @@ -1,148 +1,148 @@ | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 Josh Coalson | |||
| * | |||
| * 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. | |||
| */ | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 Josh Coalson | |||
| * | |||
| * 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. | |||
| */ | |||
| #include "juce_FlacHeader.h" | |||
| #if JUCE_USE_FLAC | |||
| #if HAVE_CONFIG_H | |||
| # include <config.h> | |||
| #endif | |||
| #include "include/private/crc.h" | |||
| /* CRC-8, poly = x^8 + x^2 + x^1 + x^0, init = 0 */ | |||
| FLAC__byte const FLAC__crc8_table[256] = { | |||
| 0x00, 0x07, 0x0E, 0x09, 0x1C, 0x1B, 0x12, 0x15, | |||
| 0x38, 0x3F, 0x36, 0x31, 0x24, 0x23, 0x2A, 0x2D, | |||
| 0x70, 0x77, 0x7E, 0x79, 0x6C, 0x6B, 0x62, 0x65, | |||
| 0x48, 0x4F, 0x46, 0x41, 0x54, 0x53, 0x5A, 0x5D, | |||
| 0xE0, 0xE7, 0xEE, 0xE9, 0xFC, 0xFB, 0xF2, 0xF5, | |||
| 0xD8, 0xDF, 0xD6, 0xD1, 0xC4, 0xC3, 0xCA, 0xCD, | |||
| 0x90, 0x97, 0x9E, 0x99, 0x8C, 0x8B, 0x82, 0x85, | |||
| 0xA8, 0xAF, 0xA6, 0xA1, 0xB4, 0xB3, 0xBA, 0xBD, | |||
| 0xC7, 0xC0, 0xC9, 0xCE, 0xDB, 0xDC, 0xD5, 0xD2, | |||
| 0xFF, 0xF8, 0xF1, 0xF6, 0xE3, 0xE4, 0xED, 0xEA, | |||
| 0xB7, 0xB0, 0xB9, 0xBE, 0xAB, 0xAC, 0xA5, 0xA2, | |||
| 0x8F, 0x88, 0x81, 0x86, 0x93, 0x94, 0x9D, 0x9A, | |||
| 0x27, 0x20, 0x29, 0x2E, 0x3B, 0x3C, 0x35, 0x32, | |||
| 0x1F, 0x18, 0x11, 0x16, 0x03, 0x04, 0x0D, 0x0A, | |||
| 0x57, 0x50, 0x59, 0x5E, 0x4B, 0x4C, 0x45, 0x42, | |||
| 0x6F, 0x68, 0x61, 0x66, 0x73, 0x74, 0x7D, 0x7A, | |||
| 0x89, 0x8E, 0x87, 0x80, 0x95, 0x92, 0x9B, 0x9C, | |||
| 0xB1, 0xB6, 0xBF, 0xB8, 0xAD, 0xAA, 0xA3, 0xA4, | |||
| 0xF9, 0xFE, 0xF7, 0xF0, 0xE5, 0xE2, 0xEB, 0xEC, | |||
| 0xC1, 0xC6, 0xCF, 0xC8, 0xDD, 0xDA, 0xD3, 0xD4, | |||
| 0x69, 0x6E, 0x67, 0x60, 0x75, 0x72, 0x7B, 0x7C, | |||
| 0x51, 0x56, 0x5F, 0x58, 0x4D, 0x4A, 0x43, 0x44, | |||
| 0x19, 0x1E, 0x17, 0x10, 0x05, 0x02, 0x0B, 0x0C, | |||
| 0x21, 0x26, 0x2F, 0x28, 0x3D, 0x3A, 0x33, 0x34, | |||
| 0x4E, 0x49, 0x40, 0x47, 0x52, 0x55, 0x5C, 0x5B, | |||
| 0x76, 0x71, 0x78, 0x7F, 0x6A, 0x6D, 0x64, 0x63, | |||
| 0x3E, 0x39, 0x30, 0x37, 0x22, 0x25, 0x2C, 0x2B, | |||
| 0x06, 0x01, 0x08, 0x0F, 0x1A, 0x1D, 0x14, 0x13, | |||
| 0xAE, 0xA9, 0xA0, 0xA7, 0xB2, 0xB5, 0xBC, 0xBB, | |||
| 0x96, 0x91, 0x98, 0x9F, 0x8A, 0x8D, 0x84, 0x83, | |||
| 0xDE, 0xD9, 0xD0, 0xD7, 0xC2, 0xC5, 0xCC, 0xCB, | |||
| 0xE6, 0xE1, 0xE8, 0xEF, 0xFA, 0xFD, 0xF4, 0xF3 | |||
| }; | |||
| /* CRC-16, poly = x^16 + x^15 + x^2 + x^0, init = 0 */ | |||
| unsigned FLAC__crc16_table[256] = { | |||
| 0x0000, 0x8005, 0x800f, 0x000a, 0x801b, 0x001e, 0x0014, 0x8011, | |||
| 0x8033, 0x0036, 0x003c, 0x8039, 0x0028, 0x802d, 0x8027, 0x0022, | |||
| 0x8063, 0x0066, 0x006c, 0x8069, 0x0078, 0x807d, 0x8077, 0x0072, | |||
| 0x0050, 0x8055, 0x805f, 0x005a, 0x804b, 0x004e, 0x0044, 0x8041, | |||
| 0x80c3, 0x00c6, 0x00cc, 0x80c9, 0x00d8, 0x80dd, 0x80d7, 0x00d2, | |||
| 0x00f0, 0x80f5, 0x80ff, 0x00fa, 0x80eb, 0x00ee, 0x00e4, 0x80e1, | |||
| 0x00a0, 0x80a5, 0x80af, 0x00aa, 0x80bb, 0x00be, 0x00b4, 0x80b1, | |||
| 0x8093, 0x0096, 0x009c, 0x8099, 0x0088, 0x808d, 0x8087, 0x0082, | |||
| 0x8183, 0x0186, 0x018c, 0x8189, 0x0198, 0x819d, 0x8197, 0x0192, | |||
| 0x01b0, 0x81b5, 0x81bf, 0x01ba, 0x81ab, 0x01ae, 0x01a4, 0x81a1, | |||
| 0x01e0, 0x81e5, 0x81ef, 0x01ea, 0x81fb, 0x01fe, 0x01f4, 0x81f1, | |||
| 0x81d3, 0x01d6, 0x01dc, 0x81d9, 0x01c8, 0x81cd, 0x81c7, 0x01c2, | |||
| 0x0140, 0x8145, 0x814f, 0x014a, 0x815b, 0x015e, 0x0154, 0x8151, | |||
| 0x8173, 0x0176, 0x017c, 0x8179, 0x0168, 0x816d, 0x8167, 0x0162, | |||
| 0x8123, 0x0126, 0x012c, 0x8129, 0x0138, 0x813d, 0x8137, 0x0132, | |||
| 0x0110, 0x8115, 0x811f, 0x011a, 0x810b, 0x010e, 0x0104, 0x8101, | |||
| 0x8303, 0x0306, 0x030c, 0x8309, 0x0318, 0x831d, 0x8317, 0x0312, | |||
| 0x0330, 0x8335, 0x833f, 0x033a, 0x832b, 0x032e, 0x0324, 0x8321, | |||
| 0x0360, 0x8365, 0x836f, 0x036a, 0x837b, 0x037e, 0x0374, 0x8371, | |||
| 0x8353, 0x0356, 0x035c, 0x8359, 0x0348, 0x834d, 0x8347, 0x0342, | |||
| 0x03c0, 0x83c5, 0x83cf, 0x03ca, 0x83db, 0x03de, 0x03d4, 0x83d1, | |||
| 0x83f3, 0x03f6, 0x03fc, 0x83f9, 0x03e8, 0x83ed, 0x83e7, 0x03e2, | |||
| 0x83a3, 0x03a6, 0x03ac, 0x83a9, 0x03b8, 0x83bd, 0x83b7, 0x03b2, | |||
| 0x0390, 0x8395, 0x839f, 0x039a, 0x838b, 0x038e, 0x0384, 0x8381, | |||
| 0x0280, 0x8285, 0x828f, 0x028a, 0x829b, 0x029e, 0x0294, 0x8291, | |||
| 0x82b3, 0x02b6, 0x02bc, 0x82b9, 0x02a8, 0x82ad, 0x82a7, 0x02a2, | |||
| 0x82e3, 0x02e6, 0x02ec, 0x82e9, 0x02f8, 0x82fd, 0x82f7, 0x02f2, | |||
| 0x02d0, 0x82d5, 0x82df, 0x02da, 0x82cb, 0x02ce, 0x02c4, 0x82c1, | |||
| 0x8243, 0x0246, 0x024c, 0x8249, 0x0258, 0x825d, 0x8257, 0x0252, | |||
| 0x0270, 0x8275, 0x827f, 0x027a, 0x826b, 0x026e, 0x0264, 0x8261, | |||
| 0x0220, 0x8225, 0x822f, 0x022a, 0x823b, 0x023e, 0x0234, 0x8231, | |||
| 0x8213, 0x0216, 0x021c, 0x8219, 0x0208, 0x820d, 0x8207, 0x0202 | |||
| }; | |||
| void FLAC__crc8_update(const FLAC__byte data, FLAC__uint8 *crc) | |||
| { | |||
| *crc = FLAC__crc8_table[*crc ^ data]; | |||
| } | |||
| void FLAC__crc8_update_block(const FLAC__byte *data, unsigned len, FLAC__uint8 *crc) | |||
| { | |||
| while(len--) | |||
| *crc = FLAC__crc8_table[*crc ^ *data++]; | |||
| } | |||
| FLAC__uint8 FLAC__crc8(const FLAC__byte *data, unsigned len) | |||
| { | |||
| FLAC__uint8 crc = 0; | |||
| while(len--) | |||
| crc = FLAC__crc8_table[crc ^ *data++]; | |||
| return crc; | |||
| } | |||
| unsigned FLAC__crc16(const FLAC__byte *data, unsigned len) | |||
| { | |||
| unsigned crc = 0; | |||
| while(len--) | |||
| crc = ((crc<<8) ^ FLAC__crc16_table[(crc>>8) ^ *data++]) & 0xffff; | |||
| return crc; | |||
| } | |||
| #endif | |||
| #if HAVE_CONFIG_H | |||
| # include <config.h> | |||
| #endif | |||
| #include "include/private/crc.h" | |||
| /* CRC-8, poly = x^8 + x^2 + x^1 + x^0, init = 0 */ | |||
| FLAC__byte const FLAC__crc8_table[256] = { | |||
| 0x00, 0x07, 0x0E, 0x09, 0x1C, 0x1B, 0x12, 0x15, | |||
| 0x38, 0x3F, 0x36, 0x31, 0x24, 0x23, 0x2A, 0x2D, | |||
| 0x70, 0x77, 0x7E, 0x79, 0x6C, 0x6B, 0x62, 0x65, | |||
| 0x48, 0x4F, 0x46, 0x41, 0x54, 0x53, 0x5A, 0x5D, | |||
| 0xE0, 0xE7, 0xEE, 0xE9, 0xFC, 0xFB, 0xF2, 0xF5, | |||
| 0xD8, 0xDF, 0xD6, 0xD1, 0xC4, 0xC3, 0xCA, 0xCD, | |||
| 0x90, 0x97, 0x9E, 0x99, 0x8C, 0x8B, 0x82, 0x85, | |||
| 0xA8, 0xAF, 0xA6, 0xA1, 0xB4, 0xB3, 0xBA, 0xBD, | |||
| 0xC7, 0xC0, 0xC9, 0xCE, 0xDB, 0xDC, 0xD5, 0xD2, | |||
| 0xFF, 0xF8, 0xF1, 0xF6, 0xE3, 0xE4, 0xED, 0xEA, | |||
| 0xB7, 0xB0, 0xB9, 0xBE, 0xAB, 0xAC, 0xA5, 0xA2, | |||
| 0x8F, 0x88, 0x81, 0x86, 0x93, 0x94, 0x9D, 0x9A, | |||
| 0x27, 0x20, 0x29, 0x2E, 0x3B, 0x3C, 0x35, 0x32, | |||
| 0x1F, 0x18, 0x11, 0x16, 0x03, 0x04, 0x0D, 0x0A, | |||
| 0x57, 0x50, 0x59, 0x5E, 0x4B, 0x4C, 0x45, 0x42, | |||
| 0x6F, 0x68, 0x61, 0x66, 0x73, 0x74, 0x7D, 0x7A, | |||
| 0x89, 0x8E, 0x87, 0x80, 0x95, 0x92, 0x9B, 0x9C, | |||
| 0xB1, 0xB6, 0xBF, 0xB8, 0xAD, 0xAA, 0xA3, 0xA4, | |||
| 0xF9, 0xFE, 0xF7, 0xF0, 0xE5, 0xE2, 0xEB, 0xEC, | |||
| 0xC1, 0xC6, 0xCF, 0xC8, 0xDD, 0xDA, 0xD3, 0xD4, | |||
| 0x69, 0x6E, 0x67, 0x60, 0x75, 0x72, 0x7B, 0x7C, | |||
| 0x51, 0x56, 0x5F, 0x58, 0x4D, 0x4A, 0x43, 0x44, | |||
| 0x19, 0x1E, 0x17, 0x10, 0x05, 0x02, 0x0B, 0x0C, | |||
| 0x21, 0x26, 0x2F, 0x28, 0x3D, 0x3A, 0x33, 0x34, | |||
| 0x4E, 0x49, 0x40, 0x47, 0x52, 0x55, 0x5C, 0x5B, | |||
| 0x76, 0x71, 0x78, 0x7F, 0x6A, 0x6D, 0x64, 0x63, | |||
| 0x3E, 0x39, 0x30, 0x37, 0x22, 0x25, 0x2C, 0x2B, | |||
| 0x06, 0x01, 0x08, 0x0F, 0x1A, 0x1D, 0x14, 0x13, | |||
| 0xAE, 0xA9, 0xA0, 0xA7, 0xB2, 0xB5, 0xBC, 0xBB, | |||
| 0x96, 0x91, 0x98, 0x9F, 0x8A, 0x8D, 0x84, 0x83, | |||
| 0xDE, 0xD9, 0xD0, 0xD7, 0xC2, 0xC5, 0xCC, 0xCB, | |||
| 0xE6, 0xE1, 0xE8, 0xEF, 0xFA, 0xFD, 0xF4, 0xF3 | |||
| }; | |||
| /* CRC-16, poly = x^16 + x^15 + x^2 + x^0, init = 0 */ | |||
| unsigned FLAC__crc16_table[256] = { | |||
| 0x0000, 0x8005, 0x800f, 0x000a, 0x801b, 0x001e, 0x0014, 0x8011, | |||
| 0x8033, 0x0036, 0x003c, 0x8039, 0x0028, 0x802d, 0x8027, 0x0022, | |||
| 0x8063, 0x0066, 0x006c, 0x8069, 0x0078, 0x807d, 0x8077, 0x0072, | |||
| 0x0050, 0x8055, 0x805f, 0x005a, 0x804b, 0x004e, 0x0044, 0x8041, | |||
| 0x80c3, 0x00c6, 0x00cc, 0x80c9, 0x00d8, 0x80dd, 0x80d7, 0x00d2, | |||
| 0x00f0, 0x80f5, 0x80ff, 0x00fa, 0x80eb, 0x00ee, 0x00e4, 0x80e1, | |||
| 0x00a0, 0x80a5, 0x80af, 0x00aa, 0x80bb, 0x00be, 0x00b4, 0x80b1, | |||
| 0x8093, 0x0096, 0x009c, 0x8099, 0x0088, 0x808d, 0x8087, 0x0082, | |||
| 0x8183, 0x0186, 0x018c, 0x8189, 0x0198, 0x819d, 0x8197, 0x0192, | |||
| 0x01b0, 0x81b5, 0x81bf, 0x01ba, 0x81ab, 0x01ae, 0x01a4, 0x81a1, | |||
| 0x01e0, 0x81e5, 0x81ef, 0x01ea, 0x81fb, 0x01fe, 0x01f4, 0x81f1, | |||
| 0x81d3, 0x01d6, 0x01dc, 0x81d9, 0x01c8, 0x81cd, 0x81c7, 0x01c2, | |||
| 0x0140, 0x8145, 0x814f, 0x014a, 0x815b, 0x015e, 0x0154, 0x8151, | |||
| 0x8173, 0x0176, 0x017c, 0x8179, 0x0168, 0x816d, 0x8167, 0x0162, | |||
| 0x8123, 0x0126, 0x012c, 0x8129, 0x0138, 0x813d, 0x8137, 0x0132, | |||
| 0x0110, 0x8115, 0x811f, 0x011a, 0x810b, 0x010e, 0x0104, 0x8101, | |||
| 0x8303, 0x0306, 0x030c, 0x8309, 0x0318, 0x831d, 0x8317, 0x0312, | |||
| 0x0330, 0x8335, 0x833f, 0x033a, 0x832b, 0x032e, 0x0324, 0x8321, | |||
| 0x0360, 0x8365, 0x836f, 0x036a, 0x837b, 0x037e, 0x0374, 0x8371, | |||
| 0x8353, 0x0356, 0x035c, 0x8359, 0x0348, 0x834d, 0x8347, 0x0342, | |||
| 0x03c0, 0x83c5, 0x83cf, 0x03ca, 0x83db, 0x03de, 0x03d4, 0x83d1, | |||
| 0x83f3, 0x03f6, 0x03fc, 0x83f9, 0x03e8, 0x83ed, 0x83e7, 0x03e2, | |||
| 0x83a3, 0x03a6, 0x03ac, 0x83a9, 0x03b8, 0x83bd, 0x83b7, 0x03b2, | |||
| 0x0390, 0x8395, 0x839f, 0x039a, 0x838b, 0x038e, 0x0384, 0x8381, | |||
| 0x0280, 0x8285, 0x828f, 0x028a, 0x829b, 0x029e, 0x0294, 0x8291, | |||
| 0x82b3, 0x02b6, 0x02bc, 0x82b9, 0x02a8, 0x82ad, 0x82a7, 0x02a2, | |||
| 0x82e3, 0x02e6, 0x02ec, 0x82e9, 0x02f8, 0x82fd, 0x82f7, 0x02f2, | |||
| 0x02d0, 0x82d5, 0x82df, 0x02da, 0x82cb, 0x02ce, 0x02c4, 0x82c1, | |||
| 0x8243, 0x0246, 0x024c, 0x8249, 0x0258, 0x825d, 0x8257, 0x0252, | |||
| 0x0270, 0x8275, 0x827f, 0x027a, 0x826b, 0x026e, 0x0264, 0x8261, | |||
| 0x0220, 0x8225, 0x822f, 0x022a, 0x823b, 0x023e, 0x0234, 0x8231, | |||
| 0x8213, 0x0216, 0x021c, 0x8219, 0x0208, 0x820d, 0x8207, 0x0202 | |||
| }; | |||
| void FLAC__crc8_update(const FLAC__byte data, FLAC__uint8 *crc) | |||
| { | |||
| *crc = FLAC__crc8_table[*crc ^ data]; | |||
| } | |||
| void FLAC__crc8_update_block(const FLAC__byte *data, unsigned len, FLAC__uint8 *crc) | |||
| { | |||
| while(len--) | |||
| *crc = FLAC__crc8_table[*crc ^ *data++]; | |||
| } | |||
| FLAC__uint8 FLAC__crc8(const FLAC__byte *data, unsigned len) | |||
| { | |||
| FLAC__uint8 crc = 0; | |||
| while(len--) | |||
| crc = FLAC__crc8_table[crc ^ *data++]; | |||
| return crc; | |||
| } | |||
| unsigned FLAC__crc16(const FLAC__byte *data, unsigned len) | |||
| { | |||
| unsigned crc = 0; | |||
| while(len--) | |||
| crc = ((crc<<8) ^ FLAC__crc16_table[(crc>>8) ^ *data++]) & 0xffff; | |||
| return crc; | |||
| } | |||
| #endif | |||
| @@ -1,441 +1,441 @@ | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 Josh Coalson | |||
| * | |||
| * 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. | |||
| */ | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 Josh Coalson | |||
| * | |||
| * 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. | |||
| */ | |||
| #include "juce_FlacHeader.h" | |||
| #if JUCE_USE_FLAC | |||
| #if HAVE_CONFIG_H | |||
| # include <config.h> | |||
| #endif | |||
| #include <math.h> | |||
| #include <string.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 min | |||
| #undef min | |||
| #endif | |||
| #define min(x,y) ((x) < (y)? (x) : (y)) | |||
| #ifdef local_abs | |||
| #undef local_abs | |||
| #endif | |||
| #define local_abs(x) ((unsigned)((x)<0? -(x) : (x))) | |||
| #ifdef FLAC__INTEGER_ONLY_LIBRARY | |||
| /* rbps stands for residual bits per sample | |||
| * | |||
| * (ln(2) * err) | |||
| * rbps = log (-----------) | |||
| * 2 ( n ) | |||
| */ | |||
| static FLAC__fixedpoint local__compute_rbps_integerized(FLAC__uint32 err, FLAC__uint32 n) | |||
| { | |||
| FLAC__uint32 rbps; | |||
| unsigned bits; /* the number of bits required to represent a number */ | |||
| int fracbits; /* the number of bits of rbps that comprise the fractional part */ | |||
| FLAC__ASSERT(sizeof(rbps) == sizeof(FLAC__fixedpoint)); | |||
| FLAC__ASSERT(err > 0); | |||
| FLAC__ASSERT(n > 0); | |||
| FLAC__ASSERT(n <= FLAC__MAX_BLOCK_SIZE); | |||
| if(err <= n) | |||
| return 0; | |||
| /* | |||
| * The above two things tell us 1) n fits in 16 bits; 2) err/n > 1. | |||
| * These allow us later to know we won't lose too much precision in the | |||
| * fixed-point division (err<<fracbits)/n. | |||
| */ | |||
| fracbits = (8*sizeof(err)) - (FLAC__bitmath_ilog2(err)+1); | |||
| err <<= fracbits; | |||
| err /= n; | |||
| /* err now holds err/n with fracbits fractional bits */ | |||
| /* | |||
| * Whittle err down to 16 bits max. 16 significant bits is enough for | |||
| * our purposes. | |||
| */ | |||
| FLAC__ASSERT(err > 0); | |||
| bits = FLAC__bitmath_ilog2(err)+1; | |||
| if(bits > 16) { | |||
| err >>= (bits-16); | |||
| fracbits -= (bits-16); | |||
| } | |||
| rbps = (FLAC__uint32)err; | |||
| /* Multiply by fixed-point version of ln(2), with 16 fractional bits */ | |||
| rbps *= FLAC__FP_LN2; | |||
| fracbits += 16; | |||
| FLAC__ASSERT(fracbits >= 0); | |||
| /* FLAC__fixedpoint_log2 requires fracbits%4 to be 0 */ | |||
| { | |||
| const int f = fracbits & 3; | |||
| if(f) { | |||
| rbps >>= f; | |||
| fracbits -= f; | |||
| } | |||
| } | |||
| rbps = FLAC__fixedpoint_log2(rbps, fracbits, (unsigned)(-1)); | |||
| if(rbps == 0) | |||
| return 0; | |||
| /* | |||
| * The return value must have 16 fractional bits. Since the whole part | |||
| * of the base-2 log of a 32 bit number must fit in 5 bits, and fracbits | |||
| * must be >= -3, these assertion allows us to be able to shift rbps | |||
| * left if necessary to get 16 fracbits without losing any bits of the | |||
| * whole part of rbps. | |||
| * | |||
| * There is a slight chance due to accumulated error that the whole part | |||
| * will require 6 bits, so we use 6 in the assertion. Really though as | |||
| * long as it fits in 13 bits (32 - (16 - (-3))) we are fine. | |||
| */ | |||
| FLAC__ASSERT((int)FLAC__bitmath_ilog2(rbps)+1 <= fracbits + 6); | |||
| FLAC__ASSERT(fracbits >= -3); | |||
| /* now shift the decimal point into place */ | |||
| if(fracbits < 16) | |||
| return rbps << (16-fracbits); | |||
| else if(fracbits > 16) | |||
| return rbps >> (fracbits-16); | |||
| else | |||
| return rbps; | |||
| } | |||
| static FLAC__fixedpoint local__compute_rbps_wide_integerized(FLAC__uint64 err, FLAC__uint32 n) | |||
| { | |||
| FLAC__uint32 rbps; | |||
| unsigned bits; /* the number of bits required to represent a number */ | |||
| int fracbits; /* the number of bits of rbps that comprise the fractional part */ | |||
| FLAC__ASSERT(sizeof(rbps) == sizeof(FLAC__fixedpoint)); | |||
| FLAC__ASSERT(err > 0); | |||
| FLAC__ASSERT(n > 0); | |||
| FLAC__ASSERT(n <= FLAC__MAX_BLOCK_SIZE); | |||
| if(err <= n) | |||
| return 0; | |||
| /* | |||
| * The above two things tell us 1) n fits in 16 bits; 2) err/n > 1. | |||
| * These allow us later to know we won't lose too much precision in the | |||
| * fixed-point division (err<<fracbits)/n. | |||
| */ | |||
| fracbits = (8*sizeof(err)) - (FLAC__bitmath_ilog2_wide(err)+1); | |||
| err <<= fracbits; | |||
| err /= n; | |||
| /* err now holds err/n with fracbits fractional bits */ | |||
| /* | |||
| * Whittle err down to 16 bits max. 16 significant bits is enough for | |||
| * our purposes. | |||
| */ | |||
| FLAC__ASSERT(err > 0); | |||
| bits = FLAC__bitmath_ilog2_wide(err)+1; | |||
| if(bits > 16) { | |||
| err >>= (bits-16); | |||
| fracbits -= (bits-16); | |||
| } | |||
| rbps = (FLAC__uint32)err; | |||
| /* Multiply by fixed-point version of ln(2), with 16 fractional bits */ | |||
| rbps *= FLAC__FP_LN2; | |||
| fracbits += 16; | |||
| FLAC__ASSERT(fracbits >= 0); | |||
| /* FLAC__fixedpoint_log2 requires fracbits%4 to be 0 */ | |||
| { | |||
| const int f = fracbits & 3; | |||
| if(f) { | |||
| rbps >>= f; | |||
| fracbits -= f; | |||
| } | |||
| } | |||
| rbps = FLAC__fixedpoint_log2(rbps, fracbits, (unsigned)(-1)); | |||
| if(rbps == 0) | |||
| return 0; | |||
| /* | |||
| * The return value must have 16 fractional bits. Since the whole part | |||
| * of the base-2 log of a 32 bit number must fit in 5 bits, and fracbits | |||
| * must be >= -3, these assertion allows us to be able to shift rbps | |||
| * left if necessary to get 16 fracbits without losing any bits of the | |||
| * whole part of rbps. | |||
| * | |||
| * There is a slight chance due to accumulated error that the whole part | |||
| * will require 6 bits, so we use 6 in the assertion. Really though as | |||
| * long as it fits in 13 bits (32 - (16 - (-3))) we are fine. | |||
| */ | |||
| FLAC__ASSERT((int)FLAC__bitmath_ilog2(rbps)+1 <= fracbits + 6); | |||
| FLAC__ASSERT(fracbits >= -3); | |||
| /* now shift the decimal point into place */ | |||
| if(fracbits < 16) | |||
| return rbps << (16-fracbits); | |||
| else if(fracbits > 16) | |||
| return rbps >> (fracbits-16); | |||
| else | |||
| return rbps; | |||
| } | |||
| #endif | |||
| #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]) | |||
| #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]) | |||
| #endif | |||
| { | |||
| FLAC__int32 last_error_0 = data[-1]; | |||
| FLAC__int32 last_error_1 = data[-1] - data[-2]; | |||
| FLAC__int32 last_error_2 = last_error_1 - (data[-2] - data[-3]); | |||
| FLAC__int32 last_error_3 = last_error_2 - (data[-2] - 2*data[-3] + data[-4]); | |||
| FLAC__int32 error, save; | |||
| FLAC__uint32 total_error_0 = 0, total_error_1 = 0, total_error_2 = 0, total_error_3 = 0, total_error_4 = 0; | |||
| unsigned i, order; | |||
| for(i = 0; i < data_len; i++) { | |||
| error = data[i] ; total_error_0 += local_abs(error); save = error; | |||
| error -= last_error_0; total_error_1 += local_abs(error); last_error_0 = save; save = error; | |||
| error -= last_error_1; total_error_2 += local_abs(error); last_error_1 = save; save = error; | |||
| error -= last_error_2; total_error_3 += local_abs(error); last_error_2 = save; save = error; | |||
| error -= last_error_3; total_error_4 += local_abs(error); last_error_3 = save; | |||
| } | |||
| if(total_error_0 < min(min(min(total_error_1, total_error_2), total_error_3), total_error_4)) | |||
| order = 0; | |||
| else if(total_error_1 < min(min(total_error_2, total_error_3), total_error_4)) | |||
| order = 1; | |||
| else if(total_error_2 < min(total_error_3, total_error_4)) | |||
| order = 2; | |||
| else if(total_error_3 < total_error_4) | |||
| order = 3; | |||
| else | |||
| order = 4; | |||
| /* Estimate the expected number of bits per residual signal sample. */ | |||
| /* 'total_error*' is linearly related to the variance of the residual */ | |||
| /* signal, so we use it directly to compute E(|x|) */ | |||
| FLAC__ASSERT(data_len > 0 || total_error_0 == 0); | |||
| FLAC__ASSERT(data_len > 0 || total_error_1 == 0); | |||
| FLAC__ASSERT(data_len > 0 || total_error_2 == 0); | |||
| FLAC__ASSERT(data_len > 0 || total_error_3 == 0); | |||
| FLAC__ASSERT(data_len > 0 || total_error_4 == 0); | |||
| #ifndef FLAC__INTEGER_ONLY_LIBRARY | |||
| 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); | |||
| #else | |||
| residual_bits_per_sample[0] = (total_error_0 > 0) ? local__compute_rbps_integerized(total_error_0, data_len) : 0; | |||
| residual_bits_per_sample[1] = (total_error_1 > 0) ? local__compute_rbps_integerized(total_error_1, data_len) : 0; | |||
| residual_bits_per_sample[2] = (total_error_2 > 0) ? local__compute_rbps_integerized(total_error_2, data_len) : 0; | |||
| residual_bits_per_sample[3] = (total_error_3 > 0) ? local__compute_rbps_integerized(total_error_3, data_len) : 0; | |||
| residual_bits_per_sample[4] = (total_error_4 > 0) ? local__compute_rbps_integerized(total_error_4, data_len) : 0; | |||
| #endif | |||
| return order; | |||
| } | |||
| #ifndef FLAC__INTEGER_ONLY_LIBRARY | |||
| 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_wide(const FLAC__int32 data[], unsigned data_len, FLAC__fixedpoint residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]) | |||
| #endif | |||
| { | |||
| FLAC__int32 last_error_0 = data[-1]; | |||
| FLAC__int32 last_error_1 = data[-1] - data[-2]; | |||
| FLAC__int32 last_error_2 = last_error_1 - (data[-2] - data[-3]); | |||
| FLAC__int32 last_error_3 = last_error_2 - (data[-2] - 2*data[-3] + data[-4]); | |||
| FLAC__int32 error, save; | |||
| /* total_error_* are 64-bits to avoid overflow when encoding | |||
| * erratic signals when the bits-per-sample and blocksize are | |||
| * large. | |||
| */ | |||
| FLAC__uint64 total_error_0 = 0, total_error_1 = 0, total_error_2 = 0, total_error_3 = 0, total_error_4 = 0; | |||
| unsigned i, order; | |||
| for(i = 0; i < data_len; i++) { | |||
| error = data[i] ; total_error_0 += local_abs(error); save = error; | |||
| error -= last_error_0; total_error_1 += local_abs(error); last_error_0 = save; save = error; | |||
| error -= last_error_1; total_error_2 += local_abs(error); last_error_1 = save; save = error; | |||
| error -= last_error_2; total_error_3 += local_abs(error); last_error_2 = save; save = error; | |||
| error -= last_error_3; total_error_4 += local_abs(error); last_error_3 = save; | |||
| } | |||
| if(total_error_0 < min(min(min(total_error_1, total_error_2), total_error_3), total_error_4)) | |||
| order = 0; | |||
| else if(total_error_1 < min(min(total_error_2, total_error_3), total_error_4)) | |||
| order = 1; | |||
| else if(total_error_2 < min(total_error_3, total_error_4)) | |||
| order = 2; | |||
| else if(total_error_3 < total_error_4) | |||
| order = 3; | |||
| else | |||
| order = 4; | |||
| /* Estimate the expected number of bits per residual signal sample. */ | |||
| /* 'total_error*' is linearly related to the variance of the residual */ | |||
| /* signal, so we use it directly to compute E(|x|) */ | |||
| FLAC__ASSERT(data_len > 0 || total_error_0 == 0); | |||
| FLAC__ASSERT(data_len > 0 || total_error_1 == 0); | |||
| FLAC__ASSERT(data_len > 0 || total_error_2 == 0); | |||
| 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; | |||
| residual_bits_per_sample[2] = (total_error_2 > 0) ? local__compute_rbps_wide_integerized(total_error_2, data_len) : 0; | |||
| residual_bits_per_sample[3] = (total_error_3 > 0) ? local__compute_rbps_wide_integerized(total_error_3, data_len) : 0; | |||
| residual_bits_per_sample[4] = (total_error_4 > 0) ? local__compute_rbps_wide_integerized(total_error_4, data_len) : 0; | |||
| #endif | |||
| return order; | |||
| } | |||
| void FLAC__fixed_compute_residual(const FLAC__int32 data[], unsigned data_len, unsigned order, FLAC__int32 residual[]) | |||
| { | |||
| const int idata_len = (int)data_len; | |||
| int i; | |||
| switch(order) { | |||
| case 0: | |||
| FLAC__ASSERT(sizeof(residual[0]) == sizeof(data[0])); | |||
| memcpy(residual, data, sizeof(residual[0])*data_len); | |||
| break; | |||
| case 1: | |||
| for(i = 0; i < idata_len; i++) | |||
| residual[i] = data[i] - data[i-1]; | |||
| break; | |||
| case 2: | |||
| for(i = 0; i < idata_len; i++) | |||
| #if 1 /* OPT: may be faster with some compilers on some systems */ | |||
| residual[i] = data[i] - (data[i-1] << 1) + data[i-2]; | |||
| #else | |||
| residual[i] = data[i] - 2*data[i-1] + data[i-2]; | |||
| #endif | |||
| break; | |||
| case 3: | |||
| for(i = 0; i < idata_len; i++) | |||
| #if 1 /* OPT: may be faster with some compilers on some systems */ | |||
| residual[i] = data[i] - (((data[i-1]-data[i-2])<<1) + (data[i-1]-data[i-2])) - data[i-3]; | |||
| #else | |||
| residual[i] = data[i] - 3*data[i-1] + 3*data[i-2] - data[i-3]; | |||
| #endif | |||
| break; | |||
| case 4: | |||
| for(i = 0; i < idata_len; i++) | |||
| #if 1 /* OPT: may be faster with some compilers on some systems */ | |||
| residual[i] = data[i] - ((data[i-1]+data[i-3])<<2) + ((data[i-2]<<2) + (data[i-2]<<1)) + data[i-4]; | |||
| #else | |||
| residual[i] = data[i] - 4*data[i-1] + 6*data[i-2] - 4*data[i-3] + data[i-4]; | |||
| #endif | |||
| break; | |||
| default: | |||
| FLAC__ASSERT(0); | |||
| } | |||
| } | |||
| void FLAC__fixed_restore_signal(const FLAC__int32 residual[], unsigned data_len, unsigned order, FLAC__int32 data[]) | |||
| { | |||
| int i, idata_len = (int)data_len; | |||
| switch(order) { | |||
| case 0: | |||
| FLAC__ASSERT(sizeof(residual[0]) == sizeof(data[0])); | |||
| memcpy(data, residual, sizeof(residual[0])*data_len); | |||
| break; | |||
| case 1: | |||
| for(i = 0; i < idata_len; i++) | |||
| data[i] = residual[i] + data[i-1]; | |||
| break; | |||
| case 2: | |||
| for(i = 0; i < idata_len; i++) | |||
| #if 1 /* OPT: may be faster with some compilers on some systems */ | |||
| data[i] = residual[i] + (data[i-1]<<1) - data[i-2]; | |||
| #else | |||
| data[i] = residual[i] + 2*data[i-1] - data[i-2]; | |||
| #endif | |||
| break; | |||
| case 3: | |||
| for(i = 0; i < idata_len; i++) | |||
| #if 1 /* OPT: may be faster with some compilers on some systems */ | |||
| data[i] = residual[i] + (((data[i-1]-data[i-2])<<1) + (data[i-1]-data[i-2])) + data[i-3]; | |||
| #else | |||
| data[i] = residual[i] + 3*data[i-1] - 3*data[i-2] + data[i-3]; | |||
| #endif | |||
| break; | |||
| case 4: | |||
| for(i = 0; i < idata_len; i++) | |||
| #if 1 /* OPT: may be faster with some compilers on some systems */ | |||
| data[i] = residual[i] + ((data[i-1]+data[i-3])<<2) - ((data[i-2]<<2) + (data[i-2]<<1)) - data[i-4]; | |||
| #else | |||
| data[i] = residual[i] + 4*data[i-1] - 6*data[i-2] + 4*data[i-3] - data[i-4]; | |||
| #endif | |||
| break; | |||
| default: | |||
| FLAC__ASSERT(0); | |||
| } | |||
| } | |||
| #endif | |||
| #if HAVE_CONFIG_H | |||
| # include <config.h> | |||
| #endif | |||
| #include <math.h> | |||
| #include <string.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 min | |||
| #undef min | |||
| #endif | |||
| #define min(x,y) ((x) < (y)? (x) : (y)) | |||
| #ifdef local_abs | |||
| #undef local_abs | |||
| #endif | |||
| #define local_abs(x) ((unsigned)((x)<0? -(x) : (x))) | |||
| #ifdef FLAC__INTEGER_ONLY_LIBRARY | |||
| /* rbps stands for residual bits per sample | |||
| * | |||
| * (ln(2) * err) | |||
| * rbps = log (-----------) | |||
| * 2 ( n ) | |||
| */ | |||
| static FLAC__fixedpoint local__compute_rbps_integerized(FLAC__uint32 err, FLAC__uint32 n) | |||
| { | |||
| FLAC__uint32 rbps; | |||
| unsigned bits; /* the number of bits required to represent a number */ | |||
| int fracbits; /* the number of bits of rbps that comprise the fractional part */ | |||
| FLAC__ASSERT(sizeof(rbps) == sizeof(FLAC__fixedpoint)); | |||
| FLAC__ASSERT(err > 0); | |||
| FLAC__ASSERT(n > 0); | |||
| FLAC__ASSERT(n <= FLAC__MAX_BLOCK_SIZE); | |||
| if(err <= n) | |||
| return 0; | |||
| /* | |||
| * The above two things tell us 1) n fits in 16 bits; 2) err/n > 1. | |||
| * These allow us later to know we won't lose too much precision in the | |||
| * fixed-point division (err<<fracbits)/n. | |||
| */ | |||
| fracbits = (8*sizeof(err)) - (FLAC__bitmath_ilog2(err)+1); | |||
| err <<= fracbits; | |||
| err /= n; | |||
| /* err now holds err/n with fracbits fractional bits */ | |||
| /* | |||
| * Whittle err down to 16 bits max. 16 significant bits is enough for | |||
| * our purposes. | |||
| */ | |||
| FLAC__ASSERT(err > 0); | |||
| bits = FLAC__bitmath_ilog2(err)+1; | |||
| if(bits > 16) { | |||
| err >>= (bits-16); | |||
| fracbits -= (bits-16); | |||
| } | |||
| rbps = (FLAC__uint32)err; | |||
| /* Multiply by fixed-point version of ln(2), with 16 fractional bits */ | |||
| rbps *= FLAC__FP_LN2; | |||
| fracbits += 16; | |||
| FLAC__ASSERT(fracbits >= 0); | |||
| /* FLAC__fixedpoint_log2 requires fracbits%4 to be 0 */ | |||
| { | |||
| const int f = fracbits & 3; | |||
| if(f) { | |||
| rbps >>= f; | |||
| fracbits -= f; | |||
| } | |||
| } | |||
| rbps = FLAC__fixedpoint_log2(rbps, fracbits, (unsigned)(-1)); | |||
| if(rbps == 0) | |||
| return 0; | |||
| /* | |||
| * The return value must have 16 fractional bits. Since the whole part | |||
| * of the base-2 log of a 32 bit number must fit in 5 bits, and fracbits | |||
| * must be >= -3, these assertion allows us to be able to shift rbps | |||
| * left if necessary to get 16 fracbits without losing any bits of the | |||
| * whole part of rbps. | |||
| * | |||
| * There is a slight chance due to accumulated error that the whole part | |||
| * will require 6 bits, so we use 6 in the assertion. Really though as | |||
| * long as it fits in 13 bits (32 - (16 - (-3))) we are fine. | |||
| */ | |||
| FLAC__ASSERT((int)FLAC__bitmath_ilog2(rbps)+1 <= fracbits + 6); | |||
| FLAC__ASSERT(fracbits >= -3); | |||
| /* now shift the decimal point into place */ | |||
| if(fracbits < 16) | |||
| return rbps << (16-fracbits); | |||
| else if(fracbits > 16) | |||
| return rbps >> (fracbits-16); | |||
| else | |||
| return rbps; | |||
| } | |||
| static FLAC__fixedpoint local__compute_rbps_wide_integerized(FLAC__uint64 err, FLAC__uint32 n) | |||
| { | |||
| FLAC__uint32 rbps; | |||
| unsigned bits; /* the number of bits required to represent a number */ | |||
| int fracbits; /* the number of bits of rbps that comprise the fractional part */ | |||
| FLAC__ASSERT(sizeof(rbps) == sizeof(FLAC__fixedpoint)); | |||
| FLAC__ASSERT(err > 0); | |||
| FLAC__ASSERT(n > 0); | |||
| FLAC__ASSERT(n <= FLAC__MAX_BLOCK_SIZE); | |||
| if(err <= n) | |||
| return 0; | |||
| /* | |||
| * The above two things tell us 1) n fits in 16 bits; 2) err/n > 1. | |||
| * These allow us later to know we won't lose too much precision in the | |||
| * fixed-point division (err<<fracbits)/n. | |||
| */ | |||
| fracbits = (8*sizeof(err)) - (FLAC__bitmath_ilog2_wide(err)+1); | |||
| err <<= fracbits; | |||
| err /= n; | |||
| /* err now holds err/n with fracbits fractional bits */ | |||
| /* | |||
| * Whittle err down to 16 bits max. 16 significant bits is enough for | |||
| * our purposes. | |||
| */ | |||
| FLAC__ASSERT(err > 0); | |||
| bits = FLAC__bitmath_ilog2_wide(err)+1; | |||
| if(bits > 16) { | |||
| err >>= (bits-16); | |||
| fracbits -= (bits-16); | |||
| } | |||
| rbps = (FLAC__uint32)err; | |||
| /* Multiply by fixed-point version of ln(2), with 16 fractional bits */ | |||
| rbps *= FLAC__FP_LN2; | |||
| fracbits += 16; | |||
| FLAC__ASSERT(fracbits >= 0); | |||
| /* FLAC__fixedpoint_log2 requires fracbits%4 to be 0 */ | |||
| { | |||
| const int f = fracbits & 3; | |||
| if(f) { | |||
| rbps >>= f; | |||
| fracbits -= f; | |||
| } | |||
| } | |||
| rbps = FLAC__fixedpoint_log2(rbps, fracbits, (unsigned)(-1)); | |||
| if(rbps == 0) | |||
| return 0; | |||
| /* | |||
| * The return value must have 16 fractional bits. Since the whole part | |||
| * of the base-2 log of a 32 bit number must fit in 5 bits, and fracbits | |||
| * must be >= -3, these assertion allows us to be able to shift rbps | |||
| * left if necessary to get 16 fracbits without losing any bits of the | |||
| * whole part of rbps. | |||
| * | |||
| * There is a slight chance due to accumulated error that the whole part | |||
| * will require 6 bits, so we use 6 in the assertion. Really though as | |||
| * long as it fits in 13 bits (32 - (16 - (-3))) we are fine. | |||
| */ | |||
| FLAC__ASSERT((int)FLAC__bitmath_ilog2(rbps)+1 <= fracbits + 6); | |||
| FLAC__ASSERT(fracbits >= -3); | |||
| /* now shift the decimal point into place */ | |||
| if(fracbits < 16) | |||
| return rbps << (16-fracbits); | |||
| else if(fracbits > 16) | |||
| return rbps >> (fracbits-16); | |||
| else | |||
| return rbps; | |||
| } | |||
| #endif | |||
| #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]) | |||
| #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]) | |||
| #endif | |||
| { | |||
| FLAC__int32 last_error_0 = data[-1]; | |||
| FLAC__int32 last_error_1 = data[-1] - data[-2]; | |||
| FLAC__int32 last_error_2 = last_error_1 - (data[-2] - data[-3]); | |||
| FLAC__int32 last_error_3 = last_error_2 - (data[-2] - 2*data[-3] + data[-4]); | |||
| FLAC__int32 error, save; | |||
| FLAC__uint32 total_error_0 = 0, total_error_1 = 0, total_error_2 = 0, total_error_3 = 0, total_error_4 = 0; | |||
| unsigned i, order; | |||
| for(i = 0; i < data_len; i++) { | |||
| error = data[i] ; total_error_0 += local_abs(error); save = error; | |||
| error -= last_error_0; total_error_1 += local_abs(error); last_error_0 = save; save = error; | |||
| error -= last_error_1; total_error_2 += local_abs(error); last_error_1 = save; save = error; | |||
| error -= last_error_2; total_error_3 += local_abs(error); last_error_2 = save; save = error; | |||
| error -= last_error_3; total_error_4 += local_abs(error); last_error_3 = save; | |||
| } | |||
| if(total_error_0 < min(min(min(total_error_1, total_error_2), total_error_3), total_error_4)) | |||
| order = 0; | |||
| else if(total_error_1 < min(min(total_error_2, total_error_3), total_error_4)) | |||
| order = 1; | |||
| else if(total_error_2 < min(total_error_3, total_error_4)) | |||
| order = 2; | |||
| else if(total_error_3 < total_error_4) | |||
| order = 3; | |||
| else | |||
| order = 4; | |||
| /* Estimate the expected number of bits per residual signal sample. */ | |||
| /* 'total_error*' is linearly related to the variance of the residual */ | |||
| /* signal, so we use it directly to compute E(|x|) */ | |||
| FLAC__ASSERT(data_len > 0 || total_error_0 == 0); | |||
| FLAC__ASSERT(data_len > 0 || total_error_1 == 0); | |||
| FLAC__ASSERT(data_len > 0 || total_error_2 == 0); | |||
| FLAC__ASSERT(data_len > 0 || total_error_3 == 0); | |||
| FLAC__ASSERT(data_len > 0 || total_error_4 == 0); | |||
| #ifndef FLAC__INTEGER_ONLY_LIBRARY | |||
| 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); | |||
| #else | |||
| residual_bits_per_sample[0] = (total_error_0 > 0) ? local__compute_rbps_integerized(total_error_0, data_len) : 0; | |||
| residual_bits_per_sample[1] = (total_error_1 > 0) ? local__compute_rbps_integerized(total_error_1, data_len) : 0; | |||
| residual_bits_per_sample[2] = (total_error_2 > 0) ? local__compute_rbps_integerized(total_error_2, data_len) : 0; | |||
| residual_bits_per_sample[3] = (total_error_3 > 0) ? local__compute_rbps_integerized(total_error_3, data_len) : 0; | |||
| residual_bits_per_sample[4] = (total_error_4 > 0) ? local__compute_rbps_integerized(total_error_4, data_len) : 0; | |||
| #endif | |||
| return order; | |||
| } | |||
| #ifndef FLAC__INTEGER_ONLY_LIBRARY | |||
| 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_wide(const FLAC__int32 data[], unsigned data_len, FLAC__fixedpoint residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]) | |||
| #endif | |||
| { | |||
| FLAC__int32 last_error_0 = data[-1]; | |||
| FLAC__int32 last_error_1 = data[-1] - data[-2]; | |||
| FLAC__int32 last_error_2 = last_error_1 - (data[-2] - data[-3]); | |||
| FLAC__int32 last_error_3 = last_error_2 - (data[-2] - 2*data[-3] + data[-4]); | |||
| FLAC__int32 error, save; | |||
| /* total_error_* are 64-bits to avoid overflow when encoding | |||
| * erratic signals when the bits-per-sample and blocksize are | |||
| * large. | |||
| */ | |||
| FLAC__uint64 total_error_0 = 0, total_error_1 = 0, total_error_2 = 0, total_error_3 = 0, total_error_4 = 0; | |||
| unsigned i, order; | |||
| for(i = 0; i < data_len; i++) { | |||
| error = data[i] ; total_error_0 += local_abs(error); save = error; | |||
| error -= last_error_0; total_error_1 += local_abs(error); last_error_0 = save; save = error; | |||
| error -= last_error_1; total_error_2 += local_abs(error); last_error_1 = save; save = error; | |||
| error -= last_error_2; total_error_3 += local_abs(error); last_error_2 = save; save = error; | |||
| error -= last_error_3; total_error_4 += local_abs(error); last_error_3 = save; | |||
| } | |||
| if(total_error_0 < min(min(min(total_error_1, total_error_2), total_error_3), total_error_4)) | |||
| order = 0; | |||
| else if(total_error_1 < min(min(total_error_2, total_error_3), total_error_4)) | |||
| order = 1; | |||
| else if(total_error_2 < min(total_error_3, total_error_4)) | |||
| order = 2; | |||
| else if(total_error_3 < total_error_4) | |||
| order = 3; | |||
| else | |||
| order = 4; | |||
| /* Estimate the expected number of bits per residual signal sample. */ | |||
| /* 'total_error*' is linearly related to the variance of the residual */ | |||
| /* signal, so we use it directly to compute E(|x|) */ | |||
| FLAC__ASSERT(data_len > 0 || total_error_0 == 0); | |||
| FLAC__ASSERT(data_len > 0 || total_error_1 == 0); | |||
| FLAC__ASSERT(data_len > 0 || total_error_2 == 0); | |||
| 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; | |||
| residual_bits_per_sample[2] = (total_error_2 > 0) ? local__compute_rbps_wide_integerized(total_error_2, data_len) : 0; | |||
| residual_bits_per_sample[3] = (total_error_3 > 0) ? local__compute_rbps_wide_integerized(total_error_3, data_len) : 0; | |||
| residual_bits_per_sample[4] = (total_error_4 > 0) ? local__compute_rbps_wide_integerized(total_error_4, data_len) : 0; | |||
| #endif | |||
| return order; | |||
| } | |||
| void FLAC__fixed_compute_residual(const FLAC__int32 data[], unsigned data_len, unsigned order, FLAC__int32 residual[]) | |||
| { | |||
| const int idata_len = (int)data_len; | |||
| int i; | |||
| switch(order) { | |||
| case 0: | |||
| FLAC__ASSERT(sizeof(residual[0]) == sizeof(data[0])); | |||
| memcpy(residual, data, sizeof(residual[0])*data_len); | |||
| break; | |||
| case 1: | |||
| for(i = 0; i < idata_len; i++) | |||
| residual[i] = data[i] - data[i-1]; | |||
| break; | |||
| case 2: | |||
| for(i = 0; i < idata_len; i++) | |||
| #if 1 /* OPT: may be faster with some compilers on some systems */ | |||
| residual[i] = data[i] - (data[i-1] << 1) + data[i-2]; | |||
| #else | |||
| residual[i] = data[i] - 2*data[i-1] + data[i-2]; | |||
| #endif | |||
| break; | |||
| case 3: | |||
| for(i = 0; i < idata_len; i++) | |||
| #if 1 /* OPT: may be faster with some compilers on some systems */ | |||
| residual[i] = data[i] - (((data[i-1]-data[i-2])<<1) + (data[i-1]-data[i-2])) - data[i-3]; | |||
| #else | |||
| residual[i] = data[i] - 3*data[i-1] + 3*data[i-2] - data[i-3]; | |||
| #endif | |||
| break; | |||
| case 4: | |||
| for(i = 0; i < idata_len; i++) | |||
| #if 1 /* OPT: may be faster with some compilers on some systems */ | |||
| residual[i] = data[i] - ((data[i-1]+data[i-3])<<2) + ((data[i-2]<<2) + (data[i-2]<<1)) + data[i-4]; | |||
| #else | |||
| residual[i] = data[i] - 4*data[i-1] + 6*data[i-2] - 4*data[i-3] + data[i-4]; | |||
| #endif | |||
| break; | |||
| default: | |||
| FLAC__ASSERT(0); | |||
| } | |||
| } | |||
| void FLAC__fixed_restore_signal(const FLAC__int32 residual[], unsigned data_len, unsigned order, FLAC__int32 data[]) | |||
| { | |||
| int i, idata_len = (int)data_len; | |||
| switch(order) { | |||
| case 0: | |||
| FLAC__ASSERT(sizeof(residual[0]) == sizeof(data[0])); | |||
| memcpy(data, residual, sizeof(residual[0])*data_len); | |||
| break; | |||
| case 1: | |||
| for(i = 0; i < idata_len; i++) | |||
| data[i] = residual[i] + data[i-1]; | |||
| break; | |||
| case 2: | |||
| for(i = 0; i < idata_len; i++) | |||
| #if 1 /* OPT: may be faster with some compilers on some systems */ | |||
| data[i] = residual[i] + (data[i-1]<<1) - data[i-2]; | |||
| #else | |||
| data[i] = residual[i] + 2*data[i-1] - data[i-2]; | |||
| #endif | |||
| break; | |||
| case 3: | |||
| for(i = 0; i < idata_len; i++) | |||
| #if 1 /* OPT: may be faster with some compilers on some systems */ | |||
| data[i] = residual[i] + (((data[i-1]-data[i-2])<<1) + (data[i-1]-data[i-2])) + data[i-3]; | |||
| #else | |||
| data[i] = residual[i] + 3*data[i-1] - 3*data[i-2] + data[i-3]; | |||
| #endif | |||
| break; | |||
| case 4: | |||
| for(i = 0; i < idata_len; i++) | |||
| #if 1 /* OPT: may be faster with some compilers on some systems */ | |||
| data[i] = residual[i] + ((data[i-1]+data[i-3])<<2) - ((data[i-2]<<2) + (data[i-2]<<1)) - data[i-4]; | |||
| #else | |||
| data[i] = residual[i] + 4*data[i-1] - 6*data[i-2] + 4*data[i-3] - data[i-4]; | |||
| #endif | |||
| break; | |||
| default: | |||
| FLAC__ASSERT(0); | |||
| } | |||
| } | |||
| #endif | |||
| @@ -1,314 +1,314 @@ | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2004,2005,2006,2007 Josh Coalson | |||
| * | |||
| * 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. | |||
| */ | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2004,2005,2006,2007 Josh Coalson | |||
| * | |||
| * 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. | |||
| */ | |||
| #include "juce_FlacHeader.h" | |||
| #if JUCE_USE_FLAC | |||
| #if HAVE_CONFIG_H | |||
| # include <config.h> | |||
| #endif | |||
| #include "../assert.h" | |||
| #include "include/private/float.h" | |||
| #ifdef FLAC__INTEGER_ONLY_LIBRARY | |||
| /* adjust for compilers that can't understand using LLU suffix for uint64_t literals */ | |||
| #ifdef _MSC_VER | |||
| #define FLAC__U64L(x) x | |||
| #else | |||
| #define FLAC__U64L(x) x##LLU | |||
| #endif | |||
| const FLAC__fixedpoint FLAC__FP_ZERO = 0; | |||
| const FLAC__fixedpoint FLAC__FP_ONE_HALF = 0x00008000; | |||
| const FLAC__fixedpoint FLAC__FP_ONE = 0x00010000; | |||
| const FLAC__fixedpoint FLAC__FP_LN2 = 45426; | |||
| const FLAC__fixedpoint FLAC__FP_E = 178145; | |||
| /* Lookup tables for Knuth's logarithm algorithm */ | |||
| #define LOG2_LOOKUP_PRECISION 16 | |||
| static const FLAC__uint32 log2_lookup[][LOG2_LOOKUP_PRECISION] = { | |||
| { | |||
| /* | |||
| * 0 fraction bits | |||
| */ | |||
| /* undefined */ 0x00000000, | |||
| /* lg(2/1) = */ 0x00000001, | |||
| /* lg(4/3) = */ 0x00000000, | |||
| /* lg(8/7) = */ 0x00000000, | |||
| /* lg(16/15) = */ 0x00000000, | |||
| /* lg(32/31) = */ 0x00000000, | |||
| /* lg(64/63) = */ 0x00000000, | |||
| /* lg(128/127) = */ 0x00000000, | |||
| /* lg(256/255) = */ 0x00000000, | |||
| /* lg(512/511) = */ 0x00000000, | |||
| /* lg(1024/1023) = */ 0x00000000, | |||
| /* lg(2048/2047) = */ 0x00000000, | |||
| /* lg(4096/4095) = */ 0x00000000, | |||
| /* lg(8192/8191) = */ 0x00000000, | |||
| /* lg(16384/16383) = */ 0x00000000, | |||
| /* lg(32768/32767) = */ 0x00000000 | |||
| }, | |||
| { | |||
| /* | |||
| * 4 fraction bits | |||
| */ | |||
| /* undefined */ 0x00000000, | |||
| /* lg(2/1) = */ 0x00000010, | |||
| /* lg(4/3) = */ 0x00000007, | |||
| /* lg(8/7) = */ 0x00000003, | |||
| /* lg(16/15) = */ 0x00000001, | |||
| /* lg(32/31) = */ 0x00000001, | |||
| /* lg(64/63) = */ 0x00000000, | |||
| /* lg(128/127) = */ 0x00000000, | |||
| /* lg(256/255) = */ 0x00000000, | |||
| /* lg(512/511) = */ 0x00000000, | |||
| /* lg(1024/1023) = */ 0x00000000, | |||
| /* lg(2048/2047) = */ 0x00000000, | |||
| /* lg(4096/4095) = */ 0x00000000, | |||
| /* lg(8192/8191) = */ 0x00000000, | |||
| /* lg(16384/16383) = */ 0x00000000, | |||
| /* lg(32768/32767) = */ 0x00000000 | |||
| }, | |||
| { | |||
| /* | |||
| * 8 fraction bits | |||
| */ | |||
| /* undefined */ 0x00000000, | |||
| /* lg(2/1) = */ 0x00000100, | |||
| /* lg(4/3) = */ 0x0000006a, | |||
| /* lg(8/7) = */ 0x00000031, | |||
| /* lg(16/15) = */ 0x00000018, | |||
| /* lg(32/31) = */ 0x0000000c, | |||
| /* lg(64/63) = */ 0x00000006, | |||
| /* lg(128/127) = */ 0x00000003, | |||
| /* lg(256/255) = */ 0x00000001, | |||
| /* lg(512/511) = */ 0x00000001, | |||
| /* lg(1024/1023) = */ 0x00000000, | |||
| /* lg(2048/2047) = */ 0x00000000, | |||
| /* lg(4096/4095) = */ 0x00000000, | |||
| /* lg(8192/8191) = */ 0x00000000, | |||
| /* lg(16384/16383) = */ 0x00000000, | |||
| /* lg(32768/32767) = */ 0x00000000 | |||
| }, | |||
| { | |||
| /* | |||
| * 12 fraction bits | |||
| */ | |||
| /* undefined */ 0x00000000, | |||
| /* lg(2/1) = */ 0x00001000, | |||
| /* lg(4/3) = */ 0x000006a4, | |||
| /* lg(8/7) = */ 0x00000315, | |||
| /* lg(16/15) = */ 0x0000017d, | |||
| /* lg(32/31) = */ 0x000000bc, | |||
| /* lg(64/63) = */ 0x0000005d, | |||
| /* lg(128/127) = */ 0x0000002e, | |||
| /* lg(256/255) = */ 0x00000017, | |||
| /* lg(512/511) = */ 0x0000000c, | |||
| /* lg(1024/1023) = */ 0x00000006, | |||
| /* lg(2048/2047) = */ 0x00000003, | |||
| /* lg(4096/4095) = */ 0x00000001, | |||
| /* lg(8192/8191) = */ 0x00000001, | |||
| /* lg(16384/16383) = */ 0x00000000, | |||
| /* lg(32768/32767) = */ 0x00000000 | |||
| }, | |||
| { | |||
| /* | |||
| * 16 fraction bits | |||
| */ | |||
| /* undefined */ 0x00000000, | |||
| /* lg(2/1) = */ 0x00010000, | |||
| /* lg(4/3) = */ 0x00006a40, | |||
| /* lg(8/7) = */ 0x00003151, | |||
| /* lg(16/15) = */ 0x000017d6, | |||
| /* lg(32/31) = */ 0x00000bba, | |||
| /* lg(64/63) = */ 0x000005d1, | |||
| /* lg(128/127) = */ 0x000002e6, | |||
| /* lg(256/255) = */ 0x00000172, | |||
| /* lg(512/511) = */ 0x000000b9, | |||
| /* lg(1024/1023) = */ 0x0000005c, | |||
| /* lg(2048/2047) = */ 0x0000002e, | |||
| /* lg(4096/4095) = */ 0x00000017, | |||
| /* lg(8192/8191) = */ 0x0000000c, | |||
| /* lg(16384/16383) = */ 0x00000006, | |||
| /* lg(32768/32767) = */ 0x00000003 | |||
| }, | |||
| { | |||
| /* | |||
| * 20 fraction bits | |||
| */ | |||
| /* undefined */ 0x00000000, | |||
| /* lg(2/1) = */ 0x00100000, | |||
| /* lg(4/3) = */ 0x0006a3fe, | |||
| /* lg(8/7) = */ 0x00031513, | |||
| /* lg(16/15) = */ 0x00017d60, | |||
| /* lg(32/31) = */ 0x0000bb9d, | |||
| /* lg(64/63) = */ 0x00005d10, | |||
| /* lg(128/127) = */ 0x00002e59, | |||
| /* lg(256/255) = */ 0x00001721, | |||
| /* lg(512/511) = */ 0x00000b8e, | |||
| /* lg(1024/1023) = */ 0x000005c6, | |||
| /* lg(2048/2047) = */ 0x000002e3, | |||
| /* lg(4096/4095) = */ 0x00000171, | |||
| /* lg(8192/8191) = */ 0x000000b9, | |||
| /* lg(16384/16383) = */ 0x0000005c, | |||
| /* lg(32768/32767) = */ 0x0000002e | |||
| }, | |||
| { | |||
| /* | |||
| * 24 fraction bits | |||
| */ | |||
| /* undefined */ 0x00000000, | |||
| /* lg(2/1) = */ 0x01000000, | |||
| /* lg(4/3) = */ 0x006a3fe6, | |||
| /* lg(8/7) = */ 0x00315130, | |||
| /* lg(16/15) = */ 0x0017d605, | |||
| /* lg(32/31) = */ 0x000bb9ca, | |||
| /* lg(64/63) = */ 0x0005d0fc, | |||
| /* lg(128/127) = */ 0x0002e58f, | |||
| /* lg(256/255) = */ 0x0001720e, | |||
| /* lg(512/511) = */ 0x0000b8d8, | |||
| /* lg(1024/1023) = */ 0x00005c61, | |||
| /* lg(2048/2047) = */ 0x00002e2d, | |||
| /* lg(4096/4095) = */ 0x00001716, | |||
| /* lg(8192/8191) = */ 0x00000b8b, | |||
| /* lg(16384/16383) = */ 0x000005c5, | |||
| /* lg(32768/32767) = */ 0x000002e3 | |||
| }, | |||
| { | |||
| /* | |||
| * 28 fraction bits | |||
| */ | |||
| /* undefined */ 0x00000000, | |||
| /* lg(2/1) = */ 0x10000000, | |||
| /* lg(4/3) = */ 0x06a3fe5c, | |||
| /* lg(8/7) = */ 0x03151301, | |||
| /* lg(16/15) = */ 0x017d6049, | |||
| /* lg(32/31) = */ 0x00bb9ca6, | |||
| /* lg(64/63) = */ 0x005d0fba, | |||
| /* lg(128/127) = */ 0x002e58f7, | |||
| /* lg(256/255) = */ 0x001720da, | |||
| /* lg(512/511) = */ 0x000b8d87, | |||
| /* lg(1024/1023) = */ 0x0005c60b, | |||
| /* lg(2048/2047) = */ 0x0002e2d7, | |||
| /* lg(4096/4095) = */ 0x00017160, | |||
| /* lg(8192/8191) = */ 0x0000b8ad, | |||
| /* lg(16384/16383) = */ 0x00005c56, | |||
| /* lg(32768/32767) = */ 0x00002e2b | |||
| } | |||
| }; | |||
| #if 0 | |||
| static const FLAC__uint64 log2_lookup_wide[] = { | |||
| { | |||
| /* | |||
| * 32 fraction bits | |||
| */ | |||
| /* undefined */ 0x00000000, | |||
| /* lg(2/1) = */ FLAC__U64L(0x100000000), | |||
| /* lg(4/3) = */ FLAC__U64L(0x6a3fe5c6), | |||
| /* lg(8/7) = */ FLAC__U64L(0x31513015), | |||
| /* lg(16/15) = */ FLAC__U64L(0x17d60497), | |||
| /* lg(32/31) = */ FLAC__U64L(0x0bb9ca65), | |||
| /* lg(64/63) = */ FLAC__U64L(0x05d0fba2), | |||
| /* lg(128/127) = */ FLAC__U64L(0x02e58f74), | |||
| /* lg(256/255) = */ FLAC__U64L(0x01720d9c), | |||
| /* lg(512/511) = */ FLAC__U64L(0x00b8d875), | |||
| /* lg(1024/1023) = */ FLAC__U64L(0x005c60aa), | |||
| /* lg(2048/2047) = */ FLAC__U64L(0x002e2d72), | |||
| /* lg(4096/4095) = */ FLAC__U64L(0x00171600), | |||
| /* lg(8192/8191) = */ FLAC__U64L(0x000b8ad2), | |||
| /* lg(16384/16383) = */ FLAC__U64L(0x0005c55d), | |||
| /* lg(32768/32767) = */ FLAC__U64L(0x0002e2ac) | |||
| }, | |||
| { | |||
| /* | |||
| * 48 fraction bits | |||
| */ | |||
| /* undefined */ 0x00000000, | |||
| /* lg(2/1) = */ FLAC__U64L(0x1000000000000), | |||
| /* lg(4/3) = */ FLAC__U64L(0x6a3fe5c60429), | |||
| /* lg(8/7) = */ FLAC__U64L(0x315130157f7a), | |||
| /* lg(16/15) = */ FLAC__U64L(0x17d60496cfbb), | |||
| /* lg(32/31) = */ FLAC__U64L(0xbb9ca64ecac), | |||
| /* lg(64/63) = */ FLAC__U64L(0x5d0fba187cd), | |||
| /* lg(128/127) = */ FLAC__U64L(0x2e58f7441ee), | |||
| /* lg(256/255) = */ FLAC__U64L(0x1720d9c06a8), | |||
| /* lg(512/511) = */ FLAC__U64L(0xb8d8752173), | |||
| /* lg(1024/1023) = */ FLAC__U64L(0x5c60aa252e), | |||
| /* lg(2048/2047) = */ FLAC__U64L(0x2e2d71b0d8), | |||
| /* lg(4096/4095) = */ FLAC__U64L(0x1716001719), | |||
| /* lg(8192/8191) = */ FLAC__U64L(0xb8ad1de1b), | |||
| /* lg(16384/16383) = */ FLAC__U64L(0x5c55d640d), | |||
| /* lg(32768/32767) = */ FLAC__U64L(0x2e2abcf52) | |||
| } | |||
| }; | |||
| #endif | |||
| FLAC__uint32 FLAC__fixedpoint_log2(FLAC__uint32 x, unsigned fracbits, unsigned precision) | |||
| { | |||
| const FLAC__uint32 ONE = (1u << fracbits); | |||
| const FLAC__uint32 *table = log2_lookup[fracbits >> 2]; | |||
| FLAC__ASSERT(fracbits < 32); | |||
| FLAC__ASSERT((fracbits & 0x3) == 0); | |||
| if(x < ONE) | |||
| return 0; | |||
| if(precision > LOG2_LOOKUP_PRECISION) | |||
| precision = LOG2_LOOKUP_PRECISION; | |||
| /* Knuth's algorithm for computing logarithms, optimized for base-2 with lookup tables */ | |||
| { | |||
| FLAC__uint32 y = 0; | |||
| FLAC__uint32 z = x >> 1, k = 1; | |||
| while (x > ONE && k < precision) { | |||
| if (x - z >= ONE) { | |||
| x -= z; | |||
| z = x >> k; | |||
| y += table[k]; | |||
| } | |||
| else { | |||
| z >>= 1; | |||
| k++; | |||
| } | |||
| } | |||
| return y; | |||
| } | |||
| } | |||
| #endif /* defined FLAC__INTEGER_ONLY_LIBRARY */ | |||
| #endif | |||
| #if HAVE_CONFIG_H | |||
| # include <config.h> | |||
| #endif | |||
| #include "../assert.h" | |||
| #include "include/private/float.h" | |||
| #ifdef FLAC__INTEGER_ONLY_LIBRARY | |||
| /* adjust for compilers that can't understand using LLU suffix for uint64_t literals */ | |||
| #ifdef _MSC_VER | |||
| #define FLAC__U64L(x) x | |||
| #else | |||
| #define FLAC__U64L(x) x##LLU | |||
| #endif | |||
| const FLAC__fixedpoint FLAC__FP_ZERO = 0; | |||
| const FLAC__fixedpoint FLAC__FP_ONE_HALF = 0x00008000; | |||
| const FLAC__fixedpoint FLAC__FP_ONE = 0x00010000; | |||
| const FLAC__fixedpoint FLAC__FP_LN2 = 45426; | |||
| const FLAC__fixedpoint FLAC__FP_E = 178145; | |||
| /* Lookup tables for Knuth's logarithm algorithm */ | |||
| #define LOG2_LOOKUP_PRECISION 16 | |||
| static const FLAC__uint32 log2_lookup[][LOG2_LOOKUP_PRECISION] = { | |||
| { | |||
| /* | |||
| * 0 fraction bits | |||
| */ | |||
| /* undefined */ 0x00000000, | |||
| /* lg(2/1) = */ 0x00000001, | |||
| /* lg(4/3) = */ 0x00000000, | |||
| /* lg(8/7) = */ 0x00000000, | |||
| /* lg(16/15) = */ 0x00000000, | |||
| /* lg(32/31) = */ 0x00000000, | |||
| /* lg(64/63) = */ 0x00000000, | |||
| /* lg(128/127) = */ 0x00000000, | |||
| /* lg(256/255) = */ 0x00000000, | |||
| /* lg(512/511) = */ 0x00000000, | |||
| /* lg(1024/1023) = */ 0x00000000, | |||
| /* lg(2048/2047) = */ 0x00000000, | |||
| /* lg(4096/4095) = */ 0x00000000, | |||
| /* lg(8192/8191) = */ 0x00000000, | |||
| /* lg(16384/16383) = */ 0x00000000, | |||
| /* lg(32768/32767) = */ 0x00000000 | |||
| }, | |||
| { | |||
| /* | |||
| * 4 fraction bits | |||
| */ | |||
| /* undefined */ 0x00000000, | |||
| /* lg(2/1) = */ 0x00000010, | |||
| /* lg(4/3) = */ 0x00000007, | |||
| /* lg(8/7) = */ 0x00000003, | |||
| /* lg(16/15) = */ 0x00000001, | |||
| /* lg(32/31) = */ 0x00000001, | |||
| /* lg(64/63) = */ 0x00000000, | |||
| /* lg(128/127) = */ 0x00000000, | |||
| /* lg(256/255) = */ 0x00000000, | |||
| /* lg(512/511) = */ 0x00000000, | |||
| /* lg(1024/1023) = */ 0x00000000, | |||
| /* lg(2048/2047) = */ 0x00000000, | |||
| /* lg(4096/4095) = */ 0x00000000, | |||
| /* lg(8192/8191) = */ 0x00000000, | |||
| /* lg(16384/16383) = */ 0x00000000, | |||
| /* lg(32768/32767) = */ 0x00000000 | |||
| }, | |||
| { | |||
| /* | |||
| * 8 fraction bits | |||
| */ | |||
| /* undefined */ 0x00000000, | |||
| /* lg(2/1) = */ 0x00000100, | |||
| /* lg(4/3) = */ 0x0000006a, | |||
| /* lg(8/7) = */ 0x00000031, | |||
| /* lg(16/15) = */ 0x00000018, | |||
| /* lg(32/31) = */ 0x0000000c, | |||
| /* lg(64/63) = */ 0x00000006, | |||
| /* lg(128/127) = */ 0x00000003, | |||
| /* lg(256/255) = */ 0x00000001, | |||
| /* lg(512/511) = */ 0x00000001, | |||
| /* lg(1024/1023) = */ 0x00000000, | |||
| /* lg(2048/2047) = */ 0x00000000, | |||
| /* lg(4096/4095) = */ 0x00000000, | |||
| /* lg(8192/8191) = */ 0x00000000, | |||
| /* lg(16384/16383) = */ 0x00000000, | |||
| /* lg(32768/32767) = */ 0x00000000 | |||
| }, | |||
| { | |||
| /* | |||
| * 12 fraction bits | |||
| */ | |||
| /* undefined */ 0x00000000, | |||
| /* lg(2/1) = */ 0x00001000, | |||
| /* lg(4/3) = */ 0x000006a4, | |||
| /* lg(8/7) = */ 0x00000315, | |||
| /* lg(16/15) = */ 0x0000017d, | |||
| /* lg(32/31) = */ 0x000000bc, | |||
| /* lg(64/63) = */ 0x0000005d, | |||
| /* lg(128/127) = */ 0x0000002e, | |||
| /* lg(256/255) = */ 0x00000017, | |||
| /* lg(512/511) = */ 0x0000000c, | |||
| /* lg(1024/1023) = */ 0x00000006, | |||
| /* lg(2048/2047) = */ 0x00000003, | |||
| /* lg(4096/4095) = */ 0x00000001, | |||
| /* lg(8192/8191) = */ 0x00000001, | |||
| /* lg(16384/16383) = */ 0x00000000, | |||
| /* lg(32768/32767) = */ 0x00000000 | |||
| }, | |||
| { | |||
| /* | |||
| * 16 fraction bits | |||
| */ | |||
| /* undefined */ 0x00000000, | |||
| /* lg(2/1) = */ 0x00010000, | |||
| /* lg(4/3) = */ 0x00006a40, | |||
| /* lg(8/7) = */ 0x00003151, | |||
| /* lg(16/15) = */ 0x000017d6, | |||
| /* lg(32/31) = */ 0x00000bba, | |||
| /* lg(64/63) = */ 0x000005d1, | |||
| /* lg(128/127) = */ 0x000002e6, | |||
| /* lg(256/255) = */ 0x00000172, | |||
| /* lg(512/511) = */ 0x000000b9, | |||
| /* lg(1024/1023) = */ 0x0000005c, | |||
| /* lg(2048/2047) = */ 0x0000002e, | |||
| /* lg(4096/4095) = */ 0x00000017, | |||
| /* lg(8192/8191) = */ 0x0000000c, | |||
| /* lg(16384/16383) = */ 0x00000006, | |||
| /* lg(32768/32767) = */ 0x00000003 | |||
| }, | |||
| { | |||
| /* | |||
| * 20 fraction bits | |||
| */ | |||
| /* undefined */ 0x00000000, | |||
| /* lg(2/1) = */ 0x00100000, | |||
| /* lg(4/3) = */ 0x0006a3fe, | |||
| /* lg(8/7) = */ 0x00031513, | |||
| /* lg(16/15) = */ 0x00017d60, | |||
| /* lg(32/31) = */ 0x0000bb9d, | |||
| /* lg(64/63) = */ 0x00005d10, | |||
| /* lg(128/127) = */ 0x00002e59, | |||
| /* lg(256/255) = */ 0x00001721, | |||
| /* lg(512/511) = */ 0x00000b8e, | |||
| /* lg(1024/1023) = */ 0x000005c6, | |||
| /* lg(2048/2047) = */ 0x000002e3, | |||
| /* lg(4096/4095) = */ 0x00000171, | |||
| /* lg(8192/8191) = */ 0x000000b9, | |||
| /* lg(16384/16383) = */ 0x0000005c, | |||
| /* lg(32768/32767) = */ 0x0000002e | |||
| }, | |||
| { | |||
| /* | |||
| * 24 fraction bits | |||
| */ | |||
| /* undefined */ 0x00000000, | |||
| /* lg(2/1) = */ 0x01000000, | |||
| /* lg(4/3) = */ 0x006a3fe6, | |||
| /* lg(8/7) = */ 0x00315130, | |||
| /* lg(16/15) = */ 0x0017d605, | |||
| /* lg(32/31) = */ 0x000bb9ca, | |||
| /* lg(64/63) = */ 0x0005d0fc, | |||
| /* lg(128/127) = */ 0x0002e58f, | |||
| /* lg(256/255) = */ 0x0001720e, | |||
| /* lg(512/511) = */ 0x0000b8d8, | |||
| /* lg(1024/1023) = */ 0x00005c61, | |||
| /* lg(2048/2047) = */ 0x00002e2d, | |||
| /* lg(4096/4095) = */ 0x00001716, | |||
| /* lg(8192/8191) = */ 0x00000b8b, | |||
| /* lg(16384/16383) = */ 0x000005c5, | |||
| /* lg(32768/32767) = */ 0x000002e3 | |||
| }, | |||
| { | |||
| /* | |||
| * 28 fraction bits | |||
| */ | |||
| /* undefined */ 0x00000000, | |||
| /* lg(2/1) = */ 0x10000000, | |||
| /* lg(4/3) = */ 0x06a3fe5c, | |||
| /* lg(8/7) = */ 0x03151301, | |||
| /* lg(16/15) = */ 0x017d6049, | |||
| /* lg(32/31) = */ 0x00bb9ca6, | |||
| /* lg(64/63) = */ 0x005d0fba, | |||
| /* lg(128/127) = */ 0x002e58f7, | |||
| /* lg(256/255) = */ 0x001720da, | |||
| /* lg(512/511) = */ 0x000b8d87, | |||
| /* lg(1024/1023) = */ 0x0005c60b, | |||
| /* lg(2048/2047) = */ 0x0002e2d7, | |||
| /* lg(4096/4095) = */ 0x00017160, | |||
| /* lg(8192/8191) = */ 0x0000b8ad, | |||
| /* lg(16384/16383) = */ 0x00005c56, | |||
| /* lg(32768/32767) = */ 0x00002e2b | |||
| } | |||
| }; | |||
| #if 0 | |||
| static const FLAC__uint64 log2_lookup_wide[] = { | |||
| { | |||
| /* | |||
| * 32 fraction bits | |||
| */ | |||
| /* undefined */ 0x00000000, | |||
| /* lg(2/1) = */ FLAC__U64L(0x100000000), | |||
| /* lg(4/3) = */ FLAC__U64L(0x6a3fe5c6), | |||
| /* lg(8/7) = */ FLAC__U64L(0x31513015), | |||
| /* lg(16/15) = */ FLAC__U64L(0x17d60497), | |||
| /* lg(32/31) = */ FLAC__U64L(0x0bb9ca65), | |||
| /* lg(64/63) = */ FLAC__U64L(0x05d0fba2), | |||
| /* lg(128/127) = */ FLAC__U64L(0x02e58f74), | |||
| /* lg(256/255) = */ FLAC__U64L(0x01720d9c), | |||
| /* lg(512/511) = */ FLAC__U64L(0x00b8d875), | |||
| /* lg(1024/1023) = */ FLAC__U64L(0x005c60aa), | |||
| /* lg(2048/2047) = */ FLAC__U64L(0x002e2d72), | |||
| /* lg(4096/4095) = */ FLAC__U64L(0x00171600), | |||
| /* lg(8192/8191) = */ FLAC__U64L(0x000b8ad2), | |||
| /* lg(16384/16383) = */ FLAC__U64L(0x0005c55d), | |||
| /* lg(32768/32767) = */ FLAC__U64L(0x0002e2ac) | |||
| }, | |||
| { | |||
| /* | |||
| * 48 fraction bits | |||
| */ | |||
| /* undefined */ 0x00000000, | |||
| /* lg(2/1) = */ FLAC__U64L(0x1000000000000), | |||
| /* lg(4/3) = */ FLAC__U64L(0x6a3fe5c60429), | |||
| /* lg(8/7) = */ FLAC__U64L(0x315130157f7a), | |||
| /* lg(16/15) = */ FLAC__U64L(0x17d60496cfbb), | |||
| /* lg(32/31) = */ FLAC__U64L(0xbb9ca64ecac), | |||
| /* lg(64/63) = */ FLAC__U64L(0x5d0fba187cd), | |||
| /* lg(128/127) = */ FLAC__U64L(0x2e58f7441ee), | |||
| /* lg(256/255) = */ FLAC__U64L(0x1720d9c06a8), | |||
| /* lg(512/511) = */ FLAC__U64L(0xb8d8752173), | |||
| /* lg(1024/1023) = */ FLAC__U64L(0x5c60aa252e), | |||
| /* lg(2048/2047) = */ FLAC__U64L(0x2e2d71b0d8), | |||
| /* lg(4096/4095) = */ FLAC__U64L(0x1716001719), | |||
| /* lg(8192/8191) = */ FLAC__U64L(0xb8ad1de1b), | |||
| /* lg(16384/16383) = */ FLAC__U64L(0x5c55d640d), | |||
| /* lg(32768/32767) = */ FLAC__U64L(0x2e2abcf52) | |||
| } | |||
| }; | |||
| #endif | |||
| FLAC__uint32 FLAC__fixedpoint_log2(FLAC__uint32 x, unsigned fracbits, unsigned precision) | |||
| { | |||
| const FLAC__uint32 ONE = (1u << fracbits); | |||
| const FLAC__uint32 *table = log2_lookup[fracbits >> 2]; | |||
| FLAC__ASSERT(fracbits < 32); | |||
| FLAC__ASSERT((fracbits & 0x3) == 0); | |||
| if(x < ONE) | |||
| return 0; | |||
| if(precision > LOG2_LOOKUP_PRECISION) | |||
| precision = LOG2_LOOKUP_PRECISION; | |||
| /* Knuth's algorithm for computing logarithms, optimized for base-2 with lookup tables */ | |||
| { | |||
| FLAC__uint32 y = 0; | |||
| FLAC__uint32 z = x >> 1, k = 1; | |||
| while (x > ONE && k < precision) { | |||
| if (x - z >= ONE) { | |||
| x -= z; | |||
| z = x >> k; | |||
| y += table[k]; | |||
| } | |||
| else { | |||
| z >>= 1; | |||
| k++; | |||
| } | |||
| } | |||
| return y; | |||
| } | |||
| } | |||
| #endif /* defined FLAC__INTEGER_ONLY_LIBRARY */ | |||
| #endif | |||
| @@ -1,49 +1,49 @@ | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 Josh Coalson | |||
| * | |||
| * 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__ALL_H | |||
| #define FLAC__PRIVATE__ALL_H | |||
| #include "bitmath.h" | |||
| #include "bitreader.h" | |||
| #include "bitwriter.h" | |||
| #include "cpu.h" | |||
| #include "crc.h" | |||
| #include "fixed.h" | |||
| #include "float.h" | |||
| #include "format.h" | |||
| #include "lpc.h" | |||
| #include "md5.h" | |||
| #include "memory.h" | |||
| #include "metadata.h" | |||
| #include "stream_encoder_framing.h" | |||
| #endif | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 Josh Coalson | |||
| * | |||
| * 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__ALL_H | |||
| #define FLAC__PRIVATE__ALL_H | |||
| #include "bitmath.h" | |||
| #include "bitreader.h" | |||
| #include "bitwriter.h" | |||
| #include "cpu.h" | |||
| #include "crc.h" | |||
| #include "fixed.h" | |||
| #include "float.h" | |||
| #include "format.h" | |||
| #include "lpc.h" | |||
| #include "md5.h" | |||
| #include "memory.h" | |||
| #include "metadata.h" | |||
| #include "stream_encoder_framing.h" | |||
| #endif | |||
| @@ -1,42 +1,42 @@ | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2001,2002,2003,2004,2005,2006,2007 Josh Coalson | |||
| * | |||
| * 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__BITMATH_H | |||
| #define FLAC__PRIVATE__BITMATH_H | |||
| #include "../../../ordinals.h" | |||
| unsigned FLAC__bitmath_ilog2(FLAC__uint32 v); | |||
| unsigned FLAC__bitmath_ilog2_wide(FLAC__uint64 v); | |||
| unsigned FLAC__bitmath_silog2(int v); | |||
| unsigned FLAC__bitmath_silog2_wide(FLAC__int64 v); | |||
| #endif | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2001,2002,2003,2004,2005,2006,2007 Josh Coalson | |||
| * | |||
| * 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__BITMATH_H | |||
| #define FLAC__PRIVATE__BITMATH_H | |||
| #include "../../../ordinals.h" | |||
| unsigned FLAC__bitmath_ilog2(FLAC__uint32 v); | |||
| unsigned FLAC__bitmath_ilog2_wide(FLAC__uint64 v); | |||
| unsigned FLAC__bitmath_silog2(int v); | |||
| unsigned FLAC__bitmath_silog2_wide(FLAC__int64 v); | |||
| #endif | |||
| @@ -1,99 +1,99 @@ | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 Josh Coalson | |||
| * | |||
| * 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__BITREADER_H | |||
| #define FLAC__PRIVATE__BITREADER_H | |||
| #include <stdio.h> /* for FILE */ | |||
| #include "../../../ordinals.h" | |||
| #include "cpu.h" | |||
| /* | |||
| * opaque structure definition | |||
| */ | |||
| struct FLAC__BitReader; | |||
| typedef struct FLAC__BitReader FLAC__BitReader; | |||
| typedef FLAC__bool (*FLAC__BitReaderReadCallback)(FLAC__byte buffer[], size_t *bytes, void *client_data); | |||
| /* | |||
| * construction, deletion, initialization, etc functions | |||
| */ | |||
| 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); | |||
| 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); | |||
| /* | |||
| * CRC functions | |||
| */ | |||
| void FLAC__bitreader_reset_read_crc16(FLAC__BitReader *br, FLAC__uint16 seed); | |||
| FLAC__uint16 FLAC__bitreader_get_read_crc16(FLAC__BitReader *br); | |||
| /* | |||
| * info functions | |||
| */ | |||
| FLAC__bool FLAC__bitreader_is_consumed_byte_aligned(const FLAC__BitReader *br); | |||
| unsigned FLAC__bitreader_bits_left_for_byte_alignment(const FLAC__BitReader *br); | |||
| unsigned FLAC__bitreader_get_input_bits_unconsumed(const FLAC__BitReader *br); | |||
| /* | |||
| * read functions | |||
| */ | |||
| FLAC__bool FLAC__bitreader_read_raw_uint32(FLAC__BitReader *br, FLAC__uint32 *val, unsigned bits); | |||
| FLAC__bool FLAC__bitreader_read_raw_int32(FLAC__BitReader *br, FLAC__int32 *val, unsigned bits); | |||
| FLAC__bool FLAC__bitreader_read_raw_uint64(FLAC__BitReader *br, FLAC__uint64 *val, unsigned bits); | |||
| FLAC__bool FLAC__bitreader_read_uint32_little_endian(FLAC__BitReader *br, FLAC__uint32 *val); /*only for bits=32*/ | |||
| FLAC__bool FLAC__bitreader_skip_bits_no_crc(FLAC__BitReader *br, unsigned bits); /* WATCHOUT: does not CRC the skipped data! */ /*@@@@ add to unit tests */ | |||
| FLAC__bool FLAC__bitreader_skip_byte_block_aligned_no_crc(FLAC__BitReader *br, unsigned nvals); /* WATCHOUT: does not CRC the read data! */ | |||
| FLAC__bool FLAC__bitreader_read_byte_block_aligned_no_crc(FLAC__BitReader *br, FLAC__byte *val, unsigned nvals); /* WATCHOUT: does not CRC the read data! */ | |||
| 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 | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 Josh Coalson | |||
| * | |||
| * 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__BITREADER_H | |||
| #define FLAC__PRIVATE__BITREADER_H | |||
| #include <stdio.h> /* for FILE */ | |||
| #include "../../../ordinals.h" | |||
| #include "cpu.h" | |||
| /* | |||
| * opaque structure definition | |||
| */ | |||
| struct FLAC__BitReader; | |||
| typedef struct FLAC__BitReader FLAC__BitReader; | |||
| typedef FLAC__bool (*FLAC__BitReaderReadCallback)(FLAC__byte buffer[], size_t *bytes, void *client_data); | |||
| /* | |||
| * construction, deletion, initialization, etc functions | |||
| */ | |||
| 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); | |||
| 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); | |||
| /* | |||
| * CRC functions | |||
| */ | |||
| void FLAC__bitreader_reset_read_crc16(FLAC__BitReader *br, FLAC__uint16 seed); | |||
| FLAC__uint16 FLAC__bitreader_get_read_crc16(FLAC__BitReader *br); | |||
| /* | |||
| * info functions | |||
| */ | |||
| FLAC__bool FLAC__bitreader_is_consumed_byte_aligned(const FLAC__BitReader *br); | |||
| unsigned FLAC__bitreader_bits_left_for_byte_alignment(const FLAC__BitReader *br); | |||
| unsigned FLAC__bitreader_get_input_bits_unconsumed(const FLAC__BitReader *br); | |||
| /* | |||
| * read functions | |||
| */ | |||
| FLAC__bool FLAC__bitreader_read_raw_uint32(FLAC__BitReader *br, FLAC__uint32 *val, unsigned bits); | |||
| FLAC__bool FLAC__bitreader_read_raw_int32(FLAC__BitReader *br, FLAC__int32 *val, unsigned bits); | |||
| FLAC__bool FLAC__bitreader_read_raw_uint64(FLAC__BitReader *br, FLAC__uint64 *val, unsigned bits); | |||
| FLAC__bool FLAC__bitreader_read_uint32_little_endian(FLAC__BitReader *br, FLAC__uint32 *val); /*only for bits=32*/ | |||
| FLAC__bool FLAC__bitreader_skip_bits_no_crc(FLAC__BitReader *br, unsigned bits); /* WATCHOUT: does not CRC the skipped data! */ /*@@@@ add to unit tests */ | |||
| FLAC__bool FLAC__bitreader_skip_byte_block_aligned_no_crc(FLAC__BitReader *br, unsigned nvals); /* WATCHOUT: does not CRC the read data! */ | |||
| FLAC__bool FLAC__bitreader_read_byte_block_aligned_no_crc(FLAC__BitReader *br, FLAC__byte *val, unsigned nvals); /* WATCHOUT: does not CRC the read data! */ | |||
| 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,103 +1,103 @@ | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 Josh Coalson | |||
| * | |||
| * 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__BITWRITER_H | |||
| #define FLAC__PRIVATE__BITWRITER_H | |||
| #include <stdio.h> /* for FILE */ | |||
| #include "../../../ordinals.h" | |||
| /* | |||
| * opaque structure definition | |||
| */ | |||
| struct FLAC__BitWriter; | |||
| typedef struct FLAC__BitWriter FLAC__BitWriter; | |||
| /* | |||
| * construction, deletion, initialization, etc functions | |||
| */ | |||
| FLAC__BitWriter *FLAC__bitwriter_new(void); | |||
| void FLAC__bitwriter_delete(FLAC__BitWriter *bw); | |||
| FLAC__bool FLAC__bitwriter_init(FLAC__BitWriter *bw); | |||
| void FLAC__bitwriter_free(FLAC__BitWriter *bw); /* does not 'free(buffer)' */ | |||
| void FLAC__bitwriter_clear(FLAC__BitWriter *bw); | |||
| void FLAC__bitwriter_dump(const FLAC__BitWriter *bw, FILE *out); | |||
| /* | |||
| * CRC functions | |||
| * | |||
| * non-const *bw because they have to cal FLAC__bitwriter_get_buffer() | |||
| */ | |||
| FLAC__bool FLAC__bitwriter_get_write_crc16(FLAC__BitWriter *bw, FLAC__uint16 *crc); | |||
| FLAC__bool FLAC__bitwriter_get_write_crc8(FLAC__BitWriter *bw, FLAC__byte *crc); | |||
| /* | |||
| * info functions | |||
| */ | |||
| FLAC__bool FLAC__bitwriter_is_byte_aligned(const FLAC__BitWriter *bw); | |||
| unsigned FLAC__bitwriter_get_input_bits_unconsumed(const FLAC__BitWriter *bw); /* can be called anytime, returns total # of bits unconsumed */ | |||
| /* | |||
| * direct buffer access | |||
| * | |||
| * there may be no calls on the bitwriter between get and release. | |||
| * the bitwriter continues to own the returned buffer. | |||
| * before get, bitwriter MUST be byte aligned: check with FLAC__bitwriter_is_byte_aligned() | |||
| */ | |||
| FLAC__bool FLAC__bitwriter_get_buffer(FLAC__BitWriter *bw, const FLAC__byte **buffer, size_t *bytes); | |||
| void FLAC__bitwriter_release_buffer(FLAC__BitWriter *bw); | |||
| /* | |||
| * write functions | |||
| */ | |||
| FLAC__bool FLAC__bitwriter_write_zeroes(FLAC__BitWriter *bw, unsigned bits); | |||
| FLAC__bool FLAC__bitwriter_write_raw_uint32(FLAC__BitWriter *bw, FLAC__uint32 val, unsigned bits); | |||
| FLAC__bool FLAC__bitwriter_write_raw_int32(FLAC__BitWriter *bw, FLAC__int32 val, unsigned bits); | |||
| FLAC__bool FLAC__bitwriter_write_raw_uint64(FLAC__BitWriter *bw, FLAC__uint64 val, unsigned bits); | |||
| FLAC__bool FLAC__bitwriter_write_raw_uint32_little_endian(FLAC__BitWriter *bw, FLAC__uint32 val); /*only for bits=32*/ | |||
| FLAC__bool FLAC__bitwriter_write_byte_block(FLAC__BitWriter *bw, const FLAC__byte vals[], unsigned nvals); | |||
| FLAC__bool FLAC__bitwriter_write_unary_unsigned(FLAC__BitWriter *bw, unsigned val); | |||
| unsigned FLAC__bitwriter_rice_bits(FLAC__int32 val, unsigned parameter); | |||
| #if 0 /* UNUSED */ | |||
| unsigned FLAC__bitwriter_golomb_bits_signed(int val, unsigned parameter); | |||
| unsigned FLAC__bitwriter_golomb_bits_unsigned(unsigned val, unsigned parameter); | |||
| #endif | |||
| FLAC__bool FLAC__bitwriter_write_rice_signed(FLAC__BitWriter *bw, FLAC__int32 val, unsigned parameter); | |||
| FLAC__bool FLAC__bitwriter_write_rice_signed_block(FLAC__BitWriter *bw, const FLAC__int32 *vals, unsigned nvals, unsigned parameter); | |||
| #if 0 /* UNUSED */ | |||
| FLAC__bool FLAC__bitwriter_write_golomb_signed(FLAC__BitWriter *bw, int val, unsigned parameter); | |||
| FLAC__bool FLAC__bitwriter_write_golomb_unsigned(FLAC__BitWriter *bw, unsigned val, unsigned parameter); | |||
| #endif | |||
| FLAC__bool FLAC__bitwriter_write_utf8_uint32(FLAC__BitWriter *bw, FLAC__uint32 val); | |||
| FLAC__bool FLAC__bitwriter_write_utf8_uint64(FLAC__BitWriter *bw, FLAC__uint64 val); | |||
| FLAC__bool FLAC__bitwriter_zero_pad_to_byte_boundary(FLAC__BitWriter *bw); | |||
| #endif | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 Josh Coalson | |||
| * | |||
| * 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__BITWRITER_H | |||
| #define FLAC__PRIVATE__BITWRITER_H | |||
| #include <stdio.h> /* for FILE */ | |||
| #include "../../../ordinals.h" | |||
| /* | |||
| * opaque structure definition | |||
| */ | |||
| struct FLAC__BitWriter; | |||
| typedef struct FLAC__BitWriter FLAC__BitWriter; | |||
| /* | |||
| * construction, deletion, initialization, etc functions | |||
| */ | |||
| FLAC__BitWriter *FLAC__bitwriter_new(void); | |||
| void FLAC__bitwriter_delete(FLAC__BitWriter *bw); | |||
| FLAC__bool FLAC__bitwriter_init(FLAC__BitWriter *bw); | |||
| void FLAC__bitwriter_free(FLAC__BitWriter *bw); /* does not 'free(buffer)' */ | |||
| void FLAC__bitwriter_clear(FLAC__BitWriter *bw); | |||
| void FLAC__bitwriter_dump(const FLAC__BitWriter *bw, FILE *out); | |||
| /* | |||
| * CRC functions | |||
| * | |||
| * non-const *bw because they have to cal FLAC__bitwriter_get_buffer() | |||
| */ | |||
| FLAC__bool FLAC__bitwriter_get_write_crc16(FLAC__BitWriter *bw, FLAC__uint16 *crc); | |||
| FLAC__bool FLAC__bitwriter_get_write_crc8(FLAC__BitWriter *bw, FLAC__byte *crc); | |||
| /* | |||
| * info functions | |||
| */ | |||
| FLAC__bool FLAC__bitwriter_is_byte_aligned(const FLAC__BitWriter *bw); | |||
| unsigned FLAC__bitwriter_get_input_bits_unconsumed(const FLAC__BitWriter *bw); /* can be called anytime, returns total # of bits unconsumed */ | |||
| /* | |||
| * direct buffer access | |||
| * | |||
| * there may be no calls on the bitwriter between get and release. | |||
| * the bitwriter continues to own the returned buffer. | |||
| * before get, bitwriter MUST be byte aligned: check with FLAC__bitwriter_is_byte_aligned() | |||
| */ | |||
| FLAC__bool FLAC__bitwriter_get_buffer(FLAC__BitWriter *bw, const FLAC__byte **buffer, size_t *bytes); | |||
| void FLAC__bitwriter_release_buffer(FLAC__BitWriter *bw); | |||
| /* | |||
| * write functions | |||
| */ | |||
| FLAC__bool FLAC__bitwriter_write_zeroes(FLAC__BitWriter *bw, unsigned bits); | |||
| FLAC__bool FLAC__bitwriter_write_raw_uint32(FLAC__BitWriter *bw, FLAC__uint32 val, unsigned bits); | |||
| FLAC__bool FLAC__bitwriter_write_raw_int32(FLAC__BitWriter *bw, FLAC__int32 val, unsigned bits); | |||
| FLAC__bool FLAC__bitwriter_write_raw_uint64(FLAC__BitWriter *bw, FLAC__uint64 val, unsigned bits); | |||
| FLAC__bool FLAC__bitwriter_write_raw_uint32_little_endian(FLAC__BitWriter *bw, FLAC__uint32 val); /*only for bits=32*/ | |||
| FLAC__bool FLAC__bitwriter_write_byte_block(FLAC__BitWriter *bw, const FLAC__byte vals[], unsigned nvals); | |||
| FLAC__bool FLAC__bitwriter_write_unary_unsigned(FLAC__BitWriter *bw, unsigned val); | |||
| unsigned FLAC__bitwriter_rice_bits(FLAC__int32 val, unsigned parameter); | |||
| #if 0 /* UNUSED */ | |||
| unsigned FLAC__bitwriter_golomb_bits_signed(int val, unsigned parameter); | |||
| unsigned FLAC__bitwriter_golomb_bits_unsigned(unsigned val, unsigned parameter); | |||
| #endif | |||
| FLAC__bool FLAC__bitwriter_write_rice_signed(FLAC__BitWriter *bw, FLAC__int32 val, unsigned parameter); | |||
| FLAC__bool FLAC__bitwriter_write_rice_signed_block(FLAC__BitWriter *bw, const FLAC__int32 *vals, unsigned nvals, unsigned parameter); | |||
| #if 0 /* UNUSED */ | |||
| FLAC__bool FLAC__bitwriter_write_golomb_signed(FLAC__BitWriter *bw, int val, unsigned parameter); | |||
| FLAC__bool FLAC__bitwriter_write_golomb_unsigned(FLAC__BitWriter *bw, unsigned val, unsigned parameter); | |||
| #endif | |||
| FLAC__bool FLAC__bitwriter_write_utf8_uint32(FLAC__BitWriter *bw, FLAC__uint32 val); | |||
| FLAC__bool FLAC__bitwriter_write_utf8_uint64(FLAC__BitWriter *bw, FLAC__uint64 val); | |||
| FLAC__bool FLAC__bitwriter_zero_pad_to_byte_boundary(FLAC__BitWriter *bw); | |||
| #endif | |||
| @@ -1,88 +1,88 @@ | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2001,2002,2003,2004,2005,2006,2007 Josh Coalson | |||
| * | |||
| * 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__CPU_H | |||
| #define FLAC__PRIVATE__CPU_H | |||
| #include "../../../ordinals.h" | |||
| #ifdef HAVE_CONFIG_H | |||
| #include <config.h> | |||
| #endif | |||
| typedef enum { | |||
| FLAC__CPUINFO_TYPE_IA32, | |||
| FLAC__CPUINFO_TYPE_PPC, | |||
| FLAC__CPUINFO_TYPE_UNKNOWN | |||
| } FLAC__CPUInfo_Type; | |||
| 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__CPUInfo_IA32; | |||
| typedef struct { | |||
| FLAC__bool altivec; | |||
| FLAC__bool ppc64; | |||
| } FLAC__CPUInfo_PPC; | |||
| typedef struct { | |||
| FLAC__bool use_asm; | |||
| FLAC__CPUInfo_Type type; | |||
| union { | |||
| FLAC__CPUInfo_IA32 ia32; | |||
| FLAC__CPUInfo_PPC ppc; | |||
| } data; | |||
| } FLAC__CPUInfo; | |||
| void FLAC__cpu_info(FLAC__CPUInfo *info); | |||
| #ifndef FLAC__NO_ASM | |||
| #ifdef FLAC__CPU_IA32 | |||
| #ifdef 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 | |||
| #endif | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2001,2002,2003,2004,2005,2006,2007 Josh Coalson | |||
| * | |||
| * 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__CPU_H | |||
| #define FLAC__PRIVATE__CPU_H | |||
| #include "../../../ordinals.h" | |||
| #ifdef HAVE_CONFIG_H | |||
| #include <config.h> | |||
| #endif | |||
| typedef enum { | |||
| FLAC__CPUINFO_TYPE_IA32, | |||
| FLAC__CPUINFO_TYPE_PPC, | |||
| FLAC__CPUINFO_TYPE_UNKNOWN | |||
| } FLAC__CPUInfo_Type; | |||
| 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__CPUInfo_IA32; | |||
| typedef struct { | |||
| FLAC__bool altivec; | |||
| FLAC__bool ppc64; | |||
| } FLAC__CPUInfo_PPC; | |||
| typedef struct { | |||
| FLAC__bool use_asm; | |||
| FLAC__CPUInfo_Type type; | |||
| union { | |||
| FLAC__CPUInfo_IA32 ia32; | |||
| FLAC__CPUInfo_PPC ppc; | |||
| } data; | |||
| } FLAC__CPUInfo; | |||
| void FLAC__cpu_info(FLAC__CPUInfo *info); | |||
| #ifndef FLAC__NO_ASM | |||
| #ifdef FLAC__CPU_IA32 | |||
| #ifdef 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 | |||
| #endif | |||
| @@ -1,61 +1,61 @@ | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 Josh Coalson | |||
| * | |||
| * 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__CRC_H | |||
| #define FLAC__PRIVATE__CRC_H | |||
| #include "../../../ordinals.h" | |||
| /* 8 bit CRC generator, MSB shifted first | |||
| ** polynomial = x^8 + x^2 + x^1 + x^0 | |||
| ** init = 0 | |||
| */ | |||
| extern FLAC__byte const FLAC__crc8_table[256]; | |||
| #define FLAC__CRC8_UPDATE(data, crc) (crc) = FLAC__crc8_table[(crc) ^ (data)]; | |||
| void FLAC__crc8_update(const FLAC__byte data, FLAC__uint8 *crc); | |||
| void FLAC__crc8_update_block(const FLAC__byte *data, unsigned len, FLAC__uint8 *crc); | |||
| FLAC__uint8 FLAC__crc8(const FLAC__byte *data, unsigned len); | |||
| /* 16 bit CRC generator, MSB shifted first | |||
| ** polynomial = x^16 + x^15 + x^2 + x^0 | |||
| ** init = 0 | |||
| */ | |||
| extern unsigned FLAC__crc16_table[256]; | |||
| #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) | |||
| #endif | |||
| unsigned FLAC__crc16(const FLAC__byte *data, unsigned len); | |||
| #endif | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 Josh Coalson | |||
| * | |||
| * 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__CRC_H | |||
| #define FLAC__PRIVATE__CRC_H | |||
| #include "../../../ordinals.h" | |||
| /* 8 bit CRC generator, MSB shifted first | |||
| ** polynomial = x^8 + x^2 + x^1 + x^0 | |||
| ** init = 0 | |||
| */ | |||
| extern FLAC__byte const FLAC__crc8_table[256]; | |||
| #define FLAC__CRC8_UPDATE(data, crc) (crc) = FLAC__crc8_table[(crc) ^ (data)]; | |||
| void FLAC__crc8_update(const FLAC__byte data, FLAC__uint8 *crc); | |||
| void FLAC__crc8_update_block(const FLAC__byte *data, unsigned len, FLAC__uint8 *crc); | |||
| FLAC__uint8 FLAC__crc8(const FLAC__byte *data, unsigned len); | |||
| /* 16 bit CRC generator, MSB shifted first | |||
| ** polynomial = x^16 + x^15 + x^2 + x^0 | |||
| ** init = 0 | |||
| */ | |||
| extern unsigned FLAC__crc16_table[256]; | |||
| #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) | |||
| #endif | |||
| unsigned FLAC__crc16(const FLAC__byte *data, unsigned len); | |||
| #endif | |||
| @@ -1,97 +1,97 @@ | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 Josh Coalson | |||
| * | |||
| * 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__FIXED_H | |||
| #define FLAC__PRIVATE__FIXED_H | |||
| #ifdef HAVE_CONFIG_H | |||
| #include <config.h> | |||
| #endif | |||
| #include "float.h" | |||
| #include "format.h" | |||
| /* | |||
| * FLAC__fixed_compute_best_predictor() | |||
| * -------------------------------------------------------------------- | |||
| * Compute the best fixed predictor and the expected bits-per-sample | |||
| * of the residual signal for each order. The _wide() version uses | |||
| * 64-bit integers which is statistically necessary when bits-per- | |||
| * sample + log2(blocksize) > 30 | |||
| * | |||
| * IN data[0,data_len-1] | |||
| * IN data_len | |||
| * OUT residual_bits_per_sample[0,FLAC__MAX_FIXED_ORDER] | |||
| */ | |||
| #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]); | |||
| # 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]); | |||
| # endif | |||
| # 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]); | |||
| #endif | |||
| /* | |||
| * FLAC__fixed_compute_residual() | |||
| * -------------------------------------------------------------------- | |||
| * Compute the residual signal obtained from sutracting the predicted | |||
| * signal from the original. | |||
| * | |||
| * IN data[-order,data_len-1] original signal (NOTE THE INDICES!) | |||
| * IN data_len length of original signal | |||
| * IN order <= FLAC__MAX_FIXED_ORDER fixed-predictor order | |||
| * OUT residual[0,data_len-1] residual signal | |||
| */ | |||
| void FLAC__fixed_compute_residual(const FLAC__int32 data[], unsigned data_len, unsigned order, FLAC__int32 residual[]); | |||
| /* | |||
| * FLAC__fixed_restore_signal() | |||
| * -------------------------------------------------------------------- | |||
| * Restore the original signal by summing the residual and the | |||
| * predictor. | |||
| * | |||
| * IN residual[0,data_len-1] residual signal | |||
| * IN data_len length of original signal | |||
| * IN order <= FLAC__MAX_FIXED_ORDER fixed-predictor order | |||
| * *** IMPORTANT: the caller must pass in the historical samples: | |||
| * IN data[-order,-1] previously-reconstructed historical samples | |||
| * OUT data[0,data_len-1] original signal | |||
| */ | |||
| void FLAC__fixed_restore_signal(const FLAC__int32 residual[], unsigned data_len, unsigned order, FLAC__int32 data[]); | |||
| #endif | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 Josh Coalson | |||
| * | |||
| * 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__FIXED_H | |||
| #define FLAC__PRIVATE__FIXED_H | |||
| #ifdef HAVE_CONFIG_H | |||
| #include <config.h> | |||
| #endif | |||
| #include "float.h" | |||
| #include "format.h" | |||
| /* | |||
| * FLAC__fixed_compute_best_predictor() | |||
| * -------------------------------------------------------------------- | |||
| * Compute the best fixed predictor and the expected bits-per-sample | |||
| * of the residual signal for each order. The _wide() version uses | |||
| * 64-bit integers which is statistically necessary when bits-per- | |||
| * sample + log2(blocksize) > 30 | |||
| * | |||
| * IN data[0,data_len-1] | |||
| * IN data_len | |||
| * OUT residual_bits_per_sample[0,FLAC__MAX_FIXED_ORDER] | |||
| */ | |||
| #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]); | |||
| # 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]); | |||
| # endif | |||
| # 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]); | |||
| #endif | |||
| /* | |||
| * FLAC__fixed_compute_residual() | |||
| * -------------------------------------------------------------------- | |||
| * Compute the residual signal obtained from sutracting the predicted | |||
| * signal from the original. | |||
| * | |||
| * IN data[-order,data_len-1] original signal (NOTE THE INDICES!) | |||
| * IN data_len length of original signal | |||
| * IN order <= FLAC__MAX_FIXED_ORDER fixed-predictor order | |||
| * OUT residual[0,data_len-1] residual signal | |||
| */ | |||
| void FLAC__fixed_compute_residual(const FLAC__int32 data[], unsigned data_len, unsigned order, FLAC__int32 residual[]); | |||
| /* | |||
| * FLAC__fixed_restore_signal() | |||
| * -------------------------------------------------------------------- | |||
| * Restore the original signal by summing the residual and the | |||
| * predictor. | |||
| * | |||
| * IN residual[0,data_len-1] residual signal | |||
| * IN data_len length of original signal | |||
| * IN order <= FLAC__MAX_FIXED_ORDER fixed-predictor order | |||
| * *** IMPORTANT: the caller must pass in the historical samples: | |||
| * IN data[-order,-1] previously-reconstructed historical samples | |||
| * OUT data[0,data_len-1] original signal | |||
| */ | |||
| void FLAC__fixed_restore_signal(const FLAC__int32 residual[], unsigned data_len, unsigned order, FLAC__int32 data[]); | |||
| #endif | |||
| @@ -1,97 +1,97 @@ | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2004,2005,2006,2007 Josh Coalson | |||
| * | |||
| * 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__FLOAT_H | |||
| #define FLAC__PRIVATE__FLOAT_H | |||
| #ifdef HAVE_CONFIG_H | |||
| #include <config.h> | |||
| #endif | |||
| #include "../../../ordinals.h" | |||
| /* | |||
| * These typedefs make it easier to ensure that integer versions of | |||
| * the library really only contain integer operations. All the code | |||
| * in libFLAC should use FLAC__float and FLAC__double in place of | |||
| * float and double, and be protected by checks of the macro | |||
| * FLAC__INTEGER_ONLY_LIBRARY. | |||
| * | |||
| * FLAC__real is the basic floating point type used in LPC analysis. | |||
| */ | |||
| #ifndef FLAC__INTEGER_ONLY_LIBRARY | |||
| typedef double FLAC__double; | |||
| typedef float FLAC__float; | |||
| /* | |||
| * WATCHOUT: changing FLAC__real will change the signatures of many | |||
| * functions that have assembly language equivalents and break them. | |||
| */ | |||
| typedef float FLAC__real; | |||
| #else | |||
| /* | |||
| * The convention for FLAC__fixedpoint is to use the upper 16 bits | |||
| * for the integer part and lower 16 bits for the fractional part. | |||
| */ | |||
| typedef FLAC__int32 FLAC__fixedpoint; | |||
| extern const FLAC__fixedpoint FLAC__FP_ZERO; | |||
| extern const FLAC__fixedpoint FLAC__FP_ONE_HALF; | |||
| extern const FLAC__fixedpoint FLAC__FP_ONE; | |||
| extern const FLAC__fixedpoint FLAC__FP_LN2; | |||
| extern const FLAC__fixedpoint FLAC__FP_E; | |||
| #define FLAC__fixedpoint_trunc(x) ((x)>>16) | |||
| #define FLAC__fixedpoint_mul(x, y) ( (FLAC__fixedpoint) ( ((FLAC__int64)(x)*(FLAC__int64)(y)) >> 16 ) ) | |||
| #define FLAC__fixedpoint_div(x, y) ( (FLAC__fixedpoint) ( ( ((FLAC__int64)(x)<<32) / (FLAC__int64)(y) ) >> 16 ) ) | |||
| /* | |||
| * FLAC__fixedpoint_log2() | |||
| * -------------------------------------------------------------------- | |||
| * Returns the base-2 logarithm of the fixed-point number 'x' using an | |||
| * algorithm by Knuth for x >= 1.0 | |||
| * | |||
| * 'fracbits' is the number of fractional bits of 'x'. 'fracbits' must | |||
| * be < 32 and evenly divisible by 4 (0 is OK but not very precise). | |||
| * | |||
| * 'precision' roughly limits the number of iterations that are done; | |||
| * use (unsigned)(-1) for maximum precision. | |||
| * | |||
| * If 'x' is less than one -- that is, x < (1<<fracbits) -- then this | |||
| * function will punt and return 0. | |||
| * | |||
| * The return value will also have 'fracbits' fractional bits. | |||
| */ | |||
| FLAC__uint32 FLAC__fixedpoint_log2(FLAC__uint32 x, unsigned fracbits, unsigned precision); | |||
| #endif | |||
| #endif | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2004,2005,2006,2007 Josh Coalson | |||
| * | |||
| * 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__FLOAT_H | |||
| #define FLAC__PRIVATE__FLOAT_H | |||
| #ifdef HAVE_CONFIG_H | |||
| #include <config.h> | |||
| #endif | |||
| #include "../../../ordinals.h" | |||
| /* | |||
| * These typedefs make it easier to ensure that integer versions of | |||
| * the library really only contain integer operations. All the code | |||
| * in libFLAC should use FLAC__float and FLAC__double in place of | |||
| * float and double, and be protected by checks of the macro | |||
| * FLAC__INTEGER_ONLY_LIBRARY. | |||
| * | |||
| * FLAC__real is the basic floating point type used in LPC analysis. | |||
| */ | |||
| #ifndef FLAC__INTEGER_ONLY_LIBRARY | |||
| typedef double FLAC__double; | |||
| typedef float FLAC__float; | |||
| /* | |||
| * WATCHOUT: changing FLAC__real will change the signatures of many | |||
| * functions that have assembly language equivalents and break them. | |||
| */ | |||
| typedef float FLAC__real; | |||
| #else | |||
| /* | |||
| * The convention for FLAC__fixedpoint is to use the upper 16 bits | |||
| * for the integer part and lower 16 bits for the fractional part. | |||
| */ | |||
| typedef FLAC__int32 FLAC__fixedpoint; | |||
| extern const FLAC__fixedpoint FLAC__FP_ZERO; | |||
| extern const FLAC__fixedpoint FLAC__FP_ONE_HALF; | |||
| extern const FLAC__fixedpoint FLAC__FP_ONE; | |||
| extern const FLAC__fixedpoint FLAC__FP_LN2; | |||
| extern const FLAC__fixedpoint FLAC__FP_E; | |||
| #define FLAC__fixedpoint_trunc(x) ((x)>>16) | |||
| #define FLAC__fixedpoint_mul(x, y) ( (FLAC__fixedpoint) ( ((FLAC__int64)(x)*(FLAC__int64)(y)) >> 16 ) ) | |||
| #define FLAC__fixedpoint_div(x, y) ( (FLAC__fixedpoint) ( ( ((FLAC__int64)(x)<<32) / (FLAC__int64)(y) ) >> 16 ) ) | |||
| /* | |||
| * FLAC__fixedpoint_log2() | |||
| * -------------------------------------------------------------------- | |||
| * Returns the base-2 logarithm of the fixed-point number 'x' using an | |||
| * algorithm by Knuth for x >= 1.0 | |||
| * | |||
| * 'fracbits' is the number of fractional bits of 'x'. 'fracbits' must | |||
| * be < 32 and evenly divisible by 4 (0 is OK but not very precise). | |||
| * | |||
| * 'precision' roughly limits the number of iterations that are done; | |||
| * use (unsigned)(-1) for maximum precision. | |||
| * | |||
| * If 'x' is less than one -- that is, x < (1<<fracbits) -- then this | |||
| * function will punt and return 0. | |||
| * | |||
| * The return value will also have 'fracbits' fractional bits. | |||
| */ | |||
| FLAC__uint32 FLAC__fixedpoint_log2(FLAC__uint32 x, unsigned fracbits, unsigned precision); | |||
| #endif | |||
| #endif | |||
| @@ -1,44 +1,44 @@ | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 Josh Coalson | |||
| * | |||
| * 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__FORMAT_H | |||
| #define FLAC__PRIVATE__FORMAT_H | |||
| #include "../../../format.h" | |||
| unsigned FLAC__format_get_max_rice_partition_order(unsigned blocksize, unsigned predictor_order); | |||
| unsigned FLAC__format_get_max_rice_partition_order_from_blocksize(unsigned blocksize); | |||
| unsigned FLAC__format_get_max_rice_partition_order_from_blocksize_limited_max_and_predictor_order(unsigned limit, unsigned blocksize, unsigned predictor_order); | |||
| void FLAC__format_entropy_coding_method_partitioned_rice_contents_init(FLAC__EntropyCodingMethod_PartitionedRiceContents *object); | |||
| void FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(FLAC__EntropyCodingMethod_PartitionedRiceContents *object); | |||
| FLAC__bool FLAC__format_entropy_coding_method_partitioned_rice_contents_ensure_size(FLAC__EntropyCodingMethod_PartitionedRiceContents *object, unsigned max_partition_order); | |||
| #endif | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 Josh Coalson | |||
| * | |||
| * 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__FORMAT_H | |||
| #define FLAC__PRIVATE__FORMAT_H | |||
| #include "../../../format.h" | |||
| unsigned FLAC__format_get_max_rice_partition_order(unsigned blocksize, unsigned predictor_order); | |||
| unsigned FLAC__format_get_max_rice_partition_order_from_blocksize(unsigned blocksize); | |||
| unsigned FLAC__format_get_max_rice_partition_order_from_blocksize_limited_max_and_predictor_order(unsigned limit, unsigned blocksize, unsigned predictor_order); | |||
| void FLAC__format_entropy_coding_method_partitioned_rice_contents_init(FLAC__EntropyCodingMethod_PartitionedRiceContents *object); | |||
| void FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(FLAC__EntropyCodingMethod_PartitionedRiceContents *object); | |||
| FLAC__bool FLAC__format_entropy_coding_method_partitioned_rice_contents_ensure_size(FLAC__EntropyCodingMethod_PartitionedRiceContents *object, unsigned max_partition_order); | |||
| #endif | |||
| @@ -1,214 +1,214 @@ | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 Josh Coalson | |||
| * | |||
| * 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__LPC_H | |||
| #define FLAC__PRIVATE__LPC_H | |||
| #ifdef HAVE_CONFIG_H | |||
| #include <config.h> | |||
| #endif | |||
| #include "float.h" | |||
| #include "../../../format.h" | |||
| #ifndef FLAC__INTEGER_ONLY_LIBRARY | |||
| /* | |||
| * FLAC__lpc_window_data() | |||
| * -------------------------------------------------------------------- | |||
| * Applies the given window to the data. | |||
| * OPT: asm implementation | |||
| * | |||
| * IN in[0,data_len-1] | |||
| * IN window[0,data_len-1] | |||
| * OUT out[0,lag-1] | |||
| * IN data_len | |||
| */ | |||
| void FLAC__lpc_window_data(const FLAC__int32 in[], const FLAC__real window[], FLAC__real out[], unsigned data_len); | |||
| /* | |||
| * FLAC__lpc_compute_autocorrelation() | |||
| * -------------------------------------------------------------------- | |||
| * Compute the autocorrelation for lags between 0 and lag-1. | |||
| * Assumes data[] outside of [0,data_len-1] == 0. | |||
| * Asserts that lag > 0. | |||
| * | |||
| * IN data[0,data_len-1] | |||
| * IN data_len | |||
| * IN 0 < lag <= data_len | |||
| * OUT autoc[0,lag-1] | |||
| */ | |||
| void FLAC__lpc_compute_autocorrelation(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]); | |||
| #ifndef FLAC__NO_ASM | |||
| # ifdef FLAC__CPU_IA32 | |||
| # ifdef FLAC__HAS_NASM | |||
| void FLAC__lpc_compute_autocorrelation_asm_ia32(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]); | |||
| 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[]); | |||
| # endif | |||
| # endif | |||
| #endif | |||
| /* | |||
| * FLAC__lpc_compute_lp_coefficients() | |||
| * -------------------------------------------------------------------- | |||
| * Computes LP coefficients for orders 1..max_order. | |||
| * Do not call if autoc[0] == 0.0. This means the signal is zero | |||
| * and there is no point in calculating a predictor. | |||
| * | |||
| * IN autoc[0,max_order] autocorrelation values | |||
| * IN 0 < max_order <= FLAC__MAX_LPC_ORDER max LP order to compute | |||
| * OUT lp_coeff[0,max_order-1][0,max_order-1] LP coefficients for each order | |||
| * *** IMPORTANT: | |||
| * *** lp_coeff[0,max_order-1][max_order,FLAC__MAX_LPC_ORDER-1] are untouched | |||
| * OUT error[0,max_order-1] error for each order (more | |||
| * specifically, the variance of | |||
| * the error signal times # of | |||
| * samples in the signal) | |||
| * | |||
| * Example: if max_order is 9, the LP coefficients for order 9 will be | |||
| * in lp_coeff[8][0,8], the LP coefficients for order 8 will be | |||
| * in lp_coeff[7][0,7], etc. | |||
| */ | |||
| void FLAC__lpc_compute_lp_coefficients(const FLAC__real autoc[], unsigned *max_order, FLAC__real lp_coeff[][FLAC__MAX_LPC_ORDER], FLAC__double error[]); | |||
| /* | |||
| * FLAC__lpc_quantize_coefficients() | |||
| * -------------------------------------------------------------------- | |||
| * Quantizes the LP coefficients. NOTE: precision + bits_per_sample | |||
| * must be less than 32 (sizeof(FLAC__int32)*8). | |||
| * | |||
| * IN lp_coeff[0,order-1] LP coefficients | |||
| * IN order LP order | |||
| * IN FLAC__MIN_QLP_COEFF_PRECISION < precision | |||
| * desired precision (in bits, including sign | |||
| * bit) of largest coefficient | |||
| * OUT qlp_coeff[0,order-1] quantized coefficients | |||
| * OUT shift # of bits to shift right to get approximated | |||
| * LP coefficients. NOTE: could be negative. | |||
| * RETURN 0 => quantization OK | |||
| * 1 => coefficients require too much shifting for *shift to | |||
| * fit in the LPC subframe header. 'shift' is unset. | |||
| * 2 => coefficients are all zero, which is bad. 'shift' is | |||
| * unset. | |||
| */ | |||
| int FLAC__lpc_quantize_coefficients(const FLAC__real lp_coeff[], unsigned order, unsigned precision, FLAC__int32 qlp_coeff[], int *shift); | |||
| /* | |||
| * FLAC__lpc_compute_residual_from_qlp_coefficients() | |||
| * -------------------------------------------------------------------- | |||
| * Compute the residual signal obtained from sutracting the predicted | |||
| * signal from the original. | |||
| * | |||
| * IN data[-order,data_len-1] original signal (NOTE THE INDICES!) | |||
| * IN data_len length of original signal | |||
| * IN qlp_coeff[0,order-1] quantized LP coefficients | |||
| * IN order > 0 LP order | |||
| * IN lp_quantization quantization of LP coefficients in bits | |||
| * OUT residual[0,data_len-1] residual signal | |||
| */ | |||
| 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[]); | |||
| 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[]); | |||
| #ifndef FLAC__NO_ASM | |||
| # ifdef FLAC__CPU_IA32 | |||
| # 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[]); | |||
| # endif | |||
| # endif | |||
| #endif | |||
| #endif /* !defined FLAC__INTEGER_ONLY_LIBRARY */ | |||
| /* | |||
| * FLAC__lpc_restore_signal() | |||
| * -------------------------------------------------------------------- | |||
| * Restore the original signal by summing the residual and the | |||
| * predictor. | |||
| * | |||
| * IN residual[0,data_len-1] residual signal | |||
| * IN data_len length of original signal | |||
| * IN qlp_coeff[0,order-1] quantized LP coefficients | |||
| * IN order > 0 LP order | |||
| * IN lp_quantization quantization of LP coefficients in bits | |||
| * *** IMPORTANT: the caller must pass in the historical samples: | |||
| * IN data[-order,-1] previously-reconstructed historical samples | |||
| * OUT data[0,data_len-1] original signal | |||
| */ | |||
| 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_wide(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]); | |||
| #ifndef FLAC__NO_ASM | |||
| # ifdef FLAC__CPU_IA32 | |||
| # 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[]); | |||
| # 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__NO_ASM */ | |||
| #ifndef FLAC__INTEGER_ONLY_LIBRARY | |||
| /* | |||
| * FLAC__lpc_compute_expected_bits_per_residual_sample() | |||
| * -------------------------------------------------------------------- | |||
| * Compute the expected number of bits per residual signal sample | |||
| * based on the LP error (which is related to the residual variance). | |||
| * | |||
| * IN lpc_error >= 0.0 error returned from calculating LP coefficients | |||
| * IN total_samples > 0 # of samples in residual signal | |||
| * RETURN expected bits per sample | |||
| */ | |||
| FLAC__double FLAC__lpc_compute_expected_bits_per_residual_sample(FLAC__double lpc_error, unsigned total_samples); | |||
| FLAC__double FLAC__lpc_compute_expected_bits_per_residual_sample_with_error_scale(FLAC__double lpc_error, FLAC__double error_scale); | |||
| /* | |||
| * FLAC__lpc_compute_best_order() | |||
| * -------------------------------------------------------------------- | |||
| * Compute the best order from the array of signal errors returned | |||
| * during coefficient computation. | |||
| * | |||
| * IN lpc_error[0,max_order-1] >= 0.0 error returned from calculating LP coefficients | |||
| * IN max_order > 0 max LP order | |||
| * IN total_samples > 0 # of samples in residual signal | |||
| * IN overhead_bits_per_order # of bits overhead for each increased LP order | |||
| * (includes warmup sample size and quantized LP coefficient) | |||
| * RETURN [1,max_order] best order | |||
| */ | |||
| unsigned FLAC__lpc_compute_best_order(const FLAC__double lpc_error[], unsigned max_order, unsigned total_samples, unsigned overhead_bits_per_order); | |||
| #endif /* !defined FLAC__INTEGER_ONLY_LIBRARY */ | |||
| #endif | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 Josh Coalson | |||
| * | |||
| * 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__LPC_H | |||
| #define FLAC__PRIVATE__LPC_H | |||
| #ifdef HAVE_CONFIG_H | |||
| #include <config.h> | |||
| #endif | |||
| #include "float.h" | |||
| #include "../../../format.h" | |||
| #ifndef FLAC__INTEGER_ONLY_LIBRARY | |||
| /* | |||
| * FLAC__lpc_window_data() | |||
| * -------------------------------------------------------------------- | |||
| * Applies the given window to the data. | |||
| * OPT: asm implementation | |||
| * | |||
| * IN in[0,data_len-1] | |||
| * IN window[0,data_len-1] | |||
| * OUT out[0,lag-1] | |||
| * IN data_len | |||
| */ | |||
| void FLAC__lpc_window_data(const FLAC__int32 in[], const FLAC__real window[], FLAC__real out[], unsigned data_len); | |||
| /* | |||
| * FLAC__lpc_compute_autocorrelation() | |||
| * -------------------------------------------------------------------- | |||
| * Compute the autocorrelation for lags between 0 and lag-1. | |||
| * Assumes data[] outside of [0,data_len-1] == 0. | |||
| * Asserts that lag > 0. | |||
| * | |||
| * IN data[0,data_len-1] | |||
| * IN data_len | |||
| * IN 0 < lag <= data_len | |||
| * OUT autoc[0,lag-1] | |||
| */ | |||
| void FLAC__lpc_compute_autocorrelation(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]); | |||
| #ifndef FLAC__NO_ASM | |||
| # ifdef FLAC__CPU_IA32 | |||
| # ifdef FLAC__HAS_NASM | |||
| void FLAC__lpc_compute_autocorrelation_asm_ia32(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]); | |||
| 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[]); | |||
| # endif | |||
| # endif | |||
| #endif | |||
| /* | |||
| * FLAC__lpc_compute_lp_coefficients() | |||
| * -------------------------------------------------------------------- | |||
| * Computes LP coefficients for orders 1..max_order. | |||
| * Do not call if autoc[0] == 0.0. This means the signal is zero | |||
| * and there is no point in calculating a predictor. | |||
| * | |||
| * IN autoc[0,max_order] autocorrelation values | |||
| * IN 0 < max_order <= FLAC__MAX_LPC_ORDER max LP order to compute | |||
| * OUT lp_coeff[0,max_order-1][0,max_order-1] LP coefficients for each order | |||
| * *** IMPORTANT: | |||
| * *** lp_coeff[0,max_order-1][max_order,FLAC__MAX_LPC_ORDER-1] are untouched | |||
| * OUT error[0,max_order-1] error for each order (more | |||
| * specifically, the variance of | |||
| * the error signal times # of | |||
| * samples in the signal) | |||
| * | |||
| * Example: if max_order is 9, the LP coefficients for order 9 will be | |||
| * in lp_coeff[8][0,8], the LP coefficients for order 8 will be | |||
| * in lp_coeff[7][0,7], etc. | |||
| */ | |||
| void FLAC__lpc_compute_lp_coefficients(const FLAC__real autoc[], unsigned *max_order, FLAC__real lp_coeff[][FLAC__MAX_LPC_ORDER], FLAC__double error[]); | |||
| /* | |||
| * FLAC__lpc_quantize_coefficients() | |||
| * -------------------------------------------------------------------- | |||
| * Quantizes the LP coefficients. NOTE: precision + bits_per_sample | |||
| * must be less than 32 (sizeof(FLAC__int32)*8). | |||
| * | |||
| * IN lp_coeff[0,order-1] LP coefficients | |||
| * IN order LP order | |||
| * IN FLAC__MIN_QLP_COEFF_PRECISION < precision | |||
| * desired precision (in bits, including sign | |||
| * bit) of largest coefficient | |||
| * OUT qlp_coeff[0,order-1] quantized coefficients | |||
| * OUT shift # of bits to shift right to get approximated | |||
| * LP coefficients. NOTE: could be negative. | |||
| * RETURN 0 => quantization OK | |||
| * 1 => coefficients require too much shifting for *shift to | |||
| * fit in the LPC subframe header. 'shift' is unset. | |||
| * 2 => coefficients are all zero, which is bad. 'shift' is | |||
| * unset. | |||
| */ | |||
| int FLAC__lpc_quantize_coefficients(const FLAC__real lp_coeff[], unsigned order, unsigned precision, FLAC__int32 qlp_coeff[], int *shift); | |||
| /* | |||
| * FLAC__lpc_compute_residual_from_qlp_coefficients() | |||
| * -------------------------------------------------------------------- | |||
| * Compute the residual signal obtained from sutracting the predicted | |||
| * signal from the original. | |||
| * | |||
| * IN data[-order,data_len-1] original signal (NOTE THE INDICES!) | |||
| * IN data_len length of original signal | |||
| * IN qlp_coeff[0,order-1] quantized LP coefficients | |||
| * IN order > 0 LP order | |||
| * IN lp_quantization quantization of LP coefficients in bits | |||
| * OUT residual[0,data_len-1] residual signal | |||
| */ | |||
| 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[]); | |||
| 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[]); | |||
| #ifndef FLAC__NO_ASM | |||
| # ifdef FLAC__CPU_IA32 | |||
| # 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[]); | |||
| # endif | |||
| # endif | |||
| #endif | |||
| #endif /* !defined FLAC__INTEGER_ONLY_LIBRARY */ | |||
| /* | |||
| * FLAC__lpc_restore_signal() | |||
| * -------------------------------------------------------------------- | |||
| * Restore the original signal by summing the residual and the | |||
| * predictor. | |||
| * | |||
| * IN residual[0,data_len-1] residual signal | |||
| * IN data_len length of original signal | |||
| * IN qlp_coeff[0,order-1] quantized LP coefficients | |||
| * IN order > 0 LP order | |||
| * IN lp_quantization quantization of LP coefficients in bits | |||
| * *** IMPORTANT: the caller must pass in the historical samples: | |||
| * IN data[-order,-1] previously-reconstructed historical samples | |||
| * OUT data[0,data_len-1] original signal | |||
| */ | |||
| 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_wide(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]); | |||
| #ifndef FLAC__NO_ASM | |||
| # ifdef FLAC__CPU_IA32 | |||
| # 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[]); | |||
| # 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__NO_ASM */ | |||
| #ifndef FLAC__INTEGER_ONLY_LIBRARY | |||
| /* | |||
| * FLAC__lpc_compute_expected_bits_per_residual_sample() | |||
| * -------------------------------------------------------------------- | |||
| * Compute the expected number of bits per residual signal sample | |||
| * based on the LP error (which is related to the residual variance). | |||
| * | |||
| * IN lpc_error >= 0.0 error returned from calculating LP coefficients | |||
| * IN total_samples > 0 # of samples in residual signal | |||
| * RETURN expected bits per sample | |||
| */ | |||
| FLAC__double FLAC__lpc_compute_expected_bits_per_residual_sample(FLAC__double lpc_error, unsigned total_samples); | |||
| FLAC__double FLAC__lpc_compute_expected_bits_per_residual_sample_with_error_scale(FLAC__double lpc_error, FLAC__double error_scale); | |||
| /* | |||
| * FLAC__lpc_compute_best_order() | |||
| * -------------------------------------------------------------------- | |||
| * Compute the best order from the array of signal errors returned | |||
| * during coefficient computation. | |||
| * | |||
| * IN lpc_error[0,max_order-1] >= 0.0 error returned from calculating LP coefficients | |||
| * IN max_order > 0 max LP order | |||
| * IN total_samples > 0 # of samples in residual signal | |||
| * IN overhead_bits_per_order # of bits overhead for each increased LP order | |||
| * (includes warmup sample size and quantized LP coefficient) | |||
| * RETURN [1,max_order] best order | |||
| */ | |||
| unsigned FLAC__lpc_compute_best_order(const FLAC__double lpc_error[], unsigned max_order, unsigned total_samples, unsigned overhead_bits_per_order); | |||
| #endif /* !defined FLAC__INTEGER_ONLY_LIBRARY */ | |||
| #endif | |||
| @@ -1,44 +1,44 @@ | |||
| #ifndef FLAC__PRIVATE__MD5_H | |||
| #define FLAC__PRIVATE__MD5_H | |||
| /* | |||
| * This is the header file for the MD5 message-digest algorithm. | |||
| * The algorithm is due to Ron Rivest. This code was | |||
| * written by Colin Plumb in 1993, no copyright is claimed. | |||
| * This code is in the public domain; do with it what you wish. | |||
| * | |||
| * Equivalent code is available from RSA Data Security, Inc. | |||
| * This code has been tested against that, and is equivalent, | |||
| * except that you don't need to include two pages of legalese | |||
| * with every copy. | |||
| * | |||
| * To compute the message digest of a chunk of bytes, declare an | |||
| * MD5Context structure, pass it to MD5Init, call MD5Update as | |||
| * needed on buffers full of bytes, and then call MD5Final, which | |||
| * will fill a supplied 16-byte array with the digest. | |||
| * | |||
| * Changed so as no longer to depend on Colin Plumb's `usual.h' | |||
| * header definitions; now uses stuff from dpkg's config.h | |||
| * - Ian Jackson <ijackson@nyx.cs.du.edu>. | |||
| * Still in the public domain. | |||
| * | |||
| * Josh Coalson: made some changes to integrate with libFLAC. | |||
| * Still in the public domain, with no warranty. | |||
| */ | |||
| #include "../../../ordinals.h" | |||
| typedef struct { | |||
| FLAC__uint32 in[16]; | |||
| FLAC__uint32 buf[4]; | |||
| FLAC__uint32 bytes[2]; | |||
| FLAC__byte *internal_buf; | |||
| size_t capacity; | |||
| } FLAC__MD5Context; | |||
| void FLAC__MD5Init(FLAC__MD5Context *context); | |||
| void FLAC__MD5Final(FLAC__byte digest[16], FLAC__MD5Context *context); | |||
| FLAC__bool FLAC__MD5Accumulate(FLAC__MD5Context *ctx, const FLAC__int32 * const signal[], unsigned channels, unsigned samples, unsigned bytes_per_sample); | |||
| #endif | |||
| #ifndef FLAC__PRIVATE__MD5_H | |||
| #define FLAC__PRIVATE__MD5_H | |||
| /* | |||
| * This is the header file for the MD5 message-digest algorithm. | |||
| * The algorithm is due to Ron Rivest. This code was | |||
| * written by Colin Plumb in 1993, no copyright is claimed. | |||
| * This code is in the public domain; do with it what you wish. | |||
| * | |||
| * Equivalent code is available from RSA Data Security, Inc. | |||
| * This code has been tested against that, and is equivalent, | |||
| * except that you don't need to include two pages of legalese | |||
| * with every copy. | |||
| * | |||
| * To compute the message digest of a chunk of bytes, declare an | |||
| * MD5Context structure, pass it to MD5Init, call MD5Update as | |||
| * needed on buffers full of bytes, and then call MD5Final, which | |||
| * will fill a supplied 16-byte array with the digest. | |||
| * | |||
| * Changed so as no longer to depend on Colin Plumb's `usual.h' | |||
| * header definitions; now uses stuff from dpkg's config.h | |||
| * - Ian Jackson <ijackson@nyx.cs.du.edu>. | |||
| * Still in the public domain. | |||
| * | |||
| * Josh Coalson: made some changes to integrate with libFLAC. | |||
| * Still in the public domain, with no warranty. | |||
| */ | |||
| #include "../../../ordinals.h" | |||
| typedef struct { | |||
| FLAC__uint32 in[16]; | |||
| FLAC__uint32 buf[4]; | |||
| FLAC__uint32 bytes[2]; | |||
| FLAC__byte *internal_buf; | |||
| size_t capacity; | |||
| } FLAC__MD5Context; | |||
| void FLAC__MD5Init(FLAC__MD5Context *context); | |||
| void FLAC__MD5Final(FLAC__byte digest[16], FLAC__MD5Context *context); | |||
| FLAC__bool FLAC__MD5Accumulate(FLAC__MD5Context *ctx, const FLAC__int32 * const signal[], unsigned channels, unsigned samples, unsigned bytes_per_sample); | |||
| #endif | |||
| @@ -1,56 +1,56 @@ | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2001,2002,2003,2004,2005,2006,2007 Josh Coalson | |||
| * | |||
| * 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__MEMORY_H | |||
| #define FLAC__PRIVATE__MEMORY_H | |||
| #ifdef HAVE_CONFIG_H | |||
| #include <config.h> | |||
| #endif | |||
| #include <stdlib.h> /* for size_t */ | |||
| #include "float.h" | |||
| #include "../../../ordinals.h" /* for FLAC__bool */ | |||
| /* Returns the unaligned address returned by malloc. | |||
| * Use free() on this address to deallocate. | |||
| */ | |||
| void *FLAC__memory_alloc_aligned(size_t bytes, void **aligned_address); | |||
| FLAC__bool FLAC__memory_alloc_aligned_int32_array(unsigned elements, FLAC__int32 **unaligned_pointer, FLAC__int32 **aligned_pointer); | |||
| FLAC__bool FLAC__memory_alloc_aligned_uint32_array(unsigned elements, FLAC__uint32 **unaligned_pointer, FLAC__uint32 **aligned_pointer); | |||
| FLAC__bool FLAC__memory_alloc_aligned_uint64_array(unsigned elements, FLAC__uint64 **unaligned_pointer, FLAC__uint64 **aligned_pointer); | |||
| FLAC__bool FLAC__memory_alloc_aligned_unsigned_array(unsigned elements, unsigned **unaligned_pointer, unsigned **aligned_pointer); | |||
| #ifndef FLAC__INTEGER_ONLY_LIBRARY | |||
| FLAC__bool FLAC__memory_alloc_aligned_real_array(unsigned elements, FLAC__real **unaligned_pointer, FLAC__real **aligned_pointer); | |||
| #endif | |||
| #endif | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2001,2002,2003,2004,2005,2006,2007 Josh Coalson | |||
| * | |||
| * 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__MEMORY_H | |||
| #define FLAC__PRIVATE__MEMORY_H | |||
| #ifdef HAVE_CONFIG_H | |||
| #include <config.h> | |||
| #endif | |||
| #include <stdlib.h> /* for size_t */ | |||
| #include "float.h" | |||
| #include "../../../ordinals.h" /* for FLAC__bool */ | |||
| /* Returns the unaligned address returned by malloc. | |||
| * Use free() on this address to deallocate. | |||
| */ | |||
| void *FLAC__memory_alloc_aligned(size_t bytes, void **aligned_address); | |||
| FLAC__bool FLAC__memory_alloc_aligned_int32_array(unsigned elements, FLAC__int32 **unaligned_pointer, FLAC__int32 **aligned_pointer); | |||
| FLAC__bool FLAC__memory_alloc_aligned_uint32_array(unsigned elements, FLAC__uint32 **unaligned_pointer, FLAC__uint32 **aligned_pointer); | |||
| FLAC__bool FLAC__memory_alloc_aligned_uint64_array(unsigned elements, FLAC__uint64 **unaligned_pointer, FLAC__uint64 **aligned_pointer); | |||
| FLAC__bool FLAC__memory_alloc_aligned_unsigned_array(unsigned elements, unsigned **unaligned_pointer, unsigned **aligned_pointer); | |||
| #ifndef FLAC__INTEGER_ONLY_LIBRARY | |||
| FLAC__bool FLAC__memory_alloc_aligned_real_array(unsigned elements, FLAC__real **unaligned_pointer, FLAC__real **aligned_pointer); | |||
| #endif | |||
| #endif | |||
| @@ -1,45 +1,45 @@ | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2002,2003,2004,2005,2006,2007 Josh Coalson | |||
| * | |||
| * 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__METADATA_H | |||
| #define FLAC__PRIVATE__METADATA_H | |||
| #include "FLAC/metadata.h" | |||
| /* WATCHOUT: all malloc()ed data in the block is free()ed; this may not | |||
| * be a consistent state (e.g. PICTURE) or equivalent to the initial | |||
| * state after FLAC__metadata_object_new() | |||
| */ | |||
| void FLAC__metadata_object_delete_data(FLAC__StreamMetadata *object); | |||
| void FLAC__metadata_object_cuesheet_track_delete_data(FLAC__StreamMetadata_CueSheet_Track *object); | |||
| #endif | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2002,2003,2004,2005,2006,2007 Josh Coalson | |||
| * | |||
| * 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__METADATA_H | |||
| #define FLAC__PRIVATE__METADATA_H | |||
| #include "metadata.h" | |||
| /* WATCHOUT: all malloc()ed data in the block is free()ed; this may not | |||
| * be a consistent state (e.g. PICTURE) or equivalent to the initial | |||
| * state after FLAC__metadata_object_new() | |||
| */ | |||
| void FLAC__metadata_object_delete_data(FLAC__StreamMetadata *object); | |||
| void FLAC__metadata_object_cuesheet_track_delete_data(FLAC__StreamMetadata_CueSheet_Track *object); | |||
| #endif | |||
| @@ -1,45 +1,45 @@ | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 Josh Coalson | |||
| * | |||
| * 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_FRAMING_H | |||
| #define FLAC__PRIVATE__STREAM_ENCODER_FRAMING_H | |||
| #include "../../../format.h" | |||
| #include "bitwriter.h" | |||
| FLAC__bool FLAC__add_metadata_block(const FLAC__StreamMetadata *metadata, FLAC__BitWriter *bw); | |||
| FLAC__bool FLAC__frame_add_header(const FLAC__FrameHeader *header, FLAC__BitWriter *bw); | |||
| FLAC__bool FLAC__subframe_add_constant(const FLAC__Subframe_Constant *subframe, unsigned subframe_bps, unsigned wasted_bits, FLAC__BitWriter *bw); | |||
| FLAC__bool FLAC__subframe_add_fixed(const FLAC__Subframe_Fixed *subframe, unsigned residual_samples, unsigned subframe_bps, unsigned wasted_bits, FLAC__BitWriter *bw); | |||
| FLAC__bool FLAC__subframe_add_lpc(const FLAC__Subframe_LPC *subframe, unsigned residual_samples, unsigned subframe_bps, unsigned wasted_bits, FLAC__BitWriter *bw); | |||
| FLAC__bool FLAC__subframe_add_verbatim(const FLAC__Subframe_Verbatim *subframe, unsigned samples, unsigned subframe_bps, unsigned wasted_bits, FLAC__BitWriter *bw); | |||
| #endif | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 Josh Coalson | |||
| * | |||
| * 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_FRAMING_H | |||
| #define FLAC__PRIVATE__STREAM_ENCODER_FRAMING_H | |||
| #include "../../../format.h" | |||
| #include "bitwriter.h" | |||
| FLAC__bool FLAC__add_metadata_block(const FLAC__StreamMetadata *metadata, FLAC__BitWriter *bw); | |||
| FLAC__bool FLAC__frame_add_header(const FLAC__FrameHeader *header, FLAC__BitWriter *bw); | |||
| FLAC__bool FLAC__subframe_add_constant(const FLAC__Subframe_Constant *subframe, unsigned subframe_bps, unsigned wasted_bits, FLAC__BitWriter *bw); | |||
| FLAC__bool FLAC__subframe_add_fixed(const FLAC__Subframe_Fixed *subframe, unsigned residual_samples, unsigned subframe_bps, unsigned wasted_bits, FLAC__BitWriter *bw); | |||
| FLAC__bool FLAC__subframe_add_lpc(const FLAC__Subframe_LPC *subframe, unsigned residual_samples, unsigned subframe_bps, unsigned wasted_bits, FLAC__BitWriter *bw); | |||
| FLAC__bool FLAC__subframe_add_verbatim(const FLAC__Subframe_Verbatim *subframe, unsigned samples, unsigned subframe_bps, unsigned wasted_bits, FLAC__BitWriter *bw); | |||
| #endif | |||
| @@ -1,71 +1,71 @@ | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2006,2007 Josh Coalson | |||
| * | |||
| * 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__WINDOW_H | |||
| #define FLAC__PRIVATE__WINDOW_H | |||
| #ifdef HAVE_CONFIG_H | |||
| #include <config.h> | |||
| #endif | |||
| #include "float.h" | |||
| #include "../../../format.h" | |||
| #ifndef FLAC__INTEGER_ONLY_LIBRARY | |||
| /* | |||
| * FLAC__window_*() | |||
| * -------------------------------------------------------------------- | |||
| * Calculates window coefficients according to different apodization | |||
| * functions. | |||
| * | |||
| * OUT window[0,L-1] | |||
| * IN L (number of points in window) | |||
| */ | |||
| void FLAC__window_bartlett(FLAC__real *window, const FLAC__int32 L); | |||
| void FLAC__window_bartlett_hann(FLAC__real *window, const FLAC__int32 L); | |||
| void FLAC__window_blackman(FLAC__real *window, const FLAC__int32 L); | |||
| void FLAC__window_blackman_harris_4term_92db_sidelobe(FLAC__real *window, const FLAC__int32 L); | |||
| void FLAC__window_connes(FLAC__real *window, const FLAC__int32 L); | |||
| void FLAC__window_flattop(FLAC__real *window, const FLAC__int32 L); | |||
| void FLAC__window_gauss(FLAC__real *window, const FLAC__int32 L, const FLAC__real stddev); /* 0.0 < stddev <= 0.5 */ | |||
| void FLAC__window_hamming(FLAC__real *window, const FLAC__int32 L); | |||
| void FLAC__window_hann(FLAC__real *window, const FLAC__int32 L); | |||
| void FLAC__window_kaiser_bessel(FLAC__real *window, const FLAC__int32 L); | |||
| 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_welch(FLAC__real *window, const FLAC__int32 L); | |||
| #endif /* !defined FLAC__INTEGER_ONLY_LIBRARY */ | |||
| #endif | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2006,2007 Josh Coalson | |||
| * | |||
| * 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__WINDOW_H | |||
| #define FLAC__PRIVATE__WINDOW_H | |||
| #ifdef HAVE_CONFIG_H | |||
| #include <config.h> | |||
| #endif | |||
| #include "float.h" | |||
| #include "../../../format.h" | |||
| #ifndef FLAC__INTEGER_ONLY_LIBRARY | |||
| /* | |||
| * FLAC__window_*() | |||
| * -------------------------------------------------------------------- | |||
| * Calculates window coefficients according to different apodization | |||
| * functions. | |||
| * | |||
| * OUT window[0,L-1] | |||
| * IN L (number of points in window) | |||
| */ | |||
| void FLAC__window_bartlett(FLAC__real *window, const FLAC__int32 L); | |||
| void FLAC__window_bartlett_hann(FLAC__real *window, const FLAC__int32 L); | |||
| void FLAC__window_blackman(FLAC__real *window, const FLAC__int32 L); | |||
| void FLAC__window_blackman_harris_4term_92db_sidelobe(FLAC__real *window, const FLAC__int32 L); | |||
| void FLAC__window_connes(FLAC__real *window, const FLAC__int32 L); | |||
| void FLAC__window_flattop(FLAC__real *window, const FLAC__int32 L); | |||
| void FLAC__window_gauss(FLAC__real *window, const FLAC__int32 L, const FLAC__real stddev); /* 0.0 < stddev <= 0.5 */ | |||
| void FLAC__window_hamming(FLAC__real *window, const FLAC__int32 L); | |||
| void FLAC__window_hann(FLAC__real *window, const FLAC__int32 L); | |||
| void FLAC__window_kaiser_bessel(FLAC__real *window, const FLAC__int32 L); | |||
| 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_welch(FLAC__real *window, const FLAC__int32 L); | |||
| #endif /* !defined FLAC__INTEGER_ONLY_LIBRARY */ | |||
| #endif | |||
| @@ -1,38 +1,38 @@ | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2001,2002,2003,2004,2005,2006,2007 Josh Coalson | |||
| * | |||
| * 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__PROTECTED__ALL_H | |||
| #define FLAC__PROTECTED__ALL_H | |||
| #include "stream_decoder.h" | |||
| #include "stream_encoder.h" | |||
| #endif | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2001,2002,2003,2004,2005,2006,2007 Josh Coalson | |||
| * | |||
| * 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__PROTECTED__ALL_H | |||
| #define FLAC__PROTECTED__ALL_H | |||
| #include "stream_decoder.h" | |||
| #include "stream_encoder.h" | |||
| #endif | |||
| @@ -1,58 +1,58 @@ | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 Josh Coalson | |||
| * | |||
| * 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__PROTECTED__STREAM_DECODER_H | |||
| #define FLAC__PROTECTED__STREAM_DECODER_H | |||
| #include "../../../stream_decoder.h" | |||
| #if FLAC__HAS_OGG | |||
| #include "include/private/ogg_decoder_aspect.h" | |||
| #endif | |||
| typedef struct FLAC__StreamDecoderProtected { | |||
| FLAC__StreamDecoderState state; | |||
| unsigned channels; | |||
| FLAC__ChannelAssignment channel_assignment; | |||
| unsigned bits_per_sample; | |||
| unsigned sample_rate; /* in Hz */ | |||
| unsigned blocksize; /* in samples (per channel) */ | |||
| FLAC__bool md5_checking; /* if true, generate MD5 signature of decoded data and compare against signature in the STREAMINFO metadata block */ | |||
| #if FLAC__HAS_OGG | |||
| FLAC__OggDecoderAspect ogg_decoder_aspect; | |||
| #endif | |||
| } FLAC__StreamDecoderProtected; | |||
| /* | |||
| * return the number of input bytes consumed | |||
| */ | |||
| unsigned FLAC__stream_decoder_get_input_bytes_unconsumed(const FLAC__StreamDecoder *decoder); | |||
| #endif | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 Josh Coalson | |||
| * | |||
| * 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__PROTECTED__STREAM_DECODER_H | |||
| #define FLAC__PROTECTED__STREAM_DECODER_H | |||
| #include "../../../stream_decoder.h" | |||
| #if FLAC__HAS_OGG | |||
| #include "include/private/ogg_decoder_aspect.h" | |||
| #endif | |||
| typedef struct FLAC__StreamDecoderProtected { | |||
| FLAC__StreamDecoderState state; | |||
| unsigned channels; | |||
| FLAC__ChannelAssignment channel_assignment; | |||
| unsigned bits_per_sample; | |||
| unsigned sample_rate; /* in Hz */ | |||
| unsigned blocksize; /* in samples (per channel) */ | |||
| FLAC__bool md5_checking; /* if true, generate MD5 signature of decoded data and compare against signature in the STREAMINFO metadata block */ | |||
| #if FLAC__HAS_OGG | |||
| FLAC__OggDecoderAspect ogg_decoder_aspect; | |||
| #endif | |||
| } FLAC__StreamDecoderProtected; | |||
| /* | |||
| * return the number of input bytes consumed | |||
| */ | |||
| unsigned FLAC__stream_decoder_get_input_bytes_unconsumed(const FLAC__StreamDecoder *decoder); | |||
| #endif | |||
| @@ -1,110 +1,110 @@ | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2001,2002,2003,2004,2005,2006,2007 Josh Coalson | |||
| * | |||
| * 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__PROTECTED__STREAM_ENCODER_H | |||
| #define FLAC__PROTECTED__STREAM_ENCODER_H | |||
| #include "../../../stream_encoder.h" | |||
| #if FLAC__HAS_OGG | |||
| #include "private/ogg_encoder_aspect.h" | |||
| #endif | |||
| #ifndef FLAC__INTEGER_ONLY_LIBRARY | |||
| #include "../private/float.h" | |||
| #define FLAC__MAX_APODIZATION_FUNCTIONS 32 | |||
| typedef enum { | |||
| FLAC__APODIZATION_BARTLETT, | |||
| FLAC__APODIZATION_BARTLETT_HANN, | |||
| FLAC__APODIZATION_BLACKMAN, | |||
| FLAC__APODIZATION_BLACKMAN_HARRIS_4TERM_92DB_SIDELOBE, | |||
| FLAC__APODIZATION_CONNES, | |||
| FLAC__APODIZATION_FLATTOP, | |||
| FLAC__APODIZATION_GAUSS, | |||
| FLAC__APODIZATION_HAMMING, | |||
| FLAC__APODIZATION_HANN, | |||
| FLAC__APODIZATION_KAISER_BESSEL, | |||
| FLAC__APODIZATION_NUTTALL, | |||
| FLAC__APODIZATION_RECTANGLE, | |||
| FLAC__APODIZATION_TRIANGLE, | |||
| FLAC__APODIZATION_TUKEY, | |||
| FLAC__APODIZATION_WELCH | |||
| } FLAC__ApodizationFunction; | |||
| typedef struct { | |||
| FLAC__ApodizationFunction type; | |||
| union { | |||
| struct { | |||
| FLAC__real stddev; | |||
| } gauss; | |||
| struct { | |||
| FLAC__real p; | |||
| } tukey; | |||
| } parameters; | |||
| } FLAC__ApodizationSpecification; | |||
| #endif // #ifndef FLAC__INTEGER_ONLY_LIBRARY | |||
| typedef struct FLAC__StreamEncoderProtected { | |||
| FLAC__StreamEncoderState state; | |||
| FLAC__bool verify; | |||
| FLAC__bool streamable_subset; | |||
| FLAC__bool do_md5; | |||
| FLAC__bool do_mid_side_stereo; | |||
| FLAC__bool loose_mid_side_stereo; | |||
| unsigned channels; | |||
| unsigned bits_per_sample; | |||
| unsigned sample_rate; | |||
| unsigned blocksize; | |||
| #ifndef FLAC__INTEGER_ONLY_LIBRARY | |||
| unsigned num_apodizations; | |||
| FLAC__ApodizationSpecification apodizations[FLAC__MAX_APODIZATION_FUNCTIONS]; | |||
| #endif | |||
| unsigned max_lpc_order; | |||
| unsigned qlp_coeff_precision; | |||
| FLAC__bool do_qlp_coeff_prec_search; | |||
| FLAC__bool do_exhaustive_model_search; | |||
| FLAC__bool do_escape_coding; | |||
| unsigned min_residual_partition_order; | |||
| unsigned max_residual_partition_order; | |||
| unsigned rice_parameter_search_dist; | |||
| FLAC__uint64 total_samples_estimate; | |||
| FLAC__StreamMetadata **metadata; | |||
| unsigned num_metadata_blocks; | |||
| FLAC__uint64 streaminfo_offset, seektable_offset, audio_offset; | |||
| #if FLAC__HAS_OGG | |||
| FLAC__OggEncoderAspect ogg_encoder_aspect; | |||
| #endif | |||
| } FLAC__StreamEncoderProtected; | |||
| #endif | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2001,2002,2003,2004,2005,2006,2007 Josh Coalson | |||
| * | |||
| * 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__PROTECTED__STREAM_ENCODER_H | |||
| #define FLAC__PROTECTED__STREAM_ENCODER_H | |||
| #include "../../../stream_encoder.h" | |||
| #if FLAC__HAS_OGG | |||
| #include "private/ogg_encoder_aspect.h" | |||
| #endif | |||
| #ifndef FLAC__INTEGER_ONLY_LIBRARY | |||
| #include "../private/float.h" | |||
| #define FLAC__MAX_APODIZATION_FUNCTIONS 32 | |||
| typedef enum { | |||
| FLAC__APODIZATION_BARTLETT, | |||
| FLAC__APODIZATION_BARTLETT_HANN, | |||
| FLAC__APODIZATION_BLACKMAN, | |||
| FLAC__APODIZATION_BLACKMAN_HARRIS_4TERM_92DB_SIDELOBE, | |||
| FLAC__APODIZATION_CONNES, | |||
| FLAC__APODIZATION_FLATTOP, | |||
| FLAC__APODIZATION_GAUSS, | |||
| FLAC__APODIZATION_HAMMING, | |||
| FLAC__APODIZATION_HANN, | |||
| FLAC__APODIZATION_KAISER_BESSEL, | |||
| FLAC__APODIZATION_NUTTALL, | |||
| FLAC__APODIZATION_RECTANGLE, | |||
| FLAC__APODIZATION_TRIANGLE, | |||
| FLAC__APODIZATION_TUKEY, | |||
| FLAC__APODIZATION_WELCH | |||
| } FLAC__ApodizationFunction; | |||
| typedef struct { | |||
| FLAC__ApodizationFunction type; | |||
| union { | |||
| struct { | |||
| FLAC__real stddev; | |||
| } gauss; | |||
| struct { | |||
| FLAC__real p; | |||
| } tukey; | |||
| } parameters; | |||
| } FLAC__ApodizationSpecification; | |||
| #endif // #ifndef FLAC__INTEGER_ONLY_LIBRARY | |||
| typedef struct FLAC__StreamEncoderProtected { | |||
| FLAC__StreamEncoderState state; | |||
| FLAC__bool verify; | |||
| FLAC__bool streamable_subset; | |||
| FLAC__bool do_md5; | |||
| FLAC__bool do_mid_side_stereo; | |||
| FLAC__bool loose_mid_side_stereo; | |||
| unsigned channels; | |||
| unsigned bits_per_sample; | |||
| unsigned sample_rate; | |||
| unsigned blocksize; | |||
| #ifndef FLAC__INTEGER_ONLY_LIBRARY | |||
| unsigned num_apodizations; | |||
| FLAC__ApodizationSpecification apodizations[FLAC__MAX_APODIZATION_FUNCTIONS]; | |||
| #endif | |||
| unsigned max_lpc_order; | |||
| unsigned qlp_coeff_precision; | |||
| FLAC__bool do_qlp_coeff_prec_search; | |||
| FLAC__bool do_exhaustive_model_search; | |||
| FLAC__bool do_escape_coding; | |||
| unsigned min_residual_partition_order; | |||
| unsigned max_residual_partition_order; | |||
| unsigned rice_parameter_search_dist; | |||
| FLAC__uint64 total_samples_estimate; | |||
| FLAC__StreamMetadata **metadata; | |||
| unsigned num_metadata_blocks; | |||
| FLAC__uint64 streaminfo_offset, seektable_offset, audio_offset; | |||
| #if FLAC__HAS_OGG | |||
| FLAC__OggEncoderAspect ogg_encoder_aspect; | |||
| #endif | |||
| } FLAC__StreamEncoderProtected; | |||
| #endif | |||
| @@ -2,430 +2,430 @@ | |||
| #include "juce_FlacHeader.h" | |||
| #if JUCE_USE_FLAC | |||
| #if HAVE_CONFIG_H | |||
| # include <config.h> | |||
| #endif | |||
| #include <stdlib.h> /* for malloc() */ | |||
| #include <string.h> /* for memcpy() */ | |||
| #include "include/private/md5.h" | |||
| #include "../alloc.h" | |||
| #ifndef FLaC__INLINE | |||
| #define FLaC__INLINE | |||
| #endif | |||
| /* | |||
| * This code implements the MD5 message-digest algorithm. | |||
| * The algorithm is due to Ron Rivest. This code was | |||
| * written by Colin Plumb in 1993, no copyright is claimed. | |||
| * This code is in the public domain; do with it what you wish. | |||
| * | |||
| * Equivalent code is available from RSA Data Security, Inc. | |||
| * This code has been tested against that, and is equivalent, | |||
| * except that you don't need to include two pages of legalese | |||
| * with every copy. | |||
| * | |||
| * To compute the message digest of a chunk of bytes, declare an | |||
| * MD5Context structure, pass it to MD5Init, call MD5Update as | |||
| * needed on buffers full of bytes, and then call MD5Final, which | |||
| * will fill a supplied 16-byte array with the digest. | |||
| * | |||
| * Changed so as no longer to depend on Colin Plumb's `usual.h' header | |||
| * definitions; now uses stuff from dpkg's config.h. | |||
| * - Ian Jackson <ijackson@nyx.cs.du.edu>. | |||
| * Still in the public domain. | |||
| * | |||
| * Josh Coalson: made some changes to integrate with libFLAC. | |||
| * Still in the public domain. | |||
| */ | |||
| /* The four core functions - F1 is optimized somewhat */ | |||
| /* #define F1(x, y, z) (x & y | ~x & z) */ | |||
| #define F1(x, y, z) (z ^ (x & (y ^ z))) | |||
| #define F2(x, y, z) F1(z, x, y) | |||
| #define F3(x, y, z) (x ^ y ^ z) | |||
| #define F4(x, y, z) (y ^ (x | ~z)) | |||
| /* This is the central step in the MD5 algorithm. */ | |||
| #define MD5STEP(f,w,x,y,z,in,s) \ | |||
| (w += f(x,y,z) + in, w = (w<<s | w>>(32-s)) + x) | |||
| /* | |||
| * The core of the MD5 algorithm, this alters an existing MD5 hash to | |||
| * reflect the addition of 16 longwords of new data. MD5Update blocks | |||
| * the data and converts bytes into longwords for this routine. | |||
| */ | |||
| static void FLAC__MD5Transform(FLAC__uint32 buf[4], FLAC__uint32 const in[16]) | |||
| { | |||
| register FLAC__uint32 a, b, c, d; | |||
| a = buf[0]; | |||
| b = buf[1]; | |||
| c = buf[2]; | |||
| d = buf[3]; | |||
| MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7); | |||
| MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12); | |||
| MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17); | |||
| MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22); | |||
| MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7); | |||
| MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12); | |||
| MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17); | |||
| MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22); | |||
| MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7); | |||
| MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12); | |||
| MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17); | |||
| MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22); | |||
| MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7); | |||
| MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12); | |||
| MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17); | |||
| MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22); | |||
| MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5); | |||
| MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9); | |||
| MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14); | |||
| MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20); | |||
| MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5); | |||
| MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9); | |||
| MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14); | |||
| MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20); | |||
| MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5); | |||
| MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9); | |||
| MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14); | |||
| MD5STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20); | |||
| MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5); | |||
| MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9); | |||
| MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14); | |||
| MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20); | |||
| MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4); | |||
| MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11); | |||
| MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16); | |||
| MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23); | |||
| MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4); | |||
| MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11); | |||
| MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16); | |||
| MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23); | |||
| MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4); | |||
| MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11); | |||
| MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16); | |||
| MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23); | |||
| MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4); | |||
| MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11); | |||
| MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16); | |||
| MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23); | |||
| MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6); | |||
| MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10); | |||
| MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15); | |||
| MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21); | |||
| MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6); | |||
| MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10); | |||
| MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15); | |||
| MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21); | |||
| MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6); | |||
| MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10); | |||
| MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15); | |||
| MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21); | |||
| MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6); | |||
| MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10); | |||
| MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15); | |||
| MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21); | |||
| buf[0] += a; | |||
| buf[1] += b; | |||
| buf[2] += c; | |||
| buf[3] += d; | |||
| } | |||
| #if WORDS_BIGENDIAN | |||
| //@@@@@@ OPT: use bswap/intrinsics | |||
| static void byteSwap(FLAC__uint32 *buf, unsigned words) | |||
| { | |||
| register FLAC__uint32 x; | |||
| do { | |||
| x = *buf; | |||
| x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); | |||
| *buf++ = (x >> 16) | (x << 16); | |||
| } while (--words); | |||
| } | |||
| static void byteSwapX16(FLAC__uint32 *buf) | |||
| { | |||
| register FLAC__uint32 x; | |||
| x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); | |||
| x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); | |||
| x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); | |||
| x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); | |||
| x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); | |||
| x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); | |||
| x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); | |||
| x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); | |||
| x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); | |||
| x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); | |||
| x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); | |||
| x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); | |||
| x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); | |||
| x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); | |||
| x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); | |||
| x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf = (x >> 16) | (x << 16); | |||
| } | |||
| #else | |||
| #define byteSwap(buf, words) | |||
| #define byteSwapX16(buf) | |||
| #endif | |||
| /* | |||
| * Update context to reflect the concatenation of another buffer full | |||
| * of bytes. | |||
| */ | |||
| static void FLAC__MD5Update(FLAC__MD5Context *ctx, FLAC__byte const *buf, unsigned len) | |||
| { | |||
| FLAC__uint32 t; | |||
| /* Update byte count */ | |||
| t = ctx->bytes[0]; | |||
| if ((ctx->bytes[0] = t + len) < t) | |||
| ctx->bytes[1]++; /* Carry from low to high */ | |||
| t = 64 - (t & 0x3f); /* Space available in ctx->in (at least 1) */ | |||
| if (t > len) { | |||
| memcpy((FLAC__byte *)ctx->in + 64 - t, buf, len); | |||
| return; | |||
| } | |||
| /* First chunk is an odd size */ | |||
| memcpy((FLAC__byte *)ctx->in + 64 - t, buf, t); | |||
| byteSwapX16(ctx->in); | |||
| FLAC__MD5Transform(ctx->buf, ctx->in); | |||
| buf += t; | |||
| len -= t; | |||
| /* Process data in 64-byte chunks */ | |||
| while (len >= 64) { | |||
| memcpy(ctx->in, buf, 64); | |||
| byteSwapX16(ctx->in); | |||
| FLAC__MD5Transform(ctx->buf, ctx->in); | |||
| buf += 64; | |||
| len -= 64; | |||
| } | |||
| /* Handle any remaining bytes of data. */ | |||
| memcpy(ctx->in, buf, len); | |||
| } | |||
| /* | |||
| * Start MD5 accumulation. Set bit count to 0 and buffer to mysterious | |||
| * initialization constants. | |||
| */ | |||
| void FLAC__MD5Init(FLAC__MD5Context *ctx) | |||
| { | |||
| ctx->buf[0] = 0x67452301; | |||
| ctx->buf[1] = 0xefcdab89; | |||
| ctx->buf[2] = 0x98badcfe; | |||
| ctx->buf[3] = 0x10325476; | |||
| ctx->bytes[0] = 0; | |||
| ctx->bytes[1] = 0; | |||
| ctx->internal_buf = 0; | |||
| ctx->capacity = 0; | |||
| } | |||
| /* | |||
| * Final wrapup - pad to 64-byte boundary with the bit pattern | |||
| * 1 0* (64-bit count of bits processed, MSB-first) | |||
| */ | |||
| void FLAC__MD5Final(FLAC__byte digest[16], FLAC__MD5Context *ctx) | |||
| { | |||
| int count = ctx->bytes[0] & 0x3f; /* Number of bytes in ctx->in */ | |||
| FLAC__byte *p = (FLAC__byte *)ctx->in + count; | |||
| /* Set the first char of padding to 0x80. There is always room. */ | |||
| *p++ = 0x80; | |||
| /* Bytes of padding needed to make 56 bytes (-8..55) */ | |||
| count = 56 - 1 - count; | |||
| if (count < 0) { /* Padding forces an extra block */ | |||
| memset(p, 0, count + 8); | |||
| byteSwapX16(ctx->in); | |||
| FLAC__MD5Transform(ctx->buf, ctx->in); | |||
| p = (FLAC__byte *)ctx->in; | |||
| count = 56; | |||
| } | |||
| memset(p, 0, count); | |||
| byteSwap(ctx->in, 14); | |||
| /* Append length in bits and transform */ | |||
| ctx->in[14] = ctx->bytes[0] << 3; | |||
| ctx->in[15] = ctx->bytes[1] << 3 | ctx->bytes[0] >> 29; | |||
| FLAC__MD5Transform(ctx->buf, ctx->in); | |||
| byteSwap(ctx->buf, 4); | |||
| memcpy(digest, ctx->buf, 16); | |||
| memset(ctx, 0, sizeof(ctx)); /* In case it's sensitive */ | |||
| if(0 != ctx->internal_buf) { | |||
| free(ctx->internal_buf); | |||
| ctx->internal_buf = 0; | |||
| ctx->capacity = 0; | |||
| } | |||
| } | |||
| /* | |||
| * 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) | |||
| { | |||
| 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; | |||
| } | |||
| } | |||
| 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; | |||
| } | |||
| } | |||
| 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++) { | |||
| 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; | |||
| a_word = signal[1][sample]; | |||
| *buf_++ = (FLAC__byte)a_word; a_word >>= 8; | |||
| *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; | |||
| } | |||
| } | |||
| 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; | |||
| } | |||
| } | |||
| } | |||
| } | |||
| 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; | |||
| } | |||
| } | |||
| else if(channels == 1) { | |||
| for(sample = 0; sample < samples; sample++) { | |||
| a_word = signal[0][sample]; | |||
| *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; | |||
| } | |||
| } | |||
| } | |||
| } | |||
| 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; | |||
| } | |||
| } | |||
| } | |||
| } | |||
| /* | |||
| * Convert the incoming audio signal to a byte stream and FLAC__MD5Update it. | |||
| */ | |||
| FLAC__bool FLAC__MD5Accumulate(FLAC__MD5Context *ctx, const FLAC__int32 * const signal[], unsigned channels, unsigned samples, unsigned bytes_per_sample) | |||
| { | |||
| 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) | |||
| return false; | |||
| 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))) | |||
| return false; | |||
| } | |||
| ctx->internal_buf = tmp; | |||
| ctx->capacity = bytes_needed; | |||
| } | |||
| format_input_(ctx->internal_buf, signal, channels, samples, bytes_per_sample); | |||
| FLAC__MD5Update(ctx, ctx->internal_buf, bytes_needed); | |||
| return true; | |||
| } | |||
| #endif | |||
| #if HAVE_CONFIG_H | |||
| # include <config.h> | |||
| #endif | |||
| #include <stdlib.h> /* for malloc() */ | |||
| #include <string.h> /* for memcpy() */ | |||
| #include "include/private/md5.h" | |||
| #include "../alloc.h" | |||
| #ifndef FLaC__INLINE | |||
| #define FLaC__INLINE | |||
| #endif | |||
| /* | |||
| * This code implements the MD5 message-digest algorithm. | |||
| * The algorithm is due to Ron Rivest. This code was | |||
| * written by Colin Plumb in 1993, no copyright is claimed. | |||
| * This code is in the public domain; do with it what you wish. | |||
| * | |||
| * Equivalent code is available from RSA Data Security, Inc. | |||
| * This code has been tested against that, and is equivalent, | |||
| * except that you don't need to include two pages of legalese | |||
| * with every copy. | |||
| * | |||
| * To compute the message digest of a chunk of bytes, declare an | |||
| * MD5Context structure, pass it to MD5Init, call MD5Update as | |||
| * needed on buffers full of bytes, and then call MD5Final, which | |||
| * will fill a supplied 16-byte array with the digest. | |||
| * | |||
| * Changed so as no longer to depend on Colin Plumb's `usual.h' header | |||
| * definitions; now uses stuff from dpkg's config.h. | |||
| * - Ian Jackson <ijackson@nyx.cs.du.edu>. | |||
| * Still in the public domain. | |||
| * | |||
| * Josh Coalson: made some changes to integrate with libFLAC. | |||
| * Still in the public domain. | |||
| */ | |||
| /* The four core functions - F1 is optimized somewhat */ | |||
| /* #define F1(x, y, z) (x & y | ~x & z) */ | |||
| #define F1(x, y, z) (z ^ (x & (y ^ z))) | |||
| #define F2(x, y, z) F1(z, x, y) | |||
| #define F3(x, y, z) (x ^ y ^ z) | |||
| #define F4(x, y, z) (y ^ (x | ~z)) | |||
| /* This is the central step in the MD5 algorithm. */ | |||
| #define MD5STEP(f,w,x,y,z,in,s) \ | |||
| (w += f(x,y,z) + in, w = (w<<s | w>>(32-s)) + x) | |||
| /* | |||
| * The core of the MD5 algorithm, this alters an existing MD5 hash to | |||
| * reflect the addition of 16 longwords of new data. MD5Update blocks | |||
| * the data and converts bytes into longwords for this routine. | |||
| */ | |||
| static void FLAC__MD5Transform(FLAC__uint32 buf[4], FLAC__uint32 const in[16]) | |||
| { | |||
| register FLAC__uint32 a, b, c, d; | |||
| a = buf[0]; | |||
| b = buf[1]; | |||
| c = buf[2]; | |||
| d = buf[3]; | |||
| MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7); | |||
| MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12); | |||
| MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17); | |||
| MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22); | |||
| MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7); | |||
| MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12); | |||
| MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17); | |||
| MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22); | |||
| MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7); | |||
| MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12); | |||
| MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17); | |||
| MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22); | |||
| MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7); | |||
| MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12); | |||
| MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17); | |||
| MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22); | |||
| MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5); | |||
| MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9); | |||
| MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14); | |||
| MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20); | |||
| MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5); | |||
| MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9); | |||
| MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14); | |||
| MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20); | |||
| MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5); | |||
| MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9); | |||
| MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14); | |||
| MD5STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20); | |||
| MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5); | |||
| MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9); | |||
| MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14); | |||
| MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20); | |||
| MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4); | |||
| MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11); | |||
| MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16); | |||
| MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23); | |||
| MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4); | |||
| MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11); | |||
| MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16); | |||
| MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23); | |||
| MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4); | |||
| MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11); | |||
| MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16); | |||
| MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23); | |||
| MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4); | |||
| MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11); | |||
| MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16); | |||
| MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23); | |||
| MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6); | |||
| MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10); | |||
| MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15); | |||
| MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21); | |||
| MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6); | |||
| MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10); | |||
| MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15); | |||
| MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21); | |||
| MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6); | |||
| MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10); | |||
| MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15); | |||
| MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21); | |||
| MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6); | |||
| MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10); | |||
| MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15); | |||
| MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21); | |||
| buf[0] += a; | |||
| buf[1] += b; | |||
| buf[2] += c; | |||
| buf[3] += d; | |||
| } | |||
| #if WORDS_BIGENDIAN | |||
| //@@@@@@ OPT: use bswap/intrinsics | |||
| static void byteSwap(FLAC__uint32 *buf, unsigned words) | |||
| { | |||
| register FLAC__uint32 x; | |||
| do { | |||
| x = *buf; | |||
| x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); | |||
| *buf++ = (x >> 16) | (x << 16); | |||
| } while (--words); | |||
| } | |||
| static void byteSwapX16(FLAC__uint32 *buf) | |||
| { | |||
| register FLAC__uint32 x; | |||
| x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); | |||
| x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); | |||
| x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); | |||
| x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); | |||
| x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); | |||
| x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); | |||
| x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); | |||
| x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); | |||
| x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); | |||
| x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); | |||
| x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); | |||
| x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); | |||
| x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); | |||
| x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); | |||
| x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); | |||
| x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf = (x >> 16) | (x << 16); | |||
| } | |||
| #else | |||
| #define byteSwap(buf, words) | |||
| #define byteSwapX16(buf) | |||
| #endif | |||
| /* | |||
| * Update context to reflect the concatenation of another buffer full | |||
| * of bytes. | |||
| */ | |||
| static void FLAC__MD5Update(FLAC__MD5Context *ctx, FLAC__byte const *buf, unsigned len) | |||
| { | |||
| FLAC__uint32 t; | |||
| /* Update byte count */ | |||
| t = ctx->bytes[0]; | |||
| if ((ctx->bytes[0] = t + len) < t) | |||
| ctx->bytes[1]++; /* Carry from low to high */ | |||
| t = 64 - (t & 0x3f); /* Space available in ctx->in (at least 1) */ | |||
| if (t > len) { | |||
| memcpy((FLAC__byte *)ctx->in + 64 - t, buf, len); | |||
| return; | |||
| } | |||
| /* First chunk is an odd size */ | |||
| memcpy((FLAC__byte *)ctx->in + 64 - t, buf, t); | |||
| byteSwapX16(ctx->in); | |||
| FLAC__MD5Transform(ctx->buf, ctx->in); | |||
| buf += t; | |||
| len -= t; | |||
| /* Process data in 64-byte chunks */ | |||
| while (len >= 64) { | |||
| memcpy(ctx->in, buf, 64); | |||
| byteSwapX16(ctx->in); | |||
| FLAC__MD5Transform(ctx->buf, ctx->in); | |||
| buf += 64; | |||
| len -= 64; | |||
| } | |||
| /* Handle any remaining bytes of data. */ | |||
| memcpy(ctx->in, buf, len); | |||
| } | |||
| /* | |||
| * Start MD5 accumulation. Set bit count to 0 and buffer to mysterious | |||
| * initialization constants. | |||
| */ | |||
| void FLAC__MD5Init(FLAC__MD5Context *ctx) | |||
| { | |||
| ctx->buf[0] = 0x67452301; | |||
| ctx->buf[1] = 0xefcdab89; | |||
| ctx->buf[2] = 0x98badcfe; | |||
| ctx->buf[3] = 0x10325476; | |||
| ctx->bytes[0] = 0; | |||
| ctx->bytes[1] = 0; | |||
| ctx->internal_buf = 0; | |||
| ctx->capacity = 0; | |||
| } | |||
| /* | |||
| * Final wrapup - pad to 64-byte boundary with the bit pattern | |||
| * 1 0* (64-bit count of bits processed, MSB-first) | |||
| */ | |||
| void FLAC__MD5Final(FLAC__byte digest[16], FLAC__MD5Context *ctx) | |||
| { | |||
| int count = ctx->bytes[0] & 0x3f; /* Number of bytes in ctx->in */ | |||
| FLAC__byte *p = (FLAC__byte *)ctx->in + count; | |||
| /* Set the first char of padding to 0x80. There is always room. */ | |||
| *p++ = 0x80; | |||
| /* Bytes of padding needed to make 56 bytes (-8..55) */ | |||
| count = 56 - 1 - count; | |||
| if (count < 0) { /* Padding forces an extra block */ | |||
| memset(p, 0, count + 8); | |||
| byteSwapX16(ctx->in); | |||
| FLAC__MD5Transform(ctx->buf, ctx->in); | |||
| p = (FLAC__byte *)ctx->in; | |||
| count = 56; | |||
| } | |||
| memset(p, 0, count); | |||
| byteSwap(ctx->in, 14); | |||
| /* Append length in bits and transform */ | |||
| ctx->in[14] = ctx->bytes[0] << 3; | |||
| ctx->in[15] = ctx->bytes[1] << 3 | ctx->bytes[0] >> 29; | |||
| FLAC__MD5Transform(ctx->buf, ctx->in); | |||
| byteSwap(ctx->buf, 4); | |||
| memcpy(digest, ctx->buf, 16); | |||
| memset(ctx, 0, sizeof(ctx)); /* In case it's sensitive */ | |||
| if(0 != ctx->internal_buf) { | |||
| free(ctx->internal_buf); | |||
| ctx->internal_buf = 0; | |||
| ctx->capacity = 0; | |||
| } | |||
| } | |||
| /* | |||
| * 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) | |||
| { | |||
| 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; | |||
| } | |||
| } | |||
| 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; | |||
| } | |||
| } | |||
| 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++) { | |||
| 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; | |||
| a_word = signal[1][sample]; | |||
| *buf_++ = (FLAC__byte)a_word; a_word >>= 8; | |||
| *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; | |||
| } | |||
| } | |||
| 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; | |||
| } | |||
| } | |||
| } | |||
| } | |||
| 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; | |||
| } | |||
| } | |||
| else if(channels == 1) { | |||
| for(sample = 0; sample < samples; sample++) { | |||
| a_word = signal[0][sample]; | |||
| *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; | |||
| } | |||
| } | |||
| } | |||
| } | |||
| 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; | |||
| } | |||
| } | |||
| } | |||
| } | |||
| /* | |||
| * Convert the incoming audio signal to a byte stream and FLAC__MD5Update it. | |||
| */ | |||
| FLAC__bool FLAC__MD5Accumulate(FLAC__MD5Context *ctx, const FLAC__int32 * const signal[], unsigned channels, unsigned samples, unsigned bytes_per_sample) | |||
| { | |||
| 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) | |||
| return false; | |||
| 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))) | |||
| return false; | |||
| } | |||
| ctx->internal_buf = tmp; | |||
| ctx->capacity = bytes_needed; | |||
| } | |||
| format_input_(ctx->internal_buf, signal, channels, samples, bytes_per_sample); | |||
| FLAC__MD5Update(ctx, ctx->internal_buf, bytes_needed); | |||
| return true; | |||
| } | |||
| #endif | |||
| @@ -1,227 +1,227 @@ | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2001,2002,2003,2004,2005,2006,2007 Josh Coalson | |||
| * | |||
| * 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. | |||
| */ | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2001,2002,2003,2004,2005,2006,2007 Josh Coalson | |||
| * | |||
| * 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. | |||
| */ | |||
| #include "juce_FlacHeader.h" | |||
| #if JUCE_USE_FLAC | |||
| #if HAVE_CONFIG_H | |||
| # include <config.h> | |||
| #endif | |||
| #include "include/private/memory.h" | |||
| #include "../assert.h" | |||
| #include "../alloc.h" | |||
| void *FLAC__memory_alloc_aligned(size_t bytes, void **aligned_address) | |||
| { | |||
| void *x; | |||
| FLAC__ASSERT(0 != 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 | |||
| #else | |||
| x = safe_malloc_(bytes); | |||
| *aligned_address = x; | |||
| #endif | |||
| return x; | |||
| } | |||
| FLAC__bool FLAC__memory_alloc_aligned_int32_array(unsigned elements, FLAC__int32 **unaligned_pointer, FLAC__int32 **aligned_pointer) | |||
| { | |||
| FLAC__int32 *pu; /* unaligned pointer */ | |||
| union { /* union needed to comply with C99 pointer aliasing rules */ | |||
| FLAC__int32 *pa; /* aligned pointer */ | |||
| void *pv; /* aligned pointer alias */ | |||
| } u; | |||
| FLAC__ASSERT(elements > 0); | |||
| FLAC__ASSERT(0 != unaligned_pointer); | |||
| FLAC__ASSERT(0 != aligned_pointer); | |||
| FLAC__ASSERT(unaligned_pointer != aligned_pointer); | |||
| if((size_t)elements > SIZE_MAX / sizeof(*pu)) /* overflow check */ | |||
| return false; | |||
| pu = (FLAC__int32*)FLAC__memory_alloc_aligned(sizeof(*pu) * (size_t)elements, &u.pv); | |||
| if(0 == pu) { | |||
| return false; | |||
| } | |||
| else { | |||
| if(*unaligned_pointer != 0) | |||
| free(*unaligned_pointer); | |||
| *unaligned_pointer = pu; | |||
| *aligned_pointer = u.pa; | |||
| return true; | |||
| } | |||
| } | |||
| FLAC__bool FLAC__memory_alloc_aligned_uint32_array(unsigned elements, FLAC__uint32 **unaligned_pointer, FLAC__uint32 **aligned_pointer) | |||
| { | |||
| FLAC__uint32 *pu; /* unaligned pointer */ | |||
| union { /* union needed to comply with C99 pointer aliasing rules */ | |||
| FLAC__uint32 *pa; /* aligned pointer */ | |||
| void *pv; /* aligned pointer alias */ | |||
| } u; | |||
| FLAC__ASSERT(elements > 0); | |||
| FLAC__ASSERT(0 != unaligned_pointer); | |||
| FLAC__ASSERT(0 != aligned_pointer); | |||
| FLAC__ASSERT(unaligned_pointer != aligned_pointer); | |||
| if((size_t)elements > SIZE_MAX / sizeof(*pu)) /* overflow check */ | |||
| return false; | |||
| pu = (FLAC__uint32*)FLAC__memory_alloc_aligned(sizeof(*pu) * elements, &u.pv); | |||
| if(0 == pu) { | |||
| return false; | |||
| } | |||
| else { | |||
| if(*unaligned_pointer != 0) | |||
| free(*unaligned_pointer); | |||
| *unaligned_pointer = pu; | |||
| *aligned_pointer = u.pa; | |||
| return true; | |||
| } | |||
| } | |||
| FLAC__bool FLAC__memory_alloc_aligned_uint64_array(unsigned elements, FLAC__uint64 **unaligned_pointer, FLAC__uint64 **aligned_pointer) | |||
| { | |||
| FLAC__uint64 *pu; /* unaligned pointer */ | |||
| union { /* union needed to comply with C99 pointer aliasing rules */ | |||
| FLAC__uint64 *pa; /* aligned pointer */ | |||
| void *pv; /* aligned pointer alias */ | |||
| } u; | |||
| FLAC__ASSERT(elements > 0); | |||
| FLAC__ASSERT(0 != unaligned_pointer); | |||
| FLAC__ASSERT(0 != aligned_pointer); | |||
| FLAC__ASSERT(unaligned_pointer != aligned_pointer); | |||
| if((size_t)elements > SIZE_MAX / sizeof(*pu)) /* overflow check */ | |||
| return false; | |||
| pu = (FLAC__uint64*)FLAC__memory_alloc_aligned(sizeof(*pu) * elements, &u.pv); | |||
| if(0 == pu) { | |||
| return false; | |||
| } | |||
| else { | |||
| if(*unaligned_pointer != 0) | |||
| free(*unaligned_pointer); | |||
| *unaligned_pointer = pu; | |||
| *aligned_pointer = u.pa; | |||
| return true; | |||
| } | |||
| } | |||
| FLAC__bool FLAC__memory_alloc_aligned_unsigned_array(unsigned elements, unsigned **unaligned_pointer, unsigned **aligned_pointer) | |||
| { | |||
| unsigned *pu; /* unaligned pointer */ | |||
| union { /* union needed to comply with C99 pointer aliasing rules */ | |||
| unsigned *pa; /* aligned pointer */ | |||
| void *pv; /* aligned pointer alias */ | |||
| } u; | |||
| FLAC__ASSERT(elements > 0); | |||
| FLAC__ASSERT(0 != unaligned_pointer); | |||
| FLAC__ASSERT(0 != aligned_pointer); | |||
| FLAC__ASSERT(unaligned_pointer != aligned_pointer); | |||
| if((size_t)elements > SIZE_MAX / sizeof(*pu)) /* overflow check */ | |||
| return false; | |||
| pu = (unsigned*)FLAC__memory_alloc_aligned(sizeof(*pu) * elements, &u.pv); | |||
| if(0 == pu) { | |||
| return false; | |||
| } | |||
| else { | |||
| if(*unaligned_pointer != 0) | |||
| free(*unaligned_pointer); | |||
| *unaligned_pointer = pu; | |||
| *aligned_pointer = u.pa; | |||
| return true; | |||
| } | |||
| } | |||
| #ifndef FLAC__INTEGER_ONLY_LIBRARY | |||
| FLAC__bool FLAC__memory_alloc_aligned_real_array(unsigned elements, FLAC__real **unaligned_pointer, FLAC__real **aligned_pointer) | |||
| { | |||
| FLAC__real *pu; /* unaligned pointer */ | |||
| union { /* union needed to comply with C99 pointer aliasing rules */ | |||
| FLAC__real *pa; /* aligned pointer */ | |||
| void *pv; /* aligned pointer alias */ | |||
| } u; | |||
| FLAC__ASSERT(elements > 0); | |||
| FLAC__ASSERT(0 != unaligned_pointer); | |||
| FLAC__ASSERT(0 != aligned_pointer); | |||
| FLAC__ASSERT(unaligned_pointer != aligned_pointer); | |||
| if((size_t)elements > SIZE_MAX / sizeof(*pu)) /* overflow check */ | |||
| return false; | |||
| pu = (FLAC__real*)FLAC__memory_alloc_aligned(sizeof(*pu) * elements, &u.pv); | |||
| if(0 == pu) { | |||
| return false; | |||
| } | |||
| else { | |||
| if(*unaligned_pointer != 0) | |||
| free(*unaligned_pointer); | |||
| *unaligned_pointer = pu; | |||
| *aligned_pointer = u.pa; | |||
| return true; | |||
| } | |||
| } | |||
| #endif | |||
| #endif | |||
| #if HAVE_CONFIG_H | |||
| # include <config.h> | |||
| #endif | |||
| #include "include/private/memory.h" | |||
| #include "../assert.h" | |||
| #include "../alloc.h" | |||
| void *FLAC__memory_alloc_aligned(size_t bytes, void **aligned_address) | |||
| { | |||
| void *x; | |||
| FLAC__ASSERT(0 != 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 | |||
| #else | |||
| x = safe_malloc_(bytes); | |||
| *aligned_address = x; | |||
| #endif | |||
| return x; | |||
| } | |||
| FLAC__bool FLAC__memory_alloc_aligned_int32_array(unsigned elements, FLAC__int32 **unaligned_pointer, FLAC__int32 **aligned_pointer) | |||
| { | |||
| FLAC__int32 *pu; /* unaligned pointer */ | |||
| union { /* union needed to comply with C99 pointer aliasing rules */ | |||
| FLAC__int32 *pa; /* aligned pointer */ | |||
| void *pv; /* aligned pointer alias */ | |||
| } u; | |||
| FLAC__ASSERT(elements > 0); | |||
| FLAC__ASSERT(0 != unaligned_pointer); | |||
| FLAC__ASSERT(0 != aligned_pointer); | |||
| FLAC__ASSERT(unaligned_pointer != aligned_pointer); | |||
| if((size_t)elements > SIZE_MAX / sizeof(*pu)) /* overflow check */ | |||
| return false; | |||
| pu = (FLAC__int32*)FLAC__memory_alloc_aligned(sizeof(*pu) * (size_t)elements, &u.pv); | |||
| if(0 == pu) { | |||
| return false; | |||
| } | |||
| else { | |||
| if(*unaligned_pointer != 0) | |||
| free(*unaligned_pointer); | |||
| *unaligned_pointer = pu; | |||
| *aligned_pointer = u.pa; | |||
| return true; | |||
| } | |||
| } | |||
| FLAC__bool FLAC__memory_alloc_aligned_uint32_array(unsigned elements, FLAC__uint32 **unaligned_pointer, FLAC__uint32 **aligned_pointer) | |||
| { | |||
| FLAC__uint32 *pu; /* unaligned pointer */ | |||
| union { /* union needed to comply with C99 pointer aliasing rules */ | |||
| FLAC__uint32 *pa; /* aligned pointer */ | |||
| void *pv; /* aligned pointer alias */ | |||
| } u; | |||
| FLAC__ASSERT(elements > 0); | |||
| FLAC__ASSERT(0 != unaligned_pointer); | |||
| FLAC__ASSERT(0 != aligned_pointer); | |||
| FLAC__ASSERT(unaligned_pointer != aligned_pointer); | |||
| if((size_t)elements > SIZE_MAX / sizeof(*pu)) /* overflow check */ | |||
| return false; | |||
| pu = (FLAC__uint32*)FLAC__memory_alloc_aligned(sizeof(*pu) * elements, &u.pv); | |||
| if(0 == pu) { | |||
| return false; | |||
| } | |||
| else { | |||
| if(*unaligned_pointer != 0) | |||
| free(*unaligned_pointer); | |||
| *unaligned_pointer = pu; | |||
| *aligned_pointer = u.pa; | |||
| return true; | |||
| } | |||
| } | |||
| FLAC__bool FLAC__memory_alloc_aligned_uint64_array(unsigned elements, FLAC__uint64 **unaligned_pointer, FLAC__uint64 **aligned_pointer) | |||
| { | |||
| FLAC__uint64 *pu; /* unaligned pointer */ | |||
| union { /* union needed to comply with C99 pointer aliasing rules */ | |||
| FLAC__uint64 *pa; /* aligned pointer */ | |||
| void *pv; /* aligned pointer alias */ | |||
| } u; | |||
| FLAC__ASSERT(elements > 0); | |||
| FLAC__ASSERT(0 != unaligned_pointer); | |||
| FLAC__ASSERT(0 != aligned_pointer); | |||
| FLAC__ASSERT(unaligned_pointer != aligned_pointer); | |||
| if((size_t)elements > SIZE_MAX / sizeof(*pu)) /* overflow check */ | |||
| return false; | |||
| pu = (FLAC__uint64*)FLAC__memory_alloc_aligned(sizeof(*pu) * elements, &u.pv); | |||
| if(0 == pu) { | |||
| return false; | |||
| } | |||
| else { | |||
| if(*unaligned_pointer != 0) | |||
| free(*unaligned_pointer); | |||
| *unaligned_pointer = pu; | |||
| *aligned_pointer = u.pa; | |||
| return true; | |||
| } | |||
| } | |||
| FLAC__bool FLAC__memory_alloc_aligned_unsigned_array(unsigned elements, unsigned **unaligned_pointer, unsigned **aligned_pointer) | |||
| { | |||
| unsigned *pu; /* unaligned pointer */ | |||
| union { /* union needed to comply with C99 pointer aliasing rules */ | |||
| unsigned *pa; /* aligned pointer */ | |||
| void *pv; /* aligned pointer alias */ | |||
| } u; | |||
| FLAC__ASSERT(elements > 0); | |||
| FLAC__ASSERT(0 != unaligned_pointer); | |||
| FLAC__ASSERT(0 != aligned_pointer); | |||
| FLAC__ASSERT(unaligned_pointer != aligned_pointer); | |||
| if((size_t)elements > SIZE_MAX / sizeof(*pu)) /* overflow check */ | |||
| return false; | |||
| pu = (unsigned*)FLAC__memory_alloc_aligned(sizeof(*pu) * elements, &u.pv); | |||
| if(0 == pu) { | |||
| return false; | |||
| } | |||
| else { | |||
| if(*unaligned_pointer != 0) | |||
| free(*unaligned_pointer); | |||
| *unaligned_pointer = pu; | |||
| *aligned_pointer = u.pa; | |||
| return true; | |||
| } | |||
| } | |||
| #ifndef FLAC__INTEGER_ONLY_LIBRARY | |||
| FLAC__bool FLAC__memory_alloc_aligned_real_array(unsigned elements, FLAC__real **unaligned_pointer, FLAC__real **aligned_pointer) | |||
| { | |||
| FLAC__real *pu; /* unaligned pointer */ | |||
| union { /* union needed to comply with C99 pointer aliasing rules */ | |||
| FLAC__real *pa; /* aligned pointer */ | |||
| void *pv; /* aligned pointer alias */ | |||
| } u; | |||
| FLAC__ASSERT(elements > 0); | |||
| FLAC__ASSERT(0 != unaligned_pointer); | |||
| FLAC__ASSERT(0 != aligned_pointer); | |||
| FLAC__ASSERT(unaligned_pointer != aligned_pointer); | |||
| if((size_t)elements > SIZE_MAX / sizeof(*pu)) /* overflow check */ | |||
| return false; | |||
| pu = (FLAC__real*)FLAC__memory_alloc_aligned(sizeof(*pu) * elements, &u.pv); | |||
| if(0 == pu) { | |||
| return false; | |||
| } | |||
| else { | |||
| if(*unaligned_pointer != 0) | |||
| free(*unaligned_pointer); | |||
| *unaligned_pointer = pu; | |||
| *aligned_pointer = u.pa; | |||
| return true; | |||
| } | |||
| } | |||
| #endif | |||
| #endif | |||
| @@ -227,4 +227,4 @@ void FLAC__window_welch(FLAC__real *window, const FLAC__int32 L) | |||
| #endif /* !defined FLAC__INTEGER_ONLY_LIBRARY */ | |||
| #endif | |||
| #endif | |||
| @@ -1,80 +1,80 @@ | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 Josh Coalson | |||
| * | |||
| * 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__ORDINALS_H | |||
| #define FLAC__ORDINALS_H | |||
| #if !(defined(_MSC_VER) || defined(__BORLANDC__) || defined(__EMX__)) | |||
| #include <inttypes.h> | |||
| #endif | |||
| typedef signed char FLAC__int8; | |||
| typedef unsigned char FLAC__uint8; | |||
| #if defined(_MSC_VER) || defined(__BORLANDC__) | |||
| typedef __int16 FLAC__int16; | |||
| typedef __int32 FLAC__int32; | |||
| typedef __int64 FLAC__int64; | |||
| typedef unsigned __int16 FLAC__uint16; | |||
| typedef unsigned __int32 FLAC__uint32; | |||
| typedef unsigned __int64 FLAC__uint64; | |||
| #elif defined(__EMX__) | |||
| typedef short FLAC__int16; | |||
| typedef long FLAC__int32; | |||
| typedef long long FLAC__int64; | |||
| typedef unsigned short FLAC__uint16; | |||
| typedef unsigned long FLAC__uint32; | |||
| typedef unsigned long long FLAC__uint64; | |||
| #else | |||
| typedef int16_t FLAC__int16; | |||
| typedef int32_t FLAC__int32; | |||
| typedef int64_t FLAC__int64; | |||
| typedef uint16_t FLAC__uint16; | |||
| typedef uint32_t FLAC__uint32; | |||
| typedef uint64_t FLAC__uint64; | |||
| #endif | |||
| typedef int FLAC__bool; | |||
| typedef FLAC__uint8 FLAC__byte; | |||
| #ifdef true | |||
| #undef true | |||
| #endif | |||
| #ifdef false | |||
| #undef false | |||
| #endif | |||
| #ifndef __cplusplus | |||
| #define true 1 | |||
| #define false 0 | |||
| #endif | |||
| #endif | |||
| /* libFLAC - Free Lossless Audio Codec library | |||
| * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 Josh Coalson | |||
| * | |||
| * 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__ORDINALS_H | |||
| #define FLAC__ORDINALS_H | |||
| #if !(defined(_MSC_VER) || defined(__BORLANDC__) || defined(__EMX__)) | |||
| #include <inttypes.h> | |||
| #endif | |||
| typedef signed char FLAC__int8; | |||
| typedef unsigned char FLAC__uint8; | |||
| #if defined(_MSC_VER) || defined(__BORLANDC__) | |||
| typedef __int16 FLAC__int16; | |||
| typedef __int32 FLAC__int32; | |||
| typedef __int64 FLAC__int64; | |||
| typedef unsigned __int16 FLAC__uint16; | |||
| typedef unsigned __int32 FLAC__uint32; | |||
| typedef unsigned __int64 FLAC__uint64; | |||
| #elif defined(__EMX__) | |||
| typedef short FLAC__int16; | |||
| typedef long FLAC__int32; | |||
| typedef long long FLAC__int64; | |||
| typedef unsigned short FLAC__uint16; | |||
| typedef unsigned long FLAC__uint32; | |||
| typedef unsigned long long FLAC__uint64; | |||
| #else | |||
| typedef int16_t FLAC__int16; | |||
| typedef int32_t FLAC__int32; | |||
| typedef int64_t FLAC__int64; | |||
| typedef uint16_t FLAC__uint16; | |||
| typedef uint32_t FLAC__uint32; | |||
| typedef uint64_t FLAC__uint64; | |||
| #endif | |||
| typedef int FLAC__bool; | |||
| typedef FLAC__uint8 FLAC__byte; | |||
| #ifdef true | |||
| #undef true | |||
| #endif | |||
| #ifdef false | |||
| #undef false | |||
| #endif | |||
| #ifndef __cplusplus | |||
| #define true 1 | |||
| #define false 0 | |||
| #endif | |||
| #endif | |||
| @@ -119,7 +119,7 @@ const String AudioDeviceManager::initialise (const int numInputChannelsNeeded, | |||
| if (availableDeviceTypes [0] != 0) | |||
| defaultDevice = availableDeviceTypes[0]->getDefaultDeviceName (numOutputChannelsNeeded == 0, | |||
| numInputChannelsNeeded, | |||
| numInputChannelsNeeded, | |||
| numOutputChannelsNeeded); | |||
| return setAudioDevice (defaultDevice, 0, 0, 0, 0, false); | |||
| @@ -109,7 +109,7 @@ public: | |||
| and AudioIODevice::getCurrentBufferSizeSamples() on the supplied pointer. | |||
| @param device the audio IO device that will be used to drive the callback. | |||
| Note that if you're going to store this this pointer, it is | |||
| Note that if you're going to store this this pointer, it is | |||
| only valid until the next time that audioDeviceStopped is called. | |||
| */ | |||
| virtual void audioDeviceAboutToStart (AudioIODevice* device) = 0; | |||
| @@ -123,7 +123,7 @@ public: | |||
| may be used to help decide which device would be most suitable | |||
| */ | |||
| virtual const String getDefaultDeviceName (const bool preferInputNames, | |||
| const int numInputChannelsNeeded, | |||
| const int numInputChannelsNeeded, | |||
| const int numOutputChannelsNeeded) const = 0; | |||
| /** Creates one of the devices of this type. | |||
| @@ -1,4 +1,4 @@ | |||
| /* | |||
| /* | |||
| ============================================================================== | |||
| This file is part of the JUCE library - "Jules' Utility Class Extensions" | |||
| @@ -640,6 +640,17 @@ int ListBox::getRowContainingPosition (const int x, const int y) const throw() | |||
| return -1; | |||
| } | |||
| int ListBox::getInsertionIndexForPosition (const int x, const int y) const throw() | |||
| { | |||
| if (((unsigned int) x) < (unsigned int) getWidth()) | |||
| { | |||
| const int row = (viewport->getViewPositionY() + y + rowHeight / 2 - viewport->getY()) / rowHeight; | |||
| return jlimit (0, totalItems, row); | |||
| } | |||
| return -1; | |||
| } | |||
| Component* ListBox::getComponentForRowNumber (const int row) const throw() | |||
| { | |||
| Component* const listRowComp = viewport->getComponentForRowIfOnscreen (row); | |||
| @@ -381,6 +381,21 @@ public: | |||
| */ | |||
| int getRowContainingPosition (const int x, const int y) const throw(); | |||
| /** Finds a row index that would be the most suitable place to insert a new | |||
| item for a given position. | |||
| This is useful when the user is e.g. dragging and dropping onto the listbox, | |||
| because it lets you easily choose the best position to insert the item that | |||
| they drop, based on where they drop it. | |||
| If the position is out of range, this will return -1. If the position is | |||
| beyond the end of the list, it will return getNumRows() to indicate the end | |||
| of the list. | |||
| @see getComponentForRowNumber | |||
| */ | |||
| int getInsertionIndexForPosition (const int x, const int y) const throw(); | |||
| /** Returns the position of one of the rows, relative to the top-left of | |||
| the listbox. | |||
| @@ -680,19 +680,23 @@ public: | |||
| { | |||
| while (next()) | |||
| { | |||
| cy = lineY; | |||
| if (indexInText + atom->numChars > index) | |||
| if (indexInText + atom->numChars >= index) | |||
| { | |||
| updateLineHeight(); | |||
| cx = indexToX (index); | |||
| lineHeight_ = lineHeight; | |||
| return true; | |||
| if (indexInText + atom->numChars > index) | |||
| { | |||
| cx = indexToX (index); | |||
| cy = lineY; | |||
| lineHeight_ = lineHeight; | |||
| return true; | |||
| } | |||
| } | |||
| } | |||
| cx = atomX; | |||
| cy = lineY; | |||
| lineHeight_ = lineHeight; | |||
| return false; | |||
| } | |||
| @@ -2387,15 +2391,13 @@ void TextEditor::getCharPosition (const int index, float& cx, float& cy, float& | |||
| { | |||
| TextEditorIterator i (sections, wordWrapWidth, passwordCharacter); | |||
| if (i.getCharPosition (index, cx, cy, lineHeight)) | |||
| return; | |||
| i.getCharPosition (index, cx, cy, lineHeight); | |||
| } | |||
| else | |||
| { | |||
| cx = cy = 0; | |||
| lineHeight = currentFont.getHeight(); | |||
| } | |||
| lineHeight = currentFont.getHeight(); | |||
| } | |||
| int TextEditor::indexAtPosition (const float x, const float y) throw() | |||
| @@ -137,7 +137,7 @@ const Rectangle Desktop::getMonitorAreaContaining (int cx, int cy, const bool cl | |||
| if (rect.contains (cx, cy)) | |||
| return rect; | |||
| const double distance = juce_hypot ((double) (rect.getCentreX() - cx), | |||
| const double distance = juce_hypot ((double) (rect.getCentreX() - cx), | |||
| (double) (rect.getCentreY() - cy)); | |||
| if (distance < bestDistance) | |||
| @@ -377,7 +377,7 @@ void TabbedButtonBar::resized() | |||
| if (orientation == TabsAtTop || orientation == TabsAtBottom) | |||
| swapVariables (depth, length); | |||
| const int overlap = getLookAndFeel().getTabButtonOverlap (depth) | |||
| const int overlap = getLookAndFeel().getTabButtonOverlap (depth) | |||
| + getLookAndFeel().getTabButtonSpaceAroundImage() * 2; | |||
| int i, totalLength = overlap; | |||
| @@ -856,7 +856,7 @@ private: | |||
| { | |||
| x = minX; | |||
| const int spaceUnder = mon.getHeight() - maxY; | |||
| const int spaceUnder = mon.getHeight() - (maxY - mon.getY()); | |||
| const int spaceOver = minY - mon.getY(); | |||
| if (heightToUse < spaceUnder - 30 || spaceUnder >= spaceOver) | |||
| @@ -699,7 +699,7 @@ void MidiKeyboardComponent::resetAnyKeysInUse() | |||
| void MidiKeyboardComponent::updateNoteUnderMouse (int x, int y) | |||
| { | |||
| const int newNote = (mouseDragging || isMouseOver()) | |||
| const int newNote = (mouseDragging || isMouseOver()) | |||
| ? xyToNote (x, y) : -1; | |||
| if (noteUnderMouse != newNote) | |||
| @@ -93,7 +93,7 @@ public: | |||
| To close the dialog programatically, you should call exitModalState (returnValue) on | |||
| the DialogWindow that is created. To find a pointer to this window from your | |||
| contentComponent, you can do something like this: | |||
| @code | |||
| @code | |||
| Dialogwindow* dw = contentComponent->findParentComponentOfClass ((DialogWindow*) 0); | |||
| if (dw != 0) | |||
| @@ -266,6 +266,8 @@ void TopLevelWindow::recreateDesktopWindow() | |||
| } | |||
| } | |||
| const int juce_windowIsSemiTransparentFlag = (1 << 31); // duplicated in native windowing code | |||
| void TopLevelWindow::addToDesktop (int windowStyleFlags, void* nativeWindowToAttachTo) | |||
| { | |||
| /* It's not recommended to change the desktop window flags directly for a TopLevelWindow, | |||
| @@ -277,7 +279,8 @@ void TopLevelWindow::addToDesktop (int windowStyleFlags, void* nativeWindowToAtt | |||
| method, then add or remove whatever flags are necessary from this value before returning it. | |||
| */ | |||
| jassert (windowStyleFlags == getDesktopWindowStyleFlags()); | |||
| jassert ((windowStyleFlags & ~juce_windowIsSemiTransparentFlag) | |||
| == (getDesktopWindowStyleFlags() & ~juce_windowIsSemiTransparentFlag)); | |||
| Component::addToDesktop (windowStyleFlags, nativeWindowToAttachTo); | |||
| @@ -288,7 +288,7 @@ const TypefaceGlyphInfo* Typeface::getGlyph (const juce_wchar character) throw() | |||
| return g; | |||
| } | |||
| if ((! isFullyPopulated) | |||
| if ((! isFullyPopulated) | |||
| && findAndAddSystemGlyph (character)) | |||
| { | |||
| for (int i = 0; i < glyphs.size(); ++i) | |||
| @@ -100,6 +100,9 @@ public: | |||
| */ | |||
| int subPathIndex; | |||
| /** Returns true if the current segment is the last in the current sub-path. */ | |||
| bool isLastInSubpath() const throw() { return stackPos == stackBase; } | |||
| //============================================================================== | |||
| juce_UseDebuggingNewOperator | |||
| @@ -506,7 +506,7 @@ void PathStrokeType::createStrokedPath (Path& destPath, | |||
| const float hypotSquared = dx*dx + dy*dy; | |||
| if (it.closesSubPath || hypotSquared > minSegmentLength) | |||
| if (it.closesSubPath || hypotSquared > minSegmentLength || it.isLastInSubpath()) | |||
| { | |||
| const float len = sqrtf (hypotSquared); | |||
| @@ -155,7 +155,12 @@ inline void bigEndian24BitToChars (const int value, char* const destBytes) throw | |||
| This is faster than using the normal c++ cast to convert a double to an int, and | |||
| it will round the value to the nearest integer, rather than rounding it down | |||
| like the normal cast does. | |||
| like the normal cast does. | |||
| Note that this routine gets its speed at the expense of some accuracy, and when | |||
| rounding values whose floating point component is exactly 0.5, odd numbers and | |||
| even numbers will be rounded up or down differently. For a more accurate conversion, | |||
| see roundDoubleToIntAccurate(). | |||
| */ | |||
| inline int roundDoubleToInt (const double value) throw() | |||
| { | |||
| @@ -169,11 +174,25 @@ inline int roundDoubleToInt (const double value) throw() | |||
| #endif | |||
| } | |||
| /** Fast floating-point-to-integer conversion. | |||
| This is a slightly slower and slightly more accurate version of roundDoubleToInt(). It works | |||
| fine for values above zero, but negative numbers are rounded the wrong way. | |||
| */ | |||
| inline int roundDoubleToIntAccurate (const double value) throw() | |||
| { | |||
| return roundDoubleToInt (value + 1.5e-8); | |||
| } | |||
| /** Fast floating-point-to-integer conversion. | |||
| This is faster than using the normal c++ cast to convert a float to an int, and | |||
| it will round the value to the nearest integer, rather than rounding it down | |||
| like the normal cast does. | |||
| Note that this routine gets its speed at the expense of some accuracy, and when | |||
| rounding values whose floating point component is exactly 0.5, odd numbers and | |||
| even numbers will be rounded up or down differently. | |||
| */ | |||
| inline int roundFloatToInt (const float value) throw() | |||
| { | |||
| @@ -44,7 +44,7 @@ | |||
| If you may be finding a large number of files, this is better than | |||
| using File::findChildFiles() because it doesn't block while it finds them | |||
| all, and this is more mempry-efficient. | |||
| all, and this is more memory-efficient. | |||
| It can also guess how far it's got using a wildly inaccurate algorithm. | |||
| */ | |||
| @@ -444,6 +444,9 @@ public: | |||
| If the target file already exists, this will attempt to delete it first, and | |||
| will fail if this can't be done. | |||
| Note that the destination file isn't the directory to put it in, it's the actual | |||
| filename that you want the new file to have. | |||
| @returns true if the operation succeeds | |||
| */ | |||
| bool moveFileTo (const File& targetLocation) const throw(); | |||
| @@ -144,12 +144,12 @@ int BufferedInputStream::read (void* destBuffer, int maxBytesToRead) | |||
| if (isExhausted()) | |||
| break; | |||
| const int bytesAvailable = jmin (maxBytesToRead, (int) (lastReadPos - position)); | |||
| memcpy (destBuffer, buffer + (position - bufferStart), bytesAvailable); | |||
| maxBytesToRead -= bytesAvailable; | |||
| bytesRead += bytesAvailable; | |||
| position += bytesAvailable; | |||
| destBuffer = (void*) (((char*) destBuffer) + bytesAvailable); | |||
| const int bytesAvailable = jmin (maxBytesToRead, (int) (lastReadPos - position)); | |||
| memcpy (destBuffer, buffer + (position - bufferStart), bytesAvailable); | |||
| maxBytesToRead -= bytesAvailable; | |||
| bytesRead += bytesAvailable; | |||
| position += bytesAvailable; | |||
| destBuffer = (void*) (((char*) destBuffer) + bytesAvailable); | |||
| } | |||
| return bytesRead; | |||
| @@ -194,9 +194,9 @@ ZipFile::~ZipFile() throw() | |||
| delete source; | |||
| #ifdef JUCE_DEBUG | |||
| // If you hit this assertion, it means you've created a stream to read | |||
| // one of the items in the zipfile, but you've forgotten to delete that | |||
| // stream object before deleting the file.. Streams can't be kept open | |||
| // If you hit this assertion, it means you've created a stream to read | |||
| // one of the items in the zipfile, but you've forgotten to delete that | |||
| // stream object before deleting the file.. Streams can't be kept open | |||
| // after the file is deleted because they need to share the input | |||
| // stream that the file uses to read itself. | |||
| jassert (numOpenStreams == 0); | |||
| @@ -243,7 +243,7 @@ InputStream* ZipFile::createStreamForEntry (const int index) | |||
| if (zei->compressed) | |||
| { | |||
| stream = new GZIPDecompressorInputStream (stream, true, true, | |||
| stream = new GZIPDecompressorInputStream (stream, true, true, | |||
| zei->entry.uncompressedSize); | |||
| // (much faster to unzip in big blocks using a buffer..) | |||