/xbmc/cores/paplayer/WavPackCodec/extra2.c

https://github.com/tmacreturns/XBMC_wireless_setup · C · 792 lines · 635 code · 140 blank · 17 comment · 195 complexity · f4a2ed115c2f5d0829b9ab9925e68505 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. // extra2.c
  9. // This module handles the "extra" mode for stereo 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. extern const char default_terms [], high_terms [], fast_terms [];
  26. // #define MINMAX_WEIGHTS
  27. #ifdef MINMAX_WEIGHTS
  28. static int32_t min_weight, max_weight;
  29. static int min_term, max_term;
  30. #endif
  31. static void decorr_stereo_pass (int32_t *in_samples, int32_t *out_samples, int32_t num_samples, struct decorr_pass *dpp, int dir)
  32. {
  33. int m = 0;
  34. dpp->sum_A = dpp->sum_B = 0;
  35. #ifdef MINMAX_WEIGHTS
  36. dpp->min = dpp->max = 0;
  37. #endif
  38. if (dir < 0) {
  39. out_samples += (num_samples - 1) * 2;
  40. in_samples += (num_samples - 1) * 2;
  41. dir = -2;
  42. }
  43. else
  44. dir = 2;
  45. if (dpp->term == 17) {
  46. while (num_samples--) {
  47. int32_t left, right;
  48. int32_t sam_A, sam_B;
  49. sam_A = 2 * dpp->samples_A [0] - dpp->samples_A [1];
  50. dpp->samples_A [1] = dpp->samples_A [0];
  51. dpp->samples_A [0] = left = in_samples [0];
  52. left -= apply_weight (dpp->weight_A, sam_A);
  53. update_weight (dpp->weight_A, dpp->delta, sam_A, left);
  54. dpp->sum_A += dpp->weight_A;
  55. out_samples [0] = left;
  56. sam_B = 2 * dpp->samples_B [0] - dpp->samples_B [1];
  57. dpp->samples_B [1] = dpp->samples_B [0];
  58. dpp->samples_B [0] = right = in_samples [1];
  59. right -= apply_weight (dpp->weight_B, sam_B);
  60. update_weight (dpp->weight_B, dpp->delta, sam_B, right);
  61. dpp->sum_B += dpp->weight_B;
  62. out_samples [1] = right;
  63. #ifdef MINMAX_WEIGHTS
  64. if (dpp->weight_A > dpp->max) dpp->max = dpp->weight_A;
  65. if (dpp->weight_B > dpp->max) dpp->max = dpp->weight_B;
  66. if (dpp->weight_A < dpp->min) dpp->min = dpp->weight_A;
  67. if (dpp->weight_B < dpp->min) dpp->min = dpp->weight_B;
  68. #endif
  69. in_samples += dir;
  70. out_samples += dir;
  71. }
  72. }
  73. else if (dpp->term == 18) {
  74. while (num_samples--) {
  75. int32_t left, right;
  76. int32_t sam_A, sam_B;
  77. sam_A = (3 * dpp->samples_A [0] - dpp->samples_A [1]) >> 1;
  78. dpp->samples_A [1] = dpp->samples_A [0];
  79. dpp->samples_A [0] = left = in_samples [0];
  80. left -= apply_weight (dpp->weight_A, sam_A);
  81. update_weight (dpp->weight_A, dpp->delta, sam_A, left);
  82. dpp->sum_A += dpp->weight_A;
  83. out_samples [0] = left;
  84. sam_B = (3 * dpp->samples_B [0] - dpp->samples_B [1]) >> 1;
  85. dpp->samples_B [1] = dpp->samples_B [0];
  86. dpp->samples_B [0] = right = in_samples [1];
  87. right -= apply_weight (dpp->weight_B, sam_B);
  88. update_weight (dpp->weight_B, dpp->delta, sam_B, right);
  89. dpp->sum_B += dpp->weight_B;
  90. out_samples [1] = right;
  91. #ifdef MINMAX_WEIGHTS
  92. if (dpp->weight_A > dpp->max) dpp->max = dpp->weight_A;
  93. if (dpp->weight_B > dpp->max) dpp->max = dpp->weight_B;
  94. if (dpp->weight_A < dpp->min) dpp->min = dpp->weight_A;
  95. if (dpp->weight_B < dpp->min) dpp->min = dpp->weight_B;
  96. #endif
  97. in_samples += dir;
  98. out_samples += dir;
  99. }
  100. }
  101. else if (dpp->term > 0) {
  102. while (num_samples--) {
  103. int k = (m + dpp->term) & (MAX_TERM - 1);
  104. int32_t left, right;
  105. int32_t sam_A, sam_B;
  106. sam_A = dpp->samples_A [m];
  107. dpp->samples_A [k] = left = in_samples [0];
  108. left -= apply_weight (dpp->weight_A, sam_A);
  109. update_weight (dpp->weight_A, dpp->delta, sam_A, left);
  110. dpp->sum_A += dpp->weight_A;
  111. out_samples [0] = left;
  112. sam_B = dpp->samples_B [m];
  113. dpp->samples_B [k] = right = in_samples [1];
  114. right -= apply_weight (dpp->weight_B, sam_B);
  115. update_weight (dpp->weight_B, dpp->delta, sam_B, right);
  116. dpp->sum_B += dpp->weight_B;
  117. out_samples [1] = right;
  118. #ifdef MINMAX_WEIGHTS
  119. if (dpp->weight_A > dpp->max) dpp->max = dpp->weight_A;
  120. if (dpp->weight_B > dpp->max) dpp->max = dpp->weight_B;
  121. if (dpp->weight_A < dpp->min) dpp->min = dpp->weight_A;
  122. if (dpp->weight_B < dpp->min) dpp->min = dpp->weight_B;
  123. #endif
  124. in_samples += dir;
  125. out_samples += dir;
  126. m = (m + 1) & (MAX_TERM - 1);
  127. }
  128. }
  129. else if (dpp->term == -1) {
  130. while (num_samples--) {
  131. int32_t left = in_samples [0];
  132. int32_t right = in_samples [1];
  133. int32_t sam_A = dpp->samples_A [0], sam_B = left;
  134. dpp->samples_A [0] = right;
  135. right -= apply_weight (dpp->weight_B, sam_B);
  136. update_weight_clip (dpp->weight_B, dpp->delta, sam_B, right);
  137. left -= apply_weight (dpp->weight_A, sam_A);
  138. update_weight_clip (dpp->weight_A, dpp->delta, sam_A, left);
  139. dpp->sum_A += dpp->weight_A;
  140. dpp->sum_B += dpp->weight_B;
  141. #ifdef MINMAX_WEIGHTS
  142. if (dpp->weight_A > dpp->max) dpp->max = dpp->weight_A;
  143. if (dpp->weight_B > dpp->max) dpp->max = dpp->weight_B;
  144. if (dpp->weight_A < dpp->min) dpp->min = dpp->weight_A;
  145. if (dpp->weight_B < dpp->min) dpp->min = dpp->weight_B;
  146. #endif
  147. out_samples [0] = left;
  148. out_samples [1] = right;
  149. in_samples += dir;
  150. out_samples += dir;
  151. }
  152. }
  153. else if (dpp->term == -2) {
  154. while (num_samples--) {
  155. int32_t left = in_samples [0];
  156. int32_t right = in_samples [1];
  157. int32_t sam_B = dpp->samples_B [0], sam_A = right;
  158. dpp->samples_B [0] = left;
  159. left -= apply_weight (dpp->weight_A, sam_A);
  160. update_weight_clip (dpp->weight_A, dpp->delta, sam_A, left);
  161. right -= apply_weight (dpp->weight_B, sam_B);
  162. update_weight_clip (dpp->weight_B, dpp->delta, sam_B, right);
  163. dpp->sum_A += dpp->weight_A;
  164. dpp->sum_B += dpp->weight_B;
  165. #ifdef MINMAX_WEIGHTS
  166. if (dpp->weight_A > dpp->max) dpp->max = dpp->weight_A;
  167. if (dpp->weight_B > dpp->max) dpp->max = dpp->weight_B;
  168. if (dpp->weight_A < dpp->min) dpp->min = dpp->weight_A;
  169. if (dpp->weight_B < dpp->min) dpp->min = dpp->weight_B;
  170. #endif
  171. out_samples [0] = left;
  172. out_samples [1] = right;
  173. in_samples += dir;
  174. out_samples += dir;
  175. }
  176. }
  177. else if (dpp->term == -3) {
  178. while (num_samples--) {
  179. int32_t left = in_samples [0];
  180. int32_t right = in_samples [1];
  181. int32_t sam_A = dpp->samples_A [0], sam_B = dpp->samples_B [0];
  182. dpp->samples_A [0] = right;
  183. dpp->samples_B [0] = left;
  184. left -= apply_weight (dpp->weight_A, sam_A);
  185. update_weight_clip (dpp->weight_A, dpp->delta, sam_A, left);
  186. right -= apply_weight (dpp->weight_B, sam_B);
  187. update_weight_clip (dpp->weight_B, dpp->delta, sam_B, right);
  188. dpp->sum_A += dpp->weight_A;
  189. dpp->sum_B += dpp->weight_B;
  190. #ifdef MINMAX_WEIGHTS
  191. if (dpp->weight_A > dpp->max) dpp->max = dpp->weight_A;
  192. if (dpp->weight_B > dpp->max) dpp->max = dpp->weight_B;
  193. if (dpp->weight_A < dpp->min) dpp->min = dpp->weight_A;
  194. if (dpp->weight_B < dpp->min) dpp->min = dpp->weight_B;
  195. #endif
  196. out_samples [0] = left;
  197. out_samples [1] = right;
  198. in_samples += dir;
  199. out_samples += dir;
  200. }
  201. }
  202. #ifdef MINMAX_WEIGHTS
  203. if (dpp->term != 0) {
  204. if (dpp->max > max_weight) { max_weight = dpp->max; max_term = dpp->term; }
  205. if (dpp->min < min_weight) { min_weight = dpp->min; min_term = dpp->term; }
  206. }
  207. #endif
  208. if (m && dpp->term > 0 && dpp->term <= MAX_TERM) {
  209. int32_t temp_A [MAX_TERM], temp_B [MAX_TERM];
  210. int k;
  211. memcpy (temp_A, dpp->samples_A, sizeof (dpp->samples_A));
  212. memcpy (temp_B, dpp->samples_B, sizeof (dpp->samples_B));
  213. for (k = 0; k < MAX_TERM; k++) {
  214. dpp->samples_A [k] = temp_A [m];
  215. dpp->samples_B [k] = temp_B [m];
  216. m = (m + 1) & (MAX_TERM - 1);
  217. }
  218. }
  219. }
  220. static void reverse_decorr (struct decorr_pass *dpp)
  221. {
  222. if (dpp->term > MAX_TERM) {
  223. int32_t sam_A, sam_B;
  224. if (dpp->term & 1) {
  225. sam_A = 2 * dpp->samples_A [0] - dpp->samples_A [1];
  226. sam_B = 2 * dpp->samples_B [0] - dpp->samples_B [1];
  227. }
  228. else {
  229. sam_A = (3 * dpp->samples_A [0] - dpp->samples_A [1]) >> 1;
  230. sam_B = (3 * dpp->samples_B [0] - dpp->samples_B [1]) >> 1;
  231. }
  232. dpp->samples_A [1] = dpp->samples_A [0];
  233. dpp->samples_B [1] = dpp->samples_B [0];
  234. dpp->samples_A [0] = sam_A;
  235. dpp->samples_B [0] = sam_B;
  236. if (dpp->term & 1) {
  237. sam_A = 2 * dpp->samples_A [0] - dpp->samples_A [1];
  238. sam_B = 2 * dpp->samples_B [0] - dpp->samples_B [1];
  239. }
  240. else {
  241. sam_A = (3 * dpp->samples_A [0] - dpp->samples_A [1]) >> 1;
  242. sam_B = (3 * dpp->samples_B [0] - dpp->samples_B [1]) >> 1;
  243. }
  244. dpp->samples_A [1] = sam_A;
  245. dpp->samples_B [1] = sam_B;
  246. }
  247. else if (dpp->term > 1) {
  248. int i = 0, j = dpp->term - 1, cnt = dpp->term / 2;
  249. while (cnt--) {
  250. i &= (MAX_TERM - 1);
  251. j &= (MAX_TERM - 1);
  252. dpp->samples_A [i] ^= dpp->samples_A [j];
  253. dpp->samples_A [j] ^= dpp->samples_A [i];
  254. dpp->samples_A [i] ^= dpp->samples_A [j];
  255. dpp->samples_B [i] ^= dpp->samples_B [j];
  256. dpp->samples_B [j] ^= dpp->samples_B [i];
  257. dpp->samples_B [i++] ^= dpp->samples_B [j--];
  258. }
  259. // CLEAR (dpp->samples_A);
  260. // CLEAR (dpp->samples_B);
  261. }
  262. else if (dpp->term == -1) {
  263. }
  264. else if (dpp->term == -2) {
  265. }
  266. else if (dpp->term == -3) {
  267. }
  268. }
  269. static void decorr_stereo_buffer (int32_t *samples, int32_t *outsamples, int32_t num_samples, struct decorr_pass *dpp)
  270. {
  271. int delta = dpp->delta, pre_delta;
  272. int term = dpp->term;
  273. struct decorr_pass dp;
  274. if (delta == 7)
  275. pre_delta = 7;
  276. else if (delta < 2)
  277. pre_delta = 3;
  278. else
  279. pre_delta = delta + 1;
  280. CLEAR (dp);
  281. dp.term = term;
  282. dp.delta = pre_delta;
  283. decorr_stereo_pass (samples, outsamples, num_samples > 2048 ? 2048 : num_samples, &dp, -1);
  284. dp.delta = delta;
  285. reverse_decorr (&dp);
  286. memcpy (dpp->samples_A, dp.samples_A, sizeof (dp.samples_A));
  287. memcpy (dpp->samples_B, dp.samples_B, sizeof (dp.samples_B));
  288. dpp->weight_A = dp.weight_A;
  289. dpp->weight_B = dp.weight_B;
  290. if (delta == 0) {
  291. dp.delta = 1;
  292. decorr_stereo_pass (samples, outsamples, num_samples, &dp, 1);
  293. dp.delta = 0;
  294. memcpy (dp.samples_A, dpp->samples_A, sizeof (dp.samples_A));
  295. memcpy (dp.samples_B, dpp->samples_B, sizeof (dp.samples_B));
  296. dpp->weight_A = dp.weight_A = dp.sum_A / num_samples;
  297. dpp->weight_B = dp.weight_B = dp.sum_B / num_samples;
  298. }
  299. // if (memcmp (dpp, &dp, sizeof (dp)))
  300. // error_line ("decorr_passes don't match, delta = %d", delta);
  301. decorr_stereo_pass (samples, outsamples, num_samples, &dp, 1);
  302. }
  303. static void recurse_stereo (WavpackContext *wpc, int32_t *sampleptrs[], struct decorr_pass dps[],
  304. int depth, int nterms, int delta, uint32_t input_bits, uint32_t *best_bits)
  305. {
  306. WavpackStream *wps = wpc->streams [wpc->current_stream];
  307. int term, branches = ((wpc->config.extra_flags & EXTRA_BRANCHES) >> 6) - depth;
  308. int32_t *samples, *outsamples;
  309. uint32_t term_bits [22], bits;
  310. if (branches < 1 || depth + 1 == nterms)
  311. branches = 1;
  312. CLEAR (term_bits);
  313. samples = sampleptrs [depth];
  314. outsamples = sampleptrs [depth + 1];
  315. for (term = -3; term <= 18; ++term) {
  316. if (!term)
  317. continue;
  318. if (term == 17 && branches == 1 && depth + 1 < nterms)
  319. continue;
  320. if (term == -1 || term == -2)
  321. if (!(wps->wphdr.flags & CROSS_DECORR))
  322. continue;
  323. if (term >= 9 && term <= 16)
  324. if (term > MAX_TERM || !(wpc->config.flags & CONFIG_HIGH_FLAG) || (wpc->config.extra_flags & EXTRA_SKIP_8TO16))
  325. continue;
  326. if ((wpc->config.flags & CONFIG_FAST_FLAG) && (term >= 5 && term <= 16))
  327. continue;
  328. dps [depth].term = term;
  329. dps [depth].delta = delta;
  330. decorr_stereo_buffer (samples, outsamples, wps->wphdr.block_samples, &dps [depth]);
  331. bits = log2buffer (outsamples, wps->wphdr.block_samples * 2);
  332. if (bits < *best_bits) {
  333. *best_bits = bits;
  334. CLEAR (wps->decorr_passes);
  335. memcpy (wps->decorr_passes, dps, sizeof (dps [0]) * (depth + 1));
  336. memcpy (sampleptrs [nterms + 1], sampleptrs [depth + 1], wps->wphdr.block_samples * 8);
  337. }
  338. term_bits [term + 3] = bits;
  339. }
  340. while (depth + 1 < nterms && branches--) {
  341. uint32_t local_best_bits = input_bits;
  342. int best_term = 0, i;
  343. for (i = 0; i < 22; ++i)
  344. if (term_bits [i] && term_bits [i] < local_best_bits) {
  345. local_best_bits = term_bits [i];
  346. term_bits [i] = 0;
  347. best_term = i - 3;
  348. }
  349. if (!best_term)
  350. break;
  351. dps [depth].term = best_term;
  352. dps [depth].delta = delta;
  353. decorr_stereo_buffer (samples, outsamples, wps->wphdr.block_samples, &dps [depth]);
  354. // if (log2buffer (outsamples, wps->wphdr.block_samples * 2) != local_best_bits)
  355. // error_line ("data doesn't match!");
  356. recurse_stereo (wpc, sampleptrs, dps, depth + 1, nterms, delta, local_best_bits, best_bits);
  357. }
  358. }
  359. static void delta_stereo (WavpackContext *wpc, int32_t *sampleptrs[], struct decorr_pass dps[],
  360. int nterms, uint32_t *best_bits)
  361. {
  362. WavpackStream *wps = wpc->streams [wpc->current_stream];
  363. int lower = FALSE;
  364. int delta, d;
  365. uint32_t bits;
  366. if (wps->decorr_passes [0].term)
  367. delta = wps->decorr_passes [0].delta;
  368. else
  369. return;
  370. for (d = delta - 1; d >= 0; --d) {
  371. int i;
  372. if (!d && (wps->wphdr.flags & HYBRID_FLAG))
  373. break;
  374. for (i = 0; i < nterms && wps->decorr_passes [i].term; ++i) {
  375. dps [i].term = wps->decorr_passes [i].term;
  376. dps [i].delta = d;
  377. decorr_stereo_buffer (sampleptrs [i], sampleptrs [i+1], wps->wphdr.block_samples, &dps [i]);
  378. }
  379. bits = log2buffer (sampleptrs [i], wps->wphdr.block_samples * 2);
  380. if (bits < *best_bits) {
  381. lower = TRUE;
  382. *best_bits = bits;
  383. CLEAR (wps->decorr_passes);
  384. memcpy (wps->decorr_passes, dps, sizeof (dps [0]) * i);
  385. memcpy (sampleptrs [nterms + 1], sampleptrs [i], wps->wphdr.block_samples * 8);
  386. }
  387. else
  388. break;
  389. }
  390. for (d = delta + 1; !lower && d <= 7; ++d) {
  391. int i;
  392. for (i = 0; i < nterms && wps->decorr_passes [i].term; ++i) {
  393. dps [i].term = wps->decorr_passes [i].term;
  394. dps [i].delta = d;
  395. decorr_stereo_buffer (sampleptrs [i], sampleptrs [i+1], wps->wphdr.block_samples, &dps [i]);
  396. }
  397. bits = log2buffer (sampleptrs [i], wps->wphdr.block_samples * 2);
  398. if (bits < *best_bits) {
  399. *best_bits = bits;
  400. CLEAR (wps->decorr_passes);
  401. memcpy (wps->decorr_passes, dps, sizeof (dps [0]) * i);
  402. memcpy (sampleptrs [nterms + 1], sampleptrs [i], wps->wphdr.block_samples * 8);
  403. }
  404. else
  405. break;
  406. }
  407. }
  408. static void sort_stereo (WavpackContext *wpc, int32_t *sampleptrs[], struct decorr_pass dps[],
  409. int nterms, uint32_t *best_bits)
  410. {
  411. WavpackStream *wps = wpc->streams [wpc->current_stream];
  412. int reversed = TRUE;
  413. uint32_t bits;
  414. while (reversed) {
  415. int ri, i;
  416. memcpy (dps, wps->decorr_passes, sizeof (wps->decorr_passes));
  417. reversed = FALSE;
  418. for (ri = 0; ri < nterms && wps->decorr_passes [ri].term; ++ri) {
  419. if (ri + 1 >= nterms || !wps->decorr_passes [ri+1].term)
  420. break;
  421. if (wps->decorr_passes [ri].term == wps->decorr_passes [ri+1].term) {
  422. decorr_stereo_buffer (sampleptrs [ri], sampleptrs [ri+1], wps->wphdr.block_samples, &dps [ri]);
  423. continue;
  424. }
  425. dps [ri] = wps->decorr_passes [ri+1];
  426. dps [ri+1] = wps->decorr_passes [ri];
  427. for (i = ri; i < nterms && wps->decorr_passes [i].term; ++i)
  428. decorr_stereo_buffer (sampleptrs [i], sampleptrs [i+1], wps->wphdr.block_samples, &dps [i]);
  429. bits = log2buffer (sampleptrs [i], wps->wphdr.block_samples * 2);
  430. if (bits < *best_bits) {
  431. reversed = TRUE;
  432. *best_bits = bits;
  433. CLEAR (wps->decorr_passes);
  434. memcpy (wps->decorr_passes, dps, sizeof (dps [0]) * i);
  435. memcpy (sampleptrs [nterms + 1], sampleptrs [i], wps->wphdr.block_samples * 8);
  436. }
  437. else {
  438. dps [ri] = wps->decorr_passes [ri];
  439. dps [ri+1] = wps->decorr_passes [ri+1];
  440. decorr_stereo_buffer (sampleptrs [ri], sampleptrs [ri+1], wps->wphdr.block_samples, &dps [ri]);
  441. }
  442. }
  443. }
  444. }
  445. #define EXTRA_ADVANCED (EXTRA_BRANCHES | EXTRA_SORT_FIRST | EXTRA_SORT_LAST | EXTRA_TRY_DELTAS)
  446. void analyze_stereo (WavpackContext *wpc, int32_t *samples)
  447. {
  448. WavpackStream *wps = wpc->streams [wpc->current_stream];
  449. #ifdef EXTRA_DUMP
  450. uint32_t bits, best_bits, default_bits, cnt;
  451. #else
  452. uint32_t bits, best_bits, cnt;
  453. #endif
  454. const char *decorr_terms = default_terms, *tp;
  455. int32_t *sampleptrs [MAX_NTERMS+2], *lptr;
  456. struct decorr_pass dps [MAX_NTERMS];
  457. int nterms, i;
  458. CLEAR (wps->decorr_passes);
  459. cnt = wps->wphdr.block_samples * 2;
  460. lptr = samples;
  461. while (cnt--)
  462. if (*lptr++)
  463. break;
  464. if (cnt == (uint32_t) -1) {
  465. scan_word (wps, samples, wps->wphdr.block_samples, -1);
  466. wps->num_terms = 0;
  467. return;
  468. }
  469. if (wpc->config.flags & CONFIG_HIGH_FLAG)
  470. decorr_terms = high_terms;
  471. else if (wpc->config.flags & CONFIG_FAST_FLAG)
  472. decorr_terms = fast_terms;
  473. nterms = strlen (decorr_terms);
  474. if (wpc->config.extra_flags & EXTRA_TERMS)
  475. if ((nterms += (wpc->config.extra_flags & EXTRA_TERMS) >> 10) > MAX_NTERMS)
  476. nterms = MAX_NTERMS;
  477. for (i = 0; i < nterms + 2; ++i)
  478. sampleptrs [i] = malloc (wps->wphdr.block_samples * 8);
  479. memcpy (sampleptrs [nterms + 1], samples, wps->wphdr.block_samples * 8);
  480. best_bits = log2buffer (sampleptrs [nterms + 1], wps->wphdr.block_samples * 2);
  481. if ((wpc->config.extra_flags & EXTRA_STEREO_MODES) || !(wps->wphdr.flags & JOINT_STEREO)) {
  482. memcpy (sampleptrs [0], samples, wps->wphdr.block_samples * 8);
  483. CLEAR (dps);
  484. for (tp = decorr_terms, i = 0; *tp;) {
  485. if (*tp > 0 || (wps->wphdr.flags & CROSS_DECORR))
  486. dps [i].term = *tp++;
  487. else {
  488. dps [i].term = -3;
  489. tp++;
  490. }
  491. dps [i].delta = 2;
  492. decorr_stereo_buffer (sampleptrs [i], sampleptrs [i+1], wps->wphdr.block_samples, &dps [i]);
  493. ++i;
  494. }
  495. #ifdef EXTRA_DUMP
  496. default_bits = bits = log2buffer (sampleptrs [i], wps->wphdr.block_samples * 2);
  497. #else
  498. bits = log2buffer (sampleptrs [i], wps->wphdr.block_samples * 2);
  499. #endif
  500. wps->wphdr.flags &= ~JOINT_STEREO;
  501. if (bits < best_bits) {
  502. best_bits = bits;
  503. CLEAR (wps->decorr_passes);
  504. memcpy (wps->decorr_passes, dps, sizeof (dps [0]) * i);
  505. memcpy (sampleptrs [nterms + 1], sampleptrs [i], wps->wphdr.block_samples * 8);
  506. }
  507. }
  508. if ((wpc->config.extra_flags & EXTRA_STEREO_MODES) || (wps->wphdr.flags & JOINT_STEREO)) {
  509. memcpy (sampleptrs [0], samples, wps->wphdr.block_samples * 8);
  510. cnt = wps->wphdr.block_samples;
  511. lptr = sampleptrs [0];
  512. while (cnt--) {
  513. lptr [1] += ((lptr [0] -= lptr [1]) >> 1);
  514. lptr += 2;
  515. }
  516. CLEAR (dps);
  517. for (tp = decorr_terms, i = 0; *tp;) {
  518. if (*tp > 0 || (wps->wphdr.flags & CROSS_DECORR))
  519. dps [i].term = *tp++;
  520. else {
  521. dps [i].term = -3;
  522. tp++;
  523. }
  524. dps [i].delta = 2;
  525. decorr_stereo_buffer (sampleptrs [i], sampleptrs [i+1], wps->wphdr.block_samples, &dps [i]);
  526. ++i;
  527. }
  528. #ifdef EXTRA_DUMP
  529. default_bits = bits = log2buffer (sampleptrs [i], wps->wphdr.block_samples * 2);
  530. #else
  531. bits = log2buffer (sampleptrs [i], wps->wphdr.block_samples * 2);
  532. #endif
  533. wps->wphdr.flags |= JOINT_STEREO;
  534. if (bits < best_bits) {
  535. best_bits = bits;
  536. CLEAR (wps->decorr_passes);
  537. memcpy (wps->decorr_passes, dps, sizeof (dps [0]) * i);
  538. memcpy (sampleptrs [nterms + 1], sampleptrs [i], wps->wphdr.block_samples * 8);
  539. }
  540. else {
  541. memcpy (sampleptrs [0], samples, wps->wphdr.block_samples * 8);
  542. wps->wphdr.flags &= ~JOINT_STEREO;
  543. }
  544. }
  545. if ((wps->wphdr.flags & HYBRID_FLAG) && (wpc->config.extra_flags & EXTRA_ADVANCED)) {
  546. int shaping_weight, new = wps->wphdr.flags & NEW_SHAPING;
  547. int32_t *rptr = sampleptrs [nterms + 1], error [2], temp;
  548. scan_word (wps, rptr, wps->wphdr.block_samples, -1);
  549. cnt = wps->wphdr.block_samples;
  550. lptr = sampleptrs [0];
  551. CLEAR (error);
  552. if (wps->wphdr.flags & HYBRID_SHAPE) {
  553. while (cnt--) {
  554. shaping_weight = (wps->dc.shaping_acc [0] += wps->dc.shaping_delta [0]) >> 16;
  555. temp = -apply_weight (shaping_weight, error [0]);
  556. if (new && shaping_weight < 0 && temp) {
  557. if (temp == error [0])
  558. temp = (temp < 0) ? temp + 1 : temp - 1;
  559. lptr [0] += (error [0] = nosend_word (wps, rptr [0], 0) - rptr [0] + temp);
  560. }
  561. else
  562. lptr [0] += (error [0] = nosend_word (wps, rptr [0], 0) - rptr [0]) + temp;
  563. shaping_weight = (wps->dc.shaping_acc [1] += wps->dc.shaping_delta [1]) >> 16;
  564. temp = -apply_weight (shaping_weight, error [1]);
  565. if (new && shaping_weight < 0 && temp) {
  566. if (temp == error [1])
  567. temp = (temp < 0) ? temp + 1 : temp - 1;
  568. lptr [1] += (error [1] = nosend_word (wps, rptr [1], 1) - rptr [1] + temp);
  569. }
  570. else
  571. lptr [1] += (error [1] = nosend_word (wps, rptr [1], 1) - rptr [1]) + temp;
  572. lptr += 2;
  573. rptr += 2;
  574. }
  575. wps->dc.shaping_acc [0] -= wps->dc.shaping_delta [0] * wps->wphdr.block_samples;
  576. wps->dc.shaping_acc [1] -= wps->dc.shaping_delta [1] * wps->wphdr.block_samples;
  577. }
  578. else
  579. while (cnt--) {
  580. lptr [0] += nosend_word (wps, rptr [0], 0) - rptr [0];
  581. lptr [1] += nosend_word (wps, rptr [1], 1) - rptr [1];
  582. lptr += 2;
  583. rptr += 2;
  584. }
  585. memcpy (dps, wps->decorr_passes, sizeof (dps));
  586. for (i = 0; i < nterms && dps [i].term; ++i)
  587. decorr_stereo_buffer (sampleptrs [i], sampleptrs [i + 1], wps->wphdr.block_samples, dps + i);
  588. #ifdef EXTRA_DUMP
  589. best_bits = default_bits = log2buffer (sampleptrs [i], wps->wphdr.block_samples * 2);
  590. #else
  591. best_bits = log2buffer (sampleptrs [i], wps->wphdr.block_samples * 2);
  592. #endif
  593. CLEAR (wps->decorr_passes);
  594. memcpy (wps->decorr_passes, dps, sizeof (dps [0]) * i);
  595. memcpy (sampleptrs [nterms + 1], sampleptrs [i], wps->wphdr.block_samples * 8);
  596. }
  597. if (wpc->config.extra_flags & EXTRA_BRANCHES)
  598. recurse_stereo (wpc, sampleptrs, dps, 0, nterms, (int) floor (wps->delta_decay + 0.5),
  599. log2buffer (sampleptrs [0], wps->wphdr.block_samples * 2), &best_bits);
  600. if (wpc->config.extra_flags & EXTRA_SORT_FIRST)
  601. sort_stereo (wpc, sampleptrs, dps, nterms, &best_bits);
  602. if (wpc->config.extra_flags & EXTRA_TRY_DELTAS) {
  603. delta_stereo (wpc, sampleptrs, dps, nterms, &best_bits);
  604. if ((wpc->config.extra_flags & EXTRA_ADJUST_DELTAS) && wps->decorr_passes [0].term)
  605. wps->delta_decay = (wps->delta_decay * 2.0 + wps->decorr_passes [0].delta) / 3.0;
  606. else
  607. wps->delta_decay = 2.0;
  608. }
  609. if (wpc->config.extra_flags & EXTRA_SORT_LAST)
  610. sort_stereo (wpc, sampleptrs, dps, nterms, &best_bits);
  611. #if 0
  612. memcpy (dps, wps->decorr_passes, sizeof (dps));
  613. for (i = 0; i < nterms && dps [i].term; ++i)
  614. decorr_stereo_pass (sampleptrs [i], sampleptrs [i + 1], wps->wphdr.block_samples, dps + i, 1);
  615. if (log2buffer (sampleptrs [i], wps->wphdr.block_samples * 2) != best_bits)
  616. error_line ("(1) samples do not match!");
  617. if (log2buffer (sampleptrs [nterms + 1], wps->wphdr.block_samples * 2) != best_bits)
  618. error_line ("(2) samples do not match!");
  619. #endif
  620. scan_word (wps, sampleptrs [nterms + 1], wps->wphdr.block_samples, -1);
  621. #ifdef EXTRA_DUMP
  622. if (1) {
  623. char string [256], substring [20];
  624. int i;
  625. sprintf (string, "%s: delta = %.4f%%, terms =",
  626. (wps->wphdr.flags & JOINT_STEREO) ? "JS" : "TS",
  627. ((double) best_bits - default_bits) / 256.0 / wps->wphdr.block_samples / 32.0 * 100.0);
  628. for (i = 0; i < nterms; ++i) {
  629. if (wps->decorr_passes [i].term) {
  630. if (i && wps->decorr_passes [i-1].delta == wps->decorr_passes [i].delta)
  631. sprintf (substring, " %d", wps->decorr_passes [i].term);
  632. else
  633. sprintf (substring, " %d->%d", wps->decorr_passes [i].term,
  634. wps->decorr_passes [i].delta);
  635. }
  636. else
  637. sprintf (substring, " *");
  638. strcat (string, substring);
  639. }
  640. error_line (string);
  641. }
  642. #endif
  643. for (i = 0; i < nterms; ++i)
  644. if (!wps->decorr_passes [i].term)
  645. break;
  646. wps->num_terms = i;
  647. for (i = 0; i < nterms + 2; ++i)
  648. free (sampleptrs [i]);
  649. #ifdef MINMAX_WEIGHTS
  650. error_line ("weight range = %ld (%d) to %ld (%d)", min_weight, min_term, max_weight, max_term);
  651. #endif
  652. }