Mercurial > libavcodec.hg
annotate adx.c @ 2497:69adfbbdcdeb libavcodec
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
which isn't the advanced one; and indeed, using adv. profile parser fails.
Using normal parser works, and that's what is done
- attempt at taking care of stride for NORM2 bitplane decoding
- duplication of much code from msmpeg4.c; this code isn't yet used, but
goes down as far as the block layer (mainly Transform Type stuff, the
remains are wild editing without checking). Unusable yet, and lacks the AC
decoding (but a step further in bitstream parsing)
patch by anonymous
author | michael |
---|---|
date | Fri, 04 Feb 2005 02:20:38 +0000 |
parents | 932d306bf1dc |
children | e25782262d7d |
rev | line source |
---|---|
1531
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
1 /* |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
2 * ADX ADPCM codecs |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
3 * Copyright (c) 2001,2003 BERO |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
4 * |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
5 * This library is free software; you can redistribute it and/or |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
6 * modify it under the terms of the GNU Lesser General Public |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
7 * License as published by the Free Software Foundation; either |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
8 * version 2 of the License, or (at your option) any later version. |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
9 * |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
10 * This library is distributed in the hope that it will be useful, |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
13 * Lesser General Public License for more details. |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
14 * |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
15 * You should have received a copy of the GNU Lesser General Public |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
16 * License along with this library; if not, write to the Free Software |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
18 */ |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
19 #include "avcodec.h" |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
20 |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
21 /** |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
22 * @file adx.c |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
23 * SEGA CRI adx codecs. |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
24 * |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
25 * Reference documents: |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
26 * http://ku-www.ss.titech.ac.jp/~yatsushi/adx.html |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
27 * adx2wav & wav2adx http://www.geocities.co.jp/Playtown/2004/ |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
28 */ |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
29 |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
30 typedef struct { |
1534
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
31 int s1,s2; |
1531
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
32 } PREV; |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
33 |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
34 typedef struct { |
1534
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
35 PREV prev[2]; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
36 int header_parsed; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
37 unsigned char dec_temp[18*2]; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
38 unsigned short enc_temp[32*2]; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
39 int in_temp; |
1531
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
40 } ADXContext; |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
41 |
1534
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
42 //#define BASEVOL 0x11e0 |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
43 #define BASEVOL 0x4000 |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
44 #define SCALE1 0x7298 |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
45 #define SCALE2 0x3350 |
1531
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
46 |
1534
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
47 #define CLIP(s) if (s>32767) s=32767; else if (s<-32768) s=-32768 |
1531
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
48 |
1534
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
49 /* 18 bytes <-> 32 samples */ |
1531
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
50 |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
51 #ifdef CONFIG_ENCODERS |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
52 static void adx_encode(unsigned char *adx,const short *wav,PREV *prev) |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
53 { |
1534
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
54 int scale; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
55 int i; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
56 int s0,s1,s2,d; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
57 int max=0; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
58 int min=0; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
59 int data[32]; |
1531
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
60 |
1534
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
61 s1 = prev->s1; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
62 s2 = prev->s2; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
63 for(i=0;i<32;i++) { |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
64 s0 = wav[i]; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
65 d = ((s0<<14) - SCALE1*s1 + SCALE2*s2)/BASEVOL; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
66 data[i]=d; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
67 if (max<d) max=d; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
68 if (min>d) min=d; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
69 s2 = s1; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
70 s1 = s0; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
71 } |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
72 prev->s1 = s1; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
73 prev->s2 = s2; |
1531
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
74 |
1534
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
75 /* -8..+7 */ |
1531
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
76 |
1534
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
77 if (max==0 && min==0) { |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
78 memset(adx,0,18); |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
79 return; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
80 } |
1531
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
81 |
1534
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
82 if (max/7>-min/8) scale = max/7; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
83 else scale = -min/8; |
1531
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
84 |
1534
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
85 if (scale==0) scale=1; |
1531
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
86 |
1534
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
87 adx[0] = scale>>8; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
88 adx[1] = scale; |
1531
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
89 |
1534
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
90 for(i=0;i<16;i++) { |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
91 adx[i+2] = ((data[i*2]/scale)<<4) | ((data[i*2+1]/scale)&0xf); |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
92 } |
1531
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
93 } |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
94 #endif //CONFIG_ENCODERS |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
95 |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
96 static void adx_decode(short *out,const unsigned char *in,PREV *prev) |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
97 { |
1534
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
98 int scale = ((in[0]<<8)|(in[1])); |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
99 int i; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
100 int s0,s1,s2,d; |
1531
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
101 |
1534
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
102 // printf("%x ",scale); |
1531
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
103 |
1534
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
104 in+=2; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
105 s1 = prev->s1; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
106 s2 = prev->s2; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
107 for(i=0;i<16;i++) { |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
108 d = in[i]; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
109 // d>>=4; if (d&8) d-=16; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
110 d = ((signed char)d >> 4); |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
111 s0 = (BASEVOL*d*scale + SCALE1*s1 - SCALE2*s2)>>14; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
112 CLIP(s0); |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
113 *out++=s0; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
114 s2 = s1; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
115 s1 = s0; |
1531
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
116 |
1534
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
117 d = in[i]; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
118 //d&=15; if (d&8) d-=16; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
119 d = ((signed char)(d<<4) >> 4); |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
120 s0 = (BASEVOL*d*scale + SCALE1*s1 - SCALE2*s2)>>14; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
121 CLIP(s0); |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
122 *out++=s0; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
123 s2 = s1; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
124 s1 = s0; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
125 } |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
126 prev->s1 = s1; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
127 prev->s2 = s2; |
1531
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
128 |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
129 } |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
130 |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
131 static void adx_decode_stereo(short *out,const unsigned char *in,PREV *prev) |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
132 { |
1534
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
133 short tmp[32*2]; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
134 int i; |
1531
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
135 |
1534
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
136 adx_decode(tmp ,in ,prev); |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
137 adx_decode(tmp+32,in+18,prev+1); |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
138 for(i=0;i<32;i++) { |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
139 out[i*2] = tmp[i]; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
140 out[i*2+1] = tmp[i+32]; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
141 } |
1531
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
142 } |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
143 |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
144 #ifdef CONFIG_ENCODERS |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
145 |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
146 static void write_long(unsigned char *p,uint32_t v) |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
147 { |
1534
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
148 p[0] = v>>24; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
149 p[1] = v>>16; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
150 p[2] = v>>8; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
151 p[3] = v; |
1531
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
152 } |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
153 |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
154 static int adx_encode_header(AVCodecContext *avctx,unsigned char *buf,size_t bufsize) |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
155 { |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
156 #if 0 |
1534
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
157 struct { |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
158 uint32_t offset; /* 0x80000000 + sample start - 4 */ |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
159 unsigned char unknown1[3]; /* 03 12 04 */ |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
160 unsigned char channel; /* 1 or 2 */ |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
161 uint32_t freq; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
162 uint32_t size; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
163 uint32_t unknown2; /* 01 f4 03 00 */ |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
164 uint32_t unknown3; /* 00 00 00 00 */ |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
165 uint32_t unknown4; /* 00 00 00 00 */ |
1531
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
166 |
1534
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
167 /* if loop |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
168 unknown3 00 15 00 01 |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
169 unknown4 00 00 00 01 |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
170 long loop_start_sample; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
171 long loop_start_byte; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
172 long loop_end_sample; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
173 long loop_end_byte; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
174 long |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
175 */ |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
176 } adxhdr; /* big endian */ |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
177 /* offset-6 "(c)CRI" */ |
1531
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
178 #endif |
1534
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
179 write_long(buf+0x00,0x80000000|0x20); |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
180 write_long(buf+0x04,0x03120400|avctx->channels); |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
181 write_long(buf+0x08,avctx->sample_rate); |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
182 write_long(buf+0x0c,0); /* FIXME: set after */ |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
183 write_long(buf+0x10,0x01040300); |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
184 write_long(buf+0x14,0x00000000); |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
185 write_long(buf+0x18,0x00000000); |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
186 memcpy(buf+0x1c,"\0\0(c)CRI",8); |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
187 return 0x20+4; |
1531
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
188 } |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
189 |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
190 static int adx_decode_init(AVCodecContext *avctx); |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
191 static int adx_encode_init(AVCodecContext *avctx) |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
192 { |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
193 if (avctx->channels > 2) |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
194 return -1; /* only stereo or mono =) */ |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
195 avctx->frame_size = 32; |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
196 |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
197 avctx->coded_frame= avcodec_alloc_frame(); |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
198 avctx->coded_frame->key_frame= 1; |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
199 |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
200 // avctx->bit_rate = avctx->sample_rate*avctx->channels*18*8/32; |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
201 |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1569
diff
changeset
|
202 av_log(avctx, AV_LOG_DEBUG, "adx encode init\n"); |
1531
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
203 adx_decode_init(avctx); |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
204 |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
205 return 0; |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
206 } |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
207 |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
208 static int adx_encode_close(AVCodecContext *avctx) |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
209 { |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
210 av_freep(&avctx->coded_frame); |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
211 |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
212 return 0; |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
213 } |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
214 |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
215 static int adx_encode_frame(AVCodecContext *avctx, |
1569
1f8d1e1173d8
Fixes GCC 3.3.2 warnings patch by (Panagiotis Issaris <takis at lumumba dot luc dot ac dot be>)
michael
parents:
1534
diff
changeset
|
216 uint8_t *frame, int buf_size, void *data) |
1531
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
217 { |
1534
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
218 ADXContext *c = avctx->priv_data; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
219 const short *samples = data; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
220 unsigned char *dst = frame; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
221 int rest = avctx->frame_size; |
1531
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
222 |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
223 /* |
1534
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
224 input data size = |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
225 ffmpeg.c: do_audio_out() |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
226 frame_bytes = enc->frame_size * 2 * enc->channels; |
1531
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
227 */ |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
228 |
1534
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
229 // printf("sz=%d ",buf_size); fflush(stdout); |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
230 if (!c->header_parsed) { |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
231 int hdrsize = adx_encode_header(avctx,dst,buf_size); |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
232 dst+=hdrsize; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
233 c->header_parsed = 1; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
234 } |
1531
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
235 |
1534
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
236 if (avctx->channels==1) { |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
237 while(rest>=32) { |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
238 adx_encode(dst,samples,c->prev); |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
239 dst+=18; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
240 samples+=32; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
241 rest-=32; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
242 } |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
243 } else { |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
244 while(rest>=32*2) { |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
245 short tmpbuf[32*2]; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
246 int i; |
1531
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
247 |
1534
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
248 for(i=0;i<32;i++) { |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
249 tmpbuf[i] = samples[i*2]; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
250 tmpbuf[i+32] = samples[i*2+1]; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
251 } |
1531
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
252 |
1534
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
253 adx_encode(dst,tmpbuf,c->prev); |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
254 adx_encode(dst+18,tmpbuf+32,c->prev+1); |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
255 dst+=18*2; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
256 samples+=32*2; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
257 rest-=32*2; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
258 } |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
259 } |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
260 return dst-frame; |
1531
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
261 } |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
262 |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
263 #endif //CONFIG_ENCODERS |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
264 |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
265 static uint32_t read_long(const unsigned char *p) |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
266 { |
1534
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
267 return (p[0]<<24)|(p[1]<<16)|(p[2]<<8)|p[3]; |
1531
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
268 } |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
269 |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
270 int is_adx(const unsigned char *buf,size_t bufsize) |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
271 { |
1534
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
272 int offset; |
1531
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
273 |
1534
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
274 if (buf[0]!=0x80) return 0; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
275 offset = (read_long(buf)^0x80000000)+4; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
276 if (bufsize<offset || memcmp(buf+offset-6,"(c)CRI",6)) return 0; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
277 return offset; |
1531
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
278 } |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
279 |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
280 /* return data offset or 6 */ |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
281 static int adx_decode_header(AVCodecContext *avctx,const unsigned char *buf,size_t bufsize) |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
282 { |
1534
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
283 int offset; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
284 int channels,freq,size; |
1531
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
285 |
1534
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
286 offset = is_adx(buf,bufsize); |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
287 if (offset==0) return 0; |
1531
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
288 |
1534
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
289 channels = buf[7]; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
290 freq = read_long(buf+8); |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
291 size = read_long(buf+12); |
1531
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
292 |
1534
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
293 // printf("freq=%d ch=%d\n",freq,channels); |
1531
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
294 |
1534
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
295 avctx->sample_rate = freq; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
296 avctx->channels = channels; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
297 avctx->bit_rate = freq*channels*18*8/32; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
298 // avctx->frame_size = 18*channels; |
1531
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
299 |
1534
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
300 return offset; |
1531
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
301 } |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
302 |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
303 static int adx_decode_init(AVCodecContext * avctx) |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
304 { |
1534
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
305 ADXContext *c = avctx->priv_data; |
1531
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
306 |
1534
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
307 // printf("adx_decode_init\n"); fflush(stdout); |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
308 c->prev[0].s1 = 0; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
309 c->prev[0].s2 = 0; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
310 c->prev[1].s1 = 0; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
311 c->prev[1].s2 = 0; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
312 c->header_parsed = 0; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
313 c->in_temp = 0; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
314 return 0; |
1531
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
315 } |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
316 |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
317 static void dump(unsigned char *buf,size_t len) |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
318 { |
1534
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
319 int i; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
320 for(i=0;i<len;i++) { |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1569
diff
changeset
|
321 if ((i&15)==0) av_log(NULL, AV_LOG_DEBUG, "%04x ",i); |
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1569
diff
changeset
|
322 av_log(NULL, AV_LOG_DEBUG, "%02x ",buf[i]); |
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1569
diff
changeset
|
323 if ((i&15)==15) av_log(NULL, AV_LOG_DEBUG, "\n"); |
1534
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
324 } |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1569
diff
changeset
|
325 av_log(NULL, AV_LOG_ERROR, "\n"); |
1531
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
326 } |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
327 static int adx_decode_frame(AVCodecContext *avctx, |
1534
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
328 void *data, int *data_size, |
1569
1f8d1e1173d8
Fixes GCC 3.3.2 warnings patch by (Panagiotis Issaris <takis at lumumba dot luc dot ac dot be>)
michael
parents:
1534
diff
changeset
|
329 uint8_t *buf0, int buf_size) |
1531
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
330 { |
1534
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
331 ADXContext *c = avctx->priv_data; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
332 short *samples = data; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
333 const uint8_t *buf = buf0; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
334 int rest = buf_size; |
1531
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
335 |
1534
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
336 if (!c->header_parsed) { |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
337 int hdrsize = adx_decode_header(avctx,buf,rest); |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
338 if (hdrsize==0) return -1; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
339 c->header_parsed = 1; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
340 buf += hdrsize; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
341 rest -= hdrsize; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
342 } |
1531
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
343 |
1534
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
344 if (c->in_temp) { |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
345 int copysize = 18*avctx->channels - c->in_temp; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
346 memcpy(c->dec_temp+c->in_temp,buf,copysize); |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
347 rest -= copysize; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
348 buf += copysize; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
349 if (avctx->channels==1) { |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
350 adx_decode(samples,c->dec_temp,c->prev); |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
351 samples += 32; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
352 } else { |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
353 adx_decode_stereo(samples,c->dec_temp,c->prev); |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
354 samples += 32*2; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
355 } |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
356 } |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
357 // |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
358 if (avctx->channels==1) { |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
359 while(rest>=18) { |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
360 adx_decode(samples,buf,c->prev); |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
361 rest-=18; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
362 buf+=18; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
363 samples+=32; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
364 } |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
365 } else { |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
366 while(rest>=18*2) { |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
367 adx_decode_stereo(samples,buf,c->prev); |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
368 rest-=18*2; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
369 buf+=18*2; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
370 samples+=32*2; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
371 } |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
372 } |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
373 // |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
374 c->in_temp = rest; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
375 if (rest) { |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
376 memcpy(c->dec_temp,buf,rest); |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
377 buf+=rest; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
378 } |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
379 *data_size = (uint8_t*)samples - (uint8_t*)data; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
380 // printf("%d:%d ",buf-buf0,*data_size); fflush(stdout); |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
381 return buf-buf0; |
1531
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
382 } |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
383 |
1534
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
384 #ifdef CONFIG_ENCODERS |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
385 AVCodec adx_adpcm_encoder = { |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
386 "adx_adpcm", |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
387 CODEC_TYPE_AUDIO, |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
388 CODEC_ID_ADPCM_ADX, |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
389 sizeof(ADXContext), |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
390 adx_encode_init, |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
391 adx_encode_frame, |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
392 adx_encode_close, |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
393 NULL, |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
394 }; |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
395 #endif //CONFIG_ENCODERS |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
396 |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
397 AVCodec adx_adpcm_decoder = { |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
398 "adx_adpcm", |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
399 CODEC_TYPE_AUDIO, |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
400 CODEC_ID_ADPCM_ADX, |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
401 sizeof(ADXContext), |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
402 adx_decode_init, |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
403 NULL, |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
404 NULL, |
5bdf2017d854
replace file to remove nasty DOS CRs and hard tabs
melanson
parents:
1531
diff
changeset
|
405 adx_decode_frame, |
1531
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
406 }; |
a78de892cefd
added CRI ADX and XA ADPCM audio modules, courtesy of BERO
melanson
parents:
diff
changeset
|
407 |