- if (s->header) {
- avctx->sample_rate = s->header->rate;
- avctx->channels = s->header->nb_channels;
- avctx->frame_size = s->frame_size = s->header->frame_size;
- if (s->header->frames_per_packet)
- avctx->frame_size *= s->header->frames_per_packet;
-
- mode = speex_lib_get_mode(s->header->mode);
- if (!mode) {
- av_log(avctx, AV_LOG_ERROR, "Unknown Speex mode %d", s->header->mode);
- return AVERROR_INVALIDDATA;
+ if (avctx->extradata && avctx->extradata_size >= 80) {
+ header = speex_packet_to_header(avctx->extradata,
+ avctx->extradata_size);
+ if (!header)
+ av_log(avctx, AV_LOG_WARNING, "Invalid Speex header\n");
+ }
+ if (header) {
+ avctx->channels = header->nb_channels;
+ spx_mode = header->mode;
+ speex_header_free(header);
+ } else {
+ switch (avctx->sample_rate) {
+ case 8000: spx_mode = 0; break;
+ case 16000: spx_mode = 1; break;
+ case 32000: spx_mode = 2; break;
+ default:
+ /* libspeex can handle any mode if initialized as ultra-wideband */
+ av_log(avctx, AV_LOG_WARNING, "Invalid sample rate: %d\n"
+ "Decoding as 32kHz ultra-wideband\n",
+ avctx->sample_rate);
+ spx_mode = 2;