typedef struct {
uint16_t FormatTag, NumChannels;
uint32_t SampleRate, BytesPerSecond;
uint16_t BlockAlign, BitsPerSample;
} WaveHeader3;
#define WaveHeader3Format "SSLLSS"
typedef struct {
char ckID [4];
int32_t ckSize;
int16_t version;
int16_t bits; int16_t flags, shift; int32_t total_samples, crc, crc2;
char extension [4], extra_bc, extras [3];
} WavpackHeader3;
#define WavpackHeader3Format "4LSSSSLLL4L"
#undef MONO_FLAG
#undef CROSS_DECORR
#undef JOINT_STEREO
#define MONO_FLAG 1
#define FAST_FLAG 2
#define RAW_FLAG 4
#define CALC_NOISE 8
#define HIGH_FLAG 0x10
#define BYTES_3 0x20
#define OVER_20 0x40
#define WVC_FLAG 0x80
#define LOSSY_SHAPE 0x100
#define VERY_FAST_FLAG 0x200
#define NEW_HIGH_FLAG 0x400
#define CANCEL_EXTREME 0x800
#define CROSS_DECORR 0x1000
#define NEW_DECORR_FLAG 0x2000
#define JOINT_STEREO 0x4000
#define EXTREME_DECORR 0x8000
#define STORED_FLAGS 0xfd77
#define NOT_STORED_FLAGS (~STORED_FLAGS & 0xffff)
typedef struct bs3 {
void (*wrap)(struct bs3 *bs);
unsigned char *buf, *end, *ptr;
uint32_t bufsiz, sr;
int64_t fpos;
WavpackStreamReader64 *reader;
int error, bc;
void *id;
} Bitstream3;
#define K_DEPTH 3
#define MAX_NTERMS3 18
typedef struct {
WavpackHeader3 wphdr;
Bitstream3 wvbits, wvcbits;
uint32_t sample_index;
int num_terms;
#ifndef NO_SEEKING
struct index_point {
char saved;
uint32_t sample_index;
} index_points [256];
unsigned char *unpack_data;
uint32_t unpack_size;
#endif
struct {
int32_t sum_level, left_level, right_level, diff_level;
int last_extra_bits, extra_bits_count, m;
int32_t error [2], crc;
int32_t sample [2] [2];
int weight [2] [1];
} dc;
struct decorr_pass decorr_passes [MAX_NTERMS3];
struct {
unsigned int index [2], k_value [2], ave_k [2];
uint32_t zeros_acc, ave_level [K_DEPTH] [2];
} w1;
struct { int last_dbits [2], last_delta_sign [2], bit_limit; } w2;
struct { int ave_dbits [2], bit_limit; } w3;
struct {
uint32_t fast_level [2], slow_level [2];
int bits_acc [2], bitrate;
} w4;
} WavpackStream3;
#define SAVE(destin, item) { memcpy (destin, &item, sizeof (item)); destin = (char *) destin + sizeof (item); }
#define RESTORE(item, source) { memcpy (&item, source, sizeof (item)); source = (char *) source + sizeof (item); }
void unpack_init3 (WavpackStream3 *wps);