summaryrefslogtreecommitdiff
path: root/libavcodec/mpeg12.c
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2012-12-09 19:49:51 +0100
committerMichael Niedermayer <michaelni@gmx.at>2012-12-09 19:49:51 +0100
commit0af7ccd9e2689e5ae1a4532907b6d7c2e169ebb9 (patch)
tree1e337ff2aeb47f56fc291c1f616195ff15ac7c5c /libavcodec/mpeg12.c
parente3d95b54dbaf02b1c6ecdad67dbbf83562025be8 (diff)
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>
Diffstat (limited to 'libavcodec/mpeg12.c')
-rw-r--r--libavcodec/mpeg12.c15
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;
}