Blame IlmImf/ImfDwaCompressor.h

Packit 0d464f
///////////////////////////////////////////////////////////////////////////
Packit 0d464f
//
Packit 0d464f
// Copyright (c) 2009-2014 DreamWorks Animation LLC. 
Packit 0d464f
//
Packit 0d464f
// All rights reserved.
Packit 0d464f
//
Packit 0d464f
// Redistribution and use in source and binary forms, with or without
Packit 0d464f
// modification, are permitted provided that the following conditions are
Packit 0d464f
// met:
Packit 0d464f
// *       Redistributions of source code must retain the above copyright
Packit 0d464f
// notice, this list of conditions and the following disclaimer.
Packit 0d464f
// *       Redistributions in binary form must reproduce the above
Packit 0d464f
// copyright notice, this list of conditions and the following disclaimer
Packit 0d464f
// in the documentation and/or other materials provided with the
Packit 0d464f
// distribution.
Packit 0d464f
// *       Neither the name of DreamWorks Animation nor the names of
Packit 0d464f
// its contributors may be used to endorse or promote products derived
Packit 0d464f
// from this software without specific prior written permission.
Packit 0d464f
//
Packit 0d464f
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
Packit 0d464f
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
Packit 0d464f
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
Packit 0d464f
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
Packit 0d464f
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
Packit 0d464f
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
Packit 0d464f
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
Packit 0d464f
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
Packit 0d464f
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
Packit 0d464f
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
Packit 0d464f
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Packit 0d464f
//
Packit 0d464f
///////////////////////////////////////////////////////////////////////////
Packit 0d464f
Packit 0d464f
#ifndef INCLUDED_IMF_DWA_COMRESSOR_H
Packit 0d464f
#define INCLUDED_IMF_DWA_COMRESSOR_H
Packit 0d464f
Packit 0d464f
//------------------------------------------------------------------------------
Packit 0d464f
//
Packit 0d464f
// class DwaCompressor -- Store lossy RGB data by quantizing DCT components.
Packit 0d464f
//
Packit 0d464f
//------------------------------------------------------------------------------
Packit 0d464f
Packit 0d464f
#include <vector>
Packit 0d464f
#include <half.h>
Packit 0d464f
Packit 0d464f
#include "ImfInt64.h"
Packit 0d464f
#include "ImfZip.h"
Packit 0d464f
#include "ImfChannelList.h"
Packit 0d464f
#include "ImfCompressor.h"
Packit 0d464f
#include "ImfNamespace.h"
Packit 0d464f
Packit 0d464f
OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER
Packit 0d464f
Packit 0d464f
class DwaCompressor: public Compressor
Packit 0d464f
{
Packit 0d464f
  public:
Packit 0d464f
Packit 0d464f
    enum AcCompression 
Packit 0d464f
    {
Packit 0d464f
        STATIC_HUFFMAN,
Packit 0d464f
        DEFLATE,
Packit 0d464f
    };
Packit 0d464f
Packit 0d464f
Packit 0d464f
    DwaCompressor (const Header &hdr, 
Packit 0d464f
                   int           maxScanLineSize,
Packit 0d464f
                   int           numScanLines,    // ideally is a multiple of 8
Packit 0d464f
                   AcCompression acCompression);
Packit 0d464f
Packit 0d464f
    virtual ~DwaCompressor ();
Packit 0d464f
Packit 0d464f
    virtual int numScanLines () const;
Packit 0d464f
Packit 0d464f
    virtual Imf::Compressor::Format format () const;
Packit 0d464f
Packit 0d464f
    virtual int compress (const char *inPtr,
Packit 0d464f
                          int         inSize,
Packit 0d464f
                          int         minY,
Packit 0d464f
                          const char *&outPtr);
Packit 0d464f
Packit 0d464f
    virtual int compressTile (const char   *inPtr,
Packit 0d464f
                              int           inSize,
Packit 0d464f
                              Imath::Box2i  range,
Packit 0d464f
                              const char  *&outPtr);
Packit 0d464f
Packit 0d464f
    virtual int uncompress (const char *inPtr,
Packit 0d464f
                            int         inSize,
Packit 0d464f
                            int         minY,
Packit 0d464f
                            const char *&outPtr);
Packit 0d464f
Packit 0d464f
    virtual int uncompressTile (const char  *inPtr,
Packit 0d464f
                                int          inSize,
Packit 0d464f
                                Imath::Box2i range,
Packit 0d464f
                                const char *&outPtr);
Packit 0d464f
Packit 0d464f
    static void initializeFuncs ();
Packit 0d464f
Packit 0d464f
  private:
Packit 0d464f
Packit 0d464f
    struct ChannelData;
Packit 0d464f
    struct CscChannelSet;
Packit 0d464f
    struct Classifier;
Packit 0d464f
    
Packit 0d464f
    class LossyDctDecoderBase;
Packit 0d464f
    class LossyDctDecoder;
Packit 0d464f
    class LossyDctDecoderCsc;
Packit 0d464f
Packit 0d464f
    class LossyDctEncoderBase;
Packit 0d464f
    class LossyDctEncoder;
Packit 0d464f
    class LossyDctEncoderCsc;
Packit 0d464f
Packit 0d464f
    enum CompressorScheme 
Packit 0d464f
    {
Packit 0d464f
        UNKNOWN = 0,
Packit 0d464f
        LOSSY_DCT,
Packit 0d464f
        RLE,
Packit 0d464f
        
Packit 0d464f
        NUM_COMPRESSOR_SCHEMES
Packit 0d464f
    };
Packit 0d464f
Packit 0d464f
    //
Packit 0d464f
    // Per-chunk compressed data sizes, one value per chunk
Packit 0d464f
    //
Packit 0d464f
Packit 0d464f
    enum DataSizesSingle 
Packit 0d464f
    {
Packit 0d464f
        VERSION = 0,                  // Version number:
Packit 0d464f
                                      //   0: classic
Packit 0d464f
                                      //   1: adds "end of block" to the AC RLE
Packit 0d464f
Packit 0d464f
        UNKNOWN_UNCOMPRESSED_SIZE,    // Size of leftover data, uncompressed.
Packit 0d464f
        UNKNOWN_COMPRESSED_SIZE,      // Size of leftover data, zlib compressed.
Packit 0d464f
Packit 0d464f
        AC_COMPRESSED_SIZE,           // AC RLE + Huffman size
Packit 0d464f
        DC_COMPRESSED_SIZE,           // DC + Deflate size
Packit 0d464f
        RLE_COMPRESSED_SIZE,          // RLE + Deflate data size
Packit 0d464f
        RLE_UNCOMPRESSED_SIZE,        // RLE'd data size 
Packit 0d464f
        RLE_RAW_SIZE,                 // Un-RLE'd data size
Packit 0d464f
Packit 0d464f
        AC_UNCOMPRESSED_COUNT,        // AC RLE number of elements
Packit 0d464f
        DC_UNCOMPRESSED_COUNT,        // DC number of elements
Packit 0d464f
Packit 0d464f
        AC_COMPRESSION,               // AC compression strategy
Packit 0d464f
        NUM_SIZES_SINGLE
Packit 0d464f
    };
Packit 0d464f
Packit 0d464f
    AcCompression     _acCompression;
Packit 0d464f
Packit 0d464f
    int               _maxScanLineSize;
Packit 0d464f
    int               _numScanLines;
Packit 0d464f
    int               _min[2], _max[2];
Packit 0d464f
Packit 0d464f
    ChannelList                _channels;
Packit 0d464f
    std::vector<ChannelData>   _channelData;
Packit 0d464f
    std::vector<CscChannelSet> _cscSets;
Packit 0d464f
    std::vector<Classifier>    _channelRules;
Packit 0d464f
Packit 0d464f
    char             *_packedAcBuffer;
Packit 0d464f
    size_t            _packedAcBufferSize;
Packit 0d464f
    char             *_packedDcBuffer;
Packit 0d464f
    size_t            _packedDcBufferSize;
Packit 0d464f
    char             *_rleBuffer;
Packit 0d464f
    size_t            _rleBufferSize;
Packit 0d464f
    char             *_outBuffer;
Packit 0d464f
    size_t            _outBufferSize;
Packit 0d464f
    char             *_planarUncBuffer[NUM_COMPRESSOR_SCHEMES];
Packit 0d464f
    size_t            _planarUncBufferSize[NUM_COMPRESSOR_SCHEMES];
Packit 0d464f
Packit 0d464f
    Zip              *_zip;
Packit 0d464f
    float             _dwaCompressionLevel;
Packit 0d464f
Packit 0d464f
    int compress (const char   *inPtr,
Packit 0d464f
                  int           inSize,
Packit 0d464f
                  Imath::Box2i  range,
Packit 0d464f
                  const char  *&outPtr);
Packit 0d464f
Packit 0d464f
    int uncompress (const char   *inPtr,
Packit 0d464f
                    int           inSize,
Packit 0d464f
                    Imath::Box2i  range,
Packit 0d464f
                    const char  *&outPtr);
Packit 0d464f
Packit 0d464f
    void initializeBuffers (size_t&);
Packit 0d464f
    void initializeDefaultChannelRules ();
Packit 0d464f
    void initializeLegacyChannelRules ();
Packit 0d464f
Packit 0d464f
    void relevantChannelRules( std::vector<Classifier> &) const;
Packit 0d464f
Packit 0d464f
    //
Packit 0d464f
    // Populate our cached version of the channel data with
Packit 0d464f
    // data from the real channel list. We want to 
Packit 0d464f
    // copy over attributes, determine compression schemes
Packit 0d464f
    // releveant for the channel type, and find sets of
Packit 0d464f
    // channels to be compressed from Y'CbCr data instead 
Packit 0d464f
    // of R'G'B'.
Packit 0d464f
    //
Packit 0d464f
Packit 0d464f
    void classifyChannels (ChannelList                  channels,
Packit 0d464f
                           std::vector<ChannelData>    &chanData, 
Packit 0d464f
                           std::vector<CscChannelSet>  &cscData);
Packit 0d464f
Packit 0d464f
    // 
Packit 0d464f
    // Compute various buffer pointers for each channel
Packit 0d464f
    //
Packit 0d464f
Packit 0d464f
    void setupChannelData (int minX, int minY, int maxX, int maxY);
Packit 0d464f
};
Packit 0d464f
Packit 0d464f
OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT
Packit 0d464f
Packit 0d464f
#endif