127c174483a8ae9688d5d4897c19074f62c7f1701James Dong/*
227c174483a8ae9688d5d4897c19074f62c7f1701James Dong * Copyright (C) 2010 The Android Open Source Project
327c174483a8ae9688d5d4897c19074f62c7f1701James Dong *
427c174483a8ae9688d5d4897c19074f62c7f1701James Dong * Licensed under the Apache License, Version 2.0 (the "License");
527c174483a8ae9688d5d4897c19074f62c7f1701James Dong * you may not use this file except in compliance with the License.
627c174483a8ae9688d5d4897c19074f62c7f1701James Dong * You may obtain a copy of the License at
727c174483a8ae9688d5d4897c19074f62c7f1701James Dong *
827c174483a8ae9688d5d4897c19074f62c7f1701James Dong *      http://www.apache.org/licenses/LICENSE-2.0
927c174483a8ae9688d5d4897c19074f62c7f1701James Dong *
1027c174483a8ae9688d5d4897c19074f62c7f1701James Dong * Unless required by applicable law or agreed to in writing, software
1127c174483a8ae9688d5d4897c19074f62c7f1701James Dong * distributed under the License is distributed on an "AS IS" BASIS,
1227c174483a8ae9688d5d4897c19074f62c7f1701James Dong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1327c174483a8ae9688d5d4897c19074f62c7f1701James Dong * See the License for the specific language governing permissions and
1427c174483a8ae9688d5d4897c19074f62c7f1701James Dong * limitations under the License.
1527c174483a8ae9688d5d4897c19074f62c7f1701James Dong */
1627c174483a8ae9688d5d4897c19074f62c7f1701James Dong
17cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#ifndef MPEG2_TS_EXTRACTOR_H_
18cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
19cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#define MPEG2_TS_EXTRACTOR_H_
20cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
21cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/foundation/ABase.h>
22cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/MediaExtractor.h>
23540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim#include <media/stagefright/MediaSource.h>
24cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <utils/threads.h>
25540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim#include <utils/KeyedVector.h>
26cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <utils/Vector.h>
27cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
289558f6dd733dc450270f38b9a139d384d273ce0aWei Jia#include "mpeg2ts/ATSParser.h"
299558f6dd733dc450270f38b9a139d384d273ce0aWei Jia
30cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubernamespace android {
31cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
325a1c3529e4fa2f8a11054181294e0ce79fff8dd3Andreas Huberstruct AMessage;
33cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberstruct AnotherPacketSource;
34cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberstruct ATSParser;
3586a58cabe322b746ab0eb17f0cade34ed68ba60eBernhard Rosenkränzerclass DataSource;
36cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberstruct MPEG2TSSource;
37ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnarclass String8;
38cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
39cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberstruct MPEG2TSExtractor : public MediaExtractor {
4040d8899f60c5212af9d727ba0ffaaecf676ebd1dChih-Hung Hsieh    explicit MPEG2TSExtractor(const sp<DataSource> &source);
41cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
42cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    virtual size_t countTracks();
43b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen    virtual sp<IMediaSource> getTrack(size_t index);
44cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    virtual sp<MetaData> getTrackMetaData(size_t index, uint32_t flags);
45cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
46cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    virtual sp<MetaData> getMetaData();
47cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
483b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    virtual status_t setMediaCas(const sp<ICas> &cas) override;
493b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
50bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    virtual uint32_t flags() const;
51a48a51c056198a778755cbed52884dc30b74ac0aMarco Nelissen    virtual const char * name() { return "MPEG2TSExtractor"; }
52bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber
53cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberprivate:
54cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    friend struct MPEG2TSSource;
55cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
56bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    mutable Mutex mLock;
57cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
58cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    sp<DataSource> mDataSource;
59bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber
60cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    sp<ATSParser> mParser;
61cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
629558f6dd733dc450270f38b9a139d384d273ce0aWei Jia    // Used to remember SyncEvent occurred in feedMore() when called from init(),
639558f6dd733dc450270f38b9a139d384d273ce0aWei Jia    // because init() needs to update |mSourceImpls| before adding SyncPoint.
649558f6dd733dc450270f38b9a139d384d273ce0aWei Jia    ATSParser::SyncEvent mLastSyncEvent;
659558f6dd733dc450270f38b9a139d384d273ce0aWei Jia
66cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    Vector<sp<AnotherPacketSource> > mSourceImpls;
67cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
68540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    Vector<KeyedVector<int64_t, off64_t> > mSyncPoints;
69540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    // Sync points used for seeking --- normally one for video track is used.
70540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    // If no video track is present, audio track will be used instead.
71540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    KeyedVector<int64_t, off64_t> *mSeekSyncPoints;
72540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim
73c7fc37a3dab9bd1f96713649f351b5990e6316ffJames Dong    off64_t mOffset;
74cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
753b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    static bool isScrambledFormat(const sp<MetaData> &format);
763b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
77cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    void init();
783b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    void addSource(const sp<AnotherPacketSource> &impl);
799558f6dd733dc450270f38b9a139d384d273ce0aWei Jia    // Try to feed more data from source to parser.
809558f6dd733dc450270f38b9a139d384d273ce0aWei Jia    // |isInit| means this function is called inside init(). This is a signal to
819558f6dd733dc450270f38b9a139d384d273ce0aWei Jia    // save SyncEvent so that init() can add SyncPoint after it updates |mSourceImpls|.
829558f6dd733dc450270f38b9a139d384d273ce0aWei Jia    // This function returns OK if expected amount of data is fed from DataSource to
839558f6dd733dc450270f38b9a139d384d273ce0aWei Jia    // parser and is successfully parsed. Otherwise, various error codes could be
849558f6dd733dc450270f38b9a139d384d273ce0aWei Jia    // returned, e.g., ERROR_END_OF_STREAM, or no data availalbe from DataSource, or
859558f6dd733dc450270f38b9a139d384d273ce0aWei Jia    // the data has syntax error during parsing, etc.
869558f6dd733dc450270f38b9a139d384d273ce0aWei Jia    status_t feedMore(bool isInit = false);
87540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    status_t seek(int64_t seekTimeUs,
88540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim            const MediaSource::ReadOptions::SeekMode& seekMode);
89540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    status_t queueDiscontinuityForSeek(int64_t actualSeekTimeUs);
90540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    status_t seekBeyond(int64_t seekTimeUs);
91540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim
92540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    status_t feedUntilBufferAvailable(const sp<AnotherPacketSource> &impl);
93cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
949558f6dd733dc450270f38b9a139d384d273ce0aWei Jia    // Add a SynPoint derived from |event|.
959558f6dd733dc450270f38b9a139d384d273ce0aWei Jia    void addSyncPoint_l(const ATSParser::SyncEvent &event);
969558f6dd733dc450270f38b9a139d384d273ce0aWei Jia
9782e147049625a4cfdcb228a1de7efda594d446c9Robert Shih    status_t  estimateDurationsFromTimesUsAtEnd();
9882e147049625a4cfdcb228a1de7efda594d446c9Robert Shih
99cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    DISALLOW_EVIL_CONSTRUCTORS(MPEG2TSExtractor);
100cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber};
101cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
102cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberbool SniffMPEG2TS(
1035a1c3529e4fa2f8a11054181294e0ce79fff8dd3Andreas Huber        const sp<DataSource> &source, String8 *mimeType, float *confidence,
1045a1c3529e4fa2f8a11054181294e0ce79fff8dd3Andreas Huber        sp<AMessage> *);
105cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
106cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}  // namespace android
107cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
108cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#endif  // MPEG2_TS_EXTRACTOR_H_
109