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 {
40cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    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
48bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    virtual uint32_t flags() const;
49a48a51c056198a778755cbed52884dc30b74ac0aMarco Nelissen    virtual const char * name() { return "MPEG2TSExtractor"; }
50bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber
51cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberprivate:
52cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    friend struct MPEG2TSSource;
53cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
54bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    mutable Mutex mLock;
55cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
56cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    sp<DataSource> mDataSource;
57bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber
58cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    sp<ATSParser> mParser;
59cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
609558f6dd733dc450270f38b9a139d384d273ce0aWei Jia    // Used to remember SyncEvent occurred in feedMore() when called from init(),
619558f6dd733dc450270f38b9a139d384d273ce0aWei Jia    // because init() needs to update |mSourceImpls| before adding SyncPoint.
629558f6dd733dc450270f38b9a139d384d273ce0aWei Jia    ATSParser::SyncEvent mLastSyncEvent;
639558f6dd733dc450270f38b9a139d384d273ce0aWei Jia
64cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    Vector<sp<AnotherPacketSource> > mSourceImpls;
65cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
66540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    Vector<KeyedVector<int64_t, off64_t> > mSyncPoints;
67540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    // Sync points used for seeking --- normally one for video track is used.
68540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    // If no video track is present, audio track will be used instead.
69540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    KeyedVector<int64_t, off64_t> *mSeekSyncPoints;
70540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim
71c7fc37a3dab9bd1f96713649f351b5990e6316ffJames Dong    off64_t mOffset;
72cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
73cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    void init();
749558f6dd733dc450270f38b9a139d384d273ce0aWei Jia    // Try to feed more data from source to parser.
759558f6dd733dc450270f38b9a139d384d273ce0aWei Jia    // |isInit| means this function is called inside init(). This is a signal to
769558f6dd733dc450270f38b9a139d384d273ce0aWei Jia    // save SyncEvent so that init() can add SyncPoint after it updates |mSourceImpls|.
779558f6dd733dc450270f38b9a139d384d273ce0aWei Jia    // This function returns OK if expected amount of data is fed from DataSource to
789558f6dd733dc450270f38b9a139d384d273ce0aWei Jia    // parser and is successfully parsed. Otherwise, various error codes could be
799558f6dd733dc450270f38b9a139d384d273ce0aWei Jia    // returned, e.g., ERROR_END_OF_STREAM, or no data availalbe from DataSource, or
809558f6dd733dc450270f38b9a139d384d273ce0aWei Jia    // the data has syntax error during parsing, etc.
819558f6dd733dc450270f38b9a139d384d273ce0aWei Jia    status_t feedMore(bool isInit = false);
82540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    status_t seek(int64_t seekTimeUs,
83540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim            const MediaSource::ReadOptions::SeekMode& seekMode);
84540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    status_t queueDiscontinuityForSeek(int64_t actualSeekTimeUs);
85540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    status_t seekBeyond(int64_t seekTimeUs);
86540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim
87540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    status_t feedUntilBufferAvailable(const sp<AnotherPacketSource> &impl);
88cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
899558f6dd733dc450270f38b9a139d384d273ce0aWei Jia    // Add a SynPoint derived from |event|.
909558f6dd733dc450270f38b9a139d384d273ce0aWei Jia    void addSyncPoint_l(const ATSParser::SyncEvent &event);
919558f6dd733dc450270f38b9a139d384d273ce0aWei Jia
92cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    DISALLOW_EVIL_CONSTRUCTORS(MPEG2TSExtractor);
93cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber};
94cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
95cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberbool SniffMPEG2TS(
965a1c3529e4fa2f8a11054181294e0ce79fff8dd3Andreas Huber        const sp<DataSource> &source, String8 *mimeType, float *confidence,
975a1c3529e4fa2f8a11054181294e0ce79fff8dd3Andreas Huber        sp<AMessage> *);
98cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
99cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}  // namespace android
100cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
101cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#endif  // MPEG2_TS_EXTRACTOR_H_
102