1 /* 2 * Copyright (C) 2011 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 "MPEG2PSExtractor" 19 #include <utils/Log.h> 20 21 #include "include/MPEG2PSExtractor.h" 22 23 #include "AnotherPacketSource.h" 24 #include "ESQueue.h" 25 26 #include <media/stagefright/foundation/ABitReader.h> 27 #include <media/stagefright/foundation/ABuffer.h> 28 #include <media/stagefright/foundation/ADebug.h> 29 #include <media/stagefright/foundation/AMessage.h> 30 #include <media/stagefright/foundation/hexdump.h> 31 #include <media/stagefright/DataSource.h> 32 #include <media/stagefright/MediaDefs.h> 33 #include <media/stagefright/MediaErrors.h> 34 #include <media/stagefright/MediaSource.h> 35 #include <media/stagefright/MetaData.h> 36 #include <media/stagefright/Utils.h> 37 #include <utils/String8.h> 38 39 #include <inttypes.h> 40 41 namespace android { 42 43 struct MPEG2PSExtractor::Track : public MediaSource { 44 Track(MPEG2PSExtractor *extractor, 45 unsigned stream_id, unsigned stream_type); 46 47 virtual status_t start(MetaData *params); 48 virtual status_t stop(); 49 virtual sp<MetaData> getFormat(); 50 51 virtual status_t read( 52 MediaBuffer **buffer, const ReadOptions *options); 53 54 protected: 55 virtual ~Track(); 56 57 private: 58 friend struct MPEG2PSExtractor; 59 60 MPEG2PSExtractor *mExtractor; 61 62 unsigned mStreamID; 63 unsigned mStreamType; 64 ElementaryStreamQueue *mQueue; 65 sp<AnotherPacketSource> mSource; 66 67 status_t appendPESData( 68 unsigned PTS_DTS_flags, 69 uint64_t PTS, uint64_t DTS, 70 const uint8_t *data, size_t size); 71 72 DISALLOW_EVIL_CONSTRUCTORS(Track); 73 }; 74 75 struct MPEG2PSExtractor::WrappedTrack : public MediaSource { 76 WrappedTrack(const sp<MPEG2PSExtractor> &extractor, const sp<Track> &track); 77 78 virtual status_t start(MetaData *params); 79 virtual status_t stop(); 80 virtual sp<MetaData> getFormat(); 81 82 virtual status_t read( 83 MediaBuffer **buffer, const ReadOptions *options); 84 85 protected: 86 virtual ~WrappedTrack(); 87 88 private: 89 sp<MPEG2PSExtractor> mExtractor; 90 sp<MPEG2PSExtractor::Track> mTrack; 91 92 DISALLOW_EVIL_CONSTRUCTORS(WrappedTrack); 93 }; 94 95 //////////////////////////////////////////////////////////////////////////////// 96 97 MPEG2PSExtractor::MPEG2PSExtractor(const sp<DataSource> &source) 98 : mDataSource(source), 99 mOffset(0), 100 mFinalResult(OK), 101 mBuffer(new ABuffer(0)), 102 mScanning(true), 103 mProgramStreamMapValid(false) { 104 for (size_t i = 0; i < 500; ++i) { 105 if (feedMore() != OK) { 106 break; 107 } 108 } 109 110 // Remove all tracks that were unable to determine their format. 111 for (size_t i = mTracks.size(); i-- > 0;) { 112 if (mTracks.valueAt(i)->getFormat() == NULL) { 113 mTracks.removeItemsAt(i); 114 } 115 } 116 117 mScanning = false; 118 } 119 120 MPEG2PSExtractor::~MPEG2PSExtractor() { 121 } 122 123 size_t MPEG2PSExtractor::countTracks() { 124 return mTracks.size(); 125 } 126 127 sp<MediaSource> MPEG2PSExtractor::getTrack(size_t index) { 128 if (index >= mTracks.size()) { 129 return NULL; 130 } 131 132 return new WrappedTrack(this, mTracks.valueAt(index)); 133 } 134 135 sp<MetaData> MPEG2PSExtractor::getTrackMetaData( 136 size_t index, uint32_t /* flags */) { 137 if (index >= mTracks.size()) { 138 return NULL; 139 } 140 141 return mTracks.valueAt(index)->getFormat(); 142 } 143 144 sp<MetaData> MPEG2PSExtractor::getMetaData() { 145 sp<MetaData> meta = new MetaData; 146 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_CONTAINER_MPEG2PS); 147 148 return meta; 149 } 150 151 uint32_t MPEG2PSExtractor::flags() const { 152 return CAN_PAUSE; 153 } 154 155 status_t MPEG2PSExtractor::feedMore() { 156 Mutex::Autolock autoLock(mLock); 157 158 // How much data we're reading at a time 159 static const size_t kChunkSize = 8192; 160 161 for (;;) { 162 status_t err = dequeueChunk(); 163 164 if (err == -EAGAIN && mFinalResult == OK) { 165 memmove(mBuffer->base(), mBuffer->data(), mBuffer->size()); 166 mBuffer->setRange(0, mBuffer->size()); 167 168 if (mBuffer->size() + kChunkSize > mBuffer->capacity()) { 169 size_t newCapacity = mBuffer->capacity() + kChunkSize; 170 sp<ABuffer> newBuffer = new ABuffer(newCapacity); 171 memcpy(newBuffer->data(), mBuffer->data(), mBuffer->size()); 172 newBuffer->setRange(0, mBuffer->size()); 173 mBuffer = newBuffer; 174 } 175 176 ssize_t n = mDataSource->readAt( 177 mOffset, mBuffer->data() + mBuffer->size(), kChunkSize); 178 179 if (n < (ssize_t)kChunkSize) { 180 mFinalResult = (n < 0) ? (status_t)n : ERROR_END_OF_STREAM; 181 return mFinalResult; 182 } 183 184 mBuffer->setRange(mBuffer->offset(), mBuffer->size() + n); 185 mOffset += n; 186 } else if (err != OK) { 187 mFinalResult = err; 188 return err; 189 } else { 190 return OK; 191 } 192 } 193 } 194 195 status_t MPEG2PSExtractor::dequeueChunk() { 196 if (mBuffer->size() < 4) { 197 return -EAGAIN; 198 } 199 200 if (memcmp("\x00\x00\x01", mBuffer->data(), 3)) { 201 return ERROR_MALFORMED; 202 } 203 204 unsigned chunkType = mBuffer->data()[3]; 205 206 ssize_t res; 207 208 switch (chunkType) { 209 case 0xba: 210 { 211 res = dequeuePack(); 212 break; 213 } 214 215 case 0xbb: 216 { 217 res = dequeueSystemHeader(); 218 break; 219 } 220 221 default: 222 { 223 res = dequeuePES(); 224 break; 225 } 226 } 227 228 if (res > 0) { 229 if (mBuffer->size() < (size_t)res) { 230 return -EAGAIN; 231 } 232 233 mBuffer->setRange(mBuffer->offset() + res, mBuffer->size() - res); 234 res = OK; 235 } 236 237 return res; 238 } 239 240 ssize_t MPEG2PSExtractor::dequeuePack() { 241 // 32 + 2 + 3 + 1 + 15 + 1 + 15+ 1 + 9 + 1 + 22 + 1 + 1 | +5 242 243 if (mBuffer->size() < 14) { 244 return -EAGAIN; 245 } 246 247 unsigned pack_stuffing_length = mBuffer->data()[13] & 7; 248 249 return pack_stuffing_length + 14; 250 } 251 252 ssize_t MPEG2PSExtractor::dequeueSystemHeader() { 253 if (mBuffer->size() < 6) { 254 return -EAGAIN; 255 } 256 257 unsigned header_length = U16_AT(mBuffer->data() + 4); 258 259 return header_length + 6; 260 } 261 262 ssize_t MPEG2PSExtractor::dequeuePES() { 263 if (mBuffer->size() < 6) { 264 return -EAGAIN; 265 } 266 267 unsigned PES_packet_length = U16_AT(mBuffer->data() + 4); 268 CHECK_NE(PES_packet_length, 0u); 269 270 size_t n = PES_packet_length + 6; 271 272 if (mBuffer->size() < n) { 273 return -EAGAIN; 274 } 275 276 ABitReader br(mBuffer->data(), n); 277 278 unsigned packet_startcode_prefix = br.getBits(24); 279 280 ALOGV("packet_startcode_prefix = 0x%08x", packet_startcode_prefix); 281 282 if (packet_startcode_prefix != 1) { 283 ALOGV("Supposedly payload_unit_start=1 unit does not start " 284 "with startcode."); 285 286 return ERROR_MALFORMED; 287 } 288 289 CHECK_EQ(packet_startcode_prefix, 0x000001u); 290 291 unsigned stream_id = br.getBits(8); 292 ALOGV("stream_id = 0x%02x", stream_id); 293 294 /* unsigned PES_packet_length = */br.getBits(16); 295 296 if (stream_id == 0xbc) { 297 // program_stream_map 298 299 if (!mScanning) { 300 return n; 301 } 302 303 mStreamTypeByESID.clear(); 304 305 /* unsigned current_next_indicator = */br.getBits(1); 306 /* unsigned reserved = */br.getBits(2); 307 /* unsigned program_stream_map_version = */br.getBits(5); 308 /* unsigned reserved = */br.getBits(7); 309 /* unsigned marker_bit = */br.getBits(1); 310 unsigned program_stream_info_length = br.getBits(16); 311 312 size_t offset = 0; 313 while (offset < program_stream_info_length) { 314 if (offset + 2 > program_stream_info_length) { 315 return ERROR_MALFORMED; 316 } 317 318 unsigned descriptor_tag = br.getBits(8); 319 unsigned descriptor_length = br.getBits(8); 320 321 ALOGI("found descriptor tag 0x%02x of length %u", 322 descriptor_tag, descriptor_length); 323 324 if (offset + 2 + descriptor_length > program_stream_info_length) { 325 return ERROR_MALFORMED; 326 } 327 328 br.skipBits(8 * descriptor_length); 329 330 offset += 2 + descriptor_length; 331 } 332 333 unsigned elementary_stream_map_length = br.getBits(16); 334 335 offset = 0; 336 while (offset < elementary_stream_map_length) { 337 if (offset + 4 > elementary_stream_map_length) { 338 return ERROR_MALFORMED; 339 } 340 341 unsigned stream_type = br.getBits(8); 342 unsigned elementary_stream_id = br.getBits(8); 343 344 ALOGI("elementary stream id 0x%02x has stream type 0x%02x", 345 elementary_stream_id, stream_type); 346 347 mStreamTypeByESID.add(elementary_stream_id, stream_type); 348 349 unsigned elementary_stream_info_length = br.getBits(16); 350 351 if (offset + 4 + elementary_stream_info_length 352 > elementary_stream_map_length) { 353 return ERROR_MALFORMED; 354 } 355 356 offset += 4 + elementary_stream_info_length; 357 } 358 359 /* unsigned CRC32 = */br.getBits(32); 360 361 mProgramStreamMapValid = true; 362 } else if (stream_id != 0xbe // padding_stream 363 && stream_id != 0xbf // private_stream_2 364 && stream_id != 0xf0 // ECM 365 && stream_id != 0xf1 // EMM 366 && stream_id != 0xff // program_stream_directory 367 && stream_id != 0xf2 // DSMCC 368 && stream_id != 0xf8) { // H.222.1 type E 369 CHECK_EQ(br.getBits(2), 2u); 370 371 /* unsigned PES_scrambling_control = */br.getBits(2); 372 /* unsigned PES_priority = */br.getBits(1); 373 /* unsigned data_alignment_indicator = */br.getBits(1); 374 /* unsigned copyright = */br.getBits(1); 375 /* unsigned original_or_copy = */br.getBits(1); 376 377 unsigned PTS_DTS_flags = br.getBits(2); 378 ALOGV("PTS_DTS_flags = %u", PTS_DTS_flags); 379 380 unsigned ESCR_flag = br.getBits(1); 381 ALOGV("ESCR_flag = %u", ESCR_flag); 382 383 unsigned ES_rate_flag = br.getBits(1); 384 ALOGV("ES_rate_flag = %u", ES_rate_flag); 385 386 unsigned DSM_trick_mode_flag = br.getBits(1); 387 ALOGV("DSM_trick_mode_flag = %u", DSM_trick_mode_flag); 388 389 unsigned additional_copy_info_flag = br.getBits(1); 390 ALOGV("additional_copy_info_flag = %u", additional_copy_info_flag); 391 392 /* unsigned PES_CRC_flag = */br.getBits(1); 393 /* PES_extension_flag = */br.getBits(1); 394 395 unsigned PES_header_data_length = br.getBits(8); 396 ALOGV("PES_header_data_length = %u", PES_header_data_length); 397 398 unsigned optional_bytes_remaining = PES_header_data_length; 399 400 uint64_t PTS = 0, DTS = 0; 401 402 if (PTS_DTS_flags == 2 || PTS_DTS_flags == 3) { 403 CHECK_GE(optional_bytes_remaining, 5u); 404 405 CHECK_EQ(br.getBits(4), PTS_DTS_flags); 406 407 PTS = ((uint64_t)br.getBits(3)) << 30; 408 CHECK_EQ(br.getBits(1), 1u); 409 PTS |= ((uint64_t)br.getBits(15)) << 15; 410 CHECK_EQ(br.getBits(1), 1u); 411 PTS |= br.getBits(15); 412 CHECK_EQ(br.getBits(1), 1u); 413 414 ALOGV("PTS = %" PRIu64, PTS); 415 // ALOGI("PTS = %.2f secs", PTS / 90000.0f); 416 417 optional_bytes_remaining -= 5; 418 419 if (PTS_DTS_flags == 3) { 420 CHECK_GE(optional_bytes_remaining, 5u); 421 422 CHECK_EQ(br.getBits(4), 1u); 423 424 DTS = ((uint64_t)br.getBits(3)) << 30; 425 CHECK_EQ(br.getBits(1), 1u); 426 DTS |= ((uint64_t)br.getBits(15)) << 15; 427 CHECK_EQ(br.getBits(1), 1u); 428 DTS |= br.getBits(15); 429 CHECK_EQ(br.getBits(1), 1u); 430 431 ALOGV("DTS = %" PRIu64, DTS); 432 433 optional_bytes_remaining -= 5; 434 } 435 } 436 437 if (ESCR_flag) { 438 CHECK_GE(optional_bytes_remaining, 6u); 439 440 br.getBits(2); 441 442 uint64_t ESCR = ((uint64_t)br.getBits(3)) << 30; 443 CHECK_EQ(br.getBits(1), 1u); 444 ESCR |= ((uint64_t)br.getBits(15)) << 15; 445 CHECK_EQ(br.getBits(1), 1u); 446 ESCR |= br.getBits(15); 447 CHECK_EQ(br.getBits(1), 1u); 448 449 ALOGV("ESCR = %" PRIu64, ESCR); 450 /* unsigned ESCR_extension = */br.getBits(9); 451 452 CHECK_EQ(br.getBits(1), 1u); 453 454 optional_bytes_remaining -= 6; 455 } 456 457 if (ES_rate_flag) { 458 CHECK_GE(optional_bytes_remaining, 3u); 459 460 CHECK_EQ(br.getBits(1), 1u); 461 /* unsigned ES_rate = */br.getBits(22); 462 CHECK_EQ(br.getBits(1), 1u); 463 464 optional_bytes_remaining -= 3; 465 } 466 467 br.skipBits(optional_bytes_remaining * 8); 468 469 // ES data follows. 470 471 CHECK_GE(PES_packet_length, PES_header_data_length + 3); 472 473 unsigned dataLength = 474 PES_packet_length - 3 - PES_header_data_length; 475 476 if (br.numBitsLeft() < dataLength * 8) { 477 ALOGE("PES packet does not carry enough data to contain " 478 "payload. (numBitsLeft = %zu, required = %u)", 479 br.numBitsLeft(), dataLength * 8); 480 481 return ERROR_MALFORMED; 482 } 483 484 CHECK_GE(br.numBitsLeft(), dataLength * 8); 485 486 ssize_t index = mTracks.indexOfKey(stream_id); 487 if (index < 0 && mScanning) { 488 unsigned streamType; 489 490 ssize_t streamTypeIndex; 491 if (mProgramStreamMapValid 492 && (streamTypeIndex = 493 mStreamTypeByESID.indexOfKey(stream_id)) >= 0) { 494 streamType = mStreamTypeByESID.valueAt(streamTypeIndex); 495 } else if ((stream_id & ~0x1f) == 0xc0) { 496 // ISO/IEC 13818-3 or ISO/IEC 11172-3 or ISO/IEC 13818-7 497 // or ISO/IEC 14496-3 audio 498 streamType = ATSParser::STREAMTYPE_MPEG2_AUDIO; 499 } else if ((stream_id & ~0x0f) == 0xe0) { 500 // ISO/IEC 13818-2 or ISO/IEC 11172-2 or ISO/IEC 14496-2 video 501 streamType = ATSParser::STREAMTYPE_MPEG2_VIDEO; 502 } else { 503 streamType = ATSParser::STREAMTYPE_RESERVED; 504 } 505 506 index = mTracks.add( 507 stream_id, new Track(this, stream_id, streamType)); 508 } 509 510 status_t err = OK; 511 512 if (index >= 0) { 513 err = 514 mTracks.editValueAt(index)->appendPESData( 515 PTS_DTS_flags, PTS, DTS, br.data(), dataLength); 516 } 517 518 br.skipBits(dataLength * 8); 519 520 if (err != OK) { 521 return err; 522 } 523 } else if (stream_id == 0xbe) { // padding_stream 524 CHECK_NE(PES_packet_length, 0u); 525 br.skipBits(PES_packet_length * 8); 526 } else { 527 CHECK_NE(PES_packet_length, 0u); 528 br.skipBits(PES_packet_length * 8); 529 } 530 531 return n; 532 } 533 534 //////////////////////////////////////////////////////////////////////////////// 535 536 MPEG2PSExtractor::Track::Track( 537 MPEG2PSExtractor *extractor, unsigned stream_id, unsigned stream_type) 538 : mExtractor(extractor), 539 mStreamID(stream_id), 540 mStreamType(stream_type), 541 mQueue(NULL) { 542 bool supported = true; 543 ElementaryStreamQueue::Mode mode; 544 545 switch (mStreamType) { 546 case ATSParser::STREAMTYPE_H264: 547 mode = ElementaryStreamQueue::H264; 548 break; 549 case ATSParser::STREAMTYPE_MPEG2_AUDIO_ADTS: 550 mode = ElementaryStreamQueue::AAC; 551 break; 552 case ATSParser::STREAMTYPE_MPEG1_AUDIO: 553 case ATSParser::STREAMTYPE_MPEG2_AUDIO: 554 mode = ElementaryStreamQueue::MPEG_AUDIO; 555 break; 556 557 case ATSParser::STREAMTYPE_MPEG1_VIDEO: 558 case ATSParser::STREAMTYPE_MPEG2_VIDEO: 559 mode = ElementaryStreamQueue::MPEG_VIDEO; 560 break; 561 562 case ATSParser::STREAMTYPE_MPEG4_VIDEO: 563 mode = ElementaryStreamQueue::MPEG4_VIDEO; 564 break; 565 566 default: 567 supported = false; 568 break; 569 } 570 571 if (supported) { 572 mQueue = new ElementaryStreamQueue(mode); 573 } else { 574 ALOGI("unsupported stream ID 0x%02x", stream_id); 575 } 576 } 577 578 MPEG2PSExtractor::Track::~Track() { 579 delete mQueue; 580 mQueue = NULL; 581 } 582 583 status_t MPEG2PSExtractor::Track::start(MetaData *params) { 584 if (mSource == NULL) { 585 return NO_INIT; 586 } 587 588 return mSource->start(params); 589 } 590 591 status_t MPEG2PSExtractor::Track::stop() { 592 if (mSource == NULL) { 593 return NO_INIT; 594 } 595 596 return mSource->stop(); 597 } 598 599 sp<MetaData> MPEG2PSExtractor::Track::getFormat() { 600 if (mSource == NULL) { 601 return NULL; 602 } 603 604 return mSource->getFormat(); 605 } 606 607 status_t MPEG2PSExtractor::Track::read( 608 MediaBuffer **buffer, const ReadOptions *options) { 609 if (mSource == NULL) { 610 return NO_INIT; 611 } 612 613 status_t finalResult; 614 while (!mSource->hasBufferAvailable(&finalResult)) { 615 if (finalResult != OK) { 616 return ERROR_END_OF_STREAM; 617 } 618 619 status_t err = mExtractor->feedMore(); 620 621 if (err != OK) { 622 mSource->signalEOS(err); 623 } 624 } 625 626 return mSource->read(buffer, options); 627 } 628 629 status_t MPEG2PSExtractor::Track::appendPESData( 630 unsigned PTS_DTS_flags, 631 uint64_t PTS, uint64_t /* DTS */, 632 const uint8_t *data, size_t size) { 633 if (mQueue == NULL) { 634 return OK; 635 } 636 637 int64_t timeUs; 638 if (PTS_DTS_flags == 2 || PTS_DTS_flags == 3) { 639 timeUs = (PTS * 100) / 9; 640 } else { 641 timeUs = 0; 642 } 643 644 status_t err = mQueue->appendData(data, size, timeUs); 645 646 if (err != OK) { 647 return err; 648 } 649 650 sp<ABuffer> accessUnit; 651 while ((accessUnit = mQueue->dequeueAccessUnit()) != NULL) { 652 if (mSource == NULL) { 653 sp<MetaData> meta = mQueue->getFormat(); 654 655 if (meta != NULL) { 656 ALOGV("Stream ID 0x%02x now has data.", mStreamID); 657 658 mSource = new AnotherPacketSource(meta); 659 mSource->queueAccessUnit(accessUnit); 660 } 661 } else if (mQueue->getFormat() != NULL) { 662 mSource->queueAccessUnit(accessUnit); 663 } 664 } 665 666 return OK; 667 } 668 669 //////////////////////////////////////////////////////////////////////////////// 670 671 MPEG2PSExtractor::WrappedTrack::WrappedTrack( 672 const sp<MPEG2PSExtractor> &extractor, const sp<Track> &track) 673 : mExtractor(extractor), 674 mTrack(track) { 675 } 676 677 MPEG2PSExtractor::WrappedTrack::~WrappedTrack() { 678 } 679 680 status_t MPEG2PSExtractor::WrappedTrack::start(MetaData *params) { 681 return mTrack->start(params); 682 } 683 684 status_t MPEG2PSExtractor::WrappedTrack::stop() { 685 return mTrack->stop(); 686 } 687 688 sp<MetaData> MPEG2PSExtractor::WrappedTrack::getFormat() { 689 return mTrack->getFormat(); 690 } 691 692 status_t MPEG2PSExtractor::WrappedTrack::read( 693 MediaBuffer **buffer, const ReadOptions *options) { 694 return mTrack->read(buffer, options); 695 } 696 697 //////////////////////////////////////////////////////////////////////////////// 698 699 bool SniffMPEG2PS( 700 const sp<DataSource> &source, String8 *mimeType, float *confidence, 701 sp<AMessage> *) { 702 uint8_t header[5]; 703 if (source->readAt(0, header, sizeof(header)) < (ssize_t)sizeof(header)) { 704 return false; 705 } 706 707 if (memcmp("\x00\x00\x01\xba", header, 4) || (header[4] >> 6) != 1) { 708 return false; 709 } 710 711 *confidence = 0.25f; // Slightly larger than .mp3 extractor's confidence 712 713 mimeType->setTo(MEDIA_MIMETYPE_CONTAINER_MPEG2PS); 714 715 return true; 716 } 717 718 } // namespace android 719