FFmpeg
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
Examples
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
libavcodec
lzwenc.c
Go to the documentation of this file.
1
/*
2
* LZW encoder
3
* Copyright (c) 2007 Bartlomiej Wolowiec
4
*
5
* This file is part of FFmpeg.
6
*
7
* FFmpeg is free software; you can redistribute it and/or
8
* modify it under the terms of the GNU Lesser General Public
9
* License as published by the Free Software Foundation; either
10
* version 2.1 of the License, or (at your option) any later version.
11
*
12
* FFmpeg is distributed in the hope that it will be useful,
13
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15
* Lesser General Public License for more details.
16
*
17
* You should have received a copy of the GNU Lesser General Public
18
* License along with FFmpeg; if not, write to the Free Software
19
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20
*/
21
22
/**
23
* @file
24
* LZW encoder
25
* @author Bartlomiej Wolowiec
26
*/
27
28
#include "
avcodec.h
"
29
#include "
lzw.h
"
30
#include "
mathops.h
"
31
#include "
put_bits.h
"
32
33
#define LZW_MAXBITS 12
34
#define LZW_SIZTABLE (1<<LZW_MAXBITS)
35
#define LZW_HASH_SIZE 16411
36
#define LZW_HASH_SHIFT 6
37
38
#define LZW_PREFIX_EMPTY -1
39
#define LZW_PREFIX_FREE -2
40
41
/** One code in hash table */
42
typedef
struct
Code
{
43
/// Hash code of prefix, LZW_PREFIX_EMPTY if empty prefix, or LZW_PREFIX_FREE if no code
44
int
hash_prefix
;
45
int
code
;
///< LZW code
46
uint8_t
suffix
;
///< Last character in code block
47
}
Code
;
48
49
/** LZW encode state */
50
typedef
struct
LZWEncodeState
{
51
int
clear_code
;
///< Value of clear code
52
int
end_code
;
///< Value of end code
53
Code
tab
[
LZW_HASH_SIZE
];
///< Hash table
54
int
tabsize
;
///< Number of values in hash table
55
int
bits
;
///< Actual bits code
56
int
bufsize
;
///< Size of output buffer
57
PutBitContext
pb
;
///< Put bit context for output
58
int
maxbits
;
///< Max bits code
59
int
maxcode
;
///< Max value of code
60
int
output_bytes
;
///< Number of written bytes
61
int
last_code
;
///< Value of last output code or LZW_PREFIX_EMPTY
62
enum
FF_LZW_MODES
mode
;
///< TIFF or GIF
63
void
(*
put_bits
)(
PutBitContext
*, int, unsigned);
///< GIF is LE while TIFF is BE
64
}
LZWEncodeState
;
65
66
67
const
int
ff_lzw_encode_state_size
=
sizeof
(
LZWEncodeState
);
68
69
/**
70
* Hash function adding character
71
* @param head LZW code for prefix
72
* @param add Character to add
73
* @return New hash value
74
*/
75
static
inline
int
hash
(
int
head,
const
int
add)
76
{
77
head ^= (add <<
LZW_HASH_SHIFT
);
78
if
(head >=
LZW_HASH_SIZE
)
79
head -=
LZW_HASH_SIZE
;
80
av_assert2
(head >= 0 && head <
LZW_HASH_SIZE
);
81
return
head;
82
}
83
84
/**
85
* Hash function calculates next hash value
86
* @param head Actual hash code
87
* @param offset Offset calculated by hashOffset
88
* @return New hash value
89
*/
90
static
inline
int
hashNext
(
int
head,
const
int
offset
)
91
{
92
head -=
offset
;
93
if
(head < 0)
94
head +=
LZW_HASH_SIZE
;
95
return
head;
96
}
97
98
/**
99
* Hash function calculates hash offset
100
* @param head Actual hash code
101
* @return Hash offset
102
*/
103
static
inline
int
hashOffset
(
const
int
head)
104
{
105
return
head ?
LZW_HASH_SIZE
- head : 1;
106
}
107
108
/**
109
* Write one code to stream
110
* @param s LZW state
111
* @param c code to write
112
*/
113
static
inline
void
writeCode
(
LZWEncodeState
*
s
,
int
c
)
114
{
115
av_assert2
(0 <= c && c < 1 << s->
bits
);
116
s->
put_bits
(&s->
pb
, s->
bits
, c);
117
}
118
119
120
/**
121
* Find LZW code for block
122
* @param s LZW state
123
* @param c Last character in block
124
* @param hash_prefix LZW code for prefix
125
* @return LZW code for block or -1 if not found in table
126
*/
127
static
inline
int
findCode
(
LZWEncodeState
*
s
,
uint8_t
c
,
int
hash_prefix)
128
{
129
int
h =
hash
(
FFMAX
(hash_prefix, 0), c);
130
int
hash_offset =
hashOffset
(h);
131
132
while
(s->
tab
[h].
hash_prefix
!=
LZW_PREFIX_FREE
) {
133
if
((s->
tab
[h].
suffix
== c)
134
&& (s->
tab
[h].
hash_prefix
== hash_prefix))
135
return
h;
136
h =
hashNext
(h, hash_offset);
137
}
138
139
return
h;
140
}
141
142
/**
143
* Add block to LZW code table
144
* @param s LZW state
145
* @param c Last character in block
146
* @param hash_prefix LZW code for prefix
147
* @param hash_code LZW code for bytes block
148
*/
149
static
inline
void
addCode
(
LZWEncodeState
*
s
,
uint8_t
c
,
int
hash_prefix,
int
hash_code)
150
{
151
s->
tab
[hash_code].
code
= s->
tabsize
;
152
s->
tab
[hash_code].
suffix
=
c
;
153
s->
tab
[hash_code].
hash_prefix
= hash_prefix;
154
155
s->
tabsize
++;
156
157
if
(s->
tabsize
>= (1 << s->
bits
) + (s->
mode
==
FF_LZW_GIF
))
158
s->
bits
++;
159
}
160
161
/**
162
* Clear LZW code table
163
* @param s LZW state
164
*/
165
static
void
clearTable
(
LZWEncodeState
*
s
)
166
{
167
int
i, h;
168
169
writeCode
(s, s->
clear_code
);
170
s->
bits
= 9;
171
for
(i = 0; i <
LZW_HASH_SIZE
; i++) {
172
s->
tab
[i].
hash_prefix
=
LZW_PREFIX_FREE
;
173
}
174
for
(i = 0; i < 256; i++) {
175
h =
hash
(0, i);
176
s->
tab
[h].
code
= i;
177
s->
tab
[h].
suffix
= i;
178
s->
tab
[h].
hash_prefix
=
LZW_PREFIX_EMPTY
;
179
}
180
s->
tabsize
= 258;
181
}
182
183
/**
184
* Calculate number of bytes written
185
* @param s LZW encode state
186
* @return Number of bytes written
187
*/
188
static
int
writtenBytes
(
LZWEncodeState
*
s
){
189
int
ret
=
put_bits_count
(&s->
pb
) >> 3;
190
ret -= s->
output_bytes
;
191
s->
output_bytes
+=
ret
;
192
return
ret
;
193
}
194
195
/**
196
* Initialize LZW encoder. Please set s->clear_code, s->end_code and s->maxbits before run.
197
* @param s LZW state
198
* @param outbuf Output buffer
199
* @param outsize Size of output buffer
200
* @param maxbits Maximum length of code
201
*/
202
void
ff_lzw_encode_init
(
LZWEncodeState
*
s
,
uint8_t
*outbuf,
int
outsize,
203
int
maxbits,
enum
FF_LZW_MODES
mode
,
204
void
(*lzw_put_bits)(
PutBitContext
*,
int
,
unsigned
))
205
{
206
s->
clear_code
= 256;
207
s->
end_code
= 257;
208
s->
maxbits
= maxbits;
209
init_put_bits
(&s->
pb
, outbuf, outsize);
210
s->
bufsize
= outsize;
211
av_assert0
(s->
maxbits
>= 9 && s->
maxbits
<=
LZW_MAXBITS
);
212
s->
maxcode
= 1 << s->
maxbits
;
213
s->
output_bytes
= 0;
214
s->
last_code
=
LZW_PREFIX_EMPTY
;
215
s->
bits
= 9;
216
s->
mode
=
mode
;
217
s->
put_bits
= lzw_put_bits;
218
}
219
220
/**
221
* LZW main compress function
222
* @param s LZW state
223
* @param inbuf Input buffer
224
* @param insize Size of input buffer
225
* @return Number of bytes written or -1 on error
226
*/
227
int
ff_lzw_encode
(
LZWEncodeState
* s,
const
uint8_t
* inbuf,
int
insize)
228
{
229
int
i;
230
231
if
(insize * 3 > (s->
bufsize
- s->
output_bytes
) * 2){
232
return
-1;
233
}
234
235
if
(s->
last_code
==
LZW_PREFIX_EMPTY
)
236
clearTable
(s);
237
238
for
(i = 0; i < insize; i++) {
239
uint8_t
c
= *inbuf++;
240
int
code =
findCode
(s, c, s->
last_code
);
241
if
(s->
tab
[code].
hash_prefix
==
LZW_PREFIX_FREE
) {
242
writeCode
(s, s->
last_code
);
243
addCode
(s, c, s->
last_code
, code);
244
code=
hash
(0, c);
245
}
246
s->
last_code
= s->
tab
[code].
code
;
247
if
(s->
tabsize
>= s->
maxcode
- 1) {
248
clearTable
(s);
249
}
250
}
251
252
return
writtenBytes
(s);
253
}
254
255
/**
256
* Write end code and flush bitstream
257
* @param s LZW state
258
* @return Number of bytes written or -1 on error
259
*/
260
int
ff_lzw_encode_flush
(
LZWEncodeState
*s,
261
void
(*lzw_flush_put_bits)(
PutBitContext
*))
262
{
263
if
(s->
last_code
!= -1)
264
writeCode
(s, s->
last_code
);
265
writeCode
(s, s->
end_code
);
266
if
(s->
mode
==
FF_LZW_GIF
)
267
s->
put_bits
(&s->
pb
, 1, 0);
268
269
lzw_flush_put_bits(&s->
pb
);
270
s->
last_code
= -1;
271
272
return
writtenBytes
(s);
273
}
Generated on Sun Jul 20 2014 23:05:50 for FFmpeg by
1.8.2