diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2008-06-02 02:55:30 +0000 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2008-06-02 02:55:30 +0000 |
commit | cb63a4b37ccd33a731b4a3291b7cc376603569ad (patch) | |
tree | acc65120225a075baa56ea09957e3521605f636b | |
parent | 406113721f53bc85aad006b4247db355f043c211 (diff) | |
download | ffmpeg-cb63a4b37ccd33a731b4a3291b7cc376603569ad.tar.gz |
Simplify parser core.
Originally committed as revision 13613 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r-- | libavcodec/avcodec.h | 2 | ||||
-rw-r--r-- | libavcodec/dvbsub_parser.c | 6 | ||||
-rw-r--r-- | libavcodec/parser.c | 44 |
3 files changed, 18 insertions, 34 deletions
diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index 2cf360fbcf..b14c1a940c 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -2837,6 +2837,7 @@ typedef struct AVCodecParserContext { #define AV_PARSER_PTS_NB 4 int cur_frame_start_index; int64_t cur_frame_offset[AV_PARSER_PTS_NB]; + int64_t cur_frame_end[AV_PARSER_PTS_NB]; int64_t cur_frame_pts[AV_PARSER_PTS_NB]; int64_t cur_frame_dts[AV_PARSER_PTS_NB]; @@ -2844,7 +2845,6 @@ typedef struct AVCodecParserContext { #define PARSER_FLAG_COMPLETE_FRAMES 0x0001 int64_t offset; ///< byte offset from starting packet start - int64_t last_offset; } AVCodecParserContext; typedef struct AVCodecParser { diff --git a/libavcodec/dvbsub_parser.c b/libavcodec/dvbsub_parser.c index 459f6cccd6..0a83de39ef 100644 --- a/libavcodec/dvbsub_parser.c +++ b/libavcodec/dvbsub_parser.c @@ -80,7 +80,7 @@ static int dvbsub_parse(AVCodecParserContext *s, s->fetch_timestamp = 1; - if (s->last_pts != s->pts && s->last_pts != AV_NOPTS_VALUE) /* Start of a new packet */ + if (s->last_pts != s->pts && s->pts != AV_NOPTS_VALUE) /* Start of a new packet */ { if (pc->packet_index != pc->packet_start) { @@ -175,8 +175,8 @@ static int dvbsub_parse(AVCodecParserContext *s, pc->packet_start = *poutbuf_size; } - if (s->last_pts == AV_NOPTS_VALUE) - s->last_pts = s->pts; + if (s->pts == AV_NOPTS_VALUE) + s->pts = s->last_pts; return buf_size; } 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; |