Blame IlmImf/ImfDwaCompressor.h

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