3 * Copyright (c) 2003 Fabrice Bellard
4 * Copyright (c) 2006 Konstantin Shishkov
6 * This file is part of FFmpeg.
8 * FFmpeg is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
13 * FFmpeg is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with FFmpeg; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
25 * @brief LZW decoding routines
26 * @author Fabrice Bellard
27 * @author modified for use in TIFF by Konstantin Shishkov
30 #include "libavutil/attributes.h"
31 #include "bytestream.h"
33 #include "libavutil/mem.h"
35 #define LZW_MAXBITS 12
36 #define LZW_SIZTABLE (1<<LZW_MAXBITS)
38 static const uint16_t mask
[17] =
40 0x0000, 0x0001, 0x0003, 0x0007,
41 0x000F, 0x001F, 0x003F, 0x007F,
42 0x00FF, 0x01FF, 0x03FF, 0x07FF,
43 0x0FFF, 0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF
51 int mode
; ///< Decoder mode
52 int cursize
; ///< The current code size
57 int newcodes
; ///< First available code
58 int top_slot
; ///< Highest code for current size
60 int slot
; ///< Last read code
63 uint8_t stack
[LZW_SIZTABLE
];
64 uint8_t suffix
[LZW_SIZTABLE
];
65 uint16_t prefix
[LZW_SIZTABLE
];
66 int bs
; ///< current buffer size for GIF
69 /* get one code from stream */
70 static int lzw_get_code(struct LZWState
* s
)
74 if (s
->bbits
< s
->cursize
&& bytestream2_get_bytes_left(&s
->gb
) <= 0)
77 if(s
->mode
== FF_LZW_GIF
) {
78 while (s
->bbits
< s
->cursize
) {
80 s
->bs
= bytestream2_get_byte(&s
->gb
);
82 s
->bbuf
|= bytestream2_get_byte(&s
->gb
) << s
->bbits
;
87 s
->bbuf
>>= s
->cursize
;
89 while (s
->bbits
< s
->cursize
) {
90 s
->bbuf
= (s
->bbuf
<< 8) | bytestream2_get_byte(&s
->gb
);
93 c
= s
->bbuf
>> (s
->bbits
- s
->cursize
);
95 s
->bbits
-= s
->cursize
;
96 return c
& s
->curmask
;
99 int ff_lzw_decode_tail(LZWState
*p
)
101 struct LZWState
*s
= (struct LZWState
*)p
;
103 if(s
->mode
== FF_LZW_GIF
) {
104 while (s
->bs
> 0 && bytestream2_get_bytes_left(&s
->gb
)) {
105 bytestream2_skip(&s
->gb
, s
->bs
);
106 s
->bs
= bytestream2_get_byte(&s
->gb
);
109 bytestream2_skip(&s
->gb
, bytestream2_get_bytes_left(&s
->gb
));
110 return bytestream2_tell(&s
->gb
);
113 av_cold
void ff_lzw_decode_open(LZWState
**p
)
115 *p
= av_mallocz(sizeof(struct LZWState
));
118 av_cold
void ff_lzw_decode_close(LZWState
**p
)
124 * Initialize LZW decoder
125 * @param p LZW context
126 * @param csize initial code size in bits
127 * @param buf input data
128 * @param buf_size input data size
129 * @param mode decoder working mode - either GIF or TIFF
131 int ff_lzw_decode_init(LZWState
*p
, int csize
, const uint8_t *buf
, int buf_size
, int mode
)
133 struct LZWState
*s
= (struct LZWState
*)p
;
135 if(csize
< 1 || csize
>= LZW_MAXBITS
)
138 bytestream2_init(&s
->gb
, buf
, buf_size
);
145 s
->cursize
= s
->codesize
+ 1;
146 s
->curmask
= mask
[s
->cursize
];
147 s
->top_slot
= 1 << s
->cursize
;
148 s
->clear_code
= 1 << s
->codesize
;
149 s
->end_code
= s
->clear_code
+ 1;
150 s
->slot
= s
->newcodes
= s
->clear_code
+ 2;
155 s
->extra_slot
= s
->mode
== FF_LZW_TIFF
;
160 * Decode given number of bytes
161 * NOTE: the algorithm here is inspired from the LZW GIF decoder
162 * written by Steven A. Bennett in 1987.
164 * @param p LZW context
165 * @param buf output buffer
166 * @param len number of bytes to decode
167 * @return number of bytes decoded
169 int ff_lzw_decode(LZWState
*p
, uint8_t *buf
, int len
){
170 int l
, c
, code
, oc
, fc
;
172 struct LZWState
*s
= (struct LZWState
*)p
;
183 while (sp
> s
->stack
) {
189 if (c
== s
->end_code
) {
191 } else if (c
== s
->clear_code
) {
192 s
->cursize
= s
->codesize
+ 1;
193 s
->curmask
= mask
[s
->cursize
];
194 s
->slot
= s
->newcodes
;
195 s
->top_slot
= 1 << s
->cursize
;
199 if (code
== s
->slot
&& fc
>=0) {
202 }else if(code
>= s
->slot
)
204 while (code
>= s
->newcodes
) {
205 *sp
++ = s
->suffix
[code
];
206 code
= s
->prefix
[code
];
209 if (s
->slot
< s
->top_slot
&& oc
>=0) {
210 s
->suffix
[s
->slot
] = code
;
211 s
->prefix
[s
->slot
++] = oc
;
215 if (s
->slot
>= s
->top_slot
- s
->extra_slot
) {
216 if (s
->cursize
< LZW_MAXBITS
) {
218 s
->curmask
= mask
[++s
->cursize
];