aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2013-01-13 21:23:11 +0100
committerCarl Eugen Hoyos <cehoyos@ag.or.at>2013-01-15 21:12:03 +0100
commit66a3112100083f85ebd3ffbbb992e5fe53b2dfb8 (patch)
tree6ba0330d9147ae5fe8a7179600ae15fbc0d786db
parent3dab6e542941bbbc776995914eba164de303dbcd (diff)
downloadffmpeg-66a3112100083f85ebd3ffbbb992e5fe53b2dfb8.tar.gz
oggdec: resync from the last page.
Previously we re synced from where we where which cam lead to loosing pages. Signed-off-by: Michael Niedermayer <michaelni@gmx.at> (cherry picked from commit c5cf58d4b9b04cee1487a3095b83300791c21f15)
-rw-r--r--libavformat/oggdec.c10
-rw-r--r--libavformat/oggdec.h1
2 files changed, 11 insertions, 0 deletions
diff --git a/libavformat/oggdec.c b/libavformat/oggdec.c
index c3291cfbd4..6195747358 100644
--- a/libavformat/oggdec.c
+++ b/libavformat/oggdec.c
@@ -102,6 +102,7 @@ static int ogg_restore(AVFormatContext *s, int discard)
av_free(ogg->streams[i].buf);
avio_seek(bc, ost->pos, SEEK_SET);
+ ogg->page_pos = -1;
ogg->curidx = ost->curidx;
ogg->nstreams = ost->nstreams;
ogg->streams = av_realloc(ogg->streams,
@@ -146,6 +147,7 @@ static int ogg_reset(AVFormatContext *s)
}
}
+ ogg->page_pos = -1;
ogg->curidx = -1;
return 0;
@@ -297,6 +299,12 @@ static int ogg_read_page(AVFormatContext *s, int *sid)
sync[(sp + 2) & 3] == 'g' && sync[(sp + 3) & 3] == 'S')
break;
+ if(!i && bc->seekable && ogg->page_pos > 0) {
+ memset(sync, 0, 4);
+ avio_seek(bc, ogg->page_pos+4, SEEK_SET);
+ ogg->page_pos = -1;
+ }
+
c = avio_r8(bc);
if (url_feof(bc))
@@ -335,6 +343,7 @@ static int ogg_read_page(AVFormatContext *s, int *sid)
}
os = ogg->streams + idx;
+ ogg->page_pos =
os->page_pos = avio_tell(bc) - 27;
if (os->psize > 0)
@@ -559,6 +568,7 @@ static int ogg_get_length(AVFormatContext *s)
ogg_save(s);
avio_seek(s->pb, end, SEEK_SET);
+ ogg->page_pos = -1;
while (!ogg_read_page(s, &i)) {
if (ogg->streams[i].granule != -1 && ogg->streams[i].granule != 0 &&
diff --git a/libavformat/oggdec.h b/libavformat/oggdec.h
index febf8cb642..4b0ba4fcde 100644
--- a/libavformat/oggdec.h
+++ b/libavformat/oggdec.h
@@ -99,6 +99,7 @@ struct ogg {
int nstreams;
int headers;
int curidx;
+ int64_t page_pos; ///< file offset of the current page
struct ogg_state *state;
};