1 /* 2 * Copyright (C) 2010 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 "ATSParser" 19 #include <utils/Log.h> 20 #include "ATSParser.h" 21 #include "AnotherPacketSource.h" 22 #include "CasManager.h" 23 #include "ESQueue.h" 24 #include "include/avc_utils.h" 25 26 #include <android/hardware/cas/native/1.0/IDescrambler.h> 27 #include <cutils/native_handle.h> 28 #include <media/stagefright/foundation/ABitReader.h> 29 #include <media/stagefright/foundation/ABuffer.h> 30 #include <media/stagefright/foundation/ADebug.h> 31 #include <media/stagefright/foundation/AMessage.h> 32 #include <media/stagefright/foundation/hexdump.h> 33 #include <media/stagefright/MediaDefs.h> 34 #include <media/stagefright/MediaErrors.h> 35 #include <media/stagefright/MetaData.h> 36 #include <media/stagefright/Utils.h> 37 #include <media/IStreamSource.h> 38 #include <utils/KeyedVector.h> 39 #include <utils/Vector.h> 40 41 #include <inttypes.h> 42 43 namespace android { 44 using hardware::hidl_handle; 45 using hardware::hidl_memory; 46 using hardware::hidl_string; 47 using hardware::hidl_vec; 48 using namespace hardware::cas::V1_0; 49 using namespace hardware::cas::native::V1_0; 50 51 // I want the expression "y" evaluated even if verbose logging is off. 52 #define MY_LOGV(x, y) \ 53 do { unsigned tmp = y; ALOGV(x, tmp); } while (0) 54 55 static const size_t kTSPacketSize = 188; 56 57 struct ATSParser::Program : public RefBase { 58 Program(ATSParser *parser, unsigned programNumber, unsigned programMapPID, 59 int64_t lastRecoveredPTS); 60 61 bool parsePSISection( 62 unsigned pid, ABitReader *br, status_t *err); 63 64 // Pass to appropriate stream according to pid, and set event if it's a PES 65 // with a sync frame. 66 // Note that the method itself does not touch event. 67 bool parsePID( 68 unsigned pid, unsigned continuity_counter, 69 unsigned payload_unit_start_indicator, 70 unsigned transport_scrambling_control, 71 unsigned random_access_indicator, 72 ABitReader *br, status_t *err, SyncEvent *event); 73 74 void signalDiscontinuity( 75 DiscontinuityType type, const sp<AMessage> &extra); 76 77 void signalEOS(status_t finalResult); 78 79 sp<MediaSource> getSource(SourceType type); 80 bool hasSource(SourceType type) const; 81 82 int64_t convertPTSToTimestamp(uint64_t PTS); 83 84 bool PTSTimeDeltaEstablished() const { 85 return mFirstPTSValid; 86 } 87 88 unsigned number() const { return mProgramNumber; } 89 90 void updateProgramMapPID(unsigned programMapPID) { 91 mProgramMapPID = programMapPID; 92 } 93 94 unsigned programMapPID() const { 95 return mProgramMapPID; 96 } 97 98 uint32_t parserFlags() const { 99 return mParser->mFlags; 100 } 101 102 sp<CasManager> casManager() const { 103 return mParser->mCasManager; 104 } 105 106 uint64_t firstPTS() const { 107 return mFirstPTS; 108 } 109 110 void updateCasSessions(); 111 112 void signalNewSampleAesKey(const sp<AMessage> &keyItem); 113 114 private: 115 struct StreamInfo { 116 unsigned mType; 117 unsigned mPID; 118 int32_t mCASystemId; 119 }; 120 121 ATSParser *mParser; 122 unsigned mProgramNumber; 123 unsigned mProgramMapPID; 124 KeyedVector<unsigned, sp<Stream> > mStreams; 125 bool mFirstPTSValid; 126 uint64_t mFirstPTS; 127 int64_t mLastRecoveredPTS; 128 sp<AMessage> mSampleAesKeyItem; 129 130 status_t parseProgramMap(ABitReader *br); 131 int64_t recoverPTS(uint64_t PTS_33bit); 132 bool findCADescriptor( 133 ABitReader *br, unsigned infoLength, CADescriptor *caDescriptor); 134 bool switchPIDs(const Vector<StreamInfo> &infos); 135 136 DISALLOW_EVIL_CONSTRUCTORS(Program); 137 }; 138 139 struct ATSParser::Stream : public RefBase { 140 Stream(Program *program, 141 unsigned elementaryPID, 142 unsigned streamType, 143 unsigned PCR_PID, 144 int32_t CA_system_ID); 145 146 unsigned type() const { return mStreamType; } 147 unsigned pid() const { return mElementaryPID; } 148 void setPID(unsigned pid) { mElementaryPID = pid; } 149 150 void setCasInfo( 151 int32_t systemId, 152 const sp<IDescrambler> &descrambler, 153 const std::vector<uint8_t> &sessionId); 154 155 // Parse the payload and set event when PES with a sync frame is detected. 156 // This method knows when a PES starts; so record mPesStartOffsets in that 157 // case. 158 status_t parse( 159 unsigned continuity_counter, 160 unsigned payload_unit_start_indicator, 161 unsigned transport_scrambling_control, 162 unsigned random_access_indicator, 163 ABitReader *br, 164 SyncEvent *event); 165 166 void signalDiscontinuity( 167 DiscontinuityType type, const sp<AMessage> &extra); 168 169 void signalEOS(status_t finalResult); 170 171 SourceType getSourceType(); 172 sp<MediaSource> getSource(SourceType type); 173 174 bool isAudio() const; 175 bool isVideo() const; 176 bool isMeta() const; 177 178 void signalNewSampleAesKey(const sp<AMessage> &keyItem); 179 180 protected: 181 virtual ~Stream(); 182 183 private: 184 struct SubSampleInfo { 185 size_t subSampleSize; 186 unsigned transport_scrambling_mode; 187 unsigned random_access_indicator; 188 }; 189 Program *mProgram; 190 unsigned mElementaryPID; 191 unsigned mStreamType; 192 unsigned mPCR_PID; 193 int32_t mExpectedContinuityCounter; 194 195 sp<ABuffer> mBuffer; 196 sp<AnotherPacketSource> mSource; 197 bool mPayloadStarted; 198 bool mEOSReached; 199 200 uint64_t mPrevPTS; 201 List<off64_t> mPesStartOffsets; 202 203 ElementaryStreamQueue *mQueue; 204 205 bool mScrambled; 206 bool mSampleEncrypted; 207 sp<AMessage> mSampleAesKeyItem; 208 sp<IMemory> mMem; 209 sp<MemoryDealer> mDealer; 210 hardware::cas::native::V1_0::SharedBuffer mDescramblerSrcBuffer; 211 sp<ABuffer> mDescrambledBuffer; 212 List<SubSampleInfo> mSubSamples; 213 sp<IDescrambler> mDescrambler; 214 215 // Flush accumulated payload if necessary --- i.e. at EOS or at the start of 216 // another payload. event is set if the flushed payload is PES with a sync 217 // frame. 218 status_t flush(SyncEvent *event); 219 220 // Flush accumulated payload for scrambled streams if necessary --- i.e. at 221 // EOS or at the start of another payload. event is set if the flushed 222 // payload is PES with a sync frame. 223 status_t flushScrambled(SyncEvent *event); 224 225 // Check if a PES packet is scrambled at PES level. 226 uint32_t getPesScramblingControl(ABitReader *br, int32_t *pesOffset); 227 228 // Strip and parse PES headers and pass remaining payload into onPayload 229 // with parsed metadata. event is set if the PES contains a sync frame. 230 status_t parsePES(ABitReader *br, SyncEvent *event); 231 232 // Feed the payload into mQueue and if a packet is identified, queue it 233 // into mSource. If the packet is a sync frame. set event with start offset 234 // and timestamp of the packet. 235 void onPayloadData( 236 unsigned PTS_DTS_flags, uint64_t PTS, uint64_t DTS, 237 unsigned PES_scrambling_control, 238 const uint8_t *data, size_t size, 239 int32_t payloadOffset, SyncEvent *event); 240 241 // Ensure internal buffers can hold specified size, and will re-allocate 242 // as needed. 243 bool ensureBufferCapacity(size_t size); 244 245 DISALLOW_EVIL_CONSTRUCTORS(Stream); 246 }; 247 248 struct ATSParser::PSISection : public RefBase { 249 PSISection(); 250 251 status_t append(const void *data, size_t size); 252 void setSkipBytes(uint8_t skip); 253 void clear(); 254 255 bool isComplete() const; 256 bool isEmpty() const; 257 bool isCRCOkay() const; 258 259 const uint8_t *data() const; 260 size_t size() const; 261 262 protected: 263 virtual ~PSISection(); 264 265 private: 266 sp<ABuffer> mBuffer; 267 uint8_t mSkipBytes; 268 static uint32_t CRC_TABLE[]; 269 270 DISALLOW_EVIL_CONSTRUCTORS(PSISection); 271 }; 272 273 ATSParser::SyncEvent::SyncEvent(off64_t offset) 274 : mHasReturnedData(false), mOffset(offset), mTimeUs(0) {} 275 276 void ATSParser::SyncEvent::init(off64_t offset, const sp<MediaSource> &source, 277 int64_t timeUs, SourceType type) { 278 mHasReturnedData = true; 279 mOffset = offset; 280 mMediaSource = source; 281 mTimeUs = timeUs; 282 mType = type; 283 } 284 285 void ATSParser::SyncEvent::reset() { 286 mHasReturnedData = false; 287 } 288 //////////////////////////////////////////////////////////////////////////////// 289 290 ATSParser::Program::Program( 291 ATSParser *parser, unsigned programNumber, unsigned programMapPID, 292 int64_t lastRecoveredPTS) 293 : mParser(parser), 294 mProgramNumber(programNumber), 295 mProgramMapPID(programMapPID), 296 mFirstPTSValid(false), 297 mFirstPTS(0), 298 mLastRecoveredPTS(lastRecoveredPTS) { 299 ALOGV("new program number %u", programNumber); 300 } 301 302 bool ATSParser::Program::parsePSISection( 303 unsigned pid, ABitReader *br, status_t *err) { 304 *err = OK; 305 306 if (pid != mProgramMapPID) { 307 return false; 308 } 309 310 *err = parseProgramMap(br); 311 312 return true; 313 } 314 315 bool ATSParser::Program::parsePID( 316 unsigned pid, unsigned continuity_counter, 317 unsigned payload_unit_start_indicator, 318 unsigned transport_scrambling_control, 319 unsigned random_access_indicator, 320 ABitReader *br, status_t *err, SyncEvent *event) { 321 *err = OK; 322 323 ssize_t index = mStreams.indexOfKey(pid); 324 if (index < 0) { 325 return false; 326 } 327 328 *err = mStreams.editValueAt(index)->parse( 329 continuity_counter, 330 payload_unit_start_indicator, 331 transport_scrambling_control, 332 random_access_indicator, 333 br, event); 334 335 return true; 336 } 337 338 void ATSParser::Program::signalDiscontinuity( 339 DiscontinuityType type, const sp<AMessage> &extra) { 340 int64_t mediaTimeUs; 341 if ((type & DISCONTINUITY_TIME) 342 && extra != NULL 343 && extra->findInt64( 344 IStreamListener::kKeyMediaTimeUs, &mediaTimeUs)) { 345 mFirstPTSValid = false; 346 } 347 348 for (size_t i = 0; i < mStreams.size(); ++i) { 349 mStreams.editValueAt(i)->signalDiscontinuity(type, extra); 350 } 351 } 352 353 void ATSParser::Program::signalEOS(status_t finalResult) { 354 for (size_t i = 0; i < mStreams.size(); ++i) { 355 mStreams.editValueAt(i)->signalEOS(finalResult); 356 } 357 } 358 359 bool ATSParser::Program::switchPIDs(const Vector<StreamInfo> &infos) { 360 bool success = false; 361 362 if (mStreams.size() == infos.size()) { 363 // build type->PIDs map for old and new mapping 364 size_t i; 365 KeyedVector<int32_t, Vector<int32_t> > oldType2PIDs, newType2PIDs; 366 for (i = 0; i < mStreams.size(); ++i) { 367 ssize_t index = oldType2PIDs.indexOfKey(mStreams[i]->type()); 368 if (index < 0) { 369 oldType2PIDs.add(mStreams[i]->type(), Vector<int32_t>()); 370 } 371 oldType2PIDs.editValueFor(mStreams[i]->type()).push_back(mStreams[i]->pid()); 372 } 373 for (i = 0; i < infos.size(); ++i) { 374 ssize_t index = newType2PIDs.indexOfKey(infos[i].mType); 375 if (index < 0) { 376 newType2PIDs.add(infos[i].mType, Vector<int32_t>()); 377 } 378 newType2PIDs.editValueFor(infos[i].mType).push_back(infos[i].mPID); 379 } 380 381 // we can recover if the number of streams for each type hasn't changed 382 if (oldType2PIDs.size() == newType2PIDs.size()) { 383 success = true; 384 for (i = 0; i < oldType2PIDs.size(); ++i) { 385 // KeyedVector is sorted, we just compare key and size of each index 386 if (oldType2PIDs.keyAt(i) != newType2PIDs.keyAt(i) 387 || oldType2PIDs[i].size() != newType2PIDs[i].size()) { 388 success = false; 389 break; 390 } 391 } 392 } 393 394 if (success) { 395 // save current streams to temp 396 KeyedVector<int32_t, sp<Stream> > temp; 397 for (i = 0; i < mStreams.size(); ++i) { 398 temp.add(mStreams.keyAt(i), mStreams.editValueAt(i)); 399 } 400 401 mStreams.clear(); 402 for (i = 0; i < temp.size(); ++i) { 403 // The two checks below shouldn't happen, 404 // we already checked above the stream count matches 405 ssize_t index = newType2PIDs.indexOfKey(temp[i]->type()); 406 if (index < 0) { 407 return false; 408 } 409 Vector<int32_t> &newPIDs = newType2PIDs.editValueAt(index); 410 if (newPIDs.isEmpty()) { 411 return false; 412 } 413 414 // get the next PID for temp[i]->type() in the new PID map 415 Vector<int32_t>::iterator it = newPIDs.begin(); 416 417 // change the PID of the stream, and add it back 418 temp.editValueAt(i)->setPID(*it); 419 mStreams.add(temp[i]->pid(), temp.editValueAt(i)); 420 421 // removed the used PID 422 newPIDs.erase(it); 423 } 424 } 425 } 426 return success; 427 } 428 429 bool ATSParser::Program::findCADescriptor( 430 ABitReader *br, unsigned infoLength, 431 ATSParser::CADescriptor *caDescriptor) { 432 bool found = false; 433 while (infoLength > 2) { 434 unsigned descriptor_tag = br->getBits(8); 435 ALOGV(" tag = 0x%02x", descriptor_tag); 436 437 unsigned descriptor_length = br->getBits(8); 438 ALOGV(" len = %u", descriptor_length); 439 440 infoLength -= 2; 441 if (descriptor_length > infoLength) { 442 break; 443 } 444 if (descriptor_tag == 9 && descriptor_length >= 4) { 445 found = true; 446 caDescriptor->mSystemID = br->getBits(16); 447 caDescriptor->mPID = br->getBits(16) & 0x1fff; 448 infoLength -= 4; 449 caDescriptor->mPrivateData.assign( 450 br->data(), br->data() + descriptor_length - 4); 451 break; 452 } else { 453 infoLength -= descriptor_length; 454 br->skipBits(descriptor_length * 8); 455 } 456 } 457 br->skipBits(infoLength * 8); 458 return found; 459 } 460 461 status_t ATSParser::Program::parseProgramMap(ABitReader *br) { 462 unsigned table_id = br->getBits(8); 463 ALOGV(" table_id = %u", table_id); 464 if (table_id != 0x02u) { 465 ALOGE("PMT data error!"); 466 return ERROR_MALFORMED; 467 } 468 unsigned section_syntax_indicator = br->getBits(1); 469 ALOGV(" section_syntax_indicator = %u", section_syntax_indicator); 470 if (section_syntax_indicator != 1u) { 471 ALOGE("PMT data error!"); 472 return ERROR_MALFORMED; 473 } 474 475 br->skipBits(1); // '0' 476 MY_LOGV(" reserved = %u", br->getBits(2)); 477 478 unsigned section_length = br->getBits(12); 479 ALOGV(" section_length = %u", section_length); 480 481 MY_LOGV(" program_number = %u", br->getBits(16)); 482 MY_LOGV(" reserved = %u", br->getBits(2)); 483 MY_LOGV(" version_number = %u", br->getBits(5)); 484 MY_LOGV(" current_next_indicator = %u", br->getBits(1)); 485 MY_LOGV(" section_number = %u", br->getBits(8)); 486 MY_LOGV(" last_section_number = %u", br->getBits(8)); 487 MY_LOGV(" reserved = %u", br->getBits(3)); 488 489 unsigned PCR_PID = br->getBits(13); 490 ALOGV(" PCR_PID = 0x%04x", PCR_PID); 491 492 MY_LOGV(" reserved = %u", br->getBits(4)); 493 494 unsigned program_info_length = br->getBits(12); 495 ALOGV(" program_info_length = %u", program_info_length); 496 497 // descriptors 498 CADescriptor programCA; 499 bool hasProgramCA = findCADescriptor(br, program_info_length, &programCA); 500 if (hasProgramCA && !mParser->mCasManager->addProgram( 501 mProgramNumber, programCA)) { 502 return ERROR_MALFORMED; 503 } 504 505 Vector<StreamInfo> infos; 506 507 // infoBytesRemaining is the number of bytes that make up the 508 // variable length section of ES_infos. It does not include the 509 // final CRC. 510 size_t infoBytesRemaining = section_length - 9 - program_info_length - 4; 511 512 while (infoBytesRemaining >= 5) { 513 514 unsigned streamType = br->getBits(8); 515 ALOGV(" stream_type = 0x%02x", streamType); 516 517 MY_LOGV(" reserved = %u", br->getBits(3)); 518 519 unsigned elementaryPID = br->getBits(13); 520 ALOGV(" elementary_PID = 0x%04x", elementaryPID); 521 522 MY_LOGV(" reserved = %u", br->getBits(4)); 523 524 unsigned ES_info_length = br->getBits(12); 525 ALOGV(" ES_info_length = %u", ES_info_length); 526 527 CADescriptor streamCA; 528 bool hasStreamCA = findCADescriptor(br, ES_info_length, &streamCA); 529 if (hasStreamCA && !mParser->mCasManager->addStream( 530 mProgramNumber, elementaryPID, streamCA)) { 531 return ERROR_MALFORMED; 532 } 533 StreamInfo info; 534 info.mType = streamType; 535 info.mPID = elementaryPID; 536 info.mCASystemId = hasProgramCA ? programCA.mSystemID : 537 hasStreamCA ? streamCA.mSystemID : -1; 538 infos.push(info); 539 540 infoBytesRemaining -= 5 + ES_info_length; 541 } 542 543 if (infoBytesRemaining != 0) { 544 ALOGW("Section data remains unconsumed"); 545 } 546 MY_LOGV(" CRC = 0x%08x", br->getBits(32)); 547 548 bool PIDsChanged = false; 549 for (size_t i = 0; i < infos.size(); ++i) { 550 StreamInfo &info = infos.editItemAt(i); 551 552 ssize_t index = mStreams.indexOfKey(info.mPID); 553 554 if (index >= 0 && mStreams.editValueAt(index)->type() != info.mType) { 555 ALOGI("uh oh. stream PIDs have changed."); 556 PIDsChanged = true; 557 break; 558 } 559 } 560 561 if (PIDsChanged) { 562 #if 0 563 ALOGI("before:"); 564 for (size_t i = 0; i < mStreams.size(); ++i) { 565 sp<Stream> stream = mStreams.editValueAt(i); 566 567 ALOGI("PID 0x%08x => type 0x%02x", stream->pid(), stream->type()); 568 } 569 570 ALOGI("after:"); 571 for (size_t i = 0; i < infos.size(); ++i) { 572 StreamInfo &info = infos.editItemAt(i); 573 574 ALOGI("PID 0x%08x => type 0x%02x", info.mPID, info.mType); 575 } 576 #endif 577 578 // we can recover if number of streams for each type remain the same 579 bool success = switchPIDs(infos); 580 581 if (!success) { 582 ALOGI("Stream PIDs changed and we cannot recover."); 583 return ERROR_MALFORMED; 584 } 585 } 586 587 bool isAddingScrambledStream = false; 588 for (size_t i = 0; i < infos.size(); ++i) { 589 StreamInfo &info = infos.editItemAt(i); 590 591 if (mParser->mCasManager->isCAPid(info.mPID)) { 592 // skip CA streams (EMM/ECM) 593 continue; 594 } 595 ssize_t index = mStreams.indexOfKey(info.mPID); 596 597 if (index < 0) { 598 sp<Stream> stream = new Stream( 599 this, info.mPID, info.mType, PCR_PID, info.mCASystemId); 600 601 if (mSampleAesKeyItem != NULL) { 602 stream->signalNewSampleAesKey(mSampleAesKeyItem); 603 } 604 605 isAddingScrambledStream |= info.mCASystemId >= 0; 606 mStreams.add(info.mPID, stream); 607 } 608 } 609 610 if (isAddingScrambledStream) { 611 ALOGI("Receiving scrambled streams without descrambler!"); 612 return ERROR_DRM_DECRYPT_UNIT_NOT_INITIALIZED; 613 } 614 return OK; 615 } 616 617 int64_t ATSParser::Program::recoverPTS(uint64_t PTS_33bit) { 618 // We only have the lower 33-bit of the PTS. It could overflow within a 619 // reasonable amount of time. To handle the wrap-around, use fancy math 620 // to get an extended PTS that is within [-0xffffffff, 0xffffffff] 621 // of the latest recovered PTS. 622 if (mLastRecoveredPTS < 0ll) { 623 // Use the original 33bit number for 1st frame, the reason is that 624 // if 1st frame wraps to negative that's far away from 0, we could 625 // never start. Only start wrapping around from 2nd frame. 626 mLastRecoveredPTS = static_cast<int64_t>(PTS_33bit); 627 } else { 628 mLastRecoveredPTS = static_cast<int64_t>( 629 ((mLastRecoveredPTS - static_cast<int64_t>(PTS_33bit) + 0x100000000ll) 630 & 0xfffffffe00000000ull) | PTS_33bit); 631 // We start from 0, but recovered PTS could be slightly below 0. 632 // Clamp it to 0 as rest of the pipeline doesn't take negative pts. 633 // (eg. video is read first and starts at 0, but audio starts at 0xfffffff0) 634 if (mLastRecoveredPTS < 0ll) { 635 ALOGI("Clamping negative recovered PTS (%" PRId64 ") to 0", mLastRecoveredPTS); 636 mLastRecoveredPTS = 0ll; 637 } 638 } 639 640 return mLastRecoveredPTS; 641 } 642 643 sp<MediaSource> ATSParser::Program::getSource(SourceType type) { 644 for (size_t i = 0; i < mStreams.size(); ++i) { 645 sp<MediaSource> source = mStreams.editValueAt(i)->getSource(type); 646 if (source != NULL) { 647 return source; 648 } 649 } 650 651 return NULL; 652 } 653 654 bool ATSParser::Program::hasSource(SourceType type) const { 655 for (size_t i = 0; i < mStreams.size(); ++i) { 656 const sp<Stream> &stream = mStreams.valueAt(i); 657 if (type == AUDIO && stream->isAudio()) { 658 return true; 659 } else if (type == VIDEO && stream->isVideo()) { 660 return true; 661 } else if (type == META && stream->isMeta()) { 662 return true; 663 } 664 } 665 666 return false; 667 } 668 669 int64_t ATSParser::Program::convertPTSToTimestamp(uint64_t PTS) { 670 PTS = recoverPTS(PTS); 671 672 if (!(mParser->mFlags & TS_TIMESTAMPS_ARE_ABSOLUTE)) { 673 if (!mFirstPTSValid) { 674 mFirstPTSValid = true; 675 mFirstPTS = PTS; 676 PTS = 0; 677 } else if (PTS < mFirstPTS) { 678 PTS = 0; 679 } else { 680 PTS -= mFirstPTS; 681 } 682 } 683 684 int64_t timeUs = (PTS * 100) / 9; 685 686 if (mParser->mAbsoluteTimeAnchorUs >= 0ll) { 687 timeUs += mParser->mAbsoluteTimeAnchorUs; 688 } 689 690 if (mParser->mTimeOffsetValid) { 691 timeUs += mParser->mTimeOffsetUs; 692 } 693 694 return timeUs; 695 } 696 697 void ATSParser::Program::updateCasSessions() { 698 for (size_t i = 0; i < mStreams.size(); ++i) { 699 sp<Stream> &stream = mStreams.editValueAt(i); 700 sp<IDescrambler> descrambler; 701 std::vector<uint8_t> sessionId; 702 int32_t systemId; 703 if (mParser->mCasManager->getCasInfo(mProgramNumber, stream->pid(), 704 &systemId, &descrambler, &sessionId)) { 705 stream->setCasInfo(systemId, descrambler, sessionId); 706 } 707 } 708 } 709 710 //////////////////////////////////////////////////////////////////////////////// 711 static const size_t kInitialStreamBufferSize = 192 * 1024; 712 713 ATSParser::Stream::Stream( 714 Program *program, 715 unsigned elementaryPID, 716 unsigned streamType, 717 unsigned PCR_PID, 718 int32_t CA_system_ID) 719 : mProgram(program), 720 mElementaryPID(elementaryPID), 721 mStreamType(streamType), 722 mPCR_PID(PCR_PID), 723 mExpectedContinuityCounter(-1), 724 mPayloadStarted(false), 725 mEOSReached(false), 726 mPrevPTS(0), 727 mQueue(NULL), 728 mScrambled(CA_system_ID >= 0) { 729 730 mSampleEncrypted = 731 mStreamType == STREAMTYPE_H264_ENCRYPTED || 732 mStreamType == STREAMTYPE_AAC_ENCRYPTED || 733 mStreamType == STREAMTYPE_AC3_ENCRYPTED; 734 735 ALOGV("new stream PID 0x%02x, type 0x%02x, scrambled %d, SampleEncrypted: %d", 736 elementaryPID, streamType, mScrambled, mSampleEncrypted); 737 738 uint32_t flags = 739 (isVideo() && mScrambled) ? ElementaryStreamQueue::kFlag_ScrambledData : 740 (mSampleEncrypted) ? ElementaryStreamQueue::kFlag_SampleEncryptedData : 741 0; 742 743 ElementaryStreamQueue::Mode mode = ElementaryStreamQueue::INVALID; 744 745 switch (mStreamType) { 746 case STREAMTYPE_H264: 747 case STREAMTYPE_H264_ENCRYPTED: 748 mode = ElementaryStreamQueue::H264; 749 flags |= (mProgram->parserFlags() & ALIGNED_VIDEO_DATA) ? 750 ElementaryStreamQueue::kFlag_AlignedData : 0; 751 break; 752 753 case STREAMTYPE_MPEG2_AUDIO_ADTS: 754 case STREAMTYPE_AAC_ENCRYPTED: 755 mode = ElementaryStreamQueue::AAC; 756 break; 757 758 case STREAMTYPE_MPEG1_AUDIO: 759 case STREAMTYPE_MPEG2_AUDIO: 760 mode = ElementaryStreamQueue::MPEG_AUDIO; 761 break; 762 763 case STREAMTYPE_MPEG1_VIDEO: 764 case STREAMTYPE_MPEG2_VIDEO: 765 mode = ElementaryStreamQueue::MPEG_VIDEO; 766 break; 767 768 case STREAMTYPE_MPEG4_VIDEO: 769 mode = ElementaryStreamQueue::MPEG4_VIDEO; 770 break; 771 772 case STREAMTYPE_LPCM_AC3: 773 case STREAMTYPE_AC3: 774 case STREAMTYPE_AC3_ENCRYPTED: 775 mode = ElementaryStreamQueue::AC3; 776 break; 777 778 case STREAMTYPE_METADATA: 779 mode = ElementaryStreamQueue::METADATA; 780 break; 781 782 default: 783 ALOGE("stream PID 0x%02x has invalid stream type 0x%02x", 784 elementaryPID, streamType); 785 return; 786 } 787 788 mQueue = new ElementaryStreamQueue(mode, flags); 789 790 if (mQueue != NULL) { 791 if (mSampleAesKeyItem != NULL) { 792 mQueue->signalNewSampleAesKey(mSampleAesKeyItem); 793 } 794 795 ensureBufferCapacity(kInitialStreamBufferSize); 796 797 if (mScrambled && (isAudio() || isVideo())) { 798 // Set initial format to scrambled 799 sp<MetaData> meta = new MetaData(); 800 meta->setCString(kKeyMIMEType, 801 isAudio() ? MEDIA_MIMETYPE_AUDIO_SCRAMBLED 802 : MEDIA_MIMETYPE_VIDEO_SCRAMBLED); 803 // for MediaExtractor.CasInfo 804 meta->setInt32(kKeyCASystemID, CA_system_ID); 805 mSource = new AnotherPacketSource(meta); 806 } 807 } 808 } 809 810 ATSParser::Stream::~Stream() { 811 delete mQueue; 812 mQueue = NULL; 813 } 814 815 bool ATSParser::Stream::ensureBufferCapacity(size_t neededSize) { 816 if (mBuffer != NULL && mBuffer->capacity() >= neededSize) { 817 return true; 818 } 819 820 ALOGV("ensureBufferCapacity: current size %zu, new size %zu, scrambled %d", 821 mBuffer == NULL ? 0 : mBuffer->capacity(), neededSize, mScrambled); 822 823 sp<ABuffer> newBuffer, newScrambledBuffer; 824 sp<IMemory> newMem; 825 sp<MemoryDealer> newDealer; 826 if (mScrambled) { 827 size_t alignment = MemoryDealer::getAllocationAlignment(); 828 neededSize = (neededSize + (alignment - 1)) & ~(alignment - 1); 829 // Align to multiples of 64K. 830 neededSize = (neededSize + 65535) & ~65535; 831 newDealer = new MemoryDealer(neededSize, "ATSParser"); 832 newMem = newDealer->allocate(neededSize); 833 newScrambledBuffer = new ABuffer(newMem->pointer(), newMem->size()); 834 835 if (mDescrambledBuffer != NULL) { 836 memcpy(newScrambledBuffer->data(), 837 mDescrambledBuffer->data(), mDescrambledBuffer->size()); 838 newScrambledBuffer->setRange(0, mDescrambledBuffer->size()); 839 } else { 840 newScrambledBuffer->setRange(0, 0); 841 } 842 mMem = newMem; 843 mDealer = newDealer; 844 mDescrambledBuffer = newScrambledBuffer; 845 846 ssize_t offset; 847 size_t size; 848 sp<IMemoryHeap> heap = newMem->getMemory(&offset, &size); 849 if (heap == NULL) { 850 return false; 851 } 852 native_handle_t* nativeHandle = native_handle_create(1, 0); 853 if (!nativeHandle) { 854 ALOGE("[stream %d] failed to create native handle", mElementaryPID); 855 return false; 856 } 857 nativeHandle->data[0] = heap->getHeapID(); 858 mDescramblerSrcBuffer.heapBase = hidl_memory("ashmem", 859 hidl_handle(nativeHandle), heap->getSize()); 860 mDescramblerSrcBuffer.offset = (uint64_t) offset; 861 mDescramblerSrcBuffer.size = (uint64_t) size; 862 863 ALOGD("[stream %d] created shared buffer for descrambling, offset %zd, size %zu", 864 mElementaryPID, offset, size); 865 } else { 866 // Align to multiples of 64K. 867 neededSize = (neededSize + 65535) & ~65535; 868 } 869 870 newBuffer = new ABuffer(neededSize); 871 if (mBuffer != NULL) { 872 memcpy(newBuffer->data(), mBuffer->data(), mBuffer->size()); 873 newBuffer->setRange(0, mBuffer->size()); 874 } else { 875 newBuffer->setRange(0, 0); 876 } 877 mBuffer = newBuffer; 878 return true; 879 } 880 881 status_t ATSParser::Stream::parse( 882 unsigned continuity_counter, 883 unsigned payload_unit_start_indicator, 884 unsigned transport_scrambling_control, 885 unsigned random_access_indicator, 886 ABitReader *br, SyncEvent *event) { 887 if (mQueue == NULL) { 888 return OK; 889 } 890 891 if (mExpectedContinuityCounter >= 0 892 && (unsigned)mExpectedContinuityCounter != continuity_counter) { 893 ALOGI("discontinuity on stream pid 0x%04x", mElementaryPID); 894 895 mPayloadStarted = false; 896 mPesStartOffsets.clear(); 897 mBuffer->setRange(0, 0); 898 mSubSamples.clear(); 899 mExpectedContinuityCounter = -1; 900 901 #if 0 902 // Uncomment this if you'd rather see no corruption whatsoever on 903 // screen and suspend updates until we come across another IDR frame. 904 905 if (mStreamType == STREAMTYPE_H264) { 906 ALOGI("clearing video queue"); 907 mQueue->clear(true /* clearFormat */); 908 } 909 #endif 910 911 if (!payload_unit_start_indicator) { 912 return OK; 913 } 914 } 915 916 mExpectedContinuityCounter = (continuity_counter + 1) & 0x0f; 917 918 if (payload_unit_start_indicator) { 919 off64_t offset = (event != NULL) ? event->getOffset() : 0; 920 if (mPayloadStarted) { 921 // Otherwise we run the danger of receiving the trailing bytes 922 // of a PES packet that we never saw the start of and assuming 923 // we have a a complete PES packet. 924 925 status_t err = flush(event); 926 927 if (err != OK) { 928 ALOGW("Error (%08x) happened while flushing; we simply discard " 929 "the PES packet and continue.", err); 930 } 931 } 932 933 mPayloadStarted = true; 934 // There should be at most 2 elements in |mPesStartOffsets|. 935 while (mPesStartOffsets.size() >= 2) { 936 mPesStartOffsets.erase(mPesStartOffsets.begin()); 937 } 938 mPesStartOffsets.push_back(offset); 939 } 940 941 if (!mPayloadStarted) { 942 return OK; 943 } 944 945 size_t payloadSizeBits = br->numBitsLeft(); 946 if (payloadSizeBits % 8 != 0u) { 947 ALOGE("Wrong value"); 948 return BAD_VALUE; 949 } 950 951 size_t neededSize = mBuffer->size() + payloadSizeBits / 8; 952 if (!ensureBufferCapacity(neededSize)) { 953 return NO_MEMORY; 954 } 955 956 memcpy(mBuffer->data() + mBuffer->size(), br->data(), payloadSizeBits / 8); 957 mBuffer->setRange(0, mBuffer->size() + payloadSizeBits / 8); 958 959 if (mScrambled) { 960 mSubSamples.push_back({payloadSizeBits / 8, 961 transport_scrambling_control, random_access_indicator}); 962 } 963 964 return OK; 965 } 966 967 bool ATSParser::Stream::isVideo() const { 968 switch (mStreamType) { 969 case STREAMTYPE_H264: 970 case STREAMTYPE_H264_ENCRYPTED: 971 case STREAMTYPE_MPEG1_VIDEO: 972 case STREAMTYPE_MPEG2_VIDEO: 973 case STREAMTYPE_MPEG4_VIDEO: 974 return true; 975 976 default: 977 return false; 978 } 979 } 980 981 bool ATSParser::Stream::isAudio() const { 982 switch (mStreamType) { 983 case STREAMTYPE_MPEG1_AUDIO: 984 case STREAMTYPE_MPEG2_AUDIO: 985 case STREAMTYPE_MPEG2_AUDIO_ADTS: 986 case STREAMTYPE_LPCM_AC3: 987 case STREAMTYPE_AC3: 988 case STREAMTYPE_AAC_ENCRYPTED: 989 case STREAMTYPE_AC3_ENCRYPTED: 990 return true; 991 992 default: 993 return false; 994 } 995 } 996 997 bool ATSParser::Stream::isMeta() const { 998 if (mStreamType == STREAMTYPE_METADATA) { 999 return true; 1000 } 1001 return false; 1002 } 1003 1004 void ATSParser::Stream::signalDiscontinuity( 1005 DiscontinuityType type, const sp<AMessage> &extra) { 1006 mExpectedContinuityCounter = -1; 1007 1008 if (mQueue == NULL) { 1009 return; 1010 } 1011 1012 mPayloadStarted = false; 1013 mPesStartOffsets.clear(); 1014 mEOSReached = false; 1015 mBuffer->setRange(0, 0); 1016 mSubSamples.clear(); 1017 1018 bool clearFormat = false; 1019 if (isAudio()) { 1020 if (type & DISCONTINUITY_AUDIO_FORMAT) { 1021 clearFormat = true; 1022 } 1023 } else { 1024 if (type & DISCONTINUITY_VIDEO_FORMAT) { 1025 clearFormat = true; 1026 } 1027 } 1028 1029 mQueue->clear(clearFormat); 1030 1031 if (type & DISCONTINUITY_TIME) { 1032 uint64_t resumeAtPTS; 1033 if (extra != NULL 1034 && extra->findInt64( 1035 IStreamListener::kKeyResumeAtPTS, 1036 (int64_t *)&resumeAtPTS)) { 1037 int64_t resumeAtMediaTimeUs = 1038 mProgram->convertPTSToTimestamp(resumeAtPTS); 1039 1040 extra->setInt64("resume-at-mediaTimeUs", resumeAtMediaTimeUs); 1041 } 1042 } 1043 1044 if (mSource != NULL) { 1045 sp<MetaData> meta = mSource->getFormat(); 1046 const char* mime; 1047 if (clearFormat && meta != NULL && meta->findCString(kKeyMIMEType, &mime) 1048 && (!strncasecmp(mime, MEDIA_MIMETYPE_AUDIO_SCRAMBLED, 15) 1049 || !strncasecmp(mime, MEDIA_MIMETYPE_VIDEO_SCRAMBLED, 15))){ 1050 mSource->clear(); 1051 } else { 1052 mSource->queueDiscontinuity(type, extra, true); 1053 } 1054 } 1055 } 1056 1057 void ATSParser::Stream::signalEOS(status_t finalResult) { 1058 if (mSource != NULL) { 1059 mSource->signalEOS(finalResult); 1060 } 1061 mEOSReached = true; 1062 flush(NULL); 1063 } 1064 1065 status_t ATSParser::Stream::parsePES(ABitReader *br, SyncEvent *event) { 1066 const uint8_t *basePtr = br->data(); 1067 1068 unsigned packet_startcode_prefix = br->getBits(24); 1069 1070 ALOGV("packet_startcode_prefix = 0x%08x", packet_startcode_prefix); 1071 1072 if (packet_startcode_prefix != 1) { 1073 ALOGV("Supposedly payload_unit_start=1 unit does not start " 1074 "with startcode."); 1075 1076 return ERROR_MALFORMED; 1077 } 1078 1079 unsigned stream_id = br->getBits(8); 1080 ALOGV("stream_id = 0x%02x", stream_id); 1081 1082 unsigned PES_packet_length = br->getBits(16); 1083 ALOGV("PES_packet_length = %u", PES_packet_length); 1084 1085 if (stream_id != 0xbc // program_stream_map 1086 && stream_id != 0xbe // padding_stream 1087 && stream_id != 0xbf // private_stream_2 1088 && stream_id != 0xf0 // ECM 1089 && stream_id != 0xf1 // EMM 1090 && stream_id != 0xff // program_stream_directory 1091 && stream_id != 0xf2 // DSMCC 1092 && stream_id != 0xf8) { // H.222.1 type E 1093 if (br->getBits(2) != 2u) { 1094 return ERROR_MALFORMED; 1095 } 1096 1097 unsigned PES_scrambling_control = br->getBits(2); 1098 ALOGV("PES_scrambling_control = %u", PES_scrambling_control); 1099 1100 MY_LOGV("PES_priority = %u", br->getBits(1)); 1101 MY_LOGV("data_alignment_indicator = %u", br->getBits(1)); 1102 MY_LOGV("copyright = %u", br->getBits(1)); 1103 MY_LOGV("original_or_copy = %u", br->getBits(1)); 1104 1105 unsigned PTS_DTS_flags = br->getBits(2); 1106 ALOGV("PTS_DTS_flags = %u", PTS_DTS_flags); 1107 1108 unsigned ESCR_flag = br->getBits(1); 1109 ALOGV("ESCR_flag = %u", ESCR_flag); 1110 1111 unsigned ES_rate_flag = br->getBits(1); 1112 ALOGV("ES_rate_flag = %u", ES_rate_flag); 1113 1114 unsigned DSM_trick_mode_flag = br->getBits(1); 1115 ALOGV("DSM_trick_mode_flag = %u", DSM_trick_mode_flag); 1116 1117 unsigned additional_copy_info_flag = br->getBits(1); 1118 ALOGV("additional_copy_info_flag = %u", additional_copy_info_flag); 1119 1120 MY_LOGV("PES_CRC_flag = %u", br->getBits(1)); 1121 MY_LOGV("PES_extension_flag = %u", br->getBits(1)); 1122 1123 unsigned PES_header_data_length = br->getBits(8); 1124 ALOGV("PES_header_data_length = %u", PES_header_data_length); 1125 1126 unsigned optional_bytes_remaining = PES_header_data_length; 1127 1128 uint64_t PTS = 0, DTS = 0; 1129 1130 if (PTS_DTS_flags == 2 || PTS_DTS_flags == 3) { 1131 if (optional_bytes_remaining < 5u) { 1132 return ERROR_MALFORMED; 1133 } 1134 1135 if (br->getBits(4) != PTS_DTS_flags) { 1136 return ERROR_MALFORMED; 1137 } 1138 PTS = ((uint64_t)br->getBits(3)) << 30; 1139 if (br->getBits(1) != 1u) { 1140 return ERROR_MALFORMED; 1141 } 1142 PTS |= ((uint64_t)br->getBits(15)) << 15; 1143 if (br->getBits(1) != 1u) { 1144 return ERROR_MALFORMED; 1145 } 1146 PTS |= br->getBits(15); 1147 if (br->getBits(1) != 1u) { 1148 return ERROR_MALFORMED; 1149 } 1150 1151 ALOGV("PTS = 0x%016" PRIx64 " (%.2f)", PTS, PTS / 90000.0); 1152 1153 optional_bytes_remaining -= 5; 1154 1155 if (PTS_DTS_flags == 3) { 1156 if (optional_bytes_remaining < 5u) { 1157 return ERROR_MALFORMED; 1158 } 1159 1160 if (br->getBits(4) != 1u) { 1161 return ERROR_MALFORMED; 1162 } 1163 1164 DTS = ((uint64_t)br->getBits(3)) << 30; 1165 if (br->getBits(1) != 1u) { 1166 return ERROR_MALFORMED; 1167 } 1168 DTS |= ((uint64_t)br->getBits(15)) << 15; 1169 if (br->getBits(1) != 1u) { 1170 return ERROR_MALFORMED; 1171 } 1172 DTS |= br->getBits(15); 1173 if (br->getBits(1) != 1u) { 1174 return ERROR_MALFORMED; 1175 } 1176 1177 ALOGV("DTS = %" PRIu64, DTS); 1178 1179 optional_bytes_remaining -= 5; 1180 } 1181 } 1182 1183 if (ESCR_flag) { 1184 if (optional_bytes_remaining < 6u) { 1185 return ERROR_MALFORMED; 1186 } 1187 1188 br->getBits(2); 1189 1190 uint64_t ESCR = ((uint64_t)br->getBits(3)) << 30; 1191 if (br->getBits(1) != 1u) { 1192 return ERROR_MALFORMED; 1193 } 1194 ESCR |= ((uint64_t)br->getBits(15)) << 15; 1195 if (br->getBits(1) != 1u) { 1196 return ERROR_MALFORMED; 1197 } 1198 ESCR |= br->getBits(15); 1199 if (br->getBits(1) != 1u) { 1200 return ERROR_MALFORMED; 1201 } 1202 1203 ALOGV("ESCR = %" PRIu64, ESCR); 1204 MY_LOGV("ESCR_extension = %u", br->getBits(9)); 1205 1206 if (br->getBits(1) != 1u) { 1207 return ERROR_MALFORMED; 1208 } 1209 1210 optional_bytes_remaining -= 6; 1211 } 1212 1213 if (ES_rate_flag) { 1214 if (optional_bytes_remaining < 3u) { 1215 return ERROR_MALFORMED; 1216 } 1217 1218 if (br->getBits(1) != 1u) { 1219 return ERROR_MALFORMED; 1220 } 1221 MY_LOGV("ES_rate = %u", br->getBits(22)); 1222 if (br->getBits(1) != 1u) { 1223 return ERROR_MALFORMED; 1224 } 1225 1226 optional_bytes_remaining -= 3; 1227 } 1228 1229 br->skipBits(optional_bytes_remaining * 8); 1230 1231 // ES data follows. 1232 int32_t pesOffset = br->data() - basePtr; 1233 1234 if (PES_packet_length != 0) { 1235 if (PES_packet_length < PES_header_data_length + 3) { 1236 return ERROR_MALFORMED; 1237 } 1238 1239 unsigned dataLength = 1240 PES_packet_length - 3 - PES_header_data_length; 1241 1242 if (br->numBitsLeft() < dataLength * 8) { 1243 ALOGE("PES packet does not carry enough data to contain " 1244 "payload. (numBitsLeft = %zu, required = %u)", 1245 br->numBitsLeft(), dataLength * 8); 1246 1247 return ERROR_MALFORMED; 1248 } 1249 1250 ALOGV("There's %u bytes of payload, PES_packet_length=%u, offset=%d", 1251 dataLength, PES_packet_length, pesOffset); 1252 1253 onPayloadData( 1254 PTS_DTS_flags, PTS, DTS, PES_scrambling_control, 1255 br->data(), dataLength, pesOffset, event); 1256 1257 br->skipBits(dataLength * 8); 1258 } else { 1259 onPayloadData( 1260 PTS_DTS_flags, PTS, DTS, PES_scrambling_control, 1261 br->data(), br->numBitsLeft() / 8, pesOffset, event); 1262 1263 size_t payloadSizeBits = br->numBitsLeft(); 1264 if (payloadSizeBits % 8 != 0u) { 1265 return ERROR_MALFORMED; 1266 } 1267 1268 ALOGV("There's %zu bytes of payload, offset=%d", 1269 payloadSizeBits / 8, pesOffset); 1270 } 1271 } else if (stream_id == 0xbe) { // padding_stream 1272 if (PES_packet_length == 0u) { 1273 return ERROR_MALFORMED; 1274 } 1275 br->skipBits(PES_packet_length * 8); 1276 } else { 1277 if (PES_packet_length == 0u) { 1278 return ERROR_MALFORMED; 1279 } 1280 br->skipBits(PES_packet_length * 8); 1281 } 1282 1283 return OK; 1284 } 1285 1286 uint32_t ATSParser::Stream::getPesScramblingControl( 1287 ABitReader *br, int32_t *pesOffset) { 1288 unsigned packet_startcode_prefix = br->getBits(24); 1289 1290 ALOGV("packet_startcode_prefix = 0x%08x", packet_startcode_prefix); 1291 1292 if (packet_startcode_prefix != 1) { 1293 ALOGV("unit does not start with startcode."); 1294 return 0; 1295 } 1296 1297 if (br->numBitsLeft() < 48) { 1298 return 0; 1299 } 1300 1301 unsigned stream_id = br->getBits(8); 1302 ALOGV("stream_id = 0x%02x", stream_id); 1303 1304 br->skipBits(16); // PES_packet_length 1305 1306 if (stream_id != 0xbc // program_stream_map 1307 && stream_id != 0xbe // padding_stream 1308 && stream_id != 0xbf // private_stream_2 1309 && stream_id != 0xf0 // ECM 1310 && stream_id != 0xf1 // EMM 1311 && stream_id != 0xff // program_stream_directory 1312 && stream_id != 0xf2 // DSMCC 1313 && stream_id != 0xf8) { // H.222.1 type E 1314 if (br->getBits(2) != 2u) { 1315 return 0; 1316 } 1317 1318 unsigned PES_scrambling_control = br->getBits(2); 1319 ALOGV("PES_scrambling_control = %u", PES_scrambling_control); 1320 1321 if (PES_scrambling_control == 0) { 1322 return 0; 1323 } 1324 1325 br->skipBits(12); // don't care 1326 1327 unsigned PES_header_data_length = br->getBits(8); 1328 ALOGV("PES_header_data_length = %u", PES_header_data_length); 1329 1330 if (PES_header_data_length * 8 > br->numBitsLeft()) { 1331 return 0; 1332 } 1333 1334 *pesOffset = 9 + PES_header_data_length; 1335 ALOGD("found PES_scrambling_control=%d, PES offset=%d", 1336 PES_scrambling_control, *pesOffset); 1337 return PES_scrambling_control; 1338 } 1339 1340 return 0; 1341 } 1342 1343 status_t ATSParser::Stream::flushScrambled(SyncEvent *event) { 1344 if (mDescrambler == NULL) { 1345 ALOGE("received scrambled packets without descrambler!"); 1346 return UNKNOWN_ERROR; 1347 } 1348 1349 if (mDescrambledBuffer == NULL || mMem == NULL) { 1350 ALOGE("received scrambled packets without shared memory!"); 1351 1352 return UNKNOWN_ERROR; 1353 } 1354 1355 int32_t pesOffset = 0; 1356 int32_t descrambleSubSamples = 0, descrambleBytes = 0; 1357 uint32_t tsScramblingControl = 0, pesScramblingControl = 0; 1358 1359 // First, go over subsamples to find TS-level scrambling key id, and 1360 // calculate how many subsample we need to descramble (assuming we don't 1361 // have PES-level scrambling). 1362 for (auto it = mSubSamples.begin(); it != mSubSamples.end(); it++) { 1363 if (it->transport_scrambling_mode != 0) { 1364 // TODO: handle keyId change, use the first non-zero keyId for now. 1365 if (tsScramblingControl == 0) { 1366 tsScramblingControl = it->transport_scrambling_mode; 1367 } 1368 } 1369 if (tsScramblingControl == 0 || descrambleSubSamples == 0 1370 || !mQueue->isScrambled()) { 1371 descrambleSubSamples++; 1372 descrambleBytes += it->subSampleSize; 1373 } 1374 } 1375 // If not scrambled at TS-level, check PES-level scrambling 1376 if (tsScramblingControl == 0) { 1377 ABitReader br(mBuffer->data(), mBuffer->size()); 1378 pesScramblingControl = getPesScramblingControl(&br, &pesOffset); 1379 // If not scrambled at PES-level either, or scrambled at PES-level but 1380 // requires output to remain scrambled, we don't need to descramble 1381 // anything. 1382 if (pesScramblingControl == 0 || mQueue->isScrambled()) { 1383 descrambleSubSamples = 0; 1384 descrambleBytes = 0; 1385 } 1386 } 1387 1388 uint32_t sctrl = tsScramblingControl != 0 ? 1389 tsScramblingControl : pesScramblingControl; 1390 1391 // Perform the 1st pass descrambling if needed 1392 if (descrambleBytes > 0) { 1393 memcpy(mDescrambledBuffer->data(), mBuffer->data(), descrambleBytes); 1394 mDescrambledBuffer->setRange(0, descrambleBytes); 1395 1396 hidl_vec<SubSample> subSamples; 1397 subSamples.resize(descrambleSubSamples); 1398 1399 int32_t i = 0; 1400 for (auto it = mSubSamples.begin(); 1401 it != mSubSamples.end() && i < descrambleSubSamples; it++, i++) { 1402 if (it->transport_scrambling_mode != 0 || pesScramblingControl != 0) { 1403 subSamples[i].numBytesOfClearData = 0; 1404 subSamples[i].numBytesOfEncryptedData = it->subSampleSize; 1405 } else { 1406 subSamples[i].numBytesOfClearData = it->subSampleSize; 1407 subSamples[i].numBytesOfEncryptedData = 0; 1408 } 1409 } 1410 1411 uint64_t srcOffset = 0, dstOffset = 0; 1412 // If scrambled at PES-level, PES header should be skipped 1413 if (pesScramblingControl != 0) { 1414 srcOffset = dstOffset = pesOffset; 1415 subSamples[0].numBytesOfEncryptedData -= pesOffset; 1416 } 1417 1418 Status status = Status::OK; 1419 uint32_t bytesWritten = 0; 1420 hidl_string detailedError; 1421 1422 DestinationBuffer dstBuffer; 1423 dstBuffer.type = BufferType::SHARED_MEMORY; 1424 dstBuffer.nonsecureMemory = mDescramblerSrcBuffer; 1425 1426 auto returnVoid = mDescrambler->descramble( 1427 (ScramblingControl) sctrl, 1428 subSamples, 1429 mDescramblerSrcBuffer, 1430 srcOffset, 1431 dstBuffer, 1432 dstOffset, 1433 [&status, &bytesWritten, &detailedError] ( 1434 Status _status, uint32_t _bytesWritten, 1435 const hidl_string& _detailedError) { 1436 status = _status; 1437 bytesWritten = _bytesWritten; 1438 detailedError = _detailedError; 1439 }); 1440 1441 if (!returnVoid.isOk()) { 1442 ALOGE("[stream %d] descramble failed, trans=%s", 1443 mElementaryPID, returnVoid.description().c_str()); 1444 return UNKNOWN_ERROR; 1445 } 1446 1447 ALOGV("[stream %d] descramble succeeded, %d bytes", 1448 mElementaryPID, bytesWritten); 1449 memcpy(mBuffer->data(), mDescrambledBuffer->data(), descrambleBytes); 1450 } 1451 1452 if (mQueue->isScrambled()) { 1453 // Queue subSample info for scrambled queue 1454 sp<ABuffer> clearSizesBuffer = new ABuffer(mSubSamples.size() * 4); 1455 sp<ABuffer> encSizesBuffer = new ABuffer(mSubSamples.size() * 4); 1456 int32_t *clearSizePtr = (int32_t*)clearSizesBuffer->data(); 1457 int32_t *encSizePtr = (int32_t*)encSizesBuffer->data(); 1458 int32_t isSync = 0; 1459 int32_t i = 0; 1460 for (auto it = mSubSamples.begin(); 1461 it != mSubSamples.end(); it++, i++) { 1462 if ((it->transport_scrambling_mode == 0 1463 && pesScramblingControl == 0) 1464 || i < descrambleSubSamples) { 1465 clearSizePtr[i] = it->subSampleSize; 1466 encSizePtr[i] = 0; 1467 } else { 1468 clearSizePtr[i] = 0; 1469 encSizePtr[i] = it->subSampleSize; 1470 } 1471 isSync |= it->random_access_indicator; 1472 } 1473 // Pass the original TS subsample size now. The PES header adjust 1474 // will be applied when the scrambled AU is dequeued. 1475 mQueue->appendScrambledData( 1476 mBuffer->data(), mBuffer->size(), sctrl, 1477 isSync, clearSizesBuffer, encSizesBuffer); 1478 } 1479 1480 ABitReader br(mBuffer->data(), mBuffer->size()); 1481 status_t err = parsePES(&br, event); 1482 1483 if (err != OK) { 1484 ALOGE("[stream %d] failed to parse descrambled PES, err=%d", 1485 mElementaryPID, err); 1486 } 1487 1488 return err; 1489 } 1490 1491 1492 status_t ATSParser::Stream::flush(SyncEvent *event) { 1493 if (mBuffer == NULL || mBuffer->size() == 0) { 1494 return OK; 1495 } 1496 1497 ALOGV("flushing stream 0x%04x size = %zu", mElementaryPID, mBuffer->size()); 1498 1499 status_t err = OK; 1500 if (mScrambled) { 1501 err = flushScrambled(event); 1502 mSubSamples.clear(); 1503 } else { 1504 ABitReader br(mBuffer->data(), mBuffer->size()); 1505 err = parsePES(&br, event); 1506 } 1507 1508 mBuffer->setRange(0, 0); 1509 1510 return err; 1511 } 1512 1513 void ATSParser::Stream::onPayloadData( 1514 unsigned PTS_DTS_flags, uint64_t PTS, uint64_t /* DTS */, 1515 unsigned PES_scrambling_control, 1516 const uint8_t *data, size_t size, 1517 int32_t payloadOffset, SyncEvent *event) { 1518 #if 0 1519 ALOGI("payload streamType 0x%02x, PTS = 0x%016llx, dPTS = %lld", 1520 mStreamType, 1521 PTS, 1522 (int64_t)PTS - mPrevPTS); 1523 mPrevPTS = PTS; 1524 #endif 1525 1526 ALOGV("onPayloadData mStreamType=0x%02x size: %zu", mStreamType, size); 1527 1528 int64_t timeUs = 0ll; // no presentation timestamp available. 1529 if (PTS_DTS_flags == 2 || PTS_DTS_flags == 3) { 1530 timeUs = mProgram->convertPTSToTimestamp(PTS); 1531 } 1532 1533 status_t err = mQueue->appendData( 1534 data, size, timeUs, payloadOffset, PES_scrambling_control); 1535 1536 if (mEOSReached) { 1537 mQueue->signalEOS(); 1538 } 1539 1540 if (err != OK) { 1541 return; 1542 } 1543 1544 sp<ABuffer> accessUnit; 1545 bool found = false; 1546 while ((accessUnit = mQueue->dequeueAccessUnit()) != NULL) { 1547 if (mSource == NULL) { 1548 sp<MetaData> meta = mQueue->getFormat(); 1549 1550 if (meta != NULL) { 1551 ALOGV("Stream PID 0x%08x of type 0x%02x now has data.", 1552 mElementaryPID, mStreamType); 1553 1554 const char *mime; 1555 if (meta->findCString(kKeyMIMEType, &mime) 1556 && !strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_AVC)) { 1557 int32_t sync = 0; 1558 if (!accessUnit->meta()->findInt32("isSync", &sync) || !sync) { 1559 continue; 1560 } 1561 } 1562 mSource = new AnotherPacketSource(meta); 1563 mSource->queueAccessUnit(accessUnit); 1564 ALOGV("onPayloadData: created AnotherPacketSource PID 0x%08x of type 0x%02x", 1565 mElementaryPID, mStreamType); 1566 } 1567 } else if (mQueue->getFormat() != NULL) { 1568 // After a discontinuity we invalidate the queue's format 1569 // and won't enqueue any access units to the source until 1570 // the queue has reestablished the new format. 1571 1572 if (mSource->getFormat() == NULL) { 1573 mSource->setFormat(mQueue->getFormat()); 1574 } 1575 mSource->queueAccessUnit(accessUnit); 1576 } 1577 1578 // Every access unit has a pesStartOffset queued in |mPesStartOffsets|. 1579 off64_t pesStartOffset = -1; 1580 if (!mPesStartOffsets.empty()) { 1581 pesStartOffset = *mPesStartOffsets.begin(); 1582 mPesStartOffsets.erase(mPesStartOffsets.begin()); 1583 } 1584 1585 if (pesStartOffset >= 0 && (event != NULL) && !found && mQueue->getFormat() != NULL) { 1586 int32_t sync = 0; 1587 if (accessUnit->meta()->findInt32("isSync", &sync) && sync) { 1588 int64_t timeUs; 1589 if (accessUnit->meta()->findInt64("timeUs", &timeUs)) { 1590 found = true; 1591 event->init(pesStartOffset, mSource, timeUs, getSourceType()); 1592 } 1593 } 1594 } 1595 } 1596 } 1597 1598 ATSParser::SourceType ATSParser::Stream::getSourceType() { 1599 if (isVideo()) { 1600 return VIDEO; 1601 } else if (isAudio()) { 1602 return AUDIO; 1603 } else if (isMeta()) { 1604 return META; 1605 } 1606 return NUM_SOURCE_TYPES; 1607 } 1608 1609 sp<MediaSource> ATSParser::Stream::getSource(SourceType type) { 1610 switch (type) { 1611 case VIDEO: 1612 { 1613 if (isVideo()) { 1614 return mSource; 1615 } 1616 break; 1617 } 1618 1619 case AUDIO: 1620 { 1621 if (isAudio()) { 1622 return mSource; 1623 } 1624 break; 1625 } 1626 1627 case META: 1628 { 1629 if (isMeta()) { 1630 return mSource; 1631 } 1632 break; 1633 } 1634 1635 default: 1636 break; 1637 } 1638 1639 return NULL; 1640 } 1641 1642 void ATSParser::Stream::setCasInfo( 1643 int32_t systemId, const sp<IDescrambler> &descrambler, 1644 const std::vector<uint8_t> &sessionId) { 1645 if (mSource != NULL && mDescrambler == NULL && descrambler != NULL) { 1646 signalDiscontinuity(DISCONTINUITY_FORMAT_ONLY, NULL); 1647 mDescrambler = descrambler; 1648 if (mQueue->isScrambled()) { 1649 mQueue->setCasInfo(systemId, sessionId); 1650 } 1651 } 1652 } 1653 1654 //////////////////////////////////////////////////////////////////////////////// 1655 1656 ATSParser::ATSParser(uint32_t flags) 1657 : mFlags(flags), 1658 mAbsoluteTimeAnchorUs(-1ll), 1659 mTimeOffsetValid(false), 1660 mTimeOffsetUs(0ll), 1661 mLastRecoveredPTS(-1ll), 1662 mNumTSPacketsParsed(0), 1663 mNumPCRs(0) { 1664 mPSISections.add(0 /* PID */, new PSISection); 1665 mCasManager = new CasManager(); 1666 } 1667 1668 ATSParser::~ATSParser() { 1669 } 1670 1671 status_t ATSParser::feedTSPacket(const void *data, size_t size, 1672 SyncEvent *event) { 1673 if (size != kTSPacketSize) { 1674 ALOGE("Wrong TS packet size"); 1675 return BAD_VALUE; 1676 } 1677 1678 ABitReader br((const uint8_t *)data, kTSPacketSize); 1679 return parseTS(&br, event); 1680 } 1681 1682 status_t ATSParser::setMediaCas(const sp<ICas> &cas) { 1683 status_t err = mCasManager->setMediaCas(cas); 1684 if (err != OK) { 1685 return err; 1686 } 1687 for (size_t i = 0; i < mPrograms.size(); ++i) { 1688 mPrograms.editItemAt(i)->updateCasSessions(); 1689 } 1690 return OK; 1691 } 1692 1693 void ATSParser::signalDiscontinuity( 1694 DiscontinuityType type, const sp<AMessage> &extra) { 1695 int64_t mediaTimeUs; 1696 if ((type & DISCONTINUITY_TIME) && extra != NULL) { 1697 if (extra->findInt64(IStreamListener::kKeyMediaTimeUs, &mediaTimeUs)) { 1698 mAbsoluteTimeAnchorUs = mediaTimeUs; 1699 } 1700 if ((mFlags & TS_TIMESTAMPS_ARE_ABSOLUTE) 1701 && extra->findInt64( 1702 IStreamListener::kKeyRecentMediaTimeUs, &mediaTimeUs)) { 1703 if (mAbsoluteTimeAnchorUs >= 0ll) { 1704 mediaTimeUs -= mAbsoluteTimeAnchorUs; 1705 } 1706 if (mTimeOffsetValid) { 1707 mediaTimeUs -= mTimeOffsetUs; 1708 } 1709 mLastRecoveredPTS = (mediaTimeUs * 9) / 100; 1710 } 1711 } else if (type == DISCONTINUITY_ABSOLUTE_TIME) { 1712 int64_t timeUs; 1713 if (!extra->findInt64("timeUs", &timeUs)) { 1714 ALOGE("timeUs not found"); 1715 return; 1716 } 1717 1718 if (!mPrograms.empty()) { 1719 ALOGE("mPrograms is not empty"); 1720 return; 1721 } 1722 mAbsoluteTimeAnchorUs = timeUs; 1723 return; 1724 } else if (type == DISCONTINUITY_TIME_OFFSET) { 1725 int64_t offset; 1726 if (!extra->findInt64("offset", &offset)) { 1727 ALOGE("offset not found"); 1728 return; 1729 } 1730 1731 mTimeOffsetValid = true; 1732 mTimeOffsetUs = offset; 1733 return; 1734 } 1735 1736 for (size_t i = 0; i < mPrograms.size(); ++i) { 1737 mPrograms.editItemAt(i)->signalDiscontinuity(type, extra); 1738 } 1739 } 1740 1741 void ATSParser::signalEOS(status_t finalResult) { 1742 if (finalResult == (status_t) OK) { 1743 ALOGE("finalResult not OK"); 1744 return; 1745 } 1746 1747 for (size_t i = 0; i < mPrograms.size(); ++i) { 1748 mPrograms.editItemAt(i)->signalEOS(finalResult); 1749 } 1750 } 1751 1752 void ATSParser::parseProgramAssociationTable(ABitReader *br) { 1753 unsigned table_id = br->getBits(8); 1754 ALOGV(" table_id = %u", table_id); 1755 if (table_id != 0x00u) { 1756 ALOGE("PAT data error!"); 1757 return ; 1758 } 1759 unsigned section_syntax_indictor = br->getBits(1); 1760 ALOGV(" section_syntax_indictor = %u", section_syntax_indictor); 1761 1762 br->skipBits(1); // '0' 1763 MY_LOGV(" reserved = %u", br->getBits(2)); 1764 1765 unsigned section_length = br->getBits(12); 1766 ALOGV(" section_length = %u", section_length); 1767 1768 MY_LOGV(" transport_stream_id = %u", br->getBits(16)); 1769 MY_LOGV(" reserved = %u", br->getBits(2)); 1770 MY_LOGV(" version_number = %u", br->getBits(5)); 1771 MY_LOGV(" current_next_indicator = %u", br->getBits(1)); 1772 MY_LOGV(" section_number = %u", br->getBits(8)); 1773 MY_LOGV(" last_section_number = %u", br->getBits(8)); 1774 1775 size_t numProgramBytes = (section_length - 5 /* header */ - 4 /* crc */); 1776 1777 for (size_t i = 0; i < numProgramBytes / 4; ++i) { 1778 unsigned program_number = br->getBits(16); 1779 ALOGV(" program_number = %u", program_number); 1780 1781 MY_LOGV(" reserved = %u", br->getBits(3)); 1782 1783 if (program_number == 0) { 1784 MY_LOGV(" network_PID = 0x%04x", br->getBits(13)); 1785 } else { 1786 unsigned programMapPID = br->getBits(13); 1787 1788 ALOGV(" program_map_PID = 0x%04x", programMapPID); 1789 1790 bool found = false; 1791 for (size_t index = 0; index < mPrograms.size(); ++index) { 1792 const sp<Program> &program = mPrograms.itemAt(index); 1793 1794 if (program->number() == program_number) { 1795 program->updateProgramMapPID(programMapPID); 1796 found = true; 1797 break; 1798 } 1799 } 1800 1801 if (!found) { 1802 mPrograms.push( 1803 new Program(this, program_number, programMapPID, mLastRecoveredPTS)); 1804 if (mSampleAesKeyItem != NULL) { 1805 mPrograms.top()->signalNewSampleAesKey(mSampleAesKeyItem); 1806 } 1807 } 1808 1809 if (mPSISections.indexOfKey(programMapPID) < 0) { 1810 mPSISections.add(programMapPID, new PSISection); 1811 } 1812 } 1813 } 1814 1815 MY_LOGV(" CRC = 0x%08x", br->getBits(32)); 1816 } 1817 1818 status_t ATSParser::parsePID( 1819 ABitReader *br, unsigned PID, 1820 unsigned continuity_counter, 1821 unsigned payload_unit_start_indicator, 1822 unsigned transport_scrambling_control, 1823 unsigned random_access_indicator, 1824 SyncEvent *event) { 1825 ssize_t sectionIndex = mPSISections.indexOfKey(PID); 1826 1827 if (sectionIndex >= 0) { 1828 sp<PSISection> section = mPSISections.valueAt(sectionIndex); 1829 1830 if (payload_unit_start_indicator) { 1831 if (!section->isEmpty()) { 1832 ALOGW("parsePID encounters payload_unit_start_indicator when section is not empty"); 1833 section->clear(); 1834 } 1835 1836 unsigned skip = br->getBits(8); 1837 section->setSkipBytes(skip + 1); // skip filler bytes + pointer field itself 1838 br->skipBits(skip * 8); 1839 } 1840 1841 if (br->numBitsLeft() % 8 != 0) { 1842 return ERROR_MALFORMED; 1843 } 1844 status_t err = section->append(br->data(), br->numBitsLeft() / 8); 1845 1846 if (err != OK) { 1847 return err; 1848 } 1849 1850 if (!section->isComplete()) { 1851 return OK; 1852 } 1853 1854 if (!section->isCRCOkay()) { 1855 return BAD_VALUE; 1856 } 1857 ABitReader sectionBits(section->data(), section->size()); 1858 1859 if (PID == 0) { 1860 parseProgramAssociationTable(§ionBits); 1861 } else { 1862 bool handled = false; 1863 for (size_t i = 0; i < mPrograms.size(); ++i) { 1864 status_t err; 1865 if (!mPrograms.editItemAt(i)->parsePSISection( 1866 PID, §ionBits, &err)) { 1867 continue; 1868 } 1869 1870 if (err != OK) { 1871 return err; 1872 } 1873 1874 handled = true; 1875 break; 1876 } 1877 1878 if (!handled) { 1879 mPSISections.removeItem(PID); 1880 section.clear(); 1881 } 1882 } 1883 1884 if (section != NULL) { 1885 section->clear(); 1886 } 1887 1888 return OK; 1889 } 1890 1891 bool handled = false; 1892 for (size_t i = 0; i < mPrograms.size(); ++i) { 1893 status_t err; 1894 if (mPrograms.editItemAt(i)->parsePID( 1895 PID, continuity_counter, 1896 payload_unit_start_indicator, 1897 transport_scrambling_control, 1898 random_access_indicator, 1899 br, &err, event)) { 1900 if (err != OK) { 1901 return err; 1902 } 1903 1904 handled = true; 1905 break; 1906 } 1907 } 1908 1909 if (!handled) { 1910 handled = mCasManager->parsePID(br, PID); 1911 } 1912 1913 if (!handled) { 1914 ALOGV("PID 0x%04x not handled.", PID); 1915 } 1916 1917 return OK; 1918 } 1919 1920 status_t ATSParser::parseAdaptationField( 1921 ABitReader *br, unsigned PID, unsigned *random_access_indicator) { 1922 *random_access_indicator = 0; 1923 unsigned adaptation_field_length = br->getBits(8); 1924 1925 if (adaptation_field_length > 0) { 1926 if (adaptation_field_length * 8 > br->numBitsLeft()) { 1927 ALOGV("Adaptation field should be included in a single TS packet."); 1928 return ERROR_MALFORMED; 1929 } 1930 1931 unsigned discontinuity_indicator = br->getBits(1); 1932 1933 if (discontinuity_indicator) { 1934 ALOGV("PID 0x%04x: discontinuity_indicator = 1 (!!!)", PID); 1935 } 1936 1937 *random_access_indicator = br->getBits(1); 1938 if (*random_access_indicator) { 1939 ALOGV("PID 0x%04x: random_access_indicator = 1", PID); 1940 } 1941 1942 unsigned elementary_stream_priority_indicator = br->getBits(1); 1943 if (elementary_stream_priority_indicator) { 1944 ALOGV("PID 0x%04x: elementary_stream_priority_indicator = 1", PID); 1945 } 1946 1947 unsigned PCR_flag = br->getBits(1); 1948 1949 size_t numBitsRead = 4; 1950 1951 if (PCR_flag) { 1952 if (adaptation_field_length * 8 < 52) { 1953 return ERROR_MALFORMED; 1954 } 1955 br->skipBits(4); 1956 uint64_t PCR_base = br->getBits(32); 1957 PCR_base = (PCR_base << 1) | br->getBits(1); 1958 1959 br->skipBits(6); 1960 unsigned PCR_ext = br->getBits(9); 1961 1962 // The number of bytes from the start of the current 1963 // MPEG2 transport stream packet up and including 1964 // the final byte of this PCR_ext field. 1965 size_t byteOffsetFromStartOfTSPacket = 1966 (188 - br->numBitsLeft() / 8); 1967 1968 uint64_t PCR = PCR_base * 300 + PCR_ext; 1969 1970 ALOGV("PID 0x%04x: PCR = 0x%016" PRIx64 " (%.2f)", 1971 PID, PCR, PCR / 27E6); 1972 1973 // The number of bytes received by this parser up to and 1974 // including the final byte of this PCR_ext field. 1975 uint64_t byteOffsetFromStart = 1976 uint64_t(mNumTSPacketsParsed) * 188 + byteOffsetFromStartOfTSPacket; 1977 1978 for (size_t i = 0; i < mPrograms.size(); ++i) { 1979 updatePCR(PID, PCR, byteOffsetFromStart); 1980 } 1981 1982 numBitsRead += 52; 1983 } 1984 1985 br->skipBits(adaptation_field_length * 8 - numBitsRead); 1986 } 1987 return OK; 1988 } 1989 1990 status_t ATSParser::parseTS(ABitReader *br, SyncEvent *event) { 1991 ALOGV("---"); 1992 1993 unsigned sync_byte = br->getBits(8); 1994 if (sync_byte != 0x47u) { 1995 ALOGE("[error] parseTS: return error as sync_byte=0x%x", sync_byte); 1996 return BAD_VALUE; 1997 } 1998 1999 if (br->getBits(1)) { // transport_error_indicator 2000 // silently ignore. 2001 return OK; 2002 } 2003 2004 unsigned payload_unit_start_indicator = br->getBits(1); 2005 ALOGV("payload_unit_start_indicator = %u", payload_unit_start_indicator); 2006 2007 MY_LOGV("transport_priority = %u", br->getBits(1)); 2008 2009 unsigned PID = br->getBits(13); 2010 ALOGV("PID = 0x%04x", PID); 2011 2012 unsigned transport_scrambling_control = br->getBits(2); 2013 ALOGV("transport_scrambling_control = %u", transport_scrambling_control); 2014 2015 unsigned adaptation_field_control = br->getBits(2); 2016 ALOGV("adaptation_field_control = %u", adaptation_field_control); 2017 2018 unsigned continuity_counter = br->getBits(4); 2019 ALOGV("PID = 0x%04x, continuity_counter = %u", PID, continuity_counter); 2020 2021 // ALOGI("PID = 0x%04x, continuity_counter = %u", PID, continuity_counter); 2022 2023 status_t err = OK; 2024 2025 unsigned random_access_indicator = 0; 2026 if (adaptation_field_control == 2 || adaptation_field_control == 3) { 2027 err = parseAdaptationField(br, PID, &random_access_indicator); 2028 } 2029 if (err == OK) { 2030 if (adaptation_field_control == 1 || adaptation_field_control == 3) { 2031 err = parsePID(br, PID, continuity_counter, 2032 payload_unit_start_indicator, 2033 transport_scrambling_control, 2034 random_access_indicator, 2035 event); 2036 } 2037 } 2038 2039 ++mNumTSPacketsParsed; 2040 2041 return err; 2042 } 2043 2044 sp<MediaSource> ATSParser::getSource(SourceType type) { 2045 sp<MediaSource> firstSourceFound; 2046 for (size_t i = 0; i < mPrograms.size(); ++i) { 2047 const sp<Program> &program = mPrograms.editItemAt(i); 2048 sp<MediaSource> source = program->getSource(type); 2049 if (source == NULL) { 2050 continue; 2051 } 2052 if (firstSourceFound == NULL) { 2053 firstSourceFound = source; 2054 } 2055 // Prefer programs with both audio/video 2056 switch (type) { 2057 case VIDEO: { 2058 if (program->hasSource(AUDIO)) { 2059 return source; 2060 } 2061 break; 2062 } 2063 2064 case AUDIO: { 2065 if (program->hasSource(VIDEO)) { 2066 return source; 2067 } 2068 break; 2069 } 2070 2071 default: 2072 return source; 2073 } 2074 } 2075 2076 return firstSourceFound; 2077 } 2078 2079 bool ATSParser::hasSource(SourceType type) const { 2080 for (size_t i = 0; i < mPrograms.size(); ++i) { 2081 const sp<Program> &program = mPrograms.itemAt(i); 2082 if (program->hasSource(type)) { 2083 return true; 2084 } 2085 } 2086 2087 return false; 2088 } 2089 2090 bool ATSParser::PTSTimeDeltaEstablished() { 2091 if (mPrograms.isEmpty()) { 2092 return false; 2093 } 2094 2095 return mPrograms.editItemAt(0)->PTSTimeDeltaEstablished(); 2096 } 2097 2098 int64_t ATSParser::getFirstPTSTimeUs() { 2099 for (size_t i = 0; i < mPrograms.size(); ++i) { 2100 sp<ATSParser::Program> program = mPrograms.itemAt(i); 2101 if (program->PTSTimeDeltaEstablished()) { 2102 return (program->firstPTS() * 100) / 9; 2103 } 2104 } 2105 return -1; 2106 } 2107 2108 __attribute__((no_sanitize("integer"))) 2109 void ATSParser::updatePCR( 2110 unsigned /* PID */, uint64_t PCR, uint64_t byteOffsetFromStart) { 2111 ALOGV("PCR 0x%016" PRIx64 " @ %" PRIx64, PCR, byteOffsetFromStart); 2112 2113 if (mNumPCRs == 2) { 2114 mPCR[0] = mPCR[1]; 2115 mPCRBytes[0] = mPCRBytes[1]; 2116 mSystemTimeUs[0] = mSystemTimeUs[1]; 2117 mNumPCRs = 1; 2118 } 2119 2120 mPCR[mNumPCRs] = PCR; 2121 mPCRBytes[mNumPCRs] = byteOffsetFromStart; 2122 mSystemTimeUs[mNumPCRs] = ALooper::GetNowUs(); 2123 2124 ++mNumPCRs; 2125 2126 if (mNumPCRs == 2) { 2127 /* Unsigned overflow here */ 2128 double transportRate = 2129 (mPCRBytes[1] - mPCRBytes[0]) * 27E6 / (mPCR[1] - mPCR[0]); 2130 2131 ALOGV("transportRate = %.2f bytes/sec", transportRate); 2132 } 2133 } 2134 2135 //////////////////////////////////////////////////////////////////////////////// 2136 2137 2138 // CRC32 used for PSI section. The table was generated by following command: 2139 // $ python pycrc.py --model crc-32-mpeg --algorithm table-driven --generate c 2140 // Visit http://www.tty1.net/pycrc/index_en.html for more details. 2141 uint32_t ATSParser::PSISection::CRC_TABLE[] = { 2142 0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9, 2143 0x130476dc, 0x17c56b6b, 0x1a864db2, 0x1e475005, 2144 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61, 2145 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd, 2146 0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9, 2147 0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75, 2148 0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011, 2149 0x791d4014, 0x7ddc5da3, 0x709f7b7a, 0x745e66cd, 2150 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039, 2151 0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, 2152 0xbe2b5b58, 0xbaea46ef, 0xb7a96036, 0xb3687d81, 2153 0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d, 2154 0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49, 2155 0xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95, 2156 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1, 2157 0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, 2158 0x34867077, 0x30476dc0, 0x3d044b19, 0x39c556ae, 2159 0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072, 2160 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16, 2161 0x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca, 2162 0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde, 2163 0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02, 2164 0x5e9f46bf, 0x5a5e5b08, 0x571d7dd1, 0x53dc6066, 2165 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba, 2166 0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, 2167 0xbfa1b04b, 0xbb60adfc, 0xb6238b25, 0xb2e29692, 2168 0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6, 2169 0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a, 2170 0xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e, 2171 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2, 2172 0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686, 2173 0xd5b88683, 0xd1799b34, 0xdc3abded, 0xd8fba05a, 2174 0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637, 2175 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb, 2176 0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f, 2177 0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53, 2178 0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47, 2179 0x36194d42, 0x32d850f5, 0x3f9b762c, 0x3b5a6b9b, 2180 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff, 2181 0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623, 2182 0xf12f560e, 0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7, 2183 0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b, 2184 0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f, 2185 0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3, 2186 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7, 2187 0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b, 2188 0x9b3660c6, 0x9ff77d71, 0x92b45ba8, 0x9675461f, 2189 0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3, 2190 0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640, 2191 0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c, 2192 0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8, 2193 0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24, 2194 0x119b4be9, 0x155a565e, 0x18197087, 0x1cd86d30, 2195 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec, 2196 0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, 2197 0x2497d08d, 0x2056cd3a, 0x2d15ebe3, 0x29d4f654, 2198 0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0, 2199 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c, 2200 0xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18, 2201 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4, 2202 0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0, 2203 0x9abc8bd5, 0x9e7d9662, 0x933eb0bb, 0x97ffad0c, 2204 0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668, 2205 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4 2206 }; 2207 2208 ATSParser::PSISection::PSISection() : 2209 mSkipBytes(0) { 2210 } 2211 2212 ATSParser::PSISection::~PSISection() { 2213 } 2214 2215 status_t ATSParser::PSISection::append(const void *data, size_t size) { 2216 if (mBuffer == NULL || mBuffer->size() + size > mBuffer->capacity()) { 2217 size_t newCapacity = 2218 (mBuffer == NULL) ? size : mBuffer->capacity() + size; 2219 2220 newCapacity = (newCapacity + 1023) & ~1023; 2221 2222 sp<ABuffer> newBuffer = new ABuffer(newCapacity); 2223 2224 if (mBuffer != NULL) { 2225 memcpy(newBuffer->data(), mBuffer->data(), mBuffer->size()); 2226 newBuffer->setRange(0, mBuffer->size()); 2227 } else { 2228 newBuffer->setRange(0, 0); 2229 } 2230 2231 mBuffer = newBuffer; 2232 } 2233 2234 memcpy(mBuffer->data() + mBuffer->size(), data, size); 2235 mBuffer->setRange(0, mBuffer->size() + size); 2236 2237 return OK; 2238 } 2239 2240 void ATSParser::PSISection::setSkipBytes(uint8_t skip) { 2241 mSkipBytes = skip; 2242 } 2243 2244 void ATSParser::PSISection::clear() { 2245 if (mBuffer != NULL) { 2246 mBuffer->setRange(0, 0); 2247 } 2248 mSkipBytes = 0; 2249 } 2250 2251 bool ATSParser::PSISection::isComplete() const { 2252 if (mBuffer == NULL || mBuffer->size() < 3) { 2253 return false; 2254 } 2255 2256 unsigned sectionLength = U16_AT(mBuffer->data() + 1) & 0xfff; 2257 return mBuffer->size() >= sectionLength + 3; 2258 } 2259 2260 bool ATSParser::PSISection::isEmpty() const { 2261 return mBuffer == NULL || mBuffer->size() == 0; 2262 } 2263 2264 const uint8_t *ATSParser::PSISection::data() const { 2265 return mBuffer == NULL ? NULL : mBuffer->data(); 2266 } 2267 2268 size_t ATSParser::PSISection::size() const { 2269 return mBuffer == NULL ? 0 : mBuffer->size(); 2270 } 2271 2272 bool ATSParser::PSISection::isCRCOkay() const { 2273 if (!isComplete()) { 2274 return false; 2275 } 2276 uint8_t* data = mBuffer->data(); 2277 2278 // Return true if section_syntax_indicator says no section follows the field section_length. 2279 if ((data[1] & 0x80) == 0) { 2280 return true; 2281 } 2282 2283 unsigned sectionLength = U16_AT(data + 1) & 0xfff; 2284 ALOGV("sectionLength %u, skip %u", sectionLength, mSkipBytes); 2285 2286 2287 if(sectionLength < mSkipBytes) { 2288 ALOGE("b/28333006"); 2289 android_errorWriteLog(0x534e4554, "28333006"); 2290 return false; 2291 } 2292 2293 // Skip the preceding field present when payload start indicator is on. 2294 sectionLength -= mSkipBytes; 2295 2296 uint32_t crc = 0xffffffff; 2297 for(unsigned i = 0; i < sectionLength + 4 /* crc */; i++) { 2298 uint8_t b = data[i]; 2299 int index = ((crc >> 24) ^ (b & 0xff)) & 0xff; 2300 crc = CRC_TABLE[index] ^ (crc << 8); 2301 } 2302 ALOGV("crc: %08x\n", crc); 2303 return (crc == 0); 2304 } 2305 2306 // SAMPLE_AES key handling 2307 // TODO: Merge these to their respective class after Widevine-HLS 2308 void ATSParser::signalNewSampleAesKey(const sp<AMessage> &keyItem) { 2309 ALOGD("signalNewSampleAesKey: %p", keyItem.get()); 2310 2311 mSampleAesKeyItem = keyItem; 2312 2313 // a NULL key item will propagate to existing ElementaryStreamQueues 2314 for (size_t i = 0; i < mPrograms.size(); ++i) { 2315 mPrograms[i]->signalNewSampleAesKey(keyItem); 2316 } 2317 } 2318 2319 void ATSParser::Program::signalNewSampleAesKey(const sp<AMessage> &keyItem) { 2320 ALOGD("Program::signalNewSampleAesKey: %p", keyItem.get()); 2321 2322 mSampleAesKeyItem = keyItem; 2323 2324 // a NULL key item will propagate to existing ElementaryStreamQueues 2325 for (size_t i = 0; i < mStreams.size(); ++i) { 2326 mStreams[i]->signalNewSampleAesKey(keyItem); 2327 } 2328 } 2329 2330 void ATSParser::Stream::signalNewSampleAesKey(const sp<AMessage> &keyItem) { 2331 ALOGD("Stream::signalNewSampleAesKey: 0x%04x size = %zu keyItem: %p", 2332 mElementaryPID, mBuffer->size(), keyItem.get()); 2333 2334 // a NULL key item will propagate to existing ElementaryStreamQueues 2335 mSampleAesKeyItem = keyItem; 2336 2337 flush(NULL); 2338 mQueue->signalNewSampleAesKey(keyItem); 2339 } 2340 2341 } // namespace android 2342