Simplify parser core.

Originally committed as revision 13613 to svn://svn.ffmpeg.org/ffmpeg/trunk
pull/126/head
Michael Niedermayer 17 years ago
parent 406113721f
commit cb63a4b37c
  1. 2
      libavcodec/avcodec.h
  2. 6
      libavcodec/dvbsub_parser.c
  3. 44
      libavcodec/parser.c

@ -2837,6 +2837,7 @@ typedef struct AVCodecParserContext {
#define AV_PARSER_PTS_NB 4 #define AV_PARSER_PTS_NB 4
int cur_frame_start_index; int cur_frame_start_index;
int64_t cur_frame_offset[AV_PARSER_PTS_NB]; 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_pts[AV_PARSER_PTS_NB];
int64_t cur_frame_dts[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 #define PARSER_FLAG_COMPLETE_FRAMES 0x0001
int64_t offset; ///< byte offset from starting packet start int64_t offset; ///< byte offset from starting packet start
int64_t last_offset;
} AVCodecParserContext; } AVCodecParserContext;
typedef struct AVCodecParser { typedef struct AVCodecParser {

@ -80,7 +80,7 @@ static int dvbsub_parse(AVCodecParserContext *s,
s->fetch_timestamp = 1; 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) if (pc->packet_index != pc->packet_start)
{ {
@ -175,8 +175,8 @@ static int dvbsub_parse(AVCodecParserContext *s,
pc->packet_start = *poutbuf_size; pc->packet_start = *poutbuf_size;
} }
if (s->last_pts == AV_NOPTS_VALUE) if (s->pts == AV_NOPTS_VALUE)
s->last_pts = s->pts; s->pts = s->last_pts;
return buf_size; return buf_size;
} }

@ -118,17 +118,25 @@ int av_parser_parse(AVCodecParserContext *s,
k = (s->cur_frame_start_index + 1) & (AV_PARSER_PTS_NB - 1); k = (s->cur_frame_start_index + 1) & (AV_PARSER_PTS_NB - 1);
s->cur_frame_start_index = k; s->cur_frame_start_index = k;
s->cur_frame_offset[k] = s->cur_offset; 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_pts[k] = pts;
s->cur_frame_dts[k] = dts; s->cur_frame_dts[k] = dts;
}
/* fill first PTS/DTS */
if (s->fetch_timestamp){ if (s->fetch_timestamp){
s->fetch_timestamp=0; s->fetch_timestamp=0;
s->last_pts = pts; s->last_pts = s->pts;
s->last_dts = dts; s->last_dts = s->dts;
s->last_offset = 0; s->dts= s->pts= AV_NOPTS_VALUE;
s->cur_frame_pts[k] = s->offset= 0;
s->cur_frame_dts[k] = AV_NOPTS_VALUE; 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) { if (*poutbuf_size) {
/* fill the data for the current frame */ /* fill the data for the current frame */
s->frame_offset = s->last_frame_offset; 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 */ /* offset of the next frame */
s->last_frame_offset = s->cur_offset + index; 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; s->fetch_timestamp=1;
}
} }
if (index < 0) if (index < 0)
index = 0; index = 0;

Loading…
Cancel
Save