adxenc: avoid stereo deinterleaving

This commit is contained in:
Justin Ruggles 2011-12-19 09:52:32 -05:00
parent 6b77f07074
commit 613668210b
1 changed files with 7 additions and 15 deletions

View File

@ -34,11 +34,11 @@
*/ */
static void adx_encode(ADXContext *c, uint8_t *adx, const int16_t *wav, static void adx_encode(ADXContext *c, uint8_t *adx, const int16_t *wav,
ADXChannelState *prev) ADXChannelState *prev, int channels)
{ {
PutBitContext pb; PutBitContext pb;
int scale; int scale;
int i; int i, j;
int s0, s1, s2, d; int s0, s1, s2, d;
int max = 0; int max = 0;
int min = 0; int min = 0;
@ -46,10 +46,10 @@ static void adx_encode(ADXContext *c, uint8_t *adx, const int16_t *wav,
s1 = prev->s1; s1 = prev->s1;
s2 = prev->s2; s2 = prev->s2;
for (i = 0; i < 32; i++) { for (i = 0, j = 0; j < 32; i += channels, j++) {
s0 = wav[i]; s0 = wav[i];
d = ((s0 << COEFF_BITS) - c->coeff[0] * s1 - c->coeff[1] * s2) >> COEFF_BITS; d = ((s0 << COEFF_BITS) - c->coeff[0] * s1 - c->coeff[1] * s2) >> COEFF_BITS;
data[i] = d; data[j] = d;
if (max < d) if (max < d)
max = d; max = d;
if (min > d) if (min > d)
@ -138,23 +138,15 @@ static int adx_encode_frame(AVCodecContext *avctx, uint8_t *frame,
if (avctx->channels == 1) { if (avctx->channels == 1) {
while (rest >= 32) { while (rest >= 32) {
adx_encode(c, dst, samples, c->prev); adx_encode(c, dst, samples, c->prev, avctx->channels);
dst += 18; dst += 18;
samples += 32; samples += 32;
rest -= 32; rest -= 32;
} }
} else { } else {
while (rest >= 32*2) { while (rest >= 32*2) {
int16_t tmpbuf[32*2]; adx_encode(c, dst, samples, c->prev, avctx->channels);
int i; adx_encode(c, dst + 18, samples + 1, c->prev + 1, avctx->channels);
for (i = 0; i < 32; i++) {
tmpbuf[i ] = samples[i*2 ];
tmpbuf[i+32] = samples[i*2+1];
}
adx_encode(c, dst, tmpbuf, c->prev );
adx_encode(c, 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;