summaryrefslogtreecommitdiffstats
path: root/libmpcodecs
diff options
context:
space:
mode:
authormelanson <melanson@b3059339-0415-0410-9bf9-f77b7e298cf2>2002-03-26 05:34:41 +0000
committermelanson <melanson@b3059339-0415-0410-9bf9-f77b7e298cf2>2002-03-26 05:34:41 +0000
commit37ef9b84ec471a77bd2529fffd3888ed926b11e0 (patch)
tree0233a83e0fdfed792173be73a7522acd9d5d0d0a /libmpcodecs
parent14639c9f421ca49aa7a383d88e5d04d4e3b6ffa1 (diff)
downloadmpv-37ef9b84ec471a77bd2529fffd3888ed926b11e0.tar.bz2
mpv-37ef9b84ec471a77bd2529fffd3888ed926b11e0.tar.xz
fixed up this audio decoder too
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@5354 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libmpcodecs')
-rw-r--r--libmpcodecs/ad_dk4adpcm.c49
1 files changed, 29 insertions, 20 deletions
diff --git a/libmpcodecs/ad_dk4adpcm.c b/libmpcodecs/ad_dk4adpcm.c
index c647f984fa..1c3a379644 100644
--- a/libmpcodecs/ad_dk4adpcm.c
+++ b/libmpcodecs/ad_dk4adpcm.c
@@ -11,32 +11,43 @@ static ad_info_t info =
"dk4adpcm",
AFM_DK4ADPCM,
"Nick Kurshev",
+ "Mike Melanson",
"This format number was used by Duck Corp. but not officially registered with Microsoft"
};
LIBAD_EXTERN(dk4adpcm)
-#include "adpcm.h"
+#define DK4_ADPCM_PREAMBLE_SIZE 4
+
+static int preinit(sh_audio_t *sh_audio)
+{
+ sh_audio->audio_out_minsize =
+ (((sh_audio->wf->nBlockAlign - DK4_ADPCM_PREAMBLE_SIZE) * 2) + 1) * 4;
+ sh_audio->ds->ss_div =
+ ((sh_audio->wf->nBlockAlign - DK4_ADPCM_PREAMBLE_SIZE) * 2) + 1;
+ 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) / DK4_ADPCM_SAMPLES_PER_BLOCK;
- return 1;
-}
+ (sh_audio->channels*sh_audio->samplerate) /
+ (((sh_audio->wf->nBlockAlign - DK4_ADPCM_PREAMBLE_SIZE) * 2) + 1);
+
+ 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=DK4_ADPCM_SAMPLES_PER_BLOCK * 4;
- sh_audio->ds->ss_div=DK4_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, ...)
@@ -47,14 +58,12 @@ static int control(sh_audio_t *sh,int cmd,void* arg, ...)
static int decode_audio(sh_audio_t *sh_audio,unsigned char *buf,int minlen,int maxlen)
{
- int len=-1;
- static unsigned char *ibuf = NULL;
- if (!ibuf)
- ibuf = (unsigned char *)malloc(sh_audio->wf->nBlockAlign);
- if (demux_read_data(sh_audio->ds, ibuf, sh_audio->wf->nBlockAlign) !=
- sh_audio->wf->nBlockAlign)
- return len; /* EOF */
- len=2*dk4_adpcm_decode_block((unsigned short*)buf,ibuf,
- sh_audio->wf->nChannels, sh_audio->wf->nBlockAlign);
- return len;
+ if (demux_read_data(sh_audio->ds, sh_audio->a_in_buffer,
+ sh_audio->wf->nBlockAlign) !=
+ sh_audio->wf->nBlockAlign)
+ return -1; /* EOF */
+
+ return 2 * dk4_adpcm_decode_block((unsigned short*)buf,
+ sh_audio->a_in_buffer,
+ sh_audio->wf->nChannels, sh_audio->wf->nBlockAlign);
}