3 * Copyright (c) 2001,2003 BERO
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23 * SEGA CRI adx codecs.
25 * Reference documents:
26 * http://ku-www.ss.titech.ac.jp/~yatsushi/adx.html
27 * adx2wav & wav2adx http://www.geocities.co.jp/Playtown/2004/
37 unsigned char dec_temp
[18*2];
38 unsigned short enc_temp
[32*2];
42 //#define BASEVOL 0x11e0
43 #define BASEVOL 0x4000
47 #define CLIP(s) if (s>32767) s=32767; else if (s<-32768) s=-32768
49 /* 18 bytes <-> 32 samples */
51 #ifdef CONFIG_ENCODERS
52 static void adx_encode(unsigned char *adx
,const short *wav
,PREV
*prev
)
65 d
= ((s0
<<14) - SCALE1
*s1
+ SCALE2
*s2
)/BASEVOL
;
77 if (max
==0 && min
==0) {
82 if (max
/7>-min
/8) scale
= max
/7;
85 if (scale
==0) scale
=1;
91 adx
[i
+2] = ((data
[i
*2]/scale
)<<4) | ((data
[i
*2+1]/scale
)&0xf);
94 #endif //CONFIG_ENCODERS
96 static void adx_decode(short *out
,const unsigned char *in
,PREV
*prev
)
98 int scale
= ((in
[0]<<8)|(in
[1]));
102 // printf("%x ",scale);
109 // d>>=4; if (d&8) d-=16;
110 d
= ((signed char)d
>> 4);
111 s0
= (BASEVOL
*d
*scale
+ SCALE1
*s1
- SCALE2
*s2
)>>14;
118 //d&=15; if (d&8) d-=16;
119 d
= ((signed char)(d
<<4) >> 4);
120 s0
= (BASEVOL
*d
*scale
+ SCALE1
*s1
- SCALE2
*s2
)>>14;
131 static void adx_decode_stereo(short *out
,const unsigned char *in
,PREV
*prev
)
136 adx_decode(tmp
,in
,prev
);
137 adx_decode(tmp
+32,in
+18,prev
+1);
140 out
[i
*2+1] = tmp
[i
+32];
144 #ifdef CONFIG_ENCODERS
146 static void write_long(unsigned char *p
,uint32_t v
)
154 static int adx_encode_header(AVCodecContext
*avctx
,unsigned char *buf
,size_t bufsize
)
158 uint32_t offset
; /* 0x80000000 + sample start - 4 */
159 unsigned char unknown1
[3]; /* 03 12 04 */
160 unsigned char channel
; /* 1 or 2 */
163 uint32_t unknown2
; /* 01 f4 03 00 */
164 uint32_t unknown3
; /* 00 00 00 00 */
165 uint32_t unknown4
; /* 00 00 00 00 */
170 long loop_start_sample;
171 long loop_start_byte;
172 long loop_end_sample;
176 } adxhdr
; /* big endian */
177 /* offset-6 "(c)CRI" */
179 write_long(buf
+0x00,0x80000000|0x20);
180 write_long(buf
+0x04,0x03120400|avctx
->channels
);
181 write_long(buf
+0x08,avctx
->sample_rate
);
182 write_long(buf
+0x0c,0); /* FIXME: set after */
183 write_long(buf
+0x10,0x01040300);
184 write_long(buf
+0x14,0x00000000);
185 write_long(buf
+0x18,0x00000000);
186 memcpy(buf
+0x1c,"\0\0(c)CRI",8);
190 static int adx_decode_init(AVCodecContext
*avctx
);
191 static int adx_encode_init(AVCodecContext
*avctx
)
193 if (avctx
->channels
> 2)
194 return -1; /* only stereo or mono =) */
195 avctx
->frame_size
= 32;
197 avctx
->coded_frame
= avcodec_alloc_frame();
198 avctx
->coded_frame
->key_frame
= 1;
200 // avctx->bit_rate = avctx->sample_rate*avctx->channels*18*8/32;
202 av_log(avctx
, AV_LOG_DEBUG
, "adx encode init\n");
203 adx_decode_init(avctx
);
208 static int adx_encode_close(AVCodecContext
*avctx
)
210 av_freep(&avctx
->coded_frame
);
215 static int adx_encode_frame(AVCodecContext
*avctx
,
216 uint8_t *frame
, int buf_size
, void *data
)
218 ADXContext
*c
= avctx
->priv_data
;
219 const short *samples
= data
;
220 unsigned char *dst
= frame
;
221 int rest
= avctx
->frame_size
;
225 ffmpeg.c: do_audio_out()
226 frame_bytes = enc->frame_size * 2 * enc->channels;
229 // printf("sz=%d ",buf_size); fflush(stdout);
230 if (!c
->header_parsed
) {
231 int hdrsize
= adx_encode_header(avctx
,dst
,buf_size
);
233 c
->header_parsed
= 1;
236 if (avctx
->channels
==1) {
238 adx_encode(dst
,samples
,c
->prev
);
249 tmpbuf
[i
] = samples
[i
*2];
250 tmpbuf
[i
+32] = samples
[i
*2+1];
253 adx_encode(dst
,tmpbuf
,c
->prev
);
254 adx_encode(dst
+18,tmpbuf
+32,c
->prev
+1);
263 #endif //CONFIG_ENCODERS
265 static uint32_t read_long(const unsigned char *p
)
267 return (p
[0]<<24)|(p
[1]<<16)|(p
[2]<<8)|p
[3];
270 int is_adx(const unsigned char *buf
,size_t bufsize
)
274 if (buf
[0]!=0x80) return 0;
275 offset
= (read_long(buf
)^0x80000000)+4;
276 if (bufsize
<offset
|| memcmp(buf
+offset
-6,"(c)CRI",6)) return 0;
280 /* return data offset or 6 */
281 static int adx_decode_header(AVCodecContext
*avctx
,const unsigned char *buf
,size_t bufsize
)
284 int channels
,freq
,size
;
286 offset
= is_adx(buf
,bufsize
);
287 if (offset
==0) return 0;
290 freq
= read_long(buf
+8);
291 size
= read_long(buf
+12);
293 // printf("freq=%d ch=%d\n",freq,channels);
295 avctx
->sample_rate
= freq
;
296 avctx
->channels
= channels
;
297 avctx
->bit_rate
= freq
*channels
*18*8/32;
298 // avctx->frame_size = 18*channels;
303 static int adx_decode_init(AVCodecContext
* avctx
)
305 ADXContext
*c
= avctx
->priv_data
;
307 // printf("adx_decode_init\n"); fflush(stdout);
312 c
->header_parsed
= 0;
318 static void dump(unsigned char *buf
,size_t len
)
322 if ((i
&15)==0) av_log(NULL
, AV_LOG_DEBUG
, "%04x ",i
);
323 av_log(NULL
, AV_LOG_DEBUG
, "%02x ",buf
[i
]);
324 if ((i
&15)==15) av_log(NULL
, AV_LOG_DEBUG
, "\n");
326 av_log(NULL
, AV_LOG_ERROR
, "\n");
330 static int adx_decode_frame(AVCodecContext
*avctx
,
331 void *data
, int *data_size
,
332 uint8_t *buf0
, int buf_size
)
334 ADXContext
*c
= avctx
->priv_data
;
335 short *samples
= data
;
336 const uint8_t *buf
= buf0
;
339 if (!c
->header_parsed
) {
340 int hdrsize
= adx_decode_header(avctx
,buf
,rest
);
341 if (hdrsize
==0) return -1;
342 c
->header_parsed
= 1;
348 int copysize
= 18*avctx
->channels
- c
->in_temp
;
349 memcpy(c
->dec_temp
+c
->in_temp
,buf
,copysize
);
352 if (avctx
->channels
==1) {
353 adx_decode(samples
,c
->dec_temp
,c
->prev
);
356 adx_decode_stereo(samples
,c
->dec_temp
,c
->prev
);
361 if (avctx
->channels
==1) {
363 adx_decode(samples
,buf
,c
->prev
);
370 adx_decode_stereo(samples
,buf
,c
->prev
);
379 memcpy(c
->dec_temp
,buf
,rest
);
382 *data_size
= (uint8_t*)samples
- (uint8_t*)data
;
383 // printf("%d:%d ",buf-buf0,*data_size); fflush(stdout);
387 #ifdef CONFIG_ENCODERS
388 AVCodec adx_adpcm_encoder
= {
398 #endif //CONFIG_ENCODERS
400 AVCodec adx_adpcm_decoder
= {