summaryrefslogtreecommitdiff
path: root/libavformat
diff options
context:
space:
mode:
authorLuca Barbato <lu_zero@gentoo.org>2012-09-20 01:07:09 +0200
committerLuca Barbato <lu_zero@gentoo.org>2012-09-24 22:35:29 +0200
commitd1f05dd18375f2f8e68372edee11436927e43ba8 (patch)
treec63585f1c7dd1f8bb10d3d5339ee7114a4583f5b /libavformat
parent7751e4693dd10ec98c20fbd9887233b575034272 (diff)
ogg: calculate the start position once all the headers are parsed
The fisbone packets can be muxed in any order as long the last one comes before the first data packet.
Diffstat (limited to 'libavformat')
-rw-r--r--libavformat/oggdec.c4
-rw-r--r--libavformat/oggdec.h3
-rw-r--r--libavformat/oggparseskeleton.c13
3 files changed, 16 insertions, 4 deletions
diff --git a/libavformat/oggdec.c b/libavformat/oggdec.c
index c8b2a858f1..175feb79e6 100644
--- a/libavformat/oggdec.c
+++ b/libavformat/oggdec.c
@@ -169,6 +169,7 @@ static int ogg_new_stream(AVFormatContext *s, uint32_t serial, int new_avstream)
os->bufsize = DECODER_BUFFER_SIZE;
os->buf = av_malloc(os->bufsize + FF_INPUT_BUFFER_PADDING_SIZE);
os->header = -1;
+ os->start_granule = OGG_NOGRANULE_VALUE;
if (new_avstream) {
st = avformat_new_stream(s, NULL);
@@ -463,6 +464,9 @@ static int ogg_get_headers(AVFormatContext *s)
"Headers mismatch for stream %d\n", i);
return AVERROR_INVALIDDATA;
}
+ if (os->start_granule != OGG_NOGRANULE_VALUE)
+ os->lastpts = s->streams[i]->start_time =
+ ogg_gptopts(s, i, os->start_granule, NULL);
}
av_dlog(s, "found headers\n");
diff --git a/libavformat/oggdec.h b/libavformat/oggdec.h
index fa8a5bc29a..bb7b345934 100644
--- a/libavformat/oggdec.h
+++ b/libavformat/oggdec.h
@@ -67,6 +67,7 @@ struct ogg_stream {
unsigned int pduration;
uint32_t serial;
uint64_t granule;
+ uint64_t start_granule;
int64_t lastpts;
int64_t lastdts;
int64_t sync_pos; ///< file offset of the first page needed to reconstruct the current packet
@@ -103,6 +104,8 @@ struct ogg {
#define OGG_FLAG_BOS 2
#define OGG_FLAG_EOS 4
+#define OGG_NOGRANULE_VALUE -1ull
+
extern const struct ogg_codec ff_celt_codec;
extern const struct ogg_codec ff_dirac_codec;
extern const struct ogg_codec ff_flac_codec;
diff --git a/libavformat/oggparseskeleton.c b/libavformat/oggparseskeleton.c
index a49d30be58..92841b8138 100644
--- a/libavformat/oggparseskeleton.c
+++ b/libavformat/oggparseskeleton.c
@@ -30,7 +30,8 @@ static int skeleton_header(AVFormatContext *s, int idx)
AVStream *st = s->streams[idx];
uint8_t *buf = os->buf + os->pstart;
int version_major, version_minor;
- int64_t start_num, start_den, start_granule;
+ int64_t start_num, start_den;
+ uint64_t start_granule;
int target_idx, start_time;
strcpy(st->codec->codec_name, "skeleton");
@@ -73,9 +74,13 @@ static int skeleton_header(AVFormatContext *s, int idx)
target_idx = ogg_find_stream(ogg, AV_RL32(buf+12));
start_granule = AV_RL64(buf+36);
- if (target_idx >= 0 && start_granule != -1) {
- ogg->streams[target_idx].lastpts =
- s->streams[target_idx]->start_time = ogg_gptopts(s, target_idx, start_granule, NULL);
+ if (os->start_granule != OGG_NOGRANULE_VALUE) {
+ av_log_missing_feature(s, "multiple fisbone for the "
+ "same stream\n", 0);
+ return 1;
+ }
+ if (target_idx >= 0 && start_granule != OGG_NOGRANULE_VALUE) {
+ os->start_granule = start_granule;
}
}