1 /* 2 * Copyright (C) 2018 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 //#define LOG_NDEBUG 0 18 #define LOG_TAG "AC4Parser" 19 20 #include <inttypes.h> 21 #include <utils/Log.h> 22 #include <utils/misc.h> 23 24 #include "AC4Parser.h" 25 26 #define BOOLSTR(a) ((a)?"true":"false") 27 #define BYTE_ALIGN mBitReader.skipBits(mBitReader.numBitsLeft() % 8) 28 #define CHECK_BITS_LEFT(n) if (mBitReader.numBitsLeft() < n) {return false;} 29 30 namespace android { 31 32 AC4Parser::AC4Parser() { 33 } 34 35 AC4DSIParser::AC4DSIParser(ABitReader &br) 36 : mBitReader(br){ 37 38 mDSISize = mBitReader.numBitsLeft(); 39 } 40 41 // ETSI TS 103 190-2 V1.1.1 (2015-09) Table 79: channel_mode 42 static const char *ChannelModes[] = { 43 "mono", 44 "stereo", 45 "3.0", 46 "5.0", 47 "5.1", 48 "7.0 (3/4/0)", 49 "7.1 (3/4/0.1)", 50 "7.0 (5/2/0)", 51 "7.1 (5/2/0.1)", 52 "7.0 (3/2/2)", 53 "7.1 (3/2/2.1)", 54 "7.0.4", 55 "7.1.4", 56 "9.0.4", 57 "9.1.4", 58 "22.2" 59 }; 60 61 static const char* ContentClassifier[] = { 62 "Complete Main", 63 "Music and Effects", 64 "Visually Impaired", 65 "Hearing Impaired", 66 "Dialog", 67 "Commentary", 68 "Emergency", 69 "Voice Over" 70 }; 71 72 bool AC4DSIParser::parseLanguageTag(uint32_t presentationID, uint32_t substreamID){ 73 CHECK_BITS_LEFT(6); 74 uint32_t n_language_tag_bytes = mBitReader.getBits(6); 75 if (n_language_tag_bytes < 2 || n_language_tag_bytes >= 42) { 76 return false; 77 } 78 CHECK_BITS_LEFT(n_language_tag_bytes * 8); 79 char language_tag_bytes[42]; // TS 103 190 part 1 4.3.3.8.7 80 for (uint32_t i = 0; i < n_language_tag_bytes; i++) { 81 language_tag_bytes[i] = (char)mBitReader.getBits(8); 82 } 83 language_tag_bytes[n_language_tag_bytes] = 0; 84 ALOGV("%u.%u: language_tag = %s\n", presentationID, substreamID, language_tag_bytes); 85 86 std::string language(language_tag_bytes, n_language_tag_bytes); 87 mPresentations[presentationID].mLanguage = language; 88 89 return true; 90 } 91 92 // TS 103 190-1 v1.2.1 E.5 and TS 103 190-2 v1.1.1 E.9 93 bool AC4DSIParser::parseSubstreamDSI(uint32_t presentationID, uint32_t substreamID){ 94 CHECK_BITS_LEFT(5); 95 uint32_t channel_mode = mBitReader.getBits(5); 96 CHECK_BITS_LEFT(2); 97 uint32_t dsi_sf_multiplier = mBitReader.getBits(2); 98 CHECK_BITS_LEFT(1); 99 bool b_substream_bitrate_indicator = (mBitReader.getBits(1) == 1); 100 ALOGV("%u.%u: channel_mode = %u (%s)\n", presentationID, substreamID, channel_mode, 101 channel_mode < NELEM(ChannelModes) ? ChannelModes[channel_mode] : "reserved"); 102 ALOGV("%u.%u: dsi_sf_multiplier = %u\n", presentationID, 103 substreamID, dsi_sf_multiplier); 104 ALOGV("%u.%u: b_substream_bitrate_indicator = %s\n", presentationID, 105 substreamID, BOOLSTR(b_substream_bitrate_indicator)); 106 107 if (b_substream_bitrate_indicator) { 108 CHECK_BITS_LEFT(5); 109 uint32_t substream_bitrate_indicator = mBitReader.getBits(5); 110 ALOGV("%u.%u: substream_bitrate_indicator = %u\n", presentationID, substreamID, 111 substream_bitrate_indicator); 112 } 113 if (channel_mode >= 7 && channel_mode <= 10) { 114 CHECK_BITS_LEFT(1); 115 uint32_t add_ch_base = mBitReader.getBits(1); 116 ALOGV("%u.%u: add_ch_base = %u\n", presentationID, substreamID, add_ch_base); 117 } 118 CHECK_BITS_LEFT(1); 119 bool b_content_type = (mBitReader.getBits(1) == 1); 120 ALOGV("%u.%u: b_content_type = %s\n", presentationID, substreamID, BOOLSTR(b_content_type)); 121 if (b_content_type) { 122 CHECK_BITS_LEFT(3); 123 uint32_t content_classifier = mBitReader.getBits(3); 124 ALOGV("%u.%u: content_classifier = %u (%s)\n", presentationID, substreamID, 125 content_classifier, ContentClassifier[content_classifier]); 126 127 // For streams based on TS 103 190 part 1 the presentation level channel_mode doesn't 128 // exist and so we use the channel_mode from either the CM or M&E substream 129 // (they are mutually exclusive) 130 if (mPresentations[presentationID].mChannelMode == -1 && 131 (content_classifier == 0 || content_classifier == 1)) { 132 mPresentations[presentationID].mChannelMode = channel_mode; 133 } 134 mPresentations[presentationID].mContentClassifier = content_classifier; 135 CHECK_BITS_LEFT(1); 136 bool b_language_indicator = (mBitReader.getBits(1) == 1); 137 ALOGV("%u.%u: b_language_indicator = %s\n", presentationID, substreamID, 138 BOOLSTR(b_language_indicator)); 139 if (b_language_indicator) { 140 if (!parseLanguageTag(presentationID, substreamID)) { 141 return false; 142 } 143 } 144 } 145 146 return true; 147 } 148 149 // ETSI TS 103 190-2 v1.1.1 section E.11 150 bool AC4DSIParser::parseSubstreamGroupDSI(uint32_t presentationID, uint32_t groupID) 151 { 152 CHECK_BITS_LEFT(1); 153 bool b_substreams_present = (mBitReader.getBits(1) == 1); 154 CHECK_BITS_LEFT(1); 155 bool b_hsf_ext = (mBitReader.getBits(1) == 1); 156 CHECK_BITS_LEFT(1); 157 bool b_channel_coded = (mBitReader.getBits(1) == 1); 158 CHECK_BITS_LEFT(8); 159 uint32_t n_substreams = mBitReader.getBits(8); 160 ALOGV("%u.%u: b_substreams_present = %s\n", presentationID, groupID, 161 BOOLSTR(b_substreams_present)); 162 ALOGV("%u.%u: b_hsf_ext = %s\n", presentationID, groupID, BOOLSTR(b_hsf_ext)); 163 ALOGV("%u.%u: b_channel_coded = %s\n", presentationID, groupID, BOOLSTR(b_channel_coded)); 164 ALOGV("%u.%u: n_substreams = %u\n", presentationID, groupID, n_substreams); 165 166 for (uint32_t i = 0; i < n_substreams; i++) { 167 CHECK_BITS_LEFT(2); 168 uint32_t dsi_sf_multiplier = mBitReader.getBits(2); 169 CHECK_BITS_LEFT(1); 170 bool b_substream_bitrate_indicator = (mBitReader.getBits(1) == 1); 171 ALOGV("%u.%u.%u: dsi_sf_multiplier = %u\n", presentationID, groupID, i, dsi_sf_multiplier); 172 ALOGV("%u.%u.%u: b_substream_bitrate_indicator = %s\n", presentationID, groupID, i, 173 BOOLSTR(b_substream_bitrate_indicator)); 174 175 if (b_substream_bitrate_indicator) { 176 CHECK_BITS_LEFT(5); 177 uint32_t substream_bitrate_indicator = mBitReader.getBits(5); 178 ALOGV("%u.%u.%u: substream_bitrate_indicator = %u\n", presentationID, groupID, i, 179 substream_bitrate_indicator); 180 } 181 if (b_channel_coded) { 182 CHECK_BITS_LEFT(24); 183 uint32_t dsi_substream_channel_mask = mBitReader.getBits(24); 184 ALOGV("%u.%u.%u: dsi_substream_channel_mask = 0x%06x\n", presentationID, groupID, i, 185 dsi_substream_channel_mask); 186 } else { 187 CHECK_BITS_LEFT(1); 188 bool b_ajoc = (mBitReader.getBits(1) == 1); 189 ALOGV("%u.%u.%u: b_ajoc = %s\n", presentationID, groupID, i, BOOLSTR(b_ajoc)); 190 if (b_ajoc) { 191 CHECK_BITS_LEFT(1); 192 bool b_static_dmx = (mBitReader.getBits(1) == 1); 193 ALOGV("%u.%u.%u: b_static_dmx = %s\n", presentationID, groupID, i, 194 BOOLSTR(b_static_dmx)); 195 if (!b_static_dmx) { 196 CHECK_BITS_LEFT(4); 197 uint32_t n_dmx_objects_minus1 = mBitReader.getBits(4); 198 ALOGV("%u.%u.%u: n_dmx_objects_minus1 = %u\n", presentationID, groupID, i, 199 n_dmx_objects_minus1); 200 } 201 CHECK_BITS_LEFT(6); 202 uint32_t n_umx_objects_minus1 = mBitReader.getBits(6); 203 ALOGV("%u.%u.%u: n_umx_objects_minus1 = %u\n", presentationID, groupID, i, 204 n_umx_objects_minus1); 205 } 206 CHECK_BITS_LEFT(4); 207 mBitReader.skipBits(4); // objects_assignment_mask 208 } 209 } 210 211 CHECK_BITS_LEFT(1); 212 bool b_content_type = (mBitReader.getBits(1) == 1); 213 ALOGV("%u.%u: b_content_type = %s\n", presentationID, groupID, BOOLSTR(b_content_type)); 214 if (b_content_type) { 215 CHECK_BITS_LEFT(3); 216 uint32_t content_classifier = mBitReader.getBits(3); 217 ALOGV("%u.%u: content_classifier = %s (%u)\n", presentationID, groupID, 218 ContentClassifier[content_classifier], content_classifier); 219 220 mPresentations[presentationID].mContentClassifier = content_classifier; 221 222 CHECK_BITS_LEFT(1); 223 bool b_language_indicator = (mBitReader.getBits(1) == 1); 224 ALOGV("%u.%u: b_language_indicator = %s\n", presentationID, groupID, 225 BOOLSTR(b_language_indicator)); 226 227 if (b_language_indicator) { 228 if (!parseLanguageTag(presentationID, groupID)) { 229 return false; 230 } 231 } 232 } 233 234 return true; 235 } 236 237 bool AC4DSIParser::parseBitrateDsi() { 238 CHECK_BITS_LEFT(2 + 32 + 32); 239 mBitReader.skipBits(2); // bit_rate_mode 240 mBitReader.skipBits(32); // bit_rate 241 mBitReader.skipBits(32); // bit_rate_precision 242 243 return true; 244 } 245 246 // TS 103 190-1 section E.4 (ac4_dsi) and TS 103 190-2 section E.6 (ac4_dsi_v1) 247 bool AC4DSIParser::parse() { 248 CHECK_BITS_LEFT(3); 249 uint32_t ac4_dsi_version = mBitReader.getBits(3); 250 if (ac4_dsi_version > 1) { 251 ALOGE("error while parsing ac-4 dsi: only versions 0 and 1 are supported"); 252 return false; 253 } 254 255 CHECK_BITS_LEFT(7 + 1 + 4 + 9); 256 uint32_t bitstream_version = mBitReader.getBits(7); 257 mBitReader.skipBits(1); // fs_index 258 mBitReader.skipBits(4); // frame_rate_index 259 uint32_t n_presentations = mBitReader.getBits(9); 260 261 int32_t short_program_id = -1; 262 if (bitstream_version > 1) { 263 if (ac4_dsi_version == 0) { 264 ALOGE("invalid ac4 dsi"); 265 return false; 266 } 267 CHECK_BITS_LEFT(1); 268 bool b_program_id = (mBitReader.getBits(1) == 1); 269 if (b_program_id) { 270 CHECK_BITS_LEFT(16 + 1); 271 short_program_id = mBitReader.getBits(16); 272 bool b_uuid = (mBitReader.getBits(1) == 1); 273 if (b_uuid) { 274 const uint32_t kAC4UUIDSizeInBytes = 16; 275 char program_uuid[kAC4UUIDSizeInBytes]; 276 CHECK_BITS_LEFT(kAC4UUIDSizeInBytes * 8); 277 for (uint32_t i = 0; i < kAC4UUIDSizeInBytes; i++) { 278 program_uuid[i] = (char)(mBitReader.getBits(8)); 279 } 280 ALOGV("UUID = %s", program_uuid); 281 } 282 } 283 } 284 285 if (ac4_dsi_version == 1) { 286 if (!parseBitrateDsi()) { 287 return false; 288 } 289 BYTE_ALIGN; 290 } 291 292 for (uint32_t presentation = 0; presentation < n_presentations; presentation++) { 293 mPresentations[presentation].mProgramID = short_program_id; 294 // known as b_single_substream in ac4_dsi_version 0 295 bool b_single_substream_group = false; 296 uint32_t presentation_config = 0, presentation_version = 0; 297 uint32_t pres_bytes = 0; 298 uint64_t start = 0; 299 300 if (ac4_dsi_version == 0) { 301 CHECK_BITS_LEFT(1 + 5 + 5); 302 b_single_substream_group = (mBitReader.getBits(1) == 1); 303 presentation_config = mBitReader.getBits(5); 304 presentation_version = mBitReader.getBits(5); 305 } else if (ac4_dsi_version == 1) { 306 CHECK_BITS_LEFT(8 + 8); 307 presentation_version = mBitReader.getBits(8); 308 pres_bytes = mBitReader.getBits(8); 309 if (pres_bytes == 0xff) { 310 CHECK_BITS_LEFT(16); 311 pres_bytes += mBitReader.getBits(16); 312 } 313 ALOGV("%u: pres_bytes = %u\n", presentation, pres_bytes); 314 if (presentation_version > 2) { 315 CHECK_BITS_LEFT(pres_bytes * 8); 316 mBitReader.skipBits(pres_bytes * 8); 317 continue; 318 } 319 /* record a marker, less the size of the presentation_config */ 320 start = (mDSISize - mBitReader.numBitsLeft()) / 8; 321 // ac4_presentation_v0_dsi(), ac4_presentation_v1_dsi() and ac4_presentation_v2_dsi() 322 // all start with a presentation_config of 5 bits 323 CHECK_BITS_LEFT(5); 324 presentation_config = mBitReader.getBits(5); 325 b_single_substream_group = (presentation_config == 0x1f); 326 } 327 328 static const char *PresentationConfig[] = { 329 "Music&Effects + Dialog", 330 "Main + DE", 331 "Main + Associate", 332 "Music&Effects + Dialog + Associate", 333 "Main + DE + Associate", 334 "Arbitrary substream groups", 335 "EMDF only" 336 }; 337 ALOGV("%u: b_single_substream/group = %s\n", presentation, 338 BOOLSTR(b_single_substream_group)); 339 ALOGV("%u: presentation_version = %u\n", presentation, presentation_version); 340 ALOGV("%u: presentation_config = %u (%s)\n", presentation, presentation_config, 341 (presentation_config >= NELEM(PresentationConfig) ? 342 "reserved" : PresentationConfig[presentation_config])); 343 344 bool b_add_emdf_substreams = false; 345 if (!b_single_substream_group && presentation_config == 6) { 346 b_add_emdf_substreams = true; 347 ALOGV("%u: b_add_emdf_substreams = %s\n", presentation, BOOLSTR(b_add_emdf_substreams)); 348 } else { 349 CHECK_BITS_LEFT(3 + 1); 350 uint32_t mdcompat = mBitReader.getBits(3); 351 ALOGV("%u: mdcompat = %d\n", presentation, mdcompat); 352 353 bool b_presentation_group_index = (mBitReader.getBits(1) == 1); 354 ALOGV("%u: b_presentation_group_index = %s\n", presentation, 355 BOOLSTR(b_presentation_group_index)); 356 if (b_presentation_group_index) { 357 CHECK_BITS_LEFT(5); 358 mPresentations[presentation].mGroupIndex = mBitReader.getBits(5); 359 ALOGV("%u: presentation_group_index = %d\n", presentation, 360 mPresentations[presentation].mGroupIndex); 361 } 362 CHECK_BITS_LEFT(2); 363 uint32_t dsi_frame_rate_multiply_info = mBitReader.getBits(2); 364 ALOGV("%u: dsi_frame_rate_multiply_info = %d\n", presentation, 365 dsi_frame_rate_multiply_info); 366 if (ac4_dsi_version == 1 && (presentation_version == 1 || presentation_version == 2)) { 367 CHECK_BITS_LEFT(2); 368 uint32_t dsi_frame_rate_fraction_info = mBitReader.getBits(2); 369 ALOGV("%u: dsi_frame_rate_fraction_info = %d\n", presentation, 370 dsi_frame_rate_fraction_info); 371 } 372 CHECK_BITS_LEFT(5 + 10); 373 uint32_t presentation_emdf_version = mBitReader.getBits(5); 374 uint32_t presentation_key_id = mBitReader.getBits(10); 375 ALOGV("%u: presentation_emdf_version = %d\n", presentation, presentation_emdf_version); 376 ALOGV("%u: presentation_key_id = %d\n", presentation, presentation_key_id); 377 378 if (ac4_dsi_version == 1) { 379 bool b_presentation_channel_coded = false; 380 if (presentation_version == 0) { 381 b_presentation_channel_coded = true; 382 } else { 383 CHECK_BITS_LEFT(1); 384 b_presentation_channel_coded = (mBitReader.getBits(1) == 1); 385 } 386 ALOGV("%u: b_presentation_channel_coded = %s\n", presentation, 387 BOOLSTR(b_presentation_channel_coded)); 388 if (b_presentation_channel_coded) { 389 if (presentation_version == 1 || presentation_version == 2) { 390 CHECK_BITS_LEFT(5); 391 uint32_t dsi_presentation_ch_mode = mBitReader.getBits(5); 392 mPresentations[presentation].mChannelMode = dsi_presentation_ch_mode; 393 ALOGV("%u: dsi_presentation_ch_mode = %d (%s)\n", presentation, 394 dsi_presentation_ch_mode, 395 dsi_presentation_ch_mode < NELEM(ChannelModes) ? 396 ChannelModes[dsi_presentation_ch_mode] : "reserved"); 397 398 if (dsi_presentation_ch_mode >= 11 && dsi_presentation_ch_mode <= 14) { 399 CHECK_BITS_LEFT(1 + 2); 400 uint32_t pres_b_4_back_channels_present = mBitReader.getBits(1); 401 uint32_t pres_top_channel_pairs = mBitReader.getBits(2); 402 ALOGV("%u: pres_b_4_back_channels_present = %s\n", presentation, 403 BOOLSTR(pres_b_4_back_channels_present)); 404 ALOGV("%u: pres_top_channel_pairs = %d\n", presentation, 405 pres_top_channel_pairs); 406 } 407 } 408 // presentation_channel_mask in ac4_presentation_v0_dsi() 409 CHECK_BITS_LEFT(24); 410 uint32_t presentation_channel_mask_v1 = mBitReader.getBits(24); 411 ALOGV("%u: presentation_channel_mask_v1 = 0x%06x\n", presentation, 412 presentation_channel_mask_v1); 413 } 414 if (presentation_version == 1 || presentation_version == 2) { 415 CHECK_BITS_LEFT(1); 416 bool b_presentation_core_differs = (mBitReader.getBits(1) == 1); 417 ALOGV("%u: b_presentation_core_differs = %s\n", presentation, 418 BOOLSTR(b_presentation_core_differs)); 419 if (b_presentation_core_differs) { 420 CHECK_BITS_LEFT(1); 421 bool b_presentation_core_channel_coded = (mBitReader.getBits(1) == 1); 422 if (b_presentation_core_channel_coded) { 423 CHECK_BITS_LEFT(2); 424 mBitReader.skipBits(2); // dsi_presentation_channel_mode_core 425 } 426 } 427 CHECK_BITS_LEFT(1); 428 bool b_presentation_filter = (mBitReader.getBits(1) == 1); 429 ALOGV("%u: b_presentation_filter = %s\n", presentation, 430 BOOLSTR(b_presentation_filter)); 431 if (b_presentation_filter) { 432 CHECK_BITS_LEFT(1 + 8); 433 bool b_enable_presentation = (mBitReader.getBits(1) == 1); 434 if (!b_enable_presentation) { 435 mPresentations[presentation].mEnabled = false; 436 } 437 ALOGV("%u: b_enable_presentation = %s\n", presentation, 438 BOOLSTR(b_enable_presentation)); 439 uint32_t n_filter_bytes = mBitReader.getBits(8); 440 CHECK_BITS_LEFT(n_filter_bytes * 8); 441 for (uint32_t i = 0; i < n_filter_bytes; i++) { 442 mBitReader.skipBits(8); // filter_data 443 } 444 } 445 } 446 } /* ac4_dsi_version == 1 */ 447 448 if (b_single_substream_group) { 449 if (presentation_version == 0) { 450 if (!parseSubstreamDSI(presentation, 0)) { 451 return false; 452 } 453 } else { 454 if (!parseSubstreamGroupDSI(presentation, 0)) { 455 return false; 456 } 457 } 458 } else { 459 if (ac4_dsi_version == 1) { 460 CHECK_BITS_LEFT(1); 461 bool b_multi_pid = (mBitReader.getBits(1) == 1); 462 ALOGV("%u: b_multi_pid = %s\n", presentation, BOOLSTR(b_multi_pid)); 463 } else { 464 CHECK_BITS_LEFT(1); 465 bool b_hsf_ext = (mBitReader.getBits(1) == 1); 466 ALOGV("%u: b_hsf_ext = %s\n", presentation, BOOLSTR(b_hsf_ext)); 467 } 468 switch (presentation_config) { 469 case 0: 470 case 1: 471 case 2: 472 if (presentation_version == 0) { 473 if (!parseSubstreamDSI(presentation, 0)) { 474 return false; 475 } 476 if (!parseSubstreamDSI(presentation, 1)) { 477 return false; 478 } 479 } else { 480 if (!parseSubstreamGroupDSI(presentation, 0)) { 481 return false; 482 } 483 if (!parseSubstreamGroupDSI(presentation, 1)) { 484 return false; 485 } 486 } 487 break; 488 case 3: 489 case 4: 490 if (presentation_version == 0) { 491 if (!parseSubstreamDSI(presentation, 0)) { 492 return false; 493 } 494 if (!parseSubstreamDSI(presentation, 1)) { 495 return false; 496 } 497 if (!parseSubstreamDSI(presentation, 2)) { 498 return false; 499 } 500 } else { 501 if (!parseSubstreamGroupDSI(presentation, 0)) { 502 return false; 503 } 504 if (!parseSubstreamGroupDSI(presentation, 1)) { 505 return false; 506 } 507 if (!parseSubstreamGroupDSI(presentation, 2)) { 508 return false; 509 } 510 } 511 break; 512 case 5: 513 if (presentation_version == 0) { 514 if (!parseSubstreamDSI(presentation, 0)) { 515 return false; 516 } 517 } else { 518 CHECK_BITS_LEFT(3); 519 uint32_t n_substream_groups_minus2 = mBitReader.getBits(3); 520 ALOGV("%u: n_substream_groups_minus2 = %d\n", presentation, 521 n_substream_groups_minus2); 522 for (uint32_t sg = 0; sg < n_substream_groups_minus2 + 2; sg++) { 523 if (!parseSubstreamGroupDSI(presentation, sg)) { 524 return false; 525 } 526 } 527 } 528 break; 529 default: 530 CHECK_BITS_LEFT(7); 531 uint32_t n_skip_bytes = mBitReader.getBits(7); 532 CHECK_BITS_LEFT(n_skip_bytes * 8) 533 for (uint32_t j = 0; j < n_skip_bytes; j++) { 534 mBitReader.getBits(8); 535 } 536 break; 537 } 538 } 539 CHECK_BITS_LEFT(1 + 1); 540 bool b_pre_virtualized = (mBitReader.getBits(1) == 1); 541 mPresentations[presentation].mPreVirtualized = b_pre_virtualized; 542 b_add_emdf_substreams = (mBitReader.getBits(1) == 1); 543 ALOGV("%u: b_pre_virtualized = %s\n", presentation, BOOLSTR(b_pre_virtualized)); 544 ALOGV("%u: b_add_emdf_substreams = %s\n", presentation, 545 BOOLSTR(b_add_emdf_substreams)); 546 } 547 if (b_add_emdf_substreams) { 548 CHECK_BITS_LEFT(7); 549 uint32_t n_add_emdf_substreams = mBitReader.getBits(7); 550 for (uint32_t j = 0; j < n_add_emdf_substreams; j++) { 551 CHECK_BITS_LEFT(5 + 10); 552 uint32_t substream_emdf_version = mBitReader.getBits(5); 553 uint32_t substream_key_id = mBitReader.getBits(10); 554 ALOGV("%u: emdf_substream[%d]: version=%d, key_id=%d\n", presentation, j, 555 substream_emdf_version, substream_key_id); 556 } 557 } 558 559 bool b_presentation_bitrate_info = false; 560 if (presentation_version > 0) { 561 CHECK_BITS_LEFT(1); 562 b_presentation_bitrate_info = (mBitReader.getBits(1) == 1); 563 } 564 565 ALOGV("b_presentation_bitrate_info = %s\n", BOOLSTR(b_presentation_bitrate_info)); 566 if (b_presentation_bitrate_info) { 567 if (!parseBitrateDsi()) { 568 return false; 569 } 570 } 571 572 if (presentation_version > 0) { 573 CHECK_BITS_LEFT(1); 574 bool b_alternative = (mBitReader.getBits(1) == 1); 575 ALOGV("b_alternative = %s\n", BOOLSTR(b_alternative)); 576 if (b_alternative) { 577 BYTE_ALIGN; 578 CHECK_BITS_LEFT(16); 579 uint32_t name_len = mBitReader.getBits(16); 580 CHECK_BITS_LEFT(name_len * 8); 581 std::string &presentation_name = 582 mPresentations[presentation].mDescription; 583 presentation_name.clear(); 584 presentation_name.resize(name_len); 585 for (uint32_t i = 0; i < name_len; i++) { 586 presentation_name[i] = (char)(mBitReader.getBits(8)); 587 } 588 CHECK_BITS_LEFT(5); 589 uint32_t n_targets = mBitReader.getBits(5); 590 CHECK_BITS_LEFT(n_targets * (3 + 8)); 591 for (uint32_t i = 0; i < n_targets; i++){ 592 mBitReader.skipBits(3); // target_md_compat 593 mBitReader.skipBits(8); // target_device_category 594 } 595 } 596 } 597 598 BYTE_ALIGN; 599 600 if (ac4_dsi_version == 1) { 601 uint64_t end = (mDSISize - mBitReader.numBitsLeft()) / 8; 602 uint64_t presentation_bytes = end - start; 603 uint64_t skip_bytes = pres_bytes - presentation_bytes; 604 ALOGV("skipping = %" PRIu64 " bytes", skip_bytes); 605 CHECK_BITS_LEFT(skip_bytes * 8); 606 mBitReader.skipBits(skip_bytes * 8); 607 } 608 609 // we should know this or something is probably wrong 610 // with the bitstream (or we don't support it) 611 if (mPresentations[presentation].mChannelMode == -1) { 612 ALOGE("could not determing channel mode of presentation %d", presentation); 613 return false; 614 } 615 } /* each presentation */ 616 617 return true; 618 } 619 620 }; 621