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 392944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Hubernamespace android { 402944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 412944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huberstruct MPEG2PSExtractor::Track : public MediaSource { 422944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber Track(MPEG2PSExtractor *extractor, 432944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber unsigned stream_id, unsigned stream_type); 442944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 452944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber virtual status_t start(MetaData *params); 462944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber virtual status_t stop(); 472944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber virtual sp<MetaData> getFormat(); 482944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 492944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber virtual status_t read( 502944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber MediaBuffer **buffer, const ReadOptions *options); 512944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 522944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huberprotected: 532944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber virtual ~Track(); 542944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 552944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huberprivate: 562944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber friend struct MPEG2PSExtractor; 572944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 582944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber MPEG2PSExtractor *mExtractor; 592944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 602944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber unsigned mStreamID; 612944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber unsigned mStreamType; 622944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber ElementaryStreamQueue *mQueue; 632944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber sp<AnotherPacketSource> mSource; 642944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 652944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber status_t appendPESData( 662944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber unsigned PTS_DTS_flags, 672944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber uint64_t PTS, uint64_t DTS, 682944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber const uint8_t *data, size_t size); 692944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 702944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber DISALLOW_EVIL_CONSTRUCTORS(Track); 712944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber}; 722944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 732944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huberstruct MPEG2PSExtractor::WrappedTrack : public MediaSource { 742944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber WrappedTrack(const sp<MPEG2PSExtractor> &extractor, const sp<Track> &track); 752944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 762944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber virtual status_t start(MetaData *params); 772944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber virtual status_t stop(); 782944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber virtual sp<MetaData> getFormat(); 792944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 802944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber virtual status_t read( 812944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber MediaBuffer **buffer, const ReadOptions *options); 822944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 832944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huberprotected: 842944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber virtual ~WrappedTrack(); 852944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 862944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huberprivate: 872944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber sp<MPEG2PSExtractor> mExtractor; 882944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber sp<MPEG2PSExtractor::Track> mTrack; 892944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 902944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber DISALLOW_EVIL_CONSTRUCTORS(WrappedTrack); 912944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber}; 922944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 932944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber//////////////////////////////////////////////////////////////////////////////// 942944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 952944eca607304a095ea43ba2b8f0b9de61249f9fAndreas HuberMPEG2PSExtractor::MPEG2PSExtractor(const sp<DataSource> &source) 962944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber : mDataSource(source), 972944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mOffset(0), 982944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mFinalResult(OK), 992944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mBuffer(new ABuffer(0)), 1002944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mScanning(true), 1012944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mProgramStreamMapValid(false) { 1022944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber for (size_t i = 0; i < 500; ++i) { 1032944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (feedMore() != OK) { 1042944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber break; 1052944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 1062944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 1072944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 1082944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber // Remove all tracks that were unable to determine their format. 1092944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber for (size_t i = mTracks.size(); i-- > 0;) { 1102944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (mTracks.valueAt(i)->getFormat() == NULL) { 1112944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mTracks.removeItemsAt(i); 1122944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 1132944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 1142944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 1152944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mScanning = false; 1162944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} 1172944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 1182944eca607304a095ea43ba2b8f0b9de61249f9fAndreas HuberMPEG2PSExtractor::~MPEG2PSExtractor() { 1192944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} 1202944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 1212944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Hubersize_t MPEG2PSExtractor::countTracks() { 1222944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return mTracks.size(); 1232944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} 1242944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 1252944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Hubersp<MediaSource> MPEG2PSExtractor::getTrack(size_t index) { 1262944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (index >= mTracks.size()) { 1272944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return NULL; 1282944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 1292944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 1302944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return new WrappedTrack(this, mTracks.valueAt(index)); 1312944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} 1322944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 1332944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Hubersp<MetaData> MPEG2PSExtractor::getTrackMetaData(size_t index, uint32_t flags) { 1342944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (index >= mTracks.size()) { 1352944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return NULL; 1362944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 1372944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 1382944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return mTracks.valueAt(index)->getFormat(); 1392944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} 1402944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 1412944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Hubersp<MetaData> MPEG2PSExtractor::getMetaData() { 1422944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber sp<MetaData> meta = new MetaData; 1432944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_CONTAINER_MPEG2PS); 1442944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 1452944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return meta; 1462944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} 1472944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 1482944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huberuint32_t MPEG2PSExtractor::flags() const { 1492944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return CAN_PAUSE; 1502944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} 1512944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 1522944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huberstatus_t MPEG2PSExtractor::feedMore() { 1532944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber Mutex::Autolock autoLock(mLock); 1542944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 1552944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber // How much data we're reading at a time 1562944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber static const size_t kChunkSize = 8192; 1572944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 1582944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber for (;;) { 1592944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber status_t err = dequeueChunk(); 1602944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 1612944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (err == -EAGAIN && mFinalResult == OK) { 1622944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber memmove(mBuffer->base(), mBuffer->data(), mBuffer->size()); 1632944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mBuffer->setRange(0, mBuffer->size()); 1642944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 1652944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (mBuffer->size() + kChunkSize > mBuffer->capacity()) { 1662944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber size_t newCapacity = mBuffer->capacity() + kChunkSize; 1672944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber sp<ABuffer> newBuffer = new ABuffer(newCapacity); 1682944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber memcpy(newBuffer->data(), mBuffer->data(), mBuffer->size()); 1692944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber newBuffer->setRange(0, mBuffer->size()); 1702944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mBuffer = newBuffer; 1712944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 1722944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 1732944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber ssize_t n = mDataSource->readAt( 1742944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mOffset, mBuffer->data() + mBuffer->size(), kChunkSize); 1752944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 1762944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (n < (ssize_t)kChunkSize) { 1772944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mFinalResult = (n < 0) ? (status_t)n : ERROR_END_OF_STREAM; 1782944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return mFinalResult; 1792944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 1802944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 1812944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mBuffer->setRange(mBuffer->offset(), mBuffer->size() + n); 1822944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mOffset += n; 1832944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } else if (err != OK) { 1842944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mFinalResult = err; 1852944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return err; 1862944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } else { 1872944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return OK; 1882944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 1892944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 1902944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} 1912944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 1922944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huberstatus_t MPEG2PSExtractor::dequeueChunk() { 1932944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (mBuffer->size() < 4) { 1942944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return -EAGAIN; 1952944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 1962944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 1972944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (memcmp("\x00\x00\x01", mBuffer->data(), 3)) { 1982944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return ERROR_MALFORMED; 1992944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 2002944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2012944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber unsigned chunkType = mBuffer->data()[3]; 2022944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2032944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber ssize_t res; 2042944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2052944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber switch (chunkType) { 2062944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber case 0xba: 2072944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber { 2082944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber res = dequeuePack(); 2092944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber break; 2102944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 2112944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2122944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber case 0xbb: 2132944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber { 2142944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber res = dequeueSystemHeader(); 2152944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber break; 2162944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 2172944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2182944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber default: 2192944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber { 2202944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber res = dequeuePES(); 2212944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber break; 2222944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 2232944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 2242944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2252944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (res > 0) { 2262944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (mBuffer->size() < (size_t)res) { 2272944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return -EAGAIN; 2282944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 2292944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2302944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mBuffer->setRange(mBuffer->offset() + res, mBuffer->size() - res); 2312944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber res = OK; 2322944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 2332944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2342944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return res; 2352944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} 2362944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2372944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huberssize_t MPEG2PSExtractor::dequeuePack() { 2382944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber // 32 + 2 + 3 + 1 + 15 + 1 + 15+ 1 + 9 + 1 + 22 + 1 + 1 | +5 2392944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2402944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (mBuffer->size() < 14) { 2412944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return -EAGAIN; 2422944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 2432944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2442944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber unsigned pack_stuffing_length = mBuffer->data()[13] & 7; 2452944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2462944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return pack_stuffing_length + 14; 2472944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} 2482944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2492944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huberssize_t MPEG2PSExtractor::dequeueSystemHeader() { 2502944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (mBuffer->size() < 6) { 2512944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return -EAGAIN; 2522944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 2532944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2542944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber unsigned header_length = U16_AT(mBuffer->data() + 4); 2552944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2562944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return header_length + 6; 2572944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} 2582944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2592944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huberssize_t MPEG2PSExtractor::dequeuePES() { 2602944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (mBuffer->size() < 6) { 2612944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return -EAGAIN; 2622944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 2632944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2642944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber unsigned PES_packet_length = U16_AT(mBuffer->data() + 4); 2652944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber CHECK_NE(PES_packet_length, 0u); 2662944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2672944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber size_t n = PES_packet_length + 6; 2682944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2692944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (mBuffer->size() < n) { 2702944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return -EAGAIN; 2712944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 2722944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2732944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber ABitReader br(mBuffer->data(), n); 2742944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2752944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber unsigned packet_startcode_prefix = br.getBits(24); 2762944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2773856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("packet_startcode_prefix = 0x%08x", packet_startcode_prefix); 2782944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2792944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (packet_startcode_prefix != 1) { 2803856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Supposedly payload_unit_start=1 unit does not start " 2812944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber "with startcode."); 2822944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2832944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return ERROR_MALFORMED; 2842944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 2852944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2862944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber CHECK_EQ(packet_startcode_prefix, 0x000001u); 2872944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2882944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber unsigned stream_id = br.getBits(8); 2893856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("stream_id = 0x%02x", stream_id); 2902944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2912944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber /* unsigned PES_packet_length = */br.getBits(16); 2922944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2932944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (stream_id == 0xbc) { 2942944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber // program_stream_map 2952944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2962944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (!mScanning) { 2972944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return n; 2982944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 2992944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 3002944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mStreamTypeByESID.clear(); 3012944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 3022944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber /* unsigned current_next_indicator = */br.getBits(1); 3032944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber /* unsigned reserved = */br.getBits(2); 3042944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber /* unsigned program_stream_map_version = */br.getBits(5); 3052944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber /* unsigned reserved = */br.getBits(7); 3062944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber /* unsigned marker_bit = */br.getBits(1); 3072944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber unsigned program_stream_info_length = br.getBits(16); 3082944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 3092944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber size_t offset = 0; 3102944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber while (offset < program_stream_info_length) { 3112944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (offset + 2 > program_stream_info_length) { 3122944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return ERROR_MALFORMED; 3132944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 3142944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 3152944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber unsigned descriptor_tag = br.getBits(8); 3162944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber unsigned descriptor_length = br.getBits(8); 3172944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 318df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block ALOGI("found descriptor tag 0x%02x of length %u", 3192944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber descriptor_tag, descriptor_length); 3202944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 3212944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (offset + 2 + descriptor_length > program_stream_info_length) { 3222944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return ERROR_MALFORMED; 3232944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 3242944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 3252944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber br.skipBits(8 * descriptor_length); 3262944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 3272944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber offset += 2 + descriptor_length; 3282944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 3292944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 3302944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber unsigned elementary_stream_map_length = br.getBits(16); 3312944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 3322944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber offset = 0; 3332944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber while (offset < elementary_stream_map_length) { 3342944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (offset + 4 > elementary_stream_map_length) { 3352944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return ERROR_MALFORMED; 3362944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 3372944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 3382944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber unsigned stream_type = br.getBits(8); 3392944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber unsigned elementary_stream_id = br.getBits(8); 3402944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 341df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block ALOGI("elementary stream id 0x%02x has stream type 0x%02x", 3422944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber elementary_stream_id, stream_type); 3432944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 3442944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mStreamTypeByESID.add(elementary_stream_id, stream_type); 3452944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 3462944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber unsigned elementary_stream_info_length = br.getBits(16); 3472944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 3482944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (offset + 4 + elementary_stream_info_length 3492944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber > elementary_stream_map_length) { 3502944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return ERROR_MALFORMED; 3512944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 3522944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 3532944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber offset += 4 + elementary_stream_info_length; 3542944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 3552944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 3562944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber /* unsigned CRC32 = */br.getBits(32); 3572944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 3582944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mProgramStreamMapValid = true; 3592944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } else if (stream_id != 0xbe // padding_stream 3602944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber && stream_id != 0xbf // private_stream_2 3612944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber && stream_id != 0xf0 // ECM 3622944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber && stream_id != 0xf1 // EMM 3632944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber && stream_id != 0xff // program_stream_directory 3642944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber && stream_id != 0xf2 // DSMCC 3652944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber && stream_id != 0xf8) { // H.222.1 type E 3662944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber CHECK_EQ(br.getBits(2), 2u); 3672944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 3682944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber /* unsigned PES_scrambling_control = */br.getBits(2); 3692944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber /* unsigned PES_priority = */br.getBits(1); 3702944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber /* unsigned data_alignment_indicator = */br.getBits(1); 3712944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber /* unsigned copyright = */br.getBits(1); 3722944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber /* unsigned original_or_copy = */br.getBits(1); 3732944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 3742944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber unsigned PTS_DTS_flags = br.getBits(2); 3753856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("PTS_DTS_flags = %u", PTS_DTS_flags); 3762944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 3772944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber unsigned ESCR_flag = br.getBits(1); 3783856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("ESCR_flag = %u", ESCR_flag); 3792944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 3802944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber unsigned ES_rate_flag = br.getBits(1); 3813856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("ES_rate_flag = %u", ES_rate_flag); 3822944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 3832944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber unsigned DSM_trick_mode_flag = br.getBits(1); 3843856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("DSM_trick_mode_flag = %u", DSM_trick_mode_flag); 3852944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 3862944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber unsigned additional_copy_info_flag = br.getBits(1); 3873856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("additional_copy_info_flag = %u", additional_copy_info_flag); 3882944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 3892944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber /* unsigned PES_CRC_flag = */br.getBits(1); 3902944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber /* PES_extension_flag = */br.getBits(1); 3912944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 3922944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber unsigned PES_header_data_length = br.getBits(8); 3933856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("PES_header_data_length = %u", PES_header_data_length); 3942944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 3952944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber unsigned optional_bytes_remaining = PES_header_data_length; 3962944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 3972944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber uint64_t PTS = 0, DTS = 0; 3982944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 3992944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (PTS_DTS_flags == 2 || PTS_DTS_flags == 3) { 4002944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber CHECK_GE(optional_bytes_remaining, 5u); 4012944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 4022944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber CHECK_EQ(br.getBits(4), PTS_DTS_flags); 4032944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 4042944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber PTS = ((uint64_t)br.getBits(3)) << 30; 4052944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber CHECK_EQ(br.getBits(1), 1u); 4062944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber PTS |= ((uint64_t)br.getBits(15)) << 15; 4072944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber CHECK_EQ(br.getBits(1), 1u); 4082944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber PTS |= br.getBits(15); 4092944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber CHECK_EQ(br.getBits(1), 1u); 4102944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 4113856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("PTS = %llu", PTS); 412df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block // ALOGI("PTS = %.2f secs", PTS / 90000.0f); 4132944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 4142944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber optional_bytes_remaining -= 5; 4152944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 4162944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (PTS_DTS_flags == 3) { 4172944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber CHECK_GE(optional_bytes_remaining, 5u); 4182944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 4192944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber CHECK_EQ(br.getBits(4), 1u); 4202944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 4212944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber DTS = ((uint64_t)br.getBits(3)) << 30; 4222944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber CHECK_EQ(br.getBits(1), 1u); 4232944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber DTS |= ((uint64_t)br.getBits(15)) << 15; 4242944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber CHECK_EQ(br.getBits(1), 1u); 4252944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber DTS |= br.getBits(15); 4262944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber CHECK_EQ(br.getBits(1), 1u); 4272944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 4283856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("DTS = %llu", DTS); 4292944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 4302944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber optional_bytes_remaining -= 5; 4312944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 4322944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 4332944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 4342944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (ESCR_flag) { 4352944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber CHECK_GE(optional_bytes_remaining, 6u); 4362944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 4372944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber br.getBits(2); 4382944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 4392944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber uint64_t ESCR = ((uint64_t)br.getBits(3)) << 30; 4402944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber CHECK_EQ(br.getBits(1), 1u); 4412944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber ESCR |= ((uint64_t)br.getBits(15)) << 15; 4422944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber CHECK_EQ(br.getBits(1), 1u); 4432944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber ESCR |= br.getBits(15); 4442944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber CHECK_EQ(br.getBits(1), 1u); 4452944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 4463856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("ESCR = %llu", ESCR); 4472944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber /* unsigned ESCR_extension = */br.getBits(9); 4482944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 4492944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber CHECK_EQ(br.getBits(1), 1u); 4502944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 4512944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber optional_bytes_remaining -= 6; 4522944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 4532944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 4542944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (ES_rate_flag) { 4552944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber CHECK_GE(optional_bytes_remaining, 3u); 4562944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 4572944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber CHECK_EQ(br.getBits(1), 1u); 4582944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber /* unsigned ES_rate = */br.getBits(22); 4592944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber CHECK_EQ(br.getBits(1), 1u); 4602944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 4612944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber optional_bytes_remaining -= 3; 4622944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 4632944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 4642944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber br.skipBits(optional_bytes_remaining * 8); 4652944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 4662944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber // ES data follows. 4672944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 4682944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber CHECK_GE(PES_packet_length, PES_header_data_length + 3); 4692944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 4702944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber unsigned dataLength = 4712944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber PES_packet_length - 3 - PES_header_data_length; 4722944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 4732944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (br.numBitsLeft() < dataLength * 8) { 47429357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("PES packet does not carry enough data to contain " 4752944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber "payload. (numBitsLeft = %d, required = %d)", 4762944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber br.numBitsLeft(), dataLength * 8); 4772944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 4782944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return ERROR_MALFORMED; 4792944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 4802944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 4812944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber CHECK_GE(br.numBitsLeft(), dataLength * 8); 4822944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 4832944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber ssize_t index = mTracks.indexOfKey(stream_id); 4842944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (index < 0 && mScanning) { 4852944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber unsigned streamType; 4862944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 4872944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber ssize_t streamTypeIndex; 4882944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (mProgramStreamMapValid 4892944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber && (streamTypeIndex = 4902944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mStreamTypeByESID.indexOfKey(stream_id)) >= 0) { 4912944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber streamType = mStreamTypeByESID.valueAt(streamTypeIndex); 4922944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } else if ((stream_id & ~0x1f) == 0xc0) { 4932944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber // ISO/IEC 13818-3 or ISO/IEC 11172-3 or ISO/IEC 13818-7 4942944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber // or ISO/IEC 14496-3 audio 4952944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber streamType = ATSParser::STREAMTYPE_MPEG2_AUDIO; 4962944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } else if ((stream_id & ~0x0f) == 0xe0) { 4972944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber // ISO/IEC 13818-2 or ISO/IEC 11172-2 or ISO/IEC 14496-2 video 4982944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber streamType = ATSParser::STREAMTYPE_MPEG2_VIDEO; 4992944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } else { 5002944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber streamType = ATSParser::STREAMTYPE_RESERVED; 5012944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 5022944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 5032944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber index = mTracks.add( 5042944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber stream_id, new Track(this, stream_id, streamType)); 5052944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 5062944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 5072944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber status_t err = OK; 5082944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 5092944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (index >= 0) { 5102944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber err = 5112944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mTracks.editValueAt(index)->appendPESData( 5122944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber PTS_DTS_flags, PTS, DTS, br.data(), dataLength); 5132944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 5142944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 5152944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber br.skipBits(dataLength * 8); 5162944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 5172944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (err != OK) { 5182944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return err; 5192944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 5202944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } else if (stream_id == 0xbe) { // padding_stream 5212944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber CHECK_NE(PES_packet_length, 0u); 5222944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber br.skipBits(PES_packet_length * 8); 5232944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } else { 5242944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber CHECK_NE(PES_packet_length, 0u); 5252944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber br.skipBits(PES_packet_length * 8); 5262944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 5272944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 5282944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return n; 5292944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} 5302944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 5312944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber//////////////////////////////////////////////////////////////////////////////// 5322944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 5332944eca607304a095ea43ba2b8f0b9de61249f9fAndreas HuberMPEG2PSExtractor::Track::Track( 5342944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber MPEG2PSExtractor *extractor, unsigned stream_id, unsigned stream_type) 5352944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber : mExtractor(extractor), 5362944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mStreamID(stream_id), 5372944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mStreamType(stream_type), 5382944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mQueue(NULL) { 5392944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber bool supported = true; 5402944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber ElementaryStreamQueue::Mode mode; 5412944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 5422944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber switch (mStreamType) { 5432944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber case ATSParser::STREAMTYPE_H264: 5442944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mode = ElementaryStreamQueue::H264; 5452944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber break; 5466e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber case ATSParser::STREAMTYPE_MPEG2_AUDIO_ADTS: 5472944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mode = ElementaryStreamQueue::AAC; 5482944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber break; 5492944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber case ATSParser::STREAMTYPE_MPEG1_AUDIO: 5502944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber case ATSParser::STREAMTYPE_MPEG2_AUDIO: 5512944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mode = ElementaryStreamQueue::MPEG_AUDIO; 5522944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber break; 5532944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 5542944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber case ATSParser::STREAMTYPE_MPEG1_VIDEO: 5552944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber case ATSParser::STREAMTYPE_MPEG2_VIDEO: 5562944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mode = ElementaryStreamQueue::MPEG_VIDEO; 5572944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber break; 5582944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 5592944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber case ATSParser::STREAMTYPE_MPEG4_VIDEO: 5602944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mode = ElementaryStreamQueue::MPEG4_VIDEO; 5612944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber break; 5622944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 5632944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber default: 5642944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber supported = false; 5652944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber break; 5662944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 5672944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 5682944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (supported) { 5692944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mQueue = new ElementaryStreamQueue(mode); 5702944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } else { 571df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block ALOGI("unsupported stream ID 0x%02x", stream_id); 5722944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 5732944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} 5742944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 5752944eca607304a095ea43ba2b8f0b9de61249f9fAndreas HuberMPEG2PSExtractor::Track::~Track() { 5762944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber delete mQueue; 5772944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mQueue = NULL; 5782944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} 5792944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 5802944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huberstatus_t MPEG2PSExtractor::Track::start(MetaData *params) { 5812944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (mSource == NULL) { 5822944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return NO_INIT; 5832944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 5842944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 5852944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return mSource->start(params); 5862944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} 5872944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 5882944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huberstatus_t MPEG2PSExtractor::Track::stop() { 5892944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (mSource == NULL) { 5902944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return NO_INIT; 5912944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 5922944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 5932944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return mSource->stop(); 5942944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} 5952944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 5962944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Hubersp<MetaData> MPEG2PSExtractor::Track::getFormat() { 5972944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (mSource == NULL) { 5982944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return NULL; 5992944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 6002944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 6012944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return mSource->getFormat(); 6022944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} 6032944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 6042944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huberstatus_t MPEG2PSExtractor::Track::read( 6052944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber MediaBuffer **buffer, const ReadOptions *options) { 6062944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (mSource == NULL) { 6072944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return NO_INIT; 6082944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 6092944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 6102944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber status_t finalResult; 6112944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber while (!mSource->hasBufferAvailable(&finalResult)) { 6122944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (finalResult != OK) { 6132944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return ERROR_END_OF_STREAM; 6142944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 6152944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 6162944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber status_t err = mExtractor->feedMore(); 6172944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 6182944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (err != OK) { 6192944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mSource->signalEOS(err); 6202944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 6212944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 6222944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 6232944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return mSource->read(buffer, options); 6242944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} 6252944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 6262944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huberstatus_t MPEG2PSExtractor::Track::appendPESData( 6272944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber unsigned PTS_DTS_flags, 6282944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber uint64_t PTS, uint64_t DTS, 6292944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber const uint8_t *data, size_t size) { 6302944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (mQueue == NULL) { 6312944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return OK; 6322944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 6332944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 6342944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber int64_t timeUs; 6352944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (PTS_DTS_flags == 2 || PTS_DTS_flags == 3) { 6362944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber timeUs = (PTS * 100) / 9; 6372944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } else { 6382944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber timeUs = 0; 6392944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 6402944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 6412944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber status_t err = mQueue->appendData(data, size, timeUs); 6422944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 6432944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (err != OK) { 6442944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return err; 6452944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 6462944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 6472944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber sp<ABuffer> accessUnit; 6482944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber while ((accessUnit = mQueue->dequeueAccessUnit()) != NULL) { 6492944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (mSource == NULL) { 6502944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber sp<MetaData> meta = mQueue->getFormat(); 6512944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 6522944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (meta != NULL) { 6533856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Stream ID 0x%02x now has data.", mStreamID); 6542944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 6552944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mSource = new AnotherPacketSource(meta); 6562944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mSource->queueAccessUnit(accessUnit); 6572944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 6582944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } else if (mQueue->getFormat() != NULL) { 6592944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mSource->queueAccessUnit(accessUnit); 6602944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 6612944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 6622944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 6632944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return OK; 6642944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} 6652944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 6662944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber//////////////////////////////////////////////////////////////////////////////// 6672944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 6682944eca607304a095ea43ba2b8f0b9de61249f9fAndreas HuberMPEG2PSExtractor::WrappedTrack::WrappedTrack( 6692944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber const sp<MPEG2PSExtractor> &extractor, const sp<Track> &track) 6702944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber : mExtractor(extractor), 6712944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mTrack(track) { 6722944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} 6732944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 6742944eca607304a095ea43ba2b8f0b9de61249f9fAndreas HuberMPEG2PSExtractor::WrappedTrack::~WrappedTrack() { 6752944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} 6762944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 6772944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huberstatus_t MPEG2PSExtractor::WrappedTrack::start(MetaData *params) { 6782944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return mTrack->start(params); 6792944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} 6802944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 6812944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huberstatus_t MPEG2PSExtractor::WrappedTrack::stop() { 6822944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return mTrack->stop(); 6832944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} 6842944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 6852944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Hubersp<MetaData> MPEG2PSExtractor::WrappedTrack::getFormat() { 6862944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return mTrack->getFormat(); 6872944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} 6882944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 6892944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huberstatus_t MPEG2PSExtractor::WrappedTrack::read( 6902944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber MediaBuffer **buffer, const ReadOptions *options) { 6912944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return mTrack->read(buffer, options); 6922944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} 6932944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 6942944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber//////////////////////////////////////////////////////////////////////////////// 6952944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 6962944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huberbool SniffMPEG2PS( 6972944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber const sp<DataSource> &source, String8 *mimeType, float *confidence, 6982944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber sp<AMessage> *) { 6992944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber uint8_t header[5]; 7002944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (source->readAt(0, header, sizeof(header)) < (ssize_t)sizeof(header)) { 7012944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return false; 7022944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 7032944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 7042944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (memcmp("\x00\x00\x01\xba", header, 4) || (header[4] >> 6) != 1) { 7052944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return false; 7062944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 7072944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 7082944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber *confidence = 0.25f; // Slightly larger than .mp3 extractor's confidence 7092944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 7102944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mimeType->setTo(MEDIA_MIMETYPE_CONTAINER_MPEG2PS); 7112944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 7122944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return true; 7132944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} 7142944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 7152944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} // namespace android 716