Module: libav
Branch: master
Commit: 3b061c5e10f78caaf3b2a45cf7a92e50d4d20bfb

Author:    Justin Ruggles <[email protected]>
Committer: Justin Ruggles <[email protected]>
Date:      Sun Sep 30 21:45:24 2012 -0400

libspeexdec: improve setting of Speex mode and sample rate

If there is no extradata and the sample rate given by the user is not valid,
decode as ultra-wideband.

---

 libavcodec/libspeexdec.c |   37 +++++++++++++++++++++----------------
 1 files changed, 21 insertions(+), 16 deletions(-)

diff --git a/libavcodec/libspeexdec.c b/libavcodec/libspeexdec.c
index a63d394..390d4de 100644
--- a/libavcodec/libspeexdec.c
+++ b/libavcodec/libspeexdec.c
@@ -39,31 +39,36 @@ static av_cold int libspeex_decode_init(AVCodecContext 
*avctx)
 {
     LibSpeexContext *s = avctx->priv_data;
     const SpeexMode *mode;
-
-    // defaults in the case of a missing header
-    if (avctx->sample_rate <= 8000)
-        mode = &speex_nb_mode;
-    else if (avctx->sample_rate <= 16000)
-        mode = &speex_wb_mode;
-    else
-        mode = &speex_uwb_mode;
+    int spx_mode;
 
     if (avctx->extradata_size >= 80)
         s->header = speex_packet_to_header(avctx->extradata, 
avctx->extradata_size);
 
     avctx->sample_fmt = AV_SAMPLE_FMT_S16;
     if (s->header) {
-        avctx->sample_rate = s->header->rate;
         avctx->channels    = s->header->nb_channels;
         s->frame_size      = s->header->frame_size;
-
-        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;
+        spx_mode           = s->header->mode;
+    } 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;
         }
-    } else
-        av_log(avctx, AV_LOG_INFO, "Missing Speex header, assuming 
defaults.\n");
+    }
+
+    mode = speex_lib_get_mode(spx_mode);
+    if (!mode) {
+        av_log(avctx, AV_LOG_ERROR, "Unknown Speex mode %d", spx_mode);
+        return AVERROR_INVALIDDATA;
+    }
+    avctx->sample_rate = 8000 << spx_mode;
 
     if (avctx->channels > 2) {
         av_log(avctx, AV_LOG_ERROR, "Only stereo and mono are supported.\n");

_______________________________________________
libav-commits mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-commits

Reply via email to