/xbmc/cores/paplayer/WavPackCodec/extra1.c

https://github.com/tmacreturns/XBMC_wireless_setup · C · 563 lines · 431 code · 116 blank · 16 comment · 126 complexity · 24cdd0e17474c74f289614ce13fdeeb9 MD5 · raw file

  1. ////////////////////////////////////////////////////////////////////////////
  2. // **** WAVPACK **** //
  3. // Hybrid Lossless Wavefile Compressor //
  4. // Copyright (c) 1998 - 2005 Conifer Software. //
  5. // All Rights Reserved. //
  6. // Distributed under the BSD Software License (see license.txt) //
  7. ////////////////////////////////////////////////////////////////////////////
  8. // extra1.c
  9. // This module handles the "extra" mode for mono files.
  10. #include "wavpack.h"
  11. #include <stdlib.h>
  12. #include <stdio.h>
  13. #include <string.h>
  14. #include <math.h>
  15. // #define EXTRA_DUMP
  16. #ifdef DEBUG_ALLOC
  17. #define malloc malloc_db
  18. #define realloc realloc_db
  19. #define free free_db
  20. void *malloc_db (uint32_t size);
  21. void *realloc_db (void *ptr, uint32_t size);
  22. void free_db (void *ptr);
  23. int32_t dump_alloc (void);
  24. #endif
  25. //////////////////////////////// local tables ///////////////////////////////
  26. extern const char default_terms [], high_terms [], fast_terms [];
  27. // #define MINMAX_WEIGHTS
  28. #ifdef MINMAX_WEIGHTS
  29. static int32_t min_weight, max_weight;
  30. static int min_term, max_term;
  31. #endif
  32. static void decorr_mono_pass (int32_t *in_samples, int32_t *out_samples, uint32_t num_samples, struct decorr_pass *dpp, int dir)
  33. {
  34. int m = 0;
  35. dpp->sum_A = 0;
  36. #ifdef MINMAX_WEIGHTS
  37. dpp->min = dpp->max = 0;
  38. #endif
  39. if (dir < 0) {
  40. out_samples += (num_samples - 1);
  41. in_samples += (num_samples - 1);
  42. dir = -1;
  43. }
  44. else
  45. dir = 1;
  46. if (dpp->term > MAX_TERM) {
  47. while (num_samples--) {
  48. int32_t left, sam_A;
  49. if (dpp->term & 1)
  50. sam_A = 2 * dpp->samples_A [0] - dpp->samples_A [1];
  51. else
  52. sam_A = (3 * dpp->samples_A [0] - dpp->samples_A [1]) >> 1;
  53. dpp->samples_A [1] = dpp->samples_A [0];
  54. dpp->samples_A [0] = left = in_samples [0];
  55. left -= apply_weight (dpp->weight_A, sam_A);
  56. update_weight (dpp->weight_A, dpp->delta, sam_A, left);
  57. dpp->sum_A += dpp->weight_A;
  58. #ifdef MINMAX_WEIGHTS
  59. if (dpp->weight_A > dpp->max) dpp->max = dpp->weight_A;
  60. if (dpp->weight_A < dpp->min) dpp->min = dpp->weight_A;
  61. #endif
  62. out_samples [0] = left;
  63. in_samples += dir;
  64. out_samples += dir;
  65. }
  66. }
  67. else if (dpp->term > 0) {
  68. while (num_samples--) {
  69. int k = (m + dpp->term) & (MAX_TERM - 1);
  70. int32_t left, sam_A;
  71. sam_A = dpp->samples_A [m];
  72. dpp->samples_A [k] = left = in_samples [0];
  73. m = (m + 1) & (MAX_TERM - 1);
  74. left -= apply_weight (dpp->weight_A, sam_A);
  75. update_weight (dpp->weight_A, dpp->delta, sam_A, left);
  76. dpp->sum_A += dpp->weight_A;
  77. #ifdef MINMAX_WEIGHTS
  78. if (dpp->weight_A > dpp->max) dpp->max = dpp->weight_A;
  79. if (dpp->weight_A < dpp->min) dpp->min = dpp->weight_A;
  80. #endif
  81. out_samples [0] = left;
  82. in_samples += dir;
  83. out_samples += dir;
  84. }
  85. }
  86. #ifdef MINMAX_WEIGHTS
  87. if (dpp->term != 0) {
  88. if (dpp->max > max_weight) { max_weight = dpp->max; max_term = dpp->term; }
  89. if (dpp->min < min_weight) { min_weight = dpp->min; min_term = dpp->term; }
  90. }
  91. #endif
  92. if (m && dpp->term > 0 && dpp->term <= MAX_TERM) {
  93. int32_t temp_A [MAX_TERM];
  94. int k;
  95. memcpy (temp_A, dpp->samples_A, sizeof (dpp->samples_A));
  96. for (k = 0; k < MAX_TERM; k++) {
  97. dpp->samples_A [k] = temp_A [m];
  98. m = (m + 1) & (MAX_TERM - 1);
  99. }
  100. }
  101. }
  102. static void reverse_mono_decorr (struct decorr_pass *dpp)
  103. {
  104. if (dpp->term > MAX_TERM) {
  105. int32_t sam_A;
  106. if (dpp->term & 1)
  107. sam_A = 2 * dpp->samples_A [0] - dpp->samples_A [1];
  108. else
  109. sam_A = (3 * dpp->samples_A [0] - dpp->samples_A [1]) >> 1;
  110. dpp->samples_A [1] = dpp->samples_A [0];
  111. dpp->samples_A [0] = sam_A;
  112. if (dpp->term & 1)
  113. sam_A = 2 * dpp->samples_A [0] - dpp->samples_A [1];
  114. else
  115. sam_A = (3 * dpp->samples_A [0] - dpp->samples_A [1]) >> 1;
  116. dpp->samples_A [1] = sam_A;
  117. }
  118. else if (dpp->term > 1) {
  119. int i = 0, j = dpp->term - 1, cnt = dpp->term / 2;
  120. while (cnt--) {
  121. i &= (MAX_TERM - 1);
  122. j &= (MAX_TERM - 1);
  123. dpp->samples_A [i] ^= dpp->samples_A [j];
  124. dpp->samples_A [j] ^= dpp->samples_A [i];
  125. dpp->samples_A [i++] ^= dpp->samples_A [j--];
  126. }
  127. CLEAR (dpp->samples_A);
  128. }
  129. }
  130. static void decorr_mono_buffer (int32_t *samples, int32_t *outsamples, uint32_t num_samples, struct decorr_pass *dpp)
  131. {
  132. int delta = dpp->delta, pre_delta, term = dpp->term;
  133. struct decorr_pass dp;
  134. if (delta == 7)
  135. pre_delta = 7;
  136. else if (delta < 2)
  137. pre_delta = 3;
  138. else
  139. pre_delta = delta + 1;
  140. CLEAR (dp);
  141. dp.term = term;
  142. dp.delta = pre_delta;
  143. decorr_mono_pass (samples, outsamples, num_samples > 2048 ? 2048 : num_samples, &dp, -1);
  144. dp.delta = delta;
  145. reverse_mono_decorr (&dp);
  146. memcpy (dpp->samples_A, dp.samples_A, sizeof (dp.samples_A));
  147. dpp->weight_A = dp.weight_A;
  148. if (delta == 0) {
  149. dp.delta = 1;
  150. decorr_mono_pass (samples, outsamples, num_samples, &dp, 1);
  151. dp.delta = 0;
  152. memcpy (dp.samples_A, dpp->samples_A, sizeof (dp.samples_A));
  153. dpp->weight_A = dp.weight_A = dp.sum_A / num_samples;
  154. }
  155. // if (memcmp (dpp, &dp, sizeof (dp)))
  156. // error_line ("decorr_passes don't match, delta = %d", delta);
  157. decorr_mono_pass (samples, outsamples, num_samples, &dp, 1);
  158. }
  159. static void recurse_mono (WavpackContext *wpc, int32_t *sampleptrs[], struct decorr_pass dps[],
  160. int depth, int nterms, int delta, uint32_t input_bits, uint32_t *best_bits)
  161. {
  162. WavpackStream *wps = wpc->streams [wpc->current_stream];
  163. int term, branches = ((wpc->config.extra_flags & EXTRA_BRANCHES) >> 6) - depth;
  164. int32_t *samples, *outsamples;
  165. uint32_t term_bits [22], bits;
  166. if (branches < 1 || depth + 1 == nterms)
  167. branches = 1;
  168. CLEAR (term_bits);
  169. samples = sampleptrs [depth];
  170. outsamples = sampleptrs [depth + 1];
  171. for (term = 1; term <= 18; ++term) {
  172. if (term == 17 && branches == 1 && depth + 1 < nterms)
  173. continue;
  174. if (term >= 9 && term <= 16)
  175. if (term > MAX_TERM || !(wpc->config.flags & CONFIG_HIGH_FLAG) || (wpc->config.extra_flags & EXTRA_SKIP_8TO16))
  176. continue;
  177. if ((wpc->config.flags & CONFIG_FAST_FLAG) && (term >= 5 && term <= 16))
  178. continue;
  179. dps [depth].term = term;
  180. dps [depth].delta = delta;
  181. decorr_mono_buffer (samples, outsamples, wps->wphdr.block_samples, &dps [depth]);
  182. bits = log2buffer (outsamples, wps->wphdr.block_samples);
  183. if (bits < *best_bits) {
  184. *best_bits = bits;
  185. CLEAR (wps->decorr_passes);
  186. memcpy (wps->decorr_passes, dps, sizeof (dps [0]) * (depth + 1));
  187. memcpy (sampleptrs [nterms + 1], sampleptrs [depth + 1], wps->wphdr.block_samples * 4);
  188. }
  189. term_bits [term + 3] = bits;
  190. }
  191. while (depth + 1 < nterms && branches--) {
  192. uint32_t local_best_bits = input_bits;
  193. int best_term = 0, i;
  194. for (i = 0; i < 22; ++i)
  195. if (term_bits [i] && term_bits [i] < local_best_bits) {
  196. local_best_bits = term_bits [i];
  197. term_bits [i] = 0;
  198. best_term = i - 3;
  199. }
  200. if (!best_term)
  201. break;
  202. dps [depth].term = best_term;
  203. dps [depth].delta = delta;
  204. decorr_mono_buffer (samples, outsamples, wps->wphdr.block_samples, &dps [depth]);
  205. // if (log2buffer (outsamples, wps->wphdr.block_samples * 2) != local_best_bits)
  206. // error_line ("data doesn't match!");
  207. recurse_mono (wpc, sampleptrs, dps, depth + 1, nterms, delta, local_best_bits, best_bits);
  208. }
  209. }
  210. static void delta_mono (WavpackContext *wpc, int32_t *sampleptrs[], struct decorr_pass dps[],
  211. int nterms, uint32_t *best_bits)
  212. {
  213. WavpackStream *wps = wpc->streams [wpc->current_stream];
  214. int lower = FALSE, delta, d;
  215. uint32_t bits;
  216. if (wps->decorr_passes [0].term)
  217. delta = wps->decorr_passes [0].delta;
  218. else
  219. return;
  220. for (d = delta - 1; d >= 0; --d) {
  221. int i;
  222. if (!d && (wps->wphdr.flags & HYBRID_FLAG))
  223. break;
  224. for (i = 0; i < nterms && wps->decorr_passes [i].term; ++i) {
  225. dps [i].term = wps->decorr_passes [i].term;
  226. dps [i].delta = d;
  227. decorr_mono_buffer (sampleptrs [i], sampleptrs [i+1], wps->wphdr.block_samples, &dps [i]);
  228. }
  229. bits = log2buffer (sampleptrs [i], wps->wphdr.block_samples);
  230. if (bits < *best_bits) {
  231. lower = TRUE;
  232. *best_bits = bits;
  233. CLEAR (wps->decorr_passes);
  234. memcpy (wps->decorr_passes, dps, sizeof (dps [0]) * i);
  235. memcpy (sampleptrs [nterms + 1], sampleptrs [i], wps->wphdr.block_samples * 4);
  236. }
  237. else
  238. break;
  239. }
  240. for (d = delta + 1; !lower && d <= 7; ++d) {
  241. int i;
  242. for (i = 0; i < nterms && wps->decorr_passes [i].term; ++i) {
  243. dps [i].term = wps->decorr_passes [i].term;
  244. dps [i].delta = d;
  245. decorr_mono_buffer (sampleptrs [i], sampleptrs [i+1], wps->wphdr.block_samples, &dps [i]);
  246. }
  247. bits = log2buffer (sampleptrs [i], wps->wphdr.block_samples);
  248. if (bits < *best_bits) {
  249. *best_bits = bits;
  250. CLEAR (wps->decorr_passes);
  251. memcpy (wps->decorr_passes, dps, sizeof (dps [0]) * i);
  252. memcpy (sampleptrs [nterms + 1], sampleptrs [i], wps->wphdr.block_samples * 4);
  253. }
  254. else
  255. break;
  256. }
  257. }
  258. static void sort_mono (WavpackContext *wpc, int32_t *sampleptrs[], struct decorr_pass dps[],
  259. int nterms, uint32_t *best_bits)
  260. {
  261. WavpackStream *wps = wpc->streams [wpc->current_stream];
  262. int reversed = TRUE;
  263. uint32_t bits;
  264. while (reversed) {
  265. int ri, i;
  266. memcpy (dps, wps->decorr_passes, sizeof (wps->decorr_passes));
  267. reversed = FALSE;
  268. for (ri = 0; ri < nterms && wps->decorr_passes [ri].term; ++ri) {
  269. if (ri + 1 >= nterms || !wps->decorr_passes [ri+1].term)
  270. break;
  271. if (wps->decorr_passes [ri].term == wps->decorr_passes [ri+1].term) {
  272. decorr_mono_buffer (sampleptrs [ri], sampleptrs [ri+1], wps->wphdr.block_samples, &dps [ri]);
  273. continue;
  274. }
  275. dps [ri] = wps->decorr_passes [ri+1];
  276. dps [ri+1] = wps->decorr_passes [ri];
  277. for (i = ri; i < nterms && wps->decorr_passes [i].term; ++i)
  278. decorr_mono_buffer (sampleptrs [i], sampleptrs [i+1], wps->wphdr.block_samples, &dps [i]);
  279. bits = log2buffer (sampleptrs [i], wps->wphdr.block_samples);
  280. if (bits < *best_bits) {
  281. reversed = TRUE;
  282. *best_bits = bits;
  283. CLEAR (wps->decorr_passes);
  284. memcpy (wps->decorr_passes, dps, sizeof (dps [0]) * i);
  285. memcpy (sampleptrs [nterms + 1], sampleptrs [i], wps->wphdr.block_samples * 4);
  286. }
  287. else {
  288. dps [ri] = wps->decorr_passes [ri];
  289. dps [ri+1] = wps->decorr_passes [ri+1];
  290. decorr_mono_buffer (sampleptrs [ri], sampleptrs [ri+1], wps->wphdr.block_samples, &dps [ri]);
  291. }
  292. }
  293. }
  294. }
  295. #define EXTRA_ADVANCED (EXTRA_BRANCHES | EXTRA_SORT_FIRST | EXTRA_SORT_LAST | EXTRA_TRY_DELTAS)
  296. void analyze_mono (WavpackContext *wpc, int32_t *samples)
  297. {
  298. WavpackStream *wps = wpc->streams [wpc->current_stream];
  299. #ifdef EXTRA_DUMP
  300. uint32_t bits, best_bits, default_bits, cnt;
  301. #else
  302. uint32_t bits, best_bits, cnt;
  303. #endif
  304. const char *decorr_terms = default_terms, *tp;
  305. int32_t *sampleptrs [MAX_NTERMS+2], *lptr;
  306. struct decorr_pass dps [MAX_NTERMS];
  307. int nterms, i;
  308. CLEAR (wps->decorr_passes);
  309. cnt = wps->wphdr.block_samples;
  310. lptr = samples;
  311. while (cnt--)
  312. if (*lptr++)
  313. break;
  314. if (cnt == (uint32_t) -1) {
  315. scan_word (wps, samples, wps->wphdr.block_samples, -1);
  316. wps->num_terms = 0;
  317. return;
  318. }
  319. if (wpc->config.flags & CONFIG_HIGH_FLAG)
  320. decorr_terms = high_terms;
  321. else if (wpc->config.flags & CONFIG_FAST_FLAG)
  322. decorr_terms = fast_terms;
  323. for (nterms = 0, tp = decorr_terms; *tp; tp++)
  324. if (*tp > 0)
  325. ++nterms;
  326. if (wpc->config.extra_flags & EXTRA_TERMS)
  327. if ((nterms += (wpc->config.extra_flags & EXTRA_TERMS) >> 10) > MAX_NTERMS)
  328. nterms = MAX_NTERMS;
  329. for (i = 0; i < nterms + 2; ++i)
  330. sampleptrs [i] = malloc (wps->wphdr.block_samples * 4);
  331. memcpy (sampleptrs [nterms + 1], samples, wps->wphdr.block_samples * 4);
  332. best_bits = log2buffer (sampleptrs [nterms + 1], wps->wphdr.block_samples);
  333. memcpy (sampleptrs [0], samples, wps->wphdr.block_samples * 4);
  334. CLEAR (dps);
  335. for (tp = decorr_terms, i = 0; *tp; tp++)
  336. if (*tp > 0) {
  337. dps [i].term = *tp;
  338. dps [i].delta = 2;
  339. decorr_mono_buffer (sampleptrs [i], sampleptrs [i+1], wps->wphdr.block_samples, &dps [i]);
  340. ++i;
  341. }
  342. #ifdef EXTRA_DUMP
  343. default_bits = bits = log2buffer (sampleptrs [i], wps->wphdr.block_samples);
  344. #else
  345. bits = log2buffer (sampleptrs [i], wps->wphdr.block_samples);
  346. #endif
  347. if (bits < best_bits) {
  348. best_bits = bits;
  349. CLEAR (wps->decorr_passes);
  350. memcpy (wps->decorr_passes, dps, sizeof (dps [0]) * i);
  351. memcpy (sampleptrs [nterms + 1], sampleptrs [i], wps->wphdr.block_samples * 4);
  352. }
  353. if ((wps->wphdr.flags & HYBRID_FLAG) && (wpc->config.extra_flags & EXTRA_ADVANCED)) {
  354. int shaping_weight, new = wps->wphdr.flags & NEW_SHAPING;
  355. int32_t *rptr = sampleptrs [nterms + 1], error = 0, temp;
  356. scan_word (wps, rptr, wps->wphdr.block_samples, -1);
  357. cnt = wps->wphdr.block_samples;
  358. lptr = sampleptrs [0];
  359. if (wps->wphdr.flags & HYBRID_SHAPE) {
  360. while (cnt--) {
  361. shaping_weight = (wps->dc.shaping_acc [0] += wps->dc.shaping_delta [0]) >> 16;
  362. temp = -apply_weight (shaping_weight, error);
  363. if (new && shaping_weight < 0 && temp) {
  364. if (temp == error)
  365. temp = (temp < 0) ? temp + 1 : temp - 1;
  366. lptr [0] += (error = nosend_word (wps, rptr [0], 0) - rptr [0] + temp);
  367. }
  368. else
  369. lptr [0] += (error = nosend_word (wps, rptr [0], 0) - rptr [0]) + temp;
  370. lptr++;
  371. rptr++;
  372. }
  373. wps->dc.shaping_acc [0] -= wps->dc.shaping_delta [0] * wps->wphdr.block_samples;
  374. }
  375. else
  376. while (cnt--) {
  377. lptr [0] += nosend_word (wps, rptr [0], 0) - rptr [0];
  378. lptr++;
  379. rptr++;
  380. }
  381. memcpy (dps, wps->decorr_passes, sizeof (dps));
  382. for (i = 0; i < nterms && dps [i].term; ++i)
  383. decorr_mono_buffer (sampleptrs [i], sampleptrs [i + 1], wps->wphdr.block_samples, dps + i);
  384. #ifdef EXTRA_DUMP
  385. best_bits = default_bits = log2buffer (sampleptrs [i], wps->wphdr.block_samples);
  386. #else
  387. best_bits = log2buffer (sampleptrs [i], wps->wphdr.block_samples);
  388. #endif
  389. CLEAR (wps->decorr_passes);
  390. memcpy (wps->decorr_passes, dps, sizeof (dps [0]) * i);
  391. memcpy (sampleptrs [nterms + 1], sampleptrs [i], wps->wphdr.block_samples * 4);
  392. }
  393. if (wpc->config.extra_flags & EXTRA_BRANCHES)
  394. recurse_mono (wpc, sampleptrs, dps, 0, nterms, (int) floor (wps->delta_decay + 0.5),
  395. log2buffer (sampleptrs [0], wps->wphdr.block_samples), &best_bits);
  396. if (wpc->config.extra_flags & EXTRA_SORT_FIRST)
  397. sort_mono (wpc, sampleptrs, dps, nterms, &best_bits);
  398. if (wpc->config.extra_flags & EXTRA_TRY_DELTAS) {
  399. delta_mono (wpc, sampleptrs, dps, nterms, &best_bits);
  400. if ((wpc->config.extra_flags & EXTRA_ADJUST_DELTAS) && wps->decorr_passes [0].term)
  401. wps->delta_decay = (wps->delta_decay * 2.0 + wps->decorr_passes [0].delta) / 3.0;
  402. else
  403. wps->delta_decay = 2.0;
  404. }
  405. if (wpc->config.extra_flags & EXTRA_SORT_LAST)
  406. sort_mono (wpc, sampleptrs, dps, nterms, &best_bits);
  407. #if 0
  408. memcpy (dps, wps->decorr_passes, sizeof (dps));
  409. for (i = 0; i < nterms && dps [i].term; ++i)
  410. decorr_mono_pass (sampleptrs [i], sampleptrs [i + 1], wps->wphdr.block_samples, dps + i, 1);
  411. if (log2buffer (sampleptrs [i], wps->wphdr.block_samples) != best_bits)
  412. error_line ("(1) samples do not match!");
  413. if (log2buffer (sampleptrs [nterms + 1], wps->wphdr.block_samples) != best_bits)
  414. error_line ("(2) samples do not match!");
  415. #endif
  416. scan_word (wps, sampleptrs [nterms + 1], wps->wphdr.block_samples, -1);
  417. #ifdef EXTRA_DUMP
  418. if (wpc->config.extra_flags & EXTRA_DUMP_TERMS) {
  419. char string [256], substring [20];
  420. int i;
  421. sprintf (string, "M: delta = %.4f%%, terms =",
  422. ((double) best_bits - default_bits) / 256.0 / wps->wphdr.block_samples / 32.0 * 100.0);
  423. for (i = 0; i < nterms; ++i) {
  424. if (wps->decorr_passes [i].term) {
  425. if (i && wps->decorr_passes [i-1].delta == wps->decorr_passes [i].delta)
  426. sprintf (substring, " %d", wps->decorr_passes [i].term);
  427. else
  428. sprintf (substring, " %d->%d", wps->decorr_passes [i].term,
  429. wps->decorr_passes [i].delta);
  430. }
  431. else
  432. sprintf (substring, " *");
  433. strcat (string, substring);
  434. }
  435. error_line (string);
  436. }
  437. #endif
  438. for (i = 0; i < nterms; ++i)
  439. if (!wps->decorr_passes [i].term)
  440. break;
  441. wps->num_terms = i;
  442. for (i = 0; i < nterms + 2; ++i)
  443. free (sampleptrs [i]);
  444. #ifdef MINMAX_WEIGHTS
  445. error_line ("weight range = %ld (%d) to %ld (%d)", min_weight, min_term, max_weight, max_term);
  446. #endif
  447. }