changeset 33240:1ff13ad1bc59

Setup default speex modes, allows decoding of speex in flv which does not contain a header packet.
author reimar
date Mon, 25 Apr 2011 09:48:11 +0000
parents 6cb191a2cc1a
children a419ec5afc9e
files libmpcodecs/ad_speex.c
diffstat 1 files changed, 14 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/libmpcodecs/ad_speex.c	Mon Apr 25 09:28:38 2011 +0000
+++ b/libmpcodecs/ad_speex.c	Mon Apr 25 09:48:11 2011 +0000
@@ -63,11 +63,8 @@
   const uint8_t *hdr = (const uint8_t *)(sh->wf + 1);
   const SpeexMode *spx_mode;
   const SpeexStereoState st_st = SPEEX_STEREO_STATE_INIT; // hack
-  if (!sh->wf || sh->wf->cbSize < 80) {
-    mp_msg(MSGT_DECAUDIO, MSGL_FATAL, "Missing extradata!\n");
-    goto err_out;
-  }
-  ctx->hdr = speex_packet_to_header((char *)&sh->wf[1], sh->wf->cbSize);
+  if (sh->wf && sh->wf->cbSize >= 80)
+    ctx->hdr = speex_packet_to_header((char *)&sh->wf[1], sh->wf->cbSize);
   if (!ctx->hdr && sh->wf->cbSize == 0x72 && hdr[0] == 1 && hdr[1] == 0) {
     // speex.acm format: raw SpeexHeader dump
     ctx->hdr = calloc(1, sizeof(*ctx->hdr));
@@ -86,8 +83,18 @@
     ctx->hdr->frames_per_packet = read_le32(&hdr);
   }
   if (!ctx->hdr) {
-    mp_msg(MSGT_DECAUDIO, MSGL_FATAL, "Invalid extradata!\n");
-    goto err_out;
+    mp_msg(MSGT_DECAUDIO, MSGL_ERR, "Invalid or missing extradata! Assuming defaults.\n");
+    ctx->hdr = calloc(1, sizeof(*ctx->hdr));
+    ctx->hdr->frames_per_packet = 1;
+    ctx->hdr->mode = 0;
+    if (sh->wf) {
+      ctx->hdr->nb_channels = sh->wf->nChannels;
+      ctx->hdr->rate = sh->wf->nSamplesPerSec;
+      if (ctx->hdr->rate > 16000)
+        ctx->hdr->mode = 2;
+      else if (ctx->hdr->rate > 8000)
+        ctx->hdr->mode = 1;
+    }
   }
   if (ctx->hdr->nb_channels != 1 && ctx->hdr->nb_channels != 2) {
     mp_msg(MSGT_DECAUDIO, MSGL_WARN, "Invalid number of channels (%i), "
@@ -119,12 +126,6 @@
   sh->sample_format = AF_FORMAT_S16_NE;
   sh->context = ctx;
   return 1;
-
-err_out:
-  if (ctx)
-    free(ctx->hdr);
-  free(ctx);
-  return 0;
 }
 
 static void uninit(sh_audio_t *sh) {