Add support to CorePNG P-frames.

Patch by Thilo Borgmann thilo DOT borgmann A googlemail com.

Originally committed as revision 18421 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
Thilo Borgmann 2009-04-10 17:16:19 +00:00 committed by Stefano Sabatini
parent cc7b62afd2
commit ee30cdabad
1 changed files with 29 additions and 5 deletions

View File

@ -37,7 +37,8 @@ typedef struct PNGDecContext {
const uint8_t *bytestream; const uint8_t *bytestream;
const uint8_t *bytestream_start; const uint8_t *bytestream_start;
const uint8_t *bytestream_end; const uint8_t *bytestream_end;
AVFrame picture; AVFrame picture1, picture2;
AVFrame *current_picture, *last_picture;
int state; int state;
int width, height; int width, height;
@ -385,10 +386,14 @@ static int decode_frame(AVCodecContext *avctx,
int buf_size = avpkt->size; int buf_size = avpkt->size;
PNGDecContext * const s = avctx->priv_data; PNGDecContext * const s = avctx->priv_data;
AVFrame *picture = data; AVFrame *picture = data;
AVFrame * const p= &s->picture; AVFrame *p;
uint32_t tag, length; uint32_t tag, length;
int ret, crc; int ret, crc;
FFSWAP(AVFrame *, s->current_picture, s->last_picture);
avctx->coded_frame= s->current_picture;
p = s->current_picture;
s->bytestream_start= s->bytestream_start=
s->bytestream= buf; s->bytestream= buf;
s->bytestream_end= buf + buf_size; s->bytestream_end= buf + buf_size;
@ -584,7 +589,24 @@ static int decode_frame(AVCodecContext *avctx,
} }
} }
exit_loop: exit_loop:
*picture= s->picture; /* handle p-frames only if a predecessor frame is available */
if(s->last_picture->data[0] != NULL) {
if(!(avpkt->flags & PKT_FLAG_KEY)) {
int i, j;
uint8_t *pd = s->current_picture->data[0];
uint8_t *pd_last = s->last_picture->data[0];
for(j=0; j < s->height; j++) {
for(i=0; i < s->width * s->bpp; i++) {
pd[i] += pd_last[i];
}
pd += s->image_linesize;
pd_last += s->image_linesize;
}
}
}
*picture= *s->current_picture;
*data_size = sizeof(AVFrame); *data_size = sizeof(AVFrame);
ret = s->bytestream - s->bytestream_start; ret = s->bytestream - s->bytestream_start;
@ -602,8 +624,10 @@ static int decode_frame(AVCodecContext *avctx,
static av_cold int png_dec_init(AVCodecContext *avctx){ static av_cold int png_dec_init(AVCodecContext *avctx){
PNGDecContext *s = avctx->priv_data; PNGDecContext *s = avctx->priv_data;
avcodec_get_frame_defaults(&s->picture); s->current_picture = &s->picture1;
avctx->coded_frame= &s->picture; s->last_picture = &s->picture2;
avcodec_get_frame_defaults(&s->picture1);
avcodec_get_frame_defaults(&s->picture2);
dsputil_init(&s->dsp, avctx); dsputil_init(&s->dsp, avctx);
return 0; return 0;