# HG changeset patch # User michael # Date 1212375330 0 # Node ID de032bcdeff9f23f9da6dde58dd4f937543fa58e # Parent 4e96557381d91ec1ef22a6b4a766c7faddb7d703 Simplify parser core. diff -r 4e96557381d9 -r de032bcdeff9 avcodec.h --- a/avcodec.h Mon Jun 02 02:54:46 2008 +0000 +++ b/avcodec.h Mon Jun 02 02:55:30 2008 +0000 @@ -2837,6 +2837,7 @@ #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 @@ #define PARSER_FLAG_COMPLETE_FRAMES 0x0001 int64_t offset; ///< byte offset from starting packet start - int64_t last_offset; } AVCodecParserContext; typedef struct AVCodecParser { diff -r 4e96557381d9 -r de032bcdeff9 dvbsub_parser.c --- a/dvbsub_parser.c Mon Jun 02 02:54:46 2008 +0000 +++ b/dvbsub_parser.c Mon Jun 02 02:55:30 2008 +0000 @@ -80,7 +80,7 @@ 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 @@ 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 -r 4e96557381d9 -r de032bcdeff9 parser.c --- a/parser.c Mon Jun 02 02:54:46 2008 +0000 +++ b/parser.c Mon Jun 02 02:55:30 2008 +0000 @@ -118,17 +118,25 @@ 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 @@ 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;