diff --git a/libavformat/ipmovie.c b/libavformat/ipmovie.c index 26886d9592..3f40bb8fe8 100644 --- a/libavformat/ipmovie.c +++ b/libavformat/ipmovie.c @@ -47,6 +47,7 @@ #define CHUNK_SHUTDOWN 0x0004 #define CHUNK_END 0x0005 /* these last types are used internally */ +#define CHUNK_HAVE_PACKET 0xFFFB #define CHUNK_DONE 0xFFFC #define CHUNK_NOMEM 0xFFFD #define CHUNK_EOF 0xFFFE @@ -154,7 +155,7 @@ static int load_ipmovie_packet(IPMVEContext *s, AVIOContext *pb, av_log(s->avf, AV_LOG_TRACE, "sending audio frame with pts %"PRId64" (%d audio frames)\n", pkt->pts, s->audio_frame_count); - chunk_type = CHUNK_VIDEO; + chunk_type = CHUNK_HAVE_PACKET; } else if (s->frame_format) { @@ -230,7 +231,7 @@ static int load_ipmovie_packet(IPMVEContext *s, AVIOContext *pb, s->video_pts += s->frame_pts_inc; - chunk_type = CHUNK_VIDEO; + chunk_type = CHUNK_HAVE_PACKET; } else { @@ -602,10 +603,6 @@ static int process_ipmovie_chunk(IPMVEContext *s, AVIOContext *pb, /* make a note of where the stream is sitting */ s->next_chunk_offset = avio_tell(pb); - /* dispatch the first of any pending packets */ - if ((chunk_type == CHUNK_VIDEO) || (chunk_type == CHUNK_AUDIO_ONLY)) - chunk_type = load_ipmovie_packet(s, pb, pkt); - return chunk_type; } @@ -658,8 +655,7 @@ static int ipmovie_read_header(AVFormatContext *s) ipmovie->palette[i] = 0xFFU << 24; /* process the first chunk which should be CHUNK_INIT_VIDEO */ - if (process_ipmovie_chunk(ipmovie, pb, &pkt) != CHUNK_INIT_VIDEO) { - av_packet_unref(&pkt); + if (process_ipmovie_chunk(ipmovie, pb, NULL) != CHUNK_INIT_VIDEO) { return AVERROR_INVALIDDATA; } @@ -708,6 +704,10 @@ static int ipmovie_read_packet(AVFormatContext *s, for (;;) { ret = process_ipmovie_chunk(ipmovie, pb, pkt); + /* dispatch the first of any pending packets */ + if ((ret == CHUNK_VIDEO) || (ret == CHUNK_AUDIO_ONLY)) + ret = load_ipmovie_packet(ipmovie, pb, pkt); + if (ret == CHUNK_BAD) ret = AVERROR_INVALIDDATA; else if (ret == CHUNK_EOF) @@ -716,7 +716,7 @@ static int ipmovie_read_packet(AVFormatContext *s, ret = AVERROR(ENOMEM); else if (ret == CHUNK_END || ret == CHUNK_SHUTDOWN) ret = AVERROR_EOF; - else if (ret == CHUNK_VIDEO) + else if (ret == CHUNK_HAVE_PACKET) ret = 0; else if (ret == CHUNK_INIT_VIDEO || ret == CHUNK_INIT_AUDIO) continue;