[MPlayer-cvslog] r33327 - trunk/libmpcodecs/ad_speex.c

reimar subversion at mplayerhq.hu
Mon Apr 25 11:48:11 CEST 2011


Author: reimar
Date: Mon Apr 25 11:48:11 2011
New Revision: 33327

Log:
Setup default speex modes, allows decoding of speex in flv which does not
contain a header packet.

Modified:
   trunk/libmpcodecs/ad_speex.c

Modified: trunk/libmpcodecs/ad_speex.c
==============================================================================
--- trunk/libmpcodecs/ad_speex.c	Mon Apr 25 11:28:38 2011	(r33326)
+++ trunk/libmpcodecs/ad_speex.c	Mon Apr 25 11:48:11 2011	(r33327)
@@ -63,11 +63,8 @@ static int init(sh_audio_t *sh) {
   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 @@ static int init(sh_audio_t *sh) {
     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 @@ static int init(sh_audio_t *sh) {
   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) {


More information about the MPlayer-cvslog mailing list