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;
31ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnarclass String8;
322944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber
332944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huberstruct MPEG2PSExtractor : public MediaExtractor {
3440d8899f60c5212af9d727ba0ffaaecf676ebd1dChih-Hung Hsieh    explicit MPEG2PSExtractor(const sp<DataSource> &source);
352944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber
362944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber    virtual size_t countTracks();
37b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen    virtual sp<IMediaSource> 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;
43a48a51c056198a778755cbed52884dc30b74ac0aMarco Nelissen    virtual const char * name() { return "MPEG2PSExtractor"; }
442944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber
452944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huberprotected:
462944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber    virtual ~MPEG2PSExtractor();
472944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber
482944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huberprivate:
492944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber    struct Track;
502944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber    struct WrappedTrack;
512944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber
522944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber    mutable Mutex mLock;
532944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber    sp<DataSource> mDataSource;
542944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber
552944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber    off64_t mOffset;
562944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber    status_t mFinalResult;
572944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber    sp<ABuffer> mBuffer;
582944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber    KeyedVector<unsigned, sp<Track> > mTracks;
592944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber    bool mScanning;
602944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber
612944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber    bool mProgramStreamMapValid;
622944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber    KeyedVector<unsigned, unsigned> mStreamTypeByESID;
632944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber
642944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber    status_t feedMore();
652944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber
662944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber    status_t dequeueChunk();
672944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber    ssize_t dequeuePack();
682944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber    ssize_t dequeueSystemHeader();
692944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber    ssize_t dequeuePES();
702944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber
712944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber    DISALLOW_EVIL_CONSTRUCTORS(MPEG2PSExtractor);
722944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber};
732944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber
742944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huberbool SniffMPEG2PS(
752944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber        const sp<DataSource> &source, String8 *mimeType, float *confidence,
762944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber        sp<AMessage> *);
772944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber
782944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber}  // namespace android
792944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber
802944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber#endif  // MPEG2_PS_EXTRACTOR_H_
812944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber
82