From cb63a4b37ccd33a731b4a3291b7cc376603569ad Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Mon, 2 Jun 2008 02:55:30 +0000 Subject: Simplify parser core. Originally committed as revision 13613 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavcodec/parser.c | 44 ++++++++++++++------------------------------ 1 file changed, 14 insertions(+), 30 deletions(-) (limited to 'libavcodec/parser.c') diff --git a/libavcodec/parser.c b/libavcodec/parser.c index 7c0c1d5054..e5a4b35061 100644 --- a/libavcodec/parser.c +++ b/libavcodec/parser.c @@ -118,17 +118,25 @@ int av_parser_parse(AVCodecParserContext *s, k = (s->cur_frame_start_index + 1) & (AV_PARSER_PTS_NB - 1); s->cur_frame_start_index = k; s->cur_frame_offset[k] = s->cur_offset; + s->cur_frame_end[k] = s->cur_offset + buf_size; s->cur_frame_pts[k] = pts; s->cur_frame_dts[k] = dts; + } - /* fill first PTS/DTS */ if (s->fetch_timestamp){ s->fetch_timestamp=0; - s->last_pts = pts; - s->last_dts = dts; - s->last_offset = 0; - s->cur_frame_pts[k] = - s->cur_frame_dts[k] = AV_NOPTS_VALUE; + s->last_pts = s->pts; + s->last_dts = s->dts; + s->dts= s->pts= AV_NOPTS_VALUE; + s->offset= 0; + for(i = 0; i < AV_PARSER_PTS_NB; i++) { + if ( s->last_frame_offset >= s->cur_frame_offset[i] + &&(s-> frame_offset < s->cur_frame_offset[i] || !s->frame_offset) + && s->last_frame_offset < s->cur_frame_end[i]){ + s->dts= s->cur_frame_dts[i]; + s->pts= s->cur_frame_pts[i]; + s->offset = s->last_frame_offset - s->cur_frame_offset[i]; + } } } @@ -139,34 +147,10 @@ int av_parser_parse(AVCodecParserContext *s, if (*poutbuf_size) { /* fill the data for the current frame */ s->frame_offset = s->last_frame_offset; - s->pts = s->last_pts; - s->dts = s->last_dts; - s->offset = s->last_offset; /* offset of the next frame */ s->last_frame_offset = s->cur_offset + index; - /* find the packet in which the new frame starts. It - is tricky because of MPEG video start codes - which can begin in one packet and finish in - another packet. In the worst case, an MPEG - video start code could be in 4 different - packets. */ - k = s->cur_frame_start_index; - for(i = 0; i < AV_PARSER_PTS_NB; i++) { - if (s->last_frame_offset >= s->cur_frame_offset[k]) - break; - k = (k - 1) & (AV_PARSER_PTS_NB - 1); - } - - s->last_pts = s->cur_frame_pts[k]; - s->last_dts = s->cur_frame_dts[k]; - s->last_offset = s->last_frame_offset - s->cur_frame_offset[k]; - - /* some parsers tell us the packet size even before seeing the first byte of the next packet, - so the next pts/dts is in the next chunk */ - if(index == buf_size){ s->fetch_timestamp=1; - } } if (index < 0) index = 0; -- cgit v1.2.3