downmix.c
上传用户:xjjlds
上传日期:2015-12-05
资源大小:22823k
文件大小:17k
源码类别:

多媒体编程

开发平台:

Visual C++

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