comparison oggparsevorbis.c @ 2597:eb7808a9d361 libavformat

check values more thoroughly in vorbis_header()
author mru
date Wed, 10 Oct 2007 22:59:36 +0000
parents 9e91148f1d44
children a004bd730f70
comparison
equal deleted inserted replaced
2596:9e91148f1d44 2597:eb7808a9d361
181 priv = os->private; 181 priv = os->private;
182 priv->len[os->seq] = os->psize; 182 priv->len[os->seq] = os->psize;
183 priv->packet[os->seq] = av_mallocz(os->psize); 183 priv->packet[os->seq] = av_mallocz(os->psize);
184 memcpy(priv->packet[os->seq], os->buf + os->pstart, os->psize); 184 memcpy(priv->packet[os->seq], os->buf + os->pstart, os->psize);
185 if (os->buf[os->pstart] == 1) { 185 if (os->buf[os->pstart] == 1) {
186 uint8_t *p = os->buf + os->pstart + 11; //skip up to the audio channels 186 uint8_t *p = os->buf + os->pstart + 7; /* skip "\001vorbis" tag */
187 unsigned blocksize, bs0, bs1;
187 188
188 if (os->psize != 30) 189 if (os->psize != 30)
190 return -1;
191
192 if (bytestream_get_le32(&p) != 0) /* vorbis_version */
189 return -1; 193 return -1;
190 194
191 st->codec->channels = bytestream_get_byte(&p); 195 st->codec->channels = bytestream_get_byte(&p);
192 st->codec->sample_rate = bytestream_get_le32(&p); 196 st->codec->sample_rate = bytestream_get_le32(&p);
193 p += 4; // skip maximum bitrate 197 p += 4; // skip maximum bitrate
194 st->codec->bit_rate = bytestream_get_le32(&p); // nominal bitrate 198 st->codec->bit_rate = bytestream_get_le32(&p); // nominal bitrate
199 p += 4; // skip minimum bitrate
200
201 blocksize = bytestream_get_byte(&p);
202 bs0 = blocksize & 15;
203 bs1 = blocksize >> 4;
204
205 if (bs0 > bs1)
206 return -1;
207 if (bs0 < 6 || bs1 > 13)
208 return -1;
209
210 if (bytestream_get_byte(&p) != 1) /* framing_flag */
211 return -1;
195 212
196 st->codec->codec_type = CODEC_TYPE_AUDIO; 213 st->codec->codec_type = CODEC_TYPE_AUDIO;
197 st->codec->codec_id = CODEC_ID_VORBIS; 214 st->codec->codec_id = CODEC_ID_VORBIS;
198 215
199 st->time_base.num = 1; 216 st->time_base.num = 1;