Commit 3cb08886 authored by Laurent Aimar's avatar Laurent Aimar Committed by Kostya Shishkov

Factorize out integer sample value decoding for WavPack.

This is slightly modified patch by Laurent Aimar.

Originally committed as revision 18740 to svn://svn.ffmpeg.org/ffmpeg/trunk
parent c20a305b
......@@ -341,11 +341,27 @@ static int wv_get_value(WavpackContext *ctx, GetBitContext *gb, int channel, int
return sign ? ~ret : ret;
}
static inline int wv_get_value_integer(WavpackContext *s, uint32_t *crc, int S)
{
int bit;
if(s->extra_bits){
S <<= s->extra_bits;
if(s->got_extra_bits){
S |= get_bits(&s->gb_extra_bits, s->extra_bits);
*crc = *crc * 9 + (S&0xffff) * 3 + ((unsigned)S>>16);
}
}
bit = (S & s->and) | s->or;
return (((S + bit) << s->shift) - bit) << s->post_shift;
}
static inline int wv_unpack_stereo(WavpackContext *s, GetBitContext *gb, void *dst, const int hires)
{
int i, j, count = 0;
int last, t;
int A, B, L, L2, R, R2, bit;
int A, B, L, L2, R, R2;
int pos = 0;
uint32_t crc = 0xFFFFFFFF;
uint32_t crc_extra_bits = 0xFFFFFFFF;
......@@ -428,28 +444,14 @@ static inline int wv_unpack_stereo(WavpackContext *s, GetBitContext *gb, void *d
if(s->joint)
L += (R -= (L >> 1));
crc = (crc * 3 + L) * 3 + R;
if(s->extra_bits){
L <<= s->extra_bits;
R <<= s->extra_bits;
if(s->got_extra_bits){
L |= get_bits(&s->gb_extra_bits, s->extra_bits);
crc_extra_bits = crc_extra_bits * 9 + (L&0xffff) * 3 + ((unsigned)L>>16);
R |= get_bits(&s->gb_extra_bits, s->extra_bits);
crc_extra_bits = crc_extra_bits * 9 + (R&0xffff) * 3 + ((unsigned)R>>16);
}
if(hires){
*dst32++ = wv_get_value_integer(s, &crc_extra_bits, L);
*dst32++ = wv_get_value_integer(s, &crc_extra_bits, R);
} else {
*dst16++ = wv_get_value_integer(s, &crc_extra_bits, L);
*dst16++ = wv_get_value_integer(s, &crc_extra_bits, R);
}
bit = (L & s->and) | s->or;
if(hires)
*dst32++ = (((L + bit) << s->shift) - bit) << s->post_shift;
else
*dst16++ = (((L + bit) << s->shift) - bit) << s->post_shift;
bit = (R & s->and) | s->or;
if(hires)
*dst32++ = (((R + bit) << s->shift) - bit) << s->post_shift;
else
*dst16++ = (((R + bit) << s->shift) - bit) << s->post_shift;
count++;
}while(!last && count < s->samples);
......@@ -468,7 +470,7 @@ static inline int wv_unpack_mono(WavpackContext *s, GetBitContext *gb, void *dst
{
int i, j, count = 0;
int last, t;
int A, S, T, bit;
int A, S, T;
int pos = 0;
uint32_t crc = 0xFFFFFFFF;
uint32_t crc_extra_bits = 0xFFFFFFFF;
......@@ -502,20 +504,11 @@ static inline int wv_unpack_mono(WavpackContext *s, GetBitContext *gb, void *dst
}
pos = (pos + 1) & 7;
crc = crc * 3 + S;
if(s->extra_bits){
S <<= s->extra_bits;
if(s->got_extra_bits){
S |= get_bits(&s->gb_extra_bits, s->extra_bits);
crc_extra_bits = crc_extra_bits * 9 + (S&0xffff) * 3 + ((unsigned)S>>16);
}
}
bit = (S & s->and) | s->or;
if(hires)
*dst32++ = (((S + bit) << s->shift) - bit) << s->post_shift;
*dst32++ = wv_get_value_integer(s, &crc_extra_bits, S);
else
*dst16++ = (((S + bit) << s->shift) - bit) << s->post_shift;
*dst16++ = wv_get_value_integer(s, &crc_extra_bits, S);
count++;
}while(!last && count < s->samples);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment