Commit cb63a4b3 authored by Michael Niedermayer's avatar Michael Niedermayer

Simplify parser core.

Originally committed as revision 13613 to svn://svn.ffmpeg.org/ffmpeg/trunk
parent 40611372
......@@ -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 {
......
......@@ -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;
}
......
......@@ -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,35 +147,11 @@ 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;
s->cur_offset += index;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment