mirror of
https://github.com/xenia-project/FFmpeg.git
synced 2024-11-24 20:19:55 +00:00
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
This commit is contained in:
parent
c20a305bca
commit
3cb088868c
@ -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);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user