From ddfff763978dd6a79e6e8e560291e76fc98a667c Mon Sep 17 00:00:00 2001 From: James Almer Date: Sat, 6 Jul 2013 04:34:13 -0300 Subject: [PATCH 1/3] oggparseskeleton: Fix fisbone header parsing start_granule should be applied to the stream referenced in the fisbone packet, not to the Skeleton stream. This was broken in d1f05dd18375f2f8e68372edee11436927e43ba8 and produced bogus warnings about multiple fisbone in the same stream on files with more than one stream. Signed-off-by: Michael Niedermayer (cherry picked from commit 3960992f0abf8e28acada220c79fb754d67298ba) --- libavformat/oggparseskeleton.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/libavformat/oggparseskeleton.c b/libavformat/oggparseskeleton.c index 4b02c838f2..01032b2288 100644 --- a/libavformat/oggparseskeleton.c +++ b/libavformat/oggparseskeleton.c @@ -74,12 +74,17 @@ 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) { + av_log(s, AV_LOG_WARNING, "Serial number in fisbone doesn't match any stream\n"); + return 1; + } + os = ogg->streams + target_idx; 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) { + if (start_granule != OGG_NOGRANULE_VALUE) { os->start_granule = start_granule; } } From 2d66486b8eab6f89311bd0832c5f326a5d80e276 Mon Sep 17 00:00:00 2001 From: James Almer Date: Sat, 6 Jul 2013 04:34:13 -0300 Subject: [PATCH 2/3] oggparseskeleton: Replace avpriv_report_missing_feature() with a normal av_log() call since there should not be more than one fisbone for a given stream. Signed-off-by: Michael Niedermayer (cherry picked from commit 63d7684fefcfa9de1a04b43471f876e882ba7aac) Conflicts: libavformat/oggparseskeleton.c --- libavformat/oggparseskeleton.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/libavformat/oggparseskeleton.c b/libavformat/oggparseskeleton.c index 01032b2288..415a4235dc 100644 --- a/libavformat/oggparseskeleton.c +++ b/libavformat/oggparseskeleton.c @@ -80,8 +80,7 @@ static int skeleton_header(AVFormatContext *s, int idx) } os = ogg->streams + target_idx; if (os->start_granule != OGG_NOGRANULE_VALUE) { - av_log_missing_feature(s, "multiple fisbone for the " - "same stream\n", 0); + av_log(s, AV_LOG_WARNING, "Multiple fisbone for the same stream\n"); return 1; } if (start_granule != OGG_NOGRANULE_VALUE) { From be23cee317f52f3dffa49812f412c0041d8b0de3 Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Sat, 6 Jul 2013 23:53:19 +0200 Subject: [PATCH 3/3] oggparseskeleton: avoid header parsing failure Based on description by James Almer and the xiph wiki Signed-off-by: Michael Niedermayer (cherry picked from commit 9a6e814be7c052deb34a8f585176d053f4c187c1) --- libavformat/oggparseskeleton.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/libavformat/oggparseskeleton.c b/libavformat/oggparseskeleton.c index 415a4235dc..79c018da66 100644 --- a/libavformat/oggparseskeleton.c +++ b/libavformat/oggparseskeleton.c @@ -37,6 +37,9 @@ static int skeleton_header(AVFormatContext *s, int idx) strcpy(st->codec->codec_name, "skeleton"); st->codec->codec_type = AVMEDIA_TYPE_DATA; + if ((os->flags & OGG_FLAG_EOS) && os->psize == 0) + return 1; + if (os->psize < 8) return -1;