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