annotate libmpcodecs/ad_imaadpcm.c @ 11007:48b7d7aa444d

configure altivec patch by Magnus Damm <damm@opensource.se> * CC is not checked for Altivec support (see above). The patch adds checks for FSF-style flags and Darwin-style flags. The check is performed regardless of the gcc version. * Disabling of Altivec. --disable-altivec is broken today if /proc/cpuinfo shows that your cpu supports altivec. The patch takes care of that. * "GCC & CPU optimization abilities" always show that it is optimizing for the cpu configure is running on, it should show the optimization that is enabled for gcc instead. Cosmetic change only, but confusing as it is today IMHO. * Runtime CPU-detection now enables altivec for powerpc. Now with the patch it should be possible to use --enable-altivec, --disable-altivec, --enable-runtime-cpudetection regardless of powerpc cpu type. The configure script handles altivec support in the following order: 1. Altivec is enabled by default if your cpu supports it. 2. --enable-runtime-cpudetection will enable altivec support. 3. If you have forced altivec on/off with --enable-altivec/--disable-altivec, then your selection will override the previous altivec configuration. 4. If altivec is enabled but the compiler doesn't support it, altivec gets turned off.
author attila
date Sat, 04 Oct 2003 23:06:04 +0000
parents 9883dfced49c
children 9d0b052c4f74
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5408
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
1 /*
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
2 IMA ADPCM Decoder for MPlayer
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
3 by Mike Melanson
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
4
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
5 This file is in charge of decoding all of the various IMA ADPCM data
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
6 formats that various entities have created. Details about the data
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
7 formats can be found here:
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
8 http://www.pcisys.net/~melanson/codecs/
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
9
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
10 So far, this file handles these formats:
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
11 'ima4': IMA ADPCM found in QT files
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
12 0x11: IMA ADPCM found in MS AVI/ASF/WAV files
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
13 0x61: DK4 ADPCM found in certain AVI files on Sega Saturn CD-ROMs;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
14 note that this is a 'rogue' format number in that it was
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
15 never officially registered with Microsoft
8103
d2d2e01343ca ms\0x00\x11 support
alex
parents: 7180
diff changeset
16 0x1100736d: IMA ADPCM coded like in MS AVI/ASF/WAV found in QT files
5408
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
17 */
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
18
5340
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
19 #include <stdio.h>
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
20 #include <stdlib.h>
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
21 #include <unistd.h>
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
22
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
23 #include "config.h"
5408
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
24 #include "bswap.h"
5340
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
25 #include "ad_internal.h"
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
26
5408
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
27 #define MS_IMA_ADPCM_PREAMBLE_SIZE 4
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
28
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
29 #define QT_IMA_ADPCM_PREAMBLE_SIZE 2
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
30 #define QT_IMA_ADPCM_BLOCK_SIZE 0x22
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
31 #define QT_IMA_ADPCM_SAMPLES_PER_BLOCK 64
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
32
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
33 #define BE_16(x) (be2me_16(*(unsigned short *)(x)))
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
34 #define BE_32(x) (be2me_32(*(unsigned int *)(x)))
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
35 #define LE_16(x) (le2me_16(*(unsigned short *)(x)))
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
36 #define LE_32(x) (le2me_32(*(unsigned int *)(x)))
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
37
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
38 // pertinent tables for IMA ADPCM
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
39 static int adpcm_step[89] =
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
40 {
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
41 7, 8, 9, 10, 11, 12, 13, 14, 16, 17,
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
42 19, 21, 23, 25, 28, 31, 34, 37, 41, 45,
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
43 50, 55, 60, 66, 73, 80, 88, 97, 107, 118,
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
44 130, 143, 157, 173, 190, 209, 230, 253, 279, 307,
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
45 337, 371, 408, 449, 494, 544, 598, 658, 724, 796,
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
46 876, 963, 1060, 1166, 1282, 1411, 1552, 1707, 1878, 2066,
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
47 2272, 2499, 2749, 3024, 3327, 3660, 4026, 4428, 4871, 5358,
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
48 5894, 6484, 7132, 7845, 8630, 9493, 10442, 11487, 12635, 13899,
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
49 15289, 16818, 18500, 20350, 22385, 24623, 27086, 29794, 32767
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
50 };
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
51
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
52 static int adpcm_index[16] =
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
53 {
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
54 -1, -1, -1, -1, 2, 4, 6, 8,
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
55 -1, -1, -1, -1, 2, 4, 6, 8
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
56 };
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
57
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
58 // useful macros
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
59 // clamp a number between 0 and 88
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
60 #define CLAMP_0_TO_88(x) if (x < 0) x = 0; else if (x > 88) x = 88;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
61 // clamp a number within a signed 16-bit range
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
62 #define CLAMP_S16(x) if (x < -32768) x = -32768; \
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
63 else if (x > 32767) x = 32767;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
64 // clamp a number above 16
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
65 #define CLAMP_ABOVE_16(x) if (x < 16) x = 16;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
66 // sign extend a 16-bit value
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
67 #define SE_16BIT(x) if (x & 0x8000) x -= 0x10000;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
68 // sign extend a 4-bit value
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
69 #define SE_4BIT(x) if (x & 0x8) x -= 0x10;
5340
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
70
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
71 static ad_info_t info =
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
72 {
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
73 "IMA ADPCM audio decoder",
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
74 "imaadpcm",
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
75 "Nick Kurshev",
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
76 "Mike Melanson",
5408
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
77 ""
5340
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
78 };
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
79
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
80 LIBAD_EXTERN(imaadpcm)
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
81
5408
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
82 static int preinit(sh_audio_t *sh_audio)
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
83 {
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
84 // not exactly sure what this field is for
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
85 sh_audio->audio_out_minsize = 8192;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
86
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
87 // if format is "ima4", assume the audio is coming from a QT file which
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
88 // indicates constant block size, whereas an AVI/ASF/WAV file will fill
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
89 // in this field with 0x11
8103
d2d2e01343ca ms\0x00\x11 support
alex
parents: 7180
diff changeset
90 if ((sh_audio->format == 0x11) || (sh_audio->format == 0x61) ||
d2d2e01343ca ms\0x00\x11 support
alex
parents: 7180
diff changeset
91 (sh_audio->format == 0x1100736d))
5408
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
92 {
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
93 sh_audio->ds->ss_div = (sh_audio->wf->nBlockAlign -
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
94 (MS_IMA_ADPCM_PREAMBLE_SIZE * sh_audio->wf->nChannels)) * 2;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
95 sh_audio->ds->ss_mul = sh_audio->wf->nBlockAlign;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
96 }
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
97 else
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
98 {
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
99 sh_audio->ds->ss_div = QT_IMA_ADPCM_SAMPLES_PER_BLOCK;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
100 sh_audio->ds->ss_mul = QT_IMA_ADPCM_BLOCK_SIZE * sh_audio->wf->nChannels;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
101 }
5458
b3d1348b251f audio input buffer allocation/free cleanup
arpi
parents: 5408
diff changeset
102 sh_audio->audio_in_minsize=sh_audio->ds->ss_mul;
5408
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
103 return 1;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
104 }
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
105
5340
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
106 static int init(sh_audio_t *sh_audio)
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
107 {
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
108 /* IMA-ADPCM 4:1 audio codec:*/
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
109 sh_audio->channels=sh_audio->wf->nChannels;
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
110 sh_audio->samplerate=sh_audio->wf->nSamplesPerSec;
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
111 /* decodes 34 byte -> 64 short*/
5408
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
112 sh_audio->i_bps =
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
113 (sh_audio->ds->ss_mul * sh_audio->samplerate) / sh_audio->ds->ss_div;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
114
5340
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
115 return 1;
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
116 }
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
117
5408
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
118 static void uninit(sh_audio_t *sh_audio)
5340
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
119 {
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
120 }
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
121
5481
8ae2bf330ad5 control() done
arpi
parents: 5458
diff changeset
122 static int control(sh_audio_t *sh_audio,int cmd,void* arg, ...)
5340
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
123 {
5481
8ae2bf330ad5 control() done
arpi
parents: 5458
diff changeset
124 if(cmd==ADCTRL_SKIP_FRAME){
8ae2bf330ad5 control() done
arpi
parents: 5458
diff changeset
125 demux_read_data(sh_audio->ds, sh_audio->a_in_buffer,sh_audio->ds->ss_mul);
8ae2bf330ad5 control() done
arpi
parents: 5458
diff changeset
126 return CONTROL_TRUE;
8ae2bf330ad5 control() done
arpi
parents: 5458
diff changeset
127 }
5340
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
128 return CONTROL_UNKNOWN;
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
129 }
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
130
5408
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
131 static void decode_nibbles(unsigned short *output,
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
132 int output_size, int channels,
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
133 int predictor_l, int index_l,
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
134 int predictor_r, int index_r)
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
135 {
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
136 int step[2];
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
137 int predictor[2];
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
138 int index[2];
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
139 int diff;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
140 int i;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
141 int sign;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
142 int delta;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
143 int channel_number = 0;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
144
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
145 step[0] = adpcm_step[index_l];
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
146 step[1] = adpcm_step[index_r];
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
147 predictor[0] = predictor_l;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
148 predictor[1] = predictor_r;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
149 index[0] = index_l;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
150 index[1] = index_r;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
151
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
152 for (i = 0; i < output_size; i++)
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
153 {
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
154 delta = output[i];
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
155
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
156 index[channel_number] += adpcm_index[delta];
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
157 CLAMP_0_TO_88(index[channel_number]);
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
158
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
159 sign = delta & 8;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
160 delta = delta & 7;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
161
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
162 diff = step[channel_number] >> 3;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
163 if (delta & 4) diff += step[channel_number];
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
164 if (delta & 2) diff += step[channel_number] >> 1;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
165 if (delta & 1) diff += step[channel_number] >> 2;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
166
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
167 if (sign)
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
168 predictor[channel_number] -= diff;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
169 else
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
170 predictor[channel_number] += diff;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
171
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
172 CLAMP_S16(predictor[channel_number]);
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
173 output[i] = predictor[channel_number];
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
174 step[channel_number] = adpcm_step[index[channel_number]];
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
175
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
176 // toggle channel
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
177 channel_number ^= channels - 1;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
178
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
179 }
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
180 }
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
181
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
182 static int qt_ima_adpcm_decode_block(unsigned short *output,
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
183 unsigned char *input, int channels)
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
184 {
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
185 int initial_predictor_l = 0;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
186 int initial_predictor_r = 0;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
187 int initial_index_l = 0;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
188 int initial_index_r = 0;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
189 int i;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
190
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
191 initial_predictor_l = BE_16(&input[0]);
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
192 initial_index_l = initial_predictor_l;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
193
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
194 // mask, sign-extend, and clamp the predictor portion
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
195 initial_predictor_l &= 0xFF80;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
196 SE_16BIT(initial_predictor_l);
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
197 CLAMP_S16(initial_predictor_l);
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
198
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
199 // mask and clamp the index portion
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
200 initial_index_l &= 0x7F;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
201 CLAMP_0_TO_88(initial_index_l);
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
202
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
203 // handle stereo
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
204 if (channels > 1)
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
205 {
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
206 initial_predictor_r = BE_16(&input[QT_IMA_ADPCM_BLOCK_SIZE]);
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
207 initial_index_r = initial_predictor_r;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
208
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
209 // mask, sign-extend, and clamp the predictor portion
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
210 initial_predictor_r &= 0xFF80;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
211 SE_16BIT(initial_predictor_r);
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
212 CLAMP_S16(initial_predictor_r);
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
213
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
214 // mask and clamp the index portion
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
215 initial_index_r &= 0x7F;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
216 CLAMP_0_TO_88(initial_index_r);
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
217 }
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
218
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
219 // break apart all of the nibbles in the block
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
220 if (channels == 1)
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
221 for (i = 0; i < QT_IMA_ADPCM_SAMPLES_PER_BLOCK / 2; i++)
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
222 {
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
223 output[i * 2 + 0] = input[2 + i] & 0x0F;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
224 output[i * 2 + 1] = input[2 + i] >> 4;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
225 }
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
226 else
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
227 for (i = 0; i < QT_IMA_ADPCM_SAMPLES_PER_BLOCK / 2 * 2; i++)
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
228 {
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
229 output[i * 4 + 0] = input[2 + i] & 0x0F;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
230 output[i * 4 + 1] = input[2 + QT_IMA_ADPCM_BLOCK_SIZE + i] & 0x0F;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
231 output[i * 4 + 2] = input[2 + i] >> 4;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
232 output[i * 4 + 3] = input[2 + QT_IMA_ADPCM_BLOCK_SIZE + i] >> 4;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
233 }
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
234
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
235 decode_nibbles(output,
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
236 QT_IMA_ADPCM_SAMPLES_PER_BLOCK * channels, channels,
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
237 initial_predictor_l, initial_index_l,
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
238 initial_predictor_r, initial_index_r);
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
239
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
240 return QT_IMA_ADPCM_SAMPLES_PER_BLOCK * channels;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
241 }
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
242
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
243 static int ms_ima_adpcm_decode_block(unsigned short *output,
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
244 unsigned char *input, int channels, int block_size)
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
245 {
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
246 int predictor_l = 0;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
247 int predictor_r = 0;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
248 int index_l = 0;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
249 int index_r = 0;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
250 int i;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
251 int channel_counter;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
252 int channel_index;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
253 int channel_index_l;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
254 int channel_index_r;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
255
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
256 predictor_l = LE_16(&input[0]);
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
257 SE_16BIT(predictor_l);
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
258 index_l = input[2];
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
259 if (channels == 2)
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
260 {
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
261 predictor_r = LE_16(&input[4]);
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
262 SE_16BIT(predictor_r);
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
263 index_r = input[6];
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
264 }
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
265
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
266 if (channels == 1)
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
267 for (i = 0;
10808
9883dfced49c 100l: you have 2 nibbles per byte, don't divide byte count by 2
rtognimp
parents: 8103
diff changeset
268 i < (block_size - MS_IMA_ADPCM_PREAMBLE_SIZE * channels); i++)
5408
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
269 {
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
270 output[i * 2 + 0] = input[MS_IMA_ADPCM_PREAMBLE_SIZE + i] & 0x0F;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
271 output[i * 2 + 1] = input[MS_IMA_ADPCM_PREAMBLE_SIZE + i] >> 4;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
272 }
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
273 else
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
274 {
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
275 // encoded as 8 nibbles (4 bytes) per channel; switch channel every
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
276 // 4th byte
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
277 channel_counter = 0;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
278 channel_index_l = 0;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
279 channel_index_r = 1;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
280 channel_index = channel_index_l;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
281 for (i = 0;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
282 i < (block_size - MS_IMA_ADPCM_PREAMBLE_SIZE * channels); i++)
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
283 {
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
284 output[channel_index + 0] =
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
285 input[MS_IMA_ADPCM_PREAMBLE_SIZE * 2 + i] & 0x0F;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
286 output[channel_index + 2] =
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
287 input[MS_IMA_ADPCM_PREAMBLE_SIZE * 2 + i] >> 4;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
288 channel_index += 4;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
289 channel_counter++;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
290 if (channel_counter == 4)
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
291 {
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
292 channel_index_l = channel_index;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
293 channel_index = channel_index_r;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
294 }
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
295 else if (channel_counter == 8)
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
296 {
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
297 channel_index_r = channel_index;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
298 channel_index = channel_index_l;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
299 channel_counter = 0;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
300 }
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
301 }
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
302 }
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
303
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
304 decode_nibbles(output,
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
305 (block_size - MS_IMA_ADPCM_PREAMBLE_SIZE * channels) * 2,
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
306 channels,
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
307 predictor_l, index_l,
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
308 predictor_r, index_r);
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
309
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
310 return (block_size - MS_IMA_ADPCM_PREAMBLE_SIZE * channels) * 2;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
311 }
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
312
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
313 static int dk4_ima_adpcm_decode_block(unsigned short *output,
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
314 unsigned char *input, int channels, int block_size)
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
315 {
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
316 int i;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
317 int output_ptr;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
318 int predictor_l = 0;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
319 int predictor_r = 0;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
320 int index_l = 0;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
321 int index_r = 0;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
322
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
323 // the first predictor value goes straight to the output
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
324 predictor_l = output[0] = LE_16(&input[0]);
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
325 SE_16BIT(predictor_l);
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
326 index_l = input[2];
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
327 if (channels == 2)
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
328 {
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
329 predictor_r = output[1] = LE_16(&input[4]);
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
330 SE_16BIT(predictor_r);
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
331 index_r = input[6];
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
332 }
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
333
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
334 output_ptr = channels;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
335 for (i = MS_IMA_ADPCM_PREAMBLE_SIZE * channels; i < block_size; i++)
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
336 {
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
337 output[output_ptr++] = input[i] >> 4;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
338 output[output_ptr++] = input[i] & 0x0F;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
339 }
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
340
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
341 decode_nibbles(&output[channels],
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
342 (block_size - MS_IMA_ADPCM_PREAMBLE_SIZE * channels) * 2 - channels,
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
343 channels,
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
344 predictor_l, index_l,
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
345 predictor_r, index_r);
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
346
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
347 return (block_size - MS_IMA_ADPCM_PREAMBLE_SIZE * channels) * 2 - channels;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
348 }
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
349
5340
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
350 static int decode_audio(sh_audio_t *sh_audio,unsigned char *buf,int minlen,int maxlen)
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
351 {
5408
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
352 if (demux_read_data(sh_audio->ds, sh_audio->a_in_buffer,
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
353 sh_audio->ds->ss_mul) !=
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
354 sh_audio->ds->ss_mul)
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
355 return -1;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
356
8103
d2d2e01343ca ms\0x00\x11 support
alex
parents: 7180
diff changeset
357 if ((sh_audio->format == 0x11) || (sh_audio->format == 0x1100736d))
5408
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
358 {
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
359 return 2 * ms_ima_adpcm_decode_block(
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
360 (unsigned short*)buf, sh_audio->a_in_buffer, sh_audio->wf->nChannels,
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
361 sh_audio->ds->ss_mul);
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
362 }
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
363 else if (sh_audio->format == 0x61)
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
364 {
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
365 return 2 * dk4_ima_adpcm_decode_block(
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
366 (unsigned short*)buf, sh_audio->a_in_buffer, sh_audio->wf->nChannels,
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
367 sh_audio->ds->ss_mul);
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
368 }
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
369 else
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
370 {
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
371 return 2 * qt_ima_adpcm_decode_block(
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
372 (unsigned short*)buf, sh_audio->a_in_buffer, sh_audio->wf->nChannels);
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
373 }
5340
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
374 }