ATSParser.h revision f2f072e87718ecf6df40ba51b95e2a93bc68f720
171daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org/*
243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Copyright (C) 2010 The Android Open Source Project
343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *
443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Licensed under the Apache License, Version 2.0 (the "License");
543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * you may not use this file except in compliance with the License.
643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * You may obtain a copy of the License at
743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *
843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *      http://www.apache.org/licenses/LICENSE-2.0
943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *
1043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Unless required by applicable law or agreed to in writing, software
1143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * distributed under the License is distributed on an "AS IS" BASIS,
1243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * See the License for the specific language governing permissions and
1443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * limitations under the License.
1543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
1643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#ifndef A_TS_PARSER_H_
1843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#define A_TS_PARSER_H_
2043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include <sys/types.h>
2243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include <media/stagefright/foundation/ABase.h>
2443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include <media/stagefright/foundation/AMessage.h>
2543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include <utils/KeyedVector.h>
2643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include <utils/Vector.h>
2743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include <utils/RefBase.h>
2843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansennamespace android {
3043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenstruct ABitReader;
32f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.orgstruct ABuffer;
33d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.orgstruct MediaSource;
3401beca7f8d9f549e04ec575a0bca96d859ab55a5ager@chromium.org
3543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenstruct ATSParser : public RefBase {
36f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org    enum DiscontinuityType {
37f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org        DISCONTINUITY_NONE              = 0,
387c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org        DISCONTINUITY_TIME              = 1,
3943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        DISCONTINUITY_AUDIO_FORMAT      = 2,
4071affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org        DISCONTINUITY_VIDEO_FORMAT      = 4,
4171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org        DISCONTINUITY_ABSOLUTE_TIME     = 8,
4243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        DISCONTINUITY_TIME_OFFSET       = 16,
4343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
4443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        // For legacy reasons this also implies a time discontinuity.
4543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        DISCONTINUITY_FORMATCHANGE      =
4643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen            DISCONTINUITY_AUDIO_FORMAT
4743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                | DISCONTINUITY_VIDEO_FORMAT
4843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                | DISCONTINUITY_TIME,
4943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    };
5043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    enum Flags {
5243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        // The 90kHz clock (PTS/DTS) is absolute, i.e. PTS=0 corresponds to
5343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        // a media time of 0.
5443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        // If this flag is _not_ specified, the first PTS encountered in a
5543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        // program of this stream will be assumed to correspond to media time 0
5643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        // instead.
5743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        TS_TIMESTAMPS_ARE_ABSOLUTE = 1,
5843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        // Video PES packets contain exactly one (aligned) access unit.
5943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        ALIGNED_VIDEO_DATA         = 2,
6043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    };
6143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
6243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    ATSParser(uint32_t flags = 0);
6343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
6443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    status_t feedTSPacket(const void *data, size_t size);
6543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
6643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    void signalDiscontinuity(
6743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen            DiscontinuityType type, const sp<AMessage> &extra);
6843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
6943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    void signalEOS(status_t finalResult);
7043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
7143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    enum SourceType {
7243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        VIDEO = 0,
7343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        AUDIO = 1,
7443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        NUM_SOURCE_TYPES = 2
7543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    };
7643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    sp<MediaSource> getSource(SourceType type);
7743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
7843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    bool PTSTimeDeltaEstablished();
7943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
8043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    enum {
8143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        // From ISO/IEC 13818-1: 2000 (E), Table 2-29
8243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        STREAMTYPE_RESERVED             = 0x00,
8343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        STREAMTYPE_MPEG1_VIDEO          = 0x01,
8443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        STREAMTYPE_MPEG2_VIDEO          = 0x02,
8543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        STREAMTYPE_MPEG1_AUDIO          = 0x03,
8643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        STREAMTYPE_MPEG2_AUDIO          = 0x04,
8743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        STREAMTYPE_MPEG2_AUDIO_ADTS     = 0x0f,
88245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org        STREAMTYPE_MPEG4_VIDEO          = 0x10,
89245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org        STREAMTYPE_H264                 = 0x1b,
90245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org
9143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        // From ATSC A/53 Part 3:2009, 6.7.1
9243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        STREAMTYPE_AC3                  = 0x81,
9343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
9443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        // Stream type 0x83 is non-standard,
9543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        // it could be LPCM or TrueHD AC3
9643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        STREAMTYPE_LPCM_AC3             = 0x83,
9743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    };
9843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
9943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenprotected:
10043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    virtual ~ATSParser();
10143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
10243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenprivate:
10343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    struct Program;
10443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    struct Stream;
10543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    struct PSISection;
10643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
10743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    uint32_t mFlags;
10843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    Vector<sp<Program> > mPrograms;
10943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
11043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // Keyed by PID
11143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    KeyedVector<unsigned, sp<PSISection> > mPSISections;
112245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org
113245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    int64_t mAbsoluteTimeAnchorUs;
114245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org
115245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    bool mTimeOffsetValid;
116245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    int64_t mTimeOffsetUs;
11743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
11843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    size_t mNumTSPacketsParsed;
11943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
12043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    void parseProgramAssociationTable(ABitReader *br);
12143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    void parseProgramMap(ABitReader *br);
12243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    void parsePES(ABitReader *br);
12343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
12443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    status_t parsePID(
12543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        ABitReader *br, unsigned PID,
12643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        unsigned continuity_counter,
12743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        unsigned payload_unit_start_indicator);
12843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
12943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    void parseAdaptationField(ABitReader *br, unsigned PID);
1303811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org    status_t parseTS(ABitReader *br);
1313811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
1323811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org    void updatePCR(unsigned PID, uint64_t PCR, size_t byteOffsetFromStart);
13343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
13443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    uint64_t mPCR[2];
135245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    size_t mPCRBytes[2];
136245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    int64_t mSystemTimeUs[2];
137245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    size_t mNumPCRs;
13843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
13943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    DISALLOW_EVIL_CONSTRUCTORS(ATSParser);
140245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org};
141245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org
14243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}  // namespace android
14343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
144061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org#endif  // A_TS_PARSER_H_
145061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org