120 lines
4.0 KiB
C
120 lines
4.0 KiB
C
////////////////////////////////////////////////////////////////////////////
|
|
// **** WAVPACK **** //
|
|
// Hybrid Lossless Wavefile Compressor //
|
|
// Copyright (c) 1998 - 2006 Conifer Software. //
|
|
// All Rights Reserved. //
|
|
// Distributed under the BSD Software License (see license.txt) //
|
|
////////////////////////////////////////////////////////////////////////////
|
|
|
|
// wavpack3.h
|
|
|
|
// This header file contains all the additional definitions required for
|
|
// decoding old (versions 1, 2 & 3) WavPack files.
|
|
|
|
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; // added for version 2.00
|
|
int16_t flags, shift; // added for version 3.00
|
|
int32_t total_samples, crc, crc2;
|
|
char extension [4], extra_bc, extras [3];
|
|
} WavpackHeader3;
|
|
|
|
#define WavpackHeader3Format "4LSSSSLLL4L"
|
|
|
|
// these flags added for version 3
|
|
|
|
#undef MONO_FLAG // these definitions changed for WavPack 4.0
|
|
#undef CROSS_DECORR
|
|
#undef JOINT_STEREO
|
|
|
|
#define MONO_FLAG 1 // not stereo
|
|
#define FAST_FLAG 2 // non-adaptive predictor and stereo mode
|
|
#define RAW_FLAG 4 // raw mode (no .wav header)
|
|
#define CALC_NOISE 8 // calc noise in lossy mode (no longer stored)
|
|
#define HIGH_FLAG 0x10 // high quality mode (all modes)
|
|
#define BYTES_3 0x20 // files have 3-byte samples
|
|
#define OVER_20 0x40 // samples are over 20 bits
|
|
#define WVC_FLAG 0x80 // create/use .wvc (no longer stored)
|
|
#define LOSSY_SHAPE 0x100 // noise shape (lossy mode only)
|
|
#define VERY_FAST_FLAG 0x200 // double fast (no longer stored)
|
|
#define NEW_HIGH_FLAG 0x400 // new high quality mode (lossless only)
|
|
#define CANCEL_EXTREME 0x800 // cancel EXTREME_DECORR
|
|
#define CROSS_DECORR 0x1000 // decorrelate chans (with EXTREME_DECORR flag)
|
|
#define NEW_DECORR_FLAG 0x2000 // new high-mode decorrelator
|
|
#define JOINT_STEREO 0x4000 // joint stereo (lossy and high lossless)
|
|
#define EXTREME_DECORR 0x8000 // extra decorrelation (+ enables other flags)
|
|
|
|
#define STORED_FLAGS 0xfd77 // these are only flags that affect unpacking
|
|
#define NOT_STORED_FLAGS (~STORED_FLAGS & 0xffff)
|
|
|
|
// BitStream stuff (bits.c)
|
|
|
|
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);
|