|
|
|
@ -493,6 +493,36 @@ ogg_read_header (AVFormatContext * s, AVFormatParameters * ap) |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int64_t ogg_calc_pts(AVFormatContext *s, int idx, int64_t *dts) |
|
|
|
|
{ |
|
|
|
|
struct ogg *ogg = s->priv_data; |
|
|
|
|
struct ogg_stream *os = ogg->streams + idx; |
|
|
|
|
int64_t pts = AV_NOPTS_VALUE; |
|
|
|
|
|
|
|
|
|
if (dts) |
|
|
|
|
*dts = AV_NOPTS_VALUE; |
|
|
|
|
|
|
|
|
|
if (os->lastpts != AV_NOPTS_VALUE) { |
|
|
|
|
pts = os->lastpts; |
|
|
|
|
os->lastpts = AV_NOPTS_VALUE; |
|
|
|
|
} |
|
|
|
|
if (os->lastdts != AV_NOPTS_VALUE) { |
|
|
|
|
if (dts) |
|
|
|
|
*dts = os->lastdts; |
|
|
|
|
os->lastdts = AV_NOPTS_VALUE; |
|
|
|
|
} |
|
|
|
|
if (os->page_end) { |
|
|
|
|
if (os->granule != -1LL) { |
|
|
|
|
if (os->codec && os->codec->granule_is_start) |
|
|
|
|
pts = ogg_gptopts(s, idx, os->granule, dts); |
|
|
|
|
else |
|
|
|
|
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"); |
|
|
|
|
} |
|
|
|
|
return pts; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int |
|
|
|
|
ogg_read_packet (AVFormatContext * s, AVPacket * pkt) |
|
|
|
@ -518,25 +548,7 @@ ogg_read_packet (AVFormatContext * s, AVPacket * pkt) |
|
|
|
|
pkt->stream_index = idx; |
|
|
|
|
memcpy (pkt->data, os->buf + pstart, psize); |
|
|
|
|
|
|
|
|
|
if (os->lastpts != AV_NOPTS_VALUE) { |
|
|
|
|
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->dts); |
|
|
|
|
else |
|
|
|
|
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"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
pkt->pts = ogg_calc_pts(s, idx, &pkt->dts); |
|
|
|
|
pkt->flags = os->pflags; |
|
|
|
|
pkt->duration = os->pduration; |
|
|
|
|
pkt->pos = fpos; |
|
|
|
|