annotate libmpcodecs/ad_dk3adpcm.c @ 5543:c75f75806af1

memcpy must return destination ptr patch by Adam <adam@cfar.umd.edu>
author michael
date Wed, 10 Apr 2002 05:23:13 +0000
parents 8ae2bf330ad5
children 28677d779205
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 DK3 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 responsible for decoding audio data encoded with
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
6 Duck Corp's DK3 ADPCM algorithm. Details about the data format
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
7 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
5340
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
11 #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
12 #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
13 #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
14
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
15 #include "config.h"
5408
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
16 #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
17 #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
18
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
19 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
20 {
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
21 "Duck DK3 ADPCM decoder",
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
22 "dk3adpcm",
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
23 AFM_DK3ADPCM,
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
24 "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
25 "Mike Melanson",
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
26 "This format number was used by Duck Corp. but not officially registered with Microsoft"
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
27 };
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
28
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
29 LIBAD_EXTERN(dk3adpcm)
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
30
5408
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
31 #define DK3_ADPCM_PREAMBLE_SIZE 16
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 LE_16(x) (le2me_16(*(unsigned short *)(x)))
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
34 #define LE_32(x) (le2me_32(*(unsigned int *)(x)))
5340
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
35
5408
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
36 // useful macros
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
37 // clamp a number between 0 and 88
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
38 #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
39 // clamp a number within a signed 16-bit range
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
40 #define CLAMP_S16(x) if (x < -32768) x = -32768; \
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
41 else if (x > 32767) x = 32767;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
42 // clamp a number above 16
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
43 #define CLAMP_ABOVE_16(x) if (x < 16) x = 16;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
44 // sign extend a 16-bit value
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
45 #define SE_16BIT(x) if (x & 0x8000) x -= 0x10000;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
46 // sign extend a 4-bit value
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
47 #define SE_4BIT(x) if (x & 0x8) x -= 0x10;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
48
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
49 // pertinent tables
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
50 static int adpcm_step[89] =
5340
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
51 {
5408
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
52 7, 8, 9, 10, 11, 12, 13, 14, 16, 17,
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
53 19, 21, 23, 25, 28, 31, 34, 37, 41, 45,
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
54 50, 55, 60, 66, 73, 80, 88, 97, 107, 118,
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
55 130, 143, 157, 173, 190, 209, 230, 253, 279, 307,
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
56 337, 371, 408, 449, 494, 544, 598, 658, 724, 796,
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
57 876, 963, 1060, 1166, 1282, 1411, 1552, 1707, 1878, 2066,
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
58 2272, 2499, 2749, 3024, 3327, 3660, 4026, 4428, 4871, 5358,
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
59 5894, 6484, 7132, 7845, 8630, 9493, 10442, 11487, 12635, 13899,
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
60 15289, 16818, 18500, 20350, 22385, 24623, 27086, 29794, 32767
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
61 };
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
62
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
63 static int adpcm_index[16] =
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
64 {
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
65 -1, -1, -1, -1, 2, 4, 6, 8,
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
66 -1, -1, -1, -1, 2, 4, 6, 8
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
67 };
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
68
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
69 static int preinit(sh_audio_t *sh_audio)
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
70 {
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
71 sh_audio->audio_out_minsize = sh_audio->wf->nBlockAlign * 6;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
72 sh_audio->ds->ss_div =
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
73 (sh_audio->wf->nBlockAlign - DK3_ADPCM_PREAMBLE_SIZE) * 8 / 3;
5458
b3d1348b251f audio input buffer allocation/free cleanup
arpi
parents: 5408
diff changeset
74 sh_audio->audio_in_minsize=
5408
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
75 sh_audio->ds->ss_mul = sh_audio->wf->nBlockAlign;
5340
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
76 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
77 }
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
78
5408
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
79 static int init(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
80 {
5408
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
81 sh_audio->channels = sh_audio->wf->nChannels;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
82 sh_audio->samplerate = sh_audio->wf->nSamplesPerSec;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
83 sh_audio->i_bps =
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
84 (sh_audio->ds->ss_mul * sh_audio->samplerate) / sh_audio->ds->ss_div;
5340
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
85 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
86 }
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
87
5408
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
88 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
89 {
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
90 }
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
91
5481
8ae2bf330ad5 control() done
arpi
parents: 5458
diff changeset
92 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
93 {
5481
8ae2bf330ad5 control() done
arpi
parents: 5458
diff changeset
94 if(cmd==ADCTRL_SKIP_FRAME){
8ae2bf330ad5 control() done
arpi
parents: 5458
diff changeset
95 demux_read_data(sh_audio->ds, sh_audio->a_in_buffer,sh_audio->ds->ss_mul);
8ae2bf330ad5 control() done
arpi
parents: 5458
diff changeset
96 return CONTROL_TRUE;
8ae2bf330ad5 control() done
arpi
parents: 5458
diff changeset
97 }
5340
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
98 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
99 }
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
100
5408
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
101 #define DK3_GET_NEXT_NIBBLE() \
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
102 if (decode_top_nibble_next) \
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
103 { \
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
104 nibble = (last_byte >> 4) & 0x0F; \
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
105 decode_top_nibble_next = 0; \
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
106 } \
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
107 else \
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
108 { \
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
109 last_byte = input[in_ptr++]; \
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
110 nibble = last_byte & 0x0F; \
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
111 decode_top_nibble_next = 1; \
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
112 }
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
113
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
114 // note: This decoder assumes the format 0x62 data always comes in
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
115 // stereo flavor
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
116 static int dk3_adpcm_decode_block(unsigned short *output, unsigned char *input,
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
117 int block_size)
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
118 {
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
119 int sum_pred;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
120 int diff_pred;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
121 int sum_index;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
122 int diff_index;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
123 int diff_channel;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
124 int in_ptr = 0x10;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
125 int out_ptr = 0;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
126
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
127 unsigned char last_byte = 0;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
128 unsigned char nibble;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
129 int decode_top_nibble_next = 0;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
130
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
131 // ADPCM work variables
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
132 int sign;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
133 int delta;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
134 int step;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
135 int diff;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
136
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
137 sum_pred = LE_16(&input[10]);
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
138 diff_pred = LE_16(&input[12]);
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
139 SE_16BIT(sum_pred);
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
140 SE_16BIT(diff_pred);
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
141 diff_channel = diff_pred;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
142 sum_index = input[14];
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
143 diff_index = input[15];
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
144
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
145 while (in_ptr < block_size)
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
146 // while (in_ptr < 2048)
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
147 {
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
148 // process the first predictor of the sum channel
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
149 DK3_GET_NEXT_NIBBLE();
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
150
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
151 step = adpcm_step[sum_index];
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
152
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
153 sign = nibble & 8;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
154 delta = nibble & 7;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
155
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
156 diff = step >> 3;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
157 if (delta & 4) diff += step;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
158 if (delta & 2) diff += step >> 1;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
159 if (delta & 1) diff += step >> 2;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
160
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
161 if (sign)
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
162 sum_pred -= diff;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
163 else
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
164 sum_pred += diff;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
165
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
166 CLAMP_S16(sum_pred);
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
167
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
168 sum_index += adpcm_index[nibble];
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
169 CLAMP_0_TO_88(sum_index);
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
170
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
171 // process the diff channel predictor
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
172 DK3_GET_NEXT_NIBBLE();
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
173
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
174 step = adpcm_step[diff_index];
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
175
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
176 sign = nibble & 8;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
177 delta = nibble & 7;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
178
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
179 diff = step >> 3;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
180 if (delta & 4) diff += step;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
181 if (delta & 2) diff += step >> 1;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
182 if (delta & 1) diff += step >> 2;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
183
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
184 if (sign)
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
185 diff_pred -= diff;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
186 else
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
187 diff_pred += diff;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
188
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
189 CLAMP_S16(diff_pred);
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
190
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
191 diff_index += adpcm_index[nibble];
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
192 CLAMP_0_TO_88(diff_index);
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
193
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
194 // output the first pair of stereo PCM samples
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
195 diff_channel = (diff_channel + diff_pred) / 2;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
196 output[out_ptr++] = sum_pred + diff_channel;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
197 output[out_ptr++] = sum_pred - diff_channel;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
198
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
199 // process the second predictor of the sum channel
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
200 DK3_GET_NEXT_NIBBLE();
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
201
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
202 step = adpcm_step[sum_index];
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
203
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
204 sign = nibble & 8;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
205 delta = nibble & 7;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
206
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
207 diff = step >> 3;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
208 if (delta & 4) diff += step;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
209 if (delta & 2) diff += step >> 1;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
210 if (delta & 1) diff += step >> 2;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
211
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
212 if (sign)
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
213 sum_pred -= diff;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
214 else
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
215 sum_pred += diff;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
216
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
217 CLAMP_S16(sum_pred);
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
218
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
219 sum_index += adpcm_index[nibble];
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
220 CLAMP_0_TO_88(sum_index);
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
221
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
222 // output the second pair of stereo PCM samples
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
223 output[out_ptr++] = sum_pred + diff_channel;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
224 output[out_ptr++] = sum_pred - diff_channel;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
225 }
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
226
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
227 return out_ptr;
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
228 }
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
229
5340
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
230 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
231 {
5408
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
232 if (demux_read_data(sh_audio->ds, sh_audio->a_in_buffer,
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
233 sh_audio->ds->ss_mul) !=
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
234 sh_audio->ds->ss_mul)
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
235 return -1; /* EOF */
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
236
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
237 return 2 * dk3_adpcm_decode_block(
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
238 (unsigned short*)buf, sh_audio->a_in_buffer,
f9cd6381e327 reworked ADPCM decoders; changes include:
melanson
parents: 5340
diff changeset
239 sh_audio->wf->nBlockAlign);
5340
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
240 }