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