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 21 #include "ATSParser.h" 22 23 #include "AnotherPacketSource.h" 24 #include "ESQueue.h" 25 #include "include/avc_utils.h" 26 27 #include <media/stagefright/foundation/ABitReader.h> 28 #include <media/stagefright/foundation/ABuffer.h> 29 #include <media/stagefright/foundation/ADebug.h> 30 #include <media/stagefright/foundation/AMessage.h> 31 #include <media/stagefright/foundation/hexdump.h> 32 #include <media/stagefright/MediaDefs.h> 33 #include <media/stagefright/MediaErrors.h> 34 #include <media/stagefright/MetaData.h> 35 #include <media/stagefright/Utils.h> 36 #include <media/IStreamSource.h> 37 #include <utils/KeyedVector.h> 38 #include <utils/Vector.h> 39 40 #include <inttypes.h> 41 42 namespace android { 43 44 // I want the expression "y" evaluated even if verbose logging is off. 45 #define MY_LOGV(x, y) \ 46 do { unsigned tmp = y; ALOGV(x, tmp); } while (0) 47 48 static const size_t kTSPacketSize = 188; 49 50 struct ATSParser::Program : public RefBase { 51 Program(ATSParser *parser, unsigned programNumber, unsigned programMapPID, 52 int64_t lastRecoveredPTS); 53 54 bool parsePSISection( 55 unsigned pid, ABitReader *br, status_t *err); 56 57 // Pass to appropriate stream according to pid, and set event if it's a PES 58 // with a sync frame. 59 // Note that the method itself does not touch event. 60 bool parsePID( 61 unsigned pid, unsigned continuity_counter, 62 unsigned payload_unit_start_indicator, 63 ABitReader *br, status_t *err, SyncEvent *event); 64 65 void signalDiscontinuity( 66 DiscontinuityType type, const sp<AMessage> &extra); 67 68 void signalEOS(status_t finalResult); 69 70 sp<MediaSource> getSource(SourceType type); 71 bool hasSource(SourceType type) const; 72 73 int64_t convertPTSToTimestamp(uint64_t PTS); 74 75 bool PTSTimeDeltaEstablished() const { 76 return mFirstPTSValid; 77 } 78 79 unsigned number() const { return mProgramNumber; } 80 81 void updateProgramMapPID(unsigned programMapPID) { 82 mProgramMapPID = programMapPID; 83 } 84 85 unsigned programMapPID() const { 86 return mProgramMapPID; 87 } 88 89 uint32_t parserFlags() const { 90 return mParser->mFlags; 91 } 92 93 private: 94 struct StreamInfo { 95 unsigned mType; 96 unsigned mPID; 97 }; 98 99 ATSParser *mParser; 100 unsigned mProgramNumber; 101 unsigned mProgramMapPID; 102 KeyedVector<unsigned, sp<Stream> > mStreams; 103 bool mFirstPTSValid; 104 uint64_t mFirstPTS; 105 int64_t mLastRecoveredPTS; 106 107 status_t parseProgramMap(ABitReader *br); 108 int64_t recoverPTS(uint64_t PTS_33bit); 109 bool switchPIDs(const Vector<StreamInfo> &infos); 110 111 DISALLOW_EVIL_CONSTRUCTORS(Program); 112 }; 113 114 struct ATSParser::Stream : public RefBase { 115 Stream(Program *program, 116 unsigned elementaryPID, 117 unsigned streamType, 118 unsigned PCR_PID); 119 120 unsigned type() const { return mStreamType; } 121 unsigned pid() const { return mElementaryPID; } 122 void setPID(unsigned pid) { mElementaryPID = pid; } 123 124 // Parse the payload and set event when PES with a sync frame is detected. 125 // This method knows when a PES starts; so record mPesStartOffset in that 126 // case. 127 status_t parse( 128 unsigned continuity_counter, 129 unsigned payload_unit_start_indicator, 130 ABitReader *br, 131 SyncEvent *event); 132 133 void signalDiscontinuity( 134 DiscontinuityType type, const sp<AMessage> &extra); 135 136 void signalEOS(status_t finalResult); 137 138 sp<MediaSource> getSource(SourceType type); 139 140 bool isAudio() const; 141 bool isVideo() const; 142 bool isMeta() const; 143 144 protected: 145 virtual ~Stream(); 146 147 private: 148 Program *mProgram; 149 unsigned mElementaryPID; 150 unsigned mStreamType; 151 unsigned mPCR_PID; 152 int32_t mExpectedContinuityCounter; 153 154 sp<ABuffer> mBuffer; 155 sp<AnotherPacketSource> mSource; 156 bool mPayloadStarted; 157 bool mEOSReached; 158 159 uint64_t mPrevPTS; 160 off64_t mPesStartOffset; 161 162 ElementaryStreamQueue *mQueue; 163 164 // Flush accumulated payload if necessary --- i.e. at EOS or at the start of 165 // another payload. event is set if the flushed payload is PES with a sync 166 // frame. 167 status_t flush(SyncEvent *event); 168 // Strip and parse PES headers and pass remaining payload into onPayload 169 // with parsed metadata. event is set if the PES contains a sync frame. 170 status_t parsePES(ABitReader *br, SyncEvent *event); 171 172 // Feed the payload into mQueue and if a packet is identified, queue it 173 // into mSource. If the packet is a sync frame. set event with start offset 174 // and timestamp of the packet. 175 void onPayloadData( 176 unsigned PTS_DTS_flags, uint64_t PTS, uint64_t DTS, 177 const uint8_t *data, size_t size, SyncEvent *event); 178 179 DISALLOW_EVIL_CONSTRUCTORS(Stream); 180 }; 181 182 struct ATSParser::PSISection : public RefBase { 183 PSISection(); 184 185 status_t append(const void *data, size_t size); 186 void setSkipBytes(uint8_t skip); 187 void clear(); 188 189 bool isComplete() const; 190 bool isEmpty() const; 191 bool isCRCOkay() const; 192 193 const uint8_t *data() const; 194 size_t size() const; 195 196 protected: 197 virtual ~PSISection(); 198 199 private: 200 sp<ABuffer> mBuffer; 201 uint8_t mSkipBytes; 202 static uint32_t CRC_TABLE[]; 203 204 DISALLOW_EVIL_CONSTRUCTORS(PSISection); 205 }; 206 207 ATSParser::SyncEvent::SyncEvent(off64_t offset) 208 : mInit(false), mOffset(offset), mTimeUs(0) {} 209 210 void ATSParser::SyncEvent::init(off64_t offset, const sp<MediaSource> &source, 211 int64_t timeUs) { 212 mInit = true; 213 mOffset = offset; 214 mMediaSource = source; 215 mTimeUs = timeUs; 216 } 217 218 //////////////////////////////////////////////////////////////////////////////// 219 220 ATSParser::Program::Program( 221 ATSParser *parser, unsigned programNumber, unsigned programMapPID, 222 int64_t lastRecoveredPTS) 223 : mParser(parser), 224 mProgramNumber(programNumber), 225 mProgramMapPID(programMapPID), 226 mFirstPTSValid(false), 227 mFirstPTS(0), 228 mLastRecoveredPTS(lastRecoveredPTS) { 229 ALOGV("new program number %u", programNumber); 230 } 231 232 bool ATSParser::Program::parsePSISection( 233 unsigned pid, ABitReader *br, status_t *err) { 234 *err = OK; 235 236 if (pid != mProgramMapPID) { 237 return false; 238 } 239 240 *err = parseProgramMap(br); 241 242 return true; 243 } 244 245 bool ATSParser::Program::parsePID( 246 unsigned pid, unsigned continuity_counter, 247 unsigned payload_unit_start_indicator, 248 ABitReader *br, status_t *err, SyncEvent *event) { 249 *err = OK; 250 251 ssize_t index = mStreams.indexOfKey(pid); 252 if (index < 0) { 253 return false; 254 } 255 256 *err = mStreams.editValueAt(index)->parse( 257 continuity_counter, payload_unit_start_indicator, br, event); 258 259 return true; 260 } 261 262 void ATSParser::Program::signalDiscontinuity( 263 DiscontinuityType type, const sp<AMessage> &extra) { 264 int64_t mediaTimeUs; 265 if ((type & DISCONTINUITY_TIME) 266 && extra != NULL 267 && extra->findInt64( 268 IStreamListener::kKeyMediaTimeUs, &mediaTimeUs)) { 269 mFirstPTSValid = false; 270 } 271 272 for (size_t i = 0; i < mStreams.size(); ++i) { 273 mStreams.editValueAt(i)->signalDiscontinuity(type, extra); 274 } 275 } 276 277 void ATSParser::Program::signalEOS(status_t finalResult) { 278 for (size_t i = 0; i < mStreams.size(); ++i) { 279 mStreams.editValueAt(i)->signalEOS(finalResult); 280 } 281 } 282 283 bool ATSParser::Program::switchPIDs(const Vector<StreamInfo> &infos) { 284 bool success = false; 285 286 if (mStreams.size() == infos.size()) { 287 // build type->PIDs map for old and new mapping 288 size_t i; 289 KeyedVector<int32_t, Vector<int32_t> > oldType2PIDs, newType2PIDs; 290 for (i = 0; i < mStreams.size(); ++i) { 291 ssize_t index = oldType2PIDs.indexOfKey(mStreams[i]->type()); 292 if (index < 0) { 293 oldType2PIDs.add(mStreams[i]->type(), Vector<int32_t>()); 294 } 295 oldType2PIDs.editValueFor(mStreams[i]->type()).push_back(mStreams[i]->pid()); 296 } 297 for (i = 0; i < infos.size(); ++i) { 298 ssize_t index = newType2PIDs.indexOfKey(infos[i].mType); 299 if (index < 0) { 300 newType2PIDs.add(infos[i].mType, Vector<int32_t>()); 301 } 302 newType2PIDs.editValueFor(infos[i].mType).push_back(infos[i].mPID); 303 } 304 305 // we can recover if the number of streams for each type hasn't changed 306 if (oldType2PIDs.size() == newType2PIDs.size()) { 307 success = true; 308 for (i = 0; i < oldType2PIDs.size(); ++i) { 309 // KeyedVector is sorted, we just compare key and size of each index 310 if (oldType2PIDs.keyAt(i) != newType2PIDs.keyAt(i) 311 || oldType2PIDs[i].size() != newType2PIDs[i].size()) { 312 success = false; 313 break; 314 } 315 } 316 } 317 318 if (success) { 319 // save current streams to temp 320 KeyedVector<int32_t, sp<Stream> > temp; 321 for (i = 0; i < mStreams.size(); ++i) { 322 temp.add(mStreams.keyAt(i), mStreams.editValueAt(i)); 323 } 324 325 mStreams.clear(); 326 for (i = 0; i < temp.size(); ++i) { 327 // The two checks below shouldn't happen, 328 // we already checked above the stream count matches 329 ssize_t index = newType2PIDs.indexOfKey(temp[i]->type()); 330 if (index < 0) { 331 return false; 332 } 333 Vector<int32_t> &newPIDs = newType2PIDs.editValueAt(index); 334 if (newPIDs.isEmpty()) { 335 return false; 336 } 337 338 // get the next PID for temp[i]->type() in the new PID map 339 Vector<int32_t>::iterator it = newPIDs.begin(); 340 341 // change the PID of the stream, and add it back 342 temp.editValueAt(i)->setPID(*it); 343 mStreams.add(temp[i]->pid(), temp.editValueAt(i)); 344 345 // removed the used PID 346 newPIDs.erase(it); 347 } 348 } 349 } 350 return success; 351 } 352 353 status_t ATSParser::Program::parseProgramMap(ABitReader *br) { 354 unsigned table_id = br->getBits(8); 355 ALOGV(" table_id = %u", table_id); 356 if (table_id != 0x02u) { 357 ALOGE("PMT data error!"); 358 return ERROR_MALFORMED; 359 } 360 unsigned section_syntax_indicator = br->getBits(1); 361 ALOGV(" section_syntax_indicator = %u", section_syntax_indicator); 362 if (section_syntax_indicator != 1u) { 363 ALOGE("PMT data error!"); 364 return ERROR_MALFORMED; 365 } 366 367 br->skipBits(1); // '0' 368 MY_LOGV(" reserved = %u", br->getBits(2)); 369 370 unsigned section_length = br->getBits(12); 371 ALOGV(" section_length = %u", section_length); 372 373 MY_LOGV(" program_number = %u", br->getBits(16)); 374 MY_LOGV(" reserved = %u", br->getBits(2)); 375 MY_LOGV(" version_number = %u", br->getBits(5)); 376 MY_LOGV(" current_next_indicator = %u", br->getBits(1)); 377 MY_LOGV(" section_number = %u", br->getBits(8)); 378 MY_LOGV(" last_section_number = %u", br->getBits(8)); 379 MY_LOGV(" reserved = %u", br->getBits(3)); 380 381 unsigned PCR_PID = br->getBits(13); 382 ALOGV(" PCR_PID = 0x%04x", PCR_PID); 383 384 MY_LOGV(" reserved = %u", br->getBits(4)); 385 386 unsigned program_info_length = br->getBits(12); 387 ALOGV(" program_info_length = %u", program_info_length); 388 389 br->skipBits(program_info_length * 8); // skip descriptors 390 391 Vector<StreamInfo> infos; 392 393 // infoBytesRemaining is the number of bytes that make up the 394 // variable length section of ES_infos. It does not include the 395 // final CRC. 396 size_t infoBytesRemaining = section_length - 9 - program_info_length - 4; 397 398 while (infoBytesRemaining >= 5) { 399 400 unsigned streamType = br->getBits(8); 401 ALOGV(" stream_type = 0x%02x", streamType); 402 403 MY_LOGV(" reserved = %u", br->getBits(3)); 404 405 unsigned elementaryPID = br->getBits(13); 406 ALOGV(" elementary_PID = 0x%04x", elementaryPID); 407 408 MY_LOGV(" reserved = %u", br->getBits(4)); 409 410 unsigned ES_info_length = br->getBits(12); 411 ALOGV(" ES_info_length = %u", ES_info_length); 412 413 #if 0 414 br->skipBits(ES_info_length * 8); // skip descriptors 415 #else 416 unsigned info_bytes_remaining = ES_info_length; 417 while (info_bytes_remaining >= 2) { 418 MY_LOGV(" tag = 0x%02x", br->getBits(8)); 419 420 unsigned descLength = br->getBits(8); 421 ALOGV(" len = %u", descLength); 422 423 if (info_bytes_remaining < descLength) { 424 return ERROR_MALFORMED; 425 } 426 br->skipBits(descLength * 8); 427 428 info_bytes_remaining -= descLength + 2; 429 } 430 #endif 431 432 StreamInfo info; 433 info.mType = streamType; 434 info.mPID = elementaryPID; 435 infos.push(info); 436 437 infoBytesRemaining -= 5 + ES_info_length; 438 } 439 440 if (infoBytesRemaining != 0) { 441 ALOGW("Section data remains unconsumed"); 442 } 443 MY_LOGV(" CRC = 0x%08x", br->getBits(32)); 444 445 bool PIDsChanged = false; 446 for (size_t i = 0; i < infos.size(); ++i) { 447 StreamInfo &info = infos.editItemAt(i); 448 449 ssize_t index = mStreams.indexOfKey(info.mPID); 450 451 if (index >= 0 && mStreams.editValueAt(index)->type() != info.mType) { 452 ALOGI("uh oh. stream PIDs have changed."); 453 PIDsChanged = true; 454 break; 455 } 456 } 457 458 if (PIDsChanged) { 459 #if 0 460 ALOGI("before:"); 461 for (size_t i = 0; i < mStreams.size(); ++i) { 462 sp<Stream> stream = mStreams.editValueAt(i); 463 464 ALOGI("PID 0x%08x => type 0x%02x", stream->pid(), stream->type()); 465 } 466 467 ALOGI("after:"); 468 for (size_t i = 0; i < infos.size(); ++i) { 469 StreamInfo &info = infos.editItemAt(i); 470 471 ALOGI("PID 0x%08x => type 0x%02x", info.mPID, info.mType); 472 } 473 #endif 474 475 // we can recover if number of streams for each type remain the same 476 bool success = switchPIDs(infos); 477 478 if (!success) { 479 ALOGI("Stream PIDs changed and we cannot recover."); 480 return ERROR_MALFORMED; 481 } 482 } 483 484 for (size_t i = 0; i < infos.size(); ++i) { 485 StreamInfo &info = infos.editItemAt(i); 486 487 ssize_t index = mStreams.indexOfKey(info.mPID); 488 489 if (index < 0) { 490 sp<Stream> stream = new Stream( 491 this, info.mPID, info.mType, PCR_PID); 492 493 mStreams.add(info.mPID, stream); 494 } 495 } 496 497 return OK; 498 } 499 500 int64_t ATSParser::Program::recoverPTS(uint64_t PTS_33bit) { 501 // We only have the lower 33-bit of the PTS. It could overflow within a 502 // reasonable amount of time. To handle the wrap-around, use fancy math 503 // to get an extended PTS that is within [-0xffffffff, 0xffffffff] 504 // of the latest recovered PTS. 505 if (mLastRecoveredPTS < 0ll) { 506 // Use the original 33bit number for 1st frame, the reason is that 507 // if 1st frame wraps to negative that's far away from 0, we could 508 // never start. Only start wrapping around from 2nd frame. 509 mLastRecoveredPTS = static_cast<int64_t>(PTS_33bit); 510 } else { 511 mLastRecoveredPTS = static_cast<int64_t>( 512 ((mLastRecoveredPTS - PTS_33bit + 0x100000000ll) 513 & 0xfffffffe00000000ull) | PTS_33bit); 514 // We start from 0, but recovered PTS could be slightly below 0. 515 // Clamp it to 0 as rest of the pipeline doesn't take negative pts. 516 // (eg. video is read first and starts at 0, but audio starts at 0xfffffff0) 517 if (mLastRecoveredPTS < 0ll) { 518 ALOGI("Clamping negative recovered PTS (%" PRId64 ") to 0", mLastRecoveredPTS); 519 mLastRecoveredPTS = 0ll; 520 } 521 } 522 523 return mLastRecoveredPTS; 524 } 525 526 sp<MediaSource> ATSParser::Program::getSource(SourceType type) { 527 size_t index = (type == AUDIO) ? 0 : 0; 528 529 for (size_t i = 0; i < mStreams.size(); ++i) { 530 sp<MediaSource> source = mStreams.editValueAt(i)->getSource(type); 531 if (source != NULL) { 532 if (index == 0) { 533 return source; 534 } 535 --index; 536 } 537 } 538 539 return NULL; 540 } 541 542 bool ATSParser::Program::hasSource(SourceType type) const { 543 for (size_t i = 0; i < mStreams.size(); ++i) { 544 const sp<Stream> &stream = mStreams.valueAt(i); 545 if (type == AUDIO && stream->isAudio()) { 546 return true; 547 } else if (type == VIDEO && stream->isVideo()) { 548 return true; 549 } 550 } 551 552 return false; 553 } 554 555 int64_t ATSParser::Program::convertPTSToTimestamp(uint64_t PTS) { 556 PTS = recoverPTS(PTS); 557 558 if (!(mParser->mFlags & TS_TIMESTAMPS_ARE_ABSOLUTE)) { 559 if (!mFirstPTSValid) { 560 mFirstPTSValid = true; 561 mFirstPTS = PTS; 562 PTS = 0; 563 } else if (PTS < mFirstPTS) { 564 PTS = 0; 565 } else { 566 PTS -= mFirstPTS; 567 } 568 } 569 570 int64_t timeUs = (PTS * 100) / 9; 571 572 if (mParser->mAbsoluteTimeAnchorUs >= 0ll) { 573 timeUs += mParser->mAbsoluteTimeAnchorUs; 574 } 575 576 if (mParser->mTimeOffsetValid) { 577 timeUs += mParser->mTimeOffsetUs; 578 } 579 580 return timeUs; 581 } 582 583 //////////////////////////////////////////////////////////////////////////////// 584 585 ATSParser::Stream::Stream( 586 Program *program, 587 unsigned elementaryPID, 588 unsigned streamType, 589 unsigned PCR_PID) 590 : mProgram(program), 591 mElementaryPID(elementaryPID), 592 mStreamType(streamType), 593 mPCR_PID(PCR_PID), 594 mExpectedContinuityCounter(-1), 595 mPayloadStarted(false), 596 mEOSReached(false), 597 mPrevPTS(0), 598 mQueue(NULL) { 599 switch (mStreamType) { 600 case STREAMTYPE_H264: 601 mQueue = new ElementaryStreamQueue( 602 ElementaryStreamQueue::H264, 603 (mProgram->parserFlags() & ALIGNED_VIDEO_DATA) 604 ? ElementaryStreamQueue::kFlag_AlignedData : 0); 605 break; 606 case STREAMTYPE_MPEG2_AUDIO_ADTS: 607 mQueue = new ElementaryStreamQueue(ElementaryStreamQueue::AAC); 608 break; 609 case STREAMTYPE_MPEG1_AUDIO: 610 case STREAMTYPE_MPEG2_AUDIO: 611 mQueue = new ElementaryStreamQueue( 612 ElementaryStreamQueue::MPEG_AUDIO); 613 break; 614 615 case STREAMTYPE_MPEG1_VIDEO: 616 case STREAMTYPE_MPEG2_VIDEO: 617 mQueue = new ElementaryStreamQueue( 618 ElementaryStreamQueue::MPEG_VIDEO); 619 break; 620 621 case STREAMTYPE_MPEG4_VIDEO: 622 mQueue = new ElementaryStreamQueue( 623 ElementaryStreamQueue::MPEG4_VIDEO); 624 break; 625 626 case STREAMTYPE_LPCM_AC3: 627 case STREAMTYPE_AC3: 628 mQueue = new ElementaryStreamQueue( 629 ElementaryStreamQueue::AC3); 630 break; 631 632 case STREAMTYPE_METADATA: 633 mQueue = new ElementaryStreamQueue( 634 ElementaryStreamQueue::METADATA); 635 break; 636 637 default: 638 break; 639 } 640 641 ALOGV("new stream PID 0x%02x, type 0x%02x", elementaryPID, streamType); 642 643 if (mQueue != NULL) { 644 mBuffer = new ABuffer(192 * 1024); 645 mBuffer->setRange(0, 0); 646 } 647 } 648 649 ATSParser::Stream::~Stream() { 650 delete mQueue; 651 mQueue = NULL; 652 } 653 654 status_t ATSParser::Stream::parse( 655 unsigned continuity_counter, 656 unsigned payload_unit_start_indicator, ABitReader *br, 657 SyncEvent *event) { 658 if (mQueue == NULL) { 659 return OK; 660 } 661 662 if (mExpectedContinuityCounter >= 0 663 && (unsigned)mExpectedContinuityCounter != continuity_counter) { 664 ALOGI("discontinuity on stream pid 0x%04x", mElementaryPID); 665 666 mPayloadStarted = false; 667 mBuffer->setRange(0, 0); 668 mExpectedContinuityCounter = -1; 669 670 #if 0 671 // Uncomment this if you'd rather see no corruption whatsoever on 672 // screen and suspend updates until we come across another IDR frame. 673 674 if (mStreamType == STREAMTYPE_H264) { 675 ALOGI("clearing video queue"); 676 mQueue->clear(true /* clearFormat */); 677 } 678 #endif 679 680 if (!payload_unit_start_indicator) { 681 return OK; 682 } 683 } 684 685 mExpectedContinuityCounter = (continuity_counter + 1) & 0x0f; 686 687 if (payload_unit_start_indicator) { 688 off64_t offset = (event != NULL) ? event->getOffset() : 0; 689 if (mPayloadStarted) { 690 // Otherwise we run the danger of receiving the trailing bytes 691 // of a PES packet that we never saw the start of and assuming 692 // we have a a complete PES packet. 693 694 status_t err = flush(event); 695 696 if (err != OK) { 697 ALOGW("Error (%08x) happened while flushing; we simply discard " 698 "the PES packet and continue.", err); 699 } 700 } 701 702 mPayloadStarted = true; 703 mPesStartOffset = offset; 704 } 705 706 if (!mPayloadStarted) { 707 return OK; 708 } 709 710 size_t payloadSizeBits = br->numBitsLeft(); 711 if (payloadSizeBits % 8 != 0u) { 712 ALOGE("Wrong value"); 713 return BAD_VALUE; 714 } 715 716 size_t neededSize = mBuffer->size() + payloadSizeBits / 8; 717 if (mBuffer->capacity() < neededSize) { 718 // Increment in multiples of 64K. 719 neededSize = (neededSize + 65535) & ~65535; 720 721 ALOGI("resizing buffer to %zu bytes", neededSize); 722 723 sp<ABuffer> newBuffer = new ABuffer(neededSize); 724 memcpy(newBuffer->data(), mBuffer->data(), mBuffer->size()); 725 newBuffer->setRange(0, mBuffer->size()); 726 mBuffer = newBuffer; 727 } 728 729 memcpy(mBuffer->data() + mBuffer->size(), br->data(), payloadSizeBits / 8); 730 mBuffer->setRange(0, mBuffer->size() + payloadSizeBits / 8); 731 732 return OK; 733 } 734 735 bool ATSParser::Stream::isVideo() const { 736 switch (mStreamType) { 737 case STREAMTYPE_H264: 738 case STREAMTYPE_MPEG1_VIDEO: 739 case STREAMTYPE_MPEG2_VIDEO: 740 case STREAMTYPE_MPEG4_VIDEO: 741 return true; 742 743 default: 744 return false; 745 } 746 } 747 748 bool ATSParser::Stream::isAudio() const { 749 switch (mStreamType) { 750 case STREAMTYPE_MPEG1_AUDIO: 751 case STREAMTYPE_MPEG2_AUDIO: 752 case STREAMTYPE_MPEG2_AUDIO_ADTS: 753 case STREAMTYPE_LPCM_AC3: 754 case STREAMTYPE_AC3: 755 return true; 756 757 default: 758 return false; 759 } 760 } 761 762 bool ATSParser::Stream::isMeta() const { 763 if (mStreamType == STREAMTYPE_METADATA) { 764 return true; 765 } 766 return false; 767 } 768 769 void ATSParser::Stream::signalDiscontinuity( 770 DiscontinuityType type, const sp<AMessage> &extra) { 771 mExpectedContinuityCounter = -1; 772 773 if (mQueue == NULL) { 774 return; 775 } 776 777 mPayloadStarted = false; 778 mEOSReached = false; 779 mBuffer->setRange(0, 0); 780 781 bool clearFormat = false; 782 if (isAudio()) { 783 if (type & DISCONTINUITY_AUDIO_FORMAT) { 784 clearFormat = true; 785 } 786 } else { 787 if (type & DISCONTINUITY_VIDEO_FORMAT) { 788 clearFormat = true; 789 } 790 } 791 792 mQueue->clear(clearFormat); 793 794 if (type & DISCONTINUITY_TIME) { 795 uint64_t resumeAtPTS; 796 if (extra != NULL 797 && extra->findInt64( 798 IStreamListener::kKeyResumeAtPTS, 799 (int64_t *)&resumeAtPTS)) { 800 int64_t resumeAtMediaTimeUs = 801 mProgram->convertPTSToTimestamp(resumeAtPTS); 802 803 extra->setInt64("resume-at-mediaTimeUs", resumeAtMediaTimeUs); 804 } 805 } 806 807 if (mSource != NULL) { 808 mSource->queueDiscontinuity(type, extra, true); 809 } 810 } 811 812 void ATSParser::Stream::signalEOS(status_t finalResult) { 813 if (mSource != NULL) { 814 mSource->signalEOS(finalResult); 815 } 816 mEOSReached = true; 817 flush(NULL); 818 } 819 820 status_t ATSParser::Stream::parsePES(ABitReader *br, SyncEvent *event) { 821 unsigned packet_startcode_prefix = br->getBits(24); 822 823 ALOGV("packet_startcode_prefix = 0x%08x", packet_startcode_prefix); 824 825 if (packet_startcode_prefix != 1) { 826 ALOGV("Supposedly payload_unit_start=1 unit does not start " 827 "with startcode."); 828 829 return ERROR_MALFORMED; 830 } 831 832 unsigned stream_id = br->getBits(8); 833 ALOGV("stream_id = 0x%02x", stream_id); 834 835 unsigned PES_packet_length = br->getBits(16); 836 ALOGV("PES_packet_length = %u", PES_packet_length); 837 838 if (stream_id != 0xbc // program_stream_map 839 && stream_id != 0xbe // padding_stream 840 && stream_id != 0xbf // private_stream_2 841 && stream_id != 0xf0 // ECM 842 && stream_id != 0xf1 // EMM 843 && stream_id != 0xff // program_stream_directory 844 && stream_id != 0xf2 // DSMCC 845 && stream_id != 0xf8) { // H.222.1 type E 846 if (br->getBits(2) != 2u) { 847 return ERROR_MALFORMED; 848 } 849 850 MY_LOGV("PES_scrambling_control = %u", br->getBits(2)); 851 MY_LOGV("PES_priority = %u", br->getBits(1)); 852 MY_LOGV("data_alignment_indicator = %u", br->getBits(1)); 853 MY_LOGV("copyright = %u", br->getBits(1)); 854 MY_LOGV("original_or_copy = %u", br->getBits(1)); 855 856 unsigned PTS_DTS_flags = br->getBits(2); 857 ALOGV("PTS_DTS_flags = %u", PTS_DTS_flags); 858 859 unsigned ESCR_flag = br->getBits(1); 860 ALOGV("ESCR_flag = %u", ESCR_flag); 861 862 unsigned ES_rate_flag = br->getBits(1); 863 ALOGV("ES_rate_flag = %u", ES_rate_flag); 864 865 unsigned DSM_trick_mode_flag = br->getBits(1); 866 ALOGV("DSM_trick_mode_flag = %u", DSM_trick_mode_flag); 867 868 unsigned additional_copy_info_flag = br->getBits(1); 869 ALOGV("additional_copy_info_flag = %u", additional_copy_info_flag); 870 871 MY_LOGV("PES_CRC_flag = %u", br->getBits(1)); 872 MY_LOGV("PES_extension_flag = %u", br->getBits(1)); 873 874 unsigned PES_header_data_length = br->getBits(8); 875 ALOGV("PES_header_data_length = %u", PES_header_data_length); 876 877 unsigned optional_bytes_remaining = PES_header_data_length; 878 879 uint64_t PTS = 0, DTS = 0; 880 881 if (PTS_DTS_flags == 2 || PTS_DTS_flags == 3) { 882 if (optional_bytes_remaining < 5u) { 883 return ERROR_MALFORMED; 884 } 885 886 if (br->getBits(4) != PTS_DTS_flags) { 887 return ERROR_MALFORMED; 888 } 889 PTS = ((uint64_t)br->getBits(3)) << 30; 890 if (br->getBits(1) != 1u) { 891 return ERROR_MALFORMED; 892 } 893 PTS |= ((uint64_t)br->getBits(15)) << 15; 894 if (br->getBits(1) != 1u) { 895 return ERROR_MALFORMED; 896 } 897 PTS |= br->getBits(15); 898 if (br->getBits(1) != 1u) { 899 return ERROR_MALFORMED; 900 } 901 902 ALOGV("PTS = 0x%016" PRIx64 " (%.2f)", PTS, PTS / 90000.0); 903 904 optional_bytes_remaining -= 5; 905 906 if (PTS_DTS_flags == 3) { 907 if (optional_bytes_remaining < 5u) { 908 return ERROR_MALFORMED; 909 } 910 911 if (br->getBits(4) != 1u) { 912 return ERROR_MALFORMED; 913 } 914 915 DTS = ((uint64_t)br->getBits(3)) << 30; 916 if (br->getBits(1) != 1u) { 917 return ERROR_MALFORMED; 918 } 919 DTS |= ((uint64_t)br->getBits(15)) << 15; 920 if (br->getBits(1) != 1u) { 921 return ERROR_MALFORMED; 922 } 923 DTS |= br->getBits(15); 924 if (br->getBits(1) != 1u) { 925 return ERROR_MALFORMED; 926 } 927 928 ALOGV("DTS = %" PRIu64, DTS); 929 930 optional_bytes_remaining -= 5; 931 } 932 } 933 934 if (ESCR_flag) { 935 if (optional_bytes_remaining < 6u) { 936 return ERROR_MALFORMED; 937 } 938 939 br->getBits(2); 940 941 uint64_t ESCR = ((uint64_t)br->getBits(3)) << 30; 942 if (br->getBits(1) != 1u) { 943 return ERROR_MALFORMED; 944 } 945 ESCR |= ((uint64_t)br->getBits(15)) << 15; 946 if (br->getBits(1) != 1u) { 947 return ERROR_MALFORMED; 948 } 949 ESCR |= br->getBits(15); 950 if (br->getBits(1) != 1u) { 951 return ERROR_MALFORMED; 952 } 953 954 ALOGV("ESCR = %" PRIu64, ESCR); 955 MY_LOGV("ESCR_extension = %u", br->getBits(9)); 956 957 if (br->getBits(1) != 1u) { 958 return ERROR_MALFORMED; 959 } 960 961 optional_bytes_remaining -= 6; 962 } 963 964 if (ES_rate_flag) { 965 if (optional_bytes_remaining < 3u) { 966 return ERROR_MALFORMED; 967 } 968 969 if (br->getBits(1) != 1u) { 970 return ERROR_MALFORMED; 971 } 972 MY_LOGV("ES_rate = %u", br->getBits(22)); 973 if (br->getBits(1) != 1u) { 974 return ERROR_MALFORMED; 975 } 976 977 optional_bytes_remaining -= 3; 978 } 979 980 br->skipBits(optional_bytes_remaining * 8); 981 982 // ES data follows. 983 984 if (PES_packet_length != 0) { 985 if (PES_packet_length < PES_header_data_length + 3) { 986 return ERROR_MALFORMED; 987 } 988 989 unsigned dataLength = 990 PES_packet_length - 3 - PES_header_data_length; 991 992 if (br->numBitsLeft() < dataLength * 8) { 993 ALOGE("PES packet does not carry enough data to contain " 994 "payload. (numBitsLeft = %zu, required = %u)", 995 br->numBitsLeft(), dataLength * 8); 996 997 return ERROR_MALFORMED; 998 } 999 1000 onPayloadData( 1001 PTS_DTS_flags, PTS, DTS, br->data(), dataLength, event); 1002 1003 br->skipBits(dataLength * 8); 1004 } else { 1005 onPayloadData( 1006 PTS_DTS_flags, PTS, DTS, 1007 br->data(), br->numBitsLeft() / 8, event); 1008 1009 size_t payloadSizeBits = br->numBitsLeft(); 1010 if (payloadSizeBits % 8 != 0u) { 1011 return ERROR_MALFORMED; 1012 } 1013 1014 ALOGV("There's %zu bytes of payload.", payloadSizeBits / 8); 1015 } 1016 } else if (stream_id == 0xbe) { // padding_stream 1017 if (PES_packet_length == 0u) { 1018 return ERROR_MALFORMED; 1019 } 1020 br->skipBits(PES_packet_length * 8); 1021 } else { 1022 if (PES_packet_length == 0u) { 1023 return ERROR_MALFORMED; 1024 } 1025 br->skipBits(PES_packet_length * 8); 1026 } 1027 1028 return OK; 1029 } 1030 1031 status_t ATSParser::Stream::flush(SyncEvent *event) { 1032 if (mBuffer == NULL || mBuffer->size() == 0) { 1033 return OK; 1034 } 1035 1036 ALOGV("flushing stream 0x%04x size = %zu", mElementaryPID, mBuffer->size()); 1037 1038 ABitReader br(mBuffer->data(), mBuffer->size()); 1039 1040 status_t err = parsePES(&br, event); 1041 1042 mBuffer->setRange(0, 0); 1043 1044 return err; 1045 } 1046 1047 void ATSParser::Stream::onPayloadData( 1048 unsigned PTS_DTS_flags, uint64_t PTS, uint64_t /* DTS */, 1049 const uint8_t *data, size_t size, SyncEvent *event) { 1050 #if 0 1051 ALOGI("payload streamType 0x%02x, PTS = 0x%016llx, dPTS = %lld", 1052 mStreamType, 1053 PTS, 1054 (int64_t)PTS - mPrevPTS); 1055 mPrevPTS = PTS; 1056 #endif 1057 1058 ALOGV("onPayloadData mStreamType=0x%02x", mStreamType); 1059 1060 int64_t timeUs = 0ll; // no presentation timestamp available. 1061 if (PTS_DTS_flags == 2 || PTS_DTS_flags == 3) { 1062 timeUs = mProgram->convertPTSToTimestamp(PTS); 1063 } 1064 1065 status_t err = mQueue->appendData(data, size, timeUs); 1066 1067 if (mEOSReached) { 1068 mQueue->signalEOS(); 1069 } 1070 1071 if (err != OK) { 1072 return; 1073 } 1074 1075 sp<ABuffer> accessUnit; 1076 bool found = false; 1077 while ((accessUnit = mQueue->dequeueAccessUnit()) != NULL) { 1078 if (mSource == NULL) { 1079 sp<MetaData> meta = mQueue->getFormat(); 1080 1081 if (meta != NULL) { 1082 ALOGV("Stream PID 0x%08x of type 0x%02x now has data.", 1083 mElementaryPID, mStreamType); 1084 1085 const char *mime; 1086 if (meta->findCString(kKeyMIMEType, &mime) 1087 && !strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_AVC) 1088 && !IsIDR(accessUnit)) { 1089 continue; 1090 } 1091 mSource = new AnotherPacketSource(meta); 1092 mSource->queueAccessUnit(accessUnit); 1093 } 1094 } else if (mQueue->getFormat() != NULL) { 1095 // After a discontinuity we invalidate the queue's format 1096 // and won't enqueue any access units to the source until 1097 // the queue has reestablished the new format. 1098 1099 if (mSource->getFormat() == NULL) { 1100 mSource->setFormat(mQueue->getFormat()); 1101 } 1102 mSource->queueAccessUnit(accessUnit); 1103 } 1104 1105 if ((event != NULL) && !found && mQueue->getFormat() != NULL) { 1106 int32_t sync = 0; 1107 if (accessUnit->meta()->findInt32("isSync", &sync) && sync) { 1108 int64_t timeUs; 1109 if (accessUnit->meta()->findInt64("timeUs", &timeUs)) { 1110 found = true; 1111 event->init(mPesStartOffset, mSource, timeUs); 1112 } 1113 } 1114 } 1115 } 1116 } 1117 1118 sp<MediaSource> ATSParser::Stream::getSource(SourceType type) { 1119 switch (type) { 1120 case VIDEO: 1121 { 1122 if (isVideo()) { 1123 return mSource; 1124 } 1125 break; 1126 } 1127 1128 case AUDIO: 1129 { 1130 if (isAudio()) { 1131 return mSource; 1132 } 1133 break; 1134 } 1135 1136 case META: 1137 { 1138 if (isMeta()) { 1139 return mSource; 1140 } 1141 break; 1142 } 1143 1144 default: 1145 break; 1146 } 1147 1148 return NULL; 1149 } 1150 1151 //////////////////////////////////////////////////////////////////////////////// 1152 1153 ATSParser::ATSParser(uint32_t flags) 1154 : mFlags(flags), 1155 mAbsoluteTimeAnchorUs(-1ll), 1156 mTimeOffsetValid(false), 1157 mTimeOffsetUs(0ll), 1158 mLastRecoveredPTS(-1ll), 1159 mNumTSPacketsParsed(0), 1160 mNumPCRs(0) { 1161 mPSISections.add(0 /* PID */, new PSISection); 1162 } 1163 1164 ATSParser::~ATSParser() { 1165 } 1166 1167 status_t ATSParser::feedTSPacket(const void *data, size_t size, 1168 SyncEvent *event) { 1169 if (size != kTSPacketSize) { 1170 ALOGE("Wrong TS packet size"); 1171 return BAD_VALUE; 1172 } 1173 1174 ABitReader br((const uint8_t *)data, kTSPacketSize); 1175 return parseTS(&br, event); 1176 } 1177 1178 void ATSParser::signalDiscontinuity( 1179 DiscontinuityType type, const sp<AMessage> &extra) { 1180 int64_t mediaTimeUs; 1181 if ((type & DISCONTINUITY_TIME) && extra != NULL) { 1182 if (extra->findInt64(IStreamListener::kKeyMediaTimeUs, &mediaTimeUs)) { 1183 mAbsoluteTimeAnchorUs = mediaTimeUs; 1184 } 1185 if ((mFlags & TS_TIMESTAMPS_ARE_ABSOLUTE) 1186 && extra->findInt64( 1187 IStreamListener::kKeyRecentMediaTimeUs, &mediaTimeUs)) { 1188 if (mAbsoluteTimeAnchorUs >= 0ll) { 1189 mediaTimeUs -= mAbsoluteTimeAnchorUs; 1190 } 1191 if (mTimeOffsetValid) { 1192 mediaTimeUs -= mTimeOffsetUs; 1193 } 1194 mLastRecoveredPTS = (mediaTimeUs * 9) / 100; 1195 } 1196 } else if (type == DISCONTINUITY_ABSOLUTE_TIME) { 1197 int64_t timeUs; 1198 if (!extra->findInt64("timeUs", &timeUs)) { 1199 ALOGE("timeUs not found"); 1200 return; 1201 } 1202 1203 if (!mPrograms.empty()) { 1204 ALOGE("mPrograms is not empty"); 1205 return; 1206 } 1207 mAbsoluteTimeAnchorUs = timeUs; 1208 return; 1209 } else if (type == DISCONTINUITY_TIME_OFFSET) { 1210 int64_t offset; 1211 if (!extra->findInt64("offset", &offset)) { 1212 ALOGE("offset not found"); 1213 return; 1214 } 1215 1216 mTimeOffsetValid = true; 1217 mTimeOffsetUs = offset; 1218 return; 1219 } 1220 1221 for (size_t i = 0; i < mPrograms.size(); ++i) { 1222 mPrograms.editItemAt(i)->signalDiscontinuity(type, extra); 1223 } 1224 } 1225 1226 void ATSParser::signalEOS(status_t finalResult) { 1227 if (finalResult == (status_t) OK) { 1228 ALOGE("finalResult not OK"); 1229 return; 1230 } 1231 1232 for (size_t i = 0; i < mPrograms.size(); ++i) { 1233 mPrograms.editItemAt(i)->signalEOS(finalResult); 1234 } 1235 } 1236 1237 void ATSParser::parseProgramAssociationTable(ABitReader *br) { 1238 unsigned table_id = br->getBits(8); 1239 ALOGV(" table_id = %u", table_id); 1240 if (table_id != 0x00u) { 1241 ALOGE("PAT data error!"); 1242 return ; 1243 } 1244 unsigned section_syntax_indictor = br->getBits(1); 1245 ALOGV(" section_syntax_indictor = %u", section_syntax_indictor); 1246 1247 br->skipBits(1); // '0' 1248 MY_LOGV(" reserved = %u", br->getBits(2)); 1249 1250 unsigned section_length = br->getBits(12); 1251 ALOGV(" section_length = %u", section_length); 1252 1253 MY_LOGV(" transport_stream_id = %u", br->getBits(16)); 1254 MY_LOGV(" reserved = %u", br->getBits(2)); 1255 MY_LOGV(" version_number = %u", br->getBits(5)); 1256 MY_LOGV(" current_next_indicator = %u", br->getBits(1)); 1257 MY_LOGV(" section_number = %u", br->getBits(8)); 1258 MY_LOGV(" last_section_number = %u", br->getBits(8)); 1259 1260 size_t numProgramBytes = (section_length - 5 /* header */ - 4 /* crc */); 1261 1262 for (size_t i = 0; i < numProgramBytes / 4; ++i) { 1263 unsigned program_number = br->getBits(16); 1264 ALOGV(" program_number = %u", program_number); 1265 1266 MY_LOGV(" reserved = %u", br->getBits(3)); 1267 1268 if (program_number == 0) { 1269 MY_LOGV(" network_PID = 0x%04x", br->getBits(13)); 1270 } else { 1271 unsigned programMapPID = br->getBits(13); 1272 1273 ALOGV(" program_map_PID = 0x%04x", programMapPID); 1274 1275 bool found = false; 1276 for (size_t index = 0; index < mPrograms.size(); ++index) { 1277 const sp<Program> &program = mPrograms.itemAt(index); 1278 1279 if (program->number() == program_number) { 1280 program->updateProgramMapPID(programMapPID); 1281 found = true; 1282 break; 1283 } 1284 } 1285 1286 if (!found) { 1287 mPrograms.push( 1288 new Program(this, program_number, programMapPID, mLastRecoveredPTS)); 1289 } 1290 1291 if (mPSISections.indexOfKey(programMapPID) < 0) { 1292 mPSISections.add(programMapPID, new PSISection); 1293 } 1294 } 1295 } 1296 1297 MY_LOGV(" CRC = 0x%08x", br->getBits(32)); 1298 } 1299 1300 status_t ATSParser::parsePID( 1301 ABitReader *br, unsigned PID, 1302 unsigned continuity_counter, 1303 unsigned payload_unit_start_indicator, 1304 SyncEvent *event) { 1305 ssize_t sectionIndex = mPSISections.indexOfKey(PID); 1306 1307 if (sectionIndex >= 0) { 1308 sp<PSISection> section = mPSISections.valueAt(sectionIndex); 1309 1310 if (payload_unit_start_indicator) { 1311 if (!section->isEmpty()) { 1312 ALOGW("parsePID encounters payload_unit_start_indicator when section is not empty"); 1313 section->clear(); 1314 } 1315 1316 unsigned skip = br->getBits(8); 1317 section->setSkipBytes(skip + 1); // skip filler bytes + pointer field itself 1318 br->skipBits(skip * 8); 1319 } 1320 1321 if (br->numBitsLeft() % 8 != 0) { 1322 return ERROR_MALFORMED; 1323 } 1324 status_t err = section->append(br->data(), br->numBitsLeft() / 8); 1325 1326 if (err != OK) { 1327 return err; 1328 } 1329 1330 if (!section->isComplete()) { 1331 return OK; 1332 } 1333 1334 if (!section->isCRCOkay()) { 1335 return BAD_VALUE; 1336 } 1337 ABitReader sectionBits(section->data(), section->size()); 1338 1339 if (PID == 0) { 1340 parseProgramAssociationTable(§ionBits); 1341 } else { 1342 bool handled = false; 1343 for (size_t i = 0; i < mPrograms.size(); ++i) { 1344 status_t err; 1345 if (!mPrograms.editItemAt(i)->parsePSISection( 1346 PID, §ionBits, &err)) { 1347 continue; 1348 } 1349 1350 if (err != OK) { 1351 return err; 1352 } 1353 1354 handled = true; 1355 break; 1356 } 1357 1358 if (!handled) { 1359 mPSISections.removeItem(PID); 1360 section.clear(); 1361 } 1362 } 1363 1364 if (section != NULL) { 1365 section->clear(); 1366 } 1367 1368 return OK; 1369 } 1370 1371 bool handled = false; 1372 for (size_t i = 0; i < mPrograms.size(); ++i) { 1373 status_t err; 1374 if (mPrograms.editItemAt(i)->parsePID( 1375 PID, continuity_counter, payload_unit_start_indicator, 1376 br, &err, event)) { 1377 if (err != OK) { 1378 return err; 1379 } 1380 1381 handled = true; 1382 break; 1383 } 1384 } 1385 1386 if (!handled) { 1387 ALOGV("PID 0x%04x not handled.", PID); 1388 } 1389 1390 return OK; 1391 } 1392 1393 status_t ATSParser::parseAdaptationField(ABitReader *br, unsigned PID) { 1394 unsigned adaptation_field_length = br->getBits(8); 1395 1396 if (adaptation_field_length > 0) { 1397 if (adaptation_field_length * 8 > br->numBitsLeft()) { 1398 ALOGV("Adaptation field should be included in a single TS packet."); 1399 return ERROR_MALFORMED; 1400 } 1401 1402 unsigned discontinuity_indicator = br->getBits(1); 1403 1404 if (discontinuity_indicator) { 1405 ALOGV("PID 0x%04x: discontinuity_indicator = 1 (!!!)", PID); 1406 } 1407 1408 br->skipBits(2); 1409 unsigned PCR_flag = br->getBits(1); 1410 1411 size_t numBitsRead = 4; 1412 1413 if (PCR_flag) { 1414 if (adaptation_field_length * 8 < 52) { 1415 return ERROR_MALFORMED; 1416 } 1417 br->skipBits(4); 1418 uint64_t PCR_base = br->getBits(32); 1419 PCR_base = (PCR_base << 1) | br->getBits(1); 1420 1421 br->skipBits(6); 1422 unsigned PCR_ext = br->getBits(9); 1423 1424 // The number of bytes from the start of the current 1425 // MPEG2 transport stream packet up and including 1426 // the final byte of this PCR_ext field. 1427 size_t byteOffsetFromStartOfTSPacket = 1428 (188 - br->numBitsLeft() / 8); 1429 1430 uint64_t PCR = PCR_base * 300 + PCR_ext; 1431 1432 ALOGV("PID 0x%04x: PCR = 0x%016" PRIx64 " (%.2f)", 1433 PID, PCR, PCR / 27E6); 1434 1435 // The number of bytes received by this parser up to and 1436 // including the final byte of this PCR_ext field. 1437 size_t byteOffsetFromStart = 1438 mNumTSPacketsParsed * 188 + byteOffsetFromStartOfTSPacket; 1439 1440 for (size_t i = 0; i < mPrograms.size(); ++i) { 1441 updatePCR(PID, PCR, byteOffsetFromStart); 1442 } 1443 1444 numBitsRead += 52; 1445 } 1446 1447 br->skipBits(adaptation_field_length * 8 - numBitsRead); 1448 } 1449 return OK; 1450 } 1451 1452 status_t ATSParser::parseTS(ABitReader *br, SyncEvent *event) { 1453 ALOGV("---"); 1454 1455 unsigned sync_byte = br->getBits(8); 1456 if (sync_byte != 0x47u) { 1457 ALOGE("[error] parseTS: return error as sync_byte=0x%x", sync_byte); 1458 return BAD_VALUE; 1459 } 1460 1461 if (br->getBits(1)) { // transport_error_indicator 1462 // silently ignore. 1463 return OK; 1464 } 1465 1466 unsigned payload_unit_start_indicator = br->getBits(1); 1467 ALOGV("payload_unit_start_indicator = %u", payload_unit_start_indicator); 1468 1469 MY_LOGV("transport_priority = %u", br->getBits(1)); 1470 1471 unsigned PID = br->getBits(13); 1472 ALOGV("PID = 0x%04x", PID); 1473 1474 MY_LOGV("transport_scrambling_control = %u", br->getBits(2)); 1475 1476 unsigned adaptation_field_control = br->getBits(2); 1477 ALOGV("adaptation_field_control = %u", adaptation_field_control); 1478 1479 unsigned continuity_counter = br->getBits(4); 1480 ALOGV("PID = 0x%04x, continuity_counter = %u", PID, continuity_counter); 1481 1482 // ALOGI("PID = 0x%04x, continuity_counter = %u", PID, continuity_counter); 1483 1484 status_t err = OK; 1485 1486 if (adaptation_field_control == 2 || adaptation_field_control == 3) { 1487 err = parseAdaptationField(br, PID); 1488 } 1489 if (err == OK) { 1490 if (adaptation_field_control == 1 || adaptation_field_control == 3) { 1491 err = parsePID(br, PID, continuity_counter, 1492 payload_unit_start_indicator, event); 1493 } 1494 } 1495 1496 ++mNumTSPacketsParsed; 1497 1498 return err; 1499 } 1500 1501 sp<MediaSource> ATSParser::getSource(SourceType type) { 1502 int which = -1; // any 1503 1504 for (size_t i = 0; i < mPrograms.size(); ++i) { 1505 const sp<Program> &program = mPrograms.editItemAt(i); 1506 1507 if (which >= 0 && (int)program->number() != which) { 1508 continue; 1509 } 1510 1511 sp<MediaSource> source = program->getSource(type); 1512 1513 if (source != NULL) { 1514 return source; 1515 } 1516 } 1517 1518 return NULL; 1519 } 1520 1521 bool ATSParser::hasSource(SourceType type) const { 1522 for (size_t i = 0; i < mPrograms.size(); ++i) { 1523 const sp<Program> &program = mPrograms.itemAt(i); 1524 if (program->hasSource(type)) { 1525 return true; 1526 } 1527 } 1528 1529 return false; 1530 } 1531 1532 bool ATSParser::PTSTimeDeltaEstablished() { 1533 if (mPrograms.isEmpty()) { 1534 return false; 1535 } 1536 1537 return mPrograms.editItemAt(0)->PTSTimeDeltaEstablished(); 1538 } 1539 1540 void ATSParser::updatePCR( 1541 unsigned /* PID */, uint64_t PCR, size_t byteOffsetFromStart) { 1542 ALOGV("PCR 0x%016" PRIx64 " @ %zu", PCR, byteOffsetFromStart); 1543 1544 if (mNumPCRs == 2) { 1545 mPCR[0] = mPCR[1]; 1546 mPCRBytes[0] = mPCRBytes[1]; 1547 mSystemTimeUs[0] = mSystemTimeUs[1]; 1548 mNumPCRs = 1; 1549 } 1550 1551 mPCR[mNumPCRs] = PCR; 1552 mPCRBytes[mNumPCRs] = byteOffsetFromStart; 1553 mSystemTimeUs[mNumPCRs] = ALooper::GetNowUs(); 1554 1555 ++mNumPCRs; 1556 1557 if (mNumPCRs == 2) { 1558 double transportRate = 1559 (mPCRBytes[1] - mPCRBytes[0]) * 27E6 / (mPCR[1] - mPCR[0]); 1560 1561 ALOGV("transportRate = %.2f bytes/sec", transportRate); 1562 } 1563 } 1564 1565 //////////////////////////////////////////////////////////////////////////////// 1566 1567 1568 // CRC32 used for PSI section. The table was generated by following command: 1569 // $ python pycrc.py --model crc-32-mpeg --algorithm table-driven --generate c 1570 // Visit http://www.tty1.net/pycrc/index_en.html for more details. 1571 uint32_t ATSParser::PSISection::CRC_TABLE[] = { 1572 0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9, 1573 0x130476dc, 0x17c56b6b, 0x1a864db2, 0x1e475005, 1574 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61, 1575 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd, 1576 0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9, 1577 0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75, 1578 0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011, 1579 0x791d4014, 0x7ddc5da3, 0x709f7b7a, 0x745e66cd, 1580 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039, 1581 0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, 1582 0xbe2b5b58, 0xbaea46ef, 0xb7a96036, 0xb3687d81, 1583 0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d, 1584 0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49, 1585 0xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95, 1586 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1, 1587 0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, 1588 0x34867077, 0x30476dc0, 0x3d044b19, 0x39c556ae, 1589 0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072, 1590 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16, 1591 0x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca, 1592 0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde, 1593 0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02, 1594 0x5e9f46bf, 0x5a5e5b08, 0x571d7dd1, 0x53dc6066, 1595 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba, 1596 0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, 1597 0xbfa1b04b, 0xbb60adfc, 0xb6238b25, 0xb2e29692, 1598 0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6, 1599 0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a, 1600 0xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e, 1601 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2, 1602 0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686, 1603 0xd5b88683, 0xd1799b34, 0xdc3abded, 0xd8fba05a, 1604 0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637, 1605 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb, 1606 0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f, 1607 0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53, 1608 0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47, 1609 0x36194d42, 0x32d850f5, 0x3f9b762c, 0x3b5a6b9b, 1610 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff, 1611 0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623, 1612 0xf12f560e, 0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7, 1613 0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b, 1614 0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f, 1615 0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3, 1616 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7, 1617 0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b, 1618 0x9b3660c6, 0x9ff77d71, 0x92b45ba8, 0x9675461f, 1619 0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3, 1620 0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640, 1621 0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c, 1622 0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8, 1623 0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24, 1624 0x119b4be9, 0x155a565e, 0x18197087, 0x1cd86d30, 1625 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec, 1626 0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, 1627 0x2497d08d, 0x2056cd3a, 0x2d15ebe3, 0x29d4f654, 1628 0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0, 1629 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c, 1630 0xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18, 1631 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4, 1632 0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0, 1633 0x9abc8bd5, 0x9e7d9662, 0x933eb0bb, 0x97ffad0c, 1634 0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668, 1635 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4 1636 }; 1637 1638 ATSParser::PSISection::PSISection() : 1639 mSkipBytes(0) { 1640 } 1641 1642 ATSParser::PSISection::~PSISection() { 1643 } 1644 1645 status_t ATSParser::PSISection::append(const void *data, size_t size) { 1646 if (mBuffer == NULL || mBuffer->size() + size > mBuffer->capacity()) { 1647 size_t newCapacity = 1648 (mBuffer == NULL) ? size : mBuffer->capacity() + size; 1649 1650 newCapacity = (newCapacity + 1023) & ~1023; 1651 1652 sp<ABuffer> newBuffer = new ABuffer(newCapacity); 1653 1654 if (mBuffer != NULL) { 1655 memcpy(newBuffer->data(), mBuffer->data(), mBuffer->size()); 1656 newBuffer->setRange(0, mBuffer->size()); 1657 } else { 1658 newBuffer->setRange(0, 0); 1659 } 1660 1661 mBuffer = newBuffer; 1662 } 1663 1664 memcpy(mBuffer->data() + mBuffer->size(), data, size); 1665 mBuffer->setRange(0, mBuffer->size() + size); 1666 1667 return OK; 1668 } 1669 1670 void ATSParser::PSISection::setSkipBytes(uint8_t skip) { 1671 mSkipBytes = skip; 1672 } 1673 1674 void ATSParser::PSISection::clear() { 1675 if (mBuffer != NULL) { 1676 mBuffer->setRange(0, 0); 1677 } 1678 mSkipBytes = 0; 1679 } 1680 1681 bool ATSParser::PSISection::isComplete() const { 1682 if (mBuffer == NULL || mBuffer->size() < 3) { 1683 return false; 1684 } 1685 1686 unsigned sectionLength = U16_AT(mBuffer->data() + 1) & 0xfff; 1687 return mBuffer->size() >= sectionLength + 3; 1688 } 1689 1690 bool ATSParser::PSISection::isEmpty() const { 1691 return mBuffer == NULL || mBuffer->size() == 0; 1692 } 1693 1694 const uint8_t *ATSParser::PSISection::data() const { 1695 return mBuffer == NULL ? NULL : mBuffer->data(); 1696 } 1697 1698 size_t ATSParser::PSISection::size() const { 1699 return mBuffer == NULL ? 0 : mBuffer->size(); 1700 } 1701 1702 bool ATSParser::PSISection::isCRCOkay() const { 1703 if (!isComplete()) { 1704 return false; 1705 } 1706 uint8_t* data = mBuffer->data(); 1707 1708 // Return true if section_syntax_indicator says no section follows the field section_length. 1709 if ((data[1] & 0x80) == 0) { 1710 return true; 1711 } 1712 1713 unsigned sectionLength = U16_AT(data + 1) & 0xfff; 1714 ALOGV("sectionLength %u, skip %u", sectionLength, mSkipBytes); 1715 1716 // Skip the preceding field present when payload start indicator is on. 1717 sectionLength -= mSkipBytes; 1718 1719 uint32_t crc = 0xffffffff; 1720 for(unsigned i = 0; i < sectionLength + 4 /* crc */; i++) { 1721 uint8_t b = data[i]; 1722 int index = ((crc >> 24) ^ (b & 0xff)) & 0xff; 1723 crc = CRC_TABLE[index] ^ (crc << 8); 1724 } 1725 ALOGV("crc: %08x\n", crc); 1726 return (crc == 0); 1727 } 1728 } // namespace android 1729