[Mplayer-cvslog] CVS: main/libmpcodecs ad_msadpcm.c,1.1,1.2

Mike Melanson melanson at mplayer.dev.hu
Tue Mar 26 05:41:46 CET 2002


Update of /cvsroot/mplayer/main/libmpcodecs
In directory mplayer:/var/tmp.root/cvs-serv2342/libmpcodecs

Modified Files:
	ad_msadpcm.c 
Log Message:
fixed so the decoder cooperates better with the rest of the system


Index: ad_msadpcm.c
===================================================================
RCS file: /cvsroot/mplayer/main/libmpcodecs/ad_msadpcm.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- ad_msadpcm.c	25 Mar 2002 21:06:01 -0000	1.1
+++ ad_msadpcm.c	26 Mar 2002 04:41:43 -0000	1.2
@@ -17,27 +17,35 @@
 
 LIBAD_EXTERN(msadpcm)
 
-#include "../adpcm.h"
+#define MS_ADPCM_PREAMBLE_SIZE 7
+
+static int preinit(sh_audio_t *sh_audio)
+{
+  sh_audio->audio_out_minsize = sh_audio->wf->nBlockAlign * 4;
+  sh_audio->ds->ss_div = 
+    (sh_audio->wf->nBlockAlign - MS_ADPCM_PREAMBLE_SIZE) * 2;
+  sh_audio->ds->ss_mul = sh_audio->wf->nBlockAlign;
+
+  return 1;
+}
 
 static int init(sh_audio_t *sh_audio)
 {
   sh_audio->channels=sh_audio->wf->nChannels;
   sh_audio->samplerate=sh_audio->wf->nSamplesPerSec;
   sh_audio->i_bps = sh_audio->wf->nBlockAlign *
-    (sh_audio->channels*sh_audio->samplerate) / MS_ADPCM_SAMPLES_PER_BLOCK;
-  return 1;
-}
+    (sh_audio->channels*sh_audio->samplerate) / sh_audio->ds->ss_div;
+
+  if ((sh_audio->a_in_buffer =
+    (unsigned char *)malloc(sh_audio->ds->ss_mul)) == NULL)
+    return 0;
 
-static int preinit(sh_audio_t *sh_audio)
-{
-  sh_audio->audio_out_minsize=sh_audio->wf->nBlockAlign * 8;
-  sh_audio->ds->ss_div = MS_ADPCM_SAMPLES_PER_BLOCK;
-  sh_audio->ds->ss_mul = sh_audio->wf->nBlockAlign;
   return 1;
 }
 
-static void uninit(sh_audio_t *sh)
+static void uninit(sh_audio_t *sh_audio)
 {
+  free(sh_audio->a_in_buffer);
 }
 
 static int control(sh_audio_t *sh,int cmd,void* arg, ...)
@@ -48,15 +56,12 @@
 
 static int decode_audio(sh_audio_t *sh_audio,unsigned char *buf,int minlen,int maxlen)
 {
-  static unsigned char *ibuf = NULL;	// FIXME!!! TODO!!! use sh->a_in_buffer!
-  if (!ibuf)
-   ibuf = (unsigned char *)malloc
-        (sh_audio->wf->nBlockAlign * sh_audio->wf->nChannels);
-  if (demux_read_data(sh_audio->ds, ibuf,
-      sh_audio->wf->nBlockAlign) != 
-      sh_audio->wf->nBlockAlign) 
+  if (demux_read_data(sh_audio->ds, sh_audio->a_in_buffer,
+      sh_audio->ds->ss_mul) != 
+      sh_audio->ds->ss_mul) 
          return -1; /* EOF */
+
   return 2 * ms_adpcm_decode_block(
-          (unsigned short*)buf,ibuf, sh_audio->wf->nChannels,
-          sh_audio->wf->nBlockAlign);
+          (unsigned short*)buf, sh_audio->a_in_buffer,
+          sh_audio->wf->nChannels, sh_audio->wf->nBlockAlign);
 }




More information about the MPlayer-cvslog mailing list