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