idx, os->psize, os->pstart);
#endif
+ if (os->granule == -1)
+ av_log(s, AV_LOG_WARNING, "Page at %"PRId64" is missing granule\n", os->page_pos);
+
ogg->curidx = idx;
os->incomplete = 0;
if (!os->header){
os->segp = segp;
os->psize = psize;
- if (!ogg->headers)
- s->data_offset = os->sync_pos;
+
+ // We have reached the first non-header packet. All header
+ // packets must be complete before the first non-header
+ // one, so everything that follows must be non-header.
ogg->headers = 1;
+
+ // Update the header state for all streams and
+ // compute the data_offset.
+ s->data_offset = os->sync_pos;
+ for (i = 0; i < ogg->nstreams; i++) {
+ struct ogg_stream *cur_os = ogg->streams + i;
+ // Set stream header state to 0 if its last packet
+ // was a header.
+ if (cur_os->header > 0)
+ cur_os->header = 0;
+
+ // if we have a partial non-header packet, its start is
+ // obviously at or after the data start
+ if (cur_os->incomplete)
+ s->data_offset = FFMIN(s->data_offset, cur_os->sync_pos);
+ }
}else{
os->pstart += os->psize;
os->psize = 0;
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;
}
ogg_read_seek,
ogg_read_timestamp,
.extensions = "ogg",
- .metadata_conv = ff_vorbiscomment_metadata_conv,
+ .flags = AVFMT_GENERIC_INDEX,
};