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.

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