3 * Copyright (c) 2001,2003 BERO
5 * This file is part of FFmpeg.
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 #include "libavutil/intreadwrite.h"
27 * @file libavcodec/adxdec.c
28 * SEGA CRI adx codecs.
30 * Reference documents:
31 * http://ku-www.ss.titech.ac.jp/~yatsushi/adx.html
32 * adx2wav & wav2adx http://www.geocities.co.jp/Playtown/2004/
35 static av_cold
int adx_decode_init(AVCodecContext
*avctx
)
37 avctx
->sample_fmt
= SAMPLE_FMT_S16
;
41 /* 18 bytes <-> 32 samples */
43 static void adx_decode(short *out
,const unsigned char *in
,PREV
*prev
)
45 int scale
= AV_RB16(in
);
49 // printf("%x ",scale);
56 // d>>=4; if (d&8) d-=16;
57 d
= ((signed char)d
>> 4);
58 s0
= (BASEVOL
*d
*scale
+ SCALE1
*s1
- SCALE2
*s2
)>>14;
60 s1
= av_clip_int16(s0
);
64 //d&=15; if (d&8) d-=16;
65 d
= ((signed char)(d
<<4) >> 4);
66 s0
= (BASEVOL
*d
*scale
+ SCALE1
*s1
- SCALE2
*s2
)>>14;
68 s1
= av_clip_int16(s0
);
76 static void adx_decode_stereo(short *out
,const unsigned char *in
,PREV
*prev
)
81 adx_decode(tmp
,in
,prev
);
82 adx_decode(tmp
+32,in
+18,prev
+1);
85 out
[i
*2+1] = tmp
[i
+32];
89 /* return data offset or 0 */
90 static int adx_decode_header(AVCodecContext
*avctx
,const unsigned char *buf
,size_t bufsize
)
94 if (buf
[0]!=0x80) return 0;
95 offset
= (AV_RB32(buf
)^0x80000000)+4;
96 if (bufsize
<offset
|| memcmp(buf
+offset
-6,"(c)CRI",6)) return 0;
98 avctx
->channels
= buf
[7];
99 avctx
->sample_rate
= AV_RB32(buf
+8);
100 avctx
->bit_rate
= avctx
->sample_rate
*avctx
->channels
*18*8/32;
105 static int adx_decode_frame(AVCodecContext
*avctx
,
106 void *data
, int *data_size
,
107 const uint8_t *buf0
, int buf_size
)
109 ADXContext
*c
= avctx
->priv_data
;
110 short *samples
= data
;
111 const uint8_t *buf
= buf0
;
114 if (!c
->header_parsed
) {
115 int hdrsize
= adx_decode_header(avctx
,buf
,rest
);
116 if (hdrsize
==0) return -1;
117 c
->header_parsed
= 1;
122 /* 18 bytes of data are expanded into 32*2 bytes of audio,
123 so guard against buffer overflows */
124 if(rest
/18 > *data_size
/64)
125 rest
= (*data_size
/64) * 18;
128 int copysize
= 18*avctx
->channels
- c
->in_temp
;
129 memcpy(c
->dec_temp
+c
->in_temp
,buf
,copysize
);
132 if (avctx
->channels
==1) {
133 adx_decode(samples
,c
->dec_temp
,c
->prev
);
136 adx_decode_stereo(samples
,c
->dec_temp
,c
->prev
);
141 if (avctx
->channels
==1) {
143 adx_decode(samples
,buf
,c
->prev
);
150 adx_decode_stereo(samples
,buf
,c
->prev
);
159 memcpy(c
->dec_temp
,buf
,rest
);
162 *data_size
= (uint8_t*)samples
- (uint8_t*)data
;
163 // printf("%d:%d ",buf-buf0,*data_size); fflush(stdout);
167 AVCodec adpcm_adx_decoder
= {
176 .long_name
= NULL_IF_CONFIG_SMALL("SEGA CRI ADX ADPCM"),