**/
#include <stdlib.h>
+
#include "libavutil/bswap.h"
#include "libavutil/avstring.h"
-#include "libavcodec/get_bits.h"
+#include "libavutil/channel_layout.h"
+
#include "libavcodec/bytestream.h"
+
#include "avformat.h"
#include "internal.h"
#include "oggdec.h"
if (!spxp) {
spxp = av_mallocz(sizeof(*spxp));
+ if (!spxp)
+ return AVERROR(ENOMEM);
os->private = spxp;
}
if (spxp->seq == 0) {
int frames_per_packet;
- st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
- st->codec->codec_id = AV_CODEC_ID_SPEEX;
-
- st->codec->sample_rate = AV_RL32(p + 36);
- st->codec->channels = AV_RL32(p + 48);
+ st->codecpar->codec_type = AVMEDIA_TYPE_AUDIO;
+ st->codecpar->codec_id = AV_CODEC_ID_SPEEX;
+
+ st->codecpar->sample_rate = AV_RL32(p + 36);
+ st->codecpar->channels = AV_RL32(p + 48);
+ if (st->codecpar->channels < 1 || st->codecpar->channels > 2) {
+ av_log(s, AV_LOG_ERROR, "invalid channel count. Speex must be mono or stereo.\n");
+ return AVERROR_INVALIDDATA;
+ }
+ st->codecpar->channel_layout = st->codecpar->channels == 1 ? AV_CH_LAYOUT_MONO :
+ AV_CH_LAYOUT_STEREO;
spxp->packet_size = AV_RL32(p + 56);
frames_per_packet = AV_RL32(p + 64);
if (frames_per_packet)
spxp->packet_size *= frames_per_packet;
- st->codec->extradata_size = os->psize;
- st->codec->extradata = av_malloc(st->codec->extradata_size
- + FF_INPUT_BUFFER_PADDING_SIZE);
- memcpy(st->codec->extradata, p, st->codec->extradata_size);
+ st->codecpar->extradata_size = os->psize;
+ st->codecpar->extradata = av_malloc(st->codecpar->extradata_size
+ + AV_INPUT_BUFFER_PADDING_SIZE);
+ memcpy(st->codecpar->extradata, p, st->codecpar->extradata_size);
- avpriv_set_pts_info(st, 64, 1, st->codec->sample_rate);
+ avpriv_set_pts_info(st, 64, 1, st->codecpar->sample_rate);
} else
- ff_vorbis_comment(s, &st->metadata, p, os->psize);
+ ff_vorbis_stream_comment(s, st, p, os->psize);
spxp->seq++;
return 1;
.magic = "Speex ",
.magicsize = 8,
.header = speex_header,
- .packet = speex_packet
+ .packet = speex_packet,
+ .nb_header = 2,
};