016714021c053283033bbf402bfea296ee70339a
3 * Copyright (c) 2003 Fabrice Bellard
4 * Copyright (c) 2006 Konstantin Shishkov
6 * This file is part of Libav.
8 * Libav 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 * Libav 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 Libav; 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
32 #include "libavutil/mem.h"
34 #define LZW_MAXBITS 12
35 #define LZW_SIZTABLE (1<<LZW_MAXBITS)
37 static const uint16_t mask
[17] =
39 0x0000, 0x0001, 0x0003, 0x0007,
40 0x000F, 0x001F, 0x003F, 0x007F,
41 0x00FF, 0x01FF, 0x03FF, 0x07FF,
42 0x0FFF, 0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF
46 const uint8_t *buf_start
, *pbuf
, *ebuf
;
50 int mode
; ///< Decoder mode
51 int cursize
; ///< The current code size
56 int newcodes
; ///< First available code
57 int top_slot
; ///< Highest code for current size
59 int slot
; ///< Last read code
62 uint8_t stack
[LZW_SIZTABLE
];
63 uint8_t suffix
[LZW_SIZTABLE
];
64 uint16_t prefix
[LZW_SIZTABLE
];
65 int bs
; ///< current buffer size for GIF
68 /* get one code from stream */
69 static int lzw_get_code(struct LZWState
* s
)
73 if(s
->mode
== FF_LZW_GIF
) {
74 while (s
->bbits
< s
->cursize
) {
78 s
->bbuf
|= (*s
->pbuf
++) << s
->bbits
;
83 s
->bbuf
>>= s
->cursize
;
85 while (s
->bbits
< s
->cursize
) {
86 s
->bbuf
= (s
->bbuf
<< 8) | (*s
->pbuf
++);
89 c
= s
->bbuf
>> (s
->bbits
- s
->cursize
);
91 s
->bbits
-= s
->cursize
;
92 return c
& s
->curmask
;
95 int ff_lzw_size_read(LZWState
*p
)
97 struct LZWState
*s
= p
;
98 return s
->pbuf
- s
->buf_start
;
101 void ff_lzw_decode_tail(LZWState
*p
)
103 struct LZWState
*s
= (struct LZWState
*)p
;
105 if(s
->mode
== FF_LZW_GIF
) {
107 if (s
->bs
>= s
->ebuf
- s
->pbuf
) {
119 av_cold
void ff_lzw_decode_open(LZWState
**p
)
121 *p
= av_mallocz(sizeof(struct LZWState
));
124 av_cold
void ff_lzw_decode_close(LZWState
**p
)
130 * Initialize LZW decoder
131 * @param p LZW context
132 * @param csize initial code size in bits
133 * @param buf input data
134 * @param buf_size input data size
135 * @param mode decoder working mode - either GIF or TIFF
137 int ff_lzw_decode_init(LZWState
*p
, int csize
, const uint8_t *buf
, int buf_size
, int mode
)
139 struct LZWState
*s
= (struct LZWState
*)p
;
141 if(csize
< 1 || csize
>= LZW_MAXBITS
)
145 s
->ebuf
= s
->pbuf
+ buf_size
;
152 s
->cursize
= s
->codesize
+ 1;
153 s
->curmask
= mask
[s
->cursize
];
154 s
->top_slot
= 1 << s
->cursize
;
155 s
->clear_code
= 1 << s
->codesize
;
156 s
->end_code
= s
->clear_code
+ 1;
157 s
->slot
= s
->newcodes
= s
->clear_code
+ 2;
162 s
->extra_slot
= s
->mode
== FF_LZW_TIFF
;
167 * Decode given number of bytes
168 * NOTE: the algorithm here is inspired from the LZW GIF decoder
169 * written by Steven A. Bennett in 1987.
171 * @param p LZW context
172 * @param buf output buffer
173 * @param len number of bytes to decode
174 * @return number of bytes decoded
176 int ff_lzw_decode(LZWState
*p
, uint8_t *buf
, int len
){
177 int l
, c
, code
, oc
, fc
;
179 struct LZWState
*s
= (struct LZWState
*)p
;
190 while (sp
> s
->stack
) {
196 if (c
== s
->end_code
) {
198 } else if (c
== s
->clear_code
) {
199 s
->cursize
= s
->codesize
+ 1;
200 s
->curmask
= mask
[s
->cursize
];
201 s
->slot
= s
->newcodes
;
202 s
->top_slot
= 1 << s
->cursize
;
206 if (code
== s
->slot
&& fc
>=0) {
209 }else if(code
>= s
->slot
)
211 while (code
>= s
->newcodes
) {
212 *sp
++ = s
->suffix
[code
];
213 code
= s
->prefix
[code
];
216 if (s
->slot
< s
->top_slot
&& oc
>=0) {
217 s
->suffix
[s
->slot
] = code
;
218 s
->prefix
[s
->slot
++] = oc
;
222 if (s
->slot
>= s
->top_slot
- s
->extra_slot
) {
223 if (s
->cursize
< LZW_MAXBITS
) {
225 s
->curmask
= mask
[++s
->cursize
];