Browse Source

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>
tags/n1.2
Michael Niedermayer 12 years ago
parent
commit
c5cf58d4b9
2 changed files with 11 additions and 0 deletions
  1. +10
    -0
      libavformat/oggdec.c
  2. +1
    -0
      libavformat/oggdec.h

+ 10
- 0
libavformat/oggdec.c View File

@@ -101,6 +101,7 @@ static int ogg_restore(AVFormatContext *s, int discard)
av_free(ogg->streams[i].buf); av_free(ogg->streams[i].buf);


avio_seek(bc, ost->pos, SEEK_SET); avio_seek(bc, ost->pos, SEEK_SET);
ogg->page_pos = -1;
ogg->curidx = ost->curidx; ogg->curidx = ost->curidx;
ogg->nstreams = ost->nstreams; ogg->nstreams = ost->nstreams;
ogg->streams = av_realloc(ogg->streams, ogg->streams = av_realloc(ogg->streams,
@@ -145,6 +146,7 @@ static int ogg_reset(AVFormatContext *s)
} }
} }


ogg->page_pos = -1;
ogg->curidx = -1; ogg->curidx = -1;


return 0; return 0;
@@ -296,6 +298,12 @@ static int ogg_read_page(AVFormatContext *s, int *sid)
sync[(sp + 2) & 3] == 'g' && sync[(sp + 3) & 3] == 'S') sync[(sp + 2) & 3] == 'g' && sync[(sp + 3) & 3] == 'S')
break; 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); c = avio_r8(bc);


if (url_feof(bc)) if (url_feof(bc))
@@ -334,6 +342,7 @@ static int ogg_read_page(AVFormatContext *s, int *sid)
} }


os = ogg->streams + idx; os = ogg->streams + idx;
ogg->page_pos =
os->page_pos = avio_tell(bc) - 27; os->page_pos = avio_tell(bc) - 27;


if (os->psize > 0) if (os->psize > 0)
@@ -558,6 +567,7 @@ static int ogg_get_length(AVFormatContext *s)


ogg_save(s); ogg_save(s);
avio_seek(s->pb, end, SEEK_SET); avio_seek(s->pb, end, SEEK_SET);
ogg->page_pos = -1;


while (!ogg_read_page(s, &i)) { while (!ogg_read_page(s, &i)) {
if (ogg->streams[i].granule != -1 && ogg->streams[i].granule != 0 && if (ogg->streams[i].granule != -1 && ogg->streams[i].granule != 0 &&


+ 1
- 0
libavformat/oggdec.h View File

@@ -100,6 +100,7 @@ struct ogg {
int nstreams; int nstreams;
int headers; int headers;
int curidx; int curidx;
int64_t page_pos; ///< file offset of the current page
struct ogg_state *state; struct ogg_state *state;
}; };




Loading…
Cancel
Save