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

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. // unpack.c
  9. // This module actually handles the decompression of the audio data, except
  10. // for the entropy decoding which is handled by the words.c module. For
  11. // maximum efficiency, the conversion is isolated to tight loops that handle
  12. // an entire buffer.
  13. #include "wavpack.h"
  14. #include <string.h>
  15. #include <math.h>
  16. #define LOSSY_MUTE
  17. //////////////////////////////// local macros /////////////////////////////////
  18. #define apply_weight_i(weight, sample) ((weight * sample + 512) >> 10)
  19. #define apply_weight_f(weight, sample) (((((sample & 0xffff) * weight) >> 9) + 
  20.     (((sample & ~0xffff) >> 9) * weight) + 1) >> 1)
  21. #define apply_weight(weight, sample) (sample != (short) sample ? 
  22.     apply_weight_f (weight, sample) : apply_weight_i (weight, sample))
  23. #define update_weight(weight, delta, source, result) 
  24.     if (source && result) weight -= ((((source ^ result) >> 30) & 2) - 1) * delta;
  25. #define update_weight_clip(weight, delta, source, result) 
  26.     if (source && result && ((source ^ result) < 0 ? (weight -= delta) < -1024 : (weight += delta) > 1024)) 
  27. weight = weight < 0 ? -1024 : 1024;
  28. ///////////////////////////// executable code ////////////////////////////////
  29. // This function initializes everything required to unpack a WavPack block
  30. // and must be called before unpack_samples() is called to obtain audio data.
  31. // It is assumed that the WavpackHeader has been read into the wps->wphdr
  32. // (in the current WavpackStream). This is where all the metadata blocks are
  33. // scanned up to the one containing the audio bitstream.
  34. int unpack_init (WavpackContext *wpc)
  35. {
  36.     WavpackStream *wps = &wpc->stream;
  37.     WavpackMetadata wpmd;
  38.     if (wps->wphdr.block_samples && wps->wphdr.block_index != (ulong) -1)
  39. wps->sample_index = wps->wphdr.block_index;
  40.     wps->mute_error = FALSE;
  41.     wps->crc = 0xffffffff;
  42.     
  43.     CLEAR (wps->wvbits);
  44.     CLEAR (wps->decorr_passes);
  45.     CLEAR (wps->w);
  46.     wps->wvbits.privdata = wpc->privdata;
  47.     while (read_metadata_buff (wpc, &wpmd)) {
  48. if (!process_metadata (wpc, &wpmd)) {
  49.     //strcpy (wpc->error_message, "invalid metadata!");
  50.     return FALSE;
  51. }
  52. if (wpmd.id == ID_WV_BITSTREAM)
  53.     break;
  54.     }
  55.     if (wps->wphdr.block_samples && !bs_is_open (&wps->wvbits)) {
  56. //strcpy (wpc->error_message, "invalid WavPack file!");
  57. return FALSE;
  58.     }
  59.     if (wps->wphdr.block_samples) {
  60. if ((wps->wphdr.flags & INT32_DATA) && wps->int32_sent_bits)
  61.     wpc->lossy_blocks = TRUE;
  62. if ((wps->wphdr.flags & FLOAT_DATA) &&
  63.     wps->float_flags & (FLOAT_EXCEPTIONS | FLOAT_ZEROS_SENT | FLOAT_SHIFT_SENT | FLOAT_SHIFT_SAME))
  64. wpc->lossy_blocks = TRUE;
  65.     }
  66.     return TRUE;
  67. }
  68. // This function initialzes the main bitstream for audio samples, which must
  69. // be in the "wv" file.
  70. int init_wv_bitstream (WavpackContext *wpc, WavpackMetadata *wpmd)
  71. {
  72.     WavpackStream *wps = &wpc->stream;
  73.     if (wpmd->data)
  74. bs_open_read (&wps->wvbits, wpmd->data, (char *) wpmd->data + wpmd->byte_length, NULL, 0);
  75.     else if (wpmd->byte_length)
  76. bs_open_read (&wps->wvbits, wpc->read_buffer, wpc->read_buffer + sizeof (wpc->read_buffer),
  77.     wpc->infile, wpmd->byte_length + (wpmd->byte_length & 1));
  78.     return TRUE;
  79. }
  80. // Read decorrelation terms from specified metadata block into the
  81. // decorr_passes array. The terms range from -3 to 8, plus 17 & 18;
  82. // other values are reserved and generate errors for now. The delta
  83. // ranges from 0 to 7 with all values valid. Note that the terms are
  84. // stored in the opposite order in the decorr_passes array compared
  85. // to packing.
  86. int read_decorr_terms (WavpackStream *wps, WavpackMetadata *wpmd)
  87. {
  88.     int termcnt = wpmd->byte_length;
  89.     uchar *byteptr = wpmd->data;
  90.     struct decorr_pass *dpp;
  91.     if (termcnt > MAX_NTERMS)
  92. return FALSE;
  93.     wps->num_terms = termcnt;
  94.     for (dpp = wps->decorr_passes + termcnt - 1; termcnt--; dpp--) {
  95. dpp->term = (int)(*byteptr & 0x1f) - 5;
  96. dpp->delta = (*byteptr++ >> 5) & 0x7;
  97. if (!dpp->term || dpp->term < -3 || (dpp->term > MAX_TERM && dpp->term < 17) || dpp->term > 18)
  98.     return FALSE;
  99.     }
  100.     return TRUE;
  101. }
  102. // Read decorrelation weights from specified metadata block into the
  103. // decorr_passes array. The weights range +/-1024, but are rounded and
  104. // truncated to fit in signed chars for metadata storage. Weights are
  105. // separate for the two channels and are specified from the "last" term
  106. // (first during encode). Unspecified weights are set to zero.
  107. int read_decorr_weights (WavpackStream *wps, WavpackMetadata *wpmd)
  108. {
  109.     int termcnt = wpmd->byte_length, tcount;
  110.     char *byteptr = wpmd->data;
  111.     struct decorr_pass *dpp;
  112.     if (!(wps->wphdr.flags & MONO_FLAG))
  113. termcnt /= 2;
  114.     if (termcnt > wps->num_terms)
  115. return FALSE;
  116.     for (tcount = wps->num_terms, dpp = wps->decorr_passes; tcount--; dpp++)
  117. dpp->weight_A = dpp->weight_B = 0;
  118.     while (--dpp >= wps->decorr_passes && termcnt--) {
  119. dpp->weight_A = restore_weight (*byteptr++);
  120. if (!(wps->wphdr.flags & MONO_FLAG))
  121.     dpp->weight_B = restore_weight (*byteptr++);
  122.     }
  123.     return TRUE;
  124. }
  125. // Read decorrelation samples from specified metadata block into the
  126. // decorr_passes array. The samples are signed 32-bit values, but are
  127. // converted to signed log2 values for storage in metadata. Values are
  128. // stored for both channels and are specified from the "last" term
  129. // (first during encode) with unspecified samples set to zero. The
  130. // number of samples stored varies with the actual term value, so
  131. // those must obviously come first in the metadata.
  132. int read_decorr_samples (WavpackStream *wps, WavpackMetadata *wpmd)
  133. {
  134.     uchar *byteptr = wpmd->data;
  135.     uchar *endptr = byteptr + wpmd->byte_length;
  136.     struct decorr_pass *dpp;
  137.     int tcount;
  138.     for (tcount = wps->num_terms, dpp = wps->decorr_passes; tcount--; dpp++) {
  139. CLEAR (dpp->samples_A);
  140. CLEAR (dpp->samples_B);
  141.     }
  142.     if (wps->wphdr.version == 0x402 && (wps->wphdr.flags & HYBRID_FLAG)) {
  143. byteptr += 2;
  144. if (!(wps->wphdr.flags & MONO_FLAG))
  145.     byteptr += 2;
  146.     }
  147.     while (dpp-- > wps->decorr_passes && byteptr < endptr)
  148. if (dpp->term > MAX_TERM) {
  149.     dpp->samples_A [0] = exp2s ((short)(byteptr [0] + (byteptr [1] << 8)));
  150.     dpp->samples_A [1] = exp2s ((short)(byteptr [2] + (byteptr [3] << 8)));
  151.     byteptr += 4;
  152.     if (!(wps->wphdr.flags & MONO_FLAG)) {
  153. dpp->samples_B [0] = exp2s ((short)(byteptr [0] + (byteptr [1] << 8)));
  154. dpp->samples_B [1] = exp2s ((short)(byteptr [2] + (byteptr [3] << 8)));
  155. byteptr += 4;
  156.     }
  157. }
  158. else if (dpp->term < 0) {
  159.     dpp->samples_A [0] = exp2s ((short)(byteptr [0] + (byteptr [1] << 8)));
  160.     dpp->samples_B [0] = exp2s ((short)(byteptr [2] + (byteptr [3] << 8)));
  161.     byteptr += 4;
  162. }
  163. else {
  164.     int m = 0, cnt = dpp->term;
  165.     while (cnt--) {
  166. dpp->samples_A [m] = exp2s ((short)(byteptr [0] + (byteptr [1] << 8)));
  167. byteptr += 2;
  168. if (!(wps->wphdr.flags & MONO_FLAG)) {
  169.     dpp->samples_B [m] = exp2s ((short)(byteptr [0] + (byteptr [1] << 8)));
  170.     byteptr += 2;
  171. }
  172. m++;
  173.     }
  174. }
  175.     return byteptr == endptr;
  176. }
  177. // Read the int32 data from the specified metadata into the specified stream.
  178. // This data is used for integer data that has more than 24 bits of magnitude
  179. // or, in some cases, used to eliminate redundant bits from any audio stream.
  180. int read_int32_info (WavpackStream *wps, WavpackMetadata *wpmd)
  181. {
  182.     int bytecnt = wpmd->byte_length;
  183.     char *byteptr = wpmd->data;
  184.     if (bytecnt != 4)
  185. return FALSE;
  186.     wps->int32_sent_bits = *byteptr++;
  187.     wps->int32_zeros = *byteptr++;
  188.     wps->int32_ones = *byteptr++;
  189.     wps->int32_dups = *byteptr;
  190.     return TRUE;
  191. }
  192. // Read multichannel information from metadata. The first byte is the total
  193. // number of channels and the following bytes represent the channel_mask
  194. // as described for Microsoft WAVEFORMATEX.
  195. int read_channel_info (WavpackContext *wpc, WavpackMetadata *wpmd)
  196. {
  197.     int bytecnt = wpmd->byte_length, shift = 0;
  198.     char *byteptr = wpmd->data;
  199.     ulong mask = 0;
  200.     if (!bytecnt || bytecnt > 5)
  201. return FALSE;
  202.     wpc->config.num_channels = *byteptr++;
  203.     while (--bytecnt) {
  204. mask |= (ulong) *byteptr++ << shift;
  205. shift += 8;
  206.     }
  207.     wpc->config.channel_mask = mask;
  208.     return TRUE;
  209. }
  210. // Read configuration information from metadata.
  211. int read_config_info (WavpackContext *wpc, WavpackMetadata *wpmd)
  212. {
  213.     int bytecnt = wpmd->byte_length;
  214.     uchar *byteptr = wpmd->data;
  215.     if (bytecnt >= 3) {
  216. wpc->config.flags &= 0xff;
  217. wpc->config.flags |= (long) *byteptr++ << 8;
  218. wpc->config.flags |= (long) *byteptr++ << 16;
  219. wpc->config.flags |= (long) *byteptr << 24;
  220.     }
  221.     return TRUE;
  222. }
  223. // This monster actually unpacks the WavPack bitstream(s) into the specified
  224. // buffer as 32-bit integers or floats (depending on orignal data). Lossy
  225. // samples will be clipped to their original limits (i.e. 8-bit samples are
  226. // clipped to -128/+127) but are still returned in longs. It is up to the
  227. // caller to potentially reformat this for the final output including any
  228. // multichannel distribution, block alignment or endian compensation. The
  229. // function unpack_init() must have been called and the entire WavPack block
  230. // must still be visible (although wps->blockbuff will not be accessed again).
  231. // For maximum clarity, the function is broken up into segments that handle
  232. // various modes. This makes for a few extra infrequent flag checks, but
  233. // makes the code easier to follow because the nesting does not become so
  234. // deep. For maximum efficiency, the conversion is isolated to tight loops
  235. // that handle an entire buffer. The function returns the total number of
  236. // samples unpacked, which can be less than the number requested if an error
  237. // occurs or the end of the block is reached.
  238. static void fixup_samples (WavpackStream *wps, long *buffer, ulong sample_count);
  239. long unpack_samples (WavpackContext *wpc, long *buffer, ulong sample_count)
  240. {
  241.     WavpackStream *wps = &wpc->stream;
  242.     ulong flags = wps->wphdr.flags, crc = wps->crc, i;
  243.     long mute_limit = (1L << ((flags & MAG_MASK) >> MAG_LSB)) + 2;
  244.     struct decorr_pass *dpp;
  245.     long read_word, *bptr;
  246.     int tcount, m = 0;
  247.     if (wps->sample_index + sample_count > wps->wphdr.block_index + wps->wphdr.block_samples)
  248. sample_count = wps->wphdr.block_index + wps->wphdr.block_samples - wps->sample_index;
  249.     if (wps->mute_error) {
  250. memset (buffer, 0, sample_count * (flags & MONO_FLAG ? 4 : 8));
  251. wps->sample_index += sample_count;
  252. return sample_count;
  253.     }
  254.     if (flags & HYBRID_FLAG)
  255. mute_limit *= 2;
  256.     ///////////////////// handle version 4 mono data /////////////////////////
  257.     if (flags & MONO_FLAG)
  258. for (bptr = buffer, i = 0; i < sample_count; ++i) {
  259.     if ((read_word = get_word (wps, 0)) == WORD_EOF)
  260. break;
  261.     for (tcount = wps->num_terms, dpp = wps->decorr_passes; tcount--; dpp++) {
  262. long sam, temp;
  263. int k;
  264. if (dpp->term > MAX_TERM) {
  265.     if (dpp->term & 1)
  266. sam = 2 * dpp->samples_A [0] - dpp->samples_A [1];
  267.     else
  268. sam = (3 * dpp->samples_A [0] - dpp->samples_A [1]) >> 1;
  269.     dpp->samples_A [1] = dpp->samples_A [0];
  270.     k = 0;
  271. }
  272. else {
  273.     sam = dpp->samples_A [m];
  274.     k = (m + dpp->term) & (MAX_TERM - 1);
  275. }
  276. temp = apply_weight (dpp->weight_A, sam) + read_word;
  277. update_weight (dpp->weight_A, dpp->delta, sam, read_word);
  278. dpp->samples_A [k] = read_word = temp;
  279.     }
  280.     if (labs (read_word) > mute_limit)
  281. break;
  282.     m = (m + 1) & (MAX_TERM - 1);
  283.     crc = crc * 3 + read_word;
  284.     *bptr++ = read_word;
  285. }
  286.     //////////////////// handle version 4 stereo data ////////////////////////
  287.     else
  288. for (bptr = buffer, i = 0; i < sample_count; ++i) {
  289.     long left, right, left2, right2;
  290.     if ((left = get_word (wps, 0)) == WORD_EOF ||
  291. (right = get_word (wps, 1)) == WORD_EOF)
  292.     break;
  293.     for (tcount = wps->num_terms, dpp = wps->decorr_passes; tcount--; dpp++)
  294. if (dpp->term > 0) {
  295.     long sam_A, sam_B;
  296.     int k;
  297.     if (dpp->term > MAX_TERM) {
  298. if (dpp->term & 1) {
  299.     sam_A = 2 * dpp->samples_A [0] - dpp->samples_A [1];
  300.     sam_B = 2 * dpp->samples_B [0] - dpp->samples_B [1];
  301. }
  302. else {
  303.     sam_A = (3 * dpp->samples_A [0] - dpp->samples_A [1]) >> 1;
  304.     sam_B = (3 * dpp->samples_B [0] - dpp->samples_B [1]) >> 1;
  305. }
  306. dpp->samples_A [1] = dpp->samples_A [0];
  307. dpp->samples_B [1] = dpp->samples_B [0];
  308. k = 0;
  309.     }
  310.     else {
  311. sam_A = dpp->samples_A [m];
  312. sam_B = dpp->samples_B [m];
  313. k = (m + dpp->term) & (MAX_TERM - 1);
  314.     }
  315.     left2 = apply_weight (dpp->weight_A, sam_A) + left;
  316.     right2 = apply_weight (dpp->weight_B, sam_B) + right;
  317.     update_weight (dpp->weight_A, dpp->delta, sam_A, left);
  318.     update_weight (dpp->weight_B, dpp->delta, sam_B, right);
  319.     dpp->samples_A [k] = left = left2;
  320.     dpp->samples_B [k] = right = right2;
  321. }
  322. else if (dpp->term == -1) {
  323.     left2 = left + apply_weight (dpp->weight_A, dpp->samples_A [0]);
  324.     update_weight_clip (dpp->weight_A, dpp->delta, dpp->samples_A [0], left);
  325.     left = left2;
  326.     right2 = right + apply_weight (dpp->weight_B, left2);
  327.     update_weight_clip (dpp->weight_B, dpp->delta, left2, right);
  328.     dpp->samples_A [0] = right = right2;
  329. }
  330. else {
  331.     right2 = right + apply_weight (dpp->weight_B, dpp->samples_B [0]);
  332.     update_weight_clip (dpp->weight_B, dpp->delta, dpp->samples_B [0], right);
  333.     right = right2;
  334.     if (dpp->term == -3) {
  335. right2 = dpp->samples_A [0];
  336. dpp->samples_A [0] = right;
  337.     }
  338.     left2 = left + apply_weight (dpp->weight_A, right2);
  339.     update_weight_clip (dpp->weight_A, dpp->delta, right2, left);
  340.     dpp->samples_B [0] = left = left2;
  341. }
  342.     m = (m + 1) & (MAX_TERM - 1);
  343.     if (flags & JOINT_STEREO)
  344. left += (right -= (left >> 1));
  345.     if (labs (left) > mute_limit || labs (right) > mute_limit)
  346. break;
  347.     crc = (crc * 3 + left) * 3 + right;
  348.     *bptr++ = left;
  349.     *bptr++ = right;
  350. }
  351.     if (i != sample_count) {
  352. memset (buffer, 0, sample_count * (flags & MONO_FLAG ? 4 : 8));
  353. wps->mute_error = TRUE;
  354. i = sample_count;
  355.     }
  356.     while (m--)
  357. for (tcount = wps->num_terms, dpp = wps->decorr_passes; tcount--; dpp++)
  358.     if (dpp->term > 0 && dpp->term <= MAX_TERM) {
  359. long temp = dpp->samples_A [0];
  360. memcpy (dpp->samples_A, dpp->samples_A + 1, sizeof (dpp->samples_A) - sizeof (dpp->samples_A [0]));
  361. dpp->samples_A [MAX_TERM - 1] = temp;
  362. temp = dpp->samples_B [0];
  363. memcpy (dpp->samples_B, dpp->samples_B + 1, sizeof (dpp->samples_B) - sizeof (dpp->samples_B [0]));
  364. dpp->samples_B [MAX_TERM - 1] = temp;
  365.     }
  366.     fixup_samples (wps, buffer, i);
  367.     if (flags & FLOAT_DATA)
  368. float_normalize (buffer, (flags & MONO_FLAG) ? i : i * 2,
  369.     127 - wps->float_norm_exp + wpc->norm_offset);
  370.     wps->sample_index += i;
  371.     wps->crc = crc;
  372.     return i;
  373. }
  374. // This is a helper function for unpack_samples() that applies several final
  375. // operations. First, if the data is 32-bit float data, then that conversion
  376. // is done in the float.c module (whether lossy or lossless) and we return.
  377. // Otherwise, if the extended integer data applies, then that operation is
  378. // executed first. If the unpacked data is lossy (and not corrected) then
  379. // it is clipped and shifted in a single operation. Otherwise, if it's
  380. // lossless then the last step is to apply the final shift (if any).
  381. static void fixup_samples (WavpackStream *wps, long *buffer, ulong sample_count)
  382. {
  383.     ulong flags = wps->wphdr.flags;
  384.     int shift = (flags & SHIFT_MASK) >> SHIFT_LSB;
  385.     if (flags & FLOAT_DATA) {
  386. float_values (wps, buffer, (flags & MONO_FLAG) ? sample_count : sample_count * 2);
  387. return;
  388.     }
  389.     if (flags & INT32_DATA) {
  390. ulong count = (flags & MONO_FLAG) ? sample_count : sample_count * 2;
  391. int sent_bits = wps->int32_sent_bits, zeros = wps->int32_zeros;
  392. int ones = wps->int32_ones, dups = wps->int32_dups;
  393. // ulong mask = (1 << sent_bits) - 1;
  394. long *dptr = buffer;
  395. if (!(flags & HYBRID_FLAG) && !sent_bits && (zeros + ones + dups))
  396.     while (count--) {
  397. if (zeros)
  398.     *dptr <<= zeros;
  399. else if (ones)
  400.     *dptr = ((*dptr + 1) << ones) - 1;
  401. else if (dups)
  402.     *dptr = ((*dptr + (*dptr & 1)) << dups) - (*dptr & 1);
  403. dptr++;
  404.     }
  405. else
  406.     shift += zeros + sent_bits + ones + dups;
  407.     }
  408.     if (flags & HYBRID_FLAG) {
  409. long min_value, max_value, min_shifted, max_shifted;
  410. switch (flags & BYTES_STORED) {
  411.     case 0:
  412. min_shifted = (min_value = -128 >> shift) << shift;
  413. max_shifted = (max_value = 127 >> shift) << shift;
  414. break;
  415.     case 1:
  416. min_shifted = (min_value = -32768 >> shift) << shift;
  417. max_shifted = (max_value = 32767 >> shift) << shift;
  418. break;
  419.     case 2:
  420. min_shifted = (min_value = -8388608 >> shift) << shift;
  421. max_shifted = (max_value = 8388607 >> shift) << shift;
  422. break;
  423.     case 3:
  424. min_shifted = (min_value = -(long)2147483648 >> shift) << shift;
  425. max_shifted = (max_value = (long) 2147483647 >> shift) << shift;
  426. break;
  427. }
  428. if (!(flags & MONO_FLAG))
  429.     sample_count *= 2;
  430. while (sample_count--) {
  431.     if (*buffer < min_value)
  432. *buffer++ = min_shifted;
  433.     else if (*buffer > max_value)
  434. *buffer++ = max_shifted;
  435.     else
  436. *buffer++ <<= shift;
  437. }
  438.     }
  439.     else if (shift) {
  440. if (!(flags & MONO_FLAG))
  441.     sample_count *= 2;
  442. while (sample_count--)
  443.     *buffer++ <<= shift;
  444.     }
  445. }
  446. // This function checks the crc value(s) for an unpacked block, returning the
  447. // number of actual crc errors detected for the block. The block must be
  448. // completely unpacked before this test is valid. For losslessly unpacked
  449. // blocks of float or extended integer data the extended crc is also checked.
  450. // Note that WavPack's crc is not a CCITT approved polynomial algorithm, but
  451. // is a much simpler method that is virtually as robust for real world data.
  452. int check_crc_error (WavpackContext *wpc)
  453. {
  454.     WavpackStream *wps = &wpc->stream;
  455.     int result = 0;
  456.     if (wps->crc != wps->wphdr.crc)
  457. ++result;
  458.     return result;
  459. }