Mercurial > libavformat.hg
changeset 5814:e993cab1faf3 libavformat
oggdec: Don't use ogg_stream's seq for vorbis or speex headers
author | conrad |
---|---|
date | Thu, 11 Mar 2010 07:17:46 +0000 |
parents | e6cd8ca154f5 |
children | 9e5e8c64ab54 |
files | oggparsespeex.c oggparsevorbis.c |
diffstat | 2 files changed, 18 insertions(+), 14 deletions(-) [+] |
line wrap: on
line diff
--- a/oggparsespeex.c Thu Mar 11 07:17:43 2010 +0000 +++ b/oggparsespeex.c Thu Mar 11 07:17:46 2010 +0000 @@ -32,18 +32,25 @@ struct speex_params { int final_packet_duration; + int seq; }; static int speex_header(AVFormatContext *s, int idx) { struct ogg *ogg = s->priv_data; struct ogg_stream *os = ogg->streams + idx; + struct speex_params *spxp = os->private; AVStream *st = s->streams[idx]; uint8_t *p = os->buf + os->pstart; - if (os->seq > 1) + if (!spxp) { + spxp = av_mallocz(sizeof(*spxp)); + os->private = spxp; + } + + if (spxp->seq > 1) return 0; - if (os->seq == 0) { + if (spxp->seq == 0) { int frames_per_packet; st->codec->codec_type = CODEC_TYPE_AUDIO; st->codec->codec_id = CODEC_ID_SPEEX; @@ -70,6 +77,7 @@ } else vorbis_comment(s, p, os->psize); + spxp->seq++; return 1; } @@ -90,11 +98,6 @@ struct speex_params *spxp = os->private; int packet_size = s->streams[idx]->codec->frame_size; - if (!spxp) { - spxp = av_mallocz(sizeof(*spxp)); - os->private = spxp; - } - if (os->flags & OGG_FLAG_EOS && os->lastpts != AV_NOPTS_VALUE && os->granule > 0) { /* first packet of final page. we have to calculate the final packet
--- a/oggparsevorbis.c Thu Mar 11 07:17:43 2010 +0000 +++ b/oggparsevorbis.c Thu Mar 11 07:17:46 2010 +0000 @@ -166,23 +166,24 @@ struct ogg_stream *os = ogg->streams + idx; AVStream *st = s->streams[idx]; struct oggvorbis_private *priv; + int pkt_type = os->buf[os->pstart]; - if (os->seq > 2) + if (!(pkt_type & 1)) return 0; - if (os->seq == 0) { + if (!os->private) { os->private = av_mallocz(sizeof(struct oggvorbis_private)); if (!os->private) return 0; } - if (os->psize < 1) + if (os->psize < 1 || pkt_type > 5) return -1; priv = os->private; - priv->len[os->seq] = os->psize; - priv->packet[os->seq] = av_mallocz(os->psize); - memcpy(priv->packet[os->seq], os->buf + os->pstart, os->psize); + priv->len[pkt_type >> 1] = os->psize; + priv->packet[pkt_type >> 1] = av_mallocz(os->psize); + memcpy(priv->packet[pkt_type >> 1], os->buf + os->pstart, os->psize); if (os->buf[os->pstart] == 1) { const uint8_t *p = os->buf + os->pstart + 7; /* skip "\001vorbis" tag */ unsigned blocksize, bs0, bs1; @@ -224,7 +225,7 @@ fixup_vorbis_headers(s, priv, &st->codec->extradata); } - return os->seq < 3; + return 1; } const struct ogg_codec ff_vorbis_codec = {