-
-static int adx_encode_frame(AVCodecContext *avctx,
- unsigned char *frame, int buf_size, const void *data)
-{
- ADXContext *c = avctx->priv_data;
- const short *samples = data;
- unsigned char *dst = frame;
- int rest = avctx->frame_size;
-
-/*
- input data size =
- ffmpeg.c: do_audio_out()
- frame_bytes = enc->frame_size * 2 * enc->channels;
-*/
-
-// printf("sz=%d ",buf_size); fflush(stdout);
- if (!c->header_parsed) {
- int hdrsize = adx_encode_header(avctx,dst,buf_size);
- dst+=hdrsize;
- c->header_parsed = 1;
- }
-
- if (avctx->channels==1) {
- while(rest>=32) {
- adx_encode(dst,samples,c->prev);
- dst+=18;
- samples+=32;
- rest-=32;
- }
- } else {
- while(rest>=32*2) {
- short tmpbuf[32*2];
- int i;
-
- for(i=0;i<32;i++) {
- tmpbuf[i] = samples[i*2];
- tmpbuf[i+32] = samples[i*2+1];
- }
-
- adx_encode(dst,tmpbuf,c->prev);
- adx_encode(dst+18,tmpbuf+32,c->prev+1);
- dst+=18*2;
- samples+=32*2;
- rest-=32*2;
- }
- }
- return dst-frame;
-}
-
-#endif //CONFIG_ENCODERS
-
-static uint32_t read_long(const unsigned char *p)
-{
- return (p[0]<<24)|(p[1]<<16)|(p[2]<<8)|p[3];
-}
-
-int is_adx(const unsigned char *buf,size_t bufsize)
-{
- int offset;
-
- if (buf[0]!=0x80) return 0;
- offset = (read_long(buf)^0x80000000)+4;
- if (bufsize<offset || memcmp(buf+offset-6,"(c)CRI",6)) return 0;
- return offset;
-}
-
-/* return data offset or 6 */
-static int adx_decode_header(AVCodecContext *avctx,const unsigned char *buf,size_t bufsize)
-{
- int offset;
- int channels,freq,size;
-
- offset = is_adx(buf,bufsize);
- if (offset==0) return 0;
-
- channels = buf[7];
- freq = read_long(buf+8);
- size = read_long(buf+12);
-
-// printf("freq=%d ch=%d\n",freq,channels);
-
- avctx->sample_rate = freq;
- avctx->channels = channels;
- avctx->bit_rate = freq*channels*18*8/32;
-// avctx->frame_size = 18*channels;
-
- return offset;
-}
-
-static int adx_decode_init(AVCodecContext * avctx)
-{
- ADXContext *c = avctx->priv_data;
-
-// printf("adx_decode_init\n"); fflush(stdout);
- c->prev[0].s1 = 0;
- c->prev[0].s2 = 0;
- c->prev[1].s1 = 0;
- c->prev[1].s2 = 0;
- c->header_parsed = 0;
- c->in_temp = 0;
- return 0;
-}
-
-static void dump(unsigned char *buf,size_t len)
-{
- int i;
- for(i=0;i<len;i++) {
- if ((i&15)==0) printf("%04x ",i);
- printf("%02x ",buf[i]);
- if ((i&15)==15) printf("\n");
- }
- printf("\n");
-}
-static int adx_decode_frame(AVCodecContext *avctx,
- void *data, int *data_size,
- const uint8_t *buf0, int buf_size)
-{
- ADXContext *c = avctx->priv_data;
- short *samples = data;
- const uint8_t *buf = buf0;
- int rest = buf_size;
-
- if (!c->header_parsed) {
- int hdrsize = adx_decode_header(avctx,buf,rest);
- if (hdrsize==0) return -1;
- c->header_parsed = 1;
- buf += hdrsize;
- rest -= hdrsize;
- }
-
- if (c->in_temp) {
- int copysize = 18*avctx->channels - c->in_temp;
- memcpy(c->dec_temp+c->in_temp,buf,copysize);
- rest -= copysize;
- buf += copysize;
- if (avctx->channels==1) {
- adx_decode(samples,c->dec_temp,c->prev);
- samples += 32;
- } else {
- adx_decode_stereo(samples,c->dec_temp,c->prev);
- samples += 32*2;
- }
- }
- //
- if (avctx->channels==1) {
- while(rest>=18) {
- adx_decode(samples,buf,c->prev);
- rest-=18;
- buf+=18;
- samples+=32;
- }
- } else {
- while(rest>=18*2) {
- adx_decode_stereo(samples,buf,c->prev);
- rest-=18*2;
- buf+=18*2;
- samples+=32*2;
- }
- }
- //
- c->in_temp = rest;
- if (rest) {
- memcpy(c->dec_temp,buf,rest);
- buf+=rest;
- }
- *data_size = (uint8_t*)samples - (uint8_t*)data;
-// printf("%d:%d ",buf-buf0,*data_size); fflush(stdout);
- return buf-buf0;
-}
-
-#define DEFINE_ENCODER(id, name, context) \
-AVCodec name ## _encoder = { \
- #name, \
- CODEC_TYPE_AUDIO, \
- id, \
- sizeof(context), \
- name ## _encode_init, \
- name ## _encode_frame, \
- name ## _encode_close, \
- NULL, \
-};
-
-#define DEFINE_DECODER(id, name, context) \
-AVCodec name ## _decoder = { \
- #name, \
- CODEC_TYPE_AUDIO, \
- id, \
- sizeof(context), \
- name ## _decode_init, \
- NULL, \
- NULL, \
- 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)