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>
258dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber#include <utils/KeyedVector.h>
26cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <utils/Vector.h>
27cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <utils/RefBase.h>
28cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
29cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubernamespace android {
30cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
31cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberstruct ABitReader;
32f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ABuffer;
33cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberstruct MediaSource;
34cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
35cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberstruct ATSParser : public RefBase {
36f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    enum DiscontinuityType {
376e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        DISCONTINUITY_NONE              = 0,
386e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        DISCONTINUITY_TIME              = 1,
396e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        DISCONTINUITY_AUDIO_FORMAT      = 2,
406e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        DISCONTINUITY_VIDEO_FORMAT      = 4,
4187f2a558dd12043631e12c361abef301bf603140Andreas Huber        DISCONTINUITY_ABSOLUTE_TIME     = 8,
42d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber        DISCONTINUITY_TIME_OFFSET       = 16,
436e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
446e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        DISCONTINUITY_SEEK              = DISCONTINUITY_TIME,
456e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
466e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        // For legacy reasons this also implies a time discontinuity.
476e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        DISCONTINUITY_FORMATCHANGE      =
486e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber            DISCONTINUITY_AUDIO_FORMAT
496e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                | DISCONTINUITY_VIDEO_FORMAT
506e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                | DISCONTINUITY_TIME,
51f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    };
52f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
53c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber    enum Flags {
54c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber        // The 90kHz clock (PTS/DTS) is absolute, i.e. PTS=0 corresponds to
55c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber        // a media time of 0.
56c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber        // If this flag is _not_ specified, the first PTS encountered in a
57c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber        // program of this stream will be assumed to correspond to media time 0
58c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber        // instead.
5987f2a558dd12043631e12c361abef301bf603140Andreas Huber        TS_TIMESTAMPS_ARE_ABSOLUTE = 1,
6087f2a558dd12043631e12c361abef301bf603140Andreas Huber        // Video PES packets contain exactly one (aligned) access unit.
6187f2a558dd12043631e12c361abef301bf603140Andreas Huber        ALIGNED_VIDEO_DATA         = 2,
62c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber    };
63c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber
64c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber    ATSParser(uint32_t flags = 0);
65cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
6606528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber    status_t feedTSPacket(const void *data, size_t size);
6732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
6832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber    void signalDiscontinuity(
6932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            DiscontinuityType type, const sp<AMessage> &extra);
7032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
71f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    void signalEOS(status_t finalResult);
72cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
73cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    enum SourceType {
7443ca783effd99bba0e6e2dd6fe177a8888578ef8Robert Shih        VIDEO = 0,
7543ca783effd99bba0e6e2dd6fe177a8888578ef8Robert Shih        AUDIO = 1,
7643ca783effd99bba0e6e2dd6fe177a8888578ef8Robert Shih        NUM_SOURCE_TYPES = 2
77cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    };
78cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    sp<MediaSource> getSource(SourceType type);
79cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
8043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    bool PTSTimeDeltaEstablished();
8143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
82386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    enum {
83386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        // From ISO/IEC 13818-1: 2000 (E), Table 2-29
842944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber        STREAMTYPE_RESERVED             = 0x00,
85386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        STREAMTYPE_MPEG1_VIDEO          = 0x01,
86386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        STREAMTYPE_MPEG2_VIDEO          = 0x02,
87386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        STREAMTYPE_MPEG1_AUDIO          = 0x03,
88386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        STREAMTYPE_MPEG2_AUDIO          = 0x04,
896e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        STREAMTYPE_MPEG2_AUDIO_ADTS     = 0x0f,
90386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        STREAMTYPE_MPEG4_VIDEO          = 0x10,
91386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        STREAMTYPE_H264                 = 0x1b,
92dd432ce03eccf280d83672f95076b6fbd561047fChangwan Ryu
93dd432ce03eccf280d83672f95076b6fbd561047fChangwan Ryu        // From ATSC A/53 Part 3:2009, 6.7.1
94dd432ce03eccf280d83672f95076b6fbd561047fChangwan Ryu        STREAMTYPE_AC3                  = 0x81,
95dd432ce03eccf280d83672f95076b6fbd561047fChangwan Ryu
969bf32f06e8971c1d3eb4fc5edd74b69557f97212Chong Zhang        // Stream type 0x83 is non-standard,
979bf32f06e8971c1d3eb4fc5edd74b69557f97212Chong Zhang        // it could be LPCM or TrueHD AC3
989bf32f06e8971c1d3eb4fc5edd74b69557f97212Chong Zhang        STREAMTYPE_LPCM_AC3             = 0x83,
99386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    };
100386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
1012944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huberprotected:
1022944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber    virtual ~ATSParser();
1032944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber
1042944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huberprivate:
105cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    struct Program;
106cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    struct Stream;
1078dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    struct PSISection;
108cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
109c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber    uint32_t mFlags;
110cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    Vector<sp<Program> > mPrograms;
111cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1128dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    // Keyed by PID
1138dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    KeyedVector<unsigned, sp<PSISection> > mPSISections;
1148dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
11587f2a558dd12043631e12c361abef301bf603140Andreas Huber    int64_t mAbsoluteTimeAnchorUs;
11687f2a558dd12043631e12c361abef301bf603140Andreas Huber
117d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber    bool mTimeOffsetValid;
118d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber    int64_t mTimeOffsetUs;
119d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber
12087f2a558dd12043631e12c361abef301bf603140Andreas Huber    size_t mNumTSPacketsParsed;
12187f2a558dd12043631e12c361abef301bf603140Andreas Huber
122cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    void parseProgramAssociationTable(ABitReader *br);
123cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    void parseProgramMap(ABitReader *br);
124cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    void parsePES(ABitReader *br);
125cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
12606528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber    status_t parsePID(
127cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        ABitReader *br, unsigned PID,
12887f2a558dd12043631e12c361abef301bf603140Andreas Huber        unsigned continuity_counter,
129cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned payload_unit_start_indicator);
130cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
13187f2a558dd12043631e12c361abef301bf603140Andreas Huber    void parseAdaptationField(ABitReader *br, unsigned PID);
13206528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber    status_t parseTS(ABitReader *br);
133cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
13487f2a558dd12043631e12c361abef301bf603140Andreas Huber    void updatePCR(unsigned PID, uint64_t PCR, size_t byteOffsetFromStart);
13587f2a558dd12043631e12c361abef301bf603140Andreas Huber
13687f2a558dd12043631e12c361abef301bf603140Andreas Huber    uint64_t mPCR[2];
13787f2a558dd12043631e12c361abef301bf603140Andreas Huber    size_t mPCRBytes[2];
13887f2a558dd12043631e12c361abef301bf603140Andreas Huber    int64_t mSystemTimeUs[2];
13987f2a558dd12043631e12c361abef301bf603140Andreas Huber    size_t mNumPCRs;
14087f2a558dd12043631e12c361abef301bf603140Andreas Huber
141cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    DISALLOW_EVIL_CONSTRUCTORS(ATSParser);
142cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber};
143cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
144cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}  // namespace android
145cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
146cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#endif  // A_TS_PARSER_H_
147