wavpack.h
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:12k
源码类别:

Windows CE

开发平台:

C/C++

  1. ////////////////////////////////////////////////////////////////////////////
  2. //                           **** WAVPACK ****                            //
  3. //                  Hybrid Lossless Wavefile Compressor                   //
  4. //              Copyright (c) 1998 - 2004 Conifer Software.               //
  5. //                          All Rights Reserved.                          //
  6. //      Distributed under the BSD Software License (see license.txt)      //
  7. ////////////////////////////////////////////////////////////////////////////
  8. // wavpack.h
  9. // This header file contains all the definitions required by WavPack.
  10. typedef unsigned char uchar;
  11. #if !defined(__GNUC__) || defined(WIN32) || defined(__palmos__) || defined(__SYMBIAN32__)
  12. typedef unsigned short ushort;
  13. typedef unsigned long ulong;
  14. typedef unsigned int uint;
  15. #elif defined(__APPLE__)
  16. typedef unsigned long ulong;
  17. #endif
  18. // This structure is used to access the individual fields of 32-bit ieee
  19. // floating point numbers. This will not be compatible with compilers that
  20. // allocate bit fields from the most significant bits, although I'm not sure
  21. // how common that is.
  22. typedef struct {
  23.     unsigned mantissa : 23;
  24.     unsigned exponent : 8;
  25.     unsigned sign : 1;
  26. } f32;
  27. #include <stdio.h>
  28. #include <stdlib.h>
  29. #define FALSE 0
  30. #define TRUE 1
  31. ////////////////////////////// WavPack Header /////////////////////////////////
  32. // Note that this is the ONLY structure that is written to (or read from)
  33. // WavPack 4.0 files, and is the preamble to every block in both the .wv
  34. // and .wvc files.
  35. typedef struct {
  36.     char ckID [4];
  37.     ulong ckSize;
  38.     short version;
  39.     uchar track_no, index_no;
  40.     ulong total_samples, block_index, block_samples, flags, crc;
  41. } WavpackHeader;
  42. #define WavpackHeaderFormat "4LS2LLLLL"
  43. // or-values for "flags"
  44. #define BYTES_STORED 3 // 1-4 bytes/sample
  45. #define MONO_FLAG 4 // not stereo
  46. #define HYBRID_FLAG 8 // hybrid mode
  47. #define JOINT_STEREO 0x10 // joint stereo
  48. #define CROSS_DECORR 0x20 // no-delay cross decorrelation
  49. #define HYBRID_SHAPE 0x40 // noise shape (hybrid mode only)
  50. #define FLOAT_DATA 0x80 // ieee 32-bit floating point data
  51. #define INT32_DATA 0x100 // special extended int handling
  52. #define HYBRID_BITRATE 0x200 // bitrate noise (hybrid mode only)
  53. #define HYBRID_BALANCE 0x400 // balance noise (hybrid stereo mode only)
  54. #define INITIAL_BLOCK 0x800 // initial block of multichannel segment
  55. #define FINAL_BLOCK 0x1000 // final block of multichannel segment
  56. #define SHIFT_LSB 13
  57. #define SHIFT_MASK (0x1fL << SHIFT_LSB)
  58. #define MAG_LSB 18
  59. #define MAG_MASK (0x1fL << MAG_LSB)
  60. #define SRATE_LSB 23
  61. #define SRATE_MASK (0xfL << SRATE_LSB)
  62. #define IGNORED_FLAGS 0x18000000 // reserved, but ignore if encountered
  63. #define NEW_SHAPING 0x20000000 // use IIR filter for negative shaping
  64. #define UNKNOWN_FLAGS 0xC0000000 // also reserved, but refuse decode if
  65. //  encountered
  66. //////////////////////////// WavPack Metadata /////////////////////////////////
  67. // This is an internal representation of metadata.
  68. typedef struct {
  69.     long byte_length;
  70.     void *data;
  71.     uchar id;
  72. } WavpackMetadata;
  73. #define ID_OPTIONAL_DATA 0x20
  74. #define ID_ODD_SIZE 0x40
  75. #define ID_LARGE 0x80
  76. #define ID_DUMMY 0x0
  77. #define ID_ENCODER_INFO 0x1
  78. #define ID_DECORR_TERMS 0x2
  79. #define ID_DECORR_WEIGHTS 0x3
  80. #define ID_DECORR_SAMPLES 0x4
  81. #define ID_ENTROPY_VARS 0x5
  82. #define ID_HYBRID_PROFILE 0x6
  83. #define ID_SHAPING_WEIGHTS 0x7
  84. #define ID_FLOAT_INFO 0x8
  85. #define ID_INT32_INFO 0x9
  86. #define ID_WV_BITSTREAM 0xa
  87. #define ID_WVC_BITSTREAM 0xb
  88. #define ID_WVX_BITSTREAM 0xc
  89. #define ID_CHANNEL_INFO 0xd
  90. #define ID_RIFF_HEADER (ID_OPTIONAL_DATA | 0x1)
  91. #define ID_RIFF_TRAILER (ID_OPTIONAL_DATA | 0x2)
  92. #define ID_REPLAY_GAIN (ID_OPTIONAL_DATA | 0x3)
  93. #define ID_CUESHEET (ID_OPTIONAL_DATA | 0x4)
  94. #define ID_CONFIG_BLOCK (ID_OPTIONAL_DATA | 0x5)
  95. #define ID_MD5_CHECKSUM (ID_OPTIONAL_DATA | 0x6)
  96. ///////////////////////// WavPack Configuration ///////////////////////////////
  97. // This internal structure is used during encode to provide configuration to
  98. // the encoding engine and during decoding to provide fle information back to
  99. // the higher level functions. Not all fields are used in both modes.
  100. typedef struct {
  101.     int bits_per_sample, bytes_per_sample;
  102.     int qmode, flags, xmode, num_channels, float_norm_exp;
  103.     long block_samples, extra_flags, sample_rate, channel_mask;
  104. } WavpackConfig;
  105. #define CONFIG_BYTES_STORED 3 // 1-4 bytes/sample
  106. #define CONFIG_MONO_FLAG 4 // not stereo
  107. #define CONFIG_HYBRID_FLAG 8 // hybrid mode
  108. #define CONFIG_JOINT_STEREO 0x10 // joint stereo
  109. #define CONFIG_CROSS_DECORR 0x20 // no-delay cross decorrelation
  110. #define CONFIG_HYBRID_SHAPE 0x40 // noise shape (hybrid mode only)
  111. #define CONFIG_FLOAT_DATA 0x80 // ieee 32-bit floating point data
  112. #define CONFIG_ADOBE_MODE 0x100 // "adobe" mode for 32-bit floats
  113. #define CONFIG_FAST_FLAG 0x200 // fast mode
  114. #define CONFIG_VERY_FAST_FLAG 0x400 // double fast
  115. #define CONFIG_HIGH_FLAG 0x800 // high quality mode
  116. #define CONFIG_VERY_HIGH_FLAG 0x1000 // double high (not used yet)
  117. #define CONFIG_BITRATE_KBPS 0x2000 // bitrate is kbps, not bits / sample
  118. #define CONFIG_AUTO_SHAPING 0x4000 // automatic noise shaping
  119. #define CONFIG_SHAPE_OVERRIDE 0x8000 // shaping mode specified
  120. #define CONFIG_JOINT_OVERRIDE 0x10000 // joint-stereo mode specified
  121. #define CONFIG_COPY_TIME 0x20000 // copy file-time from source
  122. #define CONFIG_CREATE_EXE 0x40000 // create executable (not yet)
  123. #define CONFIG_CREATE_WVC 0x80000 // create correction file
  124. #define CONFIG_OPTIMIZE_WVC 0x100000 // maximize bybrid compression
  125. #define CONFIG_QUALITY_MODE 0x200000 // psychoacoustic quality mode
  126. #define CONFIG_RAW_FLAG 0x400000 // raw mode (not implemented yet)
  127. #define CONFIG_CALC_NOISE 0x800000 // calc noise in hybrid mode
  128. #define CONFIG_LOSSY_MODE 0x1000000 // obsolete (for information)
  129. #define CONFIG_EXTRA_MODE 0x2000000 // extra processing mode
  130. #define CONFIG_SKIP_WVX 0x4000000 // no wvx stream w/ floats & big ints
  131. #define CONFIG_MD5_CHECKSUM 0x8000000 // compute & store MD5 signature
  132. #define CONFIG_QUIET_MODE 0x10000000 // don't report progress %
  133. //////////////////////////////// WavPack Stream ///////////////////////////////
  134. // This internal structure contains everything required to handle a WavPack
  135. // "stream", which is defined as a stereo or mono stream of audio samples. For
  136. // multichannel audio several of these would be required. Each stream contains
  137. // pointers to hold a complete allocated block of WavPack data, although it's
  138. // possible to decode WavPack blocks without buffering an entire block.
  139. typedef long (*read_stream)(void *, long, void *);
  140. typedef struct bs {
  141.     uchar *buf, *end, *ptr;
  142.     void (*wrap)(struct bs *bs);
  143.     ulong file_bytes, sr;
  144.     int error, bc;
  145.     read_stream file;
  146.     void *privdata;
  147. } Bitstream;
  148. #define MAX_NTERMS 16
  149. #define MAX_TERM 8
  150. struct decorr_pass {
  151.     short term, delta, weight_A, weight_B;
  152.     long samples_A [MAX_TERM], samples_B [MAX_TERM];
  153. };
  154. typedef struct {
  155.     WavpackHeader wphdr;
  156.     int num_terms, mute_error;
  157.     ulong sample_index, crc;
  158.     Bitstream wvbits;
  159.     uchar int32_sent_bits, int32_zeros, int32_ones, int32_dups;
  160.     uchar float_flags, float_shift, float_max_exp, float_norm_exp;
  161.  
  162.     struct decorr_pass decorr_passes [MAX_NTERMS];
  163.     struct {
  164. ulong bitrate_delta [2], bitrate_acc [2];
  165. ulong median [3] [2], slow_level [2], error_limit [2];
  166. ulong pend_data, holding_one, zeros_acc;
  167. int holding_zero, pend_count;
  168.     } w;
  169. } WavpackStream;
  170. // flags for float_flags:
  171. #define FLOAT_SHIFT_ONES 1 // bits left-shifted into float = '1'
  172. #define FLOAT_SHIFT_SAME 2 // bits left-shifted into float are the same
  173. #define FLOAT_SHIFT_SENT 4 // bits shifted into float are sent literally
  174. #define FLOAT_ZEROS_SENT 8 // "zeros" are not all real zeros
  175. #define FLOAT_NEG_ZEROS  0x10 // contains negative zeros
  176. #define FLOAT_EXCEPTIONS 0x20 // contains exceptions (inf, nan, etc.)
  177. /////////////////////////////// WavPack Context ///////////////////////////////
  178. // This internal structure holds everything required to encode or decode WavPack
  179. // files. It is recommended that direct access to this structure be minimized
  180. // and the provided utilities used instead.
  181. typedef struct {
  182.     WavpackConfig config;
  183.     WavpackStream stream;
  184.     uchar read_buffer [1024];
  185.     char error_message [80];
  186.     read_stream infile;
  187.     void *privdata;
  188.     ulong total_samples, crc_errors, first_flags;
  189.     int open_flags, norm_offset, reduced_channels, lossy_blocks;
  190. } WavpackContext;
  191. //////////////////////// function prototypes and macros //////////////////////
  192. #define CLEAR(destin) memset (&destin, 0, sizeof (destin));
  193. // bits.c
  194. void bs_open_read (Bitstream *bs, uchar *buffer_start, uchar *buffer_end, read_stream file, ulong file_bytes);
  195. #define bs_is_open(bs) ((bs)->ptr != NULL)
  196. #define getbit(bs) ( 
  197.     (((bs)->bc) ? 
  198. ((bs)->bc--, (bs)->sr & 1) : 
  199.     (((++((bs)->ptr) != (bs)->end) ? (void) 0 : (bs)->wrap (bs)), (bs)->bc = 7, ((bs)->sr = *((bs)->ptr)) & 1) 
  200.     ) ? 
  201. ((bs)->sr >>= 1, 1) : 
  202. ((bs)->sr >>= 1, 0) 
  203. )
  204. #define getbits(value, nbits, bs) { 
  205.     while ((nbits) > (bs)->bc) { 
  206. if (++((bs)->ptr) == (bs)->end) (bs)->wrap (bs); 
  207. (bs)->sr |= (long)*((bs)->ptr) << (bs)->bc; 
  208. (bs)->bc += 8; 
  209.     } 
  210.     *(value) = (bs)->sr; 
  211.     (bs)->sr >>= (nbits); 
  212.     (bs)->bc -= (nbits); 
  213. }
  214. void little_endian_to_native (void *data, char *format);
  215. void native_to_little_endian (void *data, char *format);
  216. // unpack.c
  217. int unpack_init (WavpackContext *wpc);
  218. int init_wv_bitstream (WavpackContext *wpc, WavpackMetadata *wpmd);
  219. int read_decorr_terms (WavpackStream *wps, WavpackMetadata *wpmd);
  220. int read_decorr_weights (WavpackStream *wps, WavpackMetadata *wpmd);
  221. int read_decorr_samples (WavpackStream *wps, WavpackMetadata *wpmd);
  222. int read_float_info (WavpackStream *wps, WavpackMetadata *wpmd);
  223. int read_int32_info (WavpackStream *wps, WavpackMetadata *wpmd);
  224. int read_channel_info (WavpackContext *wpc, WavpackMetadata *wpmd);
  225. int read_config_info (WavpackContext *wpc, WavpackMetadata *wpmd);
  226. long unpack_samples (WavpackContext *wpc, long *buffer, ulong sample_count);
  227. int check_crc_error (WavpackContext *wpc);
  228. // metadata.c stuff
  229. int read_metadata_buff (WavpackContext *wpc, WavpackMetadata *wpmd);
  230. int process_metadata (WavpackContext *wpc, WavpackMetadata *wpmd);
  231. // words.c stuff
  232. int read_entropy_vars (WavpackStream *wps, WavpackMetadata *wpmd);
  233. int read_hybrid_profile (WavpackStream *wps, WavpackMetadata *wpmd);
  234. long get_word (WavpackStream *wps, int chan);
  235. long exp2s (int log);
  236. int restore_weight (char weight);
  237. #define WORD_EOF (1L << 31)
  238. // float.c
  239. int read_float_info (WavpackStream *wps, WavpackMetadata *wpmd);
  240. void float_values (WavpackStream *wps, long *values, long num_values);
  241. void float_normalize (long *values, long num_values, int delta_exp);
  242. // wputils.c
  243. WavpackContext *WavpackOpenFileInput (read_stream infile, char *error, void *privdata);
  244. int WavpackClose(WavpackContext *wpc);
  245. int WavpackGetMode (WavpackContext *wpc);
  246. #define MODE_WVC 0x1
  247. #define MODE_LOSSLESS 0x2
  248. #define MODE_HYBRID 0x4
  249. #define MODE_FLOAT 0x8
  250. #define MODE_VALID_TAG 0x10
  251. #define MODE_HIGH 0x20
  252. #define MODE_FAST 0x40
  253. void WavpackFlush (WavpackContext *wpc); //TCPMP
  254. ulong WavpackUnpackSamples (WavpackContext *wpc, long *buffer, ulong samples);
  255. ulong WavpackGetNumSamples (WavpackContext *wpc);
  256. ulong WavpackGetSampleIndex (WavpackContext *wpc);
  257. int WavpackGetNumErrors (WavpackContext *wpc);
  258. int WavpackLossyBlocks (WavpackContext *wpc);
  259. ulong WavpackGetSampleRate (WavpackContext *wpc);
  260. int WavpackGetBitsPerSample (WavpackContext *wpc);
  261. int WavpackGetBytesPerSample (WavpackContext *wpc);
  262. int WavpackGetNumChannels (WavpackContext *wpc);
  263. int WavpackGetReducedChannels (WavpackContext *wpc);