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; | pass_width = (width - xmin + (1 << shift) - 1) >> shift; | ||||
return (pass_width * bits_per_pixel + 7) >> 3; | 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 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]; | extern const uint8_t ff_pngsig[8]; | ||||
/* Mask to determine which y pixels are valid in a pass */ | /* 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 */ | /* 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_pass_row_size(int pass, int bits_per_pixel, int width); | ||||
extern int ff_png_common_init(AVCodecContext *avctx); | |||||
#endif | #endif |
@@ -30,6 +30,37 @@ | |||||
//#define DEBUG | //#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 */ | /* Mask to determine which y pixels can be written in a pass */ | ||||
static const uint8_t png_pass_dsp_ymask[NB_PASSES] = { | static const uint8_t png_pass_dsp_ymask[NB_PASSES] = { | ||||
0xff, 0xff, 0x0f, 0xcc, 0x33, 0xff, 0x55, | 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 */ | /* process exactly one decompressed row */ | ||||
static void png_handle_row(PNGContext *s) | |||||
static void png_handle_row(PNGDecContext *s) | |||||
{ | { | ||||
uint8_t *ptr, *last_row; | uint8_t *ptr, *last_row; | ||||
int got_line; | 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; | int ret; | ||||
s->zstream.avail_in = length; | s->zstream.avail_in = length; | ||||
@@ -283,7 +314,7 @@ static int decode_frame(AVCodecContext *avctx, | |||||
void *data, int *data_size, | void *data, int *data_size, | ||||
uint8_t *buf, int buf_size) | uint8_t *buf, int buf_size) | ||||
{ | { | ||||
PNGContext * const s = avctx->priv_data; | |||||
PNGDecContext * const s = avctx->priv_data; | |||||
AVFrame *picture = data; | AVFrame *picture = data; | ||||
AVFrame * const p= (AVFrame*)&s->picture; | AVFrame * const p= (AVFrame*)&s->picture; | ||||
uint32_t tag, length; | uint32_t tag, length; | ||||
@@ -299,7 +330,7 @@ static int decode_frame(AVCodecContext *avctx, | |||||
s->bytestream+= 8; | s->bytestream+= 8; | ||||
s->y= | s->y= | ||||
s->state=0; | s->state=0; | ||||
// memset(s, 0, sizeof(PNGContext)); | |||||
// memset(s, 0, sizeof(PNGDecContext)); | |||||
/* init the zlib */ | /* init the zlib */ | ||||
s->zstream.zalloc = ff_png_zalloc; | s->zstream.zalloc = ff_png_zalloc; | ||||
s->zstream.zfree = ff_png_zfree; | s->zstream.zfree = ff_png_zfree; | ||||
@@ -498,12 +529,21 @@ static int decode_frame(AVCodecContext *avctx, | |||||
goto the_end; | 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 = { | AVCodec png_decoder = { | ||||
"png", | "png", | ||||
CODEC_TYPE_VIDEO, | CODEC_TYPE_VIDEO, | ||||
CODEC_ID_PNG, | CODEC_ID_PNG, | ||||
sizeof(PNGContext), | |||||
ff_png_common_init, | |||||
sizeof(PNGDecContext), | |||||
png_dec_init, | |||||
NULL, | NULL, | ||||
NULL, //decode_end, | NULL, //decode_end, | ||||
decode_frame, | decode_frame, | ||||
@@ -31,6 +31,18 @@ | |||||
//#define DEBUG | //#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, | static void png_get_interlaced_row(uint8_t *dst, int row_size, | ||||
int bits_per_pixel, int pass, | int bits_per_pixel, int pass, | ||||
const uint8_t *src, int width) | const uint8_t *src, int width) | ||||
@@ -106,7 +118,7 @@ static void png_write_chunk(uint8_t **f, uint32_t tag, | |||||
} | } | ||||
/* XXX: do filtering */ | /* 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; | 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){ | 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 *pict = data; | ||||
AVFrame * const p= (AVFrame*)&s->picture; | AVFrame * const p= (AVFrame*)&s->picture; | ||||
int bit_depth, color_type, y, len, row_size, ret, is_progressive; | 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; | 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 = { | AVCodec png_encoder = { | ||||
"png", | "png", | ||||
CODEC_TYPE_VIDEO, | CODEC_TYPE_VIDEO, | ||||
CODEC_ID_PNG, | CODEC_ID_PNG, | ||||
sizeof(PNGContext), | |||||
ff_png_common_init, | |||||
sizeof(PNGEncContext), | |||||
png_enc_init, | |||||
encode_frame, | encode_frame, | ||||
NULL, //encode_end, | NULL, //encode_end, | ||||
.pix_fmts= (enum PixelFormat[]){PIX_FMT_RGB24, PIX_FMT_RGB32, 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}, | ||||