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