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 2175226177f20a176d50e3e53bbb34067cb49112c3Marco Nelissen#include "MPEG2PSExtractor.h" 222944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2375226177f20a176d50e3e53bbb34067cb49112c3Marco Nelissen#include "mpeg2ts/AnotherPacketSource.h" 2475226177f20a176d50e3e53bbb34067cb49112c3Marco Nelissen#include "mpeg2ts/ESQueue.h" 252944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 262a243f08193fe9ff1afe018e9953f01c44ced9deMarco Nelissen#include <media/DataSourceBase.h> 273d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissen#include <media/MediaTrack.h> 282944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber#include <media/stagefright/foundation/ABitReader.h> 292944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber#include <media/stagefright/foundation/ABuffer.h> 302944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber#include <media/stagefright/foundation/ADebug.h> 312944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber#include <media/stagefright/foundation/AMessage.h> 32607612858f3afad1ade51a098aafa2a41523b5f7Dongwon Kang#include <media/stagefright/foundation/ByteUtils.h> 332944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber#include <media/stagefright/foundation/hexdump.h> 342944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber#include <media/stagefright/MediaDefs.h> 352944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber#include <media/stagefright/MediaErrors.h> 362944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber#include <media/stagefright/MetaData.h> 372944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber#include <utils/String8.h> 382944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 39b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross#include <inttypes.h> 40b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross 412944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Hubernamespace android { 422944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 433d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissenstruct MPEG2PSExtractor::Track : public MediaTrack, public RefBase { 442944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber Track(MPEG2PSExtractor *extractor, 452944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber unsigned stream_id, unsigned stream_type); 462944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 473d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissen virtual status_t start(MetaDataBase *params); 482944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber virtual status_t stop(); 493d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissen virtual status_t getFormat(MetaDataBase &); 502944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 512944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber virtual status_t read( 521889c3edad32995c0cf26ae2248fe7c957b7ec84Dongwon Kang MediaBufferBase **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 753d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissenstruct MPEG2PSExtractor::WrappedTrack : public MediaTrack { 767d880c31d2079299000b036c6ae742dc695a5b19Marco Nelissen WrappedTrack(MPEG2PSExtractor *extractor, const sp<Track> &track); 772944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 783d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissen virtual status_t start(MetaDataBase *params); 792944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber virtual status_t stop(); 803d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissen virtual status_t getFormat(MetaDataBase &); 812944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 822944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber virtual status_t read( 831889c3edad32995c0cf26ae2248fe7c957b7ec84Dongwon Kang MediaBufferBase **buffer, const ReadOptions *options); 842944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 852944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huberprotected: 862944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber virtual ~WrappedTrack(); 872944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 882944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huberprivate: 897d880c31d2079299000b036c6ae742dc695a5b19Marco Nelissen MPEG2PSExtractor *mExtractor; 902944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber sp<MPEG2PSExtractor::Track> mTrack; 912944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 922944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber DISALLOW_EVIL_CONSTRUCTORS(WrappedTrack); 932944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber}; 942944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 952944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber//////////////////////////////////////////////////////////////////////////////// 962944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 972a243f08193fe9ff1afe018e9953f01c44ced9deMarco NelissenMPEG2PSExtractor::MPEG2PSExtractor(DataSourceBase *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. 1113d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissen MetaDataBase meta; 1126325a7384138a73bb1fb34b776f0bb8b1dc94e60Chad Brubaker for (size_t i = mTracks.size(); i > 0;) { 1136325a7384138a73bb1fb34b776f0bb8b1dc94e60Chad Brubaker i--; 1143d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissen if (mTracks.valueAt(i)->getFormat(meta) != OK) { 1152944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mTracks.removeItemsAt(i); 1162944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 1172944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 1182944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 1192944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mScanning = false; 1202944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} 1212944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 1222944eca607304a095ea43ba2b8f0b9de61249f9fAndreas HuberMPEG2PSExtractor::~MPEG2PSExtractor() { 1232944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} 1242944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 1252944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Hubersize_t MPEG2PSExtractor::countTracks() { 1262944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return mTracks.size(); 1272944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} 1282944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 1293d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco NelissenMediaTrack *MPEG2PSExtractor::getTrack(size_t index) { 1302944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (index >= mTracks.size()) { 1312944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return NULL; 1322944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 1332944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 1342944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return new WrappedTrack(this, mTracks.valueAt(index)); 1352944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} 1362944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 1373d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissenstatus_t MPEG2PSExtractor::getTrackMetaData( 1383d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissen MetaDataBase &meta, 13984333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber size_t index, uint32_t /* flags */) { 1402944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (index >= mTracks.size()) { 1413d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissen return UNKNOWN_ERROR; 1422944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 1432944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 1443d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissen return mTracks.valueAt(index)->getFormat(meta); 1452944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} 1462944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 1473d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissenstatus_t MPEG2PSExtractor::getMetaData(MetaDataBase &meta) { 1483d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissen meta.setCString(kKeyMIMEType, MEDIA_MIMETYPE_CONTAINER_MPEG2PS); 1492944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 1503d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissen return OK; 1512944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} 1522944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 1532944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huberuint32_t MPEG2PSExtractor::flags() const { 1542944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return CAN_PAUSE; 1552944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} 1562944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 1572944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huberstatus_t MPEG2PSExtractor::feedMore() { 1582944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber Mutex::Autolock autoLock(mLock); 1592944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 1602944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber // How much data we're reading at a time 1612944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber static const size_t kChunkSize = 8192; 1622944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 1632944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber for (;;) { 1642944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber status_t err = dequeueChunk(); 1652944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 1662944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (err == -EAGAIN && mFinalResult == OK) { 1672944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber memmove(mBuffer->base(), mBuffer->data(), mBuffer->size()); 1682944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mBuffer->setRange(0, mBuffer->size()); 1692944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 1702944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (mBuffer->size() + kChunkSize > mBuffer->capacity()) { 1712944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber size_t newCapacity = mBuffer->capacity() + kChunkSize; 1722944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber sp<ABuffer> newBuffer = new ABuffer(newCapacity); 1732944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber memcpy(newBuffer->data(), mBuffer->data(), mBuffer->size()); 1742944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber newBuffer->setRange(0, mBuffer->size()); 1752944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mBuffer = newBuffer; 1762944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 1772944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 1782944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber ssize_t n = mDataSource->readAt( 1792944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mOffset, mBuffer->data() + mBuffer->size(), kChunkSize); 1802944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 1812944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (n < (ssize_t)kChunkSize) { 1822944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mFinalResult = (n < 0) ? (status_t)n : ERROR_END_OF_STREAM; 1832944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return mFinalResult; 1842944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 1852944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 1862944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mBuffer->setRange(mBuffer->offset(), mBuffer->size() + n); 1872944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mOffset += n; 1882944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } else if (err != OK) { 1892944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mFinalResult = err; 1902944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return err; 1912944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } else { 1922944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return OK; 1932944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 1942944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 1952944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} 1962944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 1972944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huberstatus_t MPEG2PSExtractor::dequeueChunk() { 1982944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (mBuffer->size() < 4) { 1992944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return -EAGAIN; 2002944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 2012944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2022944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (memcmp("\x00\x00\x01", mBuffer->data(), 3)) { 2032944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return ERROR_MALFORMED; 2042944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 2052944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2062944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber unsigned chunkType = mBuffer->data()[3]; 2072944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2082944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber ssize_t res; 2092944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2102944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber switch (chunkType) { 2112944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber case 0xba: 2122944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber { 2132944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber res = dequeuePack(); 2142944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber break; 2152944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 2162944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2172944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber case 0xbb: 2182944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber { 2192944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber res = dequeueSystemHeader(); 2202944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber break; 2212944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 2222944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2232944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber default: 2242944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber { 2252944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber res = dequeuePES(); 2262944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber break; 2272944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 2282944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 2292944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2302944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (res > 0) { 2312944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (mBuffer->size() < (size_t)res) { 2322944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return -EAGAIN; 2332944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 2342944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2352944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mBuffer->setRange(mBuffer->offset() + res, mBuffer->size() - res); 2362944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber res = OK; 2372944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 2382944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2392944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return res; 2402944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} 2412944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2422944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huberssize_t MPEG2PSExtractor::dequeuePack() { 2432944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber // 32 + 2 + 3 + 1 + 15 + 1 + 15+ 1 + 9 + 1 + 22 + 1 + 1 | +5 2442944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2452944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (mBuffer->size() < 14) { 2462944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return -EAGAIN; 2472944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 2482944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2492944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber unsigned pack_stuffing_length = mBuffer->data()[13] & 7; 2502944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2512944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return pack_stuffing_length + 14; 2522944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} 2532944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2542944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huberssize_t MPEG2PSExtractor::dequeueSystemHeader() { 2552944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (mBuffer->size() < 6) { 2562944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return -EAGAIN; 2572944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 2582944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2592944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber unsigned header_length = U16_AT(mBuffer->data() + 4); 2602944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2612944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return header_length + 6; 2622944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} 2632944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2642944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huberssize_t MPEG2PSExtractor::dequeuePES() { 2652944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (mBuffer->size() < 6) { 2662944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return -EAGAIN; 2672944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 2682944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2692944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber unsigned PES_packet_length = U16_AT(mBuffer->data() + 4); 270e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (PES_packet_length == 0u) { 271e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim ALOGE("PES_packet_length is 0"); 272e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return -EAGAIN; 273e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 2742944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2752944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber size_t n = PES_packet_length + 6; 2762944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2772944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (mBuffer->size() < n) { 2782944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return -EAGAIN; 2792944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 2802944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2812944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber ABitReader br(mBuffer->data(), n); 2822944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2832944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber unsigned packet_startcode_prefix = br.getBits(24); 2842944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2853856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("packet_startcode_prefix = 0x%08x", packet_startcode_prefix); 2862944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2872944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (packet_startcode_prefix != 1) { 2883856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Supposedly payload_unit_start=1 unit does not start " 2892944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber "with startcode."); 2902944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2912944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return ERROR_MALFORMED; 2922944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 2932944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 294e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (packet_startcode_prefix != 0x000001u) { 295e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim ALOGE("Wrong PES prefix"); 296e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 297e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 2982944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 2992944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber unsigned stream_id = br.getBits(8); 3003856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("stream_id = 0x%02x", stream_id); 3012944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 3022944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber /* unsigned PES_packet_length = */br.getBits(16); 3032944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 3042944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (stream_id == 0xbc) { 3052944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber // program_stream_map 3062944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 3072944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (!mScanning) { 3082944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return n; 3092944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 3102944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 3112944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mStreamTypeByESID.clear(); 3122944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 3132944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber /* unsigned current_next_indicator = */br.getBits(1); 3142944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber /* unsigned reserved = */br.getBits(2); 3152944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber /* unsigned program_stream_map_version = */br.getBits(5); 3162944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber /* unsigned reserved = */br.getBits(7); 3172944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber /* unsigned marker_bit = */br.getBits(1); 3182944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber unsigned program_stream_info_length = br.getBits(16); 3192944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 3202944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber size_t offset = 0; 3212944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber while (offset < program_stream_info_length) { 3222944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (offset + 2 > program_stream_info_length) { 3232944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return ERROR_MALFORMED; 3242944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 3252944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 3262944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber unsigned descriptor_tag = br.getBits(8); 3272944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber unsigned descriptor_length = br.getBits(8); 3282944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 329df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block ALOGI("found descriptor tag 0x%02x of length %u", 3302944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber descriptor_tag, descriptor_length); 3312944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 3322944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (offset + 2 + descriptor_length > program_stream_info_length) { 3332944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return ERROR_MALFORMED; 3342944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 3352944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 3362944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber br.skipBits(8 * descriptor_length); 3372944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 3382944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber offset += 2 + descriptor_length; 3392944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 3402944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 3412944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber unsigned elementary_stream_map_length = br.getBits(16); 3422944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 3432944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber offset = 0; 3442944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber while (offset < elementary_stream_map_length) { 3452944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (offset + 4 > elementary_stream_map_length) { 3462944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return ERROR_MALFORMED; 3472944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 3482944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 3492944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber unsigned stream_type = br.getBits(8); 3502944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber unsigned elementary_stream_id = br.getBits(8); 3512944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 352df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block ALOGI("elementary stream id 0x%02x has stream type 0x%02x", 3532944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber elementary_stream_id, stream_type); 3542944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 3552944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mStreamTypeByESID.add(elementary_stream_id, stream_type); 3562944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 3572944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber unsigned elementary_stream_info_length = br.getBits(16); 3582944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 3592944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (offset + 4 + elementary_stream_info_length 3602944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber > elementary_stream_map_length) { 3612944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return ERROR_MALFORMED; 3622944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 3632944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 3642944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber offset += 4 + elementary_stream_info_length; 3652944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 3662944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 3672944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber /* unsigned CRC32 = */br.getBits(32); 3682944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 3692944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mProgramStreamMapValid = true; 3702944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } else if (stream_id != 0xbe // padding_stream 3712944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber && stream_id != 0xbf // private_stream_2 3722944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber && stream_id != 0xf0 // ECM 3732944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber && stream_id != 0xf1 // EMM 3742944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber && stream_id != 0xff // program_stream_directory 3752944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber && stream_id != 0xf2 // DSMCC 3762944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber && stream_id != 0xf8) { // H.222.1 type E 377e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim /* unsigned PES_marker_bits = */br.getBits(2); // should be 0x2(hex) 3782944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber /* unsigned PES_scrambling_control = */br.getBits(2); 3792944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber /* unsigned PES_priority = */br.getBits(1); 3802944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber /* unsigned data_alignment_indicator = */br.getBits(1); 3812944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber /* unsigned copyright = */br.getBits(1); 3822944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber /* unsigned original_or_copy = */br.getBits(1); 3832944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 3842944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber unsigned PTS_DTS_flags = br.getBits(2); 3853856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("PTS_DTS_flags = %u", PTS_DTS_flags); 3862944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 3872944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber unsigned ESCR_flag = br.getBits(1); 3883856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("ESCR_flag = %u", ESCR_flag); 3892944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 3902944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber unsigned ES_rate_flag = br.getBits(1); 3913856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("ES_rate_flag = %u", ES_rate_flag); 3922944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 3932944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber unsigned DSM_trick_mode_flag = br.getBits(1); 3943856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("DSM_trick_mode_flag = %u", DSM_trick_mode_flag); 3952944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 3962944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber unsigned additional_copy_info_flag = br.getBits(1); 3973856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("additional_copy_info_flag = %u", additional_copy_info_flag); 3982944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 3992944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber /* unsigned PES_CRC_flag = */br.getBits(1); 4002944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber /* PES_extension_flag = */br.getBits(1); 4012944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 4022944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber unsigned PES_header_data_length = br.getBits(8); 4033856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("PES_header_data_length = %u", PES_header_data_length); 4042944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 4052944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber unsigned optional_bytes_remaining = PES_header_data_length; 4062944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 4072944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber uint64_t PTS = 0, DTS = 0; 4082944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 4092944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (PTS_DTS_flags == 2 || PTS_DTS_flags == 3) { 410e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (optional_bytes_remaining < 5u) { 411e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 412e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 4132944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 414e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (br.getBits(4) != PTS_DTS_flags) { 415e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 416e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 4172944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 4182944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber PTS = ((uint64_t)br.getBits(3)) << 30; 419e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (br.getBits(1) != 1u) { 420e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 421e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 4222944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber PTS |= ((uint64_t)br.getBits(15)) << 15; 423e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (br.getBits(1) != 1u) { 424e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 425e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 4262944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber PTS |= br.getBits(15); 427e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (br.getBits(1) != 1u) { 428e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 429e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 4302944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 431b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross ALOGV("PTS = %" PRIu64, PTS); 432df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block // ALOGI("PTS = %.2f secs", PTS / 90000.0f); 4332944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 4342944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber optional_bytes_remaining -= 5; 4352944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 4362944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (PTS_DTS_flags == 3) { 437e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (optional_bytes_remaining < 5u) { 438e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 439e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 4402944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 441e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (br.getBits(4) != 1u) { 442e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 443e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 4442944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 4452944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber DTS = ((uint64_t)br.getBits(3)) << 30; 446e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (br.getBits(1) != 1u) { 447e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 448e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 4492944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber DTS |= ((uint64_t)br.getBits(15)) << 15; 450e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (br.getBits(1) != 1u) { 451e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 452e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 4532944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber DTS |= br.getBits(15); 454e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (br.getBits(1) != 1u) { 455e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 456e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 4572944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 458b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross ALOGV("DTS = %" PRIu64, DTS); 4592944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 4602944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber optional_bytes_remaining -= 5; 4612944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 4622944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 4632944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 4642944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (ESCR_flag) { 465e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (optional_bytes_remaining < 6u) { 466e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 467e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 4682944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 4692944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber br.getBits(2); 4702944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 4712944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber uint64_t ESCR = ((uint64_t)br.getBits(3)) << 30; 472e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (br.getBits(1) != 1u) { 473e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 474e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 4752944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber ESCR |= ((uint64_t)br.getBits(15)) << 15; 476e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (br.getBits(1) != 1u) { 477e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 478e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 4792944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber ESCR |= br.getBits(15); 480e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (br.getBits(1) != 1u) { 481e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 482e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 4832944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 484b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross ALOGV("ESCR = %" PRIu64, ESCR); 4852944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber /* unsigned ESCR_extension = */br.getBits(9); 4862944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 487e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (br.getBits(1) != 1u) { 488e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 489e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 4902944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 4912944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber optional_bytes_remaining -= 6; 4922944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 4932944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 4942944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (ES_rate_flag) { 495e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (optional_bytes_remaining < 3u) { 496e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 497e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 4982944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 499e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (br.getBits(1) != 1u) { 500e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 501e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 5022944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber /* unsigned ES_rate = */br.getBits(22); 503e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (br.getBits(1) != 1u) { 504e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 505e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 5062944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 5072944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber optional_bytes_remaining -= 3; 5082944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 5092944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 5109ae62202b2bb19cc870361af7edd8e43f823d372Robert Shih if (br.numBitsLeft() < optional_bytes_remaining * 8) { 5119ae62202b2bb19cc870361af7edd8e43f823d372Robert Shih return ERROR_MALFORMED; 5129ae62202b2bb19cc870361af7edd8e43f823d372Robert Shih } 5139ae62202b2bb19cc870361af7edd8e43f823d372Robert Shih 5142944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber br.skipBits(optional_bytes_remaining * 8); 5152944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 5162944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber // ES data follows. 5172944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 518e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (PES_packet_length < PES_header_data_length + 3) { 519e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 520e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 5212944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 5222944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber unsigned dataLength = 5232944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber PES_packet_length - 3 - PES_header_data_length; 5242944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 5252944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (br.numBitsLeft() < dataLength * 8) { 52629357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("PES packet does not carry enough data to contain " 527b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross "payload. (numBitsLeft = %zu, required = %u)", 5282944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber br.numBitsLeft(), dataLength * 8); 5292944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 5302944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return ERROR_MALFORMED; 5312944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 5322944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 533e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (br.numBitsLeft() < dataLength * 8) { 534e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 535e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 5362944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 5372944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber ssize_t index = mTracks.indexOfKey(stream_id); 5382944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (index < 0 && mScanning) { 5392944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber unsigned streamType; 5402944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 5412944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber ssize_t streamTypeIndex; 5422944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (mProgramStreamMapValid 5432944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber && (streamTypeIndex = 5442944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mStreamTypeByESID.indexOfKey(stream_id)) >= 0) { 5452944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber streamType = mStreamTypeByESID.valueAt(streamTypeIndex); 5462944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } else if ((stream_id & ~0x1f) == 0xc0) { 5472944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber // ISO/IEC 13818-3 or ISO/IEC 11172-3 or ISO/IEC 13818-7 5482944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber // or ISO/IEC 14496-3 audio 5492944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber streamType = ATSParser::STREAMTYPE_MPEG2_AUDIO; 5502944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } else if ((stream_id & ~0x0f) == 0xe0) { 5512944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber // ISO/IEC 13818-2 or ISO/IEC 11172-2 or ISO/IEC 14496-2 video 5522944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber streamType = ATSParser::STREAMTYPE_MPEG2_VIDEO; 5532944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } else { 5542944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber streamType = ATSParser::STREAMTYPE_RESERVED; 5552944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 5562944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 5572944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber index = mTracks.add( 5582944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber stream_id, new Track(this, stream_id, streamType)); 5592944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 5602944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 5612944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber status_t err = OK; 5622944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 5632944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (index >= 0) { 5642944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber err = 5652944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mTracks.editValueAt(index)->appendPESData( 5662944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber PTS_DTS_flags, PTS, DTS, br.data(), dataLength); 5672944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 5682944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 5692944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber br.skipBits(dataLength * 8); 5702944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 5712944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (err != OK) { 5722944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return err; 5732944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 5742944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } else if (stream_id == 0xbe) { // padding_stream 575e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (PES_packet_length == 0u) { 576e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 577e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 5782944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber br.skipBits(PES_packet_length * 8); 5792944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } else { 580e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (PES_packet_length == 0u) { 581e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 582e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 5832944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber br.skipBits(PES_packet_length * 8); 5842944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 5852944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 5862944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return n; 5872944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} 5882944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 5892944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber//////////////////////////////////////////////////////////////////////////////// 5902944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 5912944eca607304a095ea43ba2b8f0b9de61249f9fAndreas HuberMPEG2PSExtractor::Track::Track( 5922944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber MPEG2PSExtractor *extractor, unsigned stream_id, unsigned stream_type) 5932944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber : mExtractor(extractor), 5942944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mStreamID(stream_id), 5952944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mStreamType(stream_type), 5962944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mQueue(NULL) { 5972944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber bool supported = true; 5982944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber ElementaryStreamQueue::Mode mode; 5992944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 6002944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber switch (mStreamType) { 6012944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber case ATSParser::STREAMTYPE_H264: 6022944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mode = ElementaryStreamQueue::H264; 6032944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber break; 6046e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber case ATSParser::STREAMTYPE_MPEG2_AUDIO_ADTS: 6052944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mode = ElementaryStreamQueue::AAC; 6062944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber break; 6072944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber case ATSParser::STREAMTYPE_MPEG1_AUDIO: 6082944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber case ATSParser::STREAMTYPE_MPEG2_AUDIO: 6092944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mode = ElementaryStreamQueue::MPEG_AUDIO; 6102944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber break; 6112944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 6122944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber case ATSParser::STREAMTYPE_MPEG1_VIDEO: 6132944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber case ATSParser::STREAMTYPE_MPEG2_VIDEO: 6142944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mode = ElementaryStreamQueue::MPEG_VIDEO; 6152944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber break; 6162944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 6172944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber case ATSParser::STREAMTYPE_MPEG4_VIDEO: 6182944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mode = ElementaryStreamQueue::MPEG4_VIDEO; 6192944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber break; 6202944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 6212944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber default: 6222944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber supported = false; 6232944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber break; 6242944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 6252944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 6262944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (supported) { 6272944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mQueue = new ElementaryStreamQueue(mode); 6282944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } else { 629df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block ALOGI("unsupported stream ID 0x%02x", stream_id); 6302944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 6312944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} 6322944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 6332944eca607304a095ea43ba2b8f0b9de61249f9fAndreas HuberMPEG2PSExtractor::Track::~Track() { 6342944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber delete mQueue; 6352944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mQueue = NULL; 6362944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} 6372944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 6383d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissenstatus_t MPEG2PSExtractor::Track::start(MetaDataBase *) { 6392944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (mSource == NULL) { 6402944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return NO_INIT; 6412944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 6422944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 6433d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissen return mSource->start(NULL); // AnotherPacketSource::start doesn't use its argument 6442944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} 6452944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 6462944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huberstatus_t MPEG2PSExtractor::Track::stop() { 6472944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (mSource == NULL) { 6482944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return NO_INIT; 6492944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 6502944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 6512944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return mSource->stop(); 6522944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} 6532944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 6543d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissenstatus_t MPEG2PSExtractor::Track::getFormat(MetaDataBase &meta) { 6552944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (mSource == NULL) { 6563d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissen return NO_INIT; 6572944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 6582944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 6593d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissen sp<MetaData> sourceMeta = mSource->getFormat(); 6603d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissen meta = *sourceMeta; 6613d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissen return OK; 6622944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} 6632944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 6642944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huberstatus_t MPEG2PSExtractor::Track::read( 6651889c3edad32995c0cf26ae2248fe7c957b7ec84Dongwon Kang MediaBufferBase **buffer, const ReadOptions *options) { 6662944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (mSource == NULL) { 6672944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return NO_INIT; 6682944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 6692944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 6702944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber status_t finalResult; 6712944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber while (!mSource->hasBufferAvailable(&finalResult)) { 6722944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (finalResult != OK) { 6732944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return ERROR_END_OF_STREAM; 6742944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 6752944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 6762944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber status_t err = mExtractor->feedMore(); 6772944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 6782944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (err != OK) { 6792944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mSource->signalEOS(err); 6802944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 6812944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 6822944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 6832944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return mSource->read(buffer, options); 6842944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} 6852944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 6862944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huberstatus_t MPEG2PSExtractor::Track::appendPESData( 6872944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber unsigned PTS_DTS_flags, 68884333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber uint64_t PTS, uint64_t /* DTS */, 6892944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber const uint8_t *data, size_t size) { 6902944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (mQueue == NULL) { 6912944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return OK; 6922944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 6932944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 6942944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber int64_t timeUs; 6952944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (PTS_DTS_flags == 2 || PTS_DTS_flags == 3) { 6962944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber timeUs = (PTS * 100) / 9; 6972944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } else { 6982944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber timeUs = 0; 6992944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 7002944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 7012944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber status_t err = mQueue->appendData(data, size, timeUs); 7022944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 7032944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (err != OK) { 7042944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return err; 7052944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 7062944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 7072944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber sp<ABuffer> accessUnit; 7082944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber while ((accessUnit = mQueue->dequeueAccessUnit()) != NULL) { 7092944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (mSource == NULL) { 7102944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber sp<MetaData> meta = mQueue->getFormat(); 7112944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 7122944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (meta != NULL) { 7133856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Stream ID 0x%02x now has data.", mStreamID); 7142944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 7152944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mSource = new AnotherPacketSource(meta); 7162944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mSource->queueAccessUnit(accessUnit); 7172944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 7182944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } else if (mQueue->getFormat() != NULL) { 7192944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mSource->queueAccessUnit(accessUnit); 7202944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 7212944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 7222944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 7232944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return OK; 7242944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} 7252944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 7262944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber//////////////////////////////////////////////////////////////////////////////// 7272944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 7282944eca607304a095ea43ba2b8f0b9de61249f9fAndreas HuberMPEG2PSExtractor::WrappedTrack::WrappedTrack( 7297d880c31d2079299000b036c6ae742dc695a5b19Marco Nelissen MPEG2PSExtractor *extractor, const sp<Track> &track) 7302944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber : mExtractor(extractor), 7312944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber mTrack(track) { 7322944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} 7332944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 7342944eca607304a095ea43ba2b8f0b9de61249f9fAndreas HuberMPEG2PSExtractor::WrappedTrack::~WrappedTrack() { 7352944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} 7362944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 7373d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissenstatus_t MPEG2PSExtractor::WrappedTrack::start(MetaDataBase *params) { 7382944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return mTrack->start(params); 7392944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} 7402944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 7412944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huberstatus_t MPEG2PSExtractor::WrappedTrack::stop() { 7422944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return mTrack->stop(); 7432944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} 7442944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 7453d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissenstatus_t MPEG2PSExtractor::WrappedTrack::getFormat(MetaDataBase &meta) { 7463d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissen return mTrack->getFormat(meta); 7472944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} 7482944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 7492944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huberstatus_t MPEG2PSExtractor::WrappedTrack::read( 7501889c3edad32995c0cf26ae2248fe7c957b7ec84Dongwon Kang MediaBufferBase **buffer, const ReadOptions *options) { 7512944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return mTrack->read(buffer, options); 7522944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} 7532944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 7542944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber//////////////////////////////////////////////////////////////////////////////// 7552944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 7562944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huberbool SniffMPEG2PS( 75717e172b4c3c87ecaa7c87eecc42b4dc47e3e9734Dongwon Kang DataSourceBase *source, float *confidence) { 7582944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber uint8_t header[5]; 7592944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (source->readAt(0, header, sizeof(header)) < (ssize_t)sizeof(header)) { 7602944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return false; 7612944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 7622944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 7632944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber if (memcmp("\x00\x00\x01\xba", header, 4) || (header[4] >> 6) != 1) { 7642944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return false; 7652944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber } 7662944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 7672944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber *confidence = 0.25f; // Slightly larger than .mp3 extractor's confidence 7682944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 7692944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber return true; 7702944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} 7712944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 7722944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber} // namespace android 773