| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | /* | ||
| 2 | * Copyright (C) 2016 foo86 | ||
| 3 | * | ||
| 4 | * This file is part of FFmpeg. | ||
| 5 | * | ||
| 6 | * FFmpeg 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 | * FFmpeg 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 FFmpeg; if not, write to the Free Software | ||
| 18 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 19 | */ | ||
| 20 | |||
| 21 | #include "dcadec.h" | ||
| 22 | |||
| 23 | 1395 | static void parse_xll_parameters(DCAExssParser *s, DCAExssAsset *asset) | |
| 24 | { | ||
| 25 | // Size of XLL data in extension substream | ||
| 26 | 1395 | asset->xll_size = get_bits(&s->gb, s->exss_size_nbits) + 1; | |
| 27 | |||
| 28 | // XLL sync word present flag | ||
| 29 |
1/2✓ Branch 1 taken 1395 times.
✗ Branch 2 not taken.
|
1395 | if (asset->xll_sync_present = get_bits1(&s->gb)) { |
| 30 | int xll_delay_nbits; | ||
| 31 | |||
| 32 | // Peak bit rate smoothing buffer size | ||
| 33 | 1395 | skip_bits(&s->gb, 4); | |
| 34 | |||
| 35 | // Number of bits for XLL decoding delay | ||
| 36 | 1395 | xll_delay_nbits = get_bits(&s->gb, 5) + 1; | |
| 37 | |||
| 38 | // Initial XLL decoding delay in frames | ||
| 39 | 1395 | asset->xll_delay_nframes = get_bits_long(&s->gb, xll_delay_nbits); | |
| 40 | |||
| 41 | // Number of bytes offset to XLL sync | ||
| 42 | 1395 | asset->xll_sync_offset = get_bits(&s->gb, s->exss_size_nbits); | |
| 43 | } else { | ||
| 44 | ✗ | asset->xll_delay_nframes = 0; | |
| 45 | ✗ | asset->xll_sync_offset = 0; | |
| 46 | } | ||
| 47 | 1395 | } | |
| 48 | |||
| 49 | ✗ | static void parse_lbr_parameters(DCAExssParser *s, DCAExssAsset *asset) | |
| 50 | { | ||
| 51 | // Size of LBR component in extension substream | ||
| 52 | ✗ | asset->lbr_size = get_bits(&s->gb, 14) + 1; | |
| 53 | |||
| 54 | // LBR sync word present flag | ||
| 55 | ✗ | if (get_bits1(&s->gb)) | |
| 56 | // LBR sync distance | ||
| 57 | ✗ | skip_bits(&s->gb, 2); | |
| 58 | ✗ | } | |
| 59 | |||
| 60 | 1459 | static int parse_descriptor(DCAExssParser *s, DCAExssAsset *asset) | |
| 61 | { | ||
| 62 | 1459 | int i, j, drc_present, descr_size, descr_pos = get_bits_count(&s->gb); | |
| 63 | |||
| 64 | // Size of audio asset descriptor in bytes | ||
| 65 | 1459 | descr_size = get_bits(&s->gb, 9) + 1; | |
| 66 | |||
| 67 | // Audio asset identifier | ||
| 68 | 1459 | asset->asset_index = get_bits(&s->gb, 3); | |
| 69 | |||
| 70 | // | ||
| 71 | // Per stream static metadata | ||
| 72 | // | ||
| 73 | |||
| 74 |
1/2✓ Branch 0 taken 1459 times.
✗ Branch 1 not taken.
|
1459 | if (s->static_fields_present) { |
| 75 | // Asset type descriptor presence | ||
| 76 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 1459 times.
|
1459 | if (get_bits1(&s->gb)) |
| 77 | // Asset type descriptor | ||
| 78 | ✗ | skip_bits(&s->gb, 4); | |
| 79 | |||
| 80 | // Language descriptor presence | ||
| 81 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 1459 times.
|
1459 | if (get_bits1(&s->gb)) |
| 82 | // Language descriptor | ||
| 83 | ✗ | skip_bits(&s->gb, 24); | |
| 84 | |||
| 85 | // Additional textual information presence | ||
| 86 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 1459 times.
|
1459 | if (get_bits1(&s->gb)) { |
| 87 | // Byte size of additional text info | ||
| 88 | ✗ | int text_size = get_bits(&s->gb, 10) + 1; | |
| 89 | |||
| 90 | // Sanity check available size | ||
| 91 | ✗ | if (get_bits_left(&s->gb) < text_size * 8) | |
| 92 | ✗ | return AVERROR_INVALIDDATA; | |
| 93 | |||
| 94 | // Additional textual information string | ||
| 95 | ✗ | skip_bits_long(&s->gb, text_size * 8); | |
| 96 | } | ||
| 97 | |||
| 98 | // PCM bit resolution | ||
| 99 | 1459 | asset->pcm_bit_res = get_bits(&s->gb, 5) + 1; | |
| 100 | |||
| 101 | // Maximum sample rate | ||
| 102 | 1459 | asset->max_sample_rate = ff_dca_sampling_freqs[get_bits(&s->gb, 4)]; | |
| 103 | |||
| 104 | // Total number of channels | ||
| 105 | 1459 | asset->nchannels_total = get_bits(&s->gb, 8) + 1; | |
| 106 | |||
| 107 | // One to one map channel to speakers | ||
| 108 |
1/2✓ Branch 1 taken 1459 times.
✗ Branch 2 not taken.
|
1459 | if (asset->one_to_one_map_ch_to_spkr = get_bits1(&s->gb)) { |
| 109 | 1459 | int spkr_mask_nbits = 0; | |
| 110 | int spkr_remap_nsets; | ||
| 111 | int nspeakers[8]; | ||
| 112 | |||
| 113 | // Embedded stereo flag | ||
| 114 |
3/4✓ Branch 0 taken 1459 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 48 times.
✓ Branch 4 taken 1411 times.
|
1459 | asset->embedded_stereo = asset->nchannels_total > 2 && get_bits1(&s->gb); |
| 115 | |||
| 116 | // Embedded 6 channels flag | ||
| 117 |
3/4✓ Branch 0 taken 1334 times.
✓ Branch 1 taken 125 times.
✓ Branch 3 taken 1334 times.
✗ Branch 4 not taken.
|
1459 | asset->embedded_6ch = asset->nchannels_total > 6 && get_bits1(&s->gb); |
| 118 | |||
| 119 | // Speaker mask enabled flag | ||
| 120 |
1/2✓ Branch 1 taken 1459 times.
✗ Branch 2 not taken.
|
1459 | if (asset->spkr_mask_enabled = get_bits1(&s->gb)) { |
| 121 | // Number of bits for speaker activity mask | ||
| 122 | 1459 | spkr_mask_nbits = (get_bits(&s->gb, 2) + 1) << 2; | |
| 123 | |||
| 124 | // Loudspeaker activity mask | ||
| 125 | 1459 | asset->spkr_mask = get_bits(&s->gb, spkr_mask_nbits); | |
| 126 | } | ||
| 127 | |||
| 128 | // Number of speaker remapping sets | ||
| 129 |
3/4✓ Branch 1 taken 1182 times.
✓ Branch 2 taken 277 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1182 times.
|
1459 | if ((spkr_remap_nsets = get_bits(&s->gb, 3)) && !spkr_mask_nbits) { |
| 130 | ✗ | if (s->avctx) | |
| 131 | ✗ | av_log(s->avctx, AV_LOG_ERROR, "Speaker mask disabled yet there are remapping sets\n"); | |
| 132 | ✗ | return AVERROR_INVALIDDATA; | |
| 133 | } | ||
| 134 | |||
| 135 | // Standard loudspeaker layout mask | ||
| 136 |
2/2✓ Branch 0 taken 7092 times.
✓ Branch 1 taken 1459 times.
|
8551 | for (i = 0; i < spkr_remap_nsets; i++) |
| 137 | 7092 | nspeakers[i] = ff_dca_count_chs_for_mask(get_bits(&s->gb, spkr_mask_nbits)); | |
| 138 | |||
| 139 |
2/2✓ Branch 0 taken 7092 times.
✓ Branch 1 taken 1459 times.
|
8551 | for (i = 0; i < spkr_remap_nsets; i++) { |
| 140 | // Number of channels to be decoded for speaker remapping | ||
| 141 | 7092 | int nch_for_remaps = get_bits(&s->gb, 5) + 1; | |
| 142 | |||
| 143 |
2/2✓ Branch 0 taken 56736 times.
✓ Branch 1 taken 7092 times.
|
63828 | for (j = 0; j < nspeakers[i]; j++) { |
| 144 | // Decoded channels to output speaker mapping mask | ||
| 145 | 56736 | int remap_ch_mask = get_bits_long(&s->gb, nch_for_remaps); | |
| 146 | |||
| 147 | // Loudspeaker remapping codes | ||
| 148 | 56736 | skip_bits_long(&s->gb, av_popcount(remap_ch_mask) * 5); | |
| 149 | } | ||
| 150 | } | ||
| 151 | } else { | ||
| 152 | ✗ | asset->embedded_stereo = 0; | |
| 153 | ✗ | asset->embedded_6ch = 0; | |
| 154 | ✗ | asset->spkr_mask_enabled = 0; | |
| 155 | ✗ | asset->spkr_mask = 0; | |
| 156 | |||
| 157 | // Representation type | ||
| 158 | ✗ | asset->representation_type = get_bits(&s->gb, 3); | |
| 159 | } | ||
| 160 | } | ||
| 161 | |||
| 162 | // | ||
| 163 | // DRC, DNC and mixing metadata | ||
| 164 | // | ||
| 165 | |||
| 166 | // Dynamic range coefficient presence flag | ||
| 167 | 1459 | drc_present = get_bits1(&s->gb); | |
| 168 | |||
| 169 | // Code for dynamic range coefficient | ||
| 170 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1459 times.
|
1459 | if (drc_present) |
| 171 | ✗ | skip_bits(&s->gb, 8); | |
| 172 | |||
| 173 | // Dialog normalization presence flag | ||
| 174 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 1459 times.
|
1459 | if (get_bits1(&s->gb)) |
| 175 | // Dialog normalization code | ||
| 176 | ✗ | skip_bits(&s->gb, 5); | |
| 177 | |||
| 178 | // DRC for stereo downmix | ||
| 179 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 1459 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
1459 | if (drc_present && asset->embedded_stereo) |
| 180 | ✗ | skip_bits(&s->gb, 8); | |
| 181 | |||
| 182 | // Mixing metadata presence flag | ||
| 183 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 1459 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
|
1459 | if (s->mix_metadata_enabled && get_bits1(&s->gb)) { |
| 184 | int nchannels_dmix; | ||
| 185 | |||
| 186 | // External mixing flag | ||
| 187 | ✗ | skip_bits1(&s->gb); | |
| 188 | |||
| 189 | // Post mixing / replacement gain adjustment | ||
| 190 | ✗ | skip_bits(&s->gb, 6); | |
| 191 | |||
| 192 | // DRC prior to mixing | ||
| 193 | ✗ | if (get_bits(&s->gb, 2) == 3) | |
| 194 | // Custom code for mixing DRC | ||
| 195 | ✗ | skip_bits(&s->gb, 8); | |
| 196 | else | ||
| 197 | // Limit for mixing DRC | ||
| 198 | ✗ | skip_bits(&s->gb, 3); | |
| 199 | |||
| 200 | // Scaling type for channels of main audio | ||
| 201 | // Scaling parameters of main audio | ||
| 202 | ✗ | if (get_bits1(&s->gb)) | |
| 203 | ✗ | for (i = 0; i < s->nmixoutconfigs; i++) | |
| 204 | ✗ | skip_bits_long(&s->gb, 6 * s->nmixoutchs[i]); | |
| 205 | else | ||
| 206 | ✗ | skip_bits_long(&s->gb, 6 * s->nmixoutconfigs); | |
| 207 | |||
| 208 | ✗ | nchannels_dmix = asset->nchannels_total; | |
| 209 | ✗ | if (asset->embedded_6ch) | |
| 210 | ✗ | nchannels_dmix += 6; | |
| 211 | ✗ | if (asset->embedded_stereo) | |
| 212 | ✗ | nchannels_dmix += 2; | |
| 213 | |||
| 214 | ✗ | for (i = 0; i < s->nmixoutconfigs; i++) { | |
| 215 | ✗ | if (!s->nmixoutchs[i]) { | |
| 216 | ✗ | if (s->avctx) | |
| 217 | ✗ | av_log(s->avctx, AV_LOG_ERROR, "Invalid speaker layout mask for mixing configuration\n"); | |
| 218 | ✗ | return AVERROR_INVALIDDATA; | |
| 219 | } | ||
| 220 | ✗ | for (j = 0; j < nchannels_dmix; j++) { | |
| 221 | // Mix output mask | ||
| 222 | ✗ | int mix_map_mask = get_bits(&s->gb, s->nmixoutchs[i]); | |
| 223 | |||
| 224 | // Mixing coefficients | ||
| 225 | ✗ | skip_bits_long(&s->gb, av_popcount(mix_map_mask) * 6); | |
| 226 | } | ||
| 227 | } | ||
| 228 | } | ||
| 229 | |||
| 230 | // | ||
| 231 | // Decoder navigation data | ||
| 232 | // | ||
| 233 | |||
| 234 | // Coding mode for the asset | ||
| 235 | 1459 | asset->coding_mode = get_bits(&s->gb, 2); | |
| 236 | |||
| 237 | // Coding components used in asset | ||
| 238 |
2/5✓ Branch 0 taken 1438 times.
✓ Branch 1 taken 21 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
|
1459 | switch (asset->coding_mode) { |
| 239 | 1438 | case 0: // Coding mode that may contain multiple coding components | |
| 240 | 1438 | asset->extension_mask = get_bits(&s->gb, 12); | |
| 241 | |||
| 242 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1438 times.
|
1438 | if (asset->extension_mask & DCA_EXSS_CORE) { |
| 243 | // Size of core component in extension substream | ||
| 244 | ✗ | asset->core_size = get_bits(&s->gb, 14) + 1; | |
| 245 | // Core sync word present flag | ||
| 246 | ✗ | if (get_bits1(&s->gb)) | |
| 247 | // Core sync distance | ||
| 248 | ✗ | skip_bits(&s->gb, 2); | |
| 249 | } | ||
| 250 | |||
| 251 |
2/2✓ Branch 0 taken 24 times.
✓ Branch 1 taken 1414 times.
|
1438 | if (asset->extension_mask & DCA_EXSS_XBR) |
| 252 | // Size of XBR extension in extension substream | ||
| 253 | 24 | asset->xbr_size = get_bits(&s->gb, 14) + 1; | |
| 254 | |||
| 255 |
2/2✓ Branch 0 taken 40 times.
✓ Branch 1 taken 1398 times.
|
1438 | if (asset->extension_mask & DCA_EXSS_XXCH) |
| 256 | // Size of XXCH extension in extension substream | ||
| 257 | 40 | asset->xxch_size = get_bits(&s->gb, 14) + 1; | |
| 258 | |||
| 259 |
2/2✓ Branch 0 taken 32 times.
✓ Branch 1 taken 1406 times.
|
1438 | if (asset->extension_mask & DCA_EXSS_X96) |
| 260 | // Size of X96 extension in extension substream | ||
| 261 | 32 | asset->x96_size = get_bits(&s->gb, 12) + 1; | |
| 262 | |||
| 263 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1438 times.
|
1438 | if (asset->extension_mask & DCA_EXSS_LBR) |
| 264 | ✗ | parse_lbr_parameters(s, asset); | |
| 265 | |||
| 266 |
2/2✓ Branch 0 taken 1374 times.
✓ Branch 1 taken 64 times.
|
1438 | if (asset->extension_mask & DCA_EXSS_XLL) |
| 267 | 1374 | parse_xll_parameters(s, asset); | |
| 268 | |||
| 269 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1438 times.
|
1438 | if (asset->extension_mask & DCA_EXSS_RSV1) |
| 270 | ✗ | skip_bits(&s->gb, 16); | |
| 271 | |||
| 272 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1438 times.
|
1438 | if (asset->extension_mask & DCA_EXSS_RSV2) |
| 273 | ✗ | skip_bits(&s->gb, 16); | |
| 274 | 1438 | break; | |
| 275 | |||
| 276 | 21 | case 1: // Loss-less coding mode without CBR component | |
| 277 | 21 | asset->extension_mask = DCA_EXSS_XLL; | |
| 278 | 21 | parse_xll_parameters(s, asset); | |
| 279 | 21 | break; | |
| 280 | |||
| 281 | ✗ | case 2: // Low bit rate mode | |
| 282 | ✗ | asset->extension_mask = DCA_EXSS_LBR; | |
| 283 | ✗ | parse_lbr_parameters(s, asset); | |
| 284 | ✗ | break; | |
| 285 | |||
| 286 | ✗ | case 3: // Auxiliary coding mode | |
| 287 | ✗ | asset->extension_mask = 0; | |
| 288 | |||
| 289 | // Size of auxiliary coded data | ||
| 290 | ✗ | skip_bits(&s->gb, 14); | |
| 291 | |||
| 292 | // Auxiliary codec identification | ||
| 293 | ✗ | skip_bits(&s->gb, 8); | |
| 294 | |||
| 295 | // Aux sync word present flag | ||
| 296 | ✗ | if (get_bits1(&s->gb)) | |
| 297 | // Aux sync distance | ||
| 298 | ✗ | skip_bits(&s->gb, 3); | |
| 299 | ✗ | break; | |
| 300 | } | ||
| 301 | |||
| 302 |
2/2✓ Branch 0 taken 1395 times.
✓ Branch 1 taken 64 times.
|
1459 | if (asset->extension_mask & DCA_EXSS_XLL) |
| 303 | // DTS-HD stream ID | ||
| 304 | 1395 | asset->hd_stream_id = get_bits(&s->gb, 3); | |
| 305 | |||
| 306 | // One to one mixing flag | ||
| 307 | // Per channel main audio scaling flag | ||
| 308 | // Main audio scaling codes | ||
| 309 | // Decode asset in secondary decoder flag | ||
| 310 | // Revision 2 DRC metadata | ||
| 311 | // Reserved | ||
| 312 | // Zero pad | ||
| 313 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 1459 times.
|
1459 | if (ff_dca_seek_bits(&s->gb, descr_pos + descr_size * 8)) { |
| 314 | ✗ | if (s->avctx) | |
| 315 | ✗ | av_log(s->avctx, AV_LOG_ERROR, "Read past end of EXSS asset descriptor\n"); | |
| 316 | ✗ | return AVERROR_INVALIDDATA; | |
| 317 | } | ||
| 318 | |||
| 319 | 1459 | return 0; | |
| 320 | } | ||
| 321 | |||
| 322 | 1459 | static int set_exss_offsets(DCAExssAsset *asset) | |
| 323 | { | ||
| 324 | 1459 | int offs = asset->asset_offset; | |
| 325 | 1459 | int size = asset->asset_size; | |
| 326 | |||
| 327 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1459 times.
|
1459 | if (asset->extension_mask & DCA_EXSS_CORE) { |
| 328 | ✗ | asset->core_offset = offs; | |
| 329 | ✗ | if (asset->core_size > size) | |
| 330 | ✗ | return AVERROR_INVALIDDATA; | |
| 331 | ✗ | offs += asset->core_size; | |
| 332 | ✗ | size -= asset->core_size; | |
| 333 | } | ||
| 334 | |||
| 335 |
2/2✓ Branch 0 taken 24 times.
✓ Branch 1 taken 1435 times.
|
1459 | if (asset->extension_mask & DCA_EXSS_XBR) { |
| 336 | 24 | asset->xbr_offset = offs; | |
| 337 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 24 times.
|
24 | if (asset->xbr_size > size) |
| 338 | ✗ | return AVERROR_INVALIDDATA; | |
| 339 | 24 | offs += asset->xbr_size; | |
| 340 | 24 | size -= asset->xbr_size; | |
| 341 | } | ||
| 342 | |||
| 343 |
2/2✓ Branch 0 taken 40 times.
✓ Branch 1 taken 1419 times.
|
1459 | if (asset->extension_mask & DCA_EXSS_XXCH) { |
| 344 | 40 | asset->xxch_offset = offs; | |
| 345 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 40 times.
|
40 | if (asset->xxch_size > size) |
| 346 | ✗ | return AVERROR_INVALIDDATA; | |
| 347 | 40 | offs += asset->xxch_size; | |
| 348 | 40 | size -= asset->xxch_size; | |
| 349 | } | ||
| 350 | |||
| 351 |
2/2✓ Branch 0 taken 32 times.
✓ Branch 1 taken 1427 times.
|
1459 | if (asset->extension_mask & DCA_EXSS_X96) { |
| 352 | 32 | asset->x96_offset = offs; | |
| 353 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 32 times.
|
32 | if (asset->x96_size > size) |
| 354 | ✗ | return AVERROR_INVALIDDATA; | |
| 355 | 32 | offs += asset->x96_size; | |
| 356 | 32 | size -= asset->x96_size; | |
| 357 | } | ||
| 358 | |||
| 359 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1459 times.
|
1459 | if (asset->extension_mask & DCA_EXSS_LBR) { |
| 360 | ✗ | asset->lbr_offset = offs; | |
| 361 | ✗ | if (asset->lbr_size > size) | |
| 362 | ✗ | return AVERROR_INVALIDDATA; | |
| 363 | ✗ | offs += asset->lbr_size; | |
| 364 | ✗ | size -= asset->lbr_size; | |
| 365 | } | ||
| 366 | |||
| 367 |
2/2✓ Branch 0 taken 1395 times.
✓ Branch 1 taken 64 times.
|
1459 | if (asset->extension_mask & DCA_EXSS_XLL) { |
| 368 | 1395 | asset->xll_offset = offs; | |
| 369 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1395 times.
|
1395 | if (asset->xll_size > size) |
| 370 | ✗ | return AVERROR_INVALIDDATA; | |
| 371 | 1395 | offs += asset->xll_size; | |
| 372 | 1395 | size -= asset->xll_size; | |
| 373 | } | ||
| 374 | |||
| 375 | 1459 | return 0; | |
| 376 | } | ||
| 377 | |||
| 378 | 1459 | int ff_dca_exss_parse(DCAExssParser *s, const uint8_t *data, int size) | |
| 379 | { | ||
| 380 | int i, ret, offset, wide_hdr, header_size; | ||
| 381 | |||
| 382 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 1459 times.
|
1459 | if ((ret = init_get_bits8(&s->gb, data, size)) < 0) |
| 383 | ✗ | return ret; | |
| 384 | |||
| 385 | // Extension substream sync word | ||
| 386 | 1459 | skip_bits_long(&s->gb, 32); | |
| 387 | |||
| 388 | // User defined bits | ||
| 389 | 1459 | skip_bits(&s->gb, 8); | |
| 390 | |||
| 391 | // Extension substream index | ||
| 392 | 1459 | s->exss_index = get_bits(&s->gb, 2); | |
| 393 | |||
| 394 | // Flag indicating short or long header size | ||
| 395 | 1459 | wide_hdr = get_bits1(&s->gb); | |
| 396 | |||
| 397 | // Extension substream header length | ||
| 398 | 1459 | header_size = get_bits(&s->gb, 8 + 4 * wide_hdr) + 1; | |
| 399 | |||
| 400 | // Check CRC | ||
| 401 |
3/4✓ Branch 0 taken 1413 times.
✓ Branch 1 taken 46 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1413 times.
|
1459 | if (s->avctx && ff_dca_check_crc(s->avctx, &s->gb, 32 + 8, header_size * 8)) { |
| 402 | ✗ | av_log(s->avctx, AV_LOG_ERROR, "Invalid EXSS header checksum\n"); | |
| 403 | ✗ | return AVERROR_INVALIDDATA; | |
| 404 | } | ||
| 405 | |||
| 406 | 1459 | s->exss_size_nbits = 16 + 4 * wide_hdr; | |
| 407 | |||
| 408 | // Number of bytes of extension substream | ||
| 409 | 1459 | s->exss_size = get_bits(&s->gb, s->exss_size_nbits) + 1; | |
| 410 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1459 times.
|
1459 | if (s->exss_size > size) { |
| 411 | ✗ | if (s->avctx) | |
| 412 | ✗ | av_log(s->avctx, AV_LOG_ERROR, "Packet too short for EXSS frame\n"); | |
| 413 | ✗ | return AVERROR_INVALIDDATA; | |
| 414 | } | ||
| 415 | |||
| 416 | // Per stream static fields presence flag | ||
| 417 |
1/2✓ Branch 1 taken 1459 times.
✗ Branch 2 not taken.
|
1459 | if (s->static_fields_present = get_bits1(&s->gb)) { |
| 418 | int active_exss_mask[8]; | ||
| 419 | |||
| 420 | // Reference clock code | ||
| 421 | 1459 | skip_bits(&s->gb, 2); | |
| 422 | |||
| 423 | // Extension substream frame duration | ||
| 424 | 1459 | skip_bits(&s->gb, 3); | |
| 425 | |||
| 426 | // Timecode presence flag | ||
| 427 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 1459 times.
|
1459 | if (get_bits1(&s->gb)) |
| 428 | // Timecode data | ||
| 429 | ✗ | skip_bits_long(&s->gb, 36); | |
| 430 | |||
| 431 | // Number of defined audio presentations | ||
| 432 | 1459 | s->npresents = get_bits(&s->gb, 3) + 1; | |
| 433 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1459 times.
|
1459 | if (s->npresents > 1) { |
| 434 | ✗ | if (s->avctx) | |
| 435 | ✗ | avpriv_request_sample(s->avctx, "%d audio presentations", s->npresents); | |
| 436 | ✗ | return AVERROR_PATCHWELCOME; | |
| 437 | } | ||
| 438 | |||
| 439 | // Number of audio assets in extension substream | ||
| 440 | 1459 | s->nassets = get_bits(&s->gb, 3) + 1; | |
| 441 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1459 times.
|
1459 | if (s->nassets > 1) { |
| 442 | ✗ | if (s->avctx) | |
| 443 | ✗ | avpriv_request_sample(s->avctx, "%d audio assets", s->nassets); | |
| 444 | ✗ | return AVERROR_PATCHWELCOME; | |
| 445 | } | ||
| 446 | |||
| 447 | // Active extension substream mask for audio presentation | ||
| 448 |
2/2✓ Branch 0 taken 1459 times.
✓ Branch 1 taken 1459 times.
|
2918 | for (i = 0; i < s->npresents; i++) |
| 449 | 1459 | active_exss_mask[i] = get_bits(&s->gb, s->exss_index + 1); | |
| 450 | |||
| 451 | // Active audio asset mask | ||
| 452 |
2/2✓ Branch 0 taken 1459 times.
✓ Branch 1 taken 1459 times.
|
2918 | for (i = 0; i < s->npresents; i++) |
| 453 | 1459 | skip_bits_long(&s->gb, av_popcount(active_exss_mask[i]) * 8); | |
| 454 | |||
| 455 | // Mixing metadata enable flag | ||
| 456 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 1459 times.
|
1459 | if (s->mix_metadata_enabled = get_bits1(&s->gb)) { |
| 457 | int spkr_mask_nbits; | ||
| 458 | |||
| 459 | // Mixing metadata adjustment level | ||
| 460 | ✗ | skip_bits(&s->gb, 2); | |
| 461 | |||
| 462 | // Number of bits for mixer output speaker activity mask | ||
| 463 | ✗ | spkr_mask_nbits = (get_bits(&s->gb, 2) + 1) << 2; | |
| 464 | |||
| 465 | // Number of mixing configurations | ||
| 466 | ✗ | s->nmixoutconfigs = get_bits(&s->gb, 2) + 1; | |
| 467 | |||
| 468 | // Speaker layout mask for mixer output channels | ||
| 469 | ✗ | for (i = 0; i < s->nmixoutconfigs; i++) | |
| 470 | ✗ | s->nmixoutchs[i] = ff_dca_count_chs_for_mask(get_bits(&s->gb, spkr_mask_nbits)); | |
| 471 | } | ||
| 472 | } else { | ||
| 473 | ✗ | s->npresents = 1; | |
| 474 | ✗ | s->nassets = 1; | |
| 475 | } | ||
| 476 | |||
| 477 | // Size of encoded asset data in bytes | ||
| 478 | 1459 | offset = header_size; | |
| 479 |
2/2✓ Branch 0 taken 1459 times.
✓ Branch 1 taken 1459 times.
|
2918 | for (i = 0; i < s->nassets; i++) { |
| 480 | 1459 | s->assets[i].asset_offset = offset; | |
| 481 | 1459 | s->assets[i].asset_size = get_bits(&s->gb, s->exss_size_nbits) + 1; | |
| 482 | 1459 | offset += s->assets[i].asset_size; | |
| 483 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1459 times.
|
1459 | if (offset > s->exss_size) { |
| 484 | ✗ | if (s->avctx) | |
| 485 | ✗ | av_log(s->avctx, AV_LOG_ERROR, "EXSS asset out of bounds\n"); | |
| 486 | ✗ | return AVERROR_INVALIDDATA; | |
| 487 | } | ||
| 488 | } | ||
| 489 | |||
| 490 | // Audio asset descriptor | ||
| 491 |
2/2✓ Branch 0 taken 1459 times.
✓ Branch 1 taken 1459 times.
|
2918 | for (i = 0; i < s->nassets; i++) { |
| 492 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 1459 times.
|
1459 | if ((ret = parse_descriptor(s, &s->assets[i])) < 0) |
| 493 | ✗ | return ret; | |
| 494 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 1459 times.
|
1459 | if ((ret = set_exss_offsets(&s->assets[i])) < 0) { |
| 495 | ✗ | if (s->avctx) | |
| 496 | ✗ | av_log(s->avctx, AV_LOG_ERROR, "Invalid extension size in EXSS asset descriptor\n"); | |
| 497 | ✗ | return ret; | |
| 498 | } | ||
| 499 | } | ||
| 500 | |||
| 501 | // Backward compatible core present | ||
| 502 | // Backward compatible core substream index | ||
| 503 | // Backward compatible core asset index | ||
| 504 | // Reserved | ||
| 505 | // Byte align | ||
| 506 | // CRC16 of extension substream header | ||
| 507 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 1459 times.
|
1459 | if (ff_dca_seek_bits(&s->gb, header_size * 8)) { |
| 508 | ✗ | if (s->avctx) | |
| 509 | ✗ | av_log(s->avctx, AV_LOG_ERROR, "Read past end of EXSS header\n"); | |
| 510 | ✗ | return AVERROR_INVALIDDATA; | |
| 511 | } | ||
| 512 | |||
| 513 | 1459 | return 0; | |
| 514 | } | ||
| 515 |