libpgf
6.12.24
PGF - Progressive Graphics File
Main Page
Classes
Files
File List
File Members
All
Classes
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Friends
Macros
Encoder.h
Go to the documentation of this file.
1
/*
2
* The Progressive Graphics File; http://www.libpgf.org
3
*
4
* $Date: 2006-06-04 22:05:59 +0200 (So, 04 Jun 2006) $
5
* $Revision: 229 $
6
*
7
* This file Copyright (C) 2006 xeraina GmbH, Switzerland
8
*
9
* This program is free software; you can redistribute it and/or
10
* modify it under the terms of the GNU LESSER GENERAL PUBLIC LICENSE
11
* as published by the Free Software Foundation; either version 2.1
12
* of the License, or (at your option) any later version.
13
*
14
* This program is distributed in the hope that it will be useful,
15
* but WITHOUT ANY WARRANTY; without even the implied warranty of
16
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
* GNU General Public License for more details.
18
*
19
* You should have received a copy of the GNU General Public License
20
* along with this program; if not, write to the Free Software
21
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
22
*/
23
28
29
#ifndef PGF_ENCODER_H
30
#define PGF_ENCODER_H
31
32
#include "
PGFstream.h
"
33
#include "
BitStream.h
"
34
#include "
Subband.h
"
35
#include "
WaveletTransform.h
"
36
38
// Constants
39
#define BufferLen (BufferSize/WordWidth)
40
#define CodeBufferLen BufferSize
41
42
43
44
45
46
class
CEncoder
{
51
class
CMacroBlock
{
52
public
:
56
CMacroBlock
(
CEncoder
*encoder)
57
:
m_header
(0)
58
,
m_encoder
(encoder)
59
{
60
ASSERT(
m_encoder
);
61
Init
(-1);
62
}
63
67
void
Init
(
int
lastLevelIndex) {
// initialize for reusage
68
m_valuePos
= 0;
69
m_maxAbsValue
= 0;
70
m_codePos
= 0;
71
m_lastLevelIndex
= lastLevelIndex;
72
}
73
78
void
BitplaneEncode
();
79
80
DataT
m_value
[
BufferSize
];
81
UINT32
m_codeBuffer
[
CodeBufferLen
];
82
ROIBlockHeader
m_header
;
83
UINT32
m_valuePos
;
84
UINT32
m_maxAbsValue
;
85
UINT32
m_codePos
;
86
int
m_lastLevelIndex
;
87
88
private
:
89
UINT32
RLESigns
(UINT32 codePos, UINT32* signBits, UINT32 signLen);
90
UINT32
DecomposeBitplane
(UINT32 bufferSize, UINT32 planeMask, UINT32 codePos, UINT32* sigBits, UINT32* refBits, UINT32* signBits, UINT32& signLen, UINT32& codeLen);
91
UINT8
NumberOfBitplanes
();
92
bool
GetBitAtPos
(UINT32 pos, UINT32 planeMask)
const
{
return
(abs(
m_value
[pos]) & planeMask) > 0; }
93
94
CEncoder
*
m_encoder
;
// encoder instance
95
bool
m_sigFlagVector
[
BufferSize
+1];
// see paper from Malvar, Fast Progressive Wavelet Coder
96
};
97
98
public
:
108
CEncoder
(
CPGFStream
* stream,
PGFPreHeader
preHeader,
PGFHeader
header,
const
PGFPostHeader
& postHeader,
109
UINT64& userDataPos,
bool
useOMP) THROW_;
// throws IOException
110
113
~CEncoder
();
114
117
void
FavorSpeedOverSize
() {
m_favorSpeed
=
true
; }
118
122
void
Flush
() THROW_;
123
128
void
UpdatePostHeaderSize
(
PGFPreHeader
preHeader) THROW_;
129
135
UINT32
WriteLevelLength
(UINT32*& levelLength) THROW_;
136
141
UINT32
UpdateLevelLength
() THROW_;
142
153
void
Partition
(
CSubband
* band,
int
width,
int
height,
int
startPos,
int
pitch) THROW_;
154
158
void
SetEncodedLevel
(
int
currentLevel) { ASSERT(currentLevel >= 0);
m_currentBlock
->
m_lastLevelIndex
=
m_nLevels
- currentLevel - 1;
m_forceWriting
=
true
; }
159
165
void
WriteValue
(
CSubband
* band,
int
bandPos) THROW_;
166
170
INT64
ComputeHeaderLength
()
const
{
return
m_levelLengthPos
-
m_startPosition
; }
171
175
INT64
ComputeBufferLength
()
const
{
return
m_stream
->
GetPos
() -
m_bufferStartPos
; }
176
180
INT64
ComputeOffset
()
const
{
return
m_stream
->
GetPos
() -
m_levelLengthPos
; }
181
184
void
SetBufferStartPos
() {
m_bufferStartPos
=
m_stream
->
GetPos
(); }
185
186
#ifdef __PGFROISUPPORT__
187
188
189
190
void
EncodeTileBuffer() THROW_ { ASSERT(
m_currentBlock
&&
m_currentBlock
->
m_valuePos
>= 0 &&
m_currentBlock
->
m_valuePos
<=
BufferSize
);
EncodeBuffer
(
ROIBlockHeader
(
m_currentBlock
->
m_valuePos
,
true
)); }
191
194
void
SetROI() { m_roi =
true
; }
195
#endif
196
197
#ifdef TRACE
198
void
DumpBuffer()
const
;
199
#endif
200
201
private
:
202
void
EncodeBuffer
(
ROIBlockHeader
h) THROW_;
// throws IOException
203
void
WriteMacroBlock
(CMacroBlock* block) THROW_;
// throws IOException
204
205
CPGFStream
*
m_stream
;
206
UINT64
m_startPosition
;
207
UINT64
m_levelLengthPos
;
208
UINT64
m_bufferStartPos
;
209
210
CMacroBlock
**
m_macroBlocks
;
211
int
m_macroBlockLen
;
212
int
m_lastMacroBlock
;
213
CMacroBlock
*
m_currentBlock
;
214
215
UINT32*
m_levelLength
;
216
int
m_currLevelIndex
;
217
UINT8
m_nLevels
;
218
bool
m_favorSpeed
;
219
bool
m_forceWriting
;
220
#ifdef __PGFROISUPPORT__
221
bool
m_roi;
222
#endif
223
};
224
225
#endif //PGF_ENCODER
src
Encoder.h
Generated on Fri Jul 20 2012 16:38:13 for libpgf by
1.8.1.1