&ff_theora_codec,
&ff_flac_codec,
&ff_celt_codec,
+ &ff_opus_codec,
+ &ff_vp8_codec,
&ff_old_dirac_codec,
&ff_old_flac_codec,
&ff_ogm_video_codec,
struct ogg_state *ost =
av_malloc(sizeof(*ost) + (ogg->nstreams - 1) * sizeof(*ogg->streams));
int i;
+ if (!ost)
+ return AVERROR(ENOMEM);
ost->pos = avio_tell(s->pb);
ost->curidx = ogg->curidx;
ost->next = ogg->state;
for (i = 0; i < ogg->nstreams; i++) {
struct ogg_stream *os = ogg->streams + i;
- os->buf = av_mallocz(os->bufsize + FF_INPUT_BUFFER_PADDING_SIZE);
+ os->buf = av_mallocz(os->bufsize + AV_INPUT_BUFFER_PADDING_SIZE);
memcpy(os->buf, ost->streams[i].buf, os->bufpos);
}
struct ogg *ogg = s->priv_data;
AVIOContext *bc = s->pb;
struct ogg_state *ost = ogg->state;
- int i;
+ int i, err;
if (!ost)
return 0;
ogg->state = ost->next;
if (!discard) {
- struct ogg_stream *old_streams = ogg->streams;
for (i = 0; i < ogg->nstreams; i++)
av_free(ogg->streams[i].buf);
avio_seek(bc, ost->pos, SEEK_SET);
ogg->curidx = ost->curidx;
ogg->nstreams = ost->nstreams;
- ogg->streams = av_realloc(ogg->streams,
- ogg->nstreams * sizeof(*ogg->streams));
-
- if (ogg->streams) {
+ if ((err = av_reallocp_array(&ogg->streams, ogg->nstreams,
+ sizeof(*ogg->streams))) < 0) {
+ ogg->nstreams = 0;
+ return err;
+ } else
memcpy(ogg->streams, ost->streams,
ost->nstreams * sizeof(*ogg->streams));
- } else {
- av_free(old_streams);
- ogg->nstreams = 0;
- }
}
av_free(ost);
os = ogg->streams + idx;
os->serial = serial;
os->bufsize = DECODER_BUFFER_SIZE;
- os->buf = av_malloc(os->bufsize + FF_INPUT_BUFFER_PADDING_SIZE);
+ os->buf = av_malloc(os->bufsize + AV_INPUT_BUFFER_PADDING_SIZE);
os->header = -1;
os->start_granule = OGG_NOGRANULE_VALUE;
static int ogg_new_buf(struct ogg *ogg, int idx)
{
struct ogg_stream *os = ogg->streams + idx;
- uint8_t *nb = av_malloc(os->bufsize + FF_INPUT_BUFFER_PADDING_SIZE);
+ uint8_t *nb = av_malloc(os->bufsize + AV_INPUT_BUFFER_PADDING_SIZE);
int size = os->bufpos - os->pstart;
+ if (!nb)
+ return AVERROR(ENOMEM);
+
if (os->buf) {
memcpy(nb, os->buf + os->pstart, size);
av_free(os->buf);
os = ogg->streams + idx;
os->page_pos = avio_tell(bc) - 27;
- if (os->psize > 0)
- ogg_new_buf(ogg, idx);
+ if (os->psize > 0) {
+ ret = ogg_new_buf(ogg, idx);
+ if (ret < 0)
+ return ret;
+ }
ret = avio_read(bc, os->segments, nsegs);
if (ret < nsegs)
}
if (os->bufsize - os->bufpos < size) {
- uint8_t *nb = av_malloc((os->bufsize *= 2) + FF_INPUT_BUFFER_PADDING_SIZE);
+ uint8_t *nb = av_malloc((os->bufsize *= 2) + AV_INPUT_BUFFER_PADDING_SIZE);
if (!nb)
return AVERROR(ENOMEM);
memcpy(nb, os->buf, os->bufpos);
os->granule = gp;
os->flags = flags;
- memset(os->buf + os->bufpos, 0, FF_INPUT_BUFFER_PADDING_SIZE);
+ memset(os->buf + os->bufpos, 0, AV_INPUT_BUFFER_PADDING_SIZE);
if (str)
*str = idx;
int complete = 0;
int segp = 0, psize = 0;
- av_dlog(s, "ogg_packet: curidx=%i\n", ogg->curidx);
+ av_log(s, AV_LOG_TRACE, "ogg_packet: curidx=%i\n", ogg->curidx);
do {
idx = ogg->curidx;
os = ogg->streams + idx;
- av_dlog(s, "ogg_packet: idx=%d pstart=%d psize=%d segp=%d nsegs=%d\n",
+ av_log(s, AV_LOG_TRACE, "ogg_packet: idx=%d pstart=%d psize=%d segp=%d nsegs=%d\n",
idx, os->pstart, os->psize, os->segp, os->nsegs);
if (!os->codec) {
}
} while (!complete);
- av_dlog(s, "ogg_packet: idx %i, frame size %i, start %i\n",
+ av_log(s, AV_LOG_TRACE, "ogg_packet: idx %i, frame size %i, start %i\n",
idx, os->psize, os->pstart);
if (os->granule == -1)
// Update the header state for all streams and
// compute the data_offset.
- if (!s->data_offset)
- s->data_offset = os->sync_pos;
+ if (!s->internal->data_offset)
+ s->internal->data_offset = os->sync_pos;
for (i = 0; i < ogg->nstreams; i++) {
struct ogg_stream *cur_os = ogg->streams + i;
// if we have a partial non-header packet, its start is
// obviously at or after the data start
if (cur_os->incomplete)
- s->data_offset = FFMIN(s->data_offset, cur_os->sync_pos);
+ s->internal->data_offset = FFMIN(s->internal->data_offset, cur_os->sync_pos);
}
} else {
os->nb_header++;
os->lastpts = s->streams[i]->start_time =
ogg_gptopts(s, i, os->start_granule, NULL);
}
- av_dlog(s, "found headers\n");
+ av_log(s, AV_LOG_TRACE, "found headers\n");
return 0;
}
static int ogg_get_length(AVFormatContext *s)
{
struct ogg *ogg = s->priv_data;
- int i;
+ int i, ret;
int64_t size, end;
- if (!s->pb->seekable)
+ if (!(s->pb->seekable & AVIO_SEEKABLE_NORMAL))
return 0;
// already set
return 0;
end = size > MAX_PAGE_SIZE ? size - MAX_PAGE_SIZE : 0;
- ogg_save(s);
+ ret = ogg_save(s);
+ if (ret < 0)
+ return ret;
avio_seek(s->pb, end, SEEK_SET);
while (!ogg_read_page(s, &i)) {
ogg->streams[i].codec = NULL;
//linear granulepos seek from end
- ogg_get_length(s);
+ ret = ogg_get_length(s);
+ if (ret < 0) {
+ ogg_read_close(s);
+ return ret;
+ }
//fill the extradata in the per codec callbacks
return 0;
// Try seeking to a keyframe first. If this fails (very possible),
// av_seek_frame will fall back to ignoring keyframes
- if (s->streams[stream_index]->codec->codec_type == AVMEDIA_TYPE_VIDEO
+ if (s->streams[stream_index]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO
&& !(flags & AVSEEK_FLAG_ANY))
os->keyframe_seek = 1;