127c174483a8ae9688d5d4897c19074f62c7f1701James Dong/*
23d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissen
327c174483a8ae9688d5d4897c19074f62c7f1701James Dong * Copyright (C) 2010 The Android Open Source Project
427c174483a8ae9688d5d4897c19074f62c7f1701James Dong *
527c174483a8ae9688d5d4897c19074f62c7f1701James Dong * Licensed under the Apache License, Version 2.0 (the "License");
627c174483a8ae9688d5d4897c19074f62c7f1701James Dong * you may not use this file except in compliance with the License.
727c174483a8ae9688d5d4897c19074f62c7f1701James Dong * You may obtain a copy of the License at
827c174483a8ae9688d5d4897c19074f62c7f1701James Dong *
927c174483a8ae9688d5d4897c19074f62c7f1701James Dong *      http://www.apache.org/licenses/LICENSE-2.0
1027c174483a8ae9688d5d4897c19074f62c7f1701James Dong *
1127c174483a8ae9688d5d4897c19074f62c7f1701James Dong * Unless required by applicable law or agreed to in writing, software
1227c174483a8ae9688d5d4897c19074f62c7f1701James Dong * distributed under the License is distributed on an "AS IS" BASIS,
1327c174483a8ae9688d5d4897c19074f62c7f1701James Dong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1427c174483a8ae9688d5d4897c19074f62c7f1701James Dong * See the License for the specific language governing permissions and
1527c174483a8ae9688d5d4897c19074f62c7f1701James Dong * limitations under the License.
1627c174483a8ae9688d5d4897c19074f62c7f1701James Dong */
1727c174483a8ae9688d5d4897c19074f62c7f1701James Dong
18cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#ifndef MPEG2_TS_EXTRACTOR_H_
19cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
20cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#define MPEG2_TS_EXTRACTOR_H_
21cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
22cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/foundation/ABase.h>
23d91dc5a0602f54fc0d4d2187f37b5b8169bb62c3Dongwon Kang#include <media/MediaExtractor.h>
243d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissen#include <media/MediaTrack.h>
253d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissen#include <media/stagefright/MetaDataBase.h>
26cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <utils/threads.h>
27540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim#include <utils/KeyedVector.h>
28cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <utils/Vector.h>
29cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
309558f6dd733dc450270f38b9a139d384d273ce0aWei Jia#include "mpeg2ts/ATSParser.h"
319558f6dd733dc450270f38b9a139d384d273ce0aWei Jia
32cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubernamespace android {
33cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
345a1c3529e4fa2f8a11054181294e0ce79fff8dd3Andreas Huberstruct AMessage;
35cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberstruct AnotherPacketSource;
36cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberstruct ATSParser;
372a243f08193fe9ff1afe018e9953f01c44ced9deMarco Nelissenclass DataSourceBase;
38cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberstruct MPEG2TSSource;
39ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnarclass String8;
40cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
41cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberstruct MPEG2TSExtractor : public MediaExtractor {
422a243f08193fe9ff1afe018e9953f01c44ced9deMarco Nelissen    explicit MPEG2TSExtractor(DataSourceBase *source);
43cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
44cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    virtual size_t countTracks();
453d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissen    virtual MediaTrack *getTrack(size_t index);
463d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissen    virtual status_t getTrackMetaData(MetaDataBase &meta, size_t index, uint32_t flags);
47cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
483d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissen    virtual status_t getMetaData(MetaDataBase& meta);
49cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
50d23ab3ae2248781640e9a10659c9ad0a78941accDongwon Kang    virtual status_t setMediaCas(const uint8_t* /*casToken*/, size_t /*size*/) override;
513b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
52bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    virtual uint32_t flags() const;
53a48a51c056198a778755cbed52884dc30b74ac0aMarco Nelissen    virtual const char * name() { return "MPEG2TSExtractor"; }
54bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber
55cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberprivate:
56cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    friend struct MPEG2TSSource;
57cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
58bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    mutable Mutex mLock;
59cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
602a243f08193fe9ff1afe018e9953f01c44ced9deMarco Nelissen    DataSourceBase *mDataSource;
61bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber
62cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    sp<ATSParser> mParser;
63cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
649558f6dd733dc450270f38b9a139d384d273ce0aWei Jia    // Used to remember SyncEvent occurred in feedMore() when called from init(),
659558f6dd733dc450270f38b9a139d384d273ce0aWei Jia    // because init() needs to update |mSourceImpls| before adding SyncPoint.
669558f6dd733dc450270f38b9a139d384d273ce0aWei Jia    ATSParser::SyncEvent mLastSyncEvent;
679558f6dd733dc450270f38b9a139d384d273ce0aWei Jia
68cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    Vector<sp<AnotherPacketSource> > mSourceImpls;
69cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
70540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    Vector<KeyedVector<int64_t, off64_t> > mSyncPoints;
71540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    // Sync points used for seeking --- normally one for video track is used.
72540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    // If no video track is present, audio track will be used instead.
73540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    KeyedVector<int64_t, off64_t> *mSeekSyncPoints;
74540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim
75c7fc37a3dab9bd1f96713649f351b5990e6316ffJames Dong    off64_t mOffset;
76cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
773d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissen    static bool isScrambledFormat(MetaDataBase &format);
783b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
79cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    void init();
803b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    void addSource(const sp<AnotherPacketSource> &impl);
819558f6dd733dc450270f38b9a139d384d273ce0aWei Jia    // Try to feed more data from source to parser.
829558f6dd733dc450270f38b9a139d384d273ce0aWei Jia    // |isInit| means this function is called inside init(). This is a signal to
839558f6dd733dc450270f38b9a139d384d273ce0aWei Jia    // save SyncEvent so that init() can add SyncPoint after it updates |mSourceImpls|.
842a243f08193fe9ff1afe018e9953f01c44ced9deMarco Nelissen    // This function returns OK if expected amount of data is fed from DataSourceBase to
859558f6dd733dc450270f38b9a139d384d273ce0aWei Jia    // parser and is successfully parsed. Otherwise, various error codes could be
862a243f08193fe9ff1afe018e9953f01c44ced9deMarco Nelissen    // returned, e.g., ERROR_END_OF_STREAM, or no data availalbe from DataSourceBase, or
879558f6dd733dc450270f38b9a139d384d273ce0aWei Jia    // the data has syntax error during parsing, etc.
889558f6dd733dc450270f38b9a139d384d273ce0aWei Jia    status_t feedMore(bool isInit = false);
89540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    status_t seek(int64_t seekTimeUs,
90540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim            const MediaSource::ReadOptions::SeekMode& seekMode);
91540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    status_t queueDiscontinuityForSeek(int64_t actualSeekTimeUs);
92540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    status_t seekBeyond(int64_t seekTimeUs);
93540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim
94540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    status_t feedUntilBufferAvailable(const sp<AnotherPacketSource> &impl);
95cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
969558f6dd733dc450270f38b9a139d384d273ce0aWei Jia    // Add a SynPoint derived from |event|.
979558f6dd733dc450270f38b9a139d384d273ce0aWei Jia    void addSyncPoint_l(const ATSParser::SyncEvent &event);
989558f6dd733dc450270f38b9a139d384d273ce0aWei Jia
9982e147049625a4cfdcb228a1de7efda594d446c9Robert Shih    status_t  estimateDurationsFromTimesUsAtEnd();
10082e147049625a4cfdcb228a1de7efda594d446c9Robert Shih
101cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    DISALLOW_EVIL_CONSTRUCTORS(MPEG2TSExtractor);
102cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber};
103cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
10417e172b4c3c87ecaa7c87eecc42b4dc47e3e9734Dongwon Kangbool SniffMPEG2TS(DataSourceBase *source, float *confidence);
105cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
106cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}  // namespace android
107cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
108cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#endif  // MPEG2_TS_EXTRACTOR_H_
109