67 0xff, 0xff, 0x0f, 0xcc, 0x33, 0xff, 0x55,
72 0xff, 0x0f, 0xff, 0x33, 0xff, 0x55, 0xff
79 int bits_per_pixel,
int pass,
80 int color_type,
const uint8_t *src)
82 int x,
mask, dsp_mask, j, src_x,
b, bpp;
89 switch (bits_per_pixel) {
93 memset(dst, 0, (width + 7) >> 3);
95 for (x = 0; x <
width; x++) {
97 if ((dsp_mask << j) & 0x80) {
98 b = (src[src_x >> 3] >> (7 - (src_x & 7))) & 1;
99 dst[x >> 3] |= b << (7 - j);
101 if ((mask << j) & 0x80)
106 bpp = bits_per_pixel >> 3;
110 for (x = 0; x <
width; x++) {
112 if ((dsp_mask << j) & 0x80) {
113 *(uint32_t *)d = (s[3] << 24) | (s[0] << 16) | (s[1] << 8) | s[2];
116 if ((mask << j) & 0x80)
120 for(x = 0; x <
width; x++) {
122 if ((dsp_mask << j) & 0x80) {
126 if ((mask << j) & 0x80)
137 for (i = 0; i < w; i++) {
138 int a,
b, c, p, pa, pb, pc;
151 if (pa <= pb && pa <= pc)
161 #define UNROLL1(bpp, op) {\
163 if(bpp >= 2) g = dst[1];\
164 if(bpp >= 3) b = dst[2];\
165 if(bpp >= 4) a = dst[3];\
166 for(; i < size; i+=bpp) {\
167 dst[i+0] = r = op(r, src[i+0], last[i+0]);\
168 if(bpp == 1) continue;\
169 dst[i+1] = g = op(g, src[i+1], last[i+1]);\
170 if(bpp == 2) continue;\
171 dst[i+2] = b = op(b, src[i+2], last[i+2]);\
172 if(bpp == 3) continue;\
173 dst[i+3] = a = op(a, src[i+3], last[i+3]);\
177 #define UNROLL_FILTER(op)\
178 if(bpp == 1) UNROLL1(1, op)\
179 else if(bpp == 2) UNROLL1(2, op)\
180 else if(bpp == 3) UNROLL1(3, op)\
181 else if(bpp == 4) UNROLL1(4, op)\
183 for (; i < size; i += bpp) {\
185 for (j = 0; j < bpp; j++)\
186 dst[i+j] = op(dst[i+j-bpp], src[i+j], last[i+j]);\
194 int i, p,
r,
g,
b,
a;
196 switch (filter_type) {
198 memcpy(dst, src, size);
201 for (i = 0; i < bpp; i++) {
206 for (; i <
size; i += bpp) {
207 int s = *(
int*)(src + i);
208 p = ((s & 0x7f7f7f7f) + (p & 0x7f7f7f7f)) ^ ((s ^ p) & 0x80808080);
209 *(
int*)(dst + i) = p;
212 #define OP_SUB(x,s,l) x+s
220 for (i = 0; i < bpp; i++) {
224 #define OP_AVG(x,s,l) (((x + l) >> 1) + s) & 0xff
228 for (i = 0; i < bpp; i++) {
232 if (bpp > 1 && size > 4) {
234 int w = bpp == 4 ? size : size - 3;
248 unsigned int r,
g,
b,
a;
250 for (j = 0; j <
width; j++) {
259 *(uint32_t *)dst = (a << 24) | (r << 16) | (g << 8) |
b;
276 for (i = 0; i <
size; i += 3) {
369 while (s->
zstream.avail_in > 0) {
370 ret = inflate(&s->
zstream, Z_PARTIAL_FLUSH);
371 if (ret != Z_OK && ret != Z_STREAM_END) {
374 if (s->
zstream.avail_out == 0) {
381 if (ret == Z_STREAM_END && s->
zstream.avail_in > 0) {
390 void *
data,
int *got_frame,
395 int buf_size = avpkt->
size;
398 uint32_t
tag, length;
414 ret = inflateInit(&s->
zstream);
420 length = bytestream2_get_be32(&s->
gb);
421 if (length > 0x7fffffff)
423 tag = bytestream2_get_le32(&s->
gb);
424 av_dlog(avctx,
"png: tag=%c%c%c%c length=%u\n",
427 ((tag >> 16) & 0xff),
428 ((tag >> 24) & 0xff), length);
430 case MKTAG(
'I',
'H',
'D',
'R'):
433 s->
width = bytestream2_get_be32(&s->
gb);
434 s->
height = bytestream2_get_be32(&s->
gb);
446 av_dlog(avctx,
"width=%d height=%d depth=%d color_type=%d "
447 "compression_type=%d filter_type=%d interlace_type=%d\n",
451 case MKTAG(
'I',
'D',
'A',
'T'):
510 av_dlog(avctx,
"row_size=%d crow_size =%d\n",
516 memcpy(p->
data[1], s->
palette, 256 *
sizeof(uint32_t));
542 case MKTAG(
'P',
'L',
'T',
'E'):
546 if ((length % 3) != 0 || length > 256 * 3)
550 for (i = 0; i < n; i++) {
551 r = bytestream2_get_byte(&s->
gb);
552 g = bytestream2_get_byte(&s->
gb);
553 b = bytestream2_get_byte(&s->
gb);
554 s->
palette[i] = (0xff << 24) | (r << 16) | (g << 8) | b;
556 for (; i < 256; i++) {
563 case MKTAG(
't',
'R',
'N',
'S'):
572 for (i = 0; i < length; i++) {
573 v = bytestream2_get_byte(&s->
gb);
579 case MKTAG(
'I',
'E',
'N',
'D'):
599 for (j = 0; j < s->
height; j++) {
600 for (i = 0; i < s->
width * s->
bpp; i++) {