Found-by: Mateusz "j00ru" Jurczyk and Gynvael Coldwind
CC:libav-stable@libav.org
... | ... |
@@ -28,6 +28,7 @@ |
28 | 28 |
*/ |
29 | 29 |
|
30 | 30 |
#include "avcodec.h" |
31 |
+#include "bytestream.h" |
|
31 | 32 |
#include "lzw.h" |
32 | 33 |
#include "libavutil/mem.h" |
33 | 34 |
|
... | ... |
@@ -43,7 +44,7 @@ static const uint16_t mask[17] = |
43 | 43 |
}; |
44 | 44 |
|
45 | 45 |
struct LZWState { |
46 |
- const uint8_t *buf_start, *pbuf, *ebuf; |
|
46 |
+ GetByteContext gb; |
|
47 | 47 |
int bbits; |
48 | 48 |
unsigned int bbuf; |
49 | 49 |
|
... | ... |
@@ -73,9 +74,9 @@ static int lzw_get_code(struct LZWState * s) |
73 | 73 |
if(s->mode == FF_LZW_GIF) { |
74 | 74 |
while (s->bbits < s->cursize) { |
75 | 75 |
if (!s->bs) { |
76 |
- s->bs = *s->pbuf++; |
|
76 |
+ s->bs = bytestream2_get_byte(&s->gb); |
|
77 | 77 |
} |
78 |
- s->bbuf |= (*s->pbuf++) << s->bbits; |
|
78 |
+ s->bbuf |= bytestream2_get_byte(&s->gb) << s->bbits; |
|
79 | 79 |
s->bbits += 8; |
80 | 80 |
s->bs--; |
81 | 81 |
} |
... | ... |
@@ -83,7 +84,7 @@ static int lzw_get_code(struct LZWState * s) |
83 | 83 |
s->bbuf >>= s->cursize; |
84 | 84 |
} else { // TIFF |
85 | 85 |
while (s->bbits < s->cursize) { |
86 |
- s->bbuf = (s->bbuf << 8) | (*s->pbuf++); |
|
86 |
+ s->bbuf = (s->bbuf << 8) | bytestream2_get_byte(&s->gb); |
|
87 | 87 |
s->bbits += 8; |
88 | 88 |
} |
89 | 89 |
c = s->bbuf >> (s->bbits - s->cursize); |
... | ... |
@@ -95,7 +96,7 @@ static int lzw_get_code(struct LZWState * s) |
95 | 95 |
int ff_lzw_size_read(LZWState *p) |
96 | 96 |
{ |
97 | 97 |
struct LZWState *s = p; |
98 |
- return s->pbuf - s->buf_start; |
|
98 |
+ return bytestream2_tell(&s->gb); |
|
99 | 99 |
} |
100 | 100 |
|
101 | 101 |
void ff_lzw_decode_tail(LZWState *p) |
... | ... |
@@ -103,17 +104,12 @@ void ff_lzw_decode_tail(LZWState *p) |
103 | 103 |
struct LZWState *s = (struct LZWState *)p; |
104 | 104 |
|
105 | 105 |
if(s->mode == FF_LZW_GIF) { |
106 |
- while (s->bs > 0) { |
|
107 |
- if (s->bs >= s->ebuf - s->pbuf) { |
|
108 |
- s->pbuf = s->ebuf; |
|
109 |
- break; |
|
110 |
- } else { |
|
111 |
- s->pbuf += s->bs; |
|
112 |
- s->bs = *s->pbuf++; |
|
113 |
- } |
|
106 |
+ while (s->bs > 0 && bytestream2_get_bytes_left(&s->gb)) { |
|
107 |
+ bytestream2_skip(&s->gb, s->bs); |
|
108 |
+ s->bs = bytestream2_get_byte(&s->gb); |
|
114 | 109 |
} |
115 | 110 |
}else |
116 |
- s->pbuf= s->ebuf; |
|
111 |
+ bytestream2_skip(&s->gb, bytestream2_get_bytes_left(&s->gb)); |
|
117 | 112 |
} |
118 | 113 |
|
119 | 114 |
av_cold void ff_lzw_decode_open(LZWState **p) |
... | ... |
@@ -141,8 +137,7 @@ int ff_lzw_decode_init(LZWState *p, int csize, const uint8_t *buf, int buf_size, |
141 | 141 |
if(csize < 1 || csize >= LZW_MAXBITS) |
142 | 142 |
return -1; |
143 | 143 |
/* read buffer */ |
144 |
- s->pbuf = buf; |
|
145 |
- s->ebuf = s->pbuf + buf_size; |
|
144 |
+ bytestream2_init(&s->gb, buf, buf_size); |
|
146 | 145 |
s->bbuf = 0; |
147 | 146 |
s->bbits = 0; |
148 | 147 |
s->bs = 0; |