39
42
LibSpeexContext *s = avctx->priv_data;
40
43
const SpeexMode *mode;
42
// defaults in the case of a missing header
43
if (avctx->sample_rate <= 8000)
44
mode = &speex_nb_mode;
45
else if (avctx->sample_rate <= 16000)
46
mode = &speex_wb_mode;
48
mode = &speex_uwb_mode;
50
if (avctx->extradata_size >= 80)
51
s->header = speex_packet_to_header(avctx->extradata, avctx->extradata_size);
44
SpeexHeader *header = NULL;
53
47
avctx->sample_fmt = AV_SAMPLE_FMT_S16;
55
avctx->sample_rate = s->header->rate;
56
avctx->channels = s->header->nb_channels;
57
avctx->frame_size = s->frame_size = s->header->frame_size;
58
if (s->header->frames_per_packet)
59
avctx->frame_size *= s->header->frames_per_packet;
61
mode = speex_lib_get_mode(s->header->mode);
63
av_log(avctx, AV_LOG_ERROR, "Unknown Speex mode %d", s->header->mode);
64
return AVERROR_INVALIDDATA;
48
if (avctx->extradata && avctx->extradata_size >= 80) {
49
header = speex_packet_to_header(avctx->extradata,
50
avctx->extradata_size);
52
av_log(avctx, AV_LOG_WARNING, "Invalid Speex header\n");
55
avctx->channels = header->nb_channels;
56
spx_mode = header->mode;
57
speex_header_free(header);
59
switch (avctx->sample_rate) {
60
case 8000: spx_mode = 0; break;
61
case 16000: spx_mode = 1; break;
62
case 32000: spx_mode = 2; break;
64
/* libspeex can handle any mode if initialized as ultra-wideband */
65
av_log(avctx, AV_LOG_WARNING, "Invalid sample rate: %d\n"
66
"Decoding as 32kHz ultra-wideband\n",
67
av_log(avctx, AV_LOG_INFO, "Missing Speex header, assuming defaults.\n");
69
if (avctx->channels > 2) {
70
av_log(avctx, AV_LOG_ERROR, "Only stereo and mono are supported.\n");
71
return AVERROR(EINVAL);
72
mode = speex_lib_get_mode(spx_mode);
74
av_log(avctx, AV_LOG_ERROR, "Unknown Speex mode %d", spx_mode);
75
return AVERROR_INVALIDDATA;
77
avctx->sample_rate = 8000 << spx_mode;
78
s->frame_size = 160 << spx_mode;
80
if (avctx->channels < 1 || avctx->channels > 2) {
81
/* libspeex can handle mono or stereo if initialized as stereo */
82
av_log(avctx, AV_LOG_ERROR, "Invalid channel count: %d.\n"
83
"Decoding as stereo.\n", avctx->channels);
86
avctx->channel_layout = avctx->channels == 2 ? AV_CH_LAYOUT_STEREO :
74
89
speex_bits_init(&s->bits);
75
90
s->dec_state = speex_decoder_init(mode);
109
120
/* get output buffer */
110
121
s->frame.nb_samples = s->frame_size;
111
if ((ret = avctx->get_buffer(avctx, &s->frame)) < 0) {
122
if ((ret = ff_get_buffer(avctx, &s->frame)) < 0) {
112
123
av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
115
126
output = (int16_t *)s->frame.data[0];
117
/* if there is not enough data left for the smallest possible frame,
118
reset the libspeex buffer using the current packet, otherwise ignore
119
the current packet and keep decoding frames from the libspeex buffer. */
120
if (speex_bits_remaining(&s->bits) < 43) {
128
/* if there is not enough data left for the smallest possible frame or the
129
next 5 bits are a terminator code, reset the libspeex buffer using the
130
current packet, otherwise ignore the current packet and keep decoding
131
frames from the libspeex buffer. */
132
if (speex_bits_remaining(&s->bits) < 5 ||
133
speex_bits_peek_unsigned(&s->bits, 5) == 0x1F) {
121
134
/* check for flush packet */
122
135
if (!buf || !buf_size) {
123
136
*got_frame_ptr = 0;
163
175
AVCodec ff_libspeex_decoder = {
164
176
.name = "libspeex",
165
177
.type = AVMEDIA_TYPE_AUDIO,
166
.id = CODEC_ID_SPEEX,
178
.id = AV_CODEC_ID_SPEEX,
167
179
.priv_data_size = sizeof(LibSpeexContext),
168
180
.init = libspeex_decode_init,
169
181
.close = libspeex_decode_close,
170
182
.decode = libspeex_decode_frame,
171
183
.flush = libspeex_decode_flush,
172
184
.capabilities = CODEC_CAP_SUBFRAMES | CODEC_CAP_DELAY | CODEC_CAP_DR1,
173
.long_name = NULL_IF_CONFIG_SMALL("libspeex Speex"),
185
.long_name = NULL_IF_CONFIG_SMALL("libspeex Speex"),