00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "avcodec.h"
00020
00030 typedef struct {
00031 int s1,s2;
00032 } PREV;
00033
00034 typedef struct {
00035 PREV prev[2];
00036 int header_parsed;
00037 unsigned char dec_temp[18*2];
00038 unsigned short enc_temp[32*2];
00039 int in_temp;
00040 } ADXContext;
00041
00042
00043 #define BASEVOL 0x4000
00044 #define SCALE1 0x7298
00045 #define SCALE2 0x3350
00046
00047 #define CLIP(s) if (s>32767) s=32767; else if (s<-32768) s=-32768
00048
00049
00050
00051 #ifdef CONFIG_ENCODERS
00052 static void adx_encode(unsigned char *adx,const short *wav,PREV *prev)
00053 {
00054 int scale;
00055 int i;
00056 int s0,s1,s2,d;
00057 int max=0;
00058 int min=0;
00059 int data[32];
00060
00061 s1 = prev->s1;
00062 s2 = prev->s2;
00063 for(i=0;i<32;i++) {
00064 s0 = wav[i];
00065 d = ((s0<<14) - SCALE1*s1 + SCALE2*s2)/BASEVOL;
00066 data[i]=d;
00067 if (max<d) max=d;
00068 if (min>d) min=d;
00069 s2 = s1;
00070 s1 = s0;
00071 }
00072 prev->s1 = s1;
00073 prev->s2 = s2;
00074
00075
00076
00077 if (max==0 && min==0) {
00078 memset(adx,0,18);
00079 return;
00080 }
00081
00082 if (max/7>-min/8) scale = max/7;
00083 else scale = -min/8;
00084
00085 if (scale==0) scale=1;
00086
00087 adx[0] = scale>>8;
00088 adx[1] = scale;
00089
00090 for(i=0;i<16;i++) {
00091 adx[i+2] = ((data[i*2]/scale)<<4) | ((data[i*2+1]/scale)&0xf);
00092 }
00093 }
00094 #endif //CONFIG_ENCODERS
00095
00096 static void adx_decode(short *out,const unsigned char *in,PREV *prev)
00097 {
00098 int scale = ((in[0]<<8)|(in[1]));
00099 int i;
00100 int s0,s1,s2,d;
00101
00102
00103
00104 in+=2;
00105 s1 = prev->s1;
00106 s2 = prev->s2;
00107 for(i=0;i<16;i++) {
00108 d = in[i];
00109
00110 d = ((signed char)d >> 4);
00111 s0 = (BASEVOL*d*scale + SCALE1*s1 - SCALE2*s2)>>14;
00112 CLIP(s0);
00113 *out++=s0;
00114 s2 = s1;
00115 s1 = s0;
00116
00117 d = in[i];
00118
00119 d = ((signed char)(d<<4) >> 4);
00120 s0 = (BASEVOL*d*scale + SCALE1*s1 - SCALE2*s2)>>14;
00121 CLIP(s0);
00122 *out++=s0;
00123 s2 = s1;
00124 s1 = s0;
00125 }
00126 prev->s1 = s1;
00127 prev->s2 = s2;
00128
00129 }
00130
00131 static void adx_decode_stereo(short *out,const unsigned char *in,PREV *prev)
00132 {
00133 short tmp[32*2];
00134 int i;
00135
00136 adx_decode(tmp ,in ,prev);
00137 adx_decode(tmp+32,in+18,prev+1);
00138 for(i=0;i<32;i++) {
00139 out[i*2] = tmp[i];
00140 out[i*2+1] = tmp[i+32];
00141 }
00142 }
00143
00144 #ifdef CONFIG_ENCODERS
00145
00146 static void write_long(unsigned char *p,uint32_t v)
00147 {
00148 p[0] = v>>24;
00149 p[1] = v>>16;
00150 p[2] = v>>8;
00151 p[3] = v;
00152 }
00153
00154 static int adx_encode_header(AVCodecContext *avctx,unsigned char *buf,size_t bufsize)
00155 {
00156 #if 0
00157 struct {
00158 uint32_t offset;
00159 unsigned char unknown1[3];
00160 unsigned char channel;
00161 uint32_t freq;
00162 uint32_t size;
00163 uint32_t unknown2;
00164 uint32_t unknown3;
00165 uint32_t unknown4;
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176 } adxhdr;
00177
00178 #endif
00179 write_long(buf+0x00,0x80000000|0x20);
00180 write_long(buf+0x04,0x03120400|avctx->channels);
00181 write_long(buf+0x08,avctx->sample_rate);
00182 write_long(buf+0x0c,0);
00183 write_long(buf+0x10,0x01040300);
00184 write_long(buf+0x14,0x00000000);
00185 write_long(buf+0x18,0x00000000);
00186 memcpy(buf+0x1c,"\0\0(c)CRI",8);
00187 return 0x20+4;
00188 }
00189
00190 static int adx_decode_init(AVCodecContext *avctx);
00191 static int adx_encode_init(AVCodecContext *avctx)
00192 {
00193 if (avctx->channels > 2)
00194 return -1;
00195 avctx->frame_size = 32;
00196
00197 avctx->coded_frame= avcodec_alloc_frame();
00198 avctx->coded_frame->key_frame= 1;
00199
00200
00201
00202 av_log(avctx, AV_LOG_DEBUG, "adx encode init\n");
00203 adx_decode_init(avctx);
00204
00205 return 0;
00206 }
00207
00208 static int adx_encode_close(AVCodecContext *avctx)
00209 {
00210 av_freep(&avctx->coded_frame);
00211
00212 return 0;
00213 }
00214
00215 static int adx_encode_frame(AVCodecContext *avctx,
00216 uint8_t *frame, int buf_size, void *data)
00217 {
00218 ADXContext *c = avctx->priv_data;
00219 const short *samples = data;
00220 unsigned char *dst = frame;
00221 int rest = avctx->frame_size;
00222
00223
00224
00225
00226
00227
00228
00229
00230 if (!c->header_parsed) {
00231 int hdrsize = adx_encode_header(avctx,dst,buf_size);
00232 dst+=hdrsize;
00233 c->header_parsed = 1;
00234 }
00235
00236 if (avctx->channels==1) {
00237 while(rest>=32) {
00238 adx_encode(dst,samples,c->prev);
00239 dst+=18;
00240 samples+=32;
00241 rest-=32;
00242 }
00243 } else {
00244 while(rest>=32*2) {
00245 short tmpbuf[32*2];
00246 int i;
00247
00248 for(i=0;i<32;i++) {
00249 tmpbuf[i] = samples[i*2];
00250 tmpbuf[i+32] = samples[i*2+1];
00251 }
00252
00253 adx_encode(dst,tmpbuf,c->prev);
00254 adx_encode(dst+18,tmpbuf+32,c->prev+1);
00255 dst+=18*2;
00256 samples+=32*2;
00257 rest-=32*2;
00258 }
00259 }
00260 return dst-frame;
00261 }
00262
00263 #endif //CONFIG_ENCODERS
00264
00265 static uint32_t read_long(const unsigned char *p)
00266 {
00267 return (p[0]<<24)|(p[1]<<16)|(p[2]<<8)|p[3];
00268 }
00269
00270 int is_adx(const unsigned char *buf,size_t bufsize)
00271 {
00272 int offset;
00273
00274 if (buf[0]!=0x80) return 0;
00275 offset = (read_long(buf)^0x80000000)+4;
00276 if (bufsize<offset || memcmp(buf+offset-6,"(c)CRI",6)) return 0;
00277 return offset;
00278 }
00279
00280
00281 static int adx_decode_header(AVCodecContext *avctx,const unsigned char *buf,size_t bufsize)
00282 {
00283 int offset;
00284 int channels,freq,size;
00285
00286 offset = is_adx(buf,bufsize);
00287 if (offset==0) return 0;
00288
00289 channels = buf[7];
00290 freq = read_long(buf+8);
00291 size = read_long(buf+12);
00292
00293
00294
00295 avctx->sample_rate = freq;
00296 avctx->channels = channels;
00297 avctx->bit_rate = freq*channels*18*8/32;
00298
00299
00300 return offset;
00301 }
00302
00303 static int adx_decode_init(AVCodecContext * avctx)
00304 {
00305 ADXContext *c = avctx->priv_data;
00306
00307
00308 c->prev[0].s1 = 0;
00309 c->prev[0].s2 = 0;
00310 c->prev[1].s1 = 0;
00311 c->prev[1].s2 = 0;
00312 c->header_parsed = 0;
00313 c->in_temp = 0;
00314 return 0;
00315 }
00316
00317 #if 0
00318 static void dump(unsigned char *buf,size_t len)
00319 {
00320 int i;
00321 for(i=0;i<len;i++) {
00322 if ((i&15)==0) av_log(NULL, AV_LOG_DEBUG, "%04x ",i);
00323 av_log(NULL, AV_LOG_DEBUG, "%02x ",buf[i]);
00324 if ((i&15)==15) av_log(NULL, AV_LOG_DEBUG, "\n");
00325 }
00326 av_log(NULL, AV_LOG_ERROR, "\n");
00327 }
00328 #endif
00329
00330 static int adx_decode_frame(AVCodecContext *avctx,
00331 void *data, int *data_size,
00332 uint8_t *buf0, int buf_size)
00333 {
00334 ADXContext *c = avctx->priv_data;
00335 short *samples = data;
00336 const uint8_t *buf = buf0;
00337 int rest = buf_size;
00338
00339 if (!c->header_parsed) {
00340 int hdrsize = adx_decode_header(avctx,buf,rest);
00341 if (hdrsize==0) return -1;
00342 c->header_parsed = 1;
00343 buf += hdrsize;
00344 rest -= hdrsize;
00345 }
00346
00347 if (c->in_temp) {
00348 int copysize = 18*avctx->channels - c->in_temp;
00349 memcpy(c->dec_temp+c->in_temp,buf,copysize);
00350 rest -= copysize;
00351 buf += copysize;
00352 if (avctx->channels==1) {
00353 adx_decode(samples,c->dec_temp,c->prev);
00354 samples += 32;
00355 } else {
00356 adx_decode_stereo(samples,c->dec_temp,c->prev);
00357 samples += 32*2;
00358 }
00359 }
00360
00361 if (avctx->channels==1) {
00362 while(rest>=18) {
00363 adx_decode(samples,buf,c->prev);
00364 rest-=18;
00365 buf+=18;
00366 samples+=32;
00367 }
00368 } else {
00369 while(rest>=18*2) {
00370 adx_decode_stereo(samples,buf,c->prev);
00371 rest-=18*2;
00372 buf+=18*2;
00373 samples+=32*2;
00374 }
00375 }
00376
00377 c->in_temp = rest;
00378 if (rest) {
00379 memcpy(c->dec_temp,buf,rest);
00380 buf+=rest;
00381 }
00382 *data_size = (uint8_t*)samples - (uint8_t*)data;
00383
00384 return buf-buf0;
00385 }
00386
00387 #ifdef CONFIG_ENCODERS
00388 AVCodec adx_adpcm_encoder = {
00389 "adx_adpcm",
00390 CODEC_TYPE_AUDIO,
00391 CODEC_ID_ADPCM_ADX,
00392 sizeof(ADXContext),
00393 adx_encode_init,
00394 adx_encode_frame,
00395 adx_encode_close,
00396 NULL,
00397 };
00398 #endif //CONFIG_ENCODERS
00399
00400 AVCodec adx_adpcm_decoder = {
00401 "adx_adpcm",
00402 CODEC_TYPE_AUDIO,
00403 CODEC_ID_ADPCM_ADX,
00404 sizeof(ADXContext),
00405 adx_decode_init,
00406 NULL,
00407 NULL,
00408 adx_decode_frame,
00409 };
00410