58#define CodeBufferBitLen (CodeBufferLen*WordWidth)
59#define MaxCodeLen ((1 << RLblockSizeLen) - 1)
77#ifdef __PGFROISUPPORT__
88#ifdef LIBPGF_USE_OPENMP
95#ifdef LIBPGF_USE_OPENMP
113 preHeader.hSize =
__VAL(preHeader.hSize);
115 m_stream->Write(&count, &preHeader);
118 header.height =
__VAL(header.height);
119 header.width =
__VAL(header.width);
127 m_stream->Write(&count, (
void *)postHeader.clut);
131 if (postHeader.userDataLen) {
132 if (postHeader.userData) {
134 count = postHeader.userDataLen;
135 m_stream->Write(&count, postHeader.userData);
137 m_stream->SetPos(FSFromCurrent, count);
166 preHeader.hSize =
__VAL(preHeader.hSize);
167 m_stream->Write(&count, &preHeader);
169 m_stream->SetPos(FSFromStart, curPos);
179 delete[] levelLength;
180 levelLength =
new(std::nothrow) UINT32[
m_nLevels];
181 if (!levelLength) ReturnWithError(InsufficientMemory);
182 for (UINT8 l = 0; l <
m_nLevels; l++) levelLength[l] = 0;
209 #ifdef PGF_USE_BIG_ENDIAN
215 m_stream->Write(&count, &levelLength);
224 m_stream->SetPos(FSFromCurrent, count);
228 UINT32 retValue = UINT32(curPos -
m_stream->GetPos());
231 m_stream->SetPos(FSFromStart, curPos);
252 const int wr = pitch - ww.rem;
253 int pos, base = startPos, base2;
256 for (
int i=0; i < hh.quot; i++) {
259 for (
int j=0; j < ww.quot; j++) {
273 for (
int x=0; x < ww.rem; x++) {
283 for (
int j=0; j < ww.quot; j++) {
286 for (
int y=0; y < hh.rem; y++) {
297 for (
int y=0; y < hh.rem; y++) {
299 for (
int x=0; x < ww.rem; x++) {
343#ifdef __PGFROISUPPORT__
383#ifdef LIBPGF_USE_OPENMP
384 #pragma omp parallel for default(shared)
408#ifdef __PGFROISUPPORT__
412 int count =
sizeof(UINT16);
419#ifdef PGF_USE_BIG_ENDIAN
421 UINT16 wl =
__VAL(wordLen);
422 m_stream->Write(&count, &wl); ASSERT(count ==
sizeof(UINT16));
424#ifdef __PGFROISUPPORT__
428 m_stream->Write(&count, &h.
val); ASSERT(count ==
sizeof(UINT16));
433 for (
int i=0; i < wordLen; i++) {
434 block->m_codeBuffer[i] =
__VAL(block->m_codeBuffer[i]);
438 m_stream->Write(&count, &wordLen); ASSERT(count ==
sizeof(UINT16));
440#ifdef __PGFROISUPPORT__
443 m_stream->Write(&count, &h.
val); ASSERT(count ==
sizeof(UINT16));
450 m_stream->Write(&count, block->m_codeBuffer);
466 block->m_valuePos = 0;
467 block->m_maxAbsValue = 0;
482 UINT32 sigLen, codeLen = 0, wordPos, refLen, signLen;
495 for (UINT32 k=0; k < bufferSize; k++) {
501 for (UINT32 k=0; k < bufferSize; k++) {
516 planeMask = 1 << (nPlanes - 1);
518 for (
int plane = nPlanes - 1; plane >= 0; plane--) {
555 if (
m_encoder->m_favorSpeed || signLen == 0) {
564 if (useRL && codeLen <=
MaxCodeLen && codeLen < signLen) {
591 for (UINT32 k=0; k < codeLen; k++) {
601 for (UINT32 k=0; k < refLen; k++) {
613 for (UINT32 k=0; k < refLen; k++) {
639 UINT32 valuePos = 0, valueEnd;
646 const UINT32 outStartPos = codePos;
648 UINT32 runlen = 1 << k;
651 while (valuePos < bufferSize) {
658 while (valuePos < valueEnd) {
675 SetBit(signBits, signLen++);
683 SetBit(sigBits, sigPos++);
693 if (count == runlen) {
712 if (valuePos < bufferSize) {
735 ASSERT(sigPos <= bufferSize);
736 ASSERT(refPos <= bufferSize);
737 ASSERT(signLen <= bufferSize);
738 ASSERT(valuePos == bufferSize);
740 codeLen = codePos - outStartPos;
777 const UINT32 outStartPos = codePos;
779 UINT32 runlen = 1 << k;
783 while (signPos < signLen) {
787 if (count == runlen) {
799 signPos += count + 1;
812 ASSERT(signPos == signLen || signPos == signLen + 1);
814 return codePos - outStartPos;
819void CEncoder::DumpBuffer()
const {
UINT32 AlignWordPos(UINT32 pos)
void SetBit(UINT32 *stream, UINT32 pos)
void SetValueBlock(UINT32 *stream, UINT32 pos, UINT32 val, UINT32 k)
void ClearBit(UINT32 *stream, UINT32 pos)
UINT32 SeekBit1Range(UINT32 *stream, UINT32 pos, UINT32 len)
UINT32 NumberOfWords(UINT32 pos)
#define CodeBufferBitLen
max number of bits in m_codeBuffer
#define MaxCodeLen
max length of RL encoded block
#define CodeBufferLen
number of words in code buffer (CodeBufferLen > BufferLen)
#define BufferLen
number of words per buffer
#define MaxBitPlanesLog
number of bits to code the maximum number of bit planes (in 32 or 16 bit mode)
#define LinBlockSize
side length of a coefficient block in a HH or LL subband
#define BufferSize
must be a multiple of WordWidth
#define RLblockSizeLen
block size length (< 16): ld(BufferSize) < RLblockSizeLen <= 2*ld(BufferSize)
#define MaxBitPlanes
maximum number of bit planes of m_value: 32 minus sign bit
A macro block is an encoding unit of fixed size (uncoded)
DataT m_value[BufferSize]
input buffer of values with index m_valuePos
UINT8 NumberOfBitplanes()
UINT32 DecomposeBitplane(UINT32 bufferSize, UINT32 planeMask, UINT32 codePos, UINT32 *sigBits, UINT32 *refBits, UINT32 *signBits, UINT32 &signLen, UINT32 &codeLen)
UINT32 RLESigns(UINT32 codePos, UINT32 *signBits, UINT32 signLen)
UINT32 m_codeBuffer[CodeBufferLen]
output buffer for encoded bitstream
UINT32 m_codePos
current position in encoded bitstream
bool m_sigFlagVector[BufferSize+1]
bool GetBitAtPos(UINT32 pos, UINT32 planeMask) const
UINT32 m_maxAbsValue
maximum absolute coefficient in each buffer
ROIBlockHeader m_header
block header
void SetBufferStartPos()
Save current stream position as beginning of current level.
UINT64 m_bufferStartPos
stream position of encoded buffer
bool m_favorSpeed
favor speed over size
UINT64 m_startPosition
stream position of PGF start (PreHeader)
INT64 ComputeBufferLength() const
bool m_forceWriting
all macro blocks have to be written into the stream
UINT64 m_levelLengthPos
stream position of Metadata
CMacroBlock * m_currentBlock
current macro block (used by main thread)
void WriteMacroBlock(CMacroBlock *block) THROW_
UINT32 * m_levelLength
temporary saves the level index
CMacroBlock ** m_macroBlocks
array of macroblocks
void WriteValue(CSubband *band, int bandPos) THROW_
UINT8 m_nLevels
number of levels
int m_currLevelIndex
counts where (=index) to save next value
UINT32 WriteLevelLength(UINT32 *&levelLength) THROW_
UINT32 UpdateLevelLength() THROW_
int m_lastMacroBlock
array index of the last created macro block
void Partition(CSubband *band, int width, int height, int startPos, int pitch) THROW_
CPGFStream * m_stream
output PMF stream
CEncoder(CPGFStream *stream, PGFPreHeader preHeader, PGFHeader header, const PGFPostHeader &postHeader, UINT64 &userDataPos, bool useOMP) THROW_
void EncodeBuffer(ROIBlockHeader h) THROW_
int m_macroBlockLen
array length
void UpdatePostHeaderSize(PGFPreHeader preHeader) THROW_
Abstract stream base class.