32
33
* adx2wav & wav2adx http://www.geocities.co.jp/Playtown/2004/
35
/* 18 bytes <-> 32 samples */
37
static void adx_encode(unsigned char *adx,const short *wav,PREV *prev)
36
static void adx_encode(ADXContext *c, uint8_t *adx, const int16_t *wav,
37
ADXChannelState *prev, int channels)
45
int data[BLOCK_SAMPLES];
49
for (i = 0, j = 0; j < 32; i += channels, j++) {
50
d = ((s0<<14) - SCALE1*s1 + SCALE2*s2)/BASEVOL;
51
d = ((s0 << COEFF_BITS) - c->coeff[0] * s1 - c->coeff[1] * s2) >> COEFF_BITS;
62
if (max==0 && min==0) {
63
if (max == 0 && min == 0) {
64
memset(adx, 0, BLOCK_SIZE);
67
if (max/7>-min/8) scale = max/7;
68
if (max / 7 > -min / 8)
70
if (scale==0) scale=1;
72
76
AV_WB16(adx, scale);
75
adx[i+2] = ((data[i*2]/scale)<<4) | ((data[i*2+1]/scale)&0xf);
78
init_put_bits(&pb, adx + 2, 16);
79
for (i = 0; i < BLOCK_SAMPLES; i++)
80
put_sbits(&pb, 4, av_clip(data[i] / scale, -8, 7));
79
static int adx_encode_header(AVCodecContext *avctx,unsigned char *buf,size_t bufsize)
84
#define HEADER_SIZE 36
86
static int adx_encode_header(AVCodecContext *avctx, uint8_t *buf, int bufsize)
83
uint32_t offset; /* 0x80000000 + sample start - 4 */
84
unsigned char unknown1[3]; /* 03 12 04 */
85
unsigned char channel; /* 1 or 2 */
88
uint32_t unknown2; /* 01 f4 03 00 */
89
uint32_t unknown3; /* 00 00 00 00 */
90
uint32_t unknown4; /* 00 00 00 00 */
95
long loop_start_sample;
101
} adxhdr; /* big endian */
102
/* offset-6 "(c)CRI" */
104
AV_WB32(buf+0x00,0x80000000|0x20);
105
AV_WB32(buf+0x04,0x03120400|avctx->channels);
106
AV_WB32(buf+0x08,avctx->sample_rate);
107
AV_WB32(buf+0x0c,0); /* FIXME: set after */
108
AV_WB32(buf+0x10,0x01040300);
109
AV_WB32(buf+0x14,0x00000000);
110
AV_WB32(buf+0x18,0x00000000);
111
memcpy(buf+0x1c,"\0\0(c)CRI",8);
88
ADXContext *c = avctx->priv_data;
90
if (bufsize < HEADER_SIZE)
91
return AVERROR(EINVAL);
93
bytestream_put_be16(&buf, 0x8000); /* header signature */
94
bytestream_put_be16(&buf, HEADER_SIZE - 4); /* copyright offset */
95
bytestream_put_byte(&buf, 3); /* encoding */
96
bytestream_put_byte(&buf, BLOCK_SIZE); /* block size */
97
bytestream_put_byte(&buf, 4); /* sample size */
98
bytestream_put_byte(&buf, avctx->channels); /* channels */
99
bytestream_put_be32(&buf, avctx->sample_rate); /* sample rate */
100
bytestream_put_be32(&buf, 0); /* total sample count */
101
bytestream_put_be16(&buf, c->cutoff); /* cutoff frequency */
102
bytestream_put_byte(&buf, 3); /* version */
103
bytestream_put_byte(&buf, 0); /* flags */
104
bytestream_put_be32(&buf, 0); /* unknown */
105
bytestream_put_be32(&buf, 0); /* loop enabled */
106
bytestream_put_be16(&buf, 0); /* padding */
107
bytestream_put_buffer(&buf, "(c)CRI", 6); /* copyright signature */
115
112
static av_cold int adx_encode_init(AVCodecContext *avctx)
117
if (avctx->channels > 2)
118
return -1; /* only stereo or mono =) */
119
avctx->frame_size = 32;
121
avctx->coded_frame= avcodec_alloc_frame();
122
avctx->coded_frame->key_frame= 1;
124
// avctx->bit_rate = avctx->sample_rate*avctx->channels*18*8/32;
126
av_log(avctx, AV_LOG_DEBUG, "adx encode init\n");
114
ADXContext *c = avctx->priv_data;
116
if (avctx->channels > 2) {
117
av_log(avctx, AV_LOG_ERROR, "Invalid number of channels\n");
118
return AVERROR(EINVAL);
120
avctx->frame_size = BLOCK_SAMPLES;
122
avctx->coded_frame = avcodec_alloc_frame();
124
/* the cutoff can be adjusted, but this seems to work pretty well */
126
ff_adx_calculate_coeffs(c->cutoff, avctx->sample_rate, COEFF_BITS, c->coeff);
131
131
static av_cold int adx_encode_close(AVCodecContext *avctx)
133
133
av_freep(&avctx->coded_frame);
138
static int adx_encode_frame(AVCodecContext *avctx,
139
uint8_t *frame, int buf_size, void *data)
137
static int adx_encode_frame(AVCodecContext *avctx, uint8_t *frame,
138
int buf_size, void *data)
141
ADXContext *c = avctx->priv_data;
142
const short *samples = data;
143
unsigned char *dst = frame;
144
int rest = avctx->frame_size;
148
ffmpeg.c: do_audio_out()
149
frame_bytes = enc->frame_size * 2 * enc->channels;
152
// printf("sz=%d ",buf_size); fflush(stdout);
140
ADXContext *c = avctx->priv_data;
141
const int16_t *samples = data;
142
uint8_t *dst = frame;
153
145
if (!c->header_parsed) {
154
int hdrsize = adx_encode_header(avctx,dst,buf_size);
147
if ((hdrsize = adx_encode_header(avctx, dst, buf_size)) < 0) {
148
av_log(avctx, AV_LOG_ERROR, "output buffer is too small\n");
149
return AVERROR(EINVAL);
156
153
c->header_parsed = 1;
159
if (avctx->channels==1) {
161
adx_encode(dst,samples,c->prev);
172
tmpbuf[i] = samples[i*2];
173
tmpbuf[i+32] = samples[i*2+1];
176
adx_encode(dst,tmpbuf,c->prev);
177
adx_encode(dst+18,tmpbuf+32,c->prev+1);
155
if (buf_size < BLOCK_SIZE * avctx->channels) {
156
av_log(avctx, AV_LOG_ERROR, "output buffer is too small\n");
157
return AVERROR(EINVAL);
160
for (ch = 0; ch < avctx->channels; ch++) {
161
adx_encode(c, dst, samples + ch, &c->prev[ch], avctx->channels);
186
167
AVCodec ff_adpcm_adx_encoder = {
195
.sample_fmts = (const enum AVSampleFormat[]){AV_SAMPLE_FMT_S16,AV_SAMPLE_FMT_NONE},
196
.long_name = NULL_IF_CONFIG_SMALL("SEGA CRI ADX ADPCM"),
169
.type = AVMEDIA_TYPE_AUDIO,
170
.id = CODEC_ID_ADPCM_ADX,
171
.priv_data_size = sizeof(ADXContext),
172
.init = adx_encode_init,
173
.encode = adx_encode_frame,
174
.close = adx_encode_close,
175
.sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_S16,
176
AV_SAMPLE_FMT_NONE },
177
.long_name = NULL_IF_CONFIG_SMALL("SEGA CRI ADX ADPCM"),