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.

369 lines
12KB

  1. /*
  2. * DCA ExSS extension
  3. *
  4. * This file is part of Libav.
  5. *
  6. * Libav is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU Lesser General Public
  8. * License as published by the Free Software Foundation; either
  9. * version 2.1 of the License, or (at your option) any later version.
  10. *
  11. * Libav is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  14. * Lesser General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU Lesser General Public
  17. * License along with Libav; if not, write to the Free Software
  18. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  19. */
  20. #include "libavutil/common.h"
  21. #include "libavutil/log.h"
  22. #include "dca.h"
  23. #include "dca_syncwords.h"
  24. #include "get_bits.h"
  25. /* extensions that reside in core substream */
  26. #define DCA_CORE_EXTS (DCA_EXT_XCH | DCA_EXT_XXCH | DCA_EXT_X96)
  27. /* these are unconfirmed but should be mostly correct */
  28. enum DCAExSSSpeakerMask {
  29. DCA_EXSS_FRONT_CENTER = 0x0001,
  30. DCA_EXSS_FRONT_LEFT_RIGHT = 0x0002,
  31. DCA_EXSS_SIDE_REAR_LEFT_RIGHT = 0x0004,
  32. DCA_EXSS_LFE = 0x0008,
  33. DCA_EXSS_REAR_CENTER = 0x0010,
  34. DCA_EXSS_FRONT_HIGH_LEFT_RIGHT = 0x0020,
  35. DCA_EXSS_REAR_LEFT_RIGHT = 0x0040,
  36. DCA_EXSS_FRONT_HIGH_CENTER = 0x0080,
  37. DCA_EXSS_OVERHEAD = 0x0100,
  38. DCA_EXSS_CENTER_LEFT_RIGHT = 0x0200,
  39. DCA_EXSS_WIDE_LEFT_RIGHT = 0x0400,
  40. DCA_EXSS_SIDE_LEFT_RIGHT = 0x0800,
  41. DCA_EXSS_LFE2 = 0x1000,
  42. DCA_EXSS_SIDE_HIGH_LEFT_RIGHT = 0x2000,
  43. DCA_EXSS_REAR_HIGH_CENTER = 0x4000,
  44. DCA_EXSS_REAR_HIGH_LEFT_RIGHT = 0x8000,
  45. };
  46. /**
  47. * Return the number of channels in an ExSS speaker mask (HD)
  48. */
  49. static int dca_exss_mask2count(int mask)
  50. {
  51. /* count bits that mean speaker pairs twice */
  52. return av_popcount(mask) +
  53. av_popcount(mask & (DCA_EXSS_CENTER_LEFT_RIGHT |
  54. DCA_EXSS_FRONT_LEFT_RIGHT |
  55. DCA_EXSS_FRONT_HIGH_LEFT_RIGHT |
  56. DCA_EXSS_WIDE_LEFT_RIGHT |
  57. DCA_EXSS_SIDE_LEFT_RIGHT |
  58. DCA_EXSS_SIDE_HIGH_LEFT_RIGHT |
  59. DCA_EXSS_SIDE_REAR_LEFT_RIGHT |
  60. DCA_EXSS_REAR_LEFT_RIGHT |
  61. DCA_EXSS_REAR_HIGH_LEFT_RIGHT));
  62. }
  63. /**
  64. * Skip mixing coefficients of a single mix out configuration (HD)
  65. */
  66. static void dca_exss_skip_mix_coeffs(GetBitContext *gb, int channels, int out_ch)
  67. {
  68. int i;
  69. for (i = 0; i < channels; i++) {
  70. int mix_map_mask = get_bits(gb, out_ch);
  71. int num_coeffs = av_popcount(mix_map_mask);
  72. skip_bits_long(gb, num_coeffs * 6);
  73. }
  74. }
  75. /**
  76. * Parse extension substream asset header (HD)
  77. */
  78. static int dca_exss_parse_asset_header(DCAContext *s)
  79. {
  80. int header_pos = get_bits_count(&s->gb);
  81. int header_size;
  82. int channels = 0;
  83. int embedded_stereo = 0;
  84. int embedded_6ch = 0;
  85. int drc_code_present;
  86. int extensions_mask = 0;
  87. int i, j;
  88. if (get_bits_left(&s->gb) < 16)
  89. return AVERROR_INVALIDDATA;
  90. /* We will parse just enough to get to the extensions bitmask with which
  91. * we can set the profile value. */
  92. header_size = get_bits(&s->gb, 9) + 1;
  93. skip_bits(&s->gb, 3); // asset index
  94. if (s->static_fields) {
  95. if (get_bits1(&s->gb))
  96. skip_bits(&s->gb, 4); // asset type descriptor
  97. if (get_bits1(&s->gb))
  98. skip_bits_long(&s->gb, 24); // language descriptor
  99. if (get_bits1(&s->gb)) {
  100. /* How can one fit 1024 bytes of text here if the maximum value
  101. * for the asset header size field above was 512 bytes? */
  102. int text_length = get_bits(&s->gb, 10) + 1;
  103. if (get_bits_left(&s->gb) < text_length * 8)
  104. return AVERROR_INVALIDDATA;
  105. skip_bits_long(&s->gb, text_length * 8); // info text
  106. }
  107. skip_bits(&s->gb, 5); // bit resolution - 1
  108. skip_bits(&s->gb, 4); // max sample rate code
  109. channels = get_bits(&s->gb, 8) + 1;
  110. s->one2one_map_chtospkr = get_bits1(&s->gb);
  111. if (s->one2one_map_chtospkr) {
  112. int spkr_remap_sets;
  113. int spkr_mask_size = 16;
  114. int num_spkrs[7];
  115. if (channels > 2)
  116. embedded_stereo = get_bits1(&s->gb);
  117. if (channels > 6)
  118. embedded_6ch = get_bits1(&s->gb);
  119. if (get_bits1(&s->gb)) {
  120. spkr_mask_size = (get_bits(&s->gb, 2) + 1) << 2;
  121. skip_bits(&s->gb, spkr_mask_size); // spkr activity mask
  122. }
  123. spkr_remap_sets = get_bits(&s->gb, 3);
  124. for (i = 0; i < spkr_remap_sets; i++) {
  125. /* std layout mask for each remap set */
  126. num_spkrs[i] = dca_exss_mask2count(get_bits(&s->gb, spkr_mask_size));
  127. }
  128. for (i = 0; i < spkr_remap_sets; i++) {
  129. int num_dec_ch_remaps = get_bits(&s->gb, 5) + 1;
  130. if (get_bits_left(&s->gb) < 0)
  131. return AVERROR_INVALIDDATA;
  132. for (j = 0; j < num_spkrs[i]; j++) {
  133. int remap_dec_ch_mask = get_bits_long(&s->gb, num_dec_ch_remaps);
  134. int num_dec_ch = av_popcount(remap_dec_ch_mask);
  135. skip_bits_long(&s->gb, num_dec_ch * 5); // remap codes
  136. }
  137. }
  138. } else {
  139. skip_bits(&s->gb, 3); // representation type
  140. }
  141. }
  142. drc_code_present = get_bits1(&s->gb);
  143. if (drc_code_present)
  144. get_bits(&s->gb, 8); // drc code
  145. if (get_bits1(&s->gb))
  146. skip_bits(&s->gb, 5); // dialog normalization code
  147. if (drc_code_present && embedded_stereo)
  148. get_bits(&s->gb, 8); // drc stereo code
  149. if (s->mix_metadata && get_bits1(&s->gb)) {
  150. skip_bits(&s->gb, 1); // external mix
  151. skip_bits(&s->gb, 6); // post mix gain code
  152. if (get_bits(&s->gb, 2) != 3) // mixer drc code
  153. skip_bits(&s->gb, 3); // drc limit
  154. else
  155. skip_bits(&s->gb, 8); // custom drc code
  156. if (get_bits1(&s->gb)) // channel specific scaling
  157. for (i = 0; i < s->num_mix_configs; i++)
  158. skip_bits_long(&s->gb, s->mix_config_num_ch[i] * 6); // scale codes
  159. else
  160. skip_bits_long(&s->gb, s->num_mix_configs * 6); // scale codes
  161. for (i = 0; i < s->num_mix_configs; i++) {
  162. if (get_bits_left(&s->gb) < 0)
  163. return AVERROR_INVALIDDATA;
  164. dca_exss_skip_mix_coeffs(&s->gb, channels, s->mix_config_num_ch[i]);
  165. if (embedded_6ch)
  166. dca_exss_skip_mix_coeffs(&s->gb, 6, s->mix_config_num_ch[i]);
  167. if (embedded_stereo)
  168. dca_exss_skip_mix_coeffs(&s->gb, 2, s->mix_config_num_ch[i]);
  169. }
  170. }
  171. switch (get_bits(&s->gb, 2)) {
  172. case 0:
  173. extensions_mask = get_bits(&s->gb, 12);
  174. break;
  175. case 1:
  176. extensions_mask = DCA_EXT_EXSS_XLL;
  177. break;
  178. case 2:
  179. extensions_mask = DCA_EXT_EXSS_LBR;
  180. break;
  181. case 3:
  182. extensions_mask = 0; /* aux coding */
  183. break;
  184. }
  185. /* not parsed further, we were only interested in the extensions mask */
  186. if (get_bits_left(&s->gb) < 0)
  187. return AVERROR_INVALIDDATA;
  188. if (get_bits_count(&s->gb) - header_pos > header_size * 8) {
  189. av_log(s->avctx, AV_LOG_WARNING, "Asset header size mismatch.\n");
  190. return AVERROR_INVALIDDATA;
  191. }
  192. skip_bits_long(&s->gb, header_pos + header_size * 8 - get_bits_count(&s->gb));
  193. if (extensions_mask & DCA_EXT_EXSS_XLL)
  194. s->profile = FF_PROFILE_DTS_HD_MA;
  195. else if (extensions_mask & (DCA_EXT_EXSS_XBR | DCA_EXT_EXSS_X96 |
  196. DCA_EXT_EXSS_XXCH))
  197. s->profile = FF_PROFILE_DTS_HD_HRA;
  198. if (!(extensions_mask & DCA_EXT_CORE))
  199. av_log(s->avctx, AV_LOG_WARNING, "DTS core detection mismatch.\n");
  200. if ((extensions_mask & DCA_CORE_EXTS) != s->core_ext_mask)
  201. av_log(s->avctx, AV_LOG_WARNING,
  202. "DTS extensions detection mismatch (%d, %d)\n",
  203. extensions_mask & DCA_CORE_EXTS, s->core_ext_mask);
  204. return 0;
  205. }
  206. /**
  207. * Parse extension substream header (HD)
  208. */
  209. void ff_dca_exss_parse_header(DCAContext *s)
  210. {
  211. int asset_size[8];
  212. int ss_index;
  213. int blownup;
  214. int num_audiop = 1;
  215. int num_assets = 1;
  216. int active_ss_mask[8];
  217. int i, j;
  218. int start_pos;
  219. int hdrsize;
  220. uint32_t mkr;
  221. if (get_bits_left(&s->gb) < 52)
  222. return;
  223. start_pos = get_bits_count(&s->gb) - 32;
  224. skip_bits(&s->gb, 8); // user data
  225. ss_index = get_bits(&s->gb, 2);
  226. blownup = get_bits1(&s->gb);
  227. hdrsize = get_bits(&s->gb, 8 + 4 * blownup) + 1; // header_size
  228. skip_bits(&s->gb, 16 + 4 * blownup); // hd_size
  229. s->static_fields = get_bits1(&s->gb);
  230. if (s->static_fields) {
  231. skip_bits(&s->gb, 2); // reference clock code
  232. skip_bits(&s->gb, 3); // frame duration code
  233. if (get_bits1(&s->gb))
  234. skip_bits_long(&s->gb, 36); // timestamp
  235. /* a single stream can contain multiple audio assets that can be
  236. * combined to form multiple audio presentations */
  237. num_audiop = get_bits(&s->gb, 3) + 1;
  238. if (num_audiop > 1) {
  239. avpriv_request_sample(s->avctx,
  240. "Multiple DTS-HD audio presentations");
  241. /* ignore such streams for now */
  242. return;
  243. }
  244. num_assets = get_bits(&s->gb, 3) + 1;
  245. if (num_assets > 1) {
  246. avpriv_request_sample(s->avctx, "Multiple DTS-HD audio assets");
  247. /* ignore such streams for now */
  248. return;
  249. }
  250. for (i = 0; i < num_audiop; i++)
  251. active_ss_mask[i] = get_bits(&s->gb, ss_index + 1);
  252. for (i = 0; i < num_audiop; i++)
  253. for (j = 0; j <= ss_index; j++)
  254. if (active_ss_mask[i] & (1 << j))
  255. skip_bits(&s->gb, 8); // active asset mask
  256. s->mix_metadata = get_bits1(&s->gb);
  257. if (s->mix_metadata) {
  258. int mix_out_mask_size;
  259. skip_bits(&s->gb, 2); // adjustment level
  260. mix_out_mask_size = (get_bits(&s->gb, 2) + 1) << 2;
  261. s->num_mix_configs = get_bits(&s->gb, 2) + 1;
  262. for (i = 0; i < s->num_mix_configs; i++) {
  263. int mix_out_mask = get_bits(&s->gb, mix_out_mask_size);
  264. s->mix_config_num_ch[i] = dca_exss_mask2count(mix_out_mask);
  265. }
  266. }
  267. }
  268. for (i = 0; i < num_assets; i++)
  269. asset_size[i] = get_bits_long(&s->gb, 16 + 4 * blownup) + 1;
  270. for (i = 0; i < num_assets; i++) {
  271. if (dca_exss_parse_asset_header(s))
  272. return;
  273. }
  274. if (num_assets > 0) {
  275. j = get_bits_count(&s->gb);
  276. if (start_pos + hdrsize * 8 > j)
  277. skip_bits_long(&s->gb, start_pos + hdrsize * 8 - j);
  278. for (i = 0; i < num_assets; i++) {
  279. int end_pos;
  280. start_pos = get_bits_count(&s->gb);
  281. end_pos = start_pos + asset_size[i] * 8;
  282. mkr = get_bits_long(&s->gb, 32);
  283. /* parse extensions that we know about */
  284. switch (mkr) {
  285. case DCA_SYNCWORD_XLL:
  286. if (s->xll_disable) {
  287. av_log(s->avctx, AV_LOG_DEBUG,
  288. "DTS-XLL: ignoring XLL extension\n");
  289. break;
  290. }
  291. av_log(s->avctx, AV_LOG_DEBUG,
  292. "DTS-XLL: decoding XLL extension\n");
  293. if (ff_dca_xll_decode_header(s) == 0 &&
  294. ff_dca_xll_decode_navi(s, end_pos) == 0)
  295. s->exss_ext_mask |= DCA_EXT_EXSS_XLL;
  296. break;
  297. case DCA_SYNCWORD_XBR:
  298. case DCA_SYNCWORD_XXCH:
  299. default:
  300. av_log(s->avctx, AV_LOG_VERBOSE,
  301. "DTS-ExSS: unknown marker = 0x%08"PRIx32"\n", mkr);
  302. }
  303. /* skip to end of block */
  304. j = get_bits_count(&s->gb);
  305. if (j > end_pos)
  306. av_log(s->avctx, AV_LOG_ERROR,
  307. "DTS-ExSS: Processed asset too long.\n");
  308. if (j < end_pos)
  309. skip_bits_long(&s->gb, end_pos - j);
  310. }
  311. }
  312. }