ATSParser.cpp revision 9ca7b9c74e882526ee5810ff62f203bf75cd3f1a
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
176e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber//#define LOG_NDEBUG 0
186e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber#define LOG_TAG "ATSParser"
196e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber#include <utils/Log.h>
206e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber
21cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include "ATSParser.h"
22cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
23cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include "AnotherPacketSource.h"
246a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber#include "ESQueue.h"
2585f12e9b9062402d6110df3f7099707912040edbAndreas Huber#include "include/avc_utils.h"
26cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
2785f12e9b9062402d6110df3f7099707912040edbAndreas Huber#include <media/stagefright/foundation/ABitReader.h>
28cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/foundation/ABuffer.h>
29cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/foundation/ADebug.h>
30cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/foundation/AMessage.h>
31cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/foundation/hexdump.h>
32cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/MediaDefs.h>
33cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/MediaErrors.h>
34cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/MetaData.h>
358dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber#include <media/stagefright/Utils.h>
3632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber#include <media/IStreamSource.h>
37cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <utils/KeyedVector.h>
389bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang#include <utils/Vector.h>
39cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
40b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross#include <inttypes.h>
41b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross
42cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubernamespace android {
43cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
446e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber// I want the expression "y" evaluated even if verbose logging is off.
456e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber#define MY_LOGV(x, y) \
463856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    do { unsigned tmp = y; ALOGV(x, tmp); } while (0)
476e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber
48cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberstatic const size_t kTSPacketSize = 188;
49cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
50cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberstruct ATSParser::Program : public RefBase {
51386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    Program(ATSParser *parser, unsigned programNumber, unsigned programMapPID);
52cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
538dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    bool parsePSISection(
548dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            unsigned pid, ABitReader *br, status_t *err);
558dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
56cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    bool parsePID(
5787f2a558dd12043631e12c361abef301bf603140Andreas Huber            unsigned pid, unsigned continuity_counter,
5887f2a558dd12043631e12c361abef301bf603140Andreas Huber            unsigned payload_unit_start_indicator,
5906528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber            ABitReader *br, status_t *err);
60cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
6132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber    void signalDiscontinuity(
6232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            DiscontinuityType type, const sp<AMessage> &extra);
6332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
64f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    void signalEOS(status_t finalResult);
652a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber
66cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    sp<MediaSource> getSource(SourceType type);
67bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih    bool hasSource(SourceType type) const;
68cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
69bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    int64_t convertPTSToTimestamp(uint64_t PTS);
70bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber
7143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    bool PTSTimeDeltaEstablished() const {
7243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        return mFirstPTSValid;
7343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    }
7443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
75386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    unsigned number() const { return mProgramNumber; }
76386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
77386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    void updateProgramMapPID(unsigned programMapPID) {
78386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        mProgramMapPID = programMapPID;
79386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    }
80386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
818dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    unsigned programMapPID() const {
828dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        return mProgramMapPID;
838dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    }
848dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
8587f2a558dd12043631e12c361abef301bf603140Andreas Huber    uint32_t parserFlags() const {
8687f2a558dd12043631e12c361abef301bf603140Andreas Huber        return mParser->mFlags;
8787f2a558dd12043631e12c361abef301bf603140Andreas Huber    }
8887f2a558dd12043631e12c361abef301bf603140Andreas Huber
89cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberprivate:
909bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang    struct StreamInfo {
919bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        unsigned mType;
929bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        unsigned mPID;
939bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang    };
949bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang
95f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    ATSParser *mParser;
96386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    unsigned mProgramNumber;
97cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned mProgramMapPID;
98cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    KeyedVector<unsigned, sp<Stream> > mStreams;
99bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    bool mFirstPTSValid;
100bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    uint64_t mFirstPTS;
101799c9682b3776a55d234396aee4a302437150c26Chong Zhang    int64_t mLastRecoveredPTS;
102cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
10306528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber    status_t parseProgramMap(ABitReader *br);
104799c9682b3776a55d234396aee4a302437150c26Chong Zhang    int64_t recoverPTS(uint64_t PTS_33bit);
1059bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang    bool switchPIDs(const Vector<StreamInfo> &infos);
106cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
107cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    DISALLOW_EVIL_CONSTRUCTORS(Program);
108cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber};
109cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
110cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberstruct ATSParser::Stream : public RefBase {
11187f2a558dd12043631e12c361abef301bf603140Andreas Huber    Stream(Program *program,
11287f2a558dd12043631e12c361abef301bf603140Andreas Huber           unsigned elementaryPID,
11387f2a558dd12043631e12c361abef301bf603140Andreas Huber           unsigned streamType,
11487f2a558dd12043631e12c361abef301bf603140Andreas Huber           unsigned PCR_PID);
115cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
116bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber    unsigned type() const { return mStreamType; }
117bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber    unsigned pid() const { return mElementaryPID; }
118bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber    void setPID(unsigned pid) { mElementaryPID = pid; }
119bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber
1205403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber    status_t parse(
12187f2a558dd12043631e12c361abef301bf603140Andreas Huber            unsigned continuity_counter,
122cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            unsigned payload_unit_start_indicator,
123cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            ABitReader *br);
124cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
12532f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber    void signalDiscontinuity(
12632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            DiscontinuityType type, const sp<AMessage> &extra);
12732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
128f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    void signalEOS(status_t finalResult);
1292a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber
130cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    sp<MediaSource> getSource(SourceType type);
131cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
132bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih    bool isAudio() const;
133bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih    bool isVideo() const;
134bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih
135cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberprotected:
136cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    virtual ~Stream();
137cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
138cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberprivate:
139bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    Program *mProgram;
140cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned mElementaryPID;
141cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned mStreamType;
14287f2a558dd12043631e12c361abef301bf603140Andreas Huber    unsigned mPCR_PID;
14387f2a558dd12043631e12c361abef301bf603140Andreas Huber    int32_t mExpectedContinuityCounter;
144cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
145cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    sp<ABuffer> mBuffer;
146cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    sp<AnotherPacketSource> mSource;
147cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    bool mPayloadStarted;
148cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
14990a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber    uint64_t mPrevPTS;
15090a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber
151386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    ElementaryStreamQueue *mQueue;
1526a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber
1535403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber    status_t flush();
1545403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber    status_t parsePES(ABitReader *br);
155cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
156cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    void onPayloadData(
157cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            unsigned PTS_DTS_flags, uint64_t PTS, uint64_t DTS,
158cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            const uint8_t *data, size_t size);
159cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
16082f7321b03eec1e40af9d681370f754ee0279582Andreas Huber    void extractAACFrames(const sp<ABuffer> &buffer);
16182f7321b03eec1e40af9d681370f754ee0279582Andreas Huber
162cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    DISALLOW_EVIL_CONSTRUCTORS(Stream);
163cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber};
164cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1658dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberstruct ATSParser::PSISection : public RefBase {
1668dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    PSISection();
1678dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
1688dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    status_t append(const void *data, size_t size);
1699ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    void setSkipBytes(uint8_t skip);
1708dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    void clear();
1718dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
1728dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    bool isComplete() const;
1738dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    bool isEmpty() const;
1749ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    bool isCRCOkay() const;
1758dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
1768dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    const uint8_t *data() const;
1778dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    size_t size() const;
1788dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
1798dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberprotected:
1808dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    virtual ~PSISection();
1818dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
1828dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberprivate:
1838dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    sp<ABuffer> mBuffer;
1849ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    uint8_t mSkipBytes;
1859ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    static uint32_t CRC_TABLE[];
1868dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
1878dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    DISALLOW_EVIL_CONSTRUCTORS(PSISection);
1888dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber};
1898dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
190cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber////////////////////////////////////////////////////////////////////////////////
191cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
192386d609dc513e838c7e7c4c46c604493ccd560beAndreas HuberATSParser::Program::Program(
193386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        ATSParser *parser, unsigned programNumber, unsigned programMapPID)
194f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    : mParser(parser),
195386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber      mProgramNumber(programNumber),
196f933441648ef6a71dee783d733aac17b9508b452Andreas Huber      mProgramMapPID(programMapPID),
197bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber      mFirstPTSValid(false),
198799c9682b3776a55d234396aee4a302437150c26Chong Zhang      mFirstPTS(0),
1999bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang      mLastRecoveredPTS(-1ll) {
2003856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("new program number %u", programNumber);
201cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
202cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
2038dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberbool ATSParser::Program::parsePSISection(
2048dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        unsigned pid, ABitReader *br, status_t *err) {
20506528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber    *err = OK;
20606528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber
2078dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    if (pid != mProgramMapPID) {
2088dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        return false;
2098dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    }
210cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
2118dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    *err = parseProgramMap(br);
21206528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber
2138dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    return true;
2148dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber}
2158dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
2168dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberbool ATSParser::Program::parsePID(
21787f2a558dd12043631e12c361abef301bf603140Andreas Huber        unsigned pid, unsigned continuity_counter,
21887f2a558dd12043631e12c361abef301bf603140Andreas Huber        unsigned payload_unit_start_indicator,
2198dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        ABitReader *br, status_t *err) {
2208dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    *err = OK;
221cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
222cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    ssize_t index = mStreams.indexOfKey(pid);
223cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    if (index < 0) {
224cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        return false;
225cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
226cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
2275403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber    *err = mStreams.editValueAt(index)->parse(
22887f2a558dd12043631e12c361abef301bf603140Andreas Huber            continuity_counter, payload_unit_start_indicator, br);
229cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
230cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    return true;
231cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
232cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
23332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Hubervoid ATSParser::Program::signalDiscontinuity(
23432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        DiscontinuityType type, const sp<AMessage> &extra) {
235b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber    int64_t mediaTimeUs;
236b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber    if ((type & DISCONTINUITY_TIME)
237b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber            && extra != NULL
238b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber            && extra->findInt64(
239b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber                IStreamListener::kKeyMediaTimeUs, &mediaTimeUs)) {
240b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber        mFirstPTSValid = false;
241b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber    }
242b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber
2432a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    for (size_t i = 0; i < mStreams.size(); ++i) {
24432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        mStreams.editValueAt(i)->signalDiscontinuity(type, extra);
245f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
246f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
247f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
248f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ATSParser::Program::signalEOS(status_t finalResult) {
249f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    for (size_t i = 0; i < mStreams.size(); ++i) {
250f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        mStreams.editValueAt(i)->signalEOS(finalResult);
2512a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    }
2522a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber}
2532a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber
2549bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhangbool ATSParser::Program::switchPIDs(const Vector<StreamInfo> &infos) {
2559bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang    bool success = false;
2569bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang
2579bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang    if (mStreams.size() == infos.size()) {
2589bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        // build type->PIDs map for old and new mapping
2599bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        size_t i;
2609bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        KeyedVector<int32_t, Vector<int32_t> > oldType2PIDs, newType2PIDs;
2619bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        for (i = 0; i < mStreams.size(); ++i) {
2629bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            ssize_t index = oldType2PIDs.indexOfKey(mStreams[i]->type());
2639bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            if (index < 0) {
2649bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                oldType2PIDs.add(mStreams[i]->type(), Vector<int32_t>());
2659bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            }
2669bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            oldType2PIDs.editValueFor(mStreams[i]->type()).push_back(mStreams[i]->pid());
2679bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        }
2689bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        for (i = 0; i < infos.size(); ++i) {
2699bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            ssize_t index = newType2PIDs.indexOfKey(infos[i].mType);
2709bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            if (index < 0) {
2719bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                newType2PIDs.add(infos[i].mType, Vector<int32_t>());
2729bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            }
2739bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            newType2PIDs.editValueFor(infos[i].mType).push_back(infos[i].mPID);
2749bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        }
2759bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang
2769bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        // we can recover if the number of streams for each type hasn't changed
2779bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        if (oldType2PIDs.size() == newType2PIDs.size()) {
2789bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            success = true;
2799bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            for (i = 0; i < oldType2PIDs.size(); ++i) {
2809bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                // KeyedVector is sorted, we just compare key and size of each index
2819bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                if (oldType2PIDs.keyAt(i) != newType2PIDs.keyAt(i)
2829bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                        || oldType2PIDs[i].size() != newType2PIDs[i].size()) {
2839bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                     success = false;
2849bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                     break;
2859bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                }
2869bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            }
2879bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        }
2889bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang
2899bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        if (success) {
2909bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            // save current streams to temp
2919bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            KeyedVector<int32_t, sp<Stream> > temp;
2929bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            for (i = 0; i < mStreams.size(); ++i) {
2939bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                 temp.add(mStreams.keyAt(i), mStreams.editValueAt(i));
2949bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            }
2959bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang
2969bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            mStreams.clear();
2979bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            for (i = 0; i < temp.size(); ++i) {
2989bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                // The two checks below shouldn't happen,
2999bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                // we already checked above the stream count matches
3009bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                ssize_t index = newType2PIDs.indexOfKey(temp[i]->type());
3019bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                CHECK(index >= 0);
3029bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                Vector<int32_t> &newPIDs = newType2PIDs.editValueAt(index);
3039bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                CHECK(newPIDs.size() > 0);
3049bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang
3059bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                // get the next PID for temp[i]->type() in the new PID map
3069bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                Vector<int32_t>::iterator it = newPIDs.begin();
3079bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang
3089bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                // change the PID of the stream, and add it back
3099bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                temp.editValueAt(i)->setPID(*it);
3109bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                mStreams.add(temp[i]->pid(), temp.editValueAt(i));
3119bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang
3129bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                // removed the used PID
3139bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                newPIDs.erase(it);
3149bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            }
3159bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        }
3169bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang    }
3179bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang    return success;
3189bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang}
319bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber
32006528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huberstatus_t ATSParser::Program::parseProgramMap(ABitReader *br) {
321cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned table_id = br->getBits(8);
3223856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("  table_id = %u", table_id);
3236456ae745e919085c5024f784aaa2703f9695f98David Yeh    if (table_id != 0x02u) {
3246456ae745e919085c5024f784aaa2703f9695f98David Yeh        ALOGE("PMT data error!");
3256456ae745e919085c5024f784aaa2703f9695f98David Yeh        return ERROR_MALFORMED;
3266456ae745e919085c5024f784aaa2703f9695f98David Yeh    }
3276e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    unsigned section_syntax_indicator = br->getBits(1);
3283856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("  section_syntax_indicator = %u", section_syntax_indicator);
3296456ae745e919085c5024f784aaa2703f9695f98David Yeh    if (section_syntax_indicator != 1u) {
3306456ae745e919085c5024f784aaa2703f9695f98David Yeh        ALOGE("PMT data error!");
3316456ae745e919085c5024f784aaa2703f9695f98David Yeh        return ERROR_MALFORMED;
3326456ae745e919085c5024f784aaa2703f9695f98David Yeh    }
333cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
334cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    CHECK_EQ(br->getBits(1), 0u);
3356e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  reserved = %u", br->getBits(2));
336cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
337cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned section_length = br->getBits(12);
3383856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("  section_length = %u", section_length);
339f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK_EQ(section_length & 0xc00, 0u);
340cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    CHECK_LE(section_length, 1021u);
341cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
3426e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  program_number = %u", br->getBits(16));
3436e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  reserved = %u", br->getBits(2));
3446e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  version_number = %u", br->getBits(5));
3456e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  current_next_indicator = %u", br->getBits(1));
3466e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  section_number = %u", br->getBits(8));
3476e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  last_section_number = %u", br->getBits(8));
3486e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  reserved = %u", br->getBits(3));
34987f2a558dd12043631e12c361abef301bf603140Andreas Huber
35087f2a558dd12043631e12c361abef301bf603140Andreas Huber    unsigned PCR_PID = br->getBits(13);
35187f2a558dd12043631e12c361abef301bf603140Andreas Huber    ALOGV("  PCR_PID = 0x%04x", PCR_PID);
35287f2a558dd12043631e12c361abef301bf603140Andreas Huber
3536e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  reserved = %u", br->getBits(4));
354cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
355cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned program_info_length = br->getBits(12);
3563856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("  program_info_length = %u", program_info_length);
357f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK_EQ(program_info_length & 0xc00, 0u);
358cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
359cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    br->skipBits(program_info_length * 8);  // skip descriptors
360cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
361bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber    Vector<StreamInfo> infos;
362bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber
363cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    // infoBytesRemaining is the number of bytes that make up the
364cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    // variable length section of ES_infos. It does not include the
365cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    // final CRC.
366cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    size_t infoBytesRemaining = section_length - 9 - program_info_length - 4;
367cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
368cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    while (infoBytesRemaining > 0) {
369cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        CHECK_GE(infoBytesRemaining, 5u);
370cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
371cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned streamType = br->getBits(8);
3723856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("    stream_type = 0x%02x", streamType);
373cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
3746e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber        MY_LOGV("    reserved = %u", br->getBits(3));
375cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
376cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned elementaryPID = br->getBits(13);
3773856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("    elementary_PID = 0x%04x", elementaryPID);
378cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
3796e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber        MY_LOGV("    reserved = %u", br->getBits(4));
380cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
381cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned ES_info_length = br->getBits(12);
3823856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("    ES_info_length = %u", ES_info_length);
383f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        CHECK_EQ(ES_info_length & 0xc00, 0u);
384cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
385cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        CHECK_GE(infoBytesRemaining - 5, ES_info_length);
386cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
387cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#if 0
388cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        br->skipBits(ES_info_length * 8);  // skip descriptors
389cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#else
390cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned info_bytes_remaining = ES_info_length;
391cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        while (info_bytes_remaining >= 2) {
3926e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber            MY_LOGV("      tag = 0x%02x", br->getBits(8));
393cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
394cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            unsigned descLength = br->getBits(8);
3953856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("      len = %u", descLength);
396cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
397cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            CHECK_GE(info_bytes_remaining, 2 + descLength);
398cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
399cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            br->skipBits(descLength * 8);
400cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
401cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            info_bytes_remaining -= descLength + 2;
402cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        }
403cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        CHECK_EQ(info_bytes_remaining, 0u);
404cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#endif
405cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
406bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        StreamInfo info;
407bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        info.mType = streamType;
408bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        info.mPID = elementaryPID;
409bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        infos.push(info);
410cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
411cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        infoBytesRemaining -= 5 + ES_info_length;
412cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
413cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
414cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    CHECK_EQ(infoBytesRemaining, 0u);
4156e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  CRC = 0x%08x", br->getBits(32));
416bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber
417bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber    bool PIDsChanged = false;
418bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber    for (size_t i = 0; i < infos.size(); ++i) {
419bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        StreamInfo &info = infos.editItemAt(i);
420bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber
421bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        ssize_t index = mStreams.indexOfKey(info.mPID);
422bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber
423bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        if (index >= 0 && mStreams.editValueAt(index)->type() != info.mType) {
424df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block            ALOGI("uh oh. stream PIDs have changed.");
425bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber            PIDsChanged = true;
426bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber            break;
427bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        }
428bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber    }
429bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber
430bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber    if (PIDsChanged) {
43106528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber#if 0
432df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block        ALOGI("before:");
43306528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber        for (size_t i = 0; i < mStreams.size(); ++i) {
43406528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber            sp<Stream> stream = mStreams.editValueAt(i);
43506528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber
436df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block            ALOGI("PID 0x%08x => type 0x%02x", stream->pid(), stream->type());
43706528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber        }
43806528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber
439df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block        ALOGI("after:");
44006528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber        for (size_t i = 0; i < infos.size(); ++i) {
44106528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber            StreamInfo &info = infos.editItemAt(i);
44206528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber
443df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block            ALOGI("PID 0x%08x => type 0x%02x", info.mPID, info.mType);
44406528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber        }
44506528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber#endif
44606528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber
4479bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        // we can recover if number of streams for each type remain the same
4489bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        bool success = switchPIDs(infos);
44906528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber
45006528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber        if (!success) {
451df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block            ALOGI("Stream PIDs changed and we cannot recover.");
45206528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber            return ERROR_MALFORMED;
45306528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber        }
454bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber    }
455bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber
456bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber    for (size_t i = 0; i < infos.size(); ++i) {
457bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        StreamInfo &info = infos.editItemAt(i);
458bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber
459bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        ssize_t index = mStreams.indexOfKey(info.mPID);
460bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber
461bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        if (index < 0) {
46287f2a558dd12043631e12c361abef301bf603140Andreas Huber            sp<Stream> stream = new Stream(
46387f2a558dd12043631e12c361abef301bf603140Andreas Huber                    this, info.mPID, info.mType, PCR_PID);
46487f2a558dd12043631e12c361abef301bf603140Andreas Huber
465bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber            mStreams.add(info.mPID, stream);
466bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        }
467bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber    }
46806528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber
46906528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber    return OK;
470cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
471cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
472799c9682b3776a55d234396aee4a302437150c26Chong Zhangint64_t ATSParser::Program::recoverPTS(uint64_t PTS_33bit) {
473799c9682b3776a55d234396aee4a302437150c26Chong Zhang    // We only have the lower 33-bit of the PTS. It could overflow within a
474799c9682b3776a55d234396aee4a302437150c26Chong Zhang    // reasonable amount of time. To handle the wrap-around, use fancy math
475799c9682b3776a55d234396aee4a302437150c26Chong Zhang    // to get an extended PTS that is within [-0xffffffff, 0xffffffff]
476799c9682b3776a55d234396aee4a302437150c26Chong Zhang    // of the latest recovered PTS.
4779bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang    if (mLastRecoveredPTS < 0ll) {
4789bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        // Use the original 33bit number for 1st frame, the reason is that
4799bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        // if 1st frame wraps to negative that's far away from 0, we could
4809bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        // never start. Only start wrapping around from 2nd frame.
4819bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        mLastRecoveredPTS = static_cast<int64_t>(PTS_33bit);
4829bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang    } else {
4839bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        mLastRecoveredPTS = static_cast<int64_t>(
4849bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                ((mLastRecoveredPTS - PTS_33bit + 0x100000000ll)
4859bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                & 0xfffffffe00000000ull) | PTS_33bit);
4869bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        // We start from 0, but recovered PTS could be slightly below 0.
4879bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        // Clamp it to 0 as rest of the pipeline doesn't take negative pts.
4889bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        // (eg. video is read first and starts at 0, but audio starts at 0xfffffff0)
4899bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        if (mLastRecoveredPTS < 0ll) {
4905c9054bc6efc080b265e028f2ebb1abd2a2e3953Chih-Hung Hsieh            ALOGI("Clamping negative recovered PTS (%" PRId64 ") to 0", mLastRecoveredPTS);
4919bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            mLastRecoveredPTS = 0ll;
4929bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        }
4939bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang    }
4949bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang
4959bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang    return mLastRecoveredPTS;
496799c9682b3776a55d234396aee4a302437150c26Chong Zhang}
497799c9682b3776a55d234396aee4a302437150c26Chong Zhang
498cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubersp<MediaSource> ATSParser::Program::getSource(SourceType type) {
499386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    size_t index = (type == AUDIO) ? 0 : 0;
500decd96988e495133e4a1728f612d4c9fdb4d218eAndreas Huber
501cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    for (size_t i = 0; i < mStreams.size(); ++i) {
502cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        sp<MediaSource> source = mStreams.editValueAt(i)->getSource(type);
503cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        if (source != NULL) {
504decd96988e495133e4a1728f612d4c9fdb4d218eAndreas Huber            if (index == 0) {
505decd96988e495133e4a1728f612d4c9fdb4d218eAndreas Huber                return source;
506decd96988e495133e4a1728f612d4c9fdb4d218eAndreas Huber            }
507decd96988e495133e4a1728f612d4c9fdb4d218eAndreas Huber            --index;
508cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        }
509cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
510cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
511cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    return NULL;
512cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
513cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
514bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shihbool ATSParser::Program::hasSource(SourceType type) const {
515bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih    for (size_t i = 0; i < mStreams.size(); ++i) {
516bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih        const sp<Stream> &stream = mStreams.valueAt(i);
517bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih        if (type == AUDIO && stream->isAudio()) {
518bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih            return true;
519bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih        } else if (type == VIDEO && stream->isVideo()) {
520bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih            return true;
521bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih        }
522bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih    }
523bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih
524bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih    return false;
525bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih}
526bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih
527bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huberint64_t ATSParser::Program::convertPTSToTimestamp(uint64_t PTS) {
528799c9682b3776a55d234396aee4a302437150c26Chong Zhang    PTS = recoverPTS(PTS);
529799c9682b3776a55d234396aee4a302437150c26Chong Zhang
530c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber    if (!(mParser->mFlags & TS_TIMESTAMPS_ARE_ABSOLUTE)) {
531c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber        if (!mFirstPTSValid) {
532c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber            mFirstPTSValid = true;
533c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber            mFirstPTS = PTS;
534c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber            PTS = 0;
535c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber        } else if (PTS < mFirstPTS) {
536c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber            PTS = 0;
537c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber        } else {
538c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber            PTS -= mFirstPTS;
539c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber        }
540bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    }
541bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber
54287f2a558dd12043631e12c361abef301bf603140Andreas Huber    int64_t timeUs = (PTS * 100) / 9;
54387f2a558dd12043631e12c361abef301bf603140Andreas Huber
54487f2a558dd12043631e12c361abef301bf603140Andreas Huber    if (mParser->mAbsoluteTimeAnchorUs >= 0ll) {
54587f2a558dd12043631e12c361abef301bf603140Andreas Huber        timeUs += mParser->mAbsoluteTimeAnchorUs;
54687f2a558dd12043631e12c361abef301bf603140Andreas Huber    }
54787f2a558dd12043631e12c361abef301bf603140Andreas Huber
548d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber    if (mParser->mTimeOffsetValid) {
549d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber        timeUs += mParser->mTimeOffsetUs;
550d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber    }
551d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber
55287f2a558dd12043631e12c361abef301bf603140Andreas Huber    return timeUs;
553bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber}
554bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber
555cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber////////////////////////////////////////////////////////////////////////////////
556cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
557bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas HuberATSParser::Stream::Stream(
55887f2a558dd12043631e12c361abef301bf603140Andreas Huber        Program *program,
55987f2a558dd12043631e12c361abef301bf603140Andreas Huber        unsigned elementaryPID,
56087f2a558dd12043631e12c361abef301bf603140Andreas Huber        unsigned streamType,
56187f2a558dd12043631e12c361abef301bf603140Andreas Huber        unsigned PCR_PID)
562bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    : mProgram(program),
563bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber      mElementaryPID(elementaryPID),
564cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber      mStreamType(streamType),
56587f2a558dd12043631e12c361abef301bf603140Andreas Huber      mPCR_PID(PCR_PID),
56687f2a558dd12043631e12c361abef301bf603140Andreas Huber      mExpectedContinuityCounter(-1),
5676a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber      mPayloadStarted(false),
56890a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber      mPrevPTS(0),
569386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber      mQueue(NULL) {
570386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    switch (mStreamType) {
571386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        case STREAMTYPE_H264:
57287f2a558dd12043631e12c361abef301bf603140Andreas Huber            mQueue = new ElementaryStreamQueue(
57387f2a558dd12043631e12c361abef301bf603140Andreas Huber                    ElementaryStreamQueue::H264,
57487f2a558dd12043631e12c361abef301bf603140Andreas Huber                    (mProgram->parserFlags() & ALIGNED_VIDEO_DATA)
57587f2a558dd12043631e12c361abef301bf603140Andreas Huber                        ? ElementaryStreamQueue::kFlag_AlignedData : 0);
576386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            break;
5776e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        case STREAMTYPE_MPEG2_AUDIO_ADTS:
578386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            mQueue = new ElementaryStreamQueue(ElementaryStreamQueue::AAC);
579386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            break;
580386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        case STREAMTYPE_MPEG1_AUDIO:
581386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        case STREAMTYPE_MPEG2_AUDIO:
582386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            mQueue = new ElementaryStreamQueue(
583386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                    ElementaryStreamQueue::MPEG_AUDIO);
584386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            break;
585386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
586386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        case STREAMTYPE_MPEG1_VIDEO:
587386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        case STREAMTYPE_MPEG2_VIDEO:
588386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            mQueue = new ElementaryStreamQueue(
589386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                    ElementaryStreamQueue::MPEG_VIDEO);
590386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            break;
591386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
592386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        case STREAMTYPE_MPEG4_VIDEO:
593386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            mQueue = new ElementaryStreamQueue(
594386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                    ElementaryStreamQueue::MPEG4_VIDEO);
595386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            break;
596386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
5979bf32f06e8971c1d3eb4fc5edd74b69557f97212Chong Zhang        case STREAMTYPE_LPCM_AC3:
598d3c079ae9859011d118f94616d0069c2987013edChangwan Ryu        case STREAMTYPE_AC3:
599d3c079ae9859011d118f94616d0069c2987013edChangwan Ryu            mQueue = new ElementaryStreamQueue(
600d3c079ae9859011d118f94616d0069c2987013edChangwan Ryu                    ElementaryStreamQueue::AC3);
601d3c079ae9859011d118f94616d0069c2987013edChangwan Ryu            break;
602d3c079ae9859011d118f94616d0069c2987013edChangwan Ryu
603386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        default:
604386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            break;
605386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    }
606386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
6073856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("new stream PID 0x%02x, type 0x%02x", elementaryPID, streamType);
60818ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber
60918ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber    if (mQueue != NULL) {
61018ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber        mBuffer = new ABuffer(192 * 1024);
61118ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber        mBuffer->setRange(0, 0);
61218ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber    }
613cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
614cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
615cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas HuberATSParser::Stream::~Stream() {
616386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    delete mQueue;
617386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    mQueue = NULL;
618cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
619cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
6205403129e2a2f44620f2ac8109889e5a61be08732Andreas Huberstatus_t ATSParser::Stream::parse(
62187f2a558dd12043631e12c361abef301bf603140Andreas Huber        unsigned continuity_counter,
622cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned payload_unit_start_indicator, ABitReader *br) {
62318ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber    if (mQueue == NULL) {
6245403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber        return OK;
62518ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber    }
62618ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber
62787f2a558dd12043631e12c361abef301bf603140Andreas Huber    if (mExpectedContinuityCounter >= 0
62887f2a558dd12043631e12c361abef301bf603140Andreas Huber            && (unsigned)mExpectedContinuityCounter != continuity_counter) {
62987f2a558dd12043631e12c361abef301bf603140Andreas Huber        ALOGI("discontinuity on stream pid 0x%04x", mElementaryPID);
63087f2a558dd12043631e12c361abef301bf603140Andreas Huber
63187f2a558dd12043631e12c361abef301bf603140Andreas Huber        mPayloadStarted = false;
63287f2a558dd12043631e12c361abef301bf603140Andreas Huber        mBuffer->setRange(0, 0);
63387f2a558dd12043631e12c361abef301bf603140Andreas Huber        mExpectedContinuityCounter = -1;
63487f2a558dd12043631e12c361abef301bf603140Andreas Huber
63594a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber#if 0
63694a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber        // Uncomment this if you'd rather see no corruption whatsoever on
63794a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber        // screen and suspend updates until we come across another IDR frame.
63894a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber
63994a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber        if (mStreamType == STREAMTYPE_H264) {
64094a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber            ALOGI("clearing video queue");
64194a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber            mQueue->clear(true /* clearFormat */);
64294a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber        }
64394a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber#endif
64494a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber
64566830855846db5c211c2da6c055ca9b4167e8974Chong Zhang        if (!payload_unit_start_indicator) {
64666830855846db5c211c2da6c055ca9b4167e8974Chong Zhang            return OK;
64766830855846db5c211c2da6c055ca9b4167e8974Chong Zhang        }
64887f2a558dd12043631e12c361abef301bf603140Andreas Huber    }
64987f2a558dd12043631e12c361abef301bf603140Andreas Huber
65087f2a558dd12043631e12c361abef301bf603140Andreas Huber    mExpectedContinuityCounter = (continuity_counter + 1) & 0x0f;
65187f2a558dd12043631e12c361abef301bf603140Andreas Huber
652cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    if (payload_unit_start_indicator) {
653cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        if (mPayloadStarted) {
654cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            // Otherwise we run the danger of receiving the trailing bytes
655cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            // of a PES packet that we never saw the start of and assuming
656cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            // we have a a complete PES packet.
657cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
6585403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber            status_t err = flush();
6595403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber
6605403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber            if (err != OK) {
6615403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber                return err;
6625403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber            }
663cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        }
664cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
665cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        mPayloadStarted = true;
666cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
667cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
668cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    if (!mPayloadStarted) {
6695403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber        return OK;
670cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
671cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
672cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    size_t payloadSizeBits = br->numBitsLeft();
673f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK_EQ(payloadSizeBits % 8, 0u);
674cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
6753e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber    size_t neededSize = mBuffer->size() + payloadSizeBits / 8;
6763e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber    if (mBuffer->capacity() < neededSize) {
6773e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber        // Increment in multiples of 64K.
6783e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber        neededSize = (neededSize + 65535) & ~65535;
6793e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber
680b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross        ALOGI("resizing buffer to %zu bytes", neededSize);
6813e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber
6823e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber        sp<ABuffer> newBuffer = new ABuffer(neededSize);
6833e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber        memcpy(newBuffer->data(), mBuffer->data(), mBuffer->size());
6843e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber        newBuffer->setRange(0, mBuffer->size());
6853e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber        mBuffer = newBuffer;
6863e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber    }
687cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
688cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    memcpy(mBuffer->data() + mBuffer->size(), br->data(), payloadSizeBits / 8);
689cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    mBuffer->setRange(0, mBuffer->size() + payloadSizeBits / 8);
6905403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber
6915403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber    return OK;
692cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
693cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
6946e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huberbool ATSParser::Stream::isVideo() const {
6956e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    switch (mStreamType) {
6966e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        case STREAMTYPE_H264:
6976e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        case STREAMTYPE_MPEG1_VIDEO:
6986e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        case STREAMTYPE_MPEG2_VIDEO:
6996e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        case STREAMTYPE_MPEG4_VIDEO:
7006e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber            return true;
7016e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
7026e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        default:
7036e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber            return false;
7046e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    }
7056e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber}
7066e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
7076e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huberbool ATSParser::Stream::isAudio() const {
7086e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    switch (mStreamType) {
7096e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        case STREAMTYPE_MPEG1_AUDIO:
7106e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        case STREAMTYPE_MPEG2_AUDIO:
7116e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        case STREAMTYPE_MPEG2_AUDIO_ADTS:
7129bf32f06e8971c1d3eb4fc5edd74b69557f97212Chong Zhang        case STREAMTYPE_LPCM_AC3:
713d3c079ae9859011d118f94616d0069c2987013edChangwan Ryu        case STREAMTYPE_AC3:
7146e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber            return true;
7156e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
7166e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        default:
7176e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber            return false;
7186e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    }
7196e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber}
7206e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
72132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Hubervoid ATSParser::Stream::signalDiscontinuity(
72232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        DiscontinuityType type, const sp<AMessage> &extra) {
7230389cc09f7b90f155a8942a0d2e1925cad1dbe2dMarco Nelissen    mExpectedContinuityCounter = -1;
7240389cc09f7b90f155a8942a0d2e1925cad1dbe2dMarco Nelissen
72518ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber    if (mQueue == NULL) {
72618ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber        return;
72718ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber    }
72818ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber
7292a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    mPayloadStarted = false;
7302a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    mBuffer->setRange(0, 0);
7312a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber
7326e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    bool clearFormat = false;
7336e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    if (isAudio()) {
7346e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        if (type & DISCONTINUITY_AUDIO_FORMAT) {
7356e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber            clearFormat = true;
7366e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        }
7376e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    } else {
7386e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        if (type & DISCONTINUITY_VIDEO_FORMAT) {
7396e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber            clearFormat = true;
7406e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        }
7416e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    }
742f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
7436e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    mQueue->clear(clearFormat);
74432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
7456e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    if (type & DISCONTINUITY_TIME) {
7466e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        uint64_t resumeAtPTS;
7476e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        if (extra != NULL
7486e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                && extra->findInt64(
7496e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    IStreamListener::kKeyResumeAtPTS,
7506e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    (int64_t *)&resumeAtPTS)) {
7516e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber            int64_t resumeAtMediaTimeUs =
7526e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                mProgram->convertPTSToTimestamp(resumeAtPTS);
75332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
754c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia            extra->setInt64("resume-at-mediaTimeUs", resumeAtMediaTimeUs);
755e332a9181cf6a3155ed1a0fd2afc212ccb1f2753Andreas Huber        }
7566e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    }
757f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
7586e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    if (mSource != NULL) {
759632740c58119a132ce19f6d498e39c5c3773971aChong Zhang        mSource->queueDiscontinuity(type, extra, true);
760bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    }
761f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
762bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber
763f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ATSParser::Stream::signalEOS(status_t finalResult) {
764f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (mSource != NULL) {
765f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        mSource->signalEOS(finalResult);
7662a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    }
7672a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber}
7682a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber
7695403129e2a2f44620f2ac8109889e5a61be08732Andreas Huberstatus_t ATSParser::Stream::parsePES(ABitReader *br) {
770cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned packet_startcode_prefix = br->getBits(24);
771cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
7723856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("packet_startcode_prefix = 0x%08x", packet_startcode_prefix);
773cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
774386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    if (packet_startcode_prefix != 1) {
7753856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("Supposedly payload_unit_start=1 unit does not start "
776386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber             "with startcode.");
7775403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber
7785403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber        return ERROR_MALFORMED;
779386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    }
780386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
781cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    CHECK_EQ(packet_startcode_prefix, 0x000001u);
782cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
783cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned stream_id = br->getBits(8);
7843856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("stream_id = 0x%02x", stream_id);
785cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
786cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned PES_packet_length = br->getBits(16);
7873856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("PES_packet_length = %u", PES_packet_length);
788cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
789cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    if (stream_id != 0xbc  // program_stream_map
790cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            && stream_id != 0xbe  // padding_stream
791cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            && stream_id != 0xbf  // private_stream_2
792cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            && stream_id != 0xf0  // ECM
793cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            && stream_id != 0xf1  // EMM
794cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            && stream_id != 0xff  // program_stream_directory
795cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            && stream_id != 0xf2  // DSMCC
796cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            && stream_id != 0xf8) {  // H.222.1 type E
797cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        CHECK_EQ(br->getBits(2), 2u);
798cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
7996e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber        MY_LOGV("PES_scrambling_control = %u", br->getBits(2));
8006e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber        MY_LOGV("PES_priority = %u", br->getBits(1));
8016e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber        MY_LOGV("data_alignment_indicator = %u", br->getBits(1));
8026e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber        MY_LOGV("copyright = %u", br->getBits(1));
8036e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber        MY_LOGV("original_or_copy = %u", br->getBits(1));
804cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
805cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned PTS_DTS_flags = br->getBits(2);
8063856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("PTS_DTS_flags = %u", PTS_DTS_flags);
807cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
808cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned ESCR_flag = br->getBits(1);
8093856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("ESCR_flag = %u", ESCR_flag);
810cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
811cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned ES_rate_flag = br->getBits(1);
8123856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("ES_rate_flag = %u", ES_rate_flag);
813cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
814cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned DSM_trick_mode_flag = br->getBits(1);
8153856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("DSM_trick_mode_flag = %u", DSM_trick_mode_flag);
816cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
817cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned additional_copy_info_flag = br->getBits(1);
8183856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("additional_copy_info_flag = %u", additional_copy_info_flag);
819cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
8206e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber        MY_LOGV("PES_CRC_flag = %u", br->getBits(1));
8216e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber        MY_LOGV("PES_extension_flag = %u", br->getBits(1));
822cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
823cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned PES_header_data_length = br->getBits(8);
8243856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("PES_header_data_length = %u", PES_header_data_length);
825cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
826cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned optional_bytes_remaining = PES_header_data_length;
827cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
828cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        uint64_t PTS = 0, DTS = 0;
829cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
830cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        if (PTS_DTS_flags == 2 || PTS_DTS_flags == 3) {
831cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            CHECK_GE(optional_bytes_remaining, 5u);
832cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
8336456ae745e919085c5024f784aaa2703f9695f98David Yeh            if (br->getBits(4) != PTS_DTS_flags) {
8346456ae745e919085c5024f784aaa2703f9695f98David Yeh                ALOGE("PES data Error!");
8356456ae745e919085c5024f784aaa2703f9695f98David Yeh                return ERROR_MALFORMED;
8366456ae745e919085c5024f784aaa2703f9695f98David Yeh            }
837cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            PTS = ((uint64_t)br->getBits(3)) << 30;
838cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            CHECK_EQ(br->getBits(1), 1u);
839cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            PTS |= ((uint64_t)br->getBits(15)) << 15;
840cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            CHECK_EQ(br->getBits(1), 1u);
841cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            PTS |= br->getBits(15);
842cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            CHECK_EQ(br->getBits(1), 1u);
843cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
844b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross            ALOGV("PTS = 0x%016" PRIx64 " (%.2f)", PTS, PTS / 90000.0);
845cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
846cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            optional_bytes_remaining -= 5;
847cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
848cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            if (PTS_DTS_flags == 3) {
849cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber                CHECK_GE(optional_bytes_remaining, 5u);
850cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
851cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber                CHECK_EQ(br->getBits(4), 1u);
852cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
853cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber                DTS = ((uint64_t)br->getBits(3)) << 30;
854cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber                CHECK_EQ(br->getBits(1), 1u);
855cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber                DTS |= ((uint64_t)br->getBits(15)) << 15;
856cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber                CHECK_EQ(br->getBits(1), 1u);
857cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber                DTS |= br->getBits(15);
858cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber                CHECK_EQ(br->getBits(1), 1u);
859cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
860b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross                ALOGV("DTS = %" PRIu64, DTS);
861cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
862cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber                optional_bytes_remaining -= 5;
863cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            }
864cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        }
865cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
866cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        if (ESCR_flag) {
867cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            CHECK_GE(optional_bytes_remaining, 6u);
868cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
869cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            br->getBits(2);
870cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
871cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            uint64_t ESCR = ((uint64_t)br->getBits(3)) << 30;
872cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            CHECK_EQ(br->getBits(1), 1u);
873cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            ESCR |= ((uint64_t)br->getBits(15)) << 15;
874cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            CHECK_EQ(br->getBits(1), 1u);
875cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            ESCR |= br->getBits(15);
876cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            CHECK_EQ(br->getBits(1), 1u);
877cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
878b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross            ALOGV("ESCR = %" PRIu64, ESCR);
8796e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber            MY_LOGV("ESCR_extension = %u", br->getBits(9));
880cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
881cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            CHECK_EQ(br->getBits(1), 1u);
882cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
883cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            optional_bytes_remaining -= 6;
884cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        }
885cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
886cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        if (ES_rate_flag) {
887cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            CHECK_GE(optional_bytes_remaining, 3u);
888cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
889cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            CHECK_EQ(br->getBits(1), 1u);
8906e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber            MY_LOGV("ES_rate = %u", br->getBits(22));
891cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            CHECK_EQ(br->getBits(1), 1u);
892cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
893cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            optional_bytes_remaining -= 3;
894cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        }
895cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
896cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        br->skipBits(optional_bytes_remaining * 8);
897cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
898cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        // ES data follows.
899cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
900cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        if (PES_packet_length != 0) {
901cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            CHECK_GE(PES_packet_length, PES_header_data_length + 3);
902cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
903cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            unsigned dataLength =
904cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber                PES_packet_length - 3 - PES_header_data_length;
905cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
9065403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber            if (br->numBitsLeft() < dataLength * 8) {
90729357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block                ALOGE("PES packet does not carry enough data to contain "
908b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross                     "payload. (numBitsLeft = %zu, required = %u)",
9095403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber                     br->numBitsLeft(), dataLength * 8);
9105403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber
9115403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber                return ERROR_MALFORMED;
9125403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber            }
9135403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber
9140da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber            CHECK_GE(br->numBitsLeft(), dataLength * 8);
9150da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber
9160da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber            onPayloadData(
9170da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber                    PTS_DTS_flags, PTS, DTS, br->data(), dataLength);
918cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
919cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            br->skipBits(dataLength * 8);
920cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        } else {
9210da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber            onPayloadData(
9220da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber                    PTS_DTS_flags, PTS, DTS,
9230da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber                    br->data(), br->numBitsLeft() / 8);
9240da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber
925cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            size_t payloadSizeBits = br->numBitsLeft();
926f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK_EQ(payloadSizeBits % 8, 0u);
927cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
928b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross            ALOGV("There's %zu bytes of payload.", payloadSizeBits / 8);
929cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        }
930cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    } else if (stream_id == 0xbe) {  // padding_stream
931cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        CHECK_NE(PES_packet_length, 0u);
932cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        br->skipBits(PES_packet_length * 8);
933cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    } else {
934cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        CHECK_NE(PES_packet_length, 0u);
935cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        br->skipBits(PES_packet_length * 8);
936cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
9375403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber
9385403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber    return OK;
939cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
940cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
9415403129e2a2f44620f2ac8109889e5a61be08732Andreas Huberstatus_t ATSParser::Stream::flush() {
942cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    if (mBuffer->size() == 0) {
9435403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber        return OK;
944cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
945cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
946b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross    ALOGV("flushing stream 0x%04x size = %zu", mElementaryPID, mBuffer->size());
947cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
948cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    ABitReader br(mBuffer->data(), mBuffer->size());
9495403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber
9505403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber    status_t err = parsePES(&br);
951cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
952cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    mBuffer->setRange(0, 0);
9535403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber
9545403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber    return err;
955cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
956cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
957cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubervoid ATSParser::Stream::onPayloadData(
95884333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber        unsigned PTS_DTS_flags, uint64_t PTS, uint64_t /* DTS */,
959cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        const uint8_t *data, size_t size) {
96090a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber#if 0
96190a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber    ALOGI("payload streamType 0x%02x, PTS = 0x%016llx, dPTS = %lld",
96290a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber          mStreamType,
96390a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber          PTS,
96490a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber          (int64_t)PTS - mPrevPTS);
96590a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber    mPrevPTS = PTS;
96690a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber#endif
96790a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber
9683856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("onPayloadData mStreamType=0x%02x", mStreamType);
969cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
97098a46cf165d8de3779874eba01803bbc485f45b9Andreas Huber    int64_t timeUs = 0ll;  // no presentation timestamp available.
97198a46cf165d8de3779874eba01803bbc485f45b9Andreas Huber    if (PTS_DTS_flags == 2 || PTS_DTS_flags == 3) {
97298a46cf165d8de3779874eba01803bbc485f45b9Andreas Huber        timeUs = mProgram->convertPTSToTimestamp(PTS);
97398a46cf165d8de3779874eba01803bbc485f45b9Andreas Huber    }
97482f7321b03eec1e40af9d681370f754ee0279582Andreas Huber
975386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    status_t err = mQueue->appendData(data, size, timeUs);
976decd96988e495133e4a1728f612d4c9fdb4d218eAndreas Huber
977decd96988e495133e4a1728f612d4c9fdb4d218eAndreas Huber    if (err != OK) {
978decd96988e495133e4a1728f612d4c9fdb4d218eAndreas Huber        return;
979decd96988e495133e4a1728f612d4c9fdb4d218eAndreas Huber    }
98082f7321b03eec1e40af9d681370f754ee0279582Andreas Huber
9816a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber    sp<ABuffer> accessUnit;
982386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    while ((accessUnit = mQueue->dequeueAccessUnit()) != NULL) {
9836a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber        if (mSource == NULL) {
984386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            sp<MetaData> meta = mQueue->getFormat();
98582f7321b03eec1e40af9d681370f754ee0279582Andreas Huber
9866a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber            if (meta != NULL) {
9873856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                ALOGV("Stream PID 0x%08x of type 0x%02x now has data.",
988386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                     mElementaryPID, mStreamType);
989386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
990309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih                const char *mime;
991309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih                if (meta->findCString(kKeyMIMEType, &mime)
992309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih                        && !strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_AVC)
993309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih                        && !IsIDR(accessUnit)) {
994309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih                    continue;
995309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih                }
9966a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber                mSource = new AnotherPacketSource(meta);
9976a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber                mSource->queueAccessUnit(accessUnit);
99882f7321b03eec1e40af9d681370f754ee0279582Andreas Huber            }
999386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        } else if (mQueue->getFormat() != NULL) {
10002a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber            // After a discontinuity we invalidate the queue's format
10012a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber            // and won't enqueue any access units to the source until
10022a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber            // the queue has reestablished the new format.
10035bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
10045bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            if (mSource->getFormat() == NULL) {
1005386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                mSource->setFormat(mQueue->getFormat());
10065bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            }
10076a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber            mSource->queueAccessUnit(accessUnit);
100882f7321b03eec1e40af9d681370f754ee0279582Andreas Huber        }
100982f7321b03eec1e40af9d681370f754ee0279582Andreas Huber    }
101082f7321b03eec1e40af9d681370f754ee0279582Andreas Huber}
101182f7321b03eec1e40af9d681370f754ee0279582Andreas Huber
1012cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubersp<MediaSource> ATSParser::Stream::getSource(SourceType type) {
1013386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    switch (type) {
1014386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        case VIDEO:
1015386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        {
10166e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber            if (isVideo()) {
1017386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                return mSource;
1018386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            }
1019386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            break;
1020386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        }
1021386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
1022386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        case AUDIO:
1023386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        {
10246e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber            if (isAudio()) {
1025386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                return mSource;
1026386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            }
1027386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            break;
1028386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        }
1029386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
1030386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        default:
1031386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            break;
1032cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
1033cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1034cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    return NULL;
1035cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
1036cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1037cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber////////////////////////////////////////////////////////////////////////////////
1038cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1039c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas HuberATSParser::ATSParser(uint32_t flags)
104087f2a558dd12043631e12c361abef301bf603140Andreas Huber    : mFlags(flags),
104187f2a558dd12043631e12c361abef301bf603140Andreas Huber      mAbsoluteTimeAnchorUs(-1ll),
1042d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber      mTimeOffsetValid(false),
1043d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber      mTimeOffsetUs(0ll),
104487f2a558dd12043631e12c361abef301bf603140Andreas Huber      mNumTSPacketsParsed(0),
104587f2a558dd12043631e12c361abef301bf603140Andreas Huber      mNumPCRs(0) {
10468dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    mPSISections.add(0 /* PID */, new PSISection);
1047cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
1048cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1049cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas HuberATSParser::~ATSParser() {
1050cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
1051cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
105206528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huberstatus_t ATSParser::feedTSPacket(const void *data, size_t size) {
1053cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    CHECK_EQ(size, kTSPacketSize);
1054cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1055cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    ABitReader br((const uint8_t *)data, kTSPacketSize);
105606528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber    return parseTS(&br);
1057cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
1058cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
105932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Hubervoid ATSParser::signalDiscontinuity(
106032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        DiscontinuityType type, const sp<AMessage> &extra) {
1061b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber    int64_t mediaTimeUs;
1062b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber    if ((type & DISCONTINUITY_TIME)
1063b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber            && extra != NULL
1064b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber            && extra->findInt64(
1065b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber                IStreamListener::kKeyMediaTimeUs, &mediaTimeUs)) {
1066b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber        mAbsoluteTimeAnchorUs = mediaTimeUs;
1067b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber    } else if (type == DISCONTINUITY_ABSOLUTE_TIME) {
106887f2a558dd12043631e12c361abef301bf603140Andreas Huber        int64_t timeUs;
106987f2a558dd12043631e12c361abef301bf603140Andreas Huber        CHECK(extra->findInt64("timeUs", &timeUs));
107087f2a558dd12043631e12c361abef301bf603140Andreas Huber
107187f2a558dd12043631e12c361abef301bf603140Andreas Huber        CHECK(mPrograms.empty());
107287f2a558dd12043631e12c361abef301bf603140Andreas Huber        mAbsoluteTimeAnchorUs = timeUs;
107387f2a558dd12043631e12c361abef301bf603140Andreas Huber        return;
1074d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber    } else if (type == DISCONTINUITY_TIME_OFFSET) {
1075d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber        int64_t offset;
1076d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber        CHECK(extra->findInt64("offset", &offset));
1077d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber
1078d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber        mTimeOffsetValid = true;
1079d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber        mTimeOffsetUs = offset;
1080d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber        return;
108187f2a558dd12043631e12c361abef301bf603140Andreas Huber    }
108287f2a558dd12043631e12c361abef301bf603140Andreas Huber
1083f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    for (size_t i = 0; i < mPrograms.size(); ++i) {
108432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        mPrograms.editItemAt(i)->signalDiscontinuity(type, extra);
1085f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
1086f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
1087f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1088f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ATSParser::signalEOS(status_t finalResult) {
1089f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK_NE(finalResult, (status_t)OK);
1090f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
10912a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    for (size_t i = 0; i < mPrograms.size(); ++i) {
1092f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        mPrograms.editItemAt(i)->signalEOS(finalResult);
10932a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    }
10942a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber}
10952a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber
1096cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubervoid ATSParser::parseProgramAssociationTable(ABitReader *br) {
1097cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned table_id = br->getBits(8);
10983856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("  table_id = %u", table_id);
10996456ae745e919085c5024f784aaa2703f9695f98David Yeh    if (table_id != 0x00u) {
11006456ae745e919085c5024f784aaa2703f9695f98David Yeh        ALOGE("PAT data error!");
11016456ae745e919085c5024f784aaa2703f9695f98David Yeh        return ;
11026456ae745e919085c5024f784aaa2703f9695f98David Yeh    }
1103cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned section_syntax_indictor = br->getBits(1);
11043856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("  section_syntax_indictor = %u", section_syntax_indictor);
1105cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    CHECK_EQ(section_syntax_indictor, 1u);
1106cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1107cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    CHECK_EQ(br->getBits(1), 0u);
11086e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  reserved = %u", br->getBits(2));
1109cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1110cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned section_length = br->getBits(12);
11113856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("  section_length = %u", section_length);
1112f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK_EQ(section_length & 0xc00, 0u);
1113cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
11146e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  transport_stream_id = %u", br->getBits(16));
11156e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  reserved = %u", br->getBits(2));
11166e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  version_number = %u", br->getBits(5));
11176e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  current_next_indicator = %u", br->getBits(1));
11186e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  section_number = %u", br->getBits(8));
11196e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  last_section_number = %u", br->getBits(8));
1120cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1121cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    size_t numProgramBytes = (section_length - 5 /* header */ - 4 /* crc */);
1122cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    CHECK_EQ((numProgramBytes % 4), 0u);
1123cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1124cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    for (size_t i = 0; i < numProgramBytes / 4; ++i) {
1125cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned program_number = br->getBits(16);
11263856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("    program_number = %u", program_number);
1127cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
11286e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber        MY_LOGV("    reserved = %u", br->getBits(3));
1129cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1130cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        if (program_number == 0) {
11316e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber            MY_LOGV("    network_PID = 0x%04x", br->getBits(13));
1132cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        } else {
1133cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            unsigned programMapPID = br->getBits(13);
1134cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
11353856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("    program_map_PID = 0x%04x", programMapPID);
1136cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1137386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            bool found = false;
1138386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            for (size_t index = 0; index < mPrograms.size(); ++index) {
1139386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                const sp<Program> &program = mPrograms.itemAt(index);
1140386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
1141386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                if (program->number() == program_number) {
1142386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                    program->updateProgramMapPID(programMapPID);
1143386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                    found = true;
1144386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                    break;
1145386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                }
1146386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            }
1147386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
1148386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            if (!found) {
1149386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                mPrograms.push(
1150386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                        new Program(this, program_number, programMapPID));
1151386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            }
11528dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
11538dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            if (mPSISections.indexOfKey(programMapPID) < 0) {
11548dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                mPSISections.add(programMapPID, new PSISection);
11558dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            }
1156cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        }
1157cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
1158cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
11596e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  CRC = 0x%08x", br->getBits(32));
1160cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
1161cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
116206528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huberstatus_t ATSParser::parsePID(
1163cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        ABitReader *br, unsigned PID,
116487f2a558dd12043631e12c361abef301bf603140Andreas Huber        unsigned continuity_counter,
1165cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned payload_unit_start_indicator) {
11668dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    ssize_t sectionIndex = mPSISections.indexOfKey(PID);
11678dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
11688dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    if (sectionIndex >= 0) {
11694b4bb11b8747adeb2efe56c7df4ab6803dd7db41Andreas Huber        sp<PSISection> section = mPSISections.valueAt(sectionIndex);
11708dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
1171cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        if (payload_unit_start_indicator) {
11726456ae745e919085c5024f784aaa2703f9695f98David Yeh            if (!section->isEmpty()) {
11739bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                ALOGW("parsePID encounters payload_unit_start_indicator when section is not empty");
11749bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                section->clear();
11756456ae745e919085c5024f784aaa2703f9695f98David Yeh            }
11768dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
1177cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            unsigned skip = br->getBits(8);
11789ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim            section->setSkipBytes(skip + 1);  // skip filler bytes + pointer field itself
1179cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            br->skipBits(skip * 8);
1180cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        }
11818dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
11828dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        CHECK((br->numBitsLeft() % 8) == 0);
11838dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        status_t err = section->append(br->data(), br->numBitsLeft() / 8);
11848dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
11858dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        if (err != OK) {
11868dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            return err;
11878dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        }
11888dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
11898dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        if (!section->isComplete()) {
11908dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            return OK;
11918dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        }
11928dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
11939ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim        if (!section->isCRCOkay()) {
11949ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim            return BAD_VALUE;
11959ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim        }
11968dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        ABitReader sectionBits(section->data(), section->size());
11978dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
11988dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        if (PID == 0) {
11998dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            parseProgramAssociationTable(&sectionBits);
12008dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        } else {
12018dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            bool handled = false;
12028dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            for (size_t i = 0; i < mPrograms.size(); ++i) {
12038dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                status_t err;
12048dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                if (!mPrograms.editItemAt(i)->parsePSISection(
12058dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                            PID, &sectionBits, &err)) {
12068dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                    continue;
12078dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                }
12088dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
12098dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                if (err != OK) {
12108dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                    return err;
12118dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                }
12128dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
12138dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                handled = true;
12148dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                break;
12158dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            }
12168dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
12178dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            if (!handled) {
12188dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                mPSISections.removeItem(PID);
12194b4bb11b8747adeb2efe56c7df4ab6803dd7db41Andreas Huber                section.clear();
12208dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            }
12218dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        }
12228dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
12234b4bb11b8747adeb2efe56c7df4ab6803dd7db41Andreas Huber        if (section != NULL) {
12244b4bb11b8747adeb2efe56c7df4ab6803dd7db41Andreas Huber            section->clear();
12254b4bb11b8747adeb2efe56c7df4ab6803dd7db41Andreas Huber        }
12268dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
122706528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber        return OK;
1228cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
1229cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1230cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    bool handled = false;
1231cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    for (size_t i = 0; i < mPrograms.size(); ++i) {
123206528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber        status_t err;
1233cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        if (mPrograms.editItemAt(i)->parsePID(
123487f2a558dd12043631e12c361abef301bf603140Andreas Huber                    PID, continuity_counter, payload_unit_start_indicator,
123587f2a558dd12043631e12c361abef301bf603140Andreas Huber                    br, &err)) {
123606528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber            if (err != OK) {
123706528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber                return err;
123806528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber            }
123906528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber
1240cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            handled = true;
1241cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            break;
1242cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        }
1243cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
1244cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1245cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    if (!handled) {
12463856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("PID 0x%04x not handled.", PID);
1247cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
124806528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber
124906528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber    return OK;
1250cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
1251cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
125287f2a558dd12043631e12c361abef301bf603140Andreas Hubervoid ATSParser::parseAdaptationField(ABitReader *br, unsigned PID) {
1253cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned adaptation_field_length = br->getBits(8);
125487f2a558dd12043631e12c361abef301bf603140Andreas Huber
1255cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    if (adaptation_field_length > 0) {
125687f2a558dd12043631e12c361abef301bf603140Andreas Huber        unsigned discontinuity_indicator = br->getBits(1);
125787f2a558dd12043631e12c361abef301bf603140Andreas Huber
125887f2a558dd12043631e12c361abef301bf603140Andreas Huber        if (discontinuity_indicator) {
125987f2a558dd12043631e12c361abef301bf603140Andreas Huber            ALOGV("PID 0x%04x: discontinuity_indicator = 1 (!!!)", PID);
126087f2a558dd12043631e12c361abef301bf603140Andreas Huber        }
126187f2a558dd12043631e12c361abef301bf603140Andreas Huber
126287f2a558dd12043631e12c361abef301bf603140Andreas Huber        br->skipBits(2);
126387f2a558dd12043631e12c361abef301bf603140Andreas Huber        unsigned PCR_flag = br->getBits(1);
126487f2a558dd12043631e12c361abef301bf603140Andreas Huber
126587f2a558dd12043631e12c361abef301bf603140Andreas Huber        size_t numBitsRead = 4;
126687f2a558dd12043631e12c361abef301bf603140Andreas Huber
126787f2a558dd12043631e12c361abef301bf603140Andreas Huber        if (PCR_flag) {
126887f2a558dd12043631e12c361abef301bf603140Andreas Huber            br->skipBits(4);
126987f2a558dd12043631e12c361abef301bf603140Andreas Huber            uint64_t PCR_base = br->getBits(32);
127087f2a558dd12043631e12c361abef301bf603140Andreas Huber            PCR_base = (PCR_base << 1) | br->getBits(1);
127187f2a558dd12043631e12c361abef301bf603140Andreas Huber
127287f2a558dd12043631e12c361abef301bf603140Andreas Huber            br->skipBits(6);
127387f2a558dd12043631e12c361abef301bf603140Andreas Huber            unsigned PCR_ext = br->getBits(9);
127487f2a558dd12043631e12c361abef301bf603140Andreas Huber
127587f2a558dd12043631e12c361abef301bf603140Andreas Huber            // The number of bytes from the start of the current
127687f2a558dd12043631e12c361abef301bf603140Andreas Huber            // MPEG2 transport stream packet up and including
127787f2a558dd12043631e12c361abef301bf603140Andreas Huber            // the final byte of this PCR_ext field.
127887f2a558dd12043631e12c361abef301bf603140Andreas Huber            size_t byteOffsetFromStartOfTSPacket =
127987f2a558dd12043631e12c361abef301bf603140Andreas Huber                (188 - br->numBitsLeft() / 8);
128087f2a558dd12043631e12c361abef301bf603140Andreas Huber
128187f2a558dd12043631e12c361abef301bf603140Andreas Huber            uint64_t PCR = PCR_base * 300 + PCR_ext;
128287f2a558dd12043631e12c361abef301bf603140Andreas Huber
1283b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross            ALOGV("PID 0x%04x: PCR = 0x%016" PRIx64 " (%.2f)",
128487f2a558dd12043631e12c361abef301bf603140Andreas Huber                  PID, PCR, PCR / 27E6);
128587f2a558dd12043631e12c361abef301bf603140Andreas Huber
128687f2a558dd12043631e12c361abef301bf603140Andreas Huber            // The number of bytes received by this parser up to and
128787f2a558dd12043631e12c361abef301bf603140Andreas Huber            // including the final byte of this PCR_ext field.
128887f2a558dd12043631e12c361abef301bf603140Andreas Huber            size_t byteOffsetFromStart =
128987f2a558dd12043631e12c361abef301bf603140Andreas Huber                mNumTSPacketsParsed * 188 + byteOffsetFromStartOfTSPacket;
129087f2a558dd12043631e12c361abef301bf603140Andreas Huber
129187f2a558dd12043631e12c361abef301bf603140Andreas Huber            for (size_t i = 0; i < mPrograms.size(); ++i) {
129287f2a558dd12043631e12c361abef301bf603140Andreas Huber                updatePCR(PID, PCR, byteOffsetFromStart);
129387f2a558dd12043631e12c361abef301bf603140Andreas Huber            }
129487f2a558dd12043631e12c361abef301bf603140Andreas Huber
129587f2a558dd12043631e12c361abef301bf603140Andreas Huber            numBitsRead += 52;
129687f2a558dd12043631e12c361abef301bf603140Andreas Huber        }
129787f2a558dd12043631e12c361abef301bf603140Andreas Huber
129887f2a558dd12043631e12c361abef301bf603140Andreas Huber        CHECK_GE(adaptation_field_length * 8, numBitsRead);
129987f2a558dd12043631e12c361abef301bf603140Andreas Huber
130087f2a558dd12043631e12c361abef301bf603140Andreas Huber        br->skipBits(adaptation_field_length * 8 - numBitsRead);
1301cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
1302cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
1303cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
130406528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huberstatus_t ATSParser::parseTS(ABitReader *br) {
13053856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("---");
1306cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1307cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned sync_byte = br->getBits(8);
13086456ae745e919085c5024f784aaa2703f9695f98David Yeh    if (sync_byte != 0x47u) {
13096456ae745e919085c5024f784aaa2703f9695f98David Yeh        ALOGE("[error] parseTS: return error as sync_byte=0x%x", sync_byte);
13106456ae745e919085c5024f784aaa2703f9695f98David Yeh        return BAD_VALUE;
13116456ae745e919085c5024f784aaa2703f9695f98David Yeh    }
1312cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
131352668ca838e1869676ff95e7388f93ec1858b1e9Andreas Huber    if (br->getBits(1)) {  // transport_error_indicator
131452668ca838e1869676ff95e7388f93ec1858b1e9Andreas Huber        // silently ignore.
131552668ca838e1869676ff95e7388f93ec1858b1e9Andreas Huber        return OK;
131652668ca838e1869676ff95e7388f93ec1858b1e9Andreas Huber    }
1317cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1318cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned payload_unit_start_indicator = br->getBits(1);
13193856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("payload_unit_start_indicator = %u", payload_unit_start_indicator);
1320cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
13216e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("transport_priority = %u", br->getBits(1));
1322cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1323cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned PID = br->getBits(13);
13243856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("PID = 0x%04x", PID);
1325cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
13266e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("transport_scrambling_control = %u", br->getBits(2));
1327cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1328cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned adaptation_field_control = br->getBits(2);
13293856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("adaptation_field_control = %u", adaptation_field_control);
1330cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
13310da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber    unsigned continuity_counter = br->getBits(4);
133287f2a558dd12043631e12c361abef301bf603140Andreas Huber    ALOGV("PID = 0x%04x, continuity_counter = %u", PID, continuity_counter);
13330da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber
1334df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block    // ALOGI("PID = 0x%04x, continuity_counter = %u", PID, continuity_counter);
1335cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1336cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    if (adaptation_field_control == 2 || adaptation_field_control == 3) {
133787f2a558dd12043631e12c361abef301bf603140Andreas Huber        parseAdaptationField(br, PID);
1338cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
1339cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
134087f2a558dd12043631e12c361abef301bf603140Andreas Huber    status_t err = OK;
134187f2a558dd12043631e12c361abef301bf603140Andreas Huber
1342cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    if (adaptation_field_control == 1 || adaptation_field_control == 3) {
134387f2a558dd12043631e12c361abef301bf603140Andreas Huber        err = parsePID(
134487f2a558dd12043631e12c361abef301bf603140Andreas Huber                br, PID, continuity_counter, payload_unit_start_indicator);
1345cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
134606528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber
134787f2a558dd12043631e12c361abef301bf603140Andreas Huber    ++mNumTSPacketsParsed;
134887f2a558dd12043631e12c361abef301bf603140Andreas Huber
134987f2a558dd12043631e12c361abef301bf603140Andreas Huber    return err;
1350cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
1351cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1352cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubersp<MediaSource> ATSParser::getSource(SourceType type) {
1353386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    int which = -1;  // any
1354386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
1355cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    for (size_t i = 0; i < mPrograms.size(); ++i) {
1356386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        const sp<Program> &program = mPrograms.editItemAt(i);
1357386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
1358386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        if (which >= 0 && (int)program->number() != which) {
1359386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            continue;
1360386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        }
1361386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
1362386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        sp<MediaSource> source = program->getSource(type);
1363cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1364cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        if (source != NULL) {
1365cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            return source;
1366cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        }
1367cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
1368cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1369cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    return NULL;
1370cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
1371cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1372bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shihbool ATSParser::hasSource(SourceType type) const {
1373bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih    for (size_t i = 0; i < mPrograms.size(); ++i) {
1374bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih        const sp<Program> &program = mPrograms.itemAt(i);
1375bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih        if (program->hasSource(type)) {
1376bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih            return true;
1377bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih        }
1378bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih    }
1379bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih
1380bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih    return false;
1381bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih}
1382bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih
138343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huberbool ATSParser::PTSTimeDeltaEstablished() {
138443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    if (mPrograms.isEmpty()) {
138543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        return false;
138643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    }
138743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
138843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    return mPrograms.editItemAt(0)->PTSTimeDeltaEstablished();
138943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber}
139043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
139187f2a558dd12043631e12c361abef301bf603140Andreas Hubervoid ATSParser::updatePCR(
139284333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber        unsigned /* PID */, uint64_t PCR, size_t byteOffsetFromStart) {
1393b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross    ALOGV("PCR 0x%016" PRIx64 " @ %zu", PCR, byteOffsetFromStart);
139487f2a558dd12043631e12c361abef301bf603140Andreas Huber
139587f2a558dd12043631e12c361abef301bf603140Andreas Huber    if (mNumPCRs == 2) {
139687f2a558dd12043631e12c361abef301bf603140Andreas Huber        mPCR[0] = mPCR[1];
139787f2a558dd12043631e12c361abef301bf603140Andreas Huber        mPCRBytes[0] = mPCRBytes[1];
139887f2a558dd12043631e12c361abef301bf603140Andreas Huber        mSystemTimeUs[0] = mSystemTimeUs[1];
139987f2a558dd12043631e12c361abef301bf603140Andreas Huber        mNumPCRs = 1;
140087f2a558dd12043631e12c361abef301bf603140Andreas Huber    }
140187f2a558dd12043631e12c361abef301bf603140Andreas Huber
140287f2a558dd12043631e12c361abef301bf603140Andreas Huber    mPCR[mNumPCRs] = PCR;
140387f2a558dd12043631e12c361abef301bf603140Andreas Huber    mPCRBytes[mNumPCRs] = byteOffsetFromStart;
140487f2a558dd12043631e12c361abef301bf603140Andreas Huber    mSystemTimeUs[mNumPCRs] = ALooper::GetNowUs();
140587f2a558dd12043631e12c361abef301bf603140Andreas Huber
140687f2a558dd12043631e12c361abef301bf603140Andreas Huber    ++mNumPCRs;
140787f2a558dd12043631e12c361abef301bf603140Andreas Huber
140887f2a558dd12043631e12c361abef301bf603140Andreas Huber    if (mNumPCRs == 2) {
140987f2a558dd12043631e12c361abef301bf603140Andreas Huber        double transportRate =
141087f2a558dd12043631e12c361abef301bf603140Andreas Huber            (mPCRBytes[1] - mPCRBytes[0]) * 27E6 / (mPCR[1] - mPCR[0]);
141187f2a558dd12043631e12c361abef301bf603140Andreas Huber
141287f2a558dd12043631e12c361abef301bf603140Andreas Huber        ALOGV("transportRate = %.2f bytes/sec", transportRate);
141387f2a558dd12043631e12c361abef301bf603140Andreas Huber    }
141487f2a558dd12043631e12c361abef301bf603140Andreas Huber}
141587f2a558dd12043631e12c361abef301bf603140Andreas Huber
14168dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber////////////////////////////////////////////////////////////////////////////////
14178dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
14189ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim
14199ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim// CRC32 used for PSI section. The table was generated by following command:
14209ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim// $ python pycrc.py --model crc-32-mpeg --algorithm table-driven --generate c
14219ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim// Visit http://www.tty1.net/pycrc/index_en.html for more details.
14229ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kimuint32_t ATSParser::PSISection::CRC_TABLE[] = {
14239ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9,
14249ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x130476dc, 0x17c56b6b, 0x1a864db2, 0x1e475005,
14259ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61,
14269ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd,
14279ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9,
14289ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75,
14299ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011,
14309ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x791d4014, 0x7ddc5da3, 0x709f7b7a, 0x745e66cd,
14319ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039,
14329ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5,
14339ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xbe2b5b58, 0xbaea46ef, 0xb7a96036, 0xb3687d81,
14349ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d,
14359ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49,
14369ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95,
14379ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1,
14389ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d,
14399ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x34867077, 0x30476dc0, 0x3d044b19, 0x39c556ae,
14409ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072,
14419ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16,
14429ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca,
14439ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde,
14449ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02,
14459ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x5e9f46bf, 0x5a5e5b08, 0x571d7dd1, 0x53dc6066,
14469ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,
14479ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e,
14489ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xbfa1b04b, 0xbb60adfc, 0xb6238b25, 0xb2e29692,
14499ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6,
14509ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a,
14519ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e,
14529ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2,
14539ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686,
14549ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xd5b88683, 0xd1799b34, 0xdc3abded, 0xd8fba05a,
14559ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637,
14569ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb,
14579ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f,
14589ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53,
14599ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47,
14609ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x36194d42, 0x32d850f5, 0x3f9b762c, 0x3b5a6b9b,
14619ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff,
14629ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623,
14639ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xf12f560e, 0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7,
14649ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b,
14659ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f,
14669ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3,
14679ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7,
14689ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b,
14699ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x9b3660c6, 0x9ff77d71, 0x92b45ba8, 0x9675461f,
14709ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3,
14719ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640,
14729ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c,
14739ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8,
14749ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24,
14759ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x119b4be9, 0x155a565e, 0x18197087, 0x1cd86d30,
14769ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec,
14779ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088,
14789ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x2497d08d, 0x2056cd3a, 0x2d15ebe3, 0x29d4f654,
14799ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0,
14809ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c,
14819ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18,
14829ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4,
14839ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0,
14849ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x9abc8bd5, 0x9e7d9662, 0x933eb0bb, 0x97ffad0c,
14859ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668,
14869ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4
14879ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    };
14889ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim
14899ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk KimATSParser::PSISection::PSISection() :
14909ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    mSkipBytes(0) {
14918dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber}
14928dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
14938dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas HuberATSParser::PSISection::~PSISection() {
14948dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber}
14958dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
14968dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberstatus_t ATSParser::PSISection::append(const void *data, size_t size) {
14978dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    if (mBuffer == NULL || mBuffer->size() + size > mBuffer->capacity()) {
14988dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        size_t newCapacity =
14998dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            (mBuffer == NULL) ? size : mBuffer->capacity() + size;
15008dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
15018dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        newCapacity = (newCapacity + 1023) & ~1023;
15028dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
15038dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        sp<ABuffer> newBuffer = new ABuffer(newCapacity);
15048dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
15058dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        if (mBuffer != NULL) {
15068dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            memcpy(newBuffer->data(), mBuffer->data(), mBuffer->size());
15078dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            newBuffer->setRange(0, mBuffer->size());
15088dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        } else {
15098dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            newBuffer->setRange(0, 0);
15108dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        }
15118dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
15128dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        mBuffer = newBuffer;
15138dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    }
15148dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
15158dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    memcpy(mBuffer->data() + mBuffer->size(), data, size);
15168dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    mBuffer->setRange(0, mBuffer->size() + size);
15178dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
15188dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    return OK;
15198dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber}
15208dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
15219ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kimvoid ATSParser::PSISection::setSkipBytes(uint8_t skip) {
15229ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    mSkipBytes = skip;
15239ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim}
15249ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim
15258dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Hubervoid ATSParser::PSISection::clear() {
15268dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    if (mBuffer != NULL) {
15278dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        mBuffer->setRange(0, 0);
15288dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    }
15299ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    mSkipBytes = 0;
15308dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber}
15318dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
15328dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberbool ATSParser::PSISection::isComplete() const {
15338dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    if (mBuffer == NULL || mBuffer->size() < 3) {
15348dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        return false;
15358dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    }
15368dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
15378dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    unsigned sectionLength = U16_AT(mBuffer->data() + 1) & 0xfff;
15388dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    return mBuffer->size() >= sectionLength + 3;
15398dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber}
15408dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
15418dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberbool ATSParser::PSISection::isEmpty() const {
15428dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    return mBuffer == NULL || mBuffer->size() == 0;
15438dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber}
15448dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
15458dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberconst uint8_t *ATSParser::PSISection::data() const {
15468dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    return mBuffer == NULL ? NULL : mBuffer->data();
15478dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber}
15488dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
15498dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Hubersize_t ATSParser::PSISection::size() const {
15508dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    return mBuffer == NULL ? 0 : mBuffer->size();
15518dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber}
15528dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
15539ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kimbool ATSParser::PSISection::isCRCOkay() const {
15549ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    if (!isComplete()) {
15559ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim        return false;
15569ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    }
15579ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    uint8_t* data = mBuffer->data();
15589ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim
15599ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    // Return true if section_syntax_indicator says no section follows the field section_length.
15609ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    if ((data[1] & 0x80) == 0) {
15619ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim        return true;
15629ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    }
15639ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim
15649ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    unsigned sectionLength = U16_AT(data + 1) & 0xfff;
15659ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    ALOGV("sectionLength %u, skip %u", sectionLength, mSkipBytes);
15669ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim
15679ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    // Skip the preceding field present when payload start indicator is on.
15689ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    sectionLength -= mSkipBytes;
15699ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim
15709ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    uint32_t crc = 0xffffffff;
15719ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    for(unsigned i = 0; i < sectionLength + 4 /* crc */; i++) {
15729ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim        uint8_t b = data[i];
15739ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim        int index = ((crc >> 24) ^ (b & 0xff)) & 0xff;
15749ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim        crc = CRC_TABLE[index] ^ (crc << 8);
15759ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    }
15769ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    ALOGV("crc: %08x\n", crc);
15779ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    return (crc == 0);
15789ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim}
1579cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}  // namespace android
1580