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>
22d91dc5a0602f54fc0d4d2187f37b5b8169bb62c3Dongwon Kang#include <media/MediaExtractor.h>
233d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissen#include <media/stagefright/MetaDataBase.h>
242944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber#include <utils/threads.h>
252944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber#include <utils/KeyedVector.h>
262944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber
272944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Hubernamespace android {
282944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber
292944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huberstruct ABuffer;
302944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huberstruct AMessage;
312944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huberstruct Track;
32ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnarclass String8;
332944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber
342944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huberstruct MPEG2PSExtractor : public MediaExtractor {
352a243f08193fe9ff1afe018e9953f01c44ced9deMarco Nelissen    explicit MPEG2PSExtractor(DataSourceBase *source);
362944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber
372944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber    virtual size_t countTracks();
383d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissen    virtual MediaTrack *getTrack(size_t index);
393d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissen    virtual status_t getTrackMetaData(MetaDataBase& meta, size_t index, uint32_t flags);
402944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber
413d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissen    virtual status_t getMetaData(MetaDataBase& meta);
422944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber
432944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber    virtual uint32_t flags() const;
44a48a51c056198a778755cbed52884dc30b74ac0aMarco Nelissen    virtual const char * name() { return "MPEG2PSExtractor"; }
452944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber
462944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huberprotected:
472944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber    virtual ~MPEG2PSExtractor();
482944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber
492944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huberprivate:
502944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber    struct Track;
512944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber    struct WrappedTrack;
522944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber
532944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber    mutable Mutex mLock;
542a243f08193fe9ff1afe018e9953f01c44ced9deMarco Nelissen    DataSourceBase *mDataSource;
552944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber
562944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber    off64_t mOffset;
572944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber    status_t mFinalResult;
582944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber    sp<ABuffer> mBuffer;
592944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber    KeyedVector<unsigned, sp<Track> > mTracks;
602944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber    bool mScanning;
612944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber
622944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber    bool mProgramStreamMapValid;
632944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber    KeyedVector<unsigned, unsigned> mStreamTypeByESID;
642944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber
652944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber    status_t feedMore();
662944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber
672944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber    status_t dequeueChunk();
682944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber    ssize_t dequeuePack();
692944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber    ssize_t dequeueSystemHeader();
702944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber    ssize_t dequeuePES();
712944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber
722944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber    DISALLOW_EVIL_CONSTRUCTORS(MPEG2PSExtractor);
732944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber};
742944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber
7517e172b4c3c87ecaa7c87eecc42b4dc47e3e9734Dongwon Kangbool SniffMPEG2PS(DataSourceBase *source, float *confidence);
762944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber
772944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber}  // namespace android
782944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber
792944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber#endif  // MPEG2_PS_EXTRACTOR_H_
802944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber
81