mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-03-23 04:24:35 +02:00
hardly anything in PNGContext is shared; split it
Originally committed as revision 9689 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
9a5a05d0b3
commit
e0eddd1269
@ -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),
|
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 @@
|
|||||||
|
|
||||||
//#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),
|
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},
|
||||||
|
Loading…
x
Reference in New Issue
Block a user