[FFmpeg-cvslog] ogg: calculate the start position once all the headers are parsed
Luca Barbato
git at videolan.org
Tue Sep 25 16:03:51 CEST 2012
ffmpeg | branch: master | Luca Barbato <lu_zero at gentoo.org> | Thu Sep 20 01:07:09 2012 +0200| [d1f05dd18375f2f8e68372edee11436927e43ba8] | committer: Luca Barbato
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.
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=d1f05dd18375f2f8e68372edee11436927e43ba8
---
libavformat/oggdec.c | 4 ++++
libavformat/oggdec.h | 3 +++
libavformat/oggparseskeleton.c | 13 +++++++++----
3 files changed, 16 insertions(+), 4 deletions(-)
diff --git a/libavformat/oggdec.c b/libavformat/oggdec.c
index c8b2a85..175feb7 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 fa8a5bc..bb7b345 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 a49d30b..92841b8 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;
}
}
More information about the ffmpeg-cvslog
mailing list