提交 e0eddd12 编写于 作者: M Måns Rullgård

hardly anything in PNGContext is shared; split it

Originally committed as revision 9689 to svn://svn.ffmpeg.org/ffmpeg/trunk
上级 9a5a05d0
...@@ -80,13 +80,3 @@ int ff_png_pass_row_size(int pass, int bits_per_pixel, int width) ...@@ -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 @@ ...@@ -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); ...@@ -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 @@ ...@@ -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) ...@@ -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) ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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), sizeof(PNGDecContext),
ff_png_common_init, png_dec_init,
NULL, NULL,
NULL, //decode_end, NULL, //decode_end,
decode_frame, decode_frame,
......
...@@ -31,6 +31,18 @@ ...@@ -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, ...@@ -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) ...@@ -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, ...@@ -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), sizeof(PNGEncContext),
ff_png_common_init, 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},
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册