74 static unsigned tget(
const uint8_t **p,
int type,
int le) {
79 default :
return UINT_MAX;
84 static int tiff_uncompress(uint8_t *dst,
unsigned long *
len,
const uint8_t *src,
int size)
89 memset(&zstream, 0,
sizeof(zstream));
90 zstream.next_in = src;
91 zstream.avail_in =
size;
92 zstream.next_out = dst;
93 zstream.avail_out = *
len;
94 zret = inflateInit(&zstream);
99 zret = inflate(&zstream, Z_SYNC_FLUSH);
100 inflateEnd(&zstream);
101 *len = zstream.total_out;
102 return zret == Z_STREAM_END ? Z_OK : zret;
107 int c,
line, pixels, code;
108 const uint8_t *ssrc = src;
111 uint8_t *zbuf;
unsigned long outlen;
115 outlen = width * lines;
117 ret = tiff_uncompress(zbuf, &outlen, src, size);
119 av_log(s->
avctx,
AV_LOG_ERROR,
"Uncompressing failed (%lu of %lu) with error %d\n", outlen, (
unsigned long)width * lines, ret);
124 for(line = 0; line < lines; line++){
125 memcpy(dst, src, width);
153 memcpy(src2, src, size);
155 for(i = 0; i <
size; i++)
169 for(line = 0; line < lines; line++){
170 if(src - ssrc > size){
176 if (ssrc + size - src < width)
179 memcpy(dst, src, width);
182 for (i = 0; i <
width; i++)
188 for(pixels = 0; pixels <
width;){
189 if (ssrc + size - src < 2)
191 code = (int8_t)*src++;
194 if (pixels + code > width ||
195 ssrc + size - src < code) {
199 memcpy(dst + pixels, src, code);
202 }
else if(code != -128){
204 if(pixels + code > width){
209 memset(dst + pixels, c, code);
253 "This format is not supported (bpp=%d, bppcount=%d)\n",
274 for (i = 0; i < 256; i++)
275 pal[i] = i * 0x010101;
283 unsigned tag, type, count,
off, value = 0;
286 const uint8_t *rp, *
gp, *bp;
288 if (end_buf - buf < 12)
305 value =
tget(&buf, type, s->
le);
322 if (count <= 4 &&
type_sizes[type] * count <= 4) {
329 if(buf && (buf < start || buf > end_buf)){
347 if(count == 1) s->
bpp = value;
351 s->
bpp = (off & 0xFF) + ((off >> 8) & 0xFF) + ((off >> 16) & 0xFF) + ((off >> 24) & 0xFF);
356 for(i = 0; i < count && buf < end_buf; i++) s->
bpp +=
tget(&buf, type, s->
le);
366 "Samples per pixel requires a single value, many provided\n");
404 if (type ==
TIFF_LONG && value == UINT_MAX)
461 if(value < 1 || value > 2){
470 if (count / 3 > 256 || end_buf - buf < count / 3 * off * 3)
473 gp = buf + count / 3 *
off;
474 bp = buf + count / 3 * off * 2;
476 for(i = 0; i < count / 3; i++){
477 j = (
tget(&rp, type, s->
le) >>
off) << 16;
478 j |= (
tget(&gp, type, s->
le) >>
off) << 8;
505 void *
data,
int *data_size,
508 const uint8_t *buf = avpkt->
data;
509 int buf_size = avpkt->
size;
513 const uint8_t *orig_buf = buf, *end_buf = buf + buf_size;
518 unsigned soff, ssize;
522 if (end_buf - buf < 8)
525 if(
id == 0x4949)
le = 1;
526 else if(
id == 0x4D4D)
le = 0;
538 av_log(avctx,
AV_LOG_ERROR,
"The answer to life, universe and everything is not correct!\n");
545 if (
off >= UINT_MAX - 14 || end_buf - orig_buf <
off + 14) {
549 buf = orig_buf +
off;
551 for(i = 0; i < entries; i++){
585 if (soff > buf_size || ssize > buf_size - soff) {
596 ssize = s->
width * soff;
597 for(i = 0; i < s->
height; i++) {
598 for(j = soff; j < ssize; j++)
599 dst[j] += dst[j - soff];
609 for(j = 0; j < s->
height; j++){
611 src[i] = 255 - src[i];