Blame lib/ljpegdecompressor.hpp

rpm-build d2b433
/* -*- Mode: C++ -*- */
rpm-build d2b433
/*
rpm-build d2b433
 * libopenraw - ljpegdecompressor.h
rpm-build d2b433
 *
rpm-build d2b433
 * Copyright (C) 2007-2016 Hubert Figuiere
rpm-build d2b433
 *
rpm-build d2b433
 * This library is free software: you can redistribute it and/or
rpm-build d2b433
 * modify it under the terms of the GNU Lesser General Public License
rpm-build d2b433
 * as published by the Free Software Foundation, either version 3 of
rpm-build d2b433
 * the License, or (at your option) any later version.
rpm-build d2b433
 *
rpm-build d2b433
 * This library is distributed in the hope that it will be useful,
rpm-build d2b433
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
rpm-build d2b433
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
rpm-build d2b433
 * Lesser General Public License for more details.
rpm-build d2b433
 *
rpm-build d2b433
 * You should have received a copy of the GNU Lesser General Public
rpm-build d2b433
 * License along with this library.  If not, see
rpm-build d2b433
 * <http://www.gnu.org/licenses/>.
rpm-build d2b433
 */
rpm-build d2b433
rpm-build d2b433
#ifndef OR_INTERNALS_LJPEGDECOMPRESSOR_H_
rpm-build d2b433
#define OR_INTERNALS_LJPEGDECOMPRESSOR_H_
rpm-build d2b433
rpm-build d2b433
#include <stddef.h>
rpm-build d2b433
#include <sys/types.h>
rpm-build d2b433
#include <stdint.h>
rpm-build d2b433
rpm-build d2b433
#include <vector>
rpm-build d2b433
rpm-build d2b433
#include "decompressor.hpp"
rpm-build d2b433
rpm-build d2b433
namespace OpenRaw {
rpm-build d2b433
rpm-build d2b433
class RawData;
rpm-build d2b433
rpm-build d2b433
namespace Internals {
rpm-build d2b433
rpm-build d2b433
class Stream;
rpm-build d2b433
class RawContainer;
rpm-build d2b433
struct HuffmanTable;
rpm-build d2b433
struct DecompressInfo;
rpm-build d2b433
rpm-build d2b433
typedef int16_t ComponentType;
rpm-build d2b433
typedef ComponentType *MCU;
rpm-build d2b433
rpm-build d2b433
rpm-build d2b433
class LJpegDecompressor
rpm-build d2b433
    : public Decompressor
rpm-build d2b433
{
rpm-build d2b433
public:
rpm-build d2b433
    LJpegDecompressor(IO::Stream *,
rpm-build d2b433
                      RawContainer *);
rpm-build d2b433
    virtual ~LJpegDecompressor();
rpm-build d2b433
rpm-build d2b433
    /** decompress the bitmapdata and return a new bitmap
rpm-build d2b433
     * @return the new bitmap decompressed. NULL is failure.
rpm-build d2b433
     */
rpm-build d2b433
    virtual RawDataPtr decompress() override;
rpm-build d2b433
    /** Set the "slices"
rpm-build d2b433
     * @param slices the vector containing the Canon-style slices.
rpm-build d2b433
     *
rpm-build d2b433
     * the format of the slices vector is as follow
rpm-build d2b433
     * N col1 col2
rpm-build d2b433
     * N is the number of repeat for col1. The total
rpm-build d2b433
     * number of slices is always N+1
rpm-build d2b433
     * This is for Canon CR2.
rpm-build d2b433
     */
rpm-build d2b433
    void setSlices(const std::vector<uint16_t> & slices);
rpm-build d2b433
    bool isSliced() const
rpm-build d2b433
        {
rpm-build d2b433
            return m_slices.size() > 1;
rpm-build d2b433
        }
rpm-build d2b433
private:
rpm-build d2b433
rpm-build d2b433
    /** read the bits
rpm-build d2b433
     * @param s the stream to read from
rpm-build d2b433
     * @param bitCount the number of bit
rpm-build d2b433
     * @return the value
rpm-build d2b433
     */
rpm-build d2b433
    int32_t readBits(IO::Stream * s, uint16_t bitCount);
rpm-build d2b433
    int32_t show_bits8(IO::Stream * s);
rpm-build d2b433
    void flush_bits(uint16_t nbits);
rpm-build d2b433
    int32_t get_bits(uint16_t nbits);
rpm-build d2b433
    int32_t get_bit();
rpm-build d2b433
rpm-build d2b433
/**
rpm-build d2b433
 * Enumerate all the JPEG marker codes
rpm-build d2b433
 */
rpm-build d2b433
    typedef enum {
rpm-build d2b433
        M_SOF0 = 0xc0,
rpm-build d2b433
        M_SOF1 = 0xc1,
rpm-build d2b433
        M_SOF2 = 0xc2,
rpm-build d2b433
        M_SOF3 = 0xc3,
rpm-build d2b433
rpm-build d2b433
        M_SOF5 = 0xc5,
rpm-build d2b433
        M_SOF6 = 0xc6,
rpm-build d2b433
        M_SOF7 = 0xc7,
rpm-build d2b433
rpm-build d2b433
        M_JPG = 0xc8,
rpm-build d2b433
        M_SOF9 = 0xc9,
rpm-build d2b433
        M_SOF10 = 0xca,
rpm-build d2b433
        M_SOF11 = 0xcb,
rpm-build d2b433
rpm-build d2b433
        M_SOF13 = 0xcd,
rpm-build d2b433
        M_SOF14 = 0xce,
rpm-build d2b433
        M_SOF15 = 0xcf,
rpm-build d2b433
rpm-build d2b433
        M_DHT = 0xc4,
rpm-build d2b433
rpm-build d2b433
        M_DAC = 0xcc,
rpm-build d2b433
rpm-build d2b433
        M_RST0 = 0xd0,
rpm-build d2b433
        M_RST1 = 0xd1,
rpm-build d2b433
        M_RST2 = 0xd2,
rpm-build d2b433
        M_RST3 = 0xd3,
rpm-build d2b433
        M_RST4 = 0xd4,
rpm-build d2b433
        M_RST5 = 0xd5,
rpm-build d2b433
        M_RST6 = 0xd6,
rpm-build d2b433
        M_RST7 = 0xd7,
rpm-build d2b433
rpm-build d2b433
        M_SOI = 0xd8,
rpm-build d2b433
        M_EOI = 0xd9,
rpm-build d2b433
        M_SOS = 0xda,
rpm-build d2b433
        M_DQT = 0xdb,
rpm-build d2b433
        M_DNL = 0xdc,
rpm-build d2b433
        M_DRI = 0xdd,
rpm-build d2b433
        M_DHP = 0xde,
rpm-build d2b433
        M_EXP = 0xdf,
rpm-build d2b433
rpm-build d2b433
        M_APP0 = 0xe0,
rpm-build d2b433
        M_APP15 = 0xef,
rpm-build d2b433
rpm-build d2b433
        M_JPG0 = 0xf0,
rpm-build d2b433
        M_JPG13 = 0xfd,
rpm-build d2b433
        M_COM = 0xfe,
rpm-build d2b433
rpm-build d2b433
        M_TEM = 0x01,
rpm-build d2b433
rpm-build d2b433
        M_ERROR = 0x100
rpm-build d2b433
    } JpegMarker;
rpm-build d2b433
rpm-build d2b433
    void DecoderStructInit (DecompressInfo *dcPtr) noexcept(false);
rpm-build d2b433
    void HuffDecoderInit (DecompressInfo *dcPtr) noexcept(false);
rpm-build d2b433
    void ProcessRestart (DecompressInfo *dcPtr) noexcept(false);
rpm-build d2b433
    void DecodeFirstRow(DecompressInfo *dcPtr,
rpm-build d2b433
                        MCU *curRowBuf);
rpm-build d2b433
    void DecodeImage(DecompressInfo *dcPtr);
rpm-build d2b433
    int32_t QuickPredict(int32_t col, int16_t curComp,
rpm-build d2b433
                         MCU *curRowBuf, MCU *prevRowBuf,
rpm-build d2b433
                         int32_t psv);
rpm-build d2b433
    void PmPutRow(MCU* RowBuf, int32_t numComp, int32_t numCol, int32_t Pt);
rpm-build d2b433
    void GetDht (DecompressInfo *dcPtr) noexcept(false);
rpm-build d2b433
    void GetDri (DecompressInfo *dcPtr) noexcept(false);
rpm-build d2b433
    void GetSof (DecompressInfo *dcPtr) noexcept(false);
rpm-build d2b433
    void GetSos (DecompressInfo *dcPtr) noexcept(false);
rpm-build d2b433
    JpegMarker ProcessTables (DecompressInfo *dcPtr);
rpm-build d2b433
    void ReadFileHeader (DecompressInfo *dcPtr) noexcept(false);
rpm-build d2b433
    int32_t ReadScanHeader (DecompressInfo *dcPtr);
rpm-build d2b433
    int32_t HuffDecode(HuffmanTable *htbl);
rpm-build d2b433
rpm-build d2b433
    std::vector<uint16_t> m_slices;
rpm-build d2b433
rpm-build d2b433
    MCU *m_mcuROW1, *m_mcuROW2;
rpm-build d2b433
    char *m_buf1,*m_buf2;
rpm-build d2b433
rpm-build d2b433
    /** fill the bit buffer */
rpm-build d2b433
    void fillBitBuffer (IO::Stream * s, uint16_t nbits);
rpm-build d2b433
    uint16_t m_bitsLeft;
rpm-build d2b433
    uint32_t m_getBuffer;
rpm-build d2b433
    RawDataPtr m_output;
rpm-build d2b433
rpm-build d2b433
    /** non copytable */
rpm-build d2b433
    LJpegDecompressor(const LJpegDecompressor& f) = delete;
rpm-build d2b433
    LJpegDecompressor & operator=(const LJpegDecompressor&) = delete;
rpm-build d2b433
};
rpm-build d2b433
rpm-build d2b433
}
rpm-build d2b433
}
rpm-build d2b433
rpm-build d2b433
rpm-build d2b433
rpm-build d2b433
#endif
rpm-build d2b433
/*
rpm-build d2b433
  Local Variables:
rpm-build d2b433
  mode:c++
rpm-build d2b433
  c-file-style:"stroustrup"
rpm-build d2b433
  c-file-offsets:((innamespace . 0))
rpm-build d2b433
  indent-tabs-mode:nil
rpm-build d2b433
  fill-column:80
rpm-build d2b433
  End:
rpm-build d2b433
*/