|
rpm-build |
d2b433 |
/*
|
|
rpm-build |
d2b433 |
* libopenraw - ljpegdecompressor_priv.h
|
|
rpm-build |
d2b433 |
*
|
|
rpm-build |
d2b433 |
* Copyright (C) 2007-2013 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_PRIV_H
|
|
rpm-build |
d2b433 |
#define OR_INTERNALS_LJPEGDECOMPRESSOR_PRIV_H
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
#include <string.h>
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
namespace OpenRaw {
|
|
rpm-build |
d2b433 |
namespace Internals {
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
/*
|
|
rpm-build |
d2b433 |
* The following structure stores basic information about one component.
|
|
rpm-build |
d2b433 |
*/
|
|
rpm-build |
d2b433 |
typedef struct JpegComponentInfo {
|
|
rpm-build |
d2b433 |
/*
|
|
rpm-build |
d2b433 |
* These values are fixed over the whole image.
|
|
rpm-build |
d2b433 |
* They are read from the SOF marker.
|
|
rpm-build |
d2b433 |
*/
|
|
rpm-build |
d2b433 |
int16_t componentId; /* identifier for this component (0..255) */
|
|
rpm-build |
d2b433 |
int16_t componentIndex; /* its index in SOF or cPtr->compInfo[] */
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
/*
|
|
rpm-build |
d2b433 |
* Downsampling is not normally used in lossless JPEG, although
|
|
rpm-build |
d2b433 |
* it is permitted by the JPEG standard (DIS). We set all sampling
|
|
rpm-build |
d2b433 |
* factors to 1 in this program.
|
|
rpm-build |
d2b433 |
*/
|
|
rpm-build |
d2b433 |
int16_t hSampFactor; /* horizontal sampling factor */
|
|
rpm-build |
d2b433 |
int16_t vSampFactor; /* vertical sampling factor */
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
/*
|
|
rpm-build |
d2b433 |
* Huffman table selector (0..3). The value may vary
|
|
rpm-build |
d2b433 |
* between scans. It is read from the SOS marker.
|
|
rpm-build |
d2b433 |
*/
|
|
rpm-build |
d2b433 |
int16_t dcTblNo;
|
|
rpm-build |
d2b433 |
} JpegComponentInfo;
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
/*
|
|
rpm-build |
d2b433 |
* One of the following structures is created for each huffman coding
|
|
rpm-build |
d2b433 |
* table. We use the same structure for encoding and decoding, so there
|
|
rpm-build |
d2b433 |
* may be some extra fields for encoding that aren't used in the decoding
|
|
rpm-build |
d2b433 |
* and vice-versa.
|
|
rpm-build |
d2b433 |
*/
|
|
rpm-build |
d2b433 |
struct HuffmanTable {
|
|
rpm-build |
d2b433 |
/*
|
|
rpm-build |
d2b433 |
* These two fields directly represent the contents of a JPEG DHT
|
|
rpm-build |
d2b433 |
* marker
|
|
rpm-build |
d2b433 |
*/
|
|
rpm-build |
d2b433 |
uint8_t bits[17];
|
|
rpm-build |
d2b433 |
uint8_t huffval[256];
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
/*
|
|
rpm-build |
d2b433 |
* This field is used only during compression. It's initialized
|
|
rpm-build |
d2b433 |
* FALSE when the table is created, and set TRUE when it's been
|
|
rpm-build |
d2b433 |
* output to the file.
|
|
rpm-build |
d2b433 |
*/
|
|
rpm-build |
d2b433 |
bool sentTable;
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
/*
|
|
rpm-build |
d2b433 |
* The remaining fields are computed from the above to allow more
|
|
rpm-build |
d2b433 |
* efficient coding and decoding. These fields should be considered
|
|
rpm-build |
d2b433 |
* private to the Huffman compression & decompression modules.
|
|
rpm-build |
d2b433 |
*/
|
|
rpm-build |
d2b433 |
uint16_t ehufco[256];
|
|
rpm-build |
d2b433 |
char ehufsi[256];
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
uint16_t mincode[17];
|
|
rpm-build |
d2b433 |
int32_t maxcode[18];
|
|
rpm-build |
d2b433 |
int16_t valptr[17];
|
|
rpm-build |
d2b433 |
int32_t numbits[256];
|
|
rpm-build |
d2b433 |
int32_t value[256];
|
|
rpm-build |
d2b433 |
};
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
/*
|
|
rpm-build |
d2b433 |
* One of the following structures is used to pass around the
|
|
rpm-build |
d2b433 |
* decompression information.
|
|
rpm-build |
d2b433 |
*/
|
|
rpm-build |
d2b433 |
struct DecompressInfo
|
|
rpm-build |
d2b433 |
{
|
|
rpm-build |
d2b433 |
// non copyable
|
|
rpm-build |
d2b433 |
DecompressInfo(const DecompressInfo&) = delete;
|
|
rpm-build |
d2b433 |
DecompressInfo& operator=(const DecompressInfo&) = delete;
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
DecompressInfo()
|
|
rpm-build |
d2b433 |
: imageWidth(0), imageHeight(0),
|
|
rpm-build |
d2b433 |
dataPrecision(0), compInfo(NULL),
|
|
rpm-build |
d2b433 |
numComponents(0),
|
|
rpm-build |
d2b433 |
compsInScan(0),
|
|
rpm-build |
d2b433 |
Ss(0), Pt(0),
|
|
rpm-build |
d2b433 |
restartInterval(0), restartInRows(0),
|
|
rpm-build |
d2b433 |
restartRowsToGo(0), nextRestartNum(0)
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
{
|
|
rpm-build |
d2b433 |
memset(&curCompInfo, 0, sizeof(curCompInfo));
|
|
rpm-build |
d2b433 |
memset(&MCUmembership, 0, sizeof(MCUmembership));
|
|
rpm-build |
d2b433 |
memset(&dcHuffTblPtrs, 0, sizeof(dcHuffTblPtrs));
|
|
rpm-build |
d2b433 |
}
|
|
rpm-build |
d2b433 |
~DecompressInfo()
|
|
rpm-build |
d2b433 |
{
|
|
rpm-build |
d2b433 |
int i;
|
|
rpm-build |
d2b433 |
for(i = 0; i < 4; i++) {
|
|
rpm-build |
d2b433 |
if(dcHuffTblPtrs[i]) {
|
|
rpm-build |
d2b433 |
free(dcHuffTblPtrs[i]);
|
|
rpm-build |
d2b433 |
}
|
|
rpm-build |
d2b433 |
}
|
|
rpm-build |
d2b433 |
if(compInfo) {
|
|
rpm-build |
d2b433 |
free(compInfo);
|
|
rpm-build |
d2b433 |
}
|
|
rpm-build |
d2b433 |
}
|
|
rpm-build |
d2b433 |
/*
|
|
rpm-build |
d2b433 |
* Image width, height, and image data precision (bits/sample)
|
|
rpm-build |
d2b433 |
* These fields are set by ReadFileHeader or ReadScanHeader
|
|
rpm-build |
d2b433 |
*/
|
|
rpm-build |
d2b433 |
int32_t imageWidth;
|
|
rpm-build |
d2b433 |
int32_t imageHeight;
|
|
rpm-build |
d2b433 |
int32_t dataPrecision;
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
/*
|
|
rpm-build |
d2b433 |
* compInfo[i] describes component that appears i'th in SOF
|
|
rpm-build |
d2b433 |
* numComponents is the # of color components in JPEG image.
|
|
rpm-build |
d2b433 |
*/
|
|
rpm-build |
d2b433 |
JpegComponentInfo *compInfo;
|
|
rpm-build |
d2b433 |
int16_t numComponents;
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
/*
|
|
rpm-build |
d2b433 |
* *curCompInfo[i] describes component that appears i'th in SOS.
|
|
rpm-build |
d2b433 |
* compsInScan is the # of color components in current scan.
|
|
rpm-build |
d2b433 |
*/
|
|
rpm-build |
d2b433 |
JpegComponentInfo *curCompInfo[4];
|
|
rpm-build |
d2b433 |
int16_t compsInScan;
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
/*
|
|
rpm-build |
d2b433 |
* MCUmembership[i] indexes the i'th component of MCU into the
|
|
rpm-build |
d2b433 |
* curCompInfo array.
|
|
rpm-build |
d2b433 |
*/
|
|
rpm-build |
d2b433 |
int16_t MCUmembership[10];
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
/*
|
|
rpm-build |
d2b433 |
* ptrs to Huffman coding tables, or NULL if not defined
|
|
rpm-build |
d2b433 |
*/
|
|
rpm-build |
d2b433 |
HuffmanTable *dcHuffTblPtrs[4];
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
/*
|
|
rpm-build |
d2b433 |
* prediction seletion value (PSV) and point transform parameter (Pt)
|
|
rpm-build |
d2b433 |
*/
|
|
rpm-build |
d2b433 |
int32_t Ss;
|
|
rpm-build |
d2b433 |
int32_t Pt;
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
/*
|
|
rpm-build |
d2b433 |
* In lossless JPEG, restart interval shall be an integer
|
|
rpm-build |
d2b433 |
* multiple of the number of MCU in a MCU row.
|
|
rpm-build |
d2b433 |
*/
|
|
rpm-build |
d2b433 |
int32_t restartInterval;/* MCUs per restart interval, 0 = no restart */
|
|
rpm-build |
d2b433 |
int32_t restartInRows; /*if > 0, MCU rows per restart interval; 0 = no restart*/
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
/*
|
|
rpm-build |
d2b433 |
* these fields are private data for the entropy decoder
|
|
rpm-build |
d2b433 |
*/
|
|
rpm-build |
d2b433 |
int32_t restartRowsToGo; /* MCUs rows left in this restart interval */
|
|
rpm-build |
d2b433 |
int16_t nextRestartNum; /* # of next RSTn marker (0..7) */
|
|
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 |
|