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#ifndef MPEG2_PS_EXTRACTOR_H_
182944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber
192944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber#define MPEG2_PS_EXTRACTOR_H_
202944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber
212944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber#include <media/stagefright/foundation/ABase.h>
222944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber#include <media/stagefright/MediaExtractor.h>
232944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber#include <utils/threads.h>
242944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber#include <utils/KeyedVector.h>
252944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber
262944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Hubernamespace android {
272944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber
282944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huberstruct ABuffer;
292944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huberstruct AMessage;
302944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huberstruct Track;
312944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huberstruct String8;
322944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber
332944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huberstruct MPEG2PSExtractor : public MediaExtractor {
342944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber    MPEG2PSExtractor(const sp<DataSource> &source);
352944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber
362944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber    virtual size_t countTracks();
372944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber    virtual sp<MediaSource> getTrack(size_t index);
382944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber    virtual sp<MetaData> getTrackMetaData(size_t index, uint32_t flags);
392944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber
402944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber    virtual sp<MetaData> getMetaData();
412944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber
422944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber    virtual uint32_t flags() const;
432944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber
442944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huberprotected:
452944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber    virtual ~MPEG2PSExtractor();
462944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber
472944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huberprivate:
482944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber    struct Track;
492944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber    struct WrappedTrack;
502944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber
512944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber    mutable Mutex mLock;
522944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber    sp<DataSource> mDataSource;
532944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber
542944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber    off64_t mOffset;
552944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber    status_t mFinalResult;
562944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber    sp<ABuffer> mBuffer;
572944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber    KeyedVector<unsigned, sp<Track> > mTracks;
582944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber    bool mScanning;
592944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber
602944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber    bool mProgramStreamMapValid;
612944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber    KeyedVector<unsigned, unsigned> mStreamTypeByESID;
622944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber
632944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber    status_t feedMore();
642944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber
652944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber    status_t dequeueChunk();
662944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber    ssize_t dequeuePack();
672944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber    ssize_t dequeueSystemHeader();
682944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber    ssize_t dequeuePES();
692944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber
702944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber    DISALLOW_EVIL_CONSTRUCTORS(MPEG2PSExtractor);
712944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber};
722944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber
732944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huberbool SniffMPEG2PS(
742944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber        const sp<DataSource> &source, String8 *mimeType, float *confidence,
752944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber        sp<AMessage> *);
762944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber
772944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber}  // namespace android
782944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber
792944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber#endif  // MPEG2_PS_EXTRACTOR_H_
802944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber
81