|
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 |
*/
|