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.

2977 lines
96KB

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