diff options
Diffstat (limited to 'src/libffmpeg/libavcodec/parser.c')
-rw-r--r-- | src/libffmpeg/libavcodec/parser.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/src/libffmpeg/libavcodec/parser.c b/src/libffmpeg/libavcodec/parser.c index 88894884c..ed386611a 100644 --- a/src/libffmpeg/libavcodec/parser.c +++ b/src/libffmpeg/libavcodec/parser.c @@ -60,6 +60,7 @@ AVCodecParserContext *av_parser_init(int codec_id) return NULL; } } + s->fetch_timestamp=1; return s; } @@ -87,7 +88,8 @@ int av_parser_parse(AVCodecParserContext *s, s->cur_frame_dts[k] = dts; /* fill first PTS/DTS */ - if (s->cur_offset == 0) { + if (s->fetch_timestamp){ + s->fetch_timestamp=0; s->last_pts = pts; s->last_dts = dts; } @@ -95,6 +97,7 @@ int av_parser_parse(AVCodecParserContext *s, /* WARNING: the returned index can be negative */ index = s->parser->parser_parse(s, avctx, poutbuf, poutbuf_size, buf, buf_size); +//av_log(NULL, AV_LOG_DEBUG, "parser: in:%lld, %lld, out:%lld, %lld, in:%d out:%d %d\n", pts, dts, s->last_pts, s->last_dts, buf_size, *poutbuf_size, avctx->codec_id); /* update the file pointer */ if (*poutbuf_size) { /* fill the data for the current frame */ @@ -116,8 +119,15 @@ int av_parser_parse(AVCodecParserContext *s, 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]; + + /* 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; @@ -426,7 +436,7 @@ static int av_mpeg4_decode_header(AVCodecParserContext *s1, return ret; } -int mpeg4video_parse_init(AVCodecParserContext *s) +static int mpeg4video_parse_init(AVCodecParserContext *s) { ParseContext1 *pc = s->priv_data; |