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 code = (int8_t)*src++;
192 if(pixels + code > width){
196 memcpy(dst + pixels, src, code);
199 }
else if(code != -128){
201 if(pixels + code > width){
206 memset(dst + pixels, c, code);
250 "This format is not supported (bpp=%d, bppcount=%d)\n",
271 for (i = 0; i < 256; i++)
272 pal[i] = i * 0x010101;
280 unsigned tag, type, count,
off, value = 0;
283 const uint8_t *rp, *
gp, *bp;
285 if (end_buf - buf < 12)
302 value =
tget(&buf, type, s->
le);
319 if (count <= 4 &&
type_sizes[type] * count <= 4) {
326 if(buf && (buf < start || buf > end_buf)){
344 if(count == 1) s->
bpp = value;
348 s->
bpp = (off & 0xFF) + ((off >> 8) & 0xFF) + ((off >> 16) & 0xFF) + ((off >> 24) & 0xFF);
353 for(i = 0; i < count && buf < end_buf; i++) s->
bpp +=
tget(&buf, type, s->
le);
363 "Samples per pixel requires a single value, many provided\n");
401 if (type ==
TIFF_LONG && value == UINT_MAX)
458 if(value < 1 || value > 2){
467 if (count / 3 > 256 || end_buf - buf < count / 3 * off * 3)
470 gp = buf + count / 3 *
off;
471 bp = buf + count / 3 * off * 2;
473 for(i = 0; i < count / 3; i++){
474 j = (
tget(&rp, type, s->
le) >>
off) << 16;
475 j |= (
tget(&gp, type, s->
le) >>
off) << 8;
502 void *
data,
int *data_size,
505 const uint8_t *buf = avpkt->
data;
506 int buf_size = avpkt->
size;
510 const uint8_t *orig_buf = buf, *end_buf = buf + buf_size;
515 unsigned soff, ssize;
519 if (end_buf - buf < 8)
522 if(
id == 0x4949)
le = 1;
523 else if(
id == 0x4D4D)
le = 0;
535 av_log(avctx,
AV_LOG_ERROR,
"The answer to life, universe and everything is not correct!\n");
542 if (
off >= UINT_MAX - 14 || end_buf - orig_buf <
off + 14) {
546 buf = orig_buf +
off;
548 for(i = 0; i < entries; i++){
582 if (soff > buf_size || ssize > buf_size - soff) {
593 ssize = s->
width * soff;
594 for(i = 0; i < s->
height; i++) {
595 for(j = soff; j < ssize; j++)
596 dst[j] += dst[j - soff];
606 for(j = 0; j < s->
height; j++){
608 src[i] = 255 - src[i];