# HG changeset patch # User michael # Date 1085274615 0 # Node ID f796043935f3fbf13596bcc2b72a8a33d0628d45 # Parent 934117474c3be693c416734c2f551809e030dd73 mpeg audio timestamp fix diff -r 934117474c3b -r f796043935f3 avcodec.h --- a/avcodec.h Fri May 21 14:40:35 2004 +0000 +++ b/avcodec.h Sun May 23 01:10:15 2004 +0000 @@ -17,7 +17,7 @@ #define FFMPEG_VERSION_INT 0x000408 #define FFMPEG_VERSION "0.4.8" -#define LIBAVCODEC_BUILD 4714 +#define LIBAVCODEC_BUILD 4715 #define LIBAVCODEC_VERSION_INT FFMPEG_VERSION_INT #define LIBAVCODEC_VERSION FFMPEG_VERSION @@ -2090,6 +2090,7 @@ /* private data */ int64_t last_pts; int64_t last_dts; + int fetch_timestamp; #define AV_PARSER_PTS_NB 4 int cur_frame_start_index; diff -r 934117474c3b -r f796043935f3 parser.c --- a/parser.c Fri May 21 14:40:35 2004 +0000 +++ b/parser.c Sun May 23 01:10:15 2004 +0000 @@ -60,6 +60,7 @@ return NULL; } } + s->fetch_timestamp=1; return s; } @@ -87,7 +88,8 @@ 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 @@ /* 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 @@ 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;