diff --git a/libavcodec/png.c b/libavcodec/png.c index 2af7700630611f9dc5a21cdb7fd92dfcff52adc9..969c14774f5f05a79c5b07858ccc2dc0b8517241 100644 --- a/libavcodec/png.c +++ b/libavcodec/png.c @@ -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; -} diff --git a/libavcodec/png.h b/libavcodec/png.h index fb5ec061221c1e81fd7d8607e95dfef0e9fdda57..c407efd8021779521a672979482a738e6d602364 100644 --- a/libavcodec/png.h +++ b/libavcodec/png.h @@ -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 diff --git a/libavcodec/pngdec.c b/libavcodec/pngdec.c index a8bf6d07a2cb02d397ae1da250f810f4be4da3ea..1b7319fe7ee27e2a27aab019f5087a1f6b476cc3 100644 --- a/libavcodec/pngdec.c +++ b/libavcodec/pngdec.c @@ -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, diff --git a/libavcodec/pngenc.c b/libavcodec/pngenc.c index d4cd6deae37dd34302e80c800fb067bf4ca441b4..22365e9da39d30eee6d4debfb143c564e194bda5 100644 --- a/libavcodec/pngenc.c +++ b/libavcodec/pngenc.c @@ -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},