提交 f19af812 编写于 作者: M Mike Melanson

replace file to remove nasty DOS CRs and hard tabs

Originally committed as revision 2384 to svn://svn.ffmpeg.org/ffmpeg/trunk
上级 f1271366
...@@ -28,163 +28,163 @@ ...@@ -28,163 +28,163 @@
*/ */
typedef struct { typedef struct {
int s1,s2; int s1,s2;
} PREV; } PREV;
typedef struct { typedef struct {
PREV prev[2]; PREV prev[2];
int header_parsed; int header_parsed;
unsigned char dec_temp[18*2]; unsigned char dec_temp[18*2];
unsigned short enc_temp[32*2]; unsigned short enc_temp[32*2];
int in_temp; int in_temp;
} ADXContext; } ADXContext;
//#define BASEVOL 0x11e0 //#define BASEVOL 0x11e0
#define BASEVOL 0x4000 #define BASEVOL 0x4000
#define SCALE1 0x7298 #define SCALE1 0x7298
#define SCALE2 0x3350 #define SCALE2 0x3350
#define CLIP(s) if (s>32767) s=32767; else if (s<-32768) s=-32768 #define CLIP(s) if (s>32767) s=32767; else if (s<-32768) s=-32768
/* 18byte <-> 32 samples */ /* 18 bytes <-> 32 samples */
#ifdef CONFIG_ENCODERS #ifdef CONFIG_ENCODERS
static void adx_encode(unsigned char *adx,const short *wav,PREV *prev) static void adx_encode(unsigned char *adx,const short *wav,PREV *prev)
{ {
int scale; int scale;
int i; int i;
int s0,s1,s2,d; int s0,s1,s2,d;
int max=0; int max=0;
int min=0; int min=0;
int data[32]; int data[32];
s1 = prev->s1; s1 = prev->s1;
s2 = prev->s2; s2 = prev->s2;
for(i=0;i<32;i++) { for(i=0;i<32;i++) {
s0 = wav[i]; s0 = wav[i];
d = ((s0<<14) - SCALE1*s1 + SCALE2*s2)/BASEVOL; d = ((s0<<14) - SCALE1*s1 + SCALE2*s2)/BASEVOL;
data[i]=d; data[i]=d;
if (max<d) max=d; if (max<d) max=d;
if (min>d) min=d; if (min>d) min=d;
s2 = s1; s2 = s1;
s1 = s0; s1 = s0;
} }
prev->s1 = s1; prev->s1 = s1;
prev->s2 = s2; prev->s2 = s2;
/* -8..+7 */ /* -8..+7 */
if (max==0 && min==0) { if (max==0 && min==0) {
memset(adx,0,18); memset(adx,0,18);
return; return;
} }
if (max/7>-min/8) scale = max/7; if (max/7>-min/8) scale = max/7;
else scale = -min/8; else scale = -min/8;
if (scale==0) scale=1; if (scale==0) scale=1;
adx[0] = scale>>8; adx[0] = scale>>8;
adx[1] = scale; adx[1] = scale;
for(i=0;i<16;i++) { for(i=0;i<16;i++) {
adx[i+2] = ((data[i*2]/scale)<<4) | ((data[i*2+1]/scale)&0xf); adx[i+2] = ((data[i*2]/scale)<<4) | ((data[i*2+1]/scale)&0xf);
} }
} }
#endif //CONFIG_ENCODERS #endif //CONFIG_ENCODERS
static void adx_decode(short *out,const unsigned char *in,PREV *prev) static void adx_decode(short *out,const unsigned char *in,PREV *prev)
{ {
int scale = ((in[0]<<8)|(in[1])); int scale = ((in[0]<<8)|(in[1]));
int i; int i;
int s0,s1,s2,d; int s0,s1,s2,d;
// printf("%x ",scale); // printf("%x ",scale);
in+=2; in+=2;
s1 = prev->s1; s1 = prev->s1;
s2 = prev->s2; s2 = prev->s2;
for(i=0;i<16;i++) { for(i=0;i<16;i++) {
d = in[i]; d = in[i];
// d>>=4; if (d&8) d-=16; // d>>=4; if (d&8) d-=16;
d = ((signed char)d >> 4); d = ((signed char)d >> 4);
s0 = (BASEVOL*d*scale + SCALE1*s1 - SCALE2*s2)>>14; s0 = (BASEVOL*d*scale + SCALE1*s1 - SCALE2*s2)>>14;
CLIP(s0); CLIP(s0);
*out++=s0; *out++=s0;
s2 = s1; s2 = s1;
s1 = s0; s1 = s0;
d = in[i]; d = in[i];
//d&=15; if (d&8) d-=16; //d&=15; if (d&8) d-=16;
d = ((signed char)(d<<4) >> 4); d = ((signed char)(d<<4) >> 4);
s0 = (BASEVOL*d*scale + SCALE1*s1 - SCALE2*s2)>>14; s0 = (BASEVOL*d*scale + SCALE1*s1 - SCALE2*s2)>>14;
CLIP(s0); CLIP(s0);
*out++=s0; *out++=s0;
s2 = s1; s2 = s1;
s1 = s0; s1 = s0;
} }
prev->s1 = s1; prev->s1 = s1;
prev->s2 = s2; prev->s2 = s2;
} }
static void adx_decode_stereo(short *out,const unsigned char *in,PREV *prev) static void adx_decode_stereo(short *out,const unsigned char *in,PREV *prev)
{ {
short tmp[32*2]; short tmp[32*2];
int i; int i;
adx_decode(tmp ,in ,prev); adx_decode(tmp ,in ,prev);
adx_decode(tmp+32,in+18,prev+1); adx_decode(tmp+32,in+18,prev+1);
for(i=0;i<32;i++) { for(i=0;i<32;i++) {
out[i*2] = tmp[i]; out[i*2] = tmp[i];
out[i*2+1] = tmp[i+32]; out[i*2+1] = tmp[i+32];
} }
} }
#ifdef CONFIG_ENCODERS #ifdef CONFIG_ENCODERS
static void write_long(unsigned char *p,uint32_t v) static void write_long(unsigned char *p,uint32_t v)
{ {
p[0] = v>>24; p[0] = v>>24;
p[1] = v>>16; p[1] = v>>16;
p[2] = v>>8; p[2] = v>>8;
p[3] = v; p[3] = v;
} }
static int adx_encode_header(AVCodecContext *avctx,unsigned char *buf,size_t bufsize) static int adx_encode_header(AVCodecContext *avctx,unsigned char *buf,size_t bufsize)
{ {
#if 0 #if 0
struct { struct {
uint32_t offset; /* 0x80000000 + sample start - 4 */ uint32_t offset; /* 0x80000000 + sample start - 4 */
unsigned char unknown1[3]; /* 03 12 04 */ unsigned char unknown1[3]; /* 03 12 04 */
unsigned char channel; /* 1 or 2 */ unsigned char channel; /* 1 or 2 */
uint32_t freq; uint32_t freq;
uint32_t size; uint32_t size;
uint32_t unknown2; /* 01 f4 03 00 */ uint32_t unknown2; /* 01 f4 03 00 */
uint32_t unknown3; /* 00 00 00 00 */ uint32_t unknown3; /* 00 00 00 00 */
uint32_t unknown4; /* 00 00 00 00 */ uint32_t unknown4; /* 00 00 00 00 */
/* if loop /* if loop
unknown3 00 15 00 01 unknown3 00 15 00 01
unknown4 00 00 00 01 unknown4 00 00 00 01
long loop_start_sample; long loop_start_sample;
long loop_start_byte; long loop_start_byte;
long loop_end_sample; long loop_end_sample;
long loop_end_byte; long loop_end_byte;
long long
*/ */
} adxhdr; /* big endian */ } adxhdr; /* big endian */
/* offset-6 "(c)CRI" */ /* offset-6 "(c)CRI" */
#endif #endif
write_long(buf+0x00,0x80000000|0x20); write_long(buf+0x00,0x80000000|0x20);
write_long(buf+0x04,0x03120400|avctx->channels); write_long(buf+0x04,0x03120400|avctx->channels);
write_long(buf+0x08,avctx->sample_rate); write_long(buf+0x08,avctx->sample_rate);
write_long(buf+0x0c,0); /* FIXME: set after */ write_long(buf+0x0c,0); /* FIXME: set after */
write_long(buf+0x10,0x01040300); write_long(buf+0x10,0x01040300);
write_long(buf+0x14,0x00000000); write_long(buf+0x14,0x00000000);
write_long(buf+0x18,0x00000000); write_long(buf+0x18,0x00000000);
memcpy(buf+0x1c,"\0\0(c)CRI",8); memcpy(buf+0x1c,"\0\0(c)CRI",8);
return 0x20+4; return 0x20+4;
} }
static int adx_decode_init(AVCodecContext *avctx); static int adx_decode_init(AVCodecContext *avctx);
...@@ -213,200 +213,195 @@ static int adx_encode_close(AVCodecContext *avctx) ...@@ -213,200 +213,195 @@ static int adx_encode_close(AVCodecContext *avctx)
} }
static int adx_encode_frame(AVCodecContext *avctx, static int adx_encode_frame(AVCodecContext *avctx,
unsigned char *frame, int buf_size, const void *data) unsigned char *frame, int buf_size, const void *data)
{ {
ADXContext *c = avctx->priv_data; ADXContext *c = avctx->priv_data;
const short *samples = data; const short *samples = data;
unsigned char *dst = frame; unsigned char *dst = frame;
int rest = avctx->frame_size; int rest = avctx->frame_size;
/* /*
input data size = input data size =
ffmpeg.c: do_audio_out() ffmpeg.c: do_audio_out()
frame_bytes = enc->frame_size * 2 * enc->channels; frame_bytes = enc->frame_size * 2 * enc->channels;
*/ */
// printf("sz=%d ",buf_size); fflush(stdout); // printf("sz=%d ",buf_size); fflush(stdout);
if (!c->header_parsed) { if (!c->header_parsed) {
int hdrsize = adx_encode_header(avctx,dst,buf_size); int hdrsize = adx_encode_header(avctx,dst,buf_size);
dst+=hdrsize; dst+=hdrsize;
c->header_parsed = 1; c->header_parsed = 1;
} }
if (avctx->channels==1) { if (avctx->channels==1) {
while(rest>=32) { while(rest>=32) {
adx_encode(dst,samples,c->prev); adx_encode(dst,samples,c->prev);
dst+=18; dst+=18;
samples+=32; samples+=32;
rest-=32; rest-=32;
} }
} else { } else {
while(rest>=32*2) { while(rest>=32*2) {
short tmpbuf[32*2]; short tmpbuf[32*2];
int i; int i;
for(i=0;i<32;i++) { for(i=0;i<32;i++) {
tmpbuf[i] = samples[i*2]; tmpbuf[i] = samples[i*2];
tmpbuf[i+32] = samples[i*2+1]; tmpbuf[i+32] = samples[i*2+1];
} }
adx_encode(dst,tmpbuf,c->prev); adx_encode(dst,tmpbuf,c->prev);
adx_encode(dst+18,tmpbuf+32,c->prev+1); adx_encode(dst+18,tmpbuf+32,c->prev+1);
dst+=18*2; dst+=18*2;
samples+=32*2; samples+=32*2;
rest-=32*2; rest-=32*2;
} }
} }
return dst-frame; return dst-frame;
} }
#endif //CONFIG_ENCODERS #endif //CONFIG_ENCODERS
static uint32_t read_long(const unsigned char *p) static uint32_t read_long(const unsigned char *p)
{ {
return (p[0]<<24)|(p[1]<<16)|(p[2]<<8)|p[3]; return (p[0]<<24)|(p[1]<<16)|(p[2]<<8)|p[3];
} }
int is_adx(const unsigned char *buf,size_t bufsize) int is_adx(const unsigned char *buf,size_t bufsize)
{ {
int offset; int offset;
if (buf[0]!=0x80) return 0; if (buf[0]!=0x80) return 0;
offset = (read_long(buf)^0x80000000)+4; offset = (read_long(buf)^0x80000000)+4;
if (bufsize<offset || memcmp(buf+offset-6,"(c)CRI",6)) return 0; if (bufsize<offset || memcmp(buf+offset-6,"(c)CRI",6)) return 0;
return offset; return offset;
} }
/* return data offset or 6 */ /* return data offset or 6 */
static int adx_decode_header(AVCodecContext *avctx,const unsigned char *buf,size_t bufsize) static int adx_decode_header(AVCodecContext *avctx,const unsigned char *buf,size_t bufsize)
{ {
int offset; int offset;
int channels,freq,size; int channels,freq,size;
offset = is_adx(buf,bufsize); offset = is_adx(buf,bufsize);
if (offset==0) return 0; if (offset==0) return 0;
channels = buf[7]; channels = buf[7];
freq = read_long(buf+8); freq = read_long(buf+8);
size = read_long(buf+12); size = read_long(buf+12);
// printf("freq=%d ch=%d\n",freq,channels); // printf("freq=%d ch=%d\n",freq,channels);
avctx->sample_rate = freq; avctx->sample_rate = freq;
avctx->channels = channels; avctx->channels = channels;
avctx->bit_rate = freq*channels*18*8/32; avctx->bit_rate = freq*channels*18*8/32;
// avctx->frame_size = 18*channels; // avctx->frame_size = 18*channels;
return offset; return offset;
} }
static int adx_decode_init(AVCodecContext * avctx) static int adx_decode_init(AVCodecContext * avctx)
{ {
ADXContext *c = avctx->priv_data; ADXContext *c = avctx->priv_data;
// printf("adx_decode_init\n"); fflush(stdout); // printf("adx_decode_init\n"); fflush(stdout);
c->prev[0].s1 = 0; c->prev[0].s1 = 0;
c->prev[0].s2 = 0; c->prev[0].s2 = 0;
c->prev[1].s1 = 0; c->prev[1].s1 = 0;
c->prev[1].s2 = 0; c->prev[1].s2 = 0;
c->header_parsed = 0; c->header_parsed = 0;
c->in_temp = 0; c->in_temp = 0;
return 0; return 0;
} }
static void dump(unsigned char *buf,size_t len) static void dump(unsigned char *buf,size_t len)
{ {
int i; int i;
for(i=0;i<len;i++) { for(i=0;i<len;i++) {
if ((i&15)==0) printf("%04x ",i); if ((i&15)==0) printf("%04x ",i);
printf("%02x ",buf[i]); printf("%02x ",buf[i]);
if ((i&15)==15) printf("\n"); if ((i&15)==15) printf("\n");
} }
printf("\n"); printf("\n");
} }
static int adx_decode_frame(AVCodecContext *avctx, static int adx_decode_frame(AVCodecContext *avctx,
void *data, int *data_size, void *data, int *data_size,
const uint8_t *buf0, int buf_size) const uint8_t *buf0, int buf_size)
{ {
ADXContext *c = avctx->priv_data; ADXContext *c = avctx->priv_data;
short *samples = data; short *samples = data;
const uint8_t *buf = buf0; const uint8_t *buf = buf0;
int rest = buf_size; int rest = buf_size;
if (!c->header_parsed) { if (!c->header_parsed) {
int hdrsize = adx_decode_header(avctx,buf,rest); int hdrsize = adx_decode_header(avctx,buf,rest);
if (hdrsize==0) return -1; if (hdrsize==0) return -1;
c->header_parsed = 1; c->header_parsed = 1;
buf += hdrsize; buf += hdrsize;
rest -= hdrsize; rest -= hdrsize;
} }
if (c->in_temp) { if (c->in_temp) {
int copysize = 18*avctx->channels - c->in_temp; int copysize = 18*avctx->channels - c->in_temp;
memcpy(c->dec_temp+c->in_temp,buf,copysize); memcpy(c->dec_temp+c->in_temp,buf,copysize);
rest -= copysize; rest -= copysize;
buf += copysize; buf += copysize;
if (avctx->channels==1) { if (avctx->channels==1) {
adx_decode(samples,c->dec_temp,c->prev); adx_decode(samples,c->dec_temp,c->prev);
samples += 32; samples += 32;
} else { } else {
adx_decode_stereo(samples,c->dec_temp,c->prev); adx_decode_stereo(samples,c->dec_temp,c->prev);
samples += 32*2; samples += 32*2;
} }
} }
// //
if (avctx->channels==1) { if (avctx->channels==1) {
while(rest>=18) { while(rest>=18) {
adx_decode(samples,buf,c->prev); adx_decode(samples,buf,c->prev);
rest-=18; rest-=18;
buf+=18; buf+=18;
samples+=32; samples+=32;
} }
} else { } else {
while(rest>=18*2) { while(rest>=18*2) {
adx_decode_stereo(samples,buf,c->prev); adx_decode_stereo(samples,buf,c->prev);
rest-=18*2; rest-=18*2;
buf+=18*2; buf+=18*2;
samples+=32*2; samples+=32*2;
} }
} }
// //
c->in_temp = rest; c->in_temp = rest;
if (rest) { if (rest) {
memcpy(c->dec_temp,buf,rest); memcpy(c->dec_temp,buf,rest);
buf+=rest; buf+=rest;
} }
*data_size = (uint8_t*)samples - (uint8_t*)data; *data_size = (uint8_t*)samples - (uint8_t*)data;
// printf("%d:%d ",buf-buf0,*data_size); fflush(stdout); // printf("%d:%d ",buf-buf0,*data_size); fflush(stdout);
return buf-buf0; return buf-buf0;
} }
#define DEFINE_ENCODER(id, name, context) \ #ifdef CONFIG_ENCODERS
AVCodec name ## _encoder = { \ AVCodec adx_adpcm_encoder = {
#name, \ "adx_adpcm",
CODEC_TYPE_AUDIO, \ CODEC_TYPE_AUDIO,
id, \ CODEC_ID_ADPCM_ADX,
sizeof(context), \ sizeof(ADXContext),
name ## _encode_init, \ adx_encode_init,
name ## _encode_frame, \ adx_encode_frame,
name ## _encode_close, \ adx_encode_close,
NULL, \ NULL,
}; };
#endif //CONFIG_ENCODERS
#define DEFINE_DECODER(id, name, context) \ AVCodec adx_adpcm_decoder = {
AVCodec name ## _decoder = { \ "adx_adpcm",
#name, \ CODEC_TYPE_AUDIO,
CODEC_TYPE_AUDIO, \ CODEC_ID_ADPCM_ADX,
id, \ sizeof(ADXContext),
sizeof(context), \ adx_decode_init,
name ## _decode_init, \ NULL,
NULL, \ NULL,
NULL, \ adx_decode_frame,
name ## _decode_frame, \
}; };
#ifdef CONFIG_ENCODERS
DEFINE_ENCODER(CODEC_ID_ADPCM_ADX,adx,ADXContext)
#endif //CONFIG_ENCODERS
DEFINE_DECODER(CODEC_ID_ADPCM_ADX,adx,ADXContext)
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册