1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2025-01-24 13:56:33 +02:00

Simplify parser core.

Originally committed as revision 13613 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
Michael Niedermayer 2008-06-02 02:55:30 +00:00
parent 406113721f
commit cb63a4b37c
3 changed files with 18 additions and 34 deletions

View File

@ -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 {

View File

@ -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;
}

View File

@ -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;