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.

323 lines
11KB

  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_exss.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 -1;
  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 -1;
  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. if (get_bits1(&s->gb)) { // 1-to-1 channels to speakers
  111. int spkr_remap_sets;
  112. int spkr_mask_size = 16;
  113. int num_spkrs[7];
  114. if (channels > 2)
  115. embedded_stereo = get_bits1(&s->gb);
  116. if (channels > 6)
  117. embedded_6ch = get_bits1(&s->gb);
  118. if (get_bits1(&s->gb)) {
  119. spkr_mask_size = (get_bits(&s->gb, 2) + 1) << 2;
  120. skip_bits(&s->gb, spkr_mask_size); // spkr activity mask
  121. }
  122. spkr_remap_sets = get_bits(&s->gb, 3);
  123. for (i = 0; i < spkr_remap_sets; i++) {
  124. /* std layout mask for each remap set */
  125. num_spkrs[i] = dca_exss_mask2count(get_bits(&s->gb, spkr_mask_size));
  126. }
  127. for (i = 0; i < spkr_remap_sets; i++) {
  128. int num_dec_ch_remaps = get_bits(&s->gb, 5) + 1;
  129. if (get_bits_left(&s->gb) < 0)
  130. return -1;
  131. for (j = 0; j < num_spkrs[i]; j++) {
  132. int remap_dec_ch_mask = get_bits_long(&s->gb, num_dec_ch_remaps);
  133. int num_dec_ch = av_popcount(remap_dec_ch_mask);
  134. skip_bits_long(&s->gb, num_dec_ch * 5); // remap codes
  135. }
  136. }
  137. } else {
  138. skip_bits(&s->gb, 3); // representation type
  139. }
  140. }
  141. drc_code_present = get_bits1(&s->gb);
  142. if (drc_code_present)
  143. get_bits(&s->gb, 8); // drc code
  144. if (get_bits1(&s->gb))
  145. skip_bits(&s->gb, 5); // dialog normalization code
  146. if (drc_code_present && embedded_stereo)
  147. get_bits(&s->gb, 8); // drc stereo code
  148. if (s->mix_metadata && get_bits1(&s->gb)) {
  149. skip_bits(&s->gb, 1); // external mix
  150. skip_bits(&s->gb, 6); // post mix gain code
  151. if (get_bits(&s->gb, 2) != 3) // mixer drc code
  152. skip_bits(&s->gb, 3); // drc limit
  153. else
  154. skip_bits(&s->gb, 8); // custom drc code
  155. if (get_bits1(&s->gb)) // channel specific scaling
  156. for (i = 0; i < s->num_mix_configs; i++)
  157. skip_bits_long(&s->gb, s->mix_config_num_ch[i] * 6); // scale codes
  158. else
  159. skip_bits_long(&s->gb, s->num_mix_configs * 6); // scale codes
  160. for (i = 0; i < s->num_mix_configs; i++) {
  161. if (get_bits_left(&s->gb) < 0)
  162. return -1;
  163. dca_exss_skip_mix_coeffs(&s->gb, channels, s->mix_config_num_ch[i]);
  164. if (embedded_6ch)
  165. dca_exss_skip_mix_coeffs(&s->gb, 6, s->mix_config_num_ch[i]);
  166. if (embedded_stereo)
  167. dca_exss_skip_mix_coeffs(&s->gb, 2, s->mix_config_num_ch[i]);
  168. }
  169. }
  170. switch (get_bits(&s->gb, 2)) {
  171. case 0:
  172. extensions_mask = get_bits(&s->gb, 12);
  173. break;
  174. case 1:
  175. extensions_mask = DCA_EXT_EXSS_XLL;
  176. break;
  177. case 2:
  178. extensions_mask = DCA_EXT_EXSS_LBR;
  179. break;
  180. case 3:
  181. extensions_mask = 0; /* aux coding */
  182. break;
  183. }
  184. /* not parsed further, we were only interested in the extensions mask */
  185. if (get_bits_left(&s->gb) < 0)
  186. return -1;
  187. if (get_bits_count(&s->gb) - header_pos > header_size * 8) {
  188. av_log(s->avctx, AV_LOG_WARNING, "Asset header size mismatch.\n");
  189. return -1;
  190. }
  191. skip_bits_long(&s->gb, header_pos + header_size * 8 - get_bits_count(&s->gb));
  192. if (extensions_mask & DCA_EXT_EXSS_XLL)
  193. s->profile = FF_PROFILE_DTS_HD_MA;
  194. else if (extensions_mask & (DCA_EXT_EXSS_XBR | DCA_EXT_EXSS_X96 |
  195. DCA_EXT_EXSS_XXCH))
  196. s->profile = FF_PROFILE_DTS_HD_HRA;
  197. if (!(extensions_mask & DCA_EXT_CORE))
  198. av_log(s->avctx, AV_LOG_WARNING, "DTS core detection mismatch.\n");
  199. if ((extensions_mask & DCA_CORE_EXTS) != s->core_ext_mask)
  200. av_log(s->avctx, AV_LOG_WARNING,
  201. "DTS extensions detection mismatch (%d, %d)\n",
  202. extensions_mask & DCA_CORE_EXTS, s->core_ext_mask);
  203. return 0;
  204. }
  205. /**
  206. * Parse extension substream header (HD)
  207. */
  208. void ff_dca_exss_parse_header(DCAContext *s)
  209. {
  210. int ss_index;
  211. int blownup;
  212. int num_audiop = 1;
  213. int num_assets = 1;
  214. int active_ss_mask[8];
  215. int i, j;
  216. if (get_bits_left(&s->gb) < 52)
  217. return;
  218. skip_bits(&s->gb, 8); // user data
  219. ss_index = get_bits(&s->gb, 2);
  220. blownup = get_bits1(&s->gb);
  221. skip_bits(&s->gb, 8 + 4 * blownup); // header_size
  222. skip_bits(&s->gb, 16 + 4 * blownup); // hd_size
  223. s->static_fields = get_bits1(&s->gb);
  224. if (s->static_fields) {
  225. skip_bits(&s->gb, 2); // reference clock code
  226. skip_bits(&s->gb, 3); // frame duration code
  227. if (get_bits1(&s->gb))
  228. skip_bits_long(&s->gb, 36); // timestamp
  229. /* a single stream can contain multiple audio assets that can be
  230. * combined to form multiple audio presentations */
  231. num_audiop = get_bits(&s->gb, 3) + 1;
  232. if (num_audiop > 1) {
  233. avpriv_request_sample(s->avctx,
  234. "Multiple DTS-HD audio presentations");
  235. /* ignore such streams for now */
  236. return;
  237. }
  238. num_assets = get_bits(&s->gb, 3) + 1;
  239. if (num_assets > 1) {
  240. avpriv_request_sample(s->avctx, "Multiple DTS-HD audio assets");
  241. /* ignore such streams for now */
  242. return;
  243. }
  244. for (i = 0; i < num_audiop; i++)
  245. active_ss_mask[i] = get_bits(&s->gb, ss_index + 1);
  246. for (i = 0; i < num_audiop; i++)
  247. for (j = 0; j <= ss_index; j++)
  248. if (active_ss_mask[i] & (1 << j))
  249. skip_bits(&s->gb, 8); // active asset mask
  250. s->mix_metadata = get_bits1(&s->gb);
  251. if (s->mix_metadata) {
  252. int mix_out_mask_size;
  253. skip_bits(&s->gb, 2); // adjustment level
  254. mix_out_mask_size = (get_bits(&s->gb, 2) + 1) << 2;
  255. s->num_mix_configs = get_bits(&s->gb, 2) + 1;
  256. for (i = 0; i < s->num_mix_configs; i++) {
  257. int mix_out_mask = get_bits(&s->gb, mix_out_mask_size);
  258. s->mix_config_num_ch[i] = dca_exss_mask2count(mix_out_mask);
  259. }
  260. }
  261. }
  262. for (i = 0; i < num_assets; i++)
  263. skip_bits_long(&s->gb, 16 + 4 * blownup); // asset size
  264. for (i = 0; i < num_assets; i++) {
  265. if (dca_exss_parse_asset_header(s))
  266. return;
  267. }
  268. /* not parsed further, we were only interested in the extensions mask
  269. * from the asset header */
  270. }