diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2012-12-09 19:49:51 +0100 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2012-12-09 19:49:51 +0100 |
commit | 0af7ccd9e2689e5ae1a4532907b6d7c2e169ebb9 (patch) | |
tree | 1e337ff2aeb47f56fc291c1f616195ff15ac7c5c | |
parent | e3d95b54dbaf02b1c6ecdad67dbbf83562025be8 (diff) | |
download | ffmpeg-0af7ccd9e2689e5ae1a4532907b6d7c2e169ebb9.tar.gz |
mpeg12: move current_picture_ptr reset to the end of decode_frame.
This fixes passing fields instead of frames into the decoder.
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
-rw-r--r-- | libavcodec/mpeg12.c | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/libavcodec/mpeg12.c b/libavcodec/mpeg12.c index c40af2bbd2..e32cce07cd 100644 --- a/libavcodec/mpeg12.c +++ b/libavcodec/mpeg12.c @@ -2522,14 +2522,13 @@ static int mpeg_decode_frame(AVCodecContext *avctx, AVPacket *avpkt) { const uint8_t *buf = avpkt->data; + int ret; int buf_size = avpkt->size; Mpeg1Context *s = avctx->priv_data; AVFrame *picture = data; MpegEncContext *s2 = &s->mpeg_enc_ctx; av_dlog(avctx, "fill_buffer\n"); - s2->current_picture_ptr = NULL; - if (buf_size == 0 || (buf_size == 4 && AV_RB32(buf) == SEQ_END_CODE)) { /* special case for last picture */ if (s2->low_delay == 0 && s2->next_picture_ptr) { @@ -2557,17 +2556,23 @@ static int mpeg_decode_frame(AVCodecContext *avctx, s->slice_count = 0; if (avctx->extradata && !s->parsed_extra) { - int ret = decode_chunks(avctx, picture, got_output, avctx->extradata, avctx->extradata_size); + ret = decode_chunks(avctx, picture, got_output, avctx->extradata, avctx->extradata_size); if(*got_output) { av_log(avctx, AV_LOG_ERROR, "picture in extradata\n"); *got_output = 0; } s->parsed_extra = 1; - if (ret < 0 && (avctx->err_recognition & AV_EF_EXPLODE)) + if (ret < 0 && (avctx->err_recognition & AV_EF_EXPLODE)) { + s2->current_picture_ptr = NULL; return ret; + } } - return decode_chunks(avctx, picture, got_output, buf, buf_size); + ret = decode_chunks(avctx, picture, got_output, buf, buf_size); + if (ret<0 || *got_output) + s2->current_picture_ptr = NULL; + + return ret; } |