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.

651 lines
16KB

  1. /*
  2. * downmix.c
  3. * Copyright (C) 2000-2002 Michel Lespinasse <walken@zoy.org>
  4. * Copyright (C) 1999-2000 Aaron Holtzman <aholtzma@ess.engr.uvic.ca>
  5. *
  6. * This file is part of a52dec, a free ATSC A-52 stream decoder.
  7. * See http://liba52.sourceforge.net/ for updates.
  8. *
  9. * a52dec is free software; you can redistribute it and/or modify
  10. * it under the terms of the GNU General Public License as published by
  11. * the Free Software Foundation; either version 2 of the License, or
  12. * (at your option) any later version.
  13. *
  14. * a52dec is distributed in the hope that it will be useful,
  15. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  17. * GNU General Public License for more details.
  18. *
  19. * You should have received a copy of the GNU General Public License
  20. * along with this program; if not, write to the Free Software
  21. * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  22. */
  23. #include "a52.h"
  24. #include "a52_internal.h"
  25. #define CONVERT(acmod,output) (((output) << 3) + (acmod))
  26. int a52_downmix_init (int input, int flags, sample_t * level,
  27. sample_t clev, sample_t slev)
  28. {
  29. static uint8_t table[11][8] = {
  30. {A52_CHANNEL, A52_DOLBY, A52_STEREO, A52_STEREO,
  31. A52_STEREO, A52_STEREO, A52_STEREO, A52_STEREO},
  32. {A52_MONO, A52_MONO, A52_MONO, A52_MONO,
  33. A52_MONO, A52_MONO, A52_MONO, A52_MONO},
  34. {A52_CHANNEL, A52_DOLBY, A52_STEREO, A52_STEREO,
  35. A52_STEREO, A52_STEREO, A52_STEREO, A52_STEREO},
  36. {A52_CHANNEL, A52_DOLBY, A52_STEREO, A52_3F,
  37. A52_STEREO, A52_3F, A52_STEREO, A52_3F},
  38. {A52_CHANNEL, A52_DOLBY, A52_STEREO, A52_STEREO,
  39. A52_2F1R, A52_2F1R, A52_2F1R, A52_2F1R},
  40. {A52_CHANNEL, A52_DOLBY, A52_STEREO, A52_STEREO,
  41. A52_2F1R, A52_3F1R, A52_2F1R, A52_3F1R},
  42. {A52_CHANNEL, A52_DOLBY, A52_STEREO, A52_3F,
  43. A52_2F2R, A52_2F2R, A52_2F2R, A52_2F2R},
  44. {A52_CHANNEL, A52_DOLBY, A52_STEREO, A52_3F,
  45. A52_2F2R, A52_3F2R, A52_2F2R, A52_3F2R},
  46. {A52_CHANNEL1, A52_MONO, A52_MONO, A52_MONO,
  47. A52_MONO, A52_MONO, A52_MONO, A52_MONO},
  48. {A52_CHANNEL2, A52_MONO, A52_MONO, A52_MONO,
  49. A52_MONO, A52_MONO, A52_MONO, A52_MONO},
  50. {A52_CHANNEL, A52_DOLBY, A52_STEREO, A52_DOLBY,
  51. A52_DOLBY, A52_DOLBY, A52_DOLBY, A52_DOLBY}
  52. };
  53. int output;
  54. output = flags & A52_CHANNEL_MASK;
  55. if (output > A52_DOLBY)
  56. return -1;
  57. output = table[output][input & 7];
  58. if ((output == A52_STEREO) &&
  59. ((input == A52_DOLBY) || ((input == A52_3F) && (clev == LEVEL_3DB))))
  60. output = A52_DOLBY;
  61. if (flags & A52_ADJUST_LEVEL)
  62. switch (CONVERT (input & 7, output)) {
  63. case CONVERT (A52_3F, A52_MONO):
  64. *level *= LEVEL_3DB / (1 + clev);
  65. break;
  66. case CONVERT (A52_STEREO, A52_MONO):
  67. case CONVERT (A52_2F2R, A52_2F1R):
  68. case CONVERT (A52_3F2R, A52_3F1R):
  69. level_3db:
  70. *level *= LEVEL_3DB;
  71. break;
  72. case CONVERT (A52_3F2R, A52_2F1R):
  73. if (clev < LEVEL_PLUS3DB - 1)
  74. goto level_3db;
  75. /* break thru */
  76. case CONVERT (A52_3F, A52_STEREO):
  77. case CONVERT (A52_3F1R, A52_2F1R):
  78. case CONVERT (A52_3F1R, A52_2F2R):
  79. case CONVERT (A52_3F2R, A52_2F2R):
  80. *level /= 1 + clev;
  81. break;
  82. case CONVERT (A52_2F1R, A52_MONO):
  83. *level *= LEVEL_PLUS3DB / (2 + slev);
  84. break;
  85. case CONVERT (A52_2F1R, A52_STEREO):
  86. case CONVERT (A52_3F1R, A52_3F):
  87. *level /= 1 + slev * LEVEL_3DB;
  88. break;
  89. case CONVERT (A52_3F1R, A52_MONO):
  90. *level *= LEVEL_3DB / (1 + clev + 0.5 * slev);
  91. break;
  92. case CONVERT (A52_3F1R, A52_STEREO):
  93. *level /= 1 + clev + slev * LEVEL_3DB;
  94. break;
  95. case CONVERT (A52_2F2R, A52_MONO):
  96. *level *= LEVEL_3DB / (1 + slev);
  97. break;
  98. case CONVERT (A52_2F2R, A52_STEREO):
  99. case CONVERT (A52_3F2R, A52_3F):
  100. *level /= 1 + slev;
  101. break;
  102. case CONVERT (A52_3F2R, A52_MONO):
  103. *level *= LEVEL_3DB / (1 + clev + slev);
  104. break;
  105. case CONVERT (A52_3F2R, A52_STEREO):
  106. *level /= 1 + clev + slev;
  107. break;
  108. case CONVERT (A52_MONO, A52_DOLBY):
  109. *level *= LEVEL_PLUS3DB;
  110. break;
  111. case CONVERT (A52_3F, A52_DOLBY):
  112. case CONVERT (A52_2F1R, A52_DOLBY):
  113. *level *= 1 / (1 + LEVEL_3DB);
  114. break;
  115. case CONVERT (A52_3F1R, A52_DOLBY):
  116. case CONVERT (A52_2F2R, A52_DOLBY):
  117. *level *= 1 / (1 + 2 * LEVEL_3DB);
  118. break;
  119. case CONVERT (A52_3F2R, A52_DOLBY):
  120. *level *= 1 / (1 + 3 * LEVEL_3DB);
  121. break;
  122. }
  123. return output;
  124. }
  125. int a52_downmix_coeff (sample_t * coeff, int acmod, int output, sample_t level,
  126. sample_t clev, sample_t slev)
  127. {
  128. switch (CONVERT (acmod, output & A52_CHANNEL_MASK)) {
  129. case CONVERT (A52_CHANNEL, A52_CHANNEL):
  130. case CONVERT (A52_MONO, A52_MONO):
  131. case CONVERT (A52_STEREO, A52_STEREO):
  132. case CONVERT (A52_3F, A52_3F):
  133. case CONVERT (A52_2F1R, A52_2F1R):
  134. case CONVERT (A52_3F1R, A52_3F1R):
  135. case CONVERT (A52_2F2R, A52_2F2R):
  136. case CONVERT (A52_3F2R, A52_3F2R):
  137. case CONVERT (A52_STEREO, A52_DOLBY):
  138. coeff[0] = coeff[1] = coeff[2] = coeff[3] = coeff[4] = level;
  139. return 0;
  140. case CONVERT (A52_CHANNEL, A52_MONO):
  141. coeff[0] = coeff[1] = level * LEVEL_6DB;
  142. return 3;
  143. case CONVERT (A52_STEREO, A52_MONO):
  144. coeff[0] = coeff[1] = level * LEVEL_3DB;
  145. return 3;
  146. case CONVERT (A52_3F, A52_MONO):
  147. coeff[0] = coeff[2] = level * LEVEL_3DB;
  148. coeff[1] = level * clev * LEVEL_PLUS3DB;
  149. return 7;
  150. case CONVERT (A52_2F1R, A52_MONO):
  151. coeff[0] = coeff[1] = level * LEVEL_3DB;
  152. coeff[2] = level * slev * LEVEL_3DB;
  153. return 7;
  154. case CONVERT (A52_2F2R, A52_MONO):
  155. coeff[0] = coeff[1] = level * LEVEL_3DB;
  156. coeff[2] = coeff[3] = level * slev * LEVEL_3DB;
  157. return 15;
  158. case CONVERT (A52_3F1R, A52_MONO):
  159. coeff[0] = coeff[2] = level * LEVEL_3DB;
  160. coeff[1] = level * clev * LEVEL_PLUS3DB;
  161. coeff[3] = level * slev * LEVEL_3DB;
  162. return 15;
  163. case CONVERT (A52_3F2R, A52_MONO):
  164. coeff[0] = coeff[2] = level * LEVEL_3DB;
  165. coeff[1] = level * clev * LEVEL_PLUS3DB;
  166. coeff[3] = coeff[4] = level * slev * LEVEL_3DB;
  167. return 31;
  168. case CONVERT (A52_MONO, A52_DOLBY):
  169. coeff[0] = level * LEVEL_3DB;
  170. return 0;
  171. case CONVERT (A52_3F, A52_DOLBY):
  172. clev = LEVEL_3DB;
  173. case CONVERT (A52_3F, A52_STEREO):
  174. case CONVERT (A52_3F1R, A52_2F1R):
  175. case CONVERT (A52_3F2R, A52_2F2R):
  176. coeff[0] = coeff[2] = coeff[3] = coeff[4] = level;
  177. coeff[1] = level * clev;
  178. return 7;
  179. case CONVERT (A52_2F1R, A52_DOLBY):
  180. slev = 1;
  181. case CONVERT (A52_2F1R, A52_STEREO):
  182. coeff[0] = coeff[1] = level;
  183. coeff[2] = level * slev * LEVEL_3DB;
  184. return 7;
  185. case CONVERT (A52_3F1R, A52_DOLBY):
  186. clev = LEVEL_3DB;
  187. slev = 1;
  188. case CONVERT (A52_3F1R, A52_STEREO):
  189. coeff[0] = coeff[2] = level;
  190. coeff[1] = level * clev;
  191. coeff[3] = level * slev * LEVEL_3DB;
  192. return 15;
  193. case CONVERT (A52_2F2R, A52_DOLBY):
  194. slev = LEVEL_3DB;
  195. case CONVERT (A52_2F2R, A52_STEREO):
  196. coeff[0] = coeff[1] = level;
  197. coeff[2] = coeff[3] = level * slev;
  198. return 15;
  199. case CONVERT (A52_3F2R, A52_DOLBY):
  200. clev = LEVEL_3DB;
  201. case CONVERT (A52_3F2R, A52_2F1R):
  202. slev = LEVEL_3DB;
  203. case CONVERT (A52_3F2R, A52_STEREO):
  204. coeff[0] = coeff[2] = level;
  205. coeff[1] = level * clev;
  206. coeff[3] = coeff[4] = level * slev;
  207. return 31;
  208. case CONVERT (A52_3F1R, A52_3F):
  209. coeff[0] = coeff[1] = coeff[2] = level;
  210. coeff[3] = level * slev * LEVEL_3DB;
  211. return 13;
  212. case CONVERT (A52_3F2R, A52_3F):
  213. coeff[0] = coeff[1] = coeff[2] = level;
  214. coeff[3] = coeff[4] = level * slev;
  215. return 29;
  216. case CONVERT (A52_2F2R, A52_2F1R):
  217. coeff[0] = coeff[1] = level;
  218. coeff[2] = coeff[3] = level * LEVEL_3DB;
  219. return 12;
  220. case CONVERT (A52_3F2R, A52_3F1R):
  221. coeff[0] = coeff[1] = coeff[2] = level;
  222. coeff[3] = coeff[4] = level * LEVEL_3DB;
  223. return 24;
  224. case CONVERT (A52_2F1R, A52_2F2R):
  225. coeff[0] = coeff[1] = level;
  226. coeff[2] = level * LEVEL_3DB;
  227. return 0;
  228. case CONVERT (A52_3F1R, A52_2F2R):
  229. coeff[0] = coeff[2] = level;
  230. coeff[1] = level * clev;
  231. coeff[3] = level * LEVEL_3DB;
  232. return 7;
  233. case CONVERT (A52_3F1R, A52_3F2R):
  234. coeff[0] = coeff[1] = coeff[2] = level;
  235. coeff[3] = level * LEVEL_3DB;
  236. return 0;
  237. case CONVERT (A52_CHANNEL, A52_CHANNEL1):
  238. coeff[0] = level;
  239. coeff[1] = 0;
  240. return 0;
  241. case CONVERT (A52_CHANNEL, A52_CHANNEL2):
  242. coeff[0] = 0;
  243. coeff[1] = level;
  244. return 0;
  245. }
  246. return -1; /* NOTREACHED */
  247. }
  248. static void mix2to1 (sample_t * dest, sample_t * src, sample_t bias)
  249. {
  250. int i;
  251. for (i = 0; i < 256; i++)
  252. dest[i] += src[i] + bias;
  253. }
  254. static void mix3to1 (sample_t * samples, sample_t bias)
  255. {
  256. int i;
  257. for (i = 0; i < 256; i++)
  258. samples[i] += samples[i + 256] + samples[i + 512] + bias;
  259. }
  260. static void mix4to1 (sample_t * samples, sample_t bias)
  261. {
  262. int i;
  263. for (i = 0; i < 256; i++)
  264. samples[i] += (samples[i + 256] + samples[i + 512] +
  265. samples[i + 768] + bias);
  266. }
  267. static void mix5to1 (sample_t * samples, sample_t bias)
  268. {
  269. int i;
  270. for (i = 0; i < 256; i++)
  271. samples[i] += (samples[i + 256] + samples[i + 512] +
  272. samples[i + 768] + samples[i + 1024] + bias);
  273. }
  274. static void mix3to2 (sample_t * samples, sample_t bias)
  275. {
  276. int i;
  277. sample_t common;
  278. for (i = 0; i < 256; i++) {
  279. common = samples[i + 256] + bias;
  280. samples[i] += common;
  281. samples[i + 256] = samples[i + 512] + common;
  282. }
  283. }
  284. static void mix21to2 (sample_t * left, sample_t * right, sample_t bias)
  285. {
  286. int i;
  287. sample_t common;
  288. for (i = 0; i < 256; i++) {
  289. common = right[i + 256] + bias;
  290. left[i] += common;
  291. right[i] += common;
  292. }
  293. }
  294. static void mix21toS (sample_t * samples, sample_t bias)
  295. {
  296. int i;
  297. sample_t surround;
  298. for (i = 0; i < 256; i++) {
  299. surround = samples[i + 512];
  300. samples[i] += bias - surround;
  301. samples[i + 256] += bias + surround;
  302. }
  303. }
  304. static void mix31to2 (sample_t * samples, sample_t bias)
  305. {
  306. int i;
  307. sample_t common;
  308. for (i = 0; i < 256; i++) {
  309. common = samples[i + 256] + samples[i + 768] + bias;
  310. samples[i] += common;
  311. samples[i + 256] = samples[i + 512] + common;
  312. }
  313. }
  314. static void mix31toS (sample_t * samples, sample_t bias)
  315. {
  316. int i;
  317. sample_t common, surround;
  318. for (i = 0; i < 256; i++) {
  319. common = samples[i + 256] + bias;
  320. surround = samples[i + 768];
  321. samples[i] += common - surround;
  322. samples[i + 256] = samples[i + 512] + common + surround;
  323. }
  324. }
  325. static void mix22toS (sample_t * samples, sample_t bias)
  326. {
  327. int i;
  328. sample_t surround;
  329. for (i = 0; i < 256; i++) {
  330. surround = samples[i + 512] + samples[i + 768];
  331. samples[i] += bias - surround;
  332. samples[i + 256] += bias + surround;
  333. }
  334. }
  335. static void mix32to2 (sample_t * samples, sample_t bias)
  336. {
  337. int i;
  338. sample_t common;
  339. for (i = 0; i < 256; i++) {
  340. common = samples[i + 256] + bias;
  341. samples[i] += common + samples[i + 768];
  342. samples[i + 256] = common + samples[i + 512] + samples[i + 1024];
  343. }
  344. }
  345. static void mix32toS (sample_t * samples, sample_t bias)
  346. {
  347. int i;
  348. sample_t common, surround;
  349. for (i = 0; i < 256; i++) {
  350. common = samples[i + 256] + bias;
  351. surround = samples[i + 768] + samples[i + 1024];
  352. samples[i] += common - surround;
  353. samples[i + 256] = samples[i + 512] + common + surround;
  354. }
  355. }
  356. static void move2to1 (sample_t * src, sample_t * dest, sample_t bias)
  357. {
  358. int i;
  359. for (i = 0; i < 256; i++)
  360. dest[i] = src[i] + src[i + 256] + bias;
  361. }
  362. static void zero (sample_t * samples)
  363. {
  364. int i;
  365. for (i = 0; i < 256; i++)
  366. samples[i] = 0;
  367. }
  368. void a52_downmix (sample_t * samples, int acmod, int output, sample_t bias,
  369. sample_t clev, sample_t slev)
  370. {
  371. switch (CONVERT (acmod, output & A52_CHANNEL_MASK)) {
  372. case CONVERT (A52_CHANNEL, A52_CHANNEL2):
  373. memcpy (samples, samples + 256, 256 * sizeof (sample_t));
  374. break;
  375. case CONVERT (A52_CHANNEL, A52_MONO):
  376. case CONVERT (A52_STEREO, A52_MONO):
  377. mix_2to1:
  378. mix2to1 (samples, samples + 256, bias);
  379. break;
  380. case CONVERT (A52_2F1R, A52_MONO):
  381. if (slev == 0)
  382. goto mix_2to1;
  383. case CONVERT (A52_3F, A52_MONO):
  384. mix_3to1:
  385. mix3to1 (samples, bias);
  386. break;
  387. case CONVERT (A52_3F1R, A52_MONO):
  388. if (slev == 0)
  389. goto mix_3to1;
  390. case CONVERT (A52_2F2R, A52_MONO):
  391. if (slev == 0)
  392. goto mix_2to1;
  393. mix4to1 (samples, bias);
  394. break;
  395. case CONVERT (A52_3F2R, A52_MONO):
  396. if (slev == 0)
  397. goto mix_3to1;
  398. mix5to1 (samples, bias);
  399. break;
  400. case CONVERT (A52_MONO, A52_DOLBY):
  401. memcpy (samples + 256, samples, 256 * sizeof (sample_t));
  402. break;
  403. case CONVERT (A52_3F, A52_STEREO):
  404. case CONVERT (A52_3F, A52_DOLBY):
  405. mix_3to2:
  406. mix3to2 (samples, bias);
  407. break;
  408. case CONVERT (A52_2F1R, A52_STEREO):
  409. if (slev == 0)
  410. break;
  411. mix21to2 (samples, samples + 256, bias);
  412. break;
  413. case CONVERT (A52_2F1R, A52_DOLBY):
  414. mix21toS (samples, bias);
  415. break;
  416. case CONVERT (A52_3F1R, A52_STEREO):
  417. if (slev == 0)
  418. goto mix_3to2;
  419. mix31to2 (samples, bias);
  420. break;
  421. case CONVERT (A52_3F1R, A52_DOLBY):
  422. mix31toS (samples, bias);
  423. break;
  424. case CONVERT (A52_2F2R, A52_STEREO):
  425. if (slev == 0)
  426. break;
  427. mix2to1 (samples, samples + 512, bias);
  428. mix2to1 (samples + 256, samples + 768, bias);
  429. break;
  430. case CONVERT (A52_2F2R, A52_DOLBY):
  431. mix22toS (samples, bias);
  432. break;
  433. case CONVERT (A52_3F2R, A52_STEREO):
  434. if (slev == 0)
  435. goto mix_3to2;
  436. mix32to2 (samples, bias);
  437. break;
  438. case CONVERT (A52_3F2R, A52_DOLBY):
  439. mix32toS (samples, bias);
  440. break;
  441. case CONVERT (A52_3F1R, A52_3F):
  442. if (slev == 0)
  443. break;
  444. mix21to2 (samples, samples + 512, bias);
  445. break;
  446. case CONVERT (A52_3F2R, A52_3F):
  447. if (slev == 0)
  448. break;
  449. mix2to1 (samples, samples + 768, bias);
  450. mix2to1 (samples + 512, samples + 1024, bias);
  451. break;
  452. case CONVERT (A52_3F1R, A52_2F1R):
  453. mix3to2 (samples, bias);
  454. memcpy (samples + 512, samples + 768, 256 * sizeof (sample_t));
  455. break;
  456. case CONVERT (A52_2F2R, A52_2F1R):
  457. mix2to1 (samples + 512, samples + 768, bias);
  458. break;
  459. case CONVERT (A52_3F2R, A52_2F1R):
  460. mix3to2 (samples, bias);
  461. move2to1 (samples + 768, samples + 512, bias);
  462. break;
  463. case CONVERT (A52_3F2R, A52_3F1R):
  464. mix2to1 (samples + 768, samples + 1024, bias);
  465. break;
  466. case CONVERT (A52_2F1R, A52_2F2R):
  467. memcpy (samples + 768, samples + 512, 256 * sizeof (sample_t));
  468. break;
  469. case CONVERT (A52_3F1R, A52_2F2R):
  470. mix3to2 (samples, bias);
  471. memcpy (samples + 512, samples + 768, 256 * sizeof (sample_t));
  472. break;
  473. case CONVERT (A52_3F2R, A52_2F2R):
  474. mix3to2 (samples, bias);
  475. memcpy (samples + 512, samples + 768, 256 * sizeof (sample_t));
  476. memcpy (samples + 768, samples + 1024, 256 * sizeof (sample_t));
  477. break;
  478. case CONVERT (A52_3F1R, A52_3F2R):
  479. memcpy (samples + 1027, samples + 768, 256 * sizeof (sample_t));
  480. break;
  481. }
  482. }
  483. void a52_upmix (sample_t * samples, int acmod, int output)
  484. {
  485. switch (CONVERT (acmod, output & A52_CHANNEL_MASK)) {
  486. case CONVERT (A52_CHANNEL, A52_CHANNEL2):
  487. memcpy (samples + 256, samples, 256 * sizeof (sample_t));
  488. break;
  489. case CONVERT (A52_3F2R, A52_MONO):
  490. zero (samples + 1024);
  491. case CONVERT (A52_3F1R, A52_MONO):
  492. case CONVERT (A52_2F2R, A52_MONO):
  493. zero (samples + 768);
  494. case CONVERT (A52_3F, A52_MONO):
  495. case CONVERT (A52_2F1R, A52_MONO):
  496. zero (samples + 512);
  497. case CONVERT (A52_CHANNEL, A52_MONO):
  498. case CONVERT (A52_STEREO, A52_MONO):
  499. zero (samples + 256);
  500. break;
  501. case CONVERT (A52_3F2R, A52_STEREO):
  502. case CONVERT (A52_3F2R, A52_DOLBY):
  503. zero (samples + 1024);
  504. case CONVERT (A52_3F1R, A52_STEREO):
  505. case CONVERT (A52_3F1R, A52_DOLBY):
  506. zero (samples + 768);
  507. case CONVERT (A52_3F, A52_STEREO):
  508. case CONVERT (A52_3F, A52_DOLBY):
  509. mix_3to2:
  510. memcpy (samples + 512, samples + 256, 256 * sizeof (sample_t));
  511. zero (samples + 256);
  512. break;
  513. case CONVERT (A52_2F2R, A52_STEREO):
  514. case CONVERT (A52_2F2R, A52_DOLBY):
  515. zero (samples + 768);
  516. case CONVERT (A52_2F1R, A52_STEREO):
  517. case CONVERT (A52_2F1R, A52_DOLBY):
  518. zero (samples + 512);
  519. break;
  520. case CONVERT (A52_3F2R, A52_3F):
  521. zero (samples + 1024);
  522. case CONVERT (A52_3F1R, A52_3F):
  523. case CONVERT (A52_2F2R, A52_2F1R):
  524. zero (samples + 768);
  525. break;
  526. case CONVERT (A52_3F2R, A52_3F1R):
  527. zero (samples + 1024);
  528. break;
  529. case CONVERT (A52_3F2R, A52_2F1R):
  530. zero (samples + 1024);
  531. case CONVERT (A52_3F1R, A52_2F1R):
  532. mix_31to21:
  533. memcpy (samples + 768, samples + 512, 256 * sizeof (sample_t));
  534. goto mix_3to2;
  535. case CONVERT (A52_3F2R, A52_2F2R):
  536. memcpy (samples + 1024, samples + 768, 256 * sizeof (sample_t));
  537. goto mix_31to21;
  538. }
  539. }