Mercurial > libavformat.hg
diff oggdec.c @ 5514:52c7b29eca31 libavformat
oggdec: Set dts when known
author | conrad |
---|---|
date | Mon, 11 Jan 2010 05:51:09 +0000 |
parents | 60671fac35ad |
children | 37e2c3e635b3 |
line wrap: on
line diff
--- a/oggdec.c Mon Jan 11 00:31:55 2010 +0000 +++ b/oggdec.c Mon Jan 11 05:51:09 2010 +0000 @@ -119,6 +119,7 @@ os->psize = 0; os->granule = -1; os->lastpts = AV_NOPTS_VALUE; + os->lastdts = AV_NOPTS_VALUE; os->nsegs = 0; os->segp = 0; } @@ -428,16 +429,18 @@ } static uint64_t -ogg_gptopts (AVFormatContext * s, int i, uint64_t gp) +ogg_gptopts (AVFormatContext * s, int i, uint64_t gp, int64_t *dts) { struct ogg *ogg = s->priv_data; struct ogg_stream *os = ogg->streams + i; uint64_t pts = AV_NOPTS_VALUE; if(os->codec->gptopts){ - pts = os->codec->gptopts(s, i, gp); + pts = os->codec->gptopts(s, i, gp, dts); } else { pts = gp; + if (dts) + *dts = pts; } return pts; @@ -474,7 +477,7 @@ if (idx != -1){ s->streams[idx]->duration = - ogg_gptopts (s, idx, ogg->streams[idx].granule); + ogg_gptopts (s, idx, ogg->streams[idx].granule, NULL); } ogg->size = size; @@ -534,12 +537,16 @@ pkt->pts = os->lastpts; os->lastpts = AV_NOPTS_VALUE; } + if (os->lastdts != AV_NOPTS_VALUE) { + pkt->dts = os->lastdts; + os->lastdts = AV_NOPTS_VALUE; + } if (os->page_end) { if (os->granule != -1LL) { if (os->codec && os->codec->granule_is_start) - pkt->pts = ogg_gptopts(s, idx, os->granule); + pkt->pts = ogg_gptopts(s, idx, os->granule, &pkt->dts); else - os->lastpts = ogg_gptopts(s, idx, os->granule); + os->lastpts = ogg_gptopts(s, idx, os->granule, &os->lastdts); os->granule = -1LL; } else av_log(s, AV_LOG_WARNING, "Packet is missing granule\n"); @@ -579,7 +586,7 @@ 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); + 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);