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

多媒体编程

开发平台:

Visual C++

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