mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2024-12-26 09:12:33 +00:00
adpcmenc: fix QT IMA ADPCM encoder
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
parent
bf334535b4
commit
b304244b54
@ -164,6 +164,39 @@ static inline unsigned char adpcm_ima_compress_sample(ADPCMChannelStatus *c, sho
|
|||||||
return nibble;
|
return nibble;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline unsigned char adpcm_ima_qt_compress_sample(ADPCMChannelStatus *c, short sample)
|
||||||
|
{
|
||||||
|
int delta = sample - c->prev_sample;
|
||||||
|
int mask, step = ff_adpcm_step_table[c->step_index];
|
||||||
|
int diff = step >> 3;
|
||||||
|
int nibble = 0;
|
||||||
|
|
||||||
|
if (delta < 0) {
|
||||||
|
nibble = 8;
|
||||||
|
delta = -delta;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (mask = 4; mask;) {
|
||||||
|
if (delta >= step) {
|
||||||
|
nibble |= mask;
|
||||||
|
delta -= step;
|
||||||
|
diff += step;
|
||||||
|
}
|
||||||
|
step >>= 1;
|
||||||
|
mask >>= 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nibble & 8)
|
||||||
|
c->prev_sample -= diff;
|
||||||
|
else
|
||||||
|
c->prev_sample += diff;
|
||||||
|
|
||||||
|
c->prev_sample = av_clip_int16(c->prev_sample);
|
||||||
|
c->step_index = av_clip(c->step_index + ff_adpcm_index_table[nibble], 0, 88);
|
||||||
|
|
||||||
|
return nibble;
|
||||||
|
}
|
||||||
|
|
||||||
static inline unsigned char adpcm_ms_compress_sample(ADPCMChannelStatus *c, short sample)
|
static inline unsigned char adpcm_ms_compress_sample(ADPCMChannelStatus *c, short sample)
|
||||||
{
|
{
|
||||||
int predictor, nibble, bias;
|
int predictor, nibble, bias;
|
||||||
@ -497,16 +530,14 @@ static int adpcm_encode_frame(AVCodecContext *avctx,
|
|||||||
adpcm_compress_trellis(avctx, samples+ch, buf, &c->status[ch], 64);
|
adpcm_compress_trellis(avctx, samples+ch, buf, &c->status[ch], 64);
|
||||||
for(i=0; i<64; i++)
|
for(i=0; i<64; i++)
|
||||||
put_bits(&pb, 4, buf[i^1]);
|
put_bits(&pb, 4, buf[i^1]);
|
||||||
c->status[ch].prev_sample = c->status[ch].predictor & ~0x7F;
|
|
||||||
} else {
|
} else {
|
||||||
for (i=0; i<64; i+=2){
|
for (i=0; i<64; i+=2){
|
||||||
int t1, t2;
|
int t1, t2;
|
||||||
t1 = adpcm_ima_compress_sample(&c->status[ch], samples[avctx->channels*(i+0)+ch]);
|
t1 = adpcm_ima_qt_compress_sample(&c->status[ch], samples[avctx->channels*(i+0)+ch]);
|
||||||
t2 = adpcm_ima_compress_sample(&c->status[ch], samples[avctx->channels*(i+1)+ch]);
|
t2 = adpcm_ima_qt_compress_sample(&c->status[ch], samples[avctx->channels*(i+1)+ch]);
|
||||||
put_bits(&pb, 4, t2);
|
put_bits(&pb, 4, t2);
|
||||||
put_bits(&pb, 4, t1);
|
put_bits(&pb, 4, t1);
|
||||||
}
|
}
|
||||||
c->status[ch].prev_sample &= ~0x7F;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
019564da45949d0b5278bd75ee9a4ac2 *./tests/data/acodec/adpcm_qt.aiff
|
057d27978b35888776512e4e9669a63b *./tests/data/acodec/adpcm_qt.aiff
|
||||||
281252 ./tests/data/acodec/adpcm_qt.aiff
|
281252 ./tests/data/acodec/adpcm_qt.aiff
|
||||||
a7fb054f7bd82270c8fd476eb9f5677c *./tests/data/adpcm_ima_qt.acodec.out.wav
|
3890343c0c20934e014d7ac93f5d65bd *./tests/data/adpcm_ima_qt.acodec.out.wav
|
||||||
stddev: 920.19 PSNR: 37.05 MAXDIFF:34029 bytes: 1058560/ 1058400
|
stddev: 918.61 PSNR: 37.07 MAXDIFF:34029 bytes: 1058560/ 1058400
|
||||||
|
Loading…
Reference in New Issue
Block a user