#define MAX_PAGE_SIZE 65307
#define DECODER_BUFFER_SIZE MAX_PAGE_SIZE
-static ogg_codec_t *ogg_codecs[] = {
- &speex_codec,
- &vorbis_codec,
- &theora_codec,
- &flac_codec,
- &old_flac_codec,
- &ogm_video_codec,
- &ogm_audio_codec,
- &ogm_text_codec,
- &ogm_old_codec,
+static const struct ogg_codec * const ogg_codecs[] = {
+ &ff_speex_codec,
+ &ff_vorbis_codec,
+ &ff_theora_codec,
+ &ff_flac_codec,
+ &ff_old_flac_codec,
+ &ff_ogm_video_codec,
+ &ff_ogm_audio_codec,
+ &ff_ogm_text_codec,
+ &ff_ogm_old_codec,
NULL
};
static int
ogg_save (AVFormatContext * s)
{
- ogg_t *ogg = s->priv_data;
- ogg_state_t *ost =
+ struct ogg *ogg = s->priv_data;
+ struct ogg_state *ost =
av_malloc(sizeof (*ost) + (ogg->nstreams-1) * sizeof (*ogg->streams));
int i;
ost->pos = url_ftell (s->pb);
memcpy(ost->streams, ogg->streams, ogg->nstreams * sizeof(*ogg->streams));
for (i = 0; i < ogg->nstreams; i++){
- ogg_stream_t *os = ogg->streams + i;
+ struct ogg_stream *os = ogg->streams + i;
os->buf = av_malloc (os->bufsize);
memset (os->buf, 0, os->bufsize);
memcpy (os->buf, ost->streams[i].buf, os->bufpos);
static int
ogg_restore (AVFormatContext * s, int discard)
{
- ogg_t *ogg = s->priv_data;
+ struct ogg *ogg = s->priv_data;
ByteIOContext *bc = s->pb;
- ogg_state_t *ost = ogg->state;
+ struct ogg_state *ost = ogg->state;
int i;
if (!ost)
}
static int
-ogg_reset (ogg_t * ogg)
+ogg_reset (struct ogg * ogg)
{
int i;
for (i = 0; i < ogg->nstreams; i++){
- ogg_stream_t *os = ogg->streams + i;
+ struct ogg_stream *os = ogg->streams + i;
os->bufpos = 0;
os->pstart = 0;
os->psize = 0;
return 0;
}
-static ogg_codec_t *
+static const struct ogg_codec *
ogg_find_codec (uint8_t * buf, int size)
{
int i;
}
static int
-ogg_find_stream (ogg_t * ogg, int serial)
+ogg_find_stream (struct ogg * ogg, int serial)
{
int i;
ogg_new_stream (AVFormatContext * s, uint32_t serial)
{
- ogg_t *ogg = s->priv_data;
+ struct ogg *ogg = s->priv_data;
int idx = ogg->nstreams++;
AVStream *st;
- ogg_stream_t *os;
+ struct ogg_stream *os;
ogg->streams = av_realloc (ogg->streams,
ogg->nstreams * sizeof (*ogg->streams));
}
static int
-ogg_new_buf(ogg_t *ogg, int idx)
+ogg_new_buf(struct ogg *ogg, int idx)
{
- ogg_stream_t *os = ogg->streams + idx;
+ struct ogg_stream *os = ogg->streams + idx;
uint8_t *nb = av_malloc(os->bufsize);
int size = os->bufpos - os->pstart;
if(os->buf){
ogg_read_page (AVFormatContext * s, int *str)
{
ByteIOContext *bc = s->pb;
- ogg_t *ogg = s->priv_data;
- ogg_stream_t *os;
+ struct ogg *ogg = s->priv_data;
+ struct ogg_stream *os;
int i = 0;
int flags, nsegs;
uint64_t gp;
int seg = os->segments[os->segp++];
os->pstart += seg;
if (seg < 255)
- break;
+ break;
}
}
}else{
- os->psize = 0;
+ os->psize = 0;
}
if (os->bufsize - os->bufpos < size){
static int
ogg_packet (AVFormatContext * s, int *str, int *dstart, int *dsize)
{
- ogg_t *ogg = s->priv_data;
+ struct ogg *ogg = s->priv_data;
int idx;
- ogg_stream_t *os;
+ struct ogg_stream *os;
int complete = 0;
int segp = 0, psize = 0;
if (os->header < 0){
int hdr = os->codec->header (s, idx);
if (!hdr){
- os->header = os->seq;
- os->segp = segp;
- os->psize = psize;
- ogg->headers = 1;
+ os->header = os->seq;
+ os->segp = segp;
+ os->psize = psize;
+ ogg->headers = 1;
}else{
- os->pstart += os->psize;
- os->psize = 0;
+ os->pstart += os->psize;
+ os->psize = 0;
}
}
static int
ogg_get_headers (AVFormatContext * s)
{
- ogg_t *ogg = s->priv_data;
+ struct ogg *ogg = s->priv_data;
do{
if (ogg_packet (s, NULL, NULL, NULL) < 0)
static uint64_t
ogg_gptopts (AVFormatContext * s, int i, uint64_t gp)
{
- ogg_t *ogg = s->priv_data;
- ogg_stream_t *os = ogg->streams + i;
+ struct ogg *ogg = s->priv_data;
+ struct ogg_stream *os = ogg->streams + i;
uint64_t pts = AV_NOPTS_VALUE;
if(os->codec->gptopts){
static int
ogg_get_length (AVFormatContext * s)
{
- ogg_t *ogg = s->priv_data;
+ struct ogg *ogg = s->priv_data;
int idx = -1, i;
- offset_t size, end;
+ int64_t size, end;
if(url_is_streamed(s->pb))
return 0;
size = url_fsize(s->pb);
if(size < 0)
return 0;
- end = size > MAX_PAGE_SIZE? size - MAX_PAGE_SIZE: size;
+ end = size > MAX_PAGE_SIZE? size - MAX_PAGE_SIZE: 0;
ogg_save (s);
url_fseek (s->pb, end, SEEK_SET);
ogg->size = size;
ogg_restore (s, 0);
- ogg_save (s);
- while (!ogg_read_page (s, &i)) {
- if (i == idx && ogg->streams[i].granule != -1 && ogg->streams[i].granule != 0)
- break;
- }
- if (i == idx) {
- s->streams[idx]->start_time = ogg_gptopts (s, idx, ogg->streams[idx].granule);
- s->streams[idx]->duration -= s->streams[idx]->start_time;
- }
- ogg_restore (s, 0);
return 0;
}
static int
ogg_read_header (AVFormatContext * s, AVFormatParameters * ap)
{
- ogg_t *ogg = s->priv_data;
+ struct ogg *ogg = s->priv_data;
ogg->curidx = -1;
//linear headers seek from start
if (ogg_get_headers (s) < 0){
- return -1;
+ return -1;
}
//linear granulepos seek from end
static int
ogg_read_packet (AVFormatContext * s, AVPacket * pkt)
{
- ogg_t *ogg;
- ogg_stream_t *os;
+ struct ogg *ogg;
+ struct ogg_stream *os;
int idx = -1;
int pstart, psize;
static int
ogg_read_close (AVFormatContext * s)
{
- ogg_t *ogg = s->priv_data;
+ struct ogg *ogg = s->priv_data;
int i;
for (i = 0; i < ogg->nstreams; i++){
ogg_read_timestamp (AVFormatContext * s, int stream_index, int64_t * pos_arg,
int64_t pos_limit)
{
- ogg_t *ogg = s->priv_data;
+ struct ogg *ogg = s->priv_data;
ByteIOContext *bc = s->pb;
int64_t pts = AV_NOPTS_VALUE;
int i;
AVInputFormat ogg_demuxer = {
"ogg",
NULL_IF_CONFIG_SMALL("Ogg"),
- sizeof (ogg_t),
+ sizeof (struct ogg),
ogg_probe,
ogg_read_header,
ogg_read_packet,