Mercurial > libavformat.hg
changeset 5817:eb9c746c3584 libavformat
oggdec: Determine pts and filepos on a packet basis in read_timestamp
This takes into account whether the granule defines the start or end times
of packets, and sets the correct file offset of the associated page.
author | conrad |
---|---|
date | Thu, 11 Mar 2010 07:17:56 +0000 |
parents | c587ece53810 |
children | 1a3c4f74f17d |
files | oggdec.c |
diffstat | 1 files changed, 7 insertions(+), 8 deletions(-) [+] |
line wrap: on
line diff
--- a/oggdec.c Thu Mar 11 07:17:53 2010 +0000 +++ b/oggdec.c Thu Mar 11 07:17:56 2010 +0000 @@ -581,15 +581,14 @@ int64_t pts = AV_NOPTS_VALUE; int i; url_fseek(bc, *pos_arg, SEEK_SET); - while (url_ftell(bc) < pos_limit && !ogg_read_page (s, &i)) { - if (ogg->streams[i].granule != -1 && ogg->streams[i].granule != 0 && - ogg->streams[i].codec && i == stream_index) { - pts = ogg_gptopts(s, i, ogg->streams[i].granule, NULL); - // FIXME: this is the position of the packet after the one with above - // pts. - *pos_arg = url_ftell(bc); + ogg_reset(ogg); + + while (url_ftell(bc) < pos_limit && !ogg_packet(s, &i, NULL, NULL, pos_arg)) { + if (i == stream_index) { + pts = ogg_calc_pts(s, i, NULL); + } + if (pts != AV_NOPTS_VALUE) break; - } } ogg_reset(ogg); return pts;