* PNG image format
* Copyright (c) 2003 Fabrice Bellard.
*
- * This library is free software; you can redistribute it and/or
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
+ * version 2.1 of the License, or (at your option) any later version.
*
- * This library is distributed in the hope that it will be useful,
+ * FFmpeg is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "avcodec.h"
* - use filters when generating a png (better compression)
*/
-#ifdef CONFIG_ZLIB
#include <zlib.h>
//#define DEBUG
return ((*b)[-4]<<24) + ((*b)[-3]<<16) + ((*b)[-2]<<8) + (*b)[-1];
}
+#ifdef CONFIG_ENCODERS
static void put32(uint8_t **b, unsigned int v){
*(*b)++= v>>24;
*(*b)++= v>>16;
*(*b)++= v>>8;
*(*b)++= v;
}
+#endif
static const uint8_t pngsig[8] = {137, 80, 78, 71, 13, 10, 26, 10};
}
}
+#ifdef CONFIG_ENCODERS
static void png_get_interlaced_row(uint8_t *dst, int row_size,
int bits_per_pixel, int pass,
const uint8_t *src, int width)
break;
}
}
+#endif
/* XXX: optimize */
/* NOTE: 'dst' can be equal to 'last' */
}
}
-static void convert_from_rgba32(uint8_t *dst, const uint8_t *src, int width)
+#ifdef CONFIG_ENCODERS
+static void convert_from_rgb32(uint8_t *dst, const uint8_t *src, int width)
{
uint8_t *d;
int j;
d = dst;
for(j = 0; j < width; j++) {
- v = ((uint32_t *)src)[j];
+ v = ((const uint32_t *)src)[j];
d[0] = v >> 16;
d[1] = v >> 8;
d[2] = v;
d += 4;
}
}
+#endif
-static void convert_to_rgba32(uint8_t *dst, const uint8_t *src, int width)
+#ifdef CONFIG_DECODERS
+static void convert_to_rgb32(uint8_t *dst, const uint8_t *src, int width)
{
int j;
unsigned int r, g, b, a;
png_filter_row(s->tmp_row, s->crow_buf[0], s->crow_buf + 1,
s->last_row, s->row_size, s->bpp);
memcpy(s->last_row, s->tmp_row, s->row_size);
- convert_to_rgba32(ptr, s->tmp_row, s->width);
+ convert_to_rgb32(ptr, s->tmp_row, s->width);
} else {
/* in normal case, we avoid one copy */
if (s->y == 0)
got_line = 1;
}
if ((png_pass_dsp_ymask[s->pass] << (s->y & 7)) & 0x80) {
- /* NOTE: rgba32 is handled directly in png_put_interlaced_row */
+ /* NOTE: RGB32 is handled directly in png_put_interlaced_row */
png_put_interlaced_row(ptr, s->width, s->bits_per_pixel, s->pass,
s->color_type, s->last_row);
}
tag32 = get32(&s->bytestream);
tag = bswap_32(tag32);
#ifdef DEBUG
- printf("png: tag=%c%c%c%c length=%u\n",
+ av_log(avctx, AV_LOG_DEBUG, "png: tag=%c%c%c%c length=%u\n",
(tag & 0xff),
((tag >> 8) & 0xff),
((tag >> 16) & 0xff),
crc = get32(&s->bytestream);
s->state |= PNG_IHDR;
#ifdef DEBUG
- printf("width=%d height=%d depth=%d color_type=%d compression_type=%d filter_type=%d interlace_type=%d\n",
+ av_log(avctx, AV_LOG_DEBUG, "width=%d height=%d depth=%d color_type=%d compression_type=%d filter_type=%d interlace_type=%d\n",
s->width, s->height, s->bit_depth, s->color_type,
s->compression_type, s->filter_type, s->interlace_type);
#endif
avctx->pix_fmt = PIX_FMT_RGB24;
} else if (s->bit_depth == 8 &&
s->color_type == PNG_COLOR_TYPE_RGB_ALPHA) {
- avctx->pix_fmt = PIX_FMT_RGBA32;
+ avctx->pix_fmt = PIX_FMT_RGB32;
} else if (s->bit_depth == 8 &&
s->color_type == PNG_COLOR_TYPE_GRAY) {
avctx->pix_fmt = PIX_FMT_GRAY8;
+ } else if (s->bit_depth == 16 &&
+ s->color_type == PNG_COLOR_TYPE_GRAY) {
+ avctx->pix_fmt = PIX_FMT_GRAY16BE;
} else if (s->bit_depth == 1 &&
s->color_type == PNG_COLOR_TYPE_GRAY) {
avctx->pix_fmt = PIX_FMT_MONOBLACK;
s->crow_size = s->pass_row_size + 1;
}
#ifdef DEBUG
- printf("row_size=%d crow_size =%d\n",
+ av_log(avctx, AV_LOG_DEBUG, "row_size=%d crow_size =%d\n",
s->row_size, s->crow_size);
#endif
s->image_buf = p->data[0];
ret = -1;
goto the_end;
}
+#endif
+#ifdef CONFIG_ENCODERS
static void png_write_chunk(uint8_t **f, uint32_t tag,
const uint8_t *buf, int length)
{
}
return 0;
}
+#endif /* CONFIG_ENCODERS */
static int common_init(AVCodecContext *avctx){
PNGContext *s = avctx->priv_data;
return 0;
}
+#ifdef CONFIG_ENCODERS
static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data){
PNGContext *s = avctx->priv_data;
AVFrame *pict = data;
is_progressive = !!(avctx->flags & CODEC_FLAG_INTERLACED_DCT);
switch(avctx->pix_fmt) {
- case PIX_FMT_RGBA32:
+ case PIX_FMT_RGB32:
bit_depth = 8;
color_type = PNG_COLOR_TYPE_RGB_ALPHA;
break;
for(i = 0; i < 256; i++) {
v = palette[i];
alpha = v >> 24;
- if (alpha != 0xff)
+ if (alpha && alpha != 0xff)
has_alpha = 1;
*alpha_ptr++ = alpha;
ptr[0] = v >> 16;
if ((png_pass_ymask[pass] << (y & 7)) & 0x80) {
ptr = p->data[0] + y * p->linesize[0];
if (color_type == PNG_COLOR_TYPE_RGB_ALPHA) {
- convert_from_rgba32(tmp_buf, ptr, avctx->width);
+ convert_from_rgb32(tmp_buf, ptr, avctx->width);
ptr1 = tmp_buf;
} else {
ptr1 = ptr;
for(y = 0; y < avctx->height; y++) {
ptr = p->data[0] + y * p->linesize[0];
if (color_type == PNG_COLOR_TYPE_RGB_ALPHA)
- convert_from_rgba32(crow_buf + 1, ptr, avctx->width);
+ convert_from_rgb32(crow_buf + 1, ptr, avctx->width);
else
memcpy(crow_buf + 1, ptr, row_size);
crow_buf[0] = PNG_FILTER_VALUE_NONE;
ret = -1;
goto the_end;
}
+#endif
+#ifdef CONFIG_PNG_DECODER
AVCodec png_decoder = {
"png",
CODEC_TYPE_VIDEO,
0 /*CODEC_CAP_DR1*/ /*| CODEC_CAP_DRAW_HORIZ_BAND*/,
NULL
};
+#endif
#ifdef CONFIG_PNG_ENCODER
AVCodec png_encoder = {
common_init,
encode_frame,
NULL, //encode_end,
- .pix_fmts= (enum PixelFormat[]){PIX_FMT_RGB24, PIX_FMT_RGBA32, PIX_FMT_PAL8, PIX_FMT_GRAY8, PIX_FMT_MONOBLACK, -1},
+ .pix_fmts= (enum PixelFormat[]){PIX_FMT_RGB24, PIX_FMT_RGB32, PIX_FMT_PAL8, PIX_FMT_GRAY8, PIX_FMT_MONOBLACK, -1},
};
#endif // CONFIG_PNG_ENCODER
-#endif