You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

2992 lines
96KB

  1. /*
  2. * WavPack lossless audio encoder
  3. *
  4. * This file is part of FFmpeg.
  5. *
  6. * FFmpeg is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU Lesser General Public
  8. * License as published by the Free Software Foundation; either
  9. * version 2.1 of the License, or (at your option) any later version.
  10. *
  11. * FFmpeg is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  14. * Lesser General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU Lesser General Public
  17. * License along with FFmpeg; if not, write to the Free Software
  18. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  19. */
  20. #define BITSTREAM_WRITER_LE
  21. #include "libavutil/intreadwrite.h"
  22. #include "libavutil/opt.h"
  23. #include "avcodec.h"
  24. #include "internal.h"
  25. #include "put_bits.h"
  26. #include "bytestream.h"
  27. #include "wavpackenc.h"
  28. #include "wavpack.h"
  29. #define UPDATE_WEIGHT(weight, delta, source, result) \
  30. if ((source) && (result)) { \
  31. int32_t s = (int32_t) ((source) ^ (result)) >> 31; \
  32. weight = ((delta) ^ s) + ((weight) - s); \
  33. }
  34. #define APPLY_WEIGHT_F(weight, sample) ((((((sample) & 0xffff) * (weight)) >> 9) + \
  35. ((((sample) & ~0xffff) >> 9) * (weight)) + 1) >> 1)
  36. #define APPLY_WEIGHT_I(weight, sample) (((weight) * (sample) + 512) >> 10)
  37. #define APPLY_WEIGHT(weight, sample) ((sample) != (short) (sample) ? \
  38. APPLY_WEIGHT_F(weight, sample) : APPLY_WEIGHT_I (weight, sample))
  39. #define CLEAR(destin) memset(&destin, 0, sizeof(destin));
  40. #define SHIFT_LSB 13
  41. #define SHIFT_MASK (0x1FU << SHIFT_LSB)
  42. #define MAG_LSB 18
  43. #define MAG_MASK (0x1FU << MAG_LSB)
  44. #define SRATE_LSB 23
  45. #define SRATE_MASK (0xFU << SRATE_LSB)
  46. #define EXTRA_TRY_DELTAS 1
  47. #define EXTRA_ADJUST_DELTAS 2
  48. #define EXTRA_SORT_FIRST 4
  49. #define EXTRA_BRANCHES 8
  50. #define EXTRA_SORT_LAST 16
  51. typedef struct WavPackExtraInfo {
  52. struct Decorr dps[MAX_TERMS];
  53. int nterms, log_limit, gt16bit;
  54. uint32_t best_bits;
  55. } WavPackExtraInfo;
  56. typedef struct WavPackWords {
  57. int pend_data, holding_one, zeros_acc;
  58. int holding_zero, pend_count;
  59. WvChannel c[2];
  60. } WavPackWords;
  61. typedef struct WavPackEncodeContext {
  62. AVClass *class;
  63. AVCodecContext *avctx;
  64. PutBitContext pb;
  65. int block_samples;
  66. int buffer_size;
  67. int sample_index;
  68. int stereo, stereo_in;
  69. int ch_offset;
  70. int32_t *samples[2];
  71. int samples_size[2];
  72. int32_t *sampleptrs[MAX_TERMS+2][2];
  73. int sampleptrs_size[MAX_TERMS+2][2];
  74. int32_t *temp_buffer[2][2];
  75. int temp_buffer_size[2][2];
  76. int32_t *best_buffer[2];
  77. int best_buffer_size[2];
  78. int32_t *js_left, *js_right;
  79. int js_left_size, js_right_size;
  80. int32_t *orig_l, *orig_r;
  81. int orig_l_size, orig_r_size;
  82. unsigned extra_flags;
  83. int optimize_mono;
  84. int decorr_filter;
  85. int joint;
  86. int num_branches;
  87. uint32_t flags;
  88. uint32_t crc_x;
  89. WavPackWords w;
  90. uint8_t int32_sent_bits, int32_zeros, int32_ones, int32_dups;
  91. uint8_t float_flags, float_shift, float_max_exp, max_exp;
  92. int32_t shifted_ones, shifted_zeros, shifted_both;
  93. int32_t false_zeros, neg_zeros, ordata;
  94. int num_terms, shift, joint_stereo, false_stereo;
  95. int num_decorrs, num_passes, best_decorr, mask_decorr;
  96. struct Decorr decorr_passes[MAX_TERMS];
  97. const WavPackDecorrSpec *decorr_specs;
  98. float delta_decay;
  99. } WavPackEncodeContext;
  100. static av_cold int wavpack_encode_init(AVCodecContext *avctx)
  101. {
  102. WavPackEncodeContext *s = avctx->priv_data;
  103. s->avctx = avctx;
  104. if (avctx->channels > 255) {
  105. av_log(avctx, AV_LOG_ERROR, "Invalid channel count: %d\n", avctx->channels);
  106. return AVERROR(EINVAL);
  107. }
  108. if (!avctx->frame_size) {
  109. int block_samples;
  110. if (!(avctx->sample_rate & 1))
  111. block_samples = avctx->sample_rate / 2;
  112. else
  113. block_samples = avctx->sample_rate;
  114. while (block_samples * avctx->channels > WV_MAX_SAMPLES)
  115. block_samples /= 2;
  116. while (block_samples * avctx->channels < 40000)
  117. block_samples *= 2;
  118. avctx->frame_size = block_samples;
  119. } else if (avctx->frame_size && (avctx->frame_size < 128 ||
  120. avctx->frame_size > WV_MAX_SAMPLES)) {
  121. av_log(avctx, AV_LOG_ERROR, "invalid block size: %d\n", avctx->frame_size);
  122. return AVERROR(EINVAL);
  123. }
  124. if (avctx->compression_level != FF_COMPRESSION_DEFAULT) {
  125. if (avctx->compression_level >= 3) {
  126. s->decorr_filter = 3;
  127. s->num_passes = 9;
  128. if (avctx->compression_level >= 8) {
  129. s->num_branches = 4;
  130. s->extra_flags = EXTRA_TRY_DELTAS|EXTRA_ADJUST_DELTAS|EXTRA_SORT_FIRST|EXTRA_SORT_LAST|EXTRA_BRANCHES;
  131. } else if (avctx->compression_level >= 7) {
  132. s->num_branches = 3;
  133. s->extra_flags = EXTRA_TRY_DELTAS|EXTRA_ADJUST_DELTAS|EXTRA_SORT_FIRST|EXTRA_BRANCHES;
  134. } else if (avctx->compression_level >= 6) {
  135. s->num_branches = 2;
  136. s->extra_flags = EXTRA_TRY_DELTAS|EXTRA_ADJUST_DELTAS|EXTRA_SORT_FIRST|EXTRA_BRANCHES;
  137. } else if (avctx->compression_level >= 5) {
  138. s->num_branches = 1;
  139. s->extra_flags = EXTRA_TRY_DELTAS|EXTRA_ADJUST_DELTAS|EXTRA_SORT_FIRST|EXTRA_BRANCHES;
  140. } else if (avctx->compression_level >= 4) {
  141. s->num_branches = 1;
  142. s->extra_flags = EXTRA_TRY_DELTAS|EXTRA_ADJUST_DELTAS|EXTRA_BRANCHES;
  143. }
  144. } else if (avctx->compression_level == 2) {
  145. s->decorr_filter = 2;
  146. s->num_passes = 4;
  147. } else if (avctx->compression_level == 1) {
  148. s->decorr_filter = 1;
  149. s->num_passes = 2;
  150. } else if (avctx->compression_level < 1) {
  151. s->decorr_filter = 0;
  152. s->num_passes = 0;
  153. }
  154. }
  155. s->num_decorrs = decorr_filter_sizes[s->decorr_filter];
  156. s->decorr_specs = decorr_filters[s->decorr_filter];
  157. s->delta_decay = 2.0;
  158. return 0;
  159. }
  160. static void shift_mono(int32_t *samples, int nb_samples, int shift)
  161. {
  162. int i;
  163. for (i = 0; i < nb_samples; i++)
  164. samples[i] >>= shift;
  165. }
  166. static void shift_stereo(int32_t *left, int32_t *right,
  167. int nb_samples, int shift)
  168. {
  169. int i;
  170. for (i = 0; i < nb_samples; i++) {
  171. left [i] >>= shift;
  172. right[i] >>= shift;
  173. }
  174. }
  175. #define FLOAT_SHIFT_ONES 1
  176. #define FLOAT_SHIFT_SAME 2
  177. #define FLOAT_SHIFT_SENT 4
  178. #define FLOAT_ZEROS_SENT 8
  179. #define FLOAT_NEG_ZEROS 0x10
  180. #define FLOAT_EXCEPTIONS 0x20
  181. #define get_mantissa(f) ((f) & 0x7fffff)
  182. #define get_exponent(f) (((f) >> 23) & 0xff)
  183. #define get_sign(f) (((f) >> 31) & 0x1)
  184. static void process_float(WavPackEncodeContext *s, int32_t *sample)
  185. {
  186. int32_t shift_count, value, f = *sample;
  187. if (get_exponent(f) == 255) {
  188. s->float_flags |= FLOAT_EXCEPTIONS;
  189. value = 0x1000000;
  190. shift_count = 0;
  191. } else if (get_exponent(f)) {
  192. shift_count = s->max_exp - get_exponent(f);
  193. value = 0x800000 + get_mantissa(f);
  194. } else {
  195. shift_count = s->max_exp ? s->max_exp - 1 : 0;
  196. value = get_mantissa(f);
  197. }
  198. if (shift_count < 25)
  199. value >>= shift_count;
  200. else
  201. value = 0;
  202. if (!value) {
  203. if (get_exponent(f) || get_mantissa(f))
  204. s->false_zeros++;
  205. else if (get_sign(f))
  206. s->neg_zeros++;
  207. } else if (shift_count) {
  208. int32_t mask = (1 << shift_count) - 1;
  209. if (!(get_mantissa(f) & mask))
  210. s->shifted_zeros++;
  211. else if ((get_mantissa(f) & mask) == mask)
  212. s->shifted_ones++;
  213. else
  214. s->shifted_both++;
  215. }
  216. s->ordata |= value;
  217. *sample = get_sign(f) ? -value : value;
  218. }
  219. static int scan_float(WavPackEncodeContext *s,
  220. int32_t *samples_l, int32_t *samples_r,
  221. int nb_samples)
  222. {
  223. uint32_t crc = 0xffffffffu;
  224. int i;
  225. s->shifted_ones = s->shifted_zeros = s->shifted_both = s->ordata = 0;
  226. s->float_shift = s->float_flags = 0;
  227. s->false_zeros = s->neg_zeros = 0;
  228. s->max_exp = 0;
  229. if (s->flags & WV_MONO_DATA) {
  230. for (i = 0; i < nb_samples; i++) {
  231. int32_t f = samples_l[i];
  232. crc = crc * 27 + get_mantissa(f) * 9 + get_exponent(f) * 3 + get_sign(f);
  233. if (get_exponent(f) > s->max_exp && get_exponent(f) < 255)
  234. s->max_exp = get_exponent(f);
  235. }
  236. } else {
  237. for (i = 0; i < nb_samples; i++) {
  238. int32_t f;
  239. f = samples_l[i];
  240. crc = crc * 27 + get_mantissa(f) * 9 + get_exponent(f) * 3 + get_sign(f);
  241. if (get_exponent(f) > s->max_exp && get_exponent(f) < 255)
  242. s->max_exp = get_exponent(f);
  243. f = samples_r[i];
  244. crc = crc * 27 + get_mantissa(f) * 9 + get_exponent(f) * 3 + get_sign(f);
  245. if (get_exponent(f) > s->max_exp && get_exponent(f) < 255)
  246. s->max_exp = get_exponent(f);
  247. }
  248. }
  249. s->crc_x = crc;
  250. if (s->flags & WV_MONO_DATA) {
  251. for (i = 0; i < nb_samples; i++)
  252. process_float(s, &samples_l[i]);
  253. } else {
  254. for (i = 0; i < nb_samples; i++) {
  255. process_float(s, &samples_l[i]);
  256. process_float(s, &samples_r[i]);
  257. }
  258. }
  259. s->float_max_exp = s->max_exp;
  260. if (s->shifted_both)
  261. s->float_flags |= FLOAT_SHIFT_SENT;
  262. else if (s->shifted_ones && !s->shifted_zeros)
  263. s->float_flags |= FLOAT_SHIFT_ONES;
  264. else if (s->shifted_ones && s->shifted_zeros)
  265. s->float_flags |= FLOAT_SHIFT_SAME;
  266. else if (s->ordata && !(s->ordata & 1)) {
  267. do {
  268. s->float_shift++;
  269. s->ordata >>= 1;
  270. } while (!(s->ordata & 1));
  271. if (s->flags & WV_MONO_DATA)
  272. shift_mono(samples_l, nb_samples, s->float_shift);
  273. else
  274. shift_stereo(samples_l, samples_r, nb_samples, s->float_shift);
  275. }
  276. s->flags &= ~MAG_MASK;
  277. while (s->ordata) {
  278. s->flags += 1 << MAG_LSB;
  279. s->ordata >>= 1;
  280. }
  281. if (s->false_zeros || s->neg_zeros)
  282. s->float_flags |= FLOAT_ZEROS_SENT;
  283. if (s->neg_zeros)
  284. s->float_flags |= FLOAT_NEG_ZEROS;
  285. return s->float_flags & (FLOAT_EXCEPTIONS | FLOAT_ZEROS_SENT |
  286. FLOAT_SHIFT_SENT | FLOAT_SHIFT_SAME);
  287. }
  288. static void scan_int23(WavPackEncodeContext *s,
  289. int32_t *samples_l, int32_t *samples_r,
  290. int nb_samples)
  291. {
  292. uint32_t magdata = 0, ordata = 0, xordata = 0, anddata = ~0;
  293. int i, total_shift = 0;
  294. s->int32_sent_bits = s->int32_zeros = s->int32_ones = s->int32_dups = 0;
  295. if (s->flags & WV_MONO_DATA) {
  296. for (i = 0; i < nb_samples; i++) {
  297. int32_t M = samples_l[i];
  298. magdata |= (M < 0) ? ~M : M;
  299. xordata |= M ^ -(M & 1);
  300. anddata &= M;
  301. ordata |= M;
  302. if ((ordata & 1) && !(anddata & 1) && (xordata & 2))
  303. return;
  304. }
  305. } else {
  306. for (i = 0; i < nb_samples; i++) {
  307. int32_t L = samples_l[i];
  308. int32_t R = samples_r[i];
  309. magdata |= (L < 0) ? ~L : L;
  310. magdata |= (R < 0) ? ~R : R;
  311. xordata |= L ^ -(L & 1);
  312. xordata |= R ^ -(R & 1);
  313. anddata &= L & R;
  314. ordata |= L | R;
  315. if ((ordata & 1) && !(anddata & 1) && (xordata & 2))
  316. return;
  317. }
  318. }
  319. s->flags &= ~MAG_MASK;
  320. while (magdata) {
  321. s->flags += 1 << MAG_LSB;
  322. magdata >>= 1;
  323. }
  324. if (!(s->flags & MAG_MASK))
  325. return;
  326. if (!(ordata & 1)) {
  327. do {
  328. s->flags -= 1 << MAG_LSB;
  329. s->int32_zeros++;
  330. total_shift++;
  331. ordata >>= 1;
  332. } while (!(ordata & 1));
  333. } else if (anddata & 1) {
  334. do {
  335. s->flags -= 1 << MAG_LSB;
  336. s->int32_ones++;
  337. total_shift++;
  338. anddata >>= 1;
  339. } while (anddata & 1);
  340. } else if (!(xordata & 2)) {
  341. do {
  342. s->flags -= 1 << MAG_LSB;
  343. s->int32_dups++;
  344. total_shift++;
  345. xordata >>= 1;
  346. } while (!(xordata & 2));
  347. }
  348. if (total_shift) {
  349. s->flags |= WV_INT32_DATA;
  350. if (s->flags & WV_MONO_DATA)
  351. shift_mono(samples_l, nb_samples, total_shift);
  352. else
  353. shift_stereo(samples_l, samples_r, nb_samples, total_shift);
  354. }
  355. }
  356. static int scan_int32(WavPackEncodeContext *s,
  357. int32_t *samples_l, int32_t *samples_r,
  358. int nb_samples)
  359. {
  360. uint32_t magdata = 0, ordata = 0, xordata = 0, anddata = ~0;
  361. uint32_t crc = 0xffffffffu;
  362. int i, total_shift = 0;
  363. s->int32_sent_bits = s->int32_zeros = s->int32_ones = s->int32_dups = 0;
  364. if (s->flags & WV_MONO_DATA) {
  365. for (i = 0; i < nb_samples; i++) {
  366. int32_t M = samples_l[i];
  367. crc = crc * 9 + (M & 0xffff) * 3 + ((M >> 16) & 0xffff);
  368. magdata |= (M < 0) ? ~M : M;
  369. xordata |= M ^ -(M & 1);
  370. anddata &= M;
  371. ordata |= M;
  372. }
  373. } else {
  374. for (i = 0; i < nb_samples; i++) {
  375. int32_t L = samples_l[i];
  376. int32_t R = samples_r[i];
  377. crc = crc * 9 + (L & 0xffff) * 3 + ((L >> 16) & 0xffff);
  378. crc = crc * 9 + (R & 0xffff) * 3 + ((R >> 16) & 0xffff);
  379. magdata |= (L < 0) ? ~L : L;
  380. magdata |= (R < 0) ? ~R : R;
  381. xordata |= L ^ -(L & 1);
  382. xordata |= R ^ -(R & 1);
  383. anddata &= L & R;
  384. ordata |= L | R;
  385. }
  386. }
  387. s->crc_x = crc;
  388. s->flags &= ~MAG_MASK;
  389. while (magdata) {
  390. s->flags += 1 << MAG_LSB;
  391. magdata >>= 1;
  392. }
  393. if (!((s->flags & MAG_MASK) >> MAG_LSB)) {
  394. s->flags &= ~WV_INT32_DATA;
  395. return 0;
  396. }
  397. if (!(ordata & 1))
  398. do {
  399. s->flags -= 1 << MAG_LSB;
  400. s->int32_zeros++;
  401. total_shift++;
  402. ordata >>= 1;
  403. } while (!(ordata & 1));
  404. else if (anddata & 1)
  405. do {
  406. s->flags -= 1 << MAG_LSB;
  407. s->int32_ones++;
  408. total_shift++;
  409. anddata >>= 1;
  410. } while (anddata & 1);
  411. else if (!(xordata & 2))
  412. do {
  413. s->flags -= 1 << MAG_LSB;
  414. s->int32_dups++;
  415. total_shift++;
  416. xordata >>= 1;
  417. } while (!(xordata & 2));
  418. if (((s->flags & MAG_MASK) >> MAG_LSB) > 23) {
  419. s->int32_sent_bits = (uint8_t)(((s->flags & MAG_MASK) >> MAG_LSB) - 23);
  420. total_shift += s->int32_sent_bits;
  421. s->flags &= ~MAG_MASK;
  422. s->flags += 23 << MAG_LSB;
  423. }
  424. if (total_shift) {
  425. s->flags |= WV_INT32_DATA;
  426. if (s->flags & WV_MONO_DATA)
  427. shift_mono(samples_l, nb_samples, total_shift);
  428. else
  429. shift_stereo(samples_l, samples_r, nb_samples, total_shift);
  430. }
  431. return s->int32_sent_bits;
  432. }
  433. static int8_t store_weight(int weight)
  434. {
  435. weight = av_clip(weight, -1024, 1024);
  436. if (weight > 0)
  437. weight -= (weight + 64) >> 7;
  438. return (weight + 4) >> 3;
  439. }
  440. static int restore_weight(int8_t weight)
  441. {
  442. int result;
  443. if ((result = (int) weight << 3) > 0)
  444. result += (result + 64) >> 7;
  445. return result;
  446. }
  447. static int log2s(int32_t value)
  448. {
  449. return (value < 0) ? -wp_log2(-value) : wp_log2(value);
  450. }
  451. static void decorr_mono(int32_t *in_samples, int32_t *out_samples,
  452. int nb_samples, struct Decorr *dpp, int dir)
  453. {
  454. int m = 0, i;
  455. dpp->sumA = 0;
  456. if (dir < 0) {
  457. out_samples += (nb_samples - 1);
  458. in_samples += (nb_samples - 1);
  459. }
  460. dpp->weightA = restore_weight(store_weight(dpp->weightA));
  461. for (i = 0; i < MAX_TERM; i++)
  462. dpp->samplesA[i] = wp_exp2(log2s(dpp->samplesA[i]));
  463. if (dpp->value > MAX_TERM) {
  464. while (nb_samples--) {
  465. int32_t left, sam_A;
  466. sam_A = ((3 - (dpp->value & 1)) * dpp->samplesA[0] - dpp->samplesA[1]) >> !(dpp->value & 1);
  467. dpp->samplesA[1] = dpp->samplesA[0];
  468. dpp->samplesA[0] = left = in_samples[0];
  469. left -= APPLY_WEIGHT(dpp->weightA, sam_A);
  470. UPDATE_WEIGHT(dpp->weightA, dpp->delta, sam_A, left);
  471. dpp->sumA += dpp->weightA;
  472. out_samples[0] = left;
  473. in_samples += dir;
  474. out_samples += dir;
  475. }
  476. } else if (dpp->value > 0) {
  477. while (nb_samples--) {
  478. int k = (m + dpp->value) & (MAX_TERM - 1);
  479. int32_t left, sam_A;
  480. sam_A = dpp->samplesA[m];
  481. dpp->samplesA[k] = left = in_samples[0];
  482. m = (m + 1) & (MAX_TERM - 1);
  483. left -= APPLY_WEIGHT(dpp->weightA, sam_A);
  484. UPDATE_WEIGHT(dpp->weightA, dpp->delta, sam_A, left);
  485. dpp->sumA += dpp->weightA;
  486. out_samples[0] = left;
  487. in_samples += dir;
  488. out_samples += dir;
  489. }
  490. }
  491. if (m && dpp->value > 0 && dpp->value <= MAX_TERM) {
  492. int32_t temp_A[MAX_TERM];
  493. memcpy(temp_A, dpp->samplesA, sizeof(dpp->samplesA));
  494. for (i = 0; i < MAX_TERM; i++) {
  495. dpp->samplesA[i] = temp_A[m];
  496. m = (m + 1) & (MAX_TERM - 1);
  497. }
  498. }
  499. }
  500. static void reverse_mono_decorr(struct Decorr *dpp)
  501. {
  502. if (dpp->value > MAX_TERM) {
  503. int32_t sam_A;
  504. if (dpp->value & 1)
  505. sam_A = 2 * dpp->samplesA[0] - dpp->samplesA[1];
  506. else
  507. sam_A = (3 * dpp->samplesA[0] - dpp->samplesA[1]) >> 1;
  508. dpp->samplesA[1] = dpp->samplesA[0];
  509. dpp->samplesA[0] = sam_A;
  510. if (dpp->value & 1)
  511. sam_A = 2 * dpp->samplesA[0] - dpp->samplesA[1];
  512. else
  513. sam_A = (3 * dpp->samplesA[0] - dpp->samplesA[1]) >> 1;
  514. dpp->samplesA[1] = sam_A;
  515. } else if (dpp->value > 1) {
  516. int i, j, k;
  517. for (i = 0, j = dpp->value - 1, k = 0; k < dpp->value / 2; i++, j--, k++) {
  518. i &= (MAX_TERM - 1);
  519. j &= (MAX_TERM - 1);
  520. dpp->samplesA[i] ^= dpp->samplesA[j];
  521. dpp->samplesA[j] ^= dpp->samplesA[i];
  522. dpp->samplesA[i] ^= dpp->samplesA[j];
  523. }
  524. }
  525. }
  526. static uint32_t log2sample(uint32_t v, int limit, uint32_t *result)
  527. {
  528. uint32_t dbits;
  529. if ((v += v >> 9) < (1 << 8)) {
  530. dbits = nbits_table[v];
  531. *result += (dbits << 8) + wp_log2_table[(v << (9 - dbits)) & 0xff];
  532. } else {
  533. if (v < (1 << 16))
  534. dbits = nbits_table[v >> 8] + 8;
  535. else if (v < (1 << 24))
  536. dbits = nbits_table[v >> 16] + 16;
  537. else
  538. dbits = nbits_table[v >> 24] + 24;
  539. *result += dbits = (dbits << 8) + wp_log2_table[(v >> (dbits - 9)) & 0xff];
  540. if (limit && dbits >= limit)
  541. return 1;
  542. }
  543. return 0;
  544. }
  545. static uint32_t log2mono(int32_t *samples, int nb_samples, int limit)
  546. {
  547. uint32_t result = 0;
  548. while (nb_samples--) {
  549. if (log2sample(abs(*samples++), limit, &result))
  550. return UINT32_MAX;
  551. }
  552. return result;
  553. }
  554. static uint32_t log2stereo(int32_t *samples_l, int32_t *samples_r,
  555. int nb_samples, int limit)
  556. {
  557. uint32_t result = 0;
  558. while (nb_samples--) {
  559. if (log2sample(abs(*samples_l++), limit, &result) ||
  560. log2sample(abs(*samples_r++), limit, &result))
  561. return UINT32_MAX;
  562. }
  563. return result;
  564. }
  565. static void decorr_mono_buffer(int32_t *samples, int32_t *outsamples,
  566. int nb_samples, struct Decorr *dpp,
  567. int tindex)
  568. {
  569. struct Decorr dp, *dppi = dpp + tindex;
  570. int delta = dppi->delta, pre_delta, term = dppi->value;
  571. if (delta == 7)
  572. pre_delta = 7;
  573. else if (delta < 2)
  574. pre_delta = 3;
  575. else
  576. pre_delta = delta + 1;
  577. CLEAR(dp);
  578. dp.value = term;
  579. dp.delta = pre_delta;
  580. decorr_mono(samples, outsamples, FFMIN(2048, nb_samples), &dp, -1);
  581. dp.delta = delta;
  582. if (tindex == 0)
  583. reverse_mono_decorr(&dp);
  584. else
  585. CLEAR(dp.samplesA);
  586. memcpy(dppi->samplesA, dp.samplesA, sizeof(dp.samplesA));
  587. dppi->weightA = dp.weightA;
  588. if (delta == 0) {
  589. dp.delta = 1;
  590. decorr_mono(samples, outsamples, nb_samples, &dp, 1);
  591. dp.delta = 0;
  592. memcpy(dp.samplesA, dppi->samplesA, sizeof(dp.samplesA));
  593. dppi->weightA = dp.weightA = dp.sumA / nb_samples;
  594. }
  595. decorr_mono(samples, outsamples, nb_samples, &dp, 1);
  596. }
  597. static void recurse_mono(WavPackEncodeContext *s, WavPackExtraInfo *info,
  598. int depth, int delta, uint32_t input_bits)
  599. {
  600. int term, branches = s->num_branches - depth;
  601. int32_t *samples, *outsamples;
  602. uint32_t term_bits[22], bits;
  603. if (branches < 1 || depth + 1 == info->nterms)
  604. branches = 1;
  605. CLEAR(term_bits);
  606. samples = s->sampleptrs[depth][0];
  607. outsamples = s->sampleptrs[depth + 1][0];
  608. for (term = 1; term <= 18; term++) {
  609. if (term == 17 && branches == 1 && depth + 1 < info->nterms)
  610. continue;
  611. if (term > 8 && term < 17)
  612. continue;
  613. if (!s->extra_flags && (term > 4 && term < 17))
  614. continue;
  615. info->dps[depth].value = term;
  616. info->dps[depth].delta = delta;
  617. decorr_mono_buffer(samples, outsamples, s->block_samples, info->dps, depth);
  618. bits = log2mono(outsamples, s->block_samples, info->log_limit);
  619. if (bits < info->best_bits) {
  620. info->best_bits = bits;
  621. CLEAR(s->decorr_passes);
  622. memcpy(s->decorr_passes, info->dps, sizeof(info->dps[0]) * (depth + 1));
  623. memcpy(s->sampleptrs[info->nterms + 1][0],
  624. s->sampleptrs[depth + 1][0], s->block_samples * 4);
  625. }
  626. term_bits[term + 3] = bits;
  627. }
  628. while (depth + 1 < info->nterms && branches--) {
  629. uint32_t local_best_bits = input_bits;
  630. int best_term = 0, i;
  631. for (i = 0; i < 22; i++)
  632. if (term_bits[i] && term_bits[i] < local_best_bits) {
  633. local_best_bits = term_bits[i];
  634. best_term = i - 3;
  635. }
  636. if (!best_term)
  637. break;
  638. term_bits[best_term + 3] = 0;
  639. info->dps[depth].value = best_term;
  640. info->dps[depth].delta = delta;
  641. decorr_mono_buffer(samples, outsamples, s->block_samples, info->dps, depth);
  642. recurse_mono(s, info, depth + 1, delta, local_best_bits);
  643. }
  644. }
  645. static void sort_mono(WavPackEncodeContext *s, WavPackExtraInfo *info)
  646. {
  647. int reversed = 1;
  648. uint32_t bits;
  649. while (reversed) {
  650. int ri, i;
  651. memcpy(info->dps, s->decorr_passes, sizeof(s->decorr_passes));
  652. reversed = 0;
  653. for (ri = 0; ri < info->nterms && s->decorr_passes[ri].value; ri++) {
  654. if (ri + 1 >= info->nterms || !s->decorr_passes[ri+1].value)
  655. break;
  656. if (s->decorr_passes[ri].value == s->decorr_passes[ri+1].value) {
  657. decorr_mono_buffer(s->sampleptrs[ri][0], s->sampleptrs[ri+1][0],
  658. s->block_samples, info->dps, ri);
  659. continue;
  660. }
  661. info->dps[ri ] = s->decorr_passes[ri+1];
  662. info->dps[ri+1] = s->decorr_passes[ri ];
  663. for (i = ri; i < info->nterms && s->decorr_passes[i].value; i++)
  664. decorr_mono_buffer(s->sampleptrs[i][0], s->sampleptrs[i+1][0],
  665. s->block_samples, info->dps, i);
  666. bits = log2mono(s->sampleptrs[i][0], s->block_samples, info->log_limit);
  667. if (bits < info->best_bits) {
  668. reversed = 1;
  669. info->best_bits = bits;
  670. CLEAR(s->decorr_passes);
  671. memcpy(s->decorr_passes, info->dps, sizeof(info->dps[0]) * i);
  672. memcpy(s->sampleptrs[info->nterms + 1][0], s->sampleptrs[i][0],
  673. s->block_samples * 4);
  674. } else {
  675. info->dps[ri ] = s->decorr_passes[ri];
  676. info->dps[ri+1] = s->decorr_passes[ri+1];
  677. decorr_mono_buffer(s->sampleptrs[ri][0], s->sampleptrs[ri+1][0],
  678. s->block_samples, info->dps, ri);
  679. }
  680. }
  681. }
  682. }
  683. static void delta_mono(WavPackEncodeContext *s, WavPackExtraInfo *info)
  684. {
  685. int lower = 0, delta, d;
  686. uint32_t bits;
  687. if (!s->decorr_passes[0].value)
  688. return;
  689. delta = s->decorr_passes[0].delta;
  690. for (d = delta - 1; d >= 0; d--) {
  691. int i;
  692. for (i = 0; i < info->nterms && s->decorr_passes[i].value; i++) {
  693. info->dps[i].value = s->decorr_passes[i].value;
  694. info->dps[i].delta = d;
  695. decorr_mono_buffer(s->sampleptrs[i][0], s->sampleptrs[i+1][0],
  696. s->block_samples, info->dps, i);
  697. }
  698. bits = log2mono(s->sampleptrs[i][0], s->block_samples, info->log_limit);
  699. if (bits >= info->best_bits)
  700. break;
  701. lower = 1;
  702. info->best_bits = bits;
  703. CLEAR(s->decorr_passes);
  704. memcpy(s->decorr_passes, info->dps, sizeof(info->dps[0]) * i);
  705. memcpy(s->sampleptrs[info->nterms + 1][0], s->sampleptrs[i][0],
  706. s->block_samples * 4);
  707. }
  708. for (d = delta + 1; !lower && d <= 7; d++) {
  709. int i;
  710. for (i = 0; i < info->nterms && s->decorr_passes[i].value; i++) {
  711. info->dps[i].value = s->decorr_passes[i].value;
  712. info->dps[i].delta = d;
  713. decorr_mono_buffer(s->sampleptrs[i][0], s->sampleptrs[i+1][0],
  714. s->block_samples, info->dps, i);
  715. }
  716. bits = log2mono(s->sampleptrs[i][0], s->block_samples, info->log_limit);
  717. if (bits >= info->best_bits)
  718. break;
  719. info->best_bits = bits;
  720. CLEAR(s->decorr_passes);
  721. memcpy(s->decorr_passes, info->dps, sizeof(info->dps[0]) * i);
  722. memcpy(s->sampleptrs[info->nterms + 1][0], s->sampleptrs[i][0],
  723. s->block_samples * 4);
  724. }
  725. }
  726. static int allocate_buffers2(WavPackEncodeContext *s, int nterms)
  727. {
  728. int i;
  729. for (i = 0; i < nterms + 2; i++) {
  730. av_fast_padded_malloc(&s->sampleptrs[i][0], &s->sampleptrs_size[i][0],
  731. s->block_samples * 4);
  732. if (!s->sampleptrs[i][0])
  733. return AVERROR(ENOMEM);
  734. if (!(s->flags & WV_MONO_DATA)) {
  735. av_fast_padded_malloc(&s->sampleptrs[i][1], &s->sampleptrs_size[i][1],
  736. s->block_samples * 4);
  737. if (!s->sampleptrs[i][1])
  738. return AVERROR(ENOMEM);
  739. }
  740. }
  741. return 0;
  742. }
  743. static int allocate_buffers(WavPackEncodeContext *s)
  744. {
  745. int i;
  746. for (i = 0; i < 2; i++) {
  747. av_fast_padded_malloc(&s->best_buffer[0], &s->best_buffer_size[0],
  748. s->block_samples * 4);
  749. if (!s->best_buffer[0])
  750. return AVERROR(ENOMEM);
  751. av_fast_padded_malloc(&s->temp_buffer[i][0], &s->temp_buffer_size[i][0],
  752. s->block_samples * 4);
  753. if (!s->temp_buffer[i][0])
  754. return AVERROR(ENOMEM);
  755. if (!(s->flags & WV_MONO_DATA)) {
  756. av_fast_padded_malloc(&s->best_buffer[1], &s->best_buffer_size[1],
  757. s->block_samples * 4);
  758. if (!s->best_buffer[1])
  759. return AVERROR(ENOMEM);
  760. av_fast_padded_malloc(&s->temp_buffer[i][1], &s->temp_buffer_size[i][1],
  761. s->block_samples * 4);
  762. if (!s->temp_buffer[i][1])
  763. return AVERROR(ENOMEM);
  764. }
  765. }
  766. return 0;
  767. }
  768. static void analyze_mono(WavPackEncodeContext *s, int32_t *samples, int do_samples)
  769. {
  770. WavPackExtraInfo info;
  771. int i;
  772. info.log_limit = (((s->flags & MAG_MASK) >> MAG_LSB) + 4) * 256;
  773. info.log_limit = FFMIN(6912, info.log_limit);
  774. info.nterms = s->num_terms;
  775. if (allocate_buffers2(s, s->num_terms))
  776. return;
  777. memcpy(info.dps, s->decorr_passes, sizeof(info.dps));
  778. memcpy(s->sampleptrs[0][0], samples, s->block_samples * 4);
  779. for (i = 0; i < info.nterms && info.dps[i].value; i++)
  780. decorr_mono(s->sampleptrs[i][0], s->sampleptrs[i + 1][0],
  781. s->block_samples, info.dps + i, 1);
  782. info.best_bits = log2mono(s->sampleptrs[info.nterms][0], s->block_samples, 0) * 1;
  783. memcpy(s->sampleptrs[info.nterms + 1][0], s->sampleptrs[i][0], s->block_samples * 4);
  784. if (s->extra_flags & EXTRA_BRANCHES)
  785. recurse_mono(s, &info, 0, (int) floor(s->delta_decay + 0.5),
  786. log2mono(s->sampleptrs[0][0], s->block_samples, 0));
  787. if (s->extra_flags & EXTRA_SORT_FIRST)
  788. sort_mono(s, &info);
  789. if (s->extra_flags & EXTRA_TRY_DELTAS) {
  790. delta_mono(s, &info);
  791. if ((s->extra_flags & EXTRA_ADJUST_DELTAS) && s->decorr_passes[0].value)
  792. s->delta_decay = (float)((s->delta_decay * 2.0 + s->decorr_passes[0].delta) / 3.0);
  793. else
  794. s->delta_decay = 2.0;
  795. }
  796. if (s->extra_flags & EXTRA_SORT_LAST)
  797. sort_mono(s, &info);
  798. if (do_samples)
  799. memcpy(samples, s->sampleptrs[info.nterms + 1][0], s->block_samples * 4);
  800. for (i = 0; i < info.nterms; i++)
  801. if (!s->decorr_passes[i].value)
  802. break;
  803. s->num_terms = i;
  804. }
  805. static void scan_word(WavPackEncodeContext *s, WvChannel *c,
  806. int32_t *samples, int nb_samples, int dir)
  807. {
  808. if (dir < 0)
  809. samples += nb_samples - 1;
  810. while (nb_samples--) {
  811. uint32_t low, value = labs(samples[0]);
  812. if (value < GET_MED(0)) {
  813. DEC_MED(0);
  814. } else {
  815. low = GET_MED(0);
  816. INC_MED(0);
  817. if (value - low < GET_MED(1)) {
  818. DEC_MED(1);
  819. } else {
  820. low += GET_MED(1);
  821. INC_MED(1);
  822. if (value - low < GET_MED(2)) {
  823. DEC_MED(2);
  824. } else {
  825. INC_MED(2);
  826. }
  827. }
  828. }
  829. samples += dir;
  830. }
  831. }
  832. static int wv_mono(WavPackEncodeContext *s, int32_t *samples,
  833. int no_history, int do_samples)
  834. {
  835. struct Decorr temp_decorr_pass, save_decorr_passes[MAX_TERMS] = {{0}};
  836. int nb_samples = s->block_samples;
  837. int buf_size = sizeof(int32_t) * nb_samples;
  838. uint32_t best_size = UINT32_MAX, size;
  839. int log_limit, pi, i, ret;
  840. for (i = 0; i < nb_samples; i++)
  841. if (samples[i])
  842. break;
  843. if (i == nb_samples) {
  844. CLEAR(s->decorr_passes);
  845. CLEAR(s->w);
  846. s->num_terms = 0;
  847. return 0;
  848. }
  849. log_limit = (((s->flags & MAG_MASK) >> MAG_LSB) + 4) * 256;
  850. log_limit = FFMIN(6912, log_limit);
  851. if ((ret = allocate_buffers(s)) < 0)
  852. return ret;
  853. if (no_history || s->num_passes >= 7)
  854. s->best_decorr = s->mask_decorr = 0;
  855. for (pi = 0; pi < s->num_passes;) {
  856. const WavPackDecorrSpec *wpds;
  857. int nterms, c, j;
  858. if (!pi) {
  859. c = s->best_decorr;
  860. } else {
  861. if (s->mask_decorr == 0)
  862. c = 0;
  863. else
  864. c = (s->best_decorr & (s->mask_decorr - 1)) | s->mask_decorr;
  865. if (c == s->best_decorr) {
  866. s->mask_decorr = s->mask_decorr ? ((s->mask_decorr << 1) & (s->num_decorrs - 1)) : 1;
  867. continue;
  868. }
  869. }
  870. wpds = &s->decorr_specs[c];
  871. nterms = decorr_filter_nterms[s->decorr_filter];
  872. while (1) {
  873. memcpy(s->temp_buffer[0][0], samples, buf_size);
  874. CLEAR(save_decorr_passes);
  875. for (j = 0; j < nterms; j++) {
  876. CLEAR(temp_decorr_pass);
  877. temp_decorr_pass.delta = wpds->delta;
  878. temp_decorr_pass.value = wpds->terms[j];
  879. if (temp_decorr_pass.value < 0)
  880. temp_decorr_pass.value = 1;
  881. decorr_mono(s->temp_buffer[j&1][0], s->temp_buffer[~j&1][0],
  882. FFMIN(nb_samples, 2048), &temp_decorr_pass, -1);
  883. if (j) {
  884. CLEAR(temp_decorr_pass.samplesA);
  885. } else {
  886. reverse_mono_decorr(&temp_decorr_pass);
  887. }
  888. memcpy(save_decorr_passes + j, &temp_decorr_pass, sizeof(struct Decorr));
  889. decorr_mono(s->temp_buffer[j&1][0], s->temp_buffer[~j&1][0],
  890. nb_samples, &temp_decorr_pass, 1);
  891. }
  892. size = log2mono(s->temp_buffer[j&1][0], nb_samples, log_limit);
  893. if (size != UINT32_MAX || !nterms)
  894. break;
  895. nterms >>= 1;
  896. }
  897. if (size < best_size) {
  898. memcpy(s->best_buffer[0], s->temp_buffer[j&1][0], buf_size);
  899. memcpy(s->decorr_passes, save_decorr_passes, sizeof(struct Decorr) * MAX_TERMS);
  900. s->num_terms = nterms;
  901. s->best_decorr = c;
  902. best_size = size;
  903. }
  904. if (pi++)
  905. s->mask_decorr = s->mask_decorr ? ((s->mask_decorr << 1) & (s->num_decorrs - 1)) : 1;
  906. }
  907. if (s->extra_flags)
  908. analyze_mono(s, samples, do_samples);
  909. else if (do_samples)
  910. memcpy(samples, s->best_buffer[0], buf_size);
  911. if (no_history || s->extra_flags) {
  912. CLEAR(s->w);
  913. scan_word(s, &s->w.c[0], s->best_buffer[0], nb_samples, -1);
  914. }
  915. return 0;
  916. }
  917. static void decorr_stereo(int32_t *in_left, int32_t *in_right,
  918. int32_t *out_left, int32_t *out_right,
  919. int nb_samples, struct Decorr *dpp, int dir)
  920. {
  921. int m = 0, i;
  922. dpp->sumA = dpp->sumB = 0;
  923. if (dir < 0) {
  924. out_left += nb_samples - 1;
  925. out_right += nb_samples - 1;
  926. in_left += nb_samples - 1;
  927. in_right += nb_samples - 1;
  928. }
  929. dpp->weightA = restore_weight(store_weight(dpp->weightA));
  930. dpp->weightB = restore_weight(store_weight(dpp->weightB));
  931. for (i = 0; i < MAX_TERM; i++) {
  932. dpp->samplesA[i] = wp_exp2(log2s(dpp->samplesA[i]));
  933. dpp->samplesB[i] = wp_exp2(log2s(dpp->samplesB[i]));
  934. }
  935. switch (dpp->value) {
  936. case 2:
  937. while (nb_samples--) {
  938. int32_t sam, tmp;
  939. sam = dpp->samplesA[0];
  940. dpp->samplesA[0] = dpp->samplesA[1];
  941. out_left[0] = tmp = (dpp->samplesA[1] = in_left[0]) - APPLY_WEIGHT(dpp->weightA, sam);
  942. UPDATE_WEIGHT(dpp->weightA, dpp->delta, sam, tmp);
  943. dpp->sumA += dpp->weightA;
  944. sam = dpp->samplesB[0];
  945. dpp->samplesB[0] = dpp->samplesB[1];
  946. out_right[0] = tmp = (dpp->samplesB[1] = in_right[0]) - APPLY_WEIGHT(dpp->weightB, sam);
  947. UPDATE_WEIGHT(dpp->weightB, dpp->delta, sam, tmp);
  948. dpp->sumB += dpp->weightB;
  949. in_left += dir;
  950. out_left += dir;
  951. in_right += dir;
  952. out_right += dir;
  953. }
  954. break;
  955. case 17:
  956. while (nb_samples--) {
  957. int32_t sam, tmp;
  958. sam = 2 * dpp->samplesA[0] - dpp->samplesA[1];
  959. dpp->samplesA[1] = dpp->samplesA[0];
  960. out_left[0] = tmp = (dpp->samplesA[0] = in_left[0]) - APPLY_WEIGHT(dpp->weightA, sam);
  961. UPDATE_WEIGHT(dpp->weightA, dpp->delta, sam, tmp);
  962. dpp->sumA += dpp->weightA;
  963. sam = 2 * dpp->samplesB[0] - dpp->samplesB[1];
  964. dpp->samplesB[1] = dpp->samplesB[0];
  965. out_right[0] = tmp = (dpp->samplesB[0] = in_right[0]) - APPLY_WEIGHT (dpp->weightB, sam);
  966. UPDATE_WEIGHT(dpp->weightB, dpp->delta, sam, tmp);
  967. dpp->sumB += dpp->weightB;
  968. in_left += dir;
  969. out_left += dir;
  970. in_right += dir;
  971. out_right += dir;
  972. }
  973. break;
  974. case 18:
  975. while (nb_samples--) {
  976. int32_t sam, tmp;
  977. sam = dpp->samplesA[0] + ((dpp->samplesA[0] - dpp->samplesA[1]) >> 1);
  978. dpp->samplesA[1] = dpp->samplesA[0];
  979. out_left[0] = tmp = (dpp->samplesA[0] = in_left[0]) - APPLY_WEIGHT(dpp->weightA, sam);
  980. UPDATE_WEIGHT(dpp->weightA, dpp->delta, sam, tmp);
  981. dpp->sumA += dpp->weightA;
  982. sam = dpp->samplesB[0] + ((dpp->samplesB[0] - dpp->samplesB[1]) >> 1);
  983. dpp->samplesB[1] = dpp->samplesB[0];
  984. out_right[0] = tmp = (dpp->samplesB[0] = in_right[0]) - APPLY_WEIGHT(dpp->weightB, sam);
  985. UPDATE_WEIGHT(dpp->weightB, dpp->delta, sam, tmp);
  986. dpp->sumB += dpp->weightB;
  987. in_left += dir;
  988. out_left += dir;
  989. in_right += dir;
  990. out_right += dir;
  991. }
  992. break;
  993. default: {
  994. int k = dpp->value & (MAX_TERM - 1);
  995. while (nb_samples--) {
  996. int32_t sam, tmp;
  997. sam = dpp->samplesA[m];
  998. out_left[0] = tmp = (dpp->samplesA[k] = in_left[0]) - APPLY_WEIGHT(dpp->weightA, sam);
  999. UPDATE_WEIGHT(dpp->weightA, dpp->delta, sam, tmp);
  1000. dpp->sumA += dpp->weightA;
  1001. sam = dpp->samplesB[m];
  1002. out_right[0] = tmp = (dpp->samplesB[k] = in_right[0]) - APPLY_WEIGHT(dpp->weightB, sam);
  1003. UPDATE_WEIGHT(dpp->weightB, dpp->delta, sam, tmp);
  1004. dpp->sumB += dpp->weightB;
  1005. in_left += dir;
  1006. out_left += dir;
  1007. in_right += dir;
  1008. out_right += dir;
  1009. m = (m + 1) & (MAX_TERM - 1);
  1010. k = (k + 1) & (MAX_TERM - 1);
  1011. }
  1012. if (m) {
  1013. int32_t temp_A[MAX_TERM], temp_B[MAX_TERM];
  1014. int k;
  1015. memcpy(temp_A, dpp->samplesA, sizeof(dpp->samplesA));
  1016. memcpy(temp_B, dpp->samplesB, sizeof(dpp->samplesB));
  1017. for (k = 0; k < MAX_TERM; k++) {
  1018. dpp->samplesA[k] = temp_A[m];
  1019. dpp->samplesB[k] = temp_B[m];
  1020. m = (m + 1) & (MAX_TERM - 1);
  1021. }
  1022. }
  1023. break;
  1024. }
  1025. case -1:
  1026. while (nb_samples--) {
  1027. int32_t sam_A, sam_B, tmp;
  1028. sam_A = dpp->samplesA[0];
  1029. out_left[0] = tmp = (sam_B = in_left[0]) - APPLY_WEIGHT(dpp->weightA, sam_A);
  1030. UPDATE_WEIGHT_CLIP(dpp->weightA, dpp->delta, sam_A, tmp);
  1031. dpp->sumA += dpp->weightA;
  1032. out_right[0] = tmp = (dpp->samplesA[0] = in_right[0]) - APPLY_WEIGHT(dpp->weightB, sam_B);
  1033. UPDATE_WEIGHT_CLIP(dpp->weightB, dpp->delta, sam_B, tmp);
  1034. dpp->sumB += dpp->weightB;
  1035. in_left += dir;
  1036. out_left += dir;
  1037. in_right += dir;
  1038. out_right += dir;
  1039. }
  1040. break;
  1041. case -2:
  1042. while (nb_samples--) {
  1043. int32_t sam_A, sam_B, tmp;
  1044. sam_B = dpp->samplesB[0];
  1045. out_right[0] = tmp = (sam_A = in_right[0]) - APPLY_WEIGHT(dpp->weightB, sam_B);
  1046. UPDATE_WEIGHT_CLIP(dpp->weightB, dpp->delta, sam_B, tmp);
  1047. dpp->sumB += dpp->weightB;
  1048. out_left[0] = tmp = (dpp->samplesB[0] = in_left[0]) - APPLY_WEIGHT(dpp->weightA, sam_A);
  1049. UPDATE_WEIGHT_CLIP(dpp->weightA, dpp->delta, sam_A, tmp);
  1050. dpp->sumA += dpp->weightA;
  1051. in_left += dir;
  1052. out_left += dir;
  1053. in_right += dir;
  1054. out_right += dir;
  1055. }
  1056. break;
  1057. case -3:
  1058. while (nb_samples--) {
  1059. int32_t sam_A, sam_B, tmp;
  1060. sam_A = dpp->samplesA[0];
  1061. sam_B = dpp->samplesB[0];
  1062. dpp->samplesA[0] = tmp = in_right[0];
  1063. out_right[0] = tmp -= APPLY_WEIGHT(dpp->weightB, sam_B);
  1064. UPDATE_WEIGHT_CLIP(dpp->weightB, dpp->delta, sam_B, tmp);
  1065. dpp->sumB += dpp->weightB;
  1066. dpp->samplesB[0] = tmp = in_left[0];
  1067. out_left[0] = tmp -= APPLY_WEIGHT(dpp->weightA, sam_A);
  1068. UPDATE_WEIGHT_CLIP(dpp->weightA, dpp->delta, sam_A, tmp);
  1069. dpp->sumA += dpp->weightA;
  1070. in_left += dir;
  1071. out_left += dir;
  1072. in_right += dir;
  1073. out_right += dir;
  1074. }
  1075. break;
  1076. }
  1077. }
  1078. static void reverse_decorr(struct Decorr *dpp)
  1079. {
  1080. if (dpp->value > MAX_TERM) {
  1081. int32_t sam_A, sam_B;
  1082. if (dpp->value & 1) {
  1083. sam_A = 2 * dpp->samplesA[0] - dpp->samplesA[1];
  1084. sam_B = 2 * dpp->samplesB[0] - dpp->samplesB[1];
  1085. } else {
  1086. sam_A = (3 * dpp->samplesA[0] - dpp->samplesA[1]) >> 1;
  1087. sam_B = (3 * dpp->samplesB[0] - dpp->samplesB[1]) >> 1;
  1088. }
  1089. dpp->samplesA[1] = dpp->samplesA[0];
  1090. dpp->samplesB[1] = dpp->samplesB[0];
  1091. dpp->samplesA[0] = sam_A;
  1092. dpp->samplesB[0] = sam_B;
  1093. if (dpp->value & 1) {
  1094. sam_A = 2 * dpp->samplesA[0] - dpp->samplesA[1];
  1095. sam_B = 2 * dpp->samplesB[0] - dpp->samplesB[1];
  1096. } else {
  1097. sam_A = (3 * dpp->samplesA[0] - dpp->samplesA[1]) >> 1;
  1098. sam_B = (3 * dpp->samplesB[0] - dpp->samplesB[1]) >> 1;
  1099. }
  1100. dpp->samplesA[1] = sam_A;
  1101. dpp->samplesB[1] = sam_B;
  1102. } else if (dpp->value > 1) {
  1103. int i, j, k;
  1104. for (i = 0, j = dpp->value - 1, k = 0; k < dpp->value / 2; i++, j--, k++) {
  1105. i &= (MAX_TERM - 1);
  1106. j &= (MAX_TERM - 1);
  1107. dpp->samplesA[i] ^= dpp->samplesA[j];
  1108. dpp->samplesA[j] ^= dpp->samplesA[i];
  1109. dpp->samplesA[i] ^= dpp->samplesA[j];
  1110. dpp->samplesB[i] ^= dpp->samplesB[j];
  1111. dpp->samplesB[j] ^= dpp->samplesB[i];
  1112. dpp->samplesB[i] ^= dpp->samplesB[j];
  1113. }
  1114. }
  1115. }
  1116. static void decorr_stereo_quick(int32_t *in_left, int32_t *in_right,
  1117. int32_t *out_left, int32_t *out_right,
  1118. int nb_samples, struct Decorr *dpp)
  1119. {
  1120. int m = 0, i;
  1121. dpp->weightA = restore_weight(store_weight(dpp->weightA));
  1122. dpp->weightB = restore_weight(store_weight(dpp->weightB));
  1123. for (i = 0; i < MAX_TERM; i++) {
  1124. dpp->samplesA[i] = wp_exp2(log2s(dpp->samplesA[i]));
  1125. dpp->samplesB[i] = wp_exp2(log2s(dpp->samplesB[i]));
  1126. }
  1127. switch (dpp->value) {
  1128. case 2:
  1129. for (i = 0; i < nb_samples; i++) {
  1130. int32_t sam, tmp;
  1131. sam = dpp->samplesA[0];
  1132. dpp->samplesA[0] = dpp->samplesA[1];
  1133. out_left[i] = tmp = (dpp->samplesA[1] = in_left[i]) - APPLY_WEIGHT_I(dpp->weightA, sam);
  1134. UPDATE_WEIGHT(dpp->weightA, dpp->delta, sam, tmp);
  1135. sam = dpp->samplesB[0];
  1136. dpp->samplesB[0] = dpp->samplesB[1];
  1137. out_right[i] = tmp = (dpp->samplesB[1] = in_right[i]) - APPLY_WEIGHT_I(dpp->weightB, sam);
  1138. UPDATE_WEIGHT(dpp->weightB, dpp->delta, sam, tmp);
  1139. }
  1140. break;
  1141. case 17:
  1142. for (i = 0; i < nb_samples; i++) {
  1143. int32_t sam, tmp;
  1144. sam = 2 * dpp->samplesA[0] - dpp->samplesA[1];
  1145. dpp->samplesA[1] = dpp->samplesA[0];
  1146. out_left[i] = tmp = (dpp->samplesA[0] = in_left[i]) - APPLY_WEIGHT_I(dpp->weightA, sam);
  1147. UPDATE_WEIGHT(dpp->weightA, dpp->delta, sam, tmp);
  1148. sam = 2 * dpp->samplesB[0] - dpp->samplesB[1];
  1149. dpp->samplesB[1] = dpp->samplesB[0];
  1150. out_right[i] = tmp = (dpp->samplesB[0] = in_right[i]) - APPLY_WEIGHT_I(dpp->weightB, sam);
  1151. UPDATE_WEIGHT(dpp->weightB, dpp->delta, sam, tmp);
  1152. }
  1153. break;
  1154. case 18:
  1155. for (i = 0; i < nb_samples; i++) {
  1156. int32_t sam, tmp;
  1157. sam = dpp->samplesA[0] + ((dpp->samplesA[0] - dpp->samplesA[1]) >> 1);
  1158. dpp->samplesA[1] = dpp->samplesA[0];
  1159. out_left[i] = tmp = (dpp->samplesA[0] = in_left[i]) - APPLY_WEIGHT_I(dpp->weightA, sam);
  1160. UPDATE_WEIGHT(dpp->weightA, dpp->delta, sam, tmp);
  1161. sam = dpp->samplesB[0] + ((dpp->samplesB[0] - dpp->samplesB[1]) >> 1);
  1162. dpp->samplesB[1] = dpp->samplesB[0];
  1163. out_right[i] = tmp = (dpp->samplesB[0] = in_right[i]) - APPLY_WEIGHT_I(dpp->weightB, sam);
  1164. UPDATE_WEIGHT(dpp->weightB, dpp->delta, sam, tmp);
  1165. }
  1166. break;
  1167. default: {
  1168. int k = dpp->value & (MAX_TERM - 1);
  1169. for (i = 0; i < nb_samples; i++) {
  1170. int32_t sam, tmp;
  1171. sam = dpp->samplesA[m];
  1172. out_left[i] = tmp = (dpp->samplesA[k] = in_left[i]) - APPLY_WEIGHT_I(dpp->weightA, sam);
  1173. UPDATE_WEIGHT(dpp->weightA, dpp->delta, sam, tmp);
  1174. sam = dpp->samplesB[m];
  1175. out_right[i] = tmp = (dpp->samplesB[k] = in_right[i]) - APPLY_WEIGHT_I(dpp->weightB, sam);
  1176. UPDATE_WEIGHT(dpp->weightB, dpp->delta, sam, tmp);
  1177. m = (m + 1) & (MAX_TERM - 1);
  1178. k = (k + 1) & (MAX_TERM - 1);
  1179. }
  1180. if (m) {
  1181. int32_t temp_A[MAX_TERM], temp_B[MAX_TERM];
  1182. int k;
  1183. memcpy(temp_A, dpp->samplesA, sizeof(dpp->samplesA));
  1184. memcpy(temp_B, dpp->samplesB, sizeof(dpp->samplesB));
  1185. for (k = 0; k < MAX_TERM; k++) {
  1186. dpp->samplesA[k] = temp_A[m];
  1187. dpp->samplesB[k] = temp_B[m];
  1188. m = (m + 1) & (MAX_TERM - 1);
  1189. }
  1190. }
  1191. break;
  1192. }
  1193. case -1:
  1194. for (i = 0; i < nb_samples; i++) {
  1195. int32_t sam_A, sam_B, tmp;
  1196. sam_A = dpp->samplesA[0];
  1197. out_left[i] = tmp = (sam_B = in_left[i]) - APPLY_WEIGHT_I(dpp->weightA, sam_A);
  1198. UPDATE_WEIGHT_CLIP(dpp->weightA, dpp->delta, sam_A, tmp);
  1199. out_right[i] = tmp = (dpp->samplesA[0] = in_right[i]) - APPLY_WEIGHT_I(dpp->weightB, sam_B);
  1200. UPDATE_WEIGHT_CLIP(dpp->weightB, dpp->delta, sam_B, tmp);
  1201. }
  1202. break;
  1203. case -2:
  1204. for (i = 0; i < nb_samples; i++) {
  1205. int32_t sam_A, sam_B, tmp;
  1206. sam_B = dpp->samplesB[0];
  1207. out_right[i] = tmp = (sam_A = in_right[i]) - APPLY_WEIGHT_I(dpp->weightB, sam_B);
  1208. UPDATE_WEIGHT_CLIP(dpp->weightB, dpp->delta, sam_B, tmp);
  1209. out_left[i] = tmp = (dpp->samplesB[0] = in_left[i]) - APPLY_WEIGHT_I(dpp->weightA, sam_A);
  1210. UPDATE_WEIGHT_CLIP(dpp->weightA, dpp->delta, sam_A, tmp);
  1211. }
  1212. break;
  1213. case -3:
  1214. for (i = 0; i < nb_samples; i++) {
  1215. int32_t sam_A, sam_B, tmp;
  1216. sam_A = dpp->samplesA[0];
  1217. sam_B = dpp->samplesB[0];
  1218. dpp->samplesA[0] = tmp = in_right[i];
  1219. out_right[i] = tmp -= APPLY_WEIGHT_I(dpp->weightB, sam_B);
  1220. UPDATE_WEIGHT_CLIP(dpp->weightB, dpp->delta, sam_B, tmp);
  1221. dpp->samplesB[0] = tmp = in_left[i];
  1222. out_left[i] = tmp -= APPLY_WEIGHT_I(dpp->weightA, sam_A);
  1223. UPDATE_WEIGHT_CLIP(dpp->weightA, dpp->delta, sam_A, tmp);
  1224. }
  1225. break;
  1226. }
  1227. }
  1228. static void decorr_stereo_buffer(WavPackExtraInfo *info,
  1229. int32_t *in_left, int32_t *in_right,
  1230. int32_t *out_left, int32_t *out_right,
  1231. int nb_samples, int tindex)
  1232. {
  1233. struct Decorr dp = {0}, *dppi = info->dps + tindex;
  1234. int delta = dppi->delta, pre_delta;
  1235. int term = dppi->value;
  1236. if (delta == 7)
  1237. pre_delta = 7;
  1238. else if (delta < 2)
  1239. pre_delta = 3;
  1240. else
  1241. pre_delta = delta + 1;
  1242. dp.value = term;
  1243. dp.delta = pre_delta;
  1244. decorr_stereo(in_left, in_right, out_left, out_right,
  1245. FFMIN(2048, nb_samples), &dp, -1);
  1246. dp.delta = delta;
  1247. if (tindex == 0) {
  1248. reverse_decorr(&dp);
  1249. } else {
  1250. CLEAR(dp.samplesA);
  1251. CLEAR(dp.samplesB);
  1252. }
  1253. memcpy(dppi->samplesA, dp.samplesA, sizeof(dp.samplesA));
  1254. memcpy(dppi->samplesB, dp.samplesB, sizeof(dp.samplesB));
  1255. dppi->weightA = dp.weightA;
  1256. dppi->weightB = dp.weightB;
  1257. if (delta == 0) {
  1258. dp.delta = 1;
  1259. decorr_stereo(in_left, in_right, out_left, out_right, nb_samples, &dp, 1);
  1260. dp.delta = 0;
  1261. memcpy(dp.samplesA, dppi->samplesA, sizeof(dp.samplesA));
  1262. memcpy(dp.samplesB, dppi->samplesB, sizeof(dp.samplesB));
  1263. dppi->weightA = dp.weightA = dp.sumA / nb_samples;
  1264. dppi->weightB = dp.weightB = dp.sumB / nb_samples;
  1265. }
  1266. if (info->gt16bit)
  1267. decorr_stereo(in_left, in_right, out_left, out_right,
  1268. nb_samples, &dp, 1);
  1269. else
  1270. decorr_stereo_quick(in_left, in_right, out_left, out_right,
  1271. nb_samples, &dp);
  1272. }
  1273. static void sort_stereo(WavPackEncodeContext *s, WavPackExtraInfo *info)
  1274. {
  1275. int reversed = 1;
  1276. uint32_t bits;
  1277. while (reversed) {
  1278. int ri, i;
  1279. memcpy(info->dps, s->decorr_passes, sizeof(s->decorr_passes));
  1280. reversed = 0;
  1281. for (ri = 0; ri < info->nterms && s->decorr_passes[ri].value; ri++) {
  1282. if (ri + 1 >= info->nterms || !s->decorr_passes[ri+1].value)
  1283. break;
  1284. if (s->decorr_passes[ri].value == s->decorr_passes[ri+1].value) {
  1285. decorr_stereo_buffer(info,
  1286. s->sampleptrs[ri ][0], s->sampleptrs[ri ][1],
  1287. s->sampleptrs[ri+1][0], s->sampleptrs[ri+1][1],
  1288. s->block_samples, ri);
  1289. continue;
  1290. }
  1291. info->dps[ri ] = s->decorr_passes[ri+1];
  1292. info->dps[ri+1] = s->decorr_passes[ri ];
  1293. for (i = ri; i < info->nterms && s->decorr_passes[i].value; i++)
  1294. decorr_stereo_buffer(info,
  1295. s->sampleptrs[i ][0], s->sampleptrs[i ][1],
  1296. s->sampleptrs[i+1][0], s->sampleptrs[i+1][1],
  1297. s->block_samples, i);
  1298. bits = log2stereo(s->sampleptrs[i][0], s->sampleptrs[i][1],
  1299. s->block_samples, info->log_limit);
  1300. if (bits < info->best_bits) {
  1301. reversed = 1;
  1302. info->best_bits = bits;
  1303. CLEAR(s->decorr_passes);
  1304. memcpy(s->decorr_passes, info->dps, sizeof(info->dps[0]) * i);
  1305. memcpy(s->sampleptrs[info->nterms + 1][0],
  1306. s->sampleptrs[i][0], s->block_samples * 4);
  1307. memcpy(s->sampleptrs[info->nterms + 1][1],
  1308. s->sampleptrs[i][1], s->block_samples * 4);
  1309. } else {
  1310. info->dps[ri ] = s->decorr_passes[ri ];
  1311. info->dps[ri+1] = s->decorr_passes[ri+1];
  1312. decorr_stereo_buffer(info,
  1313. s->sampleptrs[ri ][0], s->sampleptrs[ri ][1],
  1314. s->sampleptrs[ri+1][0], s->sampleptrs[ri+1][1],
  1315. s->block_samples, ri);
  1316. }
  1317. }
  1318. }
  1319. }
  1320. static void delta_stereo(WavPackEncodeContext *s, WavPackExtraInfo *info)
  1321. {
  1322. int lower = 0, delta, d, i;
  1323. uint32_t bits;
  1324. if (!s->decorr_passes[0].value)
  1325. return;
  1326. delta = s->decorr_passes[0].delta;
  1327. for (d = delta - 1; d >= 0; d--) {
  1328. for (i = 0; i < info->nterms && s->decorr_passes[i].value; i++) {
  1329. info->dps[i].value = s->decorr_passes[i].value;
  1330. info->dps[i].delta = d;
  1331. decorr_stereo_buffer(info,
  1332. s->sampleptrs[i ][0], s->sampleptrs[i ][1],
  1333. s->sampleptrs[i+1][0], s->sampleptrs[i+1][1],
  1334. s->block_samples, i);
  1335. }
  1336. bits = log2stereo(s->sampleptrs[i][0], s->sampleptrs[i][1],
  1337. s->block_samples, info->log_limit);
  1338. if (bits >= info->best_bits)
  1339. break;
  1340. lower = 1;
  1341. info->best_bits = bits;
  1342. CLEAR(s->decorr_passes);
  1343. memcpy(s->decorr_passes, info->dps, sizeof(info->dps[0]) * i);
  1344. memcpy(s->sampleptrs[info->nterms + 1][0], s->sampleptrs[i][0],
  1345. s->block_samples * 4);
  1346. memcpy(s->sampleptrs[info->nterms + 1][1], s->sampleptrs[i][1],
  1347. s->block_samples * 4);
  1348. }
  1349. for (d = delta + 1; !lower && d <= 7; d++) {
  1350. for (i = 0; i < info->nterms && s->decorr_passes[i].value; i++) {
  1351. info->dps[i].value = s->decorr_passes[i].value;
  1352. info->dps[i].delta = d;
  1353. decorr_stereo_buffer(info,
  1354. s->sampleptrs[i ][0], s->sampleptrs[i ][1],
  1355. s->sampleptrs[i+1][0], s->sampleptrs[i+1][1],
  1356. s->block_samples, i);
  1357. }
  1358. bits = log2stereo(s->sampleptrs[i][0], s->sampleptrs[i][1],
  1359. s->block_samples, info->log_limit);
  1360. if (bits < info->best_bits) {
  1361. info->best_bits = bits;
  1362. CLEAR(s->decorr_passes);
  1363. memcpy(s->decorr_passes, info->dps, sizeof(info->dps[0]) * i);
  1364. memcpy(s->sampleptrs[info->nterms + 1][0],
  1365. s->sampleptrs[i][0], s->block_samples * 4);
  1366. memcpy(s->sampleptrs[info->nterms + 1][1],
  1367. s->sampleptrs[i][1], s->block_samples * 4);
  1368. }
  1369. else
  1370. break;
  1371. }
  1372. }
  1373. static void recurse_stereo(WavPackEncodeContext *s, WavPackExtraInfo *info,
  1374. int depth, int delta, uint32_t input_bits)
  1375. {
  1376. int term, branches = s->num_branches - depth;
  1377. int32_t *in_left, *in_right, *out_left, *out_right;
  1378. uint32_t term_bits[22], bits;
  1379. if (branches < 1 || depth + 1 == info->nterms)
  1380. branches = 1;
  1381. CLEAR(term_bits);
  1382. in_left = s->sampleptrs[depth ][0];
  1383. in_right = s->sampleptrs[depth ][1];
  1384. out_left = s->sampleptrs[depth + 1][0];
  1385. out_right = s->sampleptrs[depth + 1][1];
  1386. for (term = -3; term <= 18; term++) {
  1387. if (!term || (term > 8 && term < 17))
  1388. continue;
  1389. if (term == 17 && branches == 1 && depth + 1 < info->nterms)
  1390. continue;
  1391. if (term == -1 || term == -2)
  1392. if (!(s->flags & WV_CROSS_DECORR))
  1393. continue;
  1394. if (!s->extra_flags && (term > 4 && term < 17))
  1395. continue;
  1396. info->dps[depth].value = term;
  1397. info->dps[depth].delta = delta;
  1398. decorr_stereo_buffer(info, in_left, in_right, out_left, out_right,
  1399. s->block_samples, depth);
  1400. bits = log2stereo(out_left, out_right, s->block_samples, info->log_limit);
  1401. if (bits < info->best_bits) {
  1402. info->best_bits = bits;
  1403. CLEAR(s->decorr_passes);
  1404. memcpy(s->decorr_passes, info->dps, sizeof(info->dps[0]) * (depth + 1));
  1405. memcpy(s->sampleptrs[info->nterms + 1][0], s->sampleptrs[depth + 1][0],
  1406. s->block_samples * 4);
  1407. memcpy(s->sampleptrs[info->nterms + 1][1], s->sampleptrs[depth + 1][1],
  1408. s->block_samples * 4);
  1409. }
  1410. term_bits[term + 3] = bits;
  1411. }
  1412. while (depth + 1 < info->nterms && branches--) {
  1413. uint32_t local_best_bits = input_bits;
  1414. int best_term = 0, i;
  1415. for (i = 0; i < 22; i++)
  1416. if (term_bits[i] && term_bits[i] < local_best_bits) {
  1417. local_best_bits = term_bits[i];
  1418. best_term = i - 3;
  1419. }
  1420. if (!best_term)
  1421. break;
  1422. term_bits[best_term + 3] = 0;
  1423. info->dps[depth].value = best_term;
  1424. info->dps[depth].delta = delta;
  1425. decorr_stereo_buffer(info, in_left, in_right, out_left, out_right,
  1426. s->block_samples, depth);
  1427. recurse_stereo(s, info, depth + 1, delta, local_best_bits);
  1428. }
  1429. }
  1430. static void analyze_stereo(WavPackEncodeContext *s,
  1431. int32_t *in_left, int32_t *in_right,
  1432. int do_samples)
  1433. {
  1434. WavPackExtraInfo info;
  1435. int i;
  1436. info.gt16bit = ((s->flags & MAG_MASK) >> MAG_LSB) >= 16;
  1437. info.log_limit = (((s->flags & MAG_MASK) >> MAG_LSB) + 4) * 256;
  1438. info.log_limit = FFMIN(6912, info.log_limit);
  1439. info.nterms = s->num_terms;
  1440. if (allocate_buffers2(s, s->num_terms))
  1441. return;
  1442. memcpy(info.dps, s->decorr_passes, sizeof(info.dps));
  1443. memcpy(s->sampleptrs[0][0], in_left, s->block_samples * 4);
  1444. memcpy(s->sampleptrs[0][1], in_right, s->block_samples * 4);
  1445. for (i = 0; i < info.nterms && info.dps[i].value; i++)
  1446. if (info.gt16bit)
  1447. decorr_stereo(s->sampleptrs[i ][0], s->sampleptrs[i ][1],
  1448. s->sampleptrs[i + 1][0], s->sampleptrs[i + 1][1],
  1449. s->block_samples, info.dps + i, 1);
  1450. else
  1451. decorr_stereo_quick(s->sampleptrs[i ][0], s->sampleptrs[i ][1],
  1452. s->sampleptrs[i + 1][0], s->sampleptrs[i + 1][1],
  1453. s->block_samples, info.dps + i);
  1454. info.best_bits = log2stereo(s->sampleptrs[info.nterms][0], s->sampleptrs[info.nterms][1],
  1455. s->block_samples, 0);
  1456. memcpy(s->sampleptrs[info.nterms + 1][0], s->sampleptrs[i][0], s->block_samples * 4);
  1457. memcpy(s->sampleptrs[info.nterms + 1][1], s->sampleptrs[i][1], s->block_samples * 4);
  1458. if (s->extra_flags & EXTRA_BRANCHES)
  1459. recurse_stereo(s, &info, 0, (int) floor(s->delta_decay + 0.5),
  1460. log2stereo(s->sampleptrs[0][0], s->sampleptrs[0][1],
  1461. s->block_samples, 0));
  1462. if (s->extra_flags & EXTRA_SORT_FIRST)
  1463. sort_stereo(s, &info);
  1464. if (s->extra_flags & EXTRA_TRY_DELTAS) {
  1465. delta_stereo(s, &info);
  1466. if ((s->extra_flags & EXTRA_ADJUST_DELTAS) && s->decorr_passes[0].value)
  1467. s->delta_decay = (float)((s->delta_decay * 2.0 + s->decorr_passes[0].delta) / 3.0);
  1468. else
  1469. s->delta_decay = 2.0;
  1470. }
  1471. if (s->extra_flags & EXTRA_SORT_LAST)
  1472. sort_stereo(s, &info);
  1473. if (do_samples) {
  1474. memcpy(in_left, s->sampleptrs[info.nterms + 1][0], s->block_samples * 4);
  1475. memcpy(in_right, s->sampleptrs[info.nterms + 1][1], s->block_samples * 4);
  1476. }
  1477. for (i = 0; i < info.nterms; i++)
  1478. if (!s->decorr_passes[i].value)
  1479. break;
  1480. s->num_terms = i;
  1481. }
  1482. static int wv_stereo(WavPackEncodeContext *s,
  1483. int32_t *samples_l, int32_t *samples_r,
  1484. int no_history, int do_samples)
  1485. {
  1486. struct Decorr temp_decorr_pass, save_decorr_passes[MAX_TERMS] = {{0}};
  1487. int nb_samples = s->block_samples, ret;
  1488. int buf_size = sizeof(int32_t) * nb_samples;
  1489. int log_limit, force_js = 0, force_ts = 0, got_js = 0, pi, i;
  1490. uint32_t best_size = UINT32_MAX, size;
  1491. for (i = 0; i < nb_samples; i++)
  1492. if (samples_l[i] || samples_r[i])
  1493. break;
  1494. if (i == nb_samples) {
  1495. s->flags &= ~((uint32_t) WV_JOINT_STEREO);
  1496. CLEAR(s->decorr_passes);
  1497. CLEAR(s->w);
  1498. s->num_terms = 0;
  1499. return 0;
  1500. }
  1501. log_limit = (((s->flags & MAG_MASK) >> MAG_LSB) + 4) * 256;
  1502. log_limit = FFMIN(6912, log_limit);
  1503. if (s->joint != -1) {
  1504. force_js = s->joint;
  1505. force_ts = !s->joint;
  1506. }
  1507. if ((ret = allocate_buffers(s)) < 0)
  1508. return ret;
  1509. if (no_history || s->num_passes >= 7)
  1510. s->best_decorr = s->mask_decorr = 0;
  1511. for (pi = 0; pi < s->num_passes;) {
  1512. const WavPackDecorrSpec *wpds;
  1513. int nterms, c, j;
  1514. if (!pi)
  1515. c = s->best_decorr;
  1516. else {
  1517. if (s->mask_decorr == 0)
  1518. c = 0;
  1519. else
  1520. c = (s->best_decorr & (s->mask_decorr - 1)) | s->mask_decorr;
  1521. if (c == s->best_decorr) {
  1522. s->mask_decorr = s->mask_decorr ? ((s->mask_decorr << 1) & (s->num_decorrs - 1)) : 1;
  1523. continue;
  1524. }
  1525. }
  1526. wpds = &s->decorr_specs[c];
  1527. nterms = decorr_filter_nterms[s->decorr_filter];
  1528. while (1) {
  1529. if (force_js || (wpds->joint_stereo && !force_ts)) {
  1530. if (!got_js) {
  1531. av_fast_padded_malloc(&s->js_left, &s->js_left_size, buf_size);
  1532. av_fast_padded_malloc(&s->js_right, &s->js_right_size, buf_size);
  1533. memcpy(s->js_left, samples_l, buf_size);
  1534. memcpy(s->js_right, samples_r, buf_size);
  1535. for (i = 0; i < nb_samples; i++)
  1536. s->js_right[i] += ((s->js_left[i] -= s->js_right[i]) >> 1);
  1537. got_js = 1;
  1538. }
  1539. memcpy(s->temp_buffer[0][0], s->js_left, buf_size);
  1540. memcpy(s->temp_buffer[0][1], s->js_right, buf_size);
  1541. } else {
  1542. memcpy(s->temp_buffer[0][0], samples_l, buf_size);
  1543. memcpy(s->temp_buffer[0][1], samples_r, buf_size);
  1544. }
  1545. CLEAR(save_decorr_passes);
  1546. for (j = 0; j < nterms; j++) {
  1547. CLEAR(temp_decorr_pass);
  1548. temp_decorr_pass.delta = wpds->delta;
  1549. temp_decorr_pass.value = wpds->terms[j];
  1550. if (temp_decorr_pass.value < 0 && !(s->flags & WV_CROSS_DECORR))
  1551. temp_decorr_pass.value = -3;
  1552. decorr_stereo(s->temp_buffer[ j&1][0], s->temp_buffer[ j&1][1],
  1553. s->temp_buffer[~j&1][0], s->temp_buffer[~j&1][1],
  1554. FFMIN(2048, nb_samples), &temp_decorr_pass, -1);
  1555. if (j) {
  1556. CLEAR(temp_decorr_pass.samplesA);
  1557. CLEAR(temp_decorr_pass.samplesB);
  1558. } else {
  1559. reverse_decorr(&temp_decorr_pass);
  1560. }
  1561. memcpy(save_decorr_passes + j, &temp_decorr_pass, sizeof(struct Decorr));
  1562. if (((s->flags & MAG_MASK) >> MAG_LSB) >= 16)
  1563. decorr_stereo(s->temp_buffer[ j&1][0], s->temp_buffer[ j&1][1],
  1564. s->temp_buffer[~j&1][0], s->temp_buffer[~j&1][1],
  1565. nb_samples, &temp_decorr_pass, 1);
  1566. else
  1567. decorr_stereo_quick(s->temp_buffer[ j&1][0], s->temp_buffer[ j&1][1],
  1568. s->temp_buffer[~j&1][0], s->temp_buffer[~j&1][1],
  1569. nb_samples, &temp_decorr_pass);
  1570. }
  1571. size = log2stereo(s->temp_buffer[j&1][0], s->temp_buffer[j&1][1],
  1572. nb_samples, log_limit);
  1573. if (size != UINT32_MAX || !nterms)
  1574. break;
  1575. nterms >>= 1;
  1576. }
  1577. if (size < best_size) {
  1578. memcpy(s->best_buffer[0], s->temp_buffer[j&1][0], buf_size);
  1579. memcpy(s->best_buffer[1], s->temp_buffer[j&1][1], buf_size);
  1580. memcpy(s->decorr_passes, save_decorr_passes, sizeof(struct Decorr) * MAX_TERMS);
  1581. s->num_terms = nterms;
  1582. s->best_decorr = c;
  1583. best_size = size;
  1584. }
  1585. if (pi++)
  1586. s->mask_decorr = s->mask_decorr ? ((s->mask_decorr << 1) & (s->num_decorrs - 1)) : 1;
  1587. }
  1588. if (force_js || (s->decorr_specs[s->best_decorr].joint_stereo && !force_ts))
  1589. s->flags |= WV_JOINT_STEREO;
  1590. else
  1591. s->flags &= ~((uint32_t) WV_JOINT_STEREO);
  1592. if (s->extra_flags) {
  1593. if (s->flags & WV_JOINT_STEREO) {
  1594. analyze_stereo(s, s->js_left, s->js_right, do_samples);
  1595. if (do_samples) {
  1596. memcpy(samples_l, s->js_left, buf_size);
  1597. memcpy(samples_r, s->js_right, buf_size);
  1598. }
  1599. } else
  1600. analyze_stereo(s, samples_l, samples_r, do_samples);
  1601. } else if (do_samples) {
  1602. memcpy(samples_l, s->best_buffer[0], buf_size);
  1603. memcpy(samples_r, s->best_buffer[1], buf_size);
  1604. }
  1605. if (s->extra_flags || no_history ||
  1606. s->joint_stereo != s->decorr_specs[s->best_decorr].joint_stereo) {
  1607. s->joint_stereo = s->decorr_specs[s->best_decorr].joint_stereo;
  1608. CLEAR(s->w);
  1609. scan_word(s, &s->w.c[0], s->best_buffer[0], nb_samples, -1);
  1610. scan_word(s, &s->w.c[1], s->best_buffer[1], nb_samples, -1);
  1611. }
  1612. return 0;
  1613. }
  1614. #define count_bits(av) ( \
  1615. (av) < (1 << 8) ? nbits_table[av] : \
  1616. ( \
  1617. (av) < (1 << 16) ? nbits_table[(av) >> 8] + 8 : \
  1618. ((av) < (1 << 24) ? nbits_table[(av) >> 16] + 16 : nbits_table[(av) >> 24] + 24) \
  1619. ) \
  1620. )
  1621. static void encode_flush(WavPackEncodeContext *s)
  1622. {
  1623. WavPackWords *w = &s->w;
  1624. PutBitContext *pb = &s->pb;
  1625. if (w->zeros_acc) {
  1626. int cbits = count_bits(w->zeros_acc);
  1627. do {
  1628. if (cbits > 31) {
  1629. put_bits(pb, 31, 0x7FFFFFFF);
  1630. cbits -= 31;
  1631. } else {
  1632. put_bits(pb, cbits, (1 << cbits) - 1);
  1633. cbits = 0;
  1634. }
  1635. } while (cbits);
  1636. put_bits(pb, 1, 0);
  1637. while (w->zeros_acc > 1) {
  1638. put_bits(pb, 1, w->zeros_acc & 1);
  1639. w->zeros_acc >>= 1;
  1640. }
  1641. w->zeros_acc = 0;
  1642. }
  1643. if (w->holding_one) {
  1644. if (w->holding_one >= 16) {
  1645. int cbits;
  1646. put_bits(pb, 16, (1 << 16) - 1);
  1647. put_bits(pb, 1, 0);
  1648. w->holding_one -= 16;
  1649. cbits = count_bits(w->holding_one);
  1650. do {
  1651. if (cbits > 31) {
  1652. put_bits(pb, 31, 0x7FFFFFFF);
  1653. cbits -= 31;
  1654. } else {
  1655. put_bits(pb, cbits, (1 << cbits) - 1);
  1656. cbits = 0;
  1657. }
  1658. } while (cbits);
  1659. put_bits(pb, 1, 0);
  1660. while (w->holding_one > 1) {
  1661. put_bits(pb, 1, w->holding_one & 1);
  1662. w->holding_one >>= 1;
  1663. }
  1664. w->holding_zero = 0;
  1665. } else {
  1666. put_bits(pb, w->holding_one, (1 << w->holding_one) - 1);
  1667. }
  1668. w->holding_one = 0;
  1669. }
  1670. if (w->holding_zero) {
  1671. put_bits(pb, 1, 0);
  1672. w->holding_zero = 0;
  1673. }
  1674. if (w->pend_count) {
  1675. put_bits(pb, w->pend_count, w->pend_data);
  1676. w->pend_data = w->pend_count = 0;
  1677. }
  1678. }
  1679. static void wavpack_encode_sample(WavPackEncodeContext *s, WvChannel *c, int32_t sample)
  1680. {
  1681. WavPackWords *w = &s->w;
  1682. uint32_t ones_count, low, high;
  1683. int sign = sample < 0;
  1684. if (s->w.c[0].median[0] < 2 && !s->w.holding_zero && s->w.c[1].median[0] < 2) {
  1685. if (w->zeros_acc) {
  1686. if (sample)
  1687. encode_flush(s);
  1688. else {
  1689. w->zeros_acc++;
  1690. return;
  1691. }
  1692. } else if (sample) {
  1693. put_bits(&s->pb, 1, 0);
  1694. } else {
  1695. CLEAR(s->w.c[0].median);
  1696. CLEAR(s->w.c[1].median);
  1697. w->zeros_acc = 1;
  1698. return;
  1699. }
  1700. }
  1701. if (sign)
  1702. sample = ~sample;
  1703. if (sample < (int32_t) GET_MED(0)) {
  1704. ones_count = low = 0;
  1705. high = GET_MED(0) - 1;
  1706. DEC_MED(0);
  1707. } else {
  1708. low = GET_MED(0);
  1709. INC_MED(0);
  1710. if (sample - low < GET_MED(1)) {
  1711. ones_count = 1;
  1712. high = low + GET_MED(1) - 1;
  1713. DEC_MED(1);
  1714. } else {
  1715. low += GET_MED(1);
  1716. INC_MED(1);
  1717. if (sample - low < GET_MED(2)) {
  1718. ones_count = 2;
  1719. high = low + GET_MED(2) - 1;
  1720. DEC_MED(2);
  1721. } else {
  1722. ones_count = 2 + (sample - low) / GET_MED(2);
  1723. low += (ones_count - 2) * GET_MED(2);
  1724. high = low + GET_MED(2) - 1;
  1725. INC_MED(2);
  1726. }
  1727. }
  1728. }
  1729. if (w->holding_zero) {
  1730. if (ones_count)
  1731. w->holding_one++;
  1732. encode_flush(s);
  1733. if (ones_count) {
  1734. w->holding_zero = 1;
  1735. ones_count--;
  1736. } else
  1737. w->holding_zero = 0;
  1738. } else
  1739. w->holding_zero = 1;
  1740. w->holding_one = ones_count * 2;
  1741. if (high != low) {
  1742. uint32_t maxcode = high - low, code = sample - low;
  1743. int bitcount = count_bits(maxcode);
  1744. uint32_t extras = (1 << bitcount) - maxcode - 1;
  1745. if (code < extras) {
  1746. w->pend_data |= code << w->pend_count;
  1747. w->pend_count += bitcount - 1;
  1748. } else {
  1749. w->pend_data |= ((code + extras) >> 1) << w->pend_count;
  1750. w->pend_count += bitcount - 1;
  1751. w->pend_data |= ((code + extras) & 1) << w->pend_count++;
  1752. }
  1753. }
  1754. w->pend_data |= ((int32_t) sign << w->pend_count++);
  1755. if (!w->holding_zero)
  1756. encode_flush(s);
  1757. }
  1758. static void pack_int32(WavPackEncodeContext *s,
  1759. int32_t *samples_l, int32_t *samples_r,
  1760. int nb_samples)
  1761. {
  1762. const int sent_bits = s->int32_sent_bits;
  1763. PutBitContext *pb = &s->pb;
  1764. int i, pre_shift;
  1765. pre_shift = s->int32_zeros + s->int32_ones + s->int32_dups;
  1766. if (!sent_bits)
  1767. return;
  1768. if (s->flags & WV_MONO_DATA) {
  1769. for (i = 0; i < nb_samples; i++) {
  1770. put_sbits(pb, sent_bits, samples_l[i] >> pre_shift);
  1771. }
  1772. } else {
  1773. for (i = 0; i < nb_samples; i++) {
  1774. put_sbits(pb, sent_bits, samples_l[i] >> pre_shift);
  1775. put_sbits(pb, sent_bits, samples_r[i] >> pre_shift);
  1776. }
  1777. }
  1778. }
  1779. static void pack_float_sample(WavPackEncodeContext *s, int32_t *sample)
  1780. {
  1781. const int max_exp = s->float_max_exp;
  1782. PutBitContext *pb = &s->pb;
  1783. int32_t value, shift_count;
  1784. if (get_exponent(*sample) == 255) {
  1785. if (get_mantissa(*sample)) {
  1786. put_bits(pb, 1, 1);
  1787. put_bits(pb, 23, get_mantissa(*sample));
  1788. } else {
  1789. put_bits(pb, 1, 0);
  1790. }
  1791. value = 0x1000000;
  1792. shift_count = 0;
  1793. } else if (get_exponent(*sample)) {
  1794. shift_count = max_exp - get_exponent(*sample);
  1795. value = 0x800000 + get_mantissa(*sample);
  1796. } else {
  1797. shift_count = max_exp ? max_exp - 1 : 0;
  1798. value = get_mantissa(*sample);
  1799. }
  1800. if (shift_count < 25)
  1801. value >>= shift_count;
  1802. else
  1803. value = 0;
  1804. if (!value) {
  1805. if (s->float_flags & FLOAT_ZEROS_SENT) {
  1806. if (get_exponent(*sample) || get_mantissa(*sample)) {
  1807. put_bits(pb, 1, 1);
  1808. put_bits(pb, 23, get_mantissa(*sample));
  1809. if (max_exp >= 25)
  1810. put_bits(pb, 8, get_exponent(*sample));
  1811. put_bits(pb, 1, get_sign(*sample));
  1812. } else {
  1813. put_bits(pb, 1, 0);
  1814. if (s->float_flags & FLOAT_NEG_ZEROS)
  1815. put_bits(pb, 1, get_sign(*sample));
  1816. }
  1817. }
  1818. } else if (shift_count) {
  1819. if (s->float_flags & FLOAT_SHIFT_SENT) {
  1820. int32_t data = get_mantissa(*sample) & ((1 << shift_count) - 1);
  1821. put_bits(pb, shift_count, data);
  1822. } else if (s->float_flags & FLOAT_SHIFT_SAME) {
  1823. put_bits(pb, 1, get_mantissa(*sample) & 1);
  1824. }
  1825. }
  1826. }
  1827. static void pack_float(WavPackEncodeContext *s,
  1828. int32_t *samples_l, int32_t *samples_r,
  1829. int nb_samples)
  1830. {
  1831. int i;
  1832. if (s->flags & WV_MONO_DATA) {
  1833. for (i = 0; i < nb_samples; i++)
  1834. pack_float_sample(s, &samples_l[i]);
  1835. } else {
  1836. for (i = 0; i < nb_samples; i++) {
  1837. pack_float_sample(s, &samples_l[i]);
  1838. pack_float_sample(s, &samples_r[i]);
  1839. }
  1840. }
  1841. }
  1842. static void decorr_stereo_pass2(struct Decorr *dpp,
  1843. int32_t *samples_l, int32_t *samples_r,
  1844. int nb_samples)
  1845. {
  1846. int i, m, k;
  1847. switch (dpp->value) {
  1848. case 17:
  1849. for (i = 0; i < nb_samples; i++) {
  1850. int32_t sam, tmp;
  1851. sam = 2 * dpp->samplesA[0] - dpp->samplesA[1];
  1852. dpp->samplesA[1] = dpp->samplesA[0];
  1853. samples_l[i] = tmp = (dpp->samplesA[0] = samples_l[i]) - APPLY_WEIGHT(dpp->weightA, sam);
  1854. UPDATE_WEIGHT(dpp->weightA, dpp->delta, sam, tmp);
  1855. sam = 2 * dpp->samplesB[0] - dpp->samplesB[1];
  1856. dpp->samplesB[1] = dpp->samplesB[0];
  1857. samples_r[i] = tmp = (dpp->samplesB[0] = samples_r[i]) - APPLY_WEIGHT(dpp->weightB, sam);
  1858. UPDATE_WEIGHT(dpp->weightB, dpp->delta, sam, tmp);
  1859. }
  1860. break;
  1861. case 18:
  1862. for (i = 0; i < nb_samples; i++) {
  1863. int32_t sam, tmp;
  1864. sam = dpp->samplesA[0] + ((dpp->samplesA[0] - dpp->samplesA[1]) >> 1);
  1865. dpp->samplesA[1] = dpp->samplesA[0];
  1866. samples_l[i] = tmp = (dpp->samplesA[0] = samples_l[i]) - APPLY_WEIGHT(dpp->weightA, sam);
  1867. UPDATE_WEIGHT(dpp->weightA, dpp->delta, sam, tmp);
  1868. sam = dpp->samplesB[0] + ((dpp->samplesB[0] - dpp->samplesB[1]) >> 1);
  1869. dpp->samplesB[1] = dpp->samplesB[0];
  1870. samples_r[i] = tmp = (dpp->samplesB[0] = samples_r[i]) - APPLY_WEIGHT(dpp->weightB, sam);
  1871. UPDATE_WEIGHT(dpp->weightB, dpp->delta, sam, tmp);
  1872. }
  1873. break;
  1874. default:
  1875. for (m = 0, k = dpp->value & (MAX_TERM - 1), i = 0; i < nb_samples; i++) {
  1876. int32_t sam, tmp;
  1877. sam = dpp->samplesA[m];
  1878. samples_l[i] = tmp = (dpp->samplesA[k] = samples_l[i]) - APPLY_WEIGHT(dpp->weightA, sam);
  1879. UPDATE_WEIGHT(dpp->weightA, dpp->delta, sam, tmp);
  1880. sam = dpp->samplesB[m];
  1881. samples_r[i] = tmp = (dpp->samplesB[k] = samples_r[i]) - APPLY_WEIGHT(dpp->weightB, sam);
  1882. UPDATE_WEIGHT(dpp->weightB, dpp->delta, sam, tmp);
  1883. m = (m + 1) & (MAX_TERM - 1);
  1884. k = (k + 1) & (MAX_TERM - 1);
  1885. }
  1886. if (m) {
  1887. int32_t temp_A[MAX_TERM], temp_B[MAX_TERM];
  1888. memcpy(temp_A, dpp->samplesA, sizeof (dpp->samplesA));
  1889. memcpy(temp_B, dpp->samplesB, sizeof (dpp->samplesB));
  1890. for (k = 0; k < MAX_TERM; k++) {
  1891. dpp->samplesA[k] = temp_A[m];
  1892. dpp->samplesB[k] = temp_B[m];
  1893. m = (m + 1) & (MAX_TERM - 1);
  1894. }
  1895. }
  1896. break;
  1897. case -1:
  1898. for (i = 0; i < nb_samples; i++) {
  1899. int32_t sam_A, sam_B, tmp;
  1900. sam_A = dpp->samplesA[0];
  1901. samples_l[i] = tmp = (sam_B = samples_l[i]) - APPLY_WEIGHT(dpp->weightA, sam_A);
  1902. UPDATE_WEIGHT_CLIP(dpp->weightA, dpp->delta, sam_A, tmp);
  1903. samples_r[i] = tmp = (dpp->samplesA[0] = samples_r[i]) - APPLY_WEIGHT(dpp->weightB, sam_B);
  1904. UPDATE_WEIGHT_CLIP(dpp->weightB, dpp->delta, sam_B, tmp);
  1905. }
  1906. break;
  1907. case -2:
  1908. for (i = 0; i < nb_samples; i++) {
  1909. int32_t sam_A, sam_B, tmp;
  1910. sam_B = dpp->samplesB[0];
  1911. samples_r[i] = tmp = (sam_A = samples_r[i]) - APPLY_WEIGHT(dpp->weightB, sam_B);
  1912. UPDATE_WEIGHT_CLIP(dpp->weightB, dpp->delta, sam_B, tmp);
  1913. samples_l[i] = tmp = (dpp->samplesB[0] = samples_l[i]) - APPLY_WEIGHT(dpp->weightA, sam_A);
  1914. UPDATE_WEIGHT_CLIP(dpp->weightA, dpp->delta, sam_A, tmp);
  1915. }
  1916. break;
  1917. case -3:
  1918. for (i = 0; i < nb_samples; i++) {
  1919. int32_t sam_A, sam_B, tmp;
  1920. sam_A = dpp->samplesA[0];
  1921. sam_B = dpp->samplesB[0];
  1922. dpp->samplesA[0] = tmp = samples_r[i];
  1923. samples_r[i] = tmp -= APPLY_WEIGHT(dpp->weightB, sam_B);
  1924. UPDATE_WEIGHT_CLIP(dpp->weightB, dpp->delta, sam_B, tmp);
  1925. dpp->samplesB[0] = tmp = samples_l[i];
  1926. samples_l[i] = tmp -= APPLY_WEIGHT(dpp->weightA, sam_A);
  1927. UPDATE_WEIGHT_CLIP(dpp->weightA, dpp->delta, sam_A, tmp);
  1928. }
  1929. break;
  1930. }
  1931. }
  1932. #define update_weight_d2(weight, delta, source, result) \
  1933. if (source && result) \
  1934. weight -= (((source ^ result) >> 29) & 4) - 2;
  1935. #define update_weight_clip_d2(weight, delta, source, result) \
  1936. if (source && result) { \
  1937. const int32_t s = (source ^ result) >> 31; \
  1938. if ((weight = (weight ^ s) + (2 - s)) > 1024) weight = 1024; \
  1939. weight = (weight ^ s) - s; \
  1940. }
  1941. static void decorr_stereo_pass_id2(struct Decorr *dpp,
  1942. int32_t *samples_l, int32_t *samples_r,
  1943. int nb_samples)
  1944. {
  1945. int i, m, k;
  1946. switch (dpp->value) {
  1947. case 17:
  1948. for (i = 0; i < nb_samples; i++) {
  1949. int32_t sam, tmp;
  1950. sam = 2 * dpp->samplesA[0] - dpp->samplesA[1];
  1951. dpp->samplesA[1] = dpp->samplesA[0];
  1952. samples_l[i] = tmp = (dpp->samplesA[0] = samples_l[i]) - APPLY_WEIGHT_I(dpp->weightA, sam);
  1953. update_weight_d2(dpp->weightA, dpp->delta, sam, tmp);
  1954. sam = 2 * dpp->samplesB[0] - dpp->samplesB[1];
  1955. dpp->samplesB[1] = dpp->samplesB[0];
  1956. samples_r[i] = tmp = (dpp->samplesB[0] = samples_r[i]) - APPLY_WEIGHT_I(dpp->weightB, sam);
  1957. update_weight_d2(dpp->weightB, dpp->delta, sam, tmp);
  1958. }
  1959. break;
  1960. case 18:
  1961. for (i = 0; i < nb_samples; i++) {
  1962. int32_t sam, tmp;
  1963. sam = dpp->samplesA[0] + ((dpp->samplesA[0] - dpp->samplesA[1]) >> 1);
  1964. dpp->samplesA[1] = dpp->samplesA[0];
  1965. samples_l[i] = tmp = (dpp->samplesA[0] = samples_l[i]) - APPLY_WEIGHT_I(dpp->weightA, sam);
  1966. update_weight_d2(dpp->weightA, dpp->delta, sam, tmp);
  1967. sam = dpp->samplesB[0] + ((dpp->samplesB[0] - dpp->samplesB[1]) >> 1);
  1968. dpp->samplesB[1] = dpp->samplesB[0];
  1969. samples_r[i] = tmp = (dpp->samplesB[0] = samples_r[i]) - APPLY_WEIGHT_I(dpp->weightB, sam);
  1970. update_weight_d2(dpp->weightB, dpp->delta, sam, tmp);
  1971. }
  1972. break;
  1973. default:
  1974. for (m = 0, k = dpp->value & (MAX_TERM - 1), i = 0; i < nb_samples; i++) {
  1975. int32_t sam, tmp;
  1976. sam = dpp->samplesA[m];
  1977. samples_l[i] = tmp = (dpp->samplesA[k] = samples_l[i]) - APPLY_WEIGHT_I(dpp->weightA, sam);
  1978. update_weight_d2(dpp->weightA, dpp->delta, sam, tmp);
  1979. sam = dpp->samplesB[m];
  1980. samples_r[i] = tmp = (dpp->samplesB[k] = samples_r[i]) - APPLY_WEIGHT_I(dpp->weightB, sam);
  1981. update_weight_d2(dpp->weightB, dpp->delta, sam, tmp);
  1982. m = (m + 1) & (MAX_TERM - 1);
  1983. k = (k + 1) & (MAX_TERM - 1);
  1984. }
  1985. if (m) {
  1986. int32_t temp_A[MAX_TERM], temp_B[MAX_TERM];
  1987. memcpy(temp_A, dpp->samplesA, sizeof(dpp->samplesA));
  1988. memcpy(temp_B, dpp->samplesB, sizeof(dpp->samplesB));
  1989. for (k = 0; k < MAX_TERM; k++) {
  1990. dpp->samplesA[k] = temp_A[m];
  1991. dpp->samplesB[k] = temp_B[m];
  1992. m = (m + 1) & (MAX_TERM - 1);
  1993. }
  1994. }
  1995. break;
  1996. case -1:
  1997. for (i = 0; i < nb_samples; i++) {
  1998. int32_t sam_A, sam_B, tmp;
  1999. sam_A = dpp->samplesA[0];
  2000. samples_l[i] = tmp = (sam_B = samples_l[i]) - APPLY_WEIGHT_I(dpp->weightA, sam_A);
  2001. update_weight_clip_d2(dpp->weightA, dpp->delta, sam_A, tmp);
  2002. samples_r[i] = tmp = (dpp->samplesA[0] = samples_r[i]) - APPLY_WEIGHT_I(dpp->weightB, sam_B);
  2003. update_weight_clip_d2(dpp->weightB, dpp->delta, sam_B, tmp);
  2004. }
  2005. break;
  2006. case -2:
  2007. for (i = 0; i < nb_samples; i++) {
  2008. int32_t sam_A, sam_B, tmp;
  2009. sam_B = dpp->samplesB[0];
  2010. samples_r[i] = tmp = (sam_A = samples_r[i]) - APPLY_WEIGHT_I(dpp->weightB, sam_B);
  2011. update_weight_clip_d2(dpp->weightB, dpp->delta, sam_B, tmp);
  2012. samples_l[i] = tmp = (dpp->samplesB[0] = samples_l[i]) - APPLY_WEIGHT_I(dpp->weightA, sam_A);
  2013. update_weight_clip_d2(dpp->weightA, dpp->delta, sam_A, tmp);
  2014. }
  2015. break;
  2016. case -3:
  2017. for (i = 0; i < nb_samples; i++) {
  2018. int32_t sam_A, sam_B, tmp;
  2019. sam_A = dpp->samplesA[0];
  2020. sam_B = dpp->samplesB[0];
  2021. dpp->samplesA[0] = tmp = samples_r[i];
  2022. samples_r[i] = tmp -= APPLY_WEIGHT_I(dpp->weightB, sam_B);
  2023. update_weight_clip_d2(dpp->weightB, dpp->delta, sam_B, tmp);
  2024. dpp->samplesB[0] = tmp = samples_l[i];
  2025. samples_l[i] = tmp -= APPLY_WEIGHT_I(dpp->weightA, sam_A);
  2026. update_weight_clip_d2(dpp->weightA, dpp->delta, sam_A, tmp);
  2027. }
  2028. break;
  2029. }
  2030. }
  2031. static void put_metadata_block(PutByteContext *pb, int flags, int size)
  2032. {
  2033. if (size & 1)
  2034. flags |= WP_IDF_ODD;
  2035. bytestream2_put_byte(pb, flags);
  2036. bytestream2_put_byte(pb, (size + 1) >> 1);
  2037. }
  2038. static int wavpack_encode_block(WavPackEncodeContext *s,
  2039. int32_t *samples_l, int32_t *samples_r,
  2040. uint8_t *out, int out_size)
  2041. {
  2042. int block_size, start, end, data_size, tcount, temp, m = 0;
  2043. int i, j, ret = 0, got_extra = 0, nb_samples = s->block_samples;
  2044. uint32_t crc = 0xffffffffu;
  2045. struct Decorr *dpp;
  2046. PutByteContext pb;
  2047. if (s->flags & WV_MONO_DATA) {
  2048. CLEAR(s->w);
  2049. }
  2050. if (!(s->flags & WV_MONO) && s->optimize_mono) {
  2051. int32_t lor = 0, diff = 0;
  2052. for (i = 0; i < nb_samples; i++) {
  2053. lor |= samples_l[i] | samples_r[i];
  2054. diff |= samples_l[i] - samples_r[i];
  2055. if (lor && diff)
  2056. break;
  2057. }
  2058. if (i == nb_samples && lor && !diff) {
  2059. s->flags &= ~(WV_JOINT_STEREO | WV_CROSS_DECORR);
  2060. s->flags |= WV_FALSE_STEREO;
  2061. if (!s->false_stereo) {
  2062. s->false_stereo = 1;
  2063. s->num_terms = 0;
  2064. CLEAR(s->w);
  2065. }
  2066. } else if (s->false_stereo) {
  2067. s->false_stereo = 0;
  2068. s->num_terms = 0;
  2069. CLEAR(s->w);
  2070. }
  2071. }
  2072. if (s->flags & SHIFT_MASK) {
  2073. int shift = (s->flags & SHIFT_MASK) >> SHIFT_LSB;
  2074. int mag = (s->flags & MAG_MASK) >> MAG_LSB;
  2075. if (s->flags & WV_MONO_DATA)
  2076. shift_mono(samples_l, nb_samples, shift);
  2077. else
  2078. shift_stereo(samples_l, samples_r, nb_samples, shift);
  2079. if ((mag -= shift) < 0)
  2080. s->flags &= ~MAG_MASK;
  2081. else
  2082. s->flags -= (1 << MAG_LSB) * shift;
  2083. }
  2084. if ((s->flags & WV_FLOAT_DATA) || (s->flags & MAG_MASK) >> MAG_LSB >= 24) {
  2085. av_fast_padded_malloc(&s->orig_l, &s->orig_l_size, sizeof(int32_t) * nb_samples);
  2086. memcpy(s->orig_l, samples_l, sizeof(int32_t) * nb_samples);
  2087. if (!(s->flags & WV_MONO_DATA)) {
  2088. av_fast_padded_malloc(&s->orig_r, &s->orig_r_size, sizeof(int32_t) * nb_samples);
  2089. memcpy(s->orig_r, samples_r, sizeof(int32_t) * nb_samples);
  2090. }
  2091. if (s->flags & WV_FLOAT_DATA)
  2092. got_extra = scan_float(s, samples_l, samples_r, nb_samples);
  2093. else
  2094. got_extra = scan_int32(s, samples_l, samples_r, nb_samples);
  2095. s->num_terms = 0;
  2096. } else {
  2097. scan_int23(s, samples_l, samples_r, nb_samples);
  2098. if (s->shift != s->int32_zeros + s->int32_ones + s->int32_dups) {
  2099. s->shift = s->int32_zeros + s->int32_ones + s->int32_dups;
  2100. s->num_terms = 0;
  2101. }
  2102. }
  2103. if (!s->num_passes && !s->num_terms) {
  2104. s->num_passes = 1;
  2105. if (s->flags & WV_MONO_DATA)
  2106. ret = wv_mono(s, samples_l, 1, 0);
  2107. else
  2108. ret = wv_stereo(s, samples_l, samples_r, 1, 0);
  2109. s->num_passes = 0;
  2110. }
  2111. if (s->flags & WV_MONO_DATA) {
  2112. for (i = 0; i < nb_samples; i++)
  2113. crc += (crc << 1) + samples_l[i];
  2114. if (s->num_passes)
  2115. ret = wv_mono(s, samples_l, !s->num_terms, 1);
  2116. } else {
  2117. for (i = 0; i < nb_samples; i++)
  2118. crc += (crc << 3) + (samples_l[i] << 1) + samples_l[i] + samples_r[i];
  2119. if (s->num_passes)
  2120. ret = wv_stereo(s, samples_l, samples_r, !s->num_terms, 1);
  2121. }
  2122. if (ret < 0)
  2123. return ret;
  2124. if (!s->ch_offset)
  2125. s->flags |= WV_INITIAL_BLOCK;
  2126. s->ch_offset += 1 + !(s->flags & WV_MONO);
  2127. if (s->ch_offset == s->avctx->channels)
  2128. s->flags |= WV_FINAL_BLOCK;
  2129. bytestream2_init_writer(&pb, out, out_size);
  2130. bytestream2_put_le32(&pb, MKTAG('w', 'v', 'p', 'k'));
  2131. bytestream2_put_le32(&pb, 0);
  2132. bytestream2_put_le16(&pb, 0x410);
  2133. bytestream2_put_le16(&pb, 0);
  2134. bytestream2_put_le32(&pb, 0);
  2135. bytestream2_put_le32(&pb, s->sample_index);
  2136. bytestream2_put_le32(&pb, nb_samples);
  2137. bytestream2_put_le32(&pb, s->flags);
  2138. bytestream2_put_le32(&pb, crc);
  2139. if (s->flags & WV_INITIAL_BLOCK &&
  2140. s->avctx->channel_layout != AV_CH_LAYOUT_MONO &&
  2141. s->avctx->channel_layout != AV_CH_LAYOUT_STEREO) {
  2142. put_metadata_block(&pb, WP_ID_CHANINFO, 5);
  2143. bytestream2_put_byte(&pb, s->avctx->channels);
  2144. bytestream2_put_le32(&pb, s->avctx->channel_layout);
  2145. bytestream2_put_byte(&pb, 0);
  2146. }
  2147. if ((s->flags & SRATE_MASK) == SRATE_MASK) {
  2148. put_metadata_block(&pb, WP_ID_SAMPLE_RATE, 3);
  2149. bytestream2_put_le24(&pb, s->avctx->sample_rate);
  2150. bytestream2_put_byte(&pb, 0);
  2151. }
  2152. put_metadata_block(&pb, WP_ID_DECTERMS, s->num_terms);
  2153. for (i = 0; i < s->num_terms; i++) {
  2154. struct Decorr *dpp = &s->decorr_passes[i];
  2155. bytestream2_put_byte(&pb, ((dpp->value + 5) & 0x1f) | ((dpp->delta << 5) & 0xe0));
  2156. }
  2157. if (s->num_terms & 1)
  2158. bytestream2_put_byte(&pb, 0);
  2159. #define WRITE_DECWEIGHT(type) do { \
  2160. temp = store_weight(type); \
  2161. bytestream2_put_byte(&pb, temp); \
  2162. type = restore_weight(temp); \
  2163. } while (0)
  2164. bytestream2_put_byte(&pb, WP_ID_DECWEIGHTS);
  2165. bytestream2_put_byte(&pb, 0);
  2166. start = bytestream2_tell_p(&pb);
  2167. for (i = s->num_terms - 1; i >= 0; --i) {
  2168. struct Decorr *dpp = &s->decorr_passes[i];
  2169. if (store_weight(dpp->weightA) ||
  2170. (!(s->flags & WV_MONO_DATA) && store_weight(dpp->weightB)))
  2171. break;
  2172. }
  2173. tcount = i + 1;
  2174. for (i = 0; i < s->num_terms; i++) {
  2175. struct Decorr *dpp = &s->decorr_passes[i];
  2176. if (i < tcount) {
  2177. WRITE_DECWEIGHT(dpp->weightA);
  2178. if (!(s->flags & WV_MONO_DATA))
  2179. WRITE_DECWEIGHT(dpp->weightB);
  2180. } else {
  2181. dpp->weightA = dpp->weightB = 0;
  2182. }
  2183. }
  2184. end = bytestream2_tell_p(&pb);
  2185. out[start - 2] = WP_ID_DECWEIGHTS | (((end - start) & 1) ? WP_IDF_ODD: 0);
  2186. out[start - 1] = (end - start + 1) >> 1;
  2187. if ((end - start) & 1)
  2188. bytestream2_put_byte(&pb, 0);
  2189. #define WRITE_DECSAMPLE(type) do { \
  2190. temp = log2s(type); \
  2191. type = wp_exp2(temp); \
  2192. bytestream2_put_le16(&pb, temp); \
  2193. } while (0)
  2194. bytestream2_put_byte(&pb, WP_ID_DECSAMPLES);
  2195. bytestream2_put_byte(&pb, 0);
  2196. start = bytestream2_tell_p(&pb);
  2197. for (i = 0; i < s->num_terms; i++) {
  2198. struct Decorr *dpp = &s->decorr_passes[i];
  2199. if (i == 0) {
  2200. if (dpp->value > MAX_TERM) {
  2201. WRITE_DECSAMPLE(dpp->samplesA[0]);
  2202. WRITE_DECSAMPLE(dpp->samplesA[1]);
  2203. if (!(s->flags & WV_MONO_DATA)) {
  2204. WRITE_DECSAMPLE(dpp->samplesB[0]);
  2205. WRITE_DECSAMPLE(dpp->samplesB[1]);
  2206. }
  2207. } else if (dpp->value < 0) {
  2208. WRITE_DECSAMPLE(dpp->samplesA[0]);
  2209. WRITE_DECSAMPLE(dpp->samplesB[0]);
  2210. } else {
  2211. for (j = 0; j < dpp->value; j++) {
  2212. WRITE_DECSAMPLE(dpp->samplesA[j]);
  2213. if (!(s->flags & WV_MONO_DATA))
  2214. WRITE_DECSAMPLE(dpp->samplesB[j]);
  2215. }
  2216. }
  2217. } else {
  2218. CLEAR(dpp->samplesA);
  2219. CLEAR(dpp->samplesB);
  2220. }
  2221. }
  2222. end = bytestream2_tell_p(&pb);
  2223. out[start - 1] = (end - start) >> 1;
  2224. #define WRITE_CHAN_ENTROPY(chan) do { \
  2225. for (i = 0; i < 3; i++) { \
  2226. temp = wp_log2(s->w.c[chan].median[i]); \
  2227. bytestream2_put_le16(&pb, temp); \
  2228. s->w.c[chan].median[i] = wp_exp2(temp); \
  2229. } \
  2230. } while (0)
  2231. put_metadata_block(&pb, WP_ID_ENTROPY, 6 * (1 + (!(s->flags & WV_MONO_DATA))));
  2232. WRITE_CHAN_ENTROPY(0);
  2233. if (!(s->flags & WV_MONO_DATA))
  2234. WRITE_CHAN_ENTROPY(1);
  2235. if (s->flags & WV_FLOAT_DATA) {
  2236. put_metadata_block(&pb, WP_ID_FLOATINFO, 4);
  2237. bytestream2_put_byte(&pb, s->float_flags);
  2238. bytestream2_put_byte(&pb, s->float_shift);
  2239. bytestream2_put_byte(&pb, s->float_max_exp);
  2240. bytestream2_put_byte(&pb, 127);
  2241. }
  2242. if (s->flags & WV_INT32_DATA) {
  2243. put_metadata_block(&pb, WP_ID_INT32INFO, 4);
  2244. bytestream2_put_byte(&pb, s->int32_sent_bits);
  2245. bytestream2_put_byte(&pb, s->int32_zeros);
  2246. bytestream2_put_byte(&pb, s->int32_ones);
  2247. bytestream2_put_byte(&pb, s->int32_dups);
  2248. }
  2249. if (s->flags & WV_MONO_DATA && !s->num_passes) {
  2250. for (i = 0; i < nb_samples; i++) {
  2251. int32_t code = samples_l[i];
  2252. for (tcount = s->num_terms, dpp = s->decorr_passes; tcount--; dpp++) {
  2253. int32_t sam;
  2254. if (dpp->value > MAX_TERM) {
  2255. if (dpp->value & 1)
  2256. sam = 2 * dpp->samplesA[0] - dpp->samplesA[1];
  2257. else
  2258. sam = (3 * dpp->samplesA[0] - dpp->samplesA[1]) >> 1;
  2259. dpp->samplesA[1] = dpp->samplesA[0];
  2260. dpp->samplesA[0] = code;
  2261. } else {
  2262. sam = dpp->samplesA[m];
  2263. dpp->samplesA[(m + dpp->value) & (MAX_TERM - 1)] = code;
  2264. }
  2265. code -= APPLY_WEIGHT(dpp->weightA, sam);
  2266. UPDATE_WEIGHT(dpp->weightA, dpp->delta, sam, code);
  2267. }
  2268. m = (m + 1) & (MAX_TERM - 1);
  2269. samples_l[i] = code;
  2270. }
  2271. if (m) {
  2272. for (tcount = s->num_terms, dpp = s->decorr_passes; tcount--; dpp++)
  2273. if (dpp->value > 0 && dpp->value <= MAX_TERM) {
  2274. int32_t temp_A[MAX_TERM], temp_B[MAX_TERM];
  2275. int k;
  2276. memcpy(temp_A, dpp->samplesA, sizeof(dpp->samplesA));
  2277. memcpy(temp_B, dpp->samplesB, sizeof(dpp->samplesB));
  2278. for (k = 0; k < MAX_TERM; k++) {
  2279. dpp->samplesA[k] = temp_A[m];
  2280. dpp->samplesB[k] = temp_B[m];
  2281. m = (m + 1) & (MAX_TERM - 1);
  2282. }
  2283. }
  2284. }
  2285. } else if (!s->num_passes) {
  2286. if (s->flags & WV_JOINT_STEREO) {
  2287. for (i = 0; i < nb_samples; i++)
  2288. samples_r[i] += ((samples_l[i] -= samples_r[i]) >> 1);
  2289. }
  2290. for (i = 0; i < s->num_terms; i++) {
  2291. struct Decorr *dpp = &s->decorr_passes[i];
  2292. if (((s->flags & MAG_MASK) >> MAG_LSB) >= 16 || dpp->delta != 2)
  2293. decorr_stereo_pass2(dpp, samples_l, samples_r, nb_samples);
  2294. else
  2295. decorr_stereo_pass_id2(dpp, samples_l, samples_r, nb_samples);
  2296. }
  2297. }
  2298. bytestream2_put_byte(&pb, WP_ID_DATA | WP_IDF_LONG);
  2299. init_put_bits(&s->pb, pb.buffer + 3, bytestream2_get_bytes_left_p(&pb));
  2300. if (s->flags & WV_MONO_DATA) {
  2301. for (i = 0; i < nb_samples; i++)
  2302. wavpack_encode_sample(s, &s->w.c[0], s->samples[0][i]);
  2303. } else {
  2304. for (i = 0; i < nb_samples; i++) {
  2305. wavpack_encode_sample(s, &s->w.c[0], s->samples[0][i]);
  2306. wavpack_encode_sample(s, &s->w.c[1], s->samples[1][i]);
  2307. }
  2308. }
  2309. encode_flush(s);
  2310. flush_put_bits(&s->pb);
  2311. data_size = put_bits_count(&s->pb) >> 3;
  2312. bytestream2_put_le24(&pb, (data_size + 1) >> 1);
  2313. bytestream2_skip_p(&pb, data_size);
  2314. if (data_size & 1)
  2315. bytestream2_put_byte(&pb, 0);
  2316. if (got_extra) {
  2317. bytestream2_put_byte(&pb, WP_ID_EXTRABITS | WP_IDF_LONG);
  2318. init_put_bits(&s->pb, pb.buffer + 7, bytestream2_get_bytes_left_p(&pb));
  2319. if (s->flags & WV_FLOAT_DATA)
  2320. pack_float(s, s->orig_l, s->orig_r, nb_samples);
  2321. else
  2322. pack_int32(s, s->orig_l, s->orig_r, nb_samples);
  2323. flush_put_bits(&s->pb);
  2324. data_size = put_bits_count(&s->pb) >> 3;
  2325. bytestream2_put_le24(&pb, (data_size + 5) >> 1);
  2326. bytestream2_put_le32(&pb, s->crc_x);
  2327. bytestream2_skip_p(&pb, data_size);
  2328. if (data_size & 1)
  2329. bytestream2_put_byte(&pb, 0);
  2330. }
  2331. block_size = bytestream2_tell_p(&pb);
  2332. AV_WL32(out + 4, block_size - 8);
  2333. av_assert0(!bytestream2_get_eof(&pb));
  2334. return block_size;
  2335. }
  2336. static void fill_buffer(WavPackEncodeContext *s,
  2337. const int8_t *src, int32_t *dst,
  2338. int nb_samples)
  2339. {
  2340. int i;
  2341. #define COPY_SAMPLES(type, offset, shift) do { \
  2342. const type *sptr = (const type *)src; \
  2343. for (i = 0; i < nb_samples; i++) \
  2344. dst[i] = (sptr[i] - offset) >> shift; \
  2345. } while (0)
  2346. switch (s->avctx->sample_fmt) {
  2347. case AV_SAMPLE_FMT_U8P:
  2348. COPY_SAMPLES(int8_t, 0x80, 0);
  2349. break;
  2350. case AV_SAMPLE_FMT_S16P:
  2351. COPY_SAMPLES(int16_t, 0, 0);
  2352. break;
  2353. case AV_SAMPLE_FMT_S32P:
  2354. if (s->avctx->bits_per_raw_sample <= 24) {
  2355. COPY_SAMPLES(int32_t, 0, 8);
  2356. break;
  2357. }
  2358. case AV_SAMPLE_FMT_FLTP:
  2359. memcpy(dst, src, nb_samples * 4);
  2360. }
  2361. }
  2362. static void set_samplerate(WavPackEncodeContext *s)
  2363. {
  2364. int i;
  2365. for (i = 0; i < 15; i++) {
  2366. if (wv_rates[i] == s->avctx->sample_rate)
  2367. break;
  2368. }
  2369. s->flags = i << SRATE_LSB;
  2370. }
  2371. static int wavpack_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
  2372. const AVFrame *frame, int *got_packet_ptr)
  2373. {
  2374. WavPackEncodeContext *s = avctx->priv_data;
  2375. int buf_size, ret;
  2376. uint8_t *buf;
  2377. s->block_samples = frame->nb_samples;
  2378. av_fast_padded_malloc(&s->samples[0], &s->samples_size[0],
  2379. sizeof(int32_t) * s->block_samples);
  2380. if (!s->samples[0])
  2381. return AVERROR(ENOMEM);
  2382. if (avctx->channels > 1) {
  2383. av_fast_padded_malloc(&s->samples[1], &s->samples_size[1],
  2384. sizeof(int32_t) * s->block_samples);
  2385. if (!s->samples[1])
  2386. return AVERROR(ENOMEM);
  2387. }
  2388. buf_size = s->block_samples * avctx->channels * 8
  2389. + 200 * avctx->channels /* for headers */;
  2390. if ((ret = ff_alloc_packet2(avctx, avpkt, buf_size, 0)) < 0)
  2391. return ret;
  2392. buf = avpkt->data;
  2393. for (s->ch_offset = 0; s->ch_offset < avctx->channels;) {
  2394. set_samplerate(s);
  2395. switch (s->avctx->sample_fmt) {
  2396. case AV_SAMPLE_FMT_S16P: s->flags |= 1; break;
  2397. case AV_SAMPLE_FMT_S32P: s->flags |= 3 - (s->avctx->bits_per_raw_sample <= 24); break;
  2398. case AV_SAMPLE_FMT_FLTP: s->flags |= 3 | WV_FLOAT_DATA;
  2399. }
  2400. fill_buffer(s, frame->extended_data[s->ch_offset], s->samples[0], s->block_samples);
  2401. if (avctx->channels - s->ch_offset == 1) {
  2402. s->flags |= WV_MONO;
  2403. } else {
  2404. s->flags |= WV_CROSS_DECORR;
  2405. fill_buffer(s, frame->extended_data[s->ch_offset + 1], s->samples[1], s->block_samples);
  2406. }
  2407. s->flags += (1 << MAG_LSB) * ((s->flags & 3) * 8 + 7);
  2408. if ((ret = wavpack_encode_block(s, s->samples[0], s->samples[1],
  2409. buf, buf_size)) < 0)
  2410. return ret;
  2411. buf += ret;
  2412. buf_size -= ret;
  2413. }
  2414. s->sample_index += frame->nb_samples;
  2415. avpkt->pts = frame->pts;
  2416. avpkt->size = buf - avpkt->data;
  2417. avpkt->duration = ff_samples_to_time_base(avctx, frame->nb_samples);
  2418. *got_packet_ptr = 1;
  2419. return 0;
  2420. }
  2421. static av_cold int wavpack_encode_close(AVCodecContext *avctx)
  2422. {
  2423. WavPackEncodeContext *s = avctx->priv_data;
  2424. int i;
  2425. for (i = 0; i < MAX_TERMS + 2; i++) {
  2426. av_freep(&s->sampleptrs[i][0]);
  2427. av_freep(&s->sampleptrs[i][1]);
  2428. s->sampleptrs_size[i][0] = s->sampleptrs_size[i][1] = 0;
  2429. }
  2430. for (i = 0; i < 2; i++) {
  2431. av_freep(&s->samples[i]);
  2432. s->samples_size[i] = 0;
  2433. av_freep(&s->best_buffer[i]);
  2434. s->best_buffer_size[i] = 0;
  2435. av_freep(&s->temp_buffer[i][0]);
  2436. av_freep(&s->temp_buffer[i][1]);
  2437. s->temp_buffer_size[i][0] = s->temp_buffer_size[i][1] = 0;
  2438. }
  2439. av_freep(&s->js_left);
  2440. av_freep(&s->js_right);
  2441. s->js_left_size = s->js_right_size = 0;
  2442. av_freep(&s->orig_l);
  2443. av_freep(&s->orig_r);
  2444. s->orig_l_size = s->orig_r_size = 0;
  2445. return 0;
  2446. }
  2447. #define OFFSET(x) offsetof(WavPackEncodeContext, x)
  2448. #define FLAGS AV_OPT_FLAG_ENCODING_PARAM | AV_OPT_FLAG_AUDIO_PARAM
  2449. static const AVOption options[] = {
  2450. { "joint_stereo", "", OFFSET(joint), AV_OPT_TYPE_BOOL, {.i64=-1}, -1, 1, FLAGS },
  2451. { "optimize_mono", "", OFFSET(optimize_mono), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS },
  2452. { NULL },
  2453. };
  2454. static const AVClass wavpack_encoder_class = {
  2455. .class_name = "WavPack encoder",
  2456. .item_name = av_default_item_name,
  2457. .option = options,
  2458. .version = LIBAVUTIL_VERSION_INT,
  2459. };
  2460. AVCodec ff_wavpack_encoder = {
  2461. .name = "wavpack",
  2462. .long_name = NULL_IF_CONFIG_SMALL("WavPack"),
  2463. .type = AVMEDIA_TYPE_AUDIO,
  2464. .id = AV_CODEC_ID_WAVPACK,
  2465. .priv_data_size = sizeof(WavPackEncodeContext),
  2466. .priv_class = &wavpack_encoder_class,
  2467. .init = wavpack_encode_init,
  2468. .encode2 = wavpack_encode_frame,
  2469. .close = wavpack_encode_close,
  2470. .capabilities = AV_CODEC_CAP_SMALL_LAST_FRAME,
  2471. .sample_fmts = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_U8P,
  2472. AV_SAMPLE_FMT_S16P,
  2473. AV_SAMPLE_FMT_S32P,
  2474. AV_SAMPLE_FMT_FLTP,
  2475. AV_SAMPLE_FMT_NONE },
  2476. };