From 59cb40b92194c272c4d097c702a46f90edb94958 Mon Sep 17 00:00:00 2001 From: Michael Chinen Date: Mon, 27 Sep 2010 22:17:58 +0000 Subject: [PATCH] Fix index_entries pos: It was being set wrong for files with data_offset > 0 Patch by Michael Chinen, mchinen gmail Originally committed as revision 25239 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavcodec/avcodec.h | 2 ++ libavcodec/parser.c | 6 ++++++ libavformat/utils.c | 4 ---- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index 64a5583230..9f888992c8 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -3738,6 +3738,8 @@ typedef struct AVCodecParserContext { int flags; #define PARSER_FLAG_COMPLETE_FRAMES 0x0001 #define PARSER_FLAG_ONCE 0x0002 +/// Set if the parser has a valid file offset +#define PARSER_FLAG_FETCHED_OFFSET 0x0004 int64_t offset; ///< byte offset from starting packet start int64_t cur_frame_end[AV_PARSER_PTS_NB]; diff --git a/libavcodec/parser.c b/libavcodec/parser.c index 1aa86515d8..d877f5d411 100644 --- a/libavcodec/parser.c +++ b/libavcodec/parser.c @@ -150,6 +150,12 @@ int av_parser_parse2(AVCodecParserContext *s, int index, i; uint8_t dummy_buf[FF_INPUT_BUFFER_PADDING_SIZE]; + if(!(s->flags & PARSER_FLAG_FETCHED_OFFSET)) { + s->next_frame_offset = + s->cur_offset = pos; + s->flags |= PARSER_FLAG_FETCHED_OFFSET; + } + if (buf_size == 0) { /* padding is always necessary even if EOF, so we add it here */ memset(dummy_buf, 0, sizeof(dummy_buf)); diff --git a/libavformat/utils.c b/libavformat/utils.c index a445e0b861..24dbd88feb 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -1159,10 +1159,6 @@ static int av_read_frame_internal(AVFormatContext *s, AVPacket *pkt) }else if(st->need_parsing == AVSTREAM_PARSE_FULL_ONCE){ st->parser->flags |= PARSER_FLAG_ONCE; } - if(st->parser && (s->iformat->flags & AVFMT_GENERIC_INDEX)){ - st->parser->next_frame_offset= - st->parser->cur_offset= st->cur_pkt.pos; - } } } }