1cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber/*
2cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * Copyright (C) 2010 The Android Open Source Project
3cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber *
4cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * you may not use this file except in compliance with the License.
6cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * You may obtain a copy of the License at
7cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber *
8cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber *
10cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * Unless required by applicable law or agreed to in writing, software
11cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * See the License for the specific language governing permissions and
14cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * limitations under the License.
15cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber */
16cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
17cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#ifndef A_TS_PARSER_H_
18cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
19cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#define A_TS_PARSER_H_
20cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
21cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <sys/types.h>
22cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
23cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/foundation/ABase.h>
24f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/AMessage.h>
25540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim#include <media/stagefright/MediaSource.h>
268dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber#include <utils/KeyedVector.h>
27cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <utils/Vector.h>
28cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <utils/RefBase.h>
293b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang#include <vector>
30cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
31cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubernamespace android {
323b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhangnamespace media {
333b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhangclass ICas;
343b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhangclass IDescrambler;
353b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang};
363b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhangusing namespace media;
3786a58cabe322b746ab0eb17f0cade34ed68ba60eBernhard Rosenkränzerclass ABitReader;
38f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ABuffer;
393b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhangstruct AnotherPacketSource;
40cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
41cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberstruct ATSParser : public RefBase {
42f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    enum DiscontinuityType {
436e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        DISCONTINUITY_NONE              = 0,
446e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        DISCONTINUITY_TIME              = 1,
456e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        DISCONTINUITY_AUDIO_FORMAT      = 2,
466e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        DISCONTINUITY_VIDEO_FORMAT      = 4,
4787f2a558dd12043631e12c361abef301bf603140Andreas Huber        DISCONTINUITY_ABSOLUTE_TIME     = 8,
48d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber        DISCONTINUITY_TIME_OFFSET       = 16,
496e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
506e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        // For legacy reasons this also implies a time discontinuity.
516e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        DISCONTINUITY_FORMATCHANGE      =
526e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber            DISCONTINUITY_AUDIO_FORMAT
536e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                | DISCONTINUITY_VIDEO_FORMAT
546e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                | DISCONTINUITY_TIME,
55a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang        DISCONTINUITY_FORMAT_ONLY       =
56a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang            DISCONTINUITY_AUDIO_FORMAT
57a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang                | DISCONTINUITY_VIDEO_FORMAT,
58f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    };
59f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
60c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber    enum Flags {
61c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber        // The 90kHz clock (PTS/DTS) is absolute, i.e. PTS=0 corresponds to
62c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber        // a media time of 0.
63c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber        // If this flag is _not_ specified, the first PTS encountered in a
64c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber        // program of this stream will be assumed to correspond to media time 0
65c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber        // instead.
6687f2a558dd12043631e12c361abef301bf603140Andreas Huber        TS_TIMESTAMPS_ARE_ABSOLUTE = 1,
6787f2a558dd12043631e12c361abef301bf603140Andreas Huber        // Video PES packets contain exactly one (aligned) access unit.
6887f2a558dd12043631e12c361abef301bf603140Andreas Huber        ALIGNED_VIDEO_DATA         = 2,
69c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber    };
70c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber
7182e147049625a4cfdcb228a1de7efda594d446c9Robert Shih    enum SourceType {
7282e147049625a4cfdcb228a1de7efda594d446c9Robert Shih        VIDEO = 0,
7382e147049625a4cfdcb228a1de7efda594d446c9Robert Shih        AUDIO = 1,
7482e147049625a4cfdcb228a1de7efda594d446c9Robert Shih        META  = 2,
7582e147049625a4cfdcb228a1de7efda594d446c9Robert Shih        NUM_SOURCE_TYPES = 3
7682e147049625a4cfdcb228a1de7efda594d446c9Robert Shih    };
7782e147049625a4cfdcb228a1de7efda594d446c9Robert Shih
78540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    // Event is used to signal sync point event at feedTSPacket().
79540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    struct SyncEvent {
8040d8899f60c5212af9d727ba0ffaaecf676ebd1dChih-Hung Hsieh        explicit SyncEvent(off64_t offset);
81540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim
82540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim        void init(off64_t offset, const sp<MediaSource> &source,
8382e147049625a4cfdcb228a1de7efda594d446c9Robert Shih                int64_t timeUs, SourceType type);
84540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim
859558f6dd733dc450270f38b9a139d384d273ce0aWei Jia        bool hasReturnedData() const { return mHasReturnedData; }
869558f6dd733dc450270f38b9a139d384d273ce0aWei Jia        void reset();
879558f6dd733dc450270f38b9a139d384d273ce0aWei Jia        off64_t getOffset() const { return mOffset; }
889558f6dd733dc450270f38b9a139d384d273ce0aWei Jia        const sp<MediaSource> &getMediaSource() const { return mMediaSource; }
899558f6dd733dc450270f38b9a139d384d273ce0aWei Jia        int64_t getTimeUs() const { return mTimeUs; }
9082e147049625a4cfdcb228a1de7efda594d446c9Robert Shih        SourceType getType() const { return mType; }
91540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim
92540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    private:
939558f6dd733dc450270f38b9a139d384d273ce0aWei Jia        bool mHasReturnedData;
94540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim        /*
959558f6dd733dc450270f38b9a139d384d273ce0aWei Jia         * mHasReturnedData == false: the current offset (or undefined if the returned data
969558f6dd733dc450270f38b9a139d384d273ce0aWei Jia                                      has been invalidated via reset())
979558f6dd733dc450270f38b9a139d384d273ce0aWei Jia         * mHasReturnedData == true: the start offset of sync payload
98540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim         */
99540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim        off64_t mOffset;
100540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim        /* The media source object for this event. */
101540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim        sp<MediaSource> mMediaSource;
102540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim        /* The timestamp of the sync frame. */
103540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim        int64_t mTimeUs;
10482e147049625a4cfdcb228a1de7efda594d446c9Robert Shih        SourceType mType;
105540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    };
106540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim
10740d8899f60c5212af9d727ba0ffaaecf676ebd1dChih-Hung Hsieh    explicit ATSParser(uint32_t flags = 0);
108cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1093b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    status_t setMediaCas(const sp<ICas> &cas);
1103b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
111540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    // Feed a TS packet into the parser. uninitialized event with the start
112540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    // offset of this TS packet goes in, and if the parser detects PES with
113540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    // a sync frame, the event will be initiailzed with the start offset of the
114540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    // PES. Note that the offset of the event can be different from what we fed,
115540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    // as a PES may consist of multiple TS packets.
116540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    //
117540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    // Even in the case feedTSPacket() returns non-OK value, event still may be
118540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    // initialized if the parsing failed after the detection.
119540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    status_t feedTSPacket(
120540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim            const void *data, size_t size, SyncEvent *event = NULL);
12132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
12232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber    void signalDiscontinuity(
12332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            DiscontinuityType type, const sp<AMessage> &extra);
12432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
125f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    void signalEOS(status_t finalResult);
126cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
127cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    sp<MediaSource> getSource(SourceType type);
128bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih    bool hasSource(SourceType type) const;
129cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
13043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    bool PTSTimeDeltaEstablished();
13143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
13282e147049625a4cfdcb228a1de7efda594d446c9Robert Shih    int64_t getFirstPTSTimeUs();
13382e147049625a4cfdcb228a1de7efda594d446c9Robert Shih
1343a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania    void signalNewSampleAesKey(const sp<AMessage> &keyItem);
1353a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania
136386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    enum {
137386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        // From ISO/IEC 13818-1: 2000 (E), Table 2-29
1382944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber        STREAMTYPE_RESERVED             = 0x00,
139386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        STREAMTYPE_MPEG1_VIDEO          = 0x01,
140386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        STREAMTYPE_MPEG2_VIDEO          = 0x02,
141386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        STREAMTYPE_MPEG1_AUDIO          = 0x03,
142386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        STREAMTYPE_MPEG2_AUDIO          = 0x04,
1436e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        STREAMTYPE_MPEG2_AUDIO_ADTS     = 0x0f,
144386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        STREAMTYPE_MPEG4_VIDEO          = 0x10,
1450852843d304006e3ab333081fddda13b07193de8Robert Shih        STREAMTYPE_METADATA             = 0x15,
146386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        STREAMTYPE_H264                 = 0x1b,
147dd432ce03eccf280d83672f95076b6fbd561047fChangwan Ryu
148dd432ce03eccf280d83672f95076b6fbd561047fChangwan Ryu        // From ATSC A/53 Part 3:2009, 6.7.1
149dd432ce03eccf280d83672f95076b6fbd561047fChangwan Ryu        STREAMTYPE_AC3                  = 0x81,
150dd432ce03eccf280d83672f95076b6fbd561047fChangwan Ryu
1519bf32f06e8971c1d3eb4fc5edd74b69557f97212Chong Zhang        // Stream type 0x83 is non-standard,
1529bf32f06e8971c1d3eb4fc5edd74b69557f97212Chong Zhang        // it could be LPCM or TrueHD AC3
1539bf32f06e8971c1d3eb4fc5edd74b69557f97212Chong Zhang        STREAMTYPE_LPCM_AC3             = 0x83,
1543a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania
1553a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania        //Sample Encrypted types
1563a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania        STREAMTYPE_H264_ENCRYPTED       = 0xDB,
1573a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania        STREAMTYPE_AAC_ENCRYPTED        = 0xCF,
1583a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania        STREAMTYPE_AC3_ENCRYPTED        = 0xC1,
159386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    };
160386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
1612944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huberprotected:
1622944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber    virtual ~ATSParser();
1632944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber
1642944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huberprivate:
165cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    struct Program;
166cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    struct Stream;
1678dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    struct PSISection;
1683b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    struct CasManager;
1693b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    struct CADescriptor {
1703b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        int32_t mSystemID;
1713b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        unsigned mPID;
1723b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        std::vector<uint8_t> mPrivateData;
1733b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    };
1743b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
1753b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    sp<CasManager> mCasManager;
176cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
177c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber    uint32_t mFlags;
178cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    Vector<sp<Program> > mPrograms;
179cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1808dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    // Keyed by PID
1818dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    KeyedVector<unsigned, sp<PSISection> > mPSISections;
1828dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
18387f2a558dd12043631e12c361abef301bf603140Andreas Huber    int64_t mAbsoluteTimeAnchorUs;
18487f2a558dd12043631e12c361abef301bf603140Andreas Huber
185d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber    bool mTimeOffsetValid;
186d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber    int64_t mTimeOffsetUs;
187d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang    int64_t mLastRecoveredPTS;
188d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber
18987f2a558dd12043631e12c361abef301bf603140Andreas Huber    size_t mNumTSPacketsParsed;
19087f2a558dd12043631e12c361abef301bf603140Andreas Huber
1913a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania    sp<AMessage> mSampleAesKeyItem;
1923a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania
193cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    void parseProgramAssociationTable(ABitReader *br);
194cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    void parseProgramMap(ABitReader *br);
195540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    // Parse PES packet where br is pointing to. If the PES contains a sync
196540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    // frame, set event with the time and the start offset of this PES.
197540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    // Note that the method itself does not touch event.
198540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    void parsePES(ABitReader *br, SyncEvent *event);
199540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim
200540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    // Strip remaining packet headers and pass to appropriate program/stream
201540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    // to parse the payload. If the payload turns out to be PES and contains
202540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    // a sync frame, event shall be set with the time and start offset of the
203540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    // PES.
204540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    // Note that the method itself does not touch event.
20506528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber    status_t parsePID(
206cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        ABitReader *br, unsigned PID,
20787f2a558dd12043631e12c361abef301bf603140Andreas Huber        unsigned continuity_counter,
208540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim        unsigned payload_unit_start_indicator,
2093b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        unsigned transport_scrambling_control,
2103b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        unsigned random_access_indicator,
211540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim        SyncEvent *event);
212cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
2133b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    status_t parseAdaptationField(
2143b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            ABitReader *br, unsigned PID, unsigned *random_access_indicator);
2153b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
216540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    // see feedTSPacket().
217540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    status_t parseTS(ABitReader *br, SyncEvent *event);
218cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
21919cec89f8b05fd05f8034ee1a4cd39ee09c33f02Marco Nelissen    void updatePCR(unsigned PID, uint64_t PCR, uint64_t byteOffsetFromStart);
22087f2a558dd12043631e12c361abef301bf603140Andreas Huber
22187f2a558dd12043631e12c361abef301bf603140Andreas Huber    uint64_t mPCR[2];
22219cec89f8b05fd05f8034ee1a4cd39ee09c33f02Marco Nelissen    uint64_t mPCRBytes[2];
22387f2a558dd12043631e12c361abef301bf603140Andreas Huber    int64_t mSystemTimeUs[2];
22487f2a558dd12043631e12c361abef301bf603140Andreas Huber    size_t mNumPCRs;
22587f2a558dd12043631e12c361abef301bf603140Andreas Huber
226cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    DISALLOW_EVIL_CONSTRUCTORS(ATSParser);
227cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber};
228cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
229cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}  // namespace android
230cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
231cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#endif  // A_TS_PARSER_H_
232