Originally committed as revision 9689 to svn://svn.ffmpeg.org/ffmpeg/trunktags/v0.5
@@ -80,13 +80,3 @@ int ff_png_pass_row_size(int pass, int bits_per_pixel, int width) | |||
pass_width = (width - xmin + (1 << shift) - 1) >> shift; | |||
return (pass_width * bits_per_pixel + 7) >> 3; | |||
} | |||
int ff_png_common_init(AVCodecContext *avctx){ | |||
PNGContext *s = avctx->priv_data; | |||
avcodec_get_frame_defaults((AVFrame*)&s->picture); | |||
avctx->coded_frame= (AVFrame*)&s->picture; | |||
// s->avctx= avctx; | |||
return 0; | |||
} |
@@ -48,40 +48,6 @@ | |||
#define NB_PASSES 7 | |||
#define IOBUF_SIZE 4096 | |||
typedef struct PNGContext { | |||
uint8_t *bytestream; | |||
uint8_t *bytestream_start; | |||
uint8_t *bytestream_end; | |||
AVFrame picture; | |||
int state; | |||
int width, height; | |||
int bit_depth; | |||
int color_type; | |||
int compression_type; | |||
int interlace_type; | |||
int filter_type; | |||
int channels; | |||
int bits_per_pixel; | |||
int bpp; | |||
uint8_t *image_buf; | |||
int image_linesize; | |||
uint32_t palette[256]; | |||
uint8_t *crow_buf; | |||
uint8_t *last_row; | |||
uint8_t *tmp_row; | |||
int pass; | |||
int crow_size; /* compressed row size (include filter type) */ | |||
int row_size; /* decompressed row size */ | |||
int pass_row_size; /* decompress row size of the current pass */ | |||
int y; | |||
z_stream zstream; | |||
uint8_t buf[IOBUF_SIZE]; | |||
} PNGContext; | |||
extern const uint8_t ff_pngsig[8]; | |||
/* Mask to determine which y pixels are valid in a pass */ | |||
@@ -106,6 +72,4 @@ extern int ff_png_get_nb_channels(int color_type); | |||
/* compute the row size of an interleaved pass */ | |||
extern int ff_png_pass_row_size(int pass, int bits_per_pixel, int width); | |||
extern int ff_png_common_init(AVCodecContext *avctx); | |||
#endif |
@@ -30,6 +30,37 @@ | |||
//#define DEBUG | |||
typedef struct PNGDecContext { | |||
uint8_t *bytestream; | |||
uint8_t *bytestream_start; | |||
uint8_t *bytestream_end; | |||
AVFrame picture; | |||
int state; | |||
int width, height; | |||
int bit_depth; | |||
int color_type; | |||
int compression_type; | |||
int interlace_type; | |||
int filter_type; | |||
int channels; | |||
int bits_per_pixel; | |||
int bpp; | |||
uint8_t *image_buf; | |||
int image_linesize; | |||
uint32_t palette[256]; | |||
uint8_t *crow_buf; | |||
uint8_t *last_row; | |||
uint8_t *tmp_row; | |||
int pass; | |||
int crow_size; /* compressed row size (include filter type) */ | |||
int row_size; /* decompressed row size */ | |||
int pass_row_size; /* decompress row size of the current pass */ | |||
int y; | |||
z_stream zstream; | |||
} PNGDecContext; | |||
/* Mask to determine which y pixels can be written in a pass */ | |||
static const uint8_t png_pass_dsp_ymask[NB_PASSES] = { | |||
0xff, 0xff, 0x0f, 0xcc, 0x33, 0xff, 0x55, | |||
@@ -182,7 +213,7 @@ static void convert_to_rgb32(uint8_t *dst, const uint8_t *src, int width) | |||
} | |||
/* process exactly one decompressed row */ | |||
static void png_handle_row(PNGContext *s) | |||
static void png_handle_row(PNGDecContext *s) | |||
{ | |||
uint8_t *ptr, *last_row; | |||
int got_line; | |||
@@ -252,7 +283,7 @@ static void png_handle_row(PNGContext *s) | |||
} | |||
} | |||
static int png_decode_idat(PNGContext *s, int length) | |||
static int png_decode_idat(PNGDecContext *s, int length) | |||
{ | |||
int ret; | |||
s->zstream.avail_in = length; | |||
@@ -283,7 +314,7 @@ static int decode_frame(AVCodecContext *avctx, | |||
void *data, int *data_size, | |||
uint8_t *buf, int buf_size) | |||
{ | |||
PNGContext * const s = avctx->priv_data; | |||
PNGDecContext * const s = avctx->priv_data; | |||
AVFrame *picture = data; | |||
AVFrame * const p= (AVFrame*)&s->picture; | |||
uint32_t tag, length; | |||
@@ -299,7 +330,7 @@ static int decode_frame(AVCodecContext *avctx, | |||
s->bytestream+= 8; | |||
s->y= | |||
s->state=0; | |||
// memset(s, 0, sizeof(PNGContext)); | |||
// memset(s, 0, sizeof(PNGDecContext)); | |||
/* init the zlib */ | |||
s->zstream.zalloc = ff_png_zalloc; | |||
s->zstream.zfree = ff_png_zfree; | |||
@@ -498,12 +529,21 @@ static int decode_frame(AVCodecContext *avctx, | |||
goto the_end; | |||
} | |||
static int png_dec_init(AVCodecContext *avctx){ | |||
PNGDecContext *s = avctx->priv_data; | |||
avcodec_get_frame_defaults((AVFrame*)&s->picture); | |||
avctx->coded_frame= (AVFrame*)&s->picture; | |||
return 0; | |||
} | |||
AVCodec png_decoder = { | |||
"png", | |||
CODEC_TYPE_VIDEO, | |||
CODEC_ID_PNG, | |||
sizeof(PNGContext), | |||
ff_png_common_init, | |||
sizeof(PNGDecContext), | |||
png_dec_init, | |||
NULL, | |||
NULL, //decode_end, | |||
decode_frame, | |||
@@ -31,6 +31,18 @@ | |||
//#define DEBUG | |||
#define IOBUF_SIZE 4096 | |||
typedef struct PNGEncContext { | |||
uint8_t *bytestream; | |||
uint8_t *bytestream_start; | |||
uint8_t *bytestream_end; | |||
AVFrame picture; | |||
z_stream zstream; | |||
uint8_t buf[IOBUF_SIZE]; | |||
} PNGEncContext; | |||
static void png_get_interlaced_row(uint8_t *dst, int row_size, | |||
int bits_per_pixel, int pass, | |||
const uint8_t *src, int width) | |||
@@ -106,7 +118,7 @@ static void png_write_chunk(uint8_t **f, uint32_t tag, | |||
} | |||
/* XXX: do filtering */ | |||
static int png_write_row(PNGContext *s, const uint8_t *data, int size) | |||
static int png_write_row(PNGEncContext *s, const uint8_t *data, int size) | |||
{ | |||
int ret; | |||
@@ -127,7 +139,7 @@ static int png_write_row(PNGContext *s, const uint8_t *data, int size) | |||
} | |||
static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data){ | |||
PNGContext *s = avctx->priv_data; | |||
PNGEncContext *s = avctx->priv_data; | |||
AVFrame *pict = data; | |||
AVFrame * const p= (AVFrame*)&s->picture; | |||
int bit_depth, color_type, y, len, row_size, ret, is_progressive; | |||
@@ -297,12 +309,21 @@ static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size, | |||
goto the_end; | |||
} | |||
static int png_enc_init(AVCodecContext *avctx){ | |||
PNGEncContext *s = avctx->priv_data; | |||
avcodec_get_frame_defaults((AVFrame*)&s->picture); | |||
avctx->coded_frame= (AVFrame*)&s->picture; | |||
return 0; | |||
} | |||
AVCodec png_encoder = { | |||
"png", | |||
CODEC_TYPE_VIDEO, | |||
CODEC_ID_PNG, | |||
sizeof(PNGContext), | |||
ff_png_common_init, | |||
sizeof(PNGEncContext), | |||
png_enc_init, | |||
encode_frame, | |||
NULL, //encode_end, | |||
.pix_fmts= (enum PixelFormat[]){PIX_FMT_RGB24, PIX_FMT_RGB32, PIX_FMT_PAL8, PIX_FMT_GRAY8, PIX_FMT_MONOBLACK, -1}, | |||