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.

531 lines
14KB

  1. /*
  2. *
  3. * downmix.c
  4. *
  5. * Copyright (C) Aaron Holtzman - Sept 1999
  6. *
  7. * Originally based on code by Yuqing Deng.
  8. *
  9. * This file is part of ac3dec, a free Dolby AC-3 stream decoder.
  10. *
  11. * ac3dec is free software; you can redistribute it and/or modify
  12. * it under the terms of the GNU General Public License as published by
  13. * the Free Software Foundation; either version 2, or (at your option)
  14. * any later version.
  15. *
  16. * ac3dec is distributed in the hope that it will be useful,
  17. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  18. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  19. * GNU General Public License for more details.
  20. *
  21. * You should have received a copy of the GNU General Public License
  22. * along with GNU Make; see the file COPYING. If not, write to
  23. * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  24. *
  25. *
  26. */
  27. #include "../common.h"
  28. #include <math.h>
  29. #include "ac3.h"
  30. #include "ac3_internal.h"
  31. #define CONVERT(acmod,output) (((output) << 3) + (acmod))
  32. int downmix_init (int input, int flags, float * level, float clev, float slev)
  33. {
  34. static uint8_t table[11][8] = {
  35. {AC3_CHANNEL, AC3_DOLBY, AC3_STEREO, AC3_STEREO,
  36. AC3_STEREO, AC3_STEREO, AC3_STEREO, AC3_STEREO},
  37. {AC3_MONO, AC3_MONO, AC3_MONO, AC3_MONO,
  38. AC3_MONO, AC3_MONO, AC3_MONO, AC3_MONO},
  39. {AC3_CHANNEL, AC3_DOLBY, AC3_STEREO, AC3_STEREO,
  40. AC3_STEREO, AC3_STEREO, AC3_STEREO, AC3_STEREO},
  41. {AC3_CHANNEL, AC3_DOLBY, AC3_STEREO, AC3_3F,
  42. AC3_STEREO, AC3_3F, AC3_STEREO, AC3_3F},
  43. {AC3_CHANNEL, AC3_DOLBY, AC3_STEREO, AC3_STEREO,
  44. AC3_2F1R, AC3_2F1R, AC3_2F1R, AC3_2F1R},
  45. {AC3_CHANNEL, AC3_DOLBY, AC3_STEREO, AC3_STEREO,
  46. AC3_2F1R, AC3_3F1R, AC3_2F1R, AC3_3F1R},
  47. {AC3_CHANNEL, AC3_DOLBY, AC3_STEREO, AC3_3F,
  48. AC3_2F2R, AC3_2F2R, AC3_2F2R, AC3_2F2R},
  49. {AC3_CHANNEL, AC3_DOLBY, AC3_STEREO, AC3_3F,
  50. AC3_2F2R, AC3_3F2R, AC3_2F2R, AC3_3F2R},
  51. {AC3_CHANNEL1, AC3_MONO, AC3_MONO, AC3_MONO,
  52. AC3_MONO, AC3_MONO, AC3_MONO, AC3_MONO},
  53. {AC3_CHANNEL2, AC3_MONO, AC3_MONO, AC3_MONO,
  54. AC3_MONO, AC3_MONO, AC3_MONO, AC3_MONO},
  55. {AC3_CHANNEL, AC3_DOLBY, AC3_STEREO, AC3_DOLBY,
  56. AC3_DOLBY, AC3_DOLBY, AC3_DOLBY, AC3_DOLBY}
  57. };
  58. int output;
  59. output = flags & AC3_CHANNEL_MASK;
  60. if (output > AC3_DOLBY)
  61. return -1;
  62. output = table[output][input & 7];
  63. if ((output == AC3_STEREO) &&
  64. ((input == AC3_DOLBY) || ((input == AC3_3F) && (clev == LEVEL_3DB))))
  65. output = AC3_DOLBY;
  66. if (flags & AC3_ADJUST_LEVEL)
  67. switch (CONVERT (input & 7, output)) {
  68. case CONVERT (AC3_3F, AC3_MONO):
  69. *level *= LEVEL_3DB / (1 + clev);
  70. break;
  71. case CONVERT (AC3_STEREO, AC3_MONO):
  72. case CONVERT (AC3_2F2R, AC3_2F1R):
  73. case CONVERT (AC3_3F2R, AC3_3F1R):
  74. level_3db:
  75. *level *= LEVEL_3DB;
  76. break;
  77. case CONVERT (AC3_3F2R, AC3_2F1R):
  78. if (clev < LEVEL_PLUS3DB - 1)
  79. goto level_3db;
  80. // break thru
  81. case CONVERT (AC3_3F, AC3_STEREO):
  82. case CONVERT (AC3_3F1R, AC3_2F1R):
  83. case CONVERT (AC3_3F1R, AC3_2F2R):
  84. case CONVERT (AC3_3F2R, AC3_2F2R):
  85. *level /= 1 + clev;
  86. break;
  87. case CONVERT (AC3_2F1R, AC3_MONO):
  88. *level *= LEVEL_PLUS3DB / (2 + slev);
  89. break;
  90. case CONVERT (AC3_2F1R, AC3_STEREO):
  91. case CONVERT (AC3_3F1R, AC3_3F):
  92. *level /= 1 + slev * LEVEL_3DB;
  93. break;
  94. case CONVERT (AC3_3F1R, AC3_MONO):
  95. *level *= LEVEL_3DB / (1 + clev + 0.5 * slev);
  96. break;
  97. case CONVERT (AC3_3F1R, AC3_STEREO):
  98. *level /= 1 + clev + slev * LEVEL_3DB;
  99. break;
  100. case CONVERT (AC3_2F2R, AC3_MONO):
  101. *level *= LEVEL_3DB / (1 + slev);
  102. break;
  103. case CONVERT (AC3_2F2R, AC3_STEREO):
  104. case CONVERT (AC3_3F2R, AC3_3F):
  105. *level /= (1 + slev);
  106. break;
  107. case CONVERT (AC3_3F2R, AC3_MONO):
  108. *level *= LEVEL_3DB / (1 + clev + slev);
  109. break;
  110. case CONVERT (AC3_3F2R, AC3_STEREO):
  111. *level /= 1 + clev + slev;
  112. break;
  113. case CONVERT (AC3_MONO, AC3_DOLBY):
  114. *level *= LEVEL_PLUS3DB;
  115. break;
  116. case CONVERT (AC3_3F, AC3_DOLBY):
  117. case CONVERT (AC3_2F1R, AC3_DOLBY):
  118. *level *= 1 / (1 + LEVEL_3DB);
  119. break;
  120. case CONVERT (AC3_3F1R, AC3_DOLBY):
  121. case CONVERT (AC3_2F2R, AC3_DOLBY):
  122. *level *= 1 / (1 + 2 * LEVEL_3DB);
  123. break;
  124. case CONVERT (AC3_3F2R, AC3_DOLBY):
  125. *level *= 1 / (1 + 3 * LEVEL_3DB);
  126. break;
  127. }
  128. return output;
  129. }
  130. static void mix1to1 (float * samples, float level, float bias)
  131. {
  132. int i;
  133. for (i = 0; i < 256; i++)
  134. samples[i] = samples[i] * level + bias;
  135. }
  136. static void move1to1 (float * src, float * dest, float level, float bias)
  137. {
  138. int i;
  139. for (i = 0; i < 256; i++)
  140. dest[i] = src[i] * level + bias;
  141. }
  142. static void mix2to1 (float * samples, float level, float bias)
  143. {
  144. int i;
  145. for (i = 0; i < 256; i++)
  146. samples[i] = (samples[i] + samples[i + 256]) * level + bias;
  147. }
  148. static void move2to1 (float * src, float * dest, float level, float bias)
  149. {
  150. int i;
  151. for (i = 0; i < 256; i++)
  152. dest[i] = (src[i] + src[i + 256]) * level + bias;
  153. }
  154. static void mix3to1 (float * samples, float level, float clev, float bias)
  155. {
  156. int i;
  157. for (i = 0; i < 256; i++)
  158. samples[i] = ((samples[i] + samples[i + 512]) * level +
  159. samples[i + 256] * clev + bias);
  160. }
  161. static void mix21to1 (float * samples, float level, float slev, float bias)
  162. {
  163. int i;
  164. for (i = 0; i < 256; i++)
  165. samples[i] = ((samples[i] + samples[i + 256]) * level +
  166. samples[i + 512] * slev + bias);
  167. }
  168. static void mix31to1 (float * samples, float level, float clev, float slev,
  169. float bias)
  170. {
  171. int i;
  172. for (i = 0; i < 256; i++)
  173. samples[i] = ((samples[i] + samples[i + 512]) * level +
  174. samples[i + 256] * clev + samples[i + 768] * slev +
  175. bias);
  176. }
  177. static void mix22to1 (float * samples, float level, float slev, float bias)
  178. {
  179. int i;
  180. for (i = 0; i < 256; i++)
  181. samples[i] = ((samples[i] + samples[i + 256]) * level +
  182. (samples[i + 512] + samples[i + 768]) * slev + bias);
  183. }
  184. static void mix32to1 (float * samples, float level, float clev, float slev,
  185. float bias)
  186. {
  187. int i;
  188. for (i = 0; i < 256; i++)
  189. samples[i] = ((samples[i] + samples[i + 512]) * level +
  190. samples[i + 256] * clev +
  191. (samples[i + 768] + samples[i + 1024]) * slev + bias);
  192. }
  193. static void mix1to2 (float * src, float * dest, float level, float bias)
  194. {
  195. int i;
  196. for (i = 0; i < 256; i++)
  197. dest[i] = src[i] = src[i] * level + bias;
  198. }
  199. static void mix3to2 (float * samples, float level, float clev, float bias)
  200. {
  201. int i;
  202. float common;
  203. for (i = 0; i < 256; i++) {
  204. common = samples[i + 256] * clev + bias;
  205. samples[i] = samples[i] * level + common;
  206. samples[i + 256] = samples[i + 512] * level + common;
  207. }
  208. }
  209. static void mix21to2 (float * left, float * right, float level, float slev,
  210. float bias)
  211. {
  212. int i;
  213. float common;
  214. for (i = 0; i < 256; i++) {
  215. common = right[i + 256] * slev + bias;
  216. left[i] = left[i] * level + common;
  217. right[i] = right[i] * level + common;
  218. }
  219. }
  220. static void mix11to1 (float * front, float * rear, float level, float slev,
  221. float bias)
  222. {
  223. int i;
  224. for (i = 0; i < 256; i++)
  225. front[i] = front[i] * level + rear[i] * slev + bias;
  226. }
  227. static void mix31to2 (float * samples, float level, float clev, float slev,
  228. float bias)
  229. {
  230. int i;
  231. float common;
  232. for (i = 0; i < 256; i++) {
  233. common = samples[i + 256] * clev + samples[i + 768] * slev + bias;
  234. samples[i] = samples[i] * level + common;
  235. samples[i + 256] = samples[i + 512] * level + common;
  236. }
  237. }
  238. static void mix32to2 (float * samples, float level, float clev, float slev,
  239. float bias)
  240. {
  241. int i;
  242. float common;
  243. for (i = 0; i < 256; i++) {
  244. common = samples[i + 256] * clev + bias;
  245. samples[i] = samples[i] * level + common + samples[i + 768] * slev;
  246. samples[i + 256] = (samples[i + 512] * level + common +
  247. samples[i + 1024] * slev);
  248. }
  249. }
  250. static void mix21toS (float * samples, float level, float level3db, float bias)
  251. {
  252. int i;
  253. float surround;
  254. for (i = 0; i < 256; i++) {
  255. surround = samples[i + 512] * level3db;
  256. samples[i] = samples[i] * level - surround + bias;
  257. samples[i + 256] = samples[i + 256] * level + surround + bias;
  258. }
  259. }
  260. static void mix22toS (float * samples, float level, float level3db, float bias)
  261. {
  262. int i;
  263. float surround;
  264. for (i = 0; i < 256; i++) {
  265. surround = (samples[i + 512] + samples[i + 768]) * level3db;
  266. samples[i] = samples[i] * level - surround + bias;
  267. samples[i + 256] = samples[i + 256] * level + surround + bias;
  268. }
  269. }
  270. static void mix31toS (float * samples, float level, float level3db, float bias)
  271. {
  272. int i;
  273. float common, surround;
  274. for (i = 0; i < 256; i++) {
  275. common = samples[i + 256] * level3db + bias;
  276. surround = samples[i + 768] * level3db;
  277. samples[i] = samples[i] * level + common - surround;
  278. samples[i + 256] = samples[i + 512] * level + common + surround;
  279. }
  280. }
  281. static void mix32toS (float * samples, float level, float level3db, float bias)
  282. {
  283. int i;
  284. float common, surround;
  285. for (i = 0; i < 256; i++) {
  286. common = samples[i + 256] * level3db + bias;
  287. surround = (samples[i + 768] + samples[i + 1024]) * level3db;
  288. samples[i] = samples[i] * level + common - surround;
  289. samples[i + 256] = samples[i + 512] * level + common + surround;
  290. }
  291. }
  292. void downmix (float * samples, int acmod, int output, float level, float bias,
  293. float clev, float slev)
  294. {
  295. switch (CONVERT (acmod, output & AC3_CHANNEL_MASK)) {
  296. case CONVERT (AC3_3F2R, AC3_3F2R):
  297. mix1to1 (samples + 1024, level, bias);
  298. case CONVERT (AC3_3F1R, AC3_3F1R):
  299. case CONVERT (AC3_2F2R, AC3_2F2R):
  300. mix1to1 (samples + 768, level, bias);
  301. case CONVERT (AC3_3F, AC3_3F):
  302. case CONVERT (AC3_2F1R, AC3_2F1R):
  303. mix_3to3:
  304. mix1to1 (samples + 512, level, bias);
  305. case CONVERT (AC3_CHANNEL, AC3_CHANNEL):
  306. case CONVERT (AC3_STEREO, AC3_STEREO):
  307. case CONVERT (AC3_STEREO, AC3_DOLBY):
  308. mix_2to2:
  309. mix1to1 (samples + 256, level, bias);
  310. case CONVERT (AC3_CHANNEL, AC3_CHANNEL1):
  311. case CONVERT (AC3_MONO, AC3_MONO):
  312. mix1to1 (samples, level, bias);
  313. break;
  314. case CONVERT (AC3_CHANNEL, AC3_CHANNEL2):
  315. mix_1to1_b:
  316. mix1to1 (samples + 256, level, bias);
  317. break;
  318. case CONVERT (AC3_STEREO, AC3_MONO):
  319. mix_2to1:
  320. mix2to1 (samples, level * LEVEL_3DB, bias);
  321. break;
  322. case CONVERT (AC3_2F1R, AC3_MONO):
  323. if (slev == 0)
  324. goto mix_2to1;
  325. mix21to1 (samples, level * LEVEL_3DB, level * slev * LEVEL_3DB, bias);
  326. break;
  327. case CONVERT (AC3_2F2R, AC3_MONO):
  328. if (slev == 0)
  329. goto mix_2to1;
  330. mix22to1 (samples, level * LEVEL_3DB, level * slev * LEVEL_3DB, bias);
  331. break;
  332. case CONVERT (AC3_3F, AC3_MONO):
  333. mix_3to1:
  334. mix3to1 (samples, level * LEVEL_3DB, level * clev * LEVEL_PLUS3DB,
  335. bias);
  336. break;
  337. case CONVERT (AC3_3F1R, AC3_MONO):
  338. if (slev == 0)
  339. goto mix_3to1;
  340. mix31to1 (samples, level * LEVEL_3DB, level * clev * LEVEL_PLUS3DB,
  341. level * slev * LEVEL_3DB, bias);
  342. break;
  343. case CONVERT (AC3_3F2R, AC3_MONO):
  344. if (slev == 0)
  345. goto mix_3to1;
  346. mix32to1 (samples, level * LEVEL_3DB, level * clev * LEVEL_PLUS3DB,
  347. level * slev * LEVEL_3DB, bias);
  348. break;
  349. case CONVERT (AC3_CHANNEL, AC3_MONO):
  350. mix2to1 (samples, level * LEVEL_6DB, bias);
  351. break;
  352. case CONVERT (AC3_MONO, AC3_DOLBY):
  353. mix1to2 (samples, samples + 256, level * LEVEL_3DB, bias);
  354. break;
  355. case CONVERT (AC3_3F, AC3_DOLBY):
  356. clev = LEVEL_3DB;
  357. case CONVERT (AC3_3F, AC3_STEREO):
  358. mix_3to2:
  359. mix3to2 (samples, level, level * clev, bias);
  360. break;
  361. case CONVERT (AC3_2F1R, AC3_DOLBY):
  362. mix21toS (samples, level, level * LEVEL_3DB, bias);
  363. break;
  364. case CONVERT (AC3_3F1R, AC3_DOLBY):
  365. mix31toS (samples, level, level * LEVEL_3DB, bias);
  366. break;
  367. case CONVERT (AC3_2F2R, AC3_DOLBY):
  368. mix22toS (samples, level, level * LEVEL_3DB, bias);
  369. break;
  370. case CONVERT (AC3_3F2R, AC3_DOLBY):
  371. mix32toS (samples, level, level * LEVEL_3DB, bias);
  372. break;
  373. case CONVERT (AC3_2F1R, AC3_STEREO):
  374. if (slev == 0)
  375. goto mix_2to2;
  376. mix21to2 (samples, samples + 256, level, level * slev * LEVEL_3DB,
  377. bias);
  378. break;
  379. case CONVERT (AC3_3F1R, AC3_STEREO):
  380. if (slev == 0)
  381. goto mix_3to2;
  382. mix31to2 (samples, level, level * clev, level * slev * LEVEL_3DB,
  383. bias);
  384. break;
  385. case CONVERT (AC3_2F2R, AC3_STEREO):
  386. if (slev == 0)
  387. goto mix_2to2;
  388. mix11to1 (samples, samples + 512, level, level * slev, bias);
  389. mix11to1 (samples + 256, samples + 768, level, level * slev, bias);
  390. break;
  391. case CONVERT (AC3_3F2R, AC3_STEREO):
  392. if (slev == 0)
  393. goto mix_3to2;
  394. mix32to2 (samples, level, level * clev, level * slev, bias);
  395. break;
  396. case CONVERT (AC3_3F1R, AC3_3F):
  397. if (slev == 0)
  398. goto mix_3to3;
  399. mix21to2 (samples, samples + 512, level, level * slev * LEVEL_3DB,
  400. bias);
  401. case CONVERT (AC3_3F2R, AC3_3F):
  402. if (slev == 0)
  403. goto mix_3to3;
  404. mix11to1 (samples, samples + 768, level, level * slev, bias);
  405. mix11to1 (samples + 512, samples + 1024, level, level * slev, bias);
  406. goto mix_1to1_b;
  407. case CONVERT (AC3_2F1R, AC3_2F2R):
  408. mix1to2 (samples + 512, samples + 768, level * LEVEL_3DB, bias);
  409. goto mix_2to2;
  410. case CONVERT (AC3_3F1R, AC3_3F2R):
  411. mix1to2 (samples + 768, samples + 1024, level * LEVEL_3DB, bias);
  412. goto mix_3to3;
  413. case CONVERT (AC3_2F2R, AC3_2F1R):
  414. mix2to1 (samples + 512, level * LEVEL_3DB, bias);
  415. goto mix_2to2;
  416. case CONVERT (AC3_3F2R, AC3_3F1R):
  417. mix2to1 (samples + 768, level * LEVEL_3DB, bias);
  418. goto mix_3to3;
  419. case CONVERT (AC3_3F1R, AC3_2F2R):
  420. mix3to2 (samples, level, level * clev, bias);
  421. mix1to2 (samples + 768, samples + 512, level * LEVEL_3DB, bias);
  422. break;
  423. case CONVERT (AC3_3F1R, AC3_2F1R):
  424. mix3to2 (samples, level, level * clev, bias);
  425. move1to1 (samples + 768, samples + 512, level, bias);
  426. break;
  427. case CONVERT (AC3_3F2R, AC3_2F1R):
  428. mix3to2 (samples, level, level * clev, bias);
  429. move2to1 (samples + 768, samples + 512, level * LEVEL_3DB, bias);
  430. break;
  431. case CONVERT (AC3_3F2R, AC3_2F2R):
  432. mix3to2 (samples, level, level * clev, bias);
  433. move1to1 (samples + 768, samples + 512, level, bias);
  434. move1to1 (samples + 1024, samples + 768, level, bias);
  435. break;
  436. }
  437. }