12944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber/* 22944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber * Copyright (C) 2011 The Android Open Source Project 32944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber * 42944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 52944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber * you may not use this file except in compliance with the License. 62944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber * You may obtain a copy of the License at 72944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber * 82944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber * http://www.apache.org/licenses/LICENSE-2.0 92944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber * 102944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber * Unless required by applicable law or agreed to in writing, software 112944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 122944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber * See the License for the specific language governing permissions and 142944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber * limitations under the License. 152944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber */ 162944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 172944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber//#define LOG_NDEBUG 0 182944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber#define LOG_TAG "MPEG2PSExtractor" 192944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber#include <utils/Log.h> 202944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 212944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber#include "include/MPEG2PSExtractor.h" 222944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 232944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber#include "AnotherPacketSource.h" 242944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber#include "ESQueue.h" 252944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 262944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber#include <media/stagefright/foundation/ABitReader.h> 272944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber#include <media/stagefright/foundation/ABuffer.h> 282944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber#include <media/stagefright/foundation/ADebug.h> 292944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber#include <media/stagefright/foundation/AMessage.h> 302944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber#include <media/stagefright/foundation/hexdump.h> 312944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber#include <media/stagefright/DataSource.h> 322944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber#include <media/stagefright/MediaDefs.h> 332944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber#include <media/stagefright/MediaErrors.h> 342944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber#include <media/stagefright/MediaSource.h> 352944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber#include <media/stagefright/MetaData.h> 362944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber#include <media/stagefright/Utils.h> 372944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber#include <utils/String8.h> 382944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 39b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross#include <inttypes.h> 40b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross 412944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Hubernamespace android { 422944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 432944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huberstruct MPEG2PSExtractor::Track : public MediaSource { 442944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber Track(MPEG2PSExtractor *extractor, 452944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber unsigned stream_id, unsigned stream_type); 462944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 472944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber virtual status_t start(MetaData *params); 482944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber virtual status_t stop(); 492944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber virtual sp<MetaData> getFormat(); 502944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 512944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber virtual status_t read( 522944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber MediaBuffer **buffer, const ReadOptions *options); 532944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 542944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huberprotected: 552944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber virtual ~Track(); 562944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 572944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huberprivate: 582944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber friend struct MPEG2PSExtractor; 592944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 602944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber MPEG2PSExtractor *mExtractor; 612944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 622944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber unsigned mStreamID; 632944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber unsigned mStreamType; 642944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber ElementaryStreamQueue *mQueue; 652944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber sp<AnotherPacketSource> mSource; 662944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 672944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber status_t appendPESData( 682944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber unsigned PTS_DTS_flags, 692944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber uint64_t PTS, uint64_t DTS, 702944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber const uint8_t *data, size_t size); 712944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 722944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber DISALLOW_EVIL_CONSTRUCTORS(Track); 732944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber}; 742944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 752944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huberstruct MPEG2PSExtractor::WrappedTrack : public MediaSource { 762944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber WrappedTrack(const sp<MPEG2PSExtractor> &extractor, const sp<Track> &track); 772944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 782944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber virtual status_t start(MetaData *params); 792944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber virtual status_t stop(); 802944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber virtual sp<MetaData> getFormat(); 812944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 822944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber virtual status_t read( 832944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber MediaBuffer **buffer, const ReadOptions *options); 842944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 852944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huberprotected: 862944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber virtual ~WrappedTrack(); 872944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 882944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huberprivate: 892944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber sp<MPEG2PSExtractor> mExtractor; 902944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber sp<MPEG2PSExtractor::Track> mTrack; 912944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 922944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber DISALLOW_EVIL_CONSTRUCTORS(WrappedTrack); 932944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber}; 942944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 952944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber//////////////////////////////////////////////////////////////////////////////// 962944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 972944eca607304a095ea43ba2b8f0b9de61249f9fAndreas HuberMPEG2PSExtractor::MPEG2PSExtractor(const sp<DataSource> &source) 982944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber : mDataSource(source), 992944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mOffset(0), 1002944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mFinalResult(OK), 1012944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mBuffer(new ABuffer(0)), 1022944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mScanning(true), 1032944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mProgramStreamMapValid(false) { 1042944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber for (size_t i = 0; i < 500; ++i) { 1052944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (feedMore() != OK) { 1062944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber break; 1072944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 1082944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 1092944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 1102944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber // Remove all tracks that were unable to determine their format. 1116325a7384138a73bb1fb34b776f0bb8b1dc94e60Chad Brubaker for (size_t i = mTracks.size(); i > 0;) { 1126325a7384138a73bb1fb34b776f0bb8b1dc94e60Chad Brubaker i--; 1132944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (mTracks.valueAt(i)->getFormat() == NULL) { 1142944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mTracks.removeItemsAt(i); 1152944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 1162944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 1172944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 1182944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mScanning = false; 1192944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} 1202944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 1212944eca607304a095ea43ba2b8f0b9de61249f9fAndreas HuberMPEG2PSExtractor::~MPEG2PSExtractor() { 1222944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} 1232944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 1242944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Hubersize_t MPEG2PSExtractor::countTracks() { 1252944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return mTracks.size(); 1262944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} 1272944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 128b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissensp<IMediaSource> MPEG2PSExtractor::getTrack(size_t index) { 1292944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (index >= mTracks.size()) { 1302944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return NULL; 1312944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 1322944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 1332944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return new WrappedTrack(this, mTracks.valueAt(index)); 1342944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} 1352944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 13684333e0475bc911adc16417f4ca327c975cf6c36Andreas Hubersp<MetaData> MPEG2PSExtractor::getTrackMetaData( 13784333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber size_t index, uint32_t /* flags */) { 1382944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (index >= mTracks.size()) { 1392944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return NULL; 1402944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 1412944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 1422944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return mTracks.valueAt(index)->getFormat(); 1432944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} 1442944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 1452944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Hubersp<MetaData> MPEG2PSExtractor::getMetaData() { 1462944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber sp<MetaData> meta = new MetaData; 1472944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_CONTAINER_MPEG2PS); 1482944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 1492944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return meta; 1502944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} 1512944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 1522944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huberuint32_t MPEG2PSExtractor::flags() const { 1532944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return CAN_PAUSE; 1542944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} 1552944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 1562944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huberstatus_t MPEG2PSExtractor::feedMore() { 1572944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber Mutex::Autolock autoLock(mLock); 1582944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 1592944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber // How much data we're reading at a time 1602944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber static const size_t kChunkSize = 8192; 1612944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 1622944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber for (;;) { 1632944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber status_t err = dequeueChunk(); 1642944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 1652944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (err == -EAGAIN && mFinalResult == OK) { 1662944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber memmove(mBuffer->base(), mBuffer->data(), mBuffer->size()); 1672944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mBuffer->setRange(0, mBuffer->size()); 1682944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 1692944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (mBuffer->size() + kChunkSize > mBuffer->capacity()) { 1702944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber size_t newCapacity = mBuffer->capacity() + kChunkSize; 1712944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber sp<ABuffer> newBuffer = new ABuffer(newCapacity); 1722944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber memcpy(newBuffer->data(), mBuffer->data(), mBuffer->size()); 1732944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber newBuffer->setRange(0, mBuffer->size()); 1742944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mBuffer = newBuffer; 1752944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 1762944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 1772944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber ssize_t n = mDataSource->readAt( 1782944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mOffset, mBuffer->data() + mBuffer->size(), kChunkSize); 1792944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 1802944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (n < (ssize_t)kChunkSize) { 1812944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mFinalResult = (n < 0) ? (status_t)n : ERROR_END_OF_STREAM; 1822944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return mFinalResult; 1832944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 1842944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 1852944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mBuffer->setRange(mBuffer->offset(), mBuffer->size() + n); 1862944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mOffset += n; 1872944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } else if (err != OK) { 1882944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mFinalResult = err; 1892944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return err; 1902944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } else { 1912944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return OK; 1922944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 1932944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 1942944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} 1952944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 1962944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huberstatus_t MPEG2PSExtractor::dequeueChunk() { 1972944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (mBuffer->size() < 4) { 1982944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return -EAGAIN; 1992944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 2002944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2012944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (memcmp("\x00\x00\x01", mBuffer->data(), 3)) { 2022944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return ERROR_MALFORMED; 2032944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 2042944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2052944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber unsigned chunkType = mBuffer->data()[3]; 2062944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2072944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber ssize_t res; 2082944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2092944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber switch (chunkType) { 2102944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber case 0xba: 2112944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber { 2122944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber res = dequeuePack(); 2132944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber break; 2142944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 2152944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2162944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber case 0xbb: 2172944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber { 2182944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber res = dequeueSystemHeader(); 2192944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber break; 2202944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 2212944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2222944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber default: 2232944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber { 2242944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber res = dequeuePES(); 2252944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber break; 2262944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 2272944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 2282944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2292944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (res > 0) { 2302944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (mBuffer->size() < (size_t)res) { 2312944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return -EAGAIN; 2322944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 2332944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2342944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mBuffer->setRange(mBuffer->offset() + res, mBuffer->size() - res); 2352944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber res = OK; 2362944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 2372944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2382944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return res; 2392944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} 2402944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2412944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huberssize_t MPEG2PSExtractor::dequeuePack() { 2422944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber // 32 + 2 + 3 + 1 + 15 + 1 + 15+ 1 + 9 + 1 + 22 + 1 + 1 | +5 2432944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2442944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (mBuffer->size() < 14) { 2452944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return -EAGAIN; 2462944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 2472944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2482944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber unsigned pack_stuffing_length = mBuffer->data()[13] & 7; 2492944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2502944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return pack_stuffing_length + 14; 2512944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} 2522944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2532944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huberssize_t MPEG2PSExtractor::dequeueSystemHeader() { 2542944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (mBuffer->size() < 6) { 2552944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return -EAGAIN; 2562944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 2572944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2582944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber unsigned header_length = U16_AT(mBuffer->data() + 4); 2592944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2602944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return header_length + 6; 2612944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} 2622944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2632944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huberssize_t MPEG2PSExtractor::dequeuePES() { 2642944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (mBuffer->size() < 6) { 2652944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return -EAGAIN; 2662944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 2672944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2682944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber unsigned PES_packet_length = U16_AT(mBuffer->data() + 4); 269e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (PES_packet_length == 0u) { 270e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim ALOGE("PES_packet_length is 0"); 271e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return -EAGAIN; 272e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 2732944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2742944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber size_t n = PES_packet_length + 6; 2752944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2762944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (mBuffer->size() < n) { 2772944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return -EAGAIN; 2782944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 2792944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2802944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber ABitReader br(mBuffer->data(), n); 2812944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2822944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber unsigned packet_startcode_prefix = br.getBits(24); 2832944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2843856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("packet_startcode_prefix = 0x%08x", packet_startcode_prefix); 2852944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2862944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (packet_startcode_prefix != 1) { 2873856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Supposedly payload_unit_start=1 unit does not start " 2882944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber "with startcode."); 2892944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2902944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return ERROR_MALFORMED; 2912944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 2922944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 293e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (packet_startcode_prefix != 0x000001u) { 294e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim ALOGE("Wrong PES prefix"); 295e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 296e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 2972944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2982944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber unsigned stream_id = br.getBits(8); 2993856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("stream_id = 0x%02x", stream_id); 3002944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 3012944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber /* unsigned PES_packet_length = */br.getBits(16); 3022944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 3032944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (stream_id == 0xbc) { 3042944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber // program_stream_map 3052944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 3062944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (!mScanning) { 3072944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return n; 3082944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 3092944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 3102944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mStreamTypeByESID.clear(); 3112944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 3122944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber /* unsigned current_next_indicator = */br.getBits(1); 3132944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber /* unsigned reserved = */br.getBits(2); 3142944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber /* unsigned program_stream_map_version = */br.getBits(5); 3152944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber /* unsigned reserved = */br.getBits(7); 3162944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber /* unsigned marker_bit = */br.getBits(1); 3172944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber unsigned program_stream_info_length = br.getBits(16); 3182944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 3192944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber size_t offset = 0; 3202944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber while (offset < program_stream_info_length) { 3212944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (offset + 2 > program_stream_info_length) { 3222944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return ERROR_MALFORMED; 3232944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 3242944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 3252944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber unsigned descriptor_tag = br.getBits(8); 3262944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber unsigned descriptor_length = br.getBits(8); 3272944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 328df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block ALOGI("found descriptor tag 0x%02x of length %u", 3292944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber descriptor_tag, descriptor_length); 3302944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 3312944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (offset + 2 + descriptor_length > program_stream_info_length) { 3322944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return ERROR_MALFORMED; 3332944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 3342944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 3352944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber br.skipBits(8 * descriptor_length); 3362944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 3372944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber offset += 2 + descriptor_length; 3382944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 3392944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 3402944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber unsigned elementary_stream_map_length = br.getBits(16); 3412944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 3422944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber offset = 0; 3432944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber while (offset < elementary_stream_map_length) { 3442944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (offset + 4 > elementary_stream_map_length) { 3452944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return ERROR_MALFORMED; 3462944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 3472944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 3482944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber unsigned stream_type = br.getBits(8); 3492944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber unsigned elementary_stream_id = br.getBits(8); 3502944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 351df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block ALOGI("elementary stream id 0x%02x has stream type 0x%02x", 3522944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber elementary_stream_id, stream_type); 3532944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 3542944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mStreamTypeByESID.add(elementary_stream_id, stream_type); 3552944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 3562944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber unsigned elementary_stream_info_length = br.getBits(16); 3572944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 3582944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (offset + 4 + elementary_stream_info_length 3592944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber > elementary_stream_map_length) { 3602944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return ERROR_MALFORMED; 3612944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 3622944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 3632944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber offset += 4 + elementary_stream_info_length; 3642944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 3652944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 3662944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber /* unsigned CRC32 = */br.getBits(32); 3672944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 3682944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mProgramStreamMapValid = true; 3692944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } else if (stream_id != 0xbe // padding_stream 3702944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber && stream_id != 0xbf // private_stream_2 3712944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber && stream_id != 0xf0 // ECM 3722944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber && stream_id != 0xf1 // EMM 3732944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber && stream_id != 0xff // program_stream_directory 3742944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber && stream_id != 0xf2 // DSMCC 3752944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber && stream_id != 0xf8) { // H.222.1 type E 376e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim /* unsigned PES_marker_bits = */br.getBits(2); // should be 0x2(hex) 3772944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber /* unsigned PES_scrambling_control = */br.getBits(2); 3782944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber /* unsigned PES_priority = */br.getBits(1); 3792944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber /* unsigned data_alignment_indicator = */br.getBits(1); 3802944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber /* unsigned copyright = */br.getBits(1); 3812944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber /* unsigned original_or_copy = */br.getBits(1); 3822944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 3832944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber unsigned PTS_DTS_flags = br.getBits(2); 3843856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("PTS_DTS_flags = %u", PTS_DTS_flags); 3852944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 3862944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber unsigned ESCR_flag = br.getBits(1); 3873856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("ESCR_flag = %u", ESCR_flag); 3882944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 3892944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber unsigned ES_rate_flag = br.getBits(1); 3903856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("ES_rate_flag = %u", ES_rate_flag); 3912944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 3922944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber unsigned DSM_trick_mode_flag = br.getBits(1); 3933856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("DSM_trick_mode_flag = %u", DSM_trick_mode_flag); 3942944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 3952944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber unsigned additional_copy_info_flag = br.getBits(1); 3963856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("additional_copy_info_flag = %u", additional_copy_info_flag); 3972944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 3982944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber /* unsigned PES_CRC_flag = */br.getBits(1); 3992944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber /* PES_extension_flag = */br.getBits(1); 4002944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 4012944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber unsigned PES_header_data_length = br.getBits(8); 4023856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("PES_header_data_length = %u", PES_header_data_length); 4032944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 4042944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber unsigned optional_bytes_remaining = PES_header_data_length; 4052944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 4062944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber uint64_t PTS = 0, DTS = 0; 4072944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 4082944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (PTS_DTS_flags == 2 || PTS_DTS_flags == 3) { 409e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (optional_bytes_remaining < 5u) { 410e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 411e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 4122944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 413e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (br.getBits(4) != PTS_DTS_flags) { 414e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 415e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 4162944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 4172944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber PTS = ((uint64_t)br.getBits(3)) << 30; 418e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (br.getBits(1) != 1u) { 419e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 420e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 4212944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber PTS |= ((uint64_t)br.getBits(15)) << 15; 422e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (br.getBits(1) != 1u) { 423e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 424e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 4252944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber PTS |= br.getBits(15); 426e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (br.getBits(1) != 1u) { 427e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 428e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 4292944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 430b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross ALOGV("PTS = %" PRIu64, PTS); 431df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block // ALOGI("PTS = %.2f secs", PTS / 90000.0f); 4322944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 4332944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber optional_bytes_remaining -= 5; 4342944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 4352944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (PTS_DTS_flags == 3) { 436e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (optional_bytes_remaining < 5u) { 437e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 438e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 4392944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 440e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (br.getBits(4) != 1u) { 441e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 442e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 4432944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 4442944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber DTS = ((uint64_t)br.getBits(3)) << 30; 445e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (br.getBits(1) != 1u) { 446e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 447e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 4482944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber DTS |= ((uint64_t)br.getBits(15)) << 15; 449e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (br.getBits(1) != 1u) { 450e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 451e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 4522944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber DTS |= br.getBits(15); 453e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (br.getBits(1) != 1u) { 454e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 455e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 4562944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 457b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross ALOGV("DTS = %" PRIu64, DTS); 4582944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 4592944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber optional_bytes_remaining -= 5; 4602944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 4612944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 4622944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 4632944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (ESCR_flag) { 464e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (optional_bytes_remaining < 6u) { 465e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 466e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 4672944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 4682944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber br.getBits(2); 4692944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 4702944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber uint64_t ESCR = ((uint64_t)br.getBits(3)) << 30; 471e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (br.getBits(1) != 1u) { 472e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 473e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 4742944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber ESCR |= ((uint64_t)br.getBits(15)) << 15; 475e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (br.getBits(1) != 1u) { 476e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 477e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 4782944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber ESCR |= br.getBits(15); 479e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (br.getBits(1) != 1u) { 480e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 481e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 4822944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 483b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross ALOGV("ESCR = %" PRIu64, ESCR); 4842944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber /* unsigned ESCR_extension = */br.getBits(9); 4852944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 486e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (br.getBits(1) != 1u) { 487e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 488e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 4892944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 4902944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber optional_bytes_remaining -= 6; 4912944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 4922944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 4932944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (ES_rate_flag) { 494e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (optional_bytes_remaining < 3u) { 495e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 496e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 4972944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 498e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (br.getBits(1) != 1u) { 499e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 500e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 5012944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber /* unsigned ES_rate = */br.getBits(22); 502e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (br.getBits(1) != 1u) { 503e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 504e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 5052944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 5062944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber optional_bytes_remaining -= 3; 5072944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 5082944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 5099ae62202b2bb19cc870361af7edd8e43f823d372Robert Shih if (br.numBitsLeft() < optional_bytes_remaining * 8) { 5109ae62202b2bb19cc870361af7edd8e43f823d372Robert Shih return ERROR_MALFORMED; 5119ae62202b2bb19cc870361af7edd8e43f823d372Robert Shih } 5129ae62202b2bb19cc870361af7edd8e43f823d372Robert Shih 5132944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber br.skipBits(optional_bytes_remaining * 8); 5142944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 5152944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber // ES data follows. 5162944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 517e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (PES_packet_length < PES_header_data_length + 3) { 518e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 519e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 5202944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 5212944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber unsigned dataLength = 5222944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber PES_packet_length - 3 - PES_header_data_length; 5232944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 5242944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (br.numBitsLeft() < dataLength * 8) { 52529357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("PES packet does not carry enough data to contain " 526b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross "payload. (numBitsLeft = %zu, required = %u)", 5272944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber br.numBitsLeft(), dataLength * 8); 5282944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 5292944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return ERROR_MALFORMED; 5302944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 5312944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 532e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (br.numBitsLeft() < dataLength * 8) { 533e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 534e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 5352944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 5362944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber ssize_t index = mTracks.indexOfKey(stream_id); 5372944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (index < 0 && mScanning) { 5382944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber unsigned streamType; 5392944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 5402944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber ssize_t streamTypeIndex; 5412944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (mProgramStreamMapValid 5422944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber && (streamTypeIndex = 5432944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mStreamTypeByESID.indexOfKey(stream_id)) >= 0) { 5442944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber streamType = mStreamTypeByESID.valueAt(streamTypeIndex); 5452944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } else if ((stream_id & ~0x1f) == 0xc0) { 5462944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber // ISO/IEC 13818-3 or ISO/IEC 11172-3 or ISO/IEC 13818-7 5472944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber // or ISO/IEC 14496-3 audio 5482944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber streamType = ATSParser::STREAMTYPE_MPEG2_AUDIO; 5492944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } else if ((stream_id & ~0x0f) == 0xe0) { 5502944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber // ISO/IEC 13818-2 or ISO/IEC 11172-2 or ISO/IEC 14496-2 video 5512944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber streamType = ATSParser::STREAMTYPE_MPEG2_VIDEO; 5522944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } else { 5532944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber streamType = ATSParser::STREAMTYPE_RESERVED; 5542944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 5552944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 5562944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber index = mTracks.add( 5572944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber stream_id, new Track(this, stream_id, streamType)); 5582944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 5592944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 5602944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber status_t err = OK; 5612944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 5622944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (index >= 0) { 5632944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber err = 5642944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mTracks.editValueAt(index)->appendPESData( 5652944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber PTS_DTS_flags, PTS, DTS, br.data(), dataLength); 5662944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 5672944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 5682944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber br.skipBits(dataLength * 8); 5692944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 5702944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (err != OK) { 5712944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return err; 5722944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 5732944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } else if (stream_id == 0xbe) { // padding_stream 574e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (PES_packet_length == 0u) { 575e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 576e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 5772944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber br.skipBits(PES_packet_length * 8); 5782944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } else { 579e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (PES_packet_length == 0u) { 580e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 581e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 5822944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber br.skipBits(PES_packet_length * 8); 5832944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 5842944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 5852944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return n; 5862944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} 5872944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 5882944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber//////////////////////////////////////////////////////////////////////////////// 5892944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 5902944eca607304a095ea43ba2b8f0b9de61249f9fAndreas HuberMPEG2PSExtractor::Track::Track( 5912944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber MPEG2PSExtractor *extractor, unsigned stream_id, unsigned stream_type) 5922944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber : mExtractor(extractor), 5932944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mStreamID(stream_id), 5942944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mStreamType(stream_type), 5952944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mQueue(NULL) { 5962944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber bool supported = true; 5972944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber ElementaryStreamQueue::Mode mode; 5982944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 5992944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber switch (mStreamType) { 6002944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber case ATSParser::STREAMTYPE_H264: 6012944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mode = ElementaryStreamQueue::H264; 6022944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber break; 6036e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber case ATSParser::STREAMTYPE_MPEG2_AUDIO_ADTS: 6042944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mode = ElementaryStreamQueue::AAC; 6052944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber break; 6062944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber case ATSParser::STREAMTYPE_MPEG1_AUDIO: 6072944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber case ATSParser::STREAMTYPE_MPEG2_AUDIO: 6082944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mode = ElementaryStreamQueue::MPEG_AUDIO; 6092944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber break; 6102944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 6112944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber case ATSParser::STREAMTYPE_MPEG1_VIDEO: 6122944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber case ATSParser::STREAMTYPE_MPEG2_VIDEO: 6132944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mode = ElementaryStreamQueue::MPEG_VIDEO; 6142944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber break; 6152944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 6162944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber case ATSParser::STREAMTYPE_MPEG4_VIDEO: 6172944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mode = ElementaryStreamQueue::MPEG4_VIDEO; 6182944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber break; 6192944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 6202944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber default: 6212944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber supported = false; 6222944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber break; 6232944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 6242944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 6252944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (supported) { 6262944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mQueue = new ElementaryStreamQueue(mode); 6272944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } else { 628df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block ALOGI("unsupported stream ID 0x%02x", stream_id); 6292944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 6302944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} 6312944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 6322944eca607304a095ea43ba2b8f0b9de61249f9fAndreas HuberMPEG2PSExtractor::Track::~Track() { 6332944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber delete mQueue; 6342944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mQueue = NULL; 6352944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} 6362944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 6372944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huberstatus_t MPEG2PSExtractor::Track::start(MetaData *params) { 6382944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (mSource == NULL) { 6392944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return NO_INIT; 6402944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 6412944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 6422944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return mSource->start(params); 6432944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} 6442944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 6452944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huberstatus_t MPEG2PSExtractor::Track::stop() { 6462944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (mSource == NULL) { 6472944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return NO_INIT; 6482944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 6492944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 6502944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return mSource->stop(); 6512944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} 6522944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 6532944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Hubersp<MetaData> MPEG2PSExtractor::Track::getFormat() { 6542944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (mSource == NULL) { 6552944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return NULL; 6562944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 6572944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 6582944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return mSource->getFormat(); 6592944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} 6602944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 6612944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huberstatus_t MPEG2PSExtractor::Track::read( 6622944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber MediaBuffer **buffer, const ReadOptions *options) { 6632944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (mSource == NULL) { 6642944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return NO_INIT; 6652944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 6662944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 6672944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber status_t finalResult; 6682944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber while (!mSource->hasBufferAvailable(&finalResult)) { 6692944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (finalResult != OK) { 6702944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return ERROR_END_OF_STREAM; 6712944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 6722944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 6732944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber status_t err = mExtractor->feedMore(); 6742944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 6752944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (err != OK) { 6762944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mSource->signalEOS(err); 6772944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 6782944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 6792944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 6802944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return mSource->read(buffer, options); 6812944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} 6822944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 6832944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huberstatus_t MPEG2PSExtractor::Track::appendPESData( 6842944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber unsigned PTS_DTS_flags, 68584333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber uint64_t PTS, uint64_t /* DTS */, 6862944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber const uint8_t *data, size_t size) { 6872944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (mQueue == NULL) { 6882944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return OK; 6892944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 6902944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 6912944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber int64_t timeUs; 6922944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (PTS_DTS_flags == 2 || PTS_DTS_flags == 3) { 6932944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber timeUs = (PTS * 100) / 9; 6942944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } else { 6952944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber timeUs = 0; 6962944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 6972944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 6982944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber status_t err = mQueue->appendData(data, size, timeUs); 6992944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 7002944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (err != OK) { 7012944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return err; 7022944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 7032944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 7042944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber sp<ABuffer> accessUnit; 7052944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber while ((accessUnit = mQueue->dequeueAccessUnit()) != NULL) { 7062944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (mSource == NULL) { 7072944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber sp<MetaData> meta = mQueue->getFormat(); 7082944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 7092944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (meta != NULL) { 7103856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Stream ID 0x%02x now has data.", mStreamID); 7112944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 7122944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mSource = new AnotherPacketSource(meta); 7132944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mSource->queueAccessUnit(accessUnit); 7142944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 7152944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } else if (mQueue->getFormat() != NULL) { 7162944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mSource->queueAccessUnit(accessUnit); 7172944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 7182944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 7192944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 7202944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return OK; 7212944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} 7222944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 7232944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber//////////////////////////////////////////////////////////////////////////////// 7242944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 7252944eca607304a095ea43ba2b8f0b9de61249f9fAndreas HuberMPEG2PSExtractor::WrappedTrack::WrappedTrack( 7262944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber const sp<MPEG2PSExtractor> &extractor, const sp<Track> &track) 7272944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber : mExtractor(extractor), 7282944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mTrack(track) { 7292944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} 7302944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 7312944eca607304a095ea43ba2b8f0b9de61249f9fAndreas HuberMPEG2PSExtractor::WrappedTrack::~WrappedTrack() { 7322944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} 7332944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 7342944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huberstatus_t MPEG2PSExtractor::WrappedTrack::start(MetaData *params) { 7352944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return mTrack->start(params); 7362944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} 7372944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 7382944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huberstatus_t MPEG2PSExtractor::WrappedTrack::stop() { 7392944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return mTrack->stop(); 7402944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} 7412944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 7422944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Hubersp<MetaData> MPEG2PSExtractor::WrappedTrack::getFormat() { 7432944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return mTrack->getFormat(); 7442944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} 7452944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 7462944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huberstatus_t MPEG2PSExtractor::WrappedTrack::read( 7472944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber MediaBuffer **buffer, const ReadOptions *options) { 7482944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return mTrack->read(buffer, options); 7492944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} 7502944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 7512944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber//////////////////////////////////////////////////////////////////////////////// 7522944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 7532944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huberbool SniffMPEG2PS( 7542944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber const sp<DataSource> &source, String8 *mimeType, float *confidence, 7552944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber sp<AMessage> *) { 7562944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber uint8_t header[5]; 7572944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (source->readAt(0, header, sizeof(header)) < (ssize_t)sizeof(header)) { 7582944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return false; 7592944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 7602944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 7612944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (memcmp("\x00\x00\x01\xba", header, 4) || (header[4] >> 6) != 1) { 7622944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return false; 7632944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 7642944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 7652944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber *confidence = 0.25f; // Slightly larger than .mp3 extractor's confidence 7662944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 7672944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mimeType->setTo(MEDIA_MIMETYPE_CONTAINER_MPEG2PS); 7682944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 7692944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return true; 7702944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} 7712944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 7722944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} // namespace android 773