summaryrefslogtreecommitdiff
path: root/src/libffmpeg/libavcodec/parser.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libffmpeg/libavcodec/parser.c')
-rw-r--r--src/libffmpeg/libavcodec/parser.c14
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;