ATSParser.cpp revision aabbdc7401ae24a4199f12a283985deb648673c0
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 {
51d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang    Program(ATSParser *parser, unsigned programNumber, unsigned programMapPID,
52d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang            int64_t lastRecoveredPTS);
53cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
548dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    bool parsePSISection(
558dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            unsigned pid, ABitReader *br, status_t *err);
568dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
57cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    bool parsePID(
5887f2a558dd12043631e12c361abef301bf603140Andreas Huber            unsigned pid, unsigned continuity_counter,
5987f2a558dd12043631e12c361abef301bf603140Andreas Huber            unsigned payload_unit_start_indicator,
6006528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber            ABitReader *br, status_t *err);
61cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
6232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber    void signalDiscontinuity(
6332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            DiscontinuityType type, const sp<AMessage> &extra);
6432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
65f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    void signalEOS(status_t finalResult);
662a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber
67cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    sp<MediaSource> getSource(SourceType type);
68bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih    bool hasSource(SourceType type) const;
69cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
70bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    int64_t convertPTSToTimestamp(uint64_t PTS);
71bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber
7243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    bool PTSTimeDeltaEstablished() const {
7343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        return mFirstPTSValid;
7443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    }
7543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
76386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    unsigned number() const { return mProgramNumber; }
77386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
78386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    void updateProgramMapPID(unsigned programMapPID) {
79386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        mProgramMapPID = programMapPID;
80386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    }
81386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
828dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    unsigned programMapPID() const {
838dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        return mProgramMapPID;
848dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    }
858dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
8687f2a558dd12043631e12c361abef301bf603140Andreas Huber    uint32_t parserFlags() const {
8787f2a558dd12043631e12c361abef301bf603140Andreas Huber        return mParser->mFlags;
8887f2a558dd12043631e12c361abef301bf603140Andreas Huber    }
8987f2a558dd12043631e12c361abef301bf603140Andreas Huber
90cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberprivate:
919bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang    struct StreamInfo {
929bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        unsigned mType;
939bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        unsigned mPID;
949bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang    };
959bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang
96f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    ATSParser *mParser;
97386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    unsigned mProgramNumber;
98cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned mProgramMapPID;
99cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    KeyedVector<unsigned, sp<Stream> > mStreams;
100bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    bool mFirstPTSValid;
101bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    uint64_t mFirstPTS;
102799c9682b3776a55d234396aee4a302437150c26Chong Zhang    int64_t mLastRecoveredPTS;
103cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
10406528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber    status_t parseProgramMap(ABitReader *br);
105799c9682b3776a55d234396aee4a302437150c26Chong Zhang    int64_t recoverPTS(uint64_t PTS_33bit);
1069bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang    bool switchPIDs(const Vector<StreamInfo> &infos);
107cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
108cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    DISALLOW_EVIL_CONSTRUCTORS(Program);
109cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber};
110cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
111cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberstruct ATSParser::Stream : public RefBase {
11287f2a558dd12043631e12c361abef301bf603140Andreas Huber    Stream(Program *program,
11387f2a558dd12043631e12c361abef301bf603140Andreas Huber           unsigned elementaryPID,
11487f2a558dd12043631e12c361abef301bf603140Andreas Huber           unsigned streamType,
11587f2a558dd12043631e12c361abef301bf603140Andreas Huber           unsigned PCR_PID);
116cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
117bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber    unsigned type() const { return mStreamType; }
118bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber    unsigned pid() const { return mElementaryPID; }
119bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber    void setPID(unsigned pid) { mElementaryPID = pid; }
120bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber
1215403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber    status_t parse(
12287f2a558dd12043631e12c361abef301bf603140Andreas Huber            unsigned continuity_counter,
123cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            unsigned payload_unit_start_indicator,
124cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            ABitReader *br);
125cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
12632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber    void signalDiscontinuity(
12732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            DiscontinuityType type, const sp<AMessage> &extra);
12832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
129f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    void signalEOS(status_t finalResult);
1302a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber
131cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    sp<MediaSource> getSource(SourceType type);
132cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
133bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih    bool isAudio() const;
134bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih    bool isVideo() const;
1350852843d304006e3ab333081fddda13b07193de8Robert Shih    bool isMeta() const;
136bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih
137cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberprotected:
138cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    virtual ~Stream();
139cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
140cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberprivate:
141bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    Program *mProgram;
142cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned mElementaryPID;
143cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned mStreamType;
14487f2a558dd12043631e12c361abef301bf603140Andreas Huber    unsigned mPCR_PID;
14587f2a558dd12043631e12c361abef301bf603140Andreas Huber    int32_t mExpectedContinuityCounter;
146cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
147cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    sp<ABuffer> mBuffer;
148cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    sp<AnotherPacketSource> mSource;
149cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    bool mPayloadStarted;
150be9634d071e79b72a42a4504f64eda9e2a0bceb8Marco Nelissen    bool mEOSReached;
151cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
15290a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber    uint64_t mPrevPTS;
15390a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber
154386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    ElementaryStreamQueue *mQueue;
1556a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber
1565403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber    status_t flush();
1575403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber    status_t parsePES(ABitReader *br);
158cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
159cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    void onPayloadData(
160cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            unsigned PTS_DTS_flags, uint64_t PTS, uint64_t DTS,
161cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            const uint8_t *data, size_t size);
162cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
16382f7321b03eec1e40af9d681370f754ee0279582Andreas Huber    void extractAACFrames(const sp<ABuffer> &buffer);
16482f7321b03eec1e40af9d681370f754ee0279582Andreas Huber
165cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    DISALLOW_EVIL_CONSTRUCTORS(Stream);
166cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber};
167cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1688dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberstruct ATSParser::PSISection : public RefBase {
1698dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    PSISection();
1708dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
1718dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    status_t append(const void *data, size_t size);
1729ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    void setSkipBytes(uint8_t skip);
1738dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    void clear();
1748dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
1758dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    bool isComplete() const;
1768dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    bool isEmpty() const;
1779ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    bool isCRCOkay() const;
1788dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
1798dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    const uint8_t *data() const;
1808dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    size_t size() const;
1818dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
1828dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberprotected:
1838dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    virtual ~PSISection();
1848dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
1858dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberprivate:
1868dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    sp<ABuffer> mBuffer;
1879ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    uint8_t mSkipBytes;
1889ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    static uint32_t CRC_TABLE[];
1898dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
1908dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    DISALLOW_EVIL_CONSTRUCTORS(PSISection);
1918dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber};
1928dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
193cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber////////////////////////////////////////////////////////////////////////////////
194cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
195386d609dc513e838c7e7c4c46c604493ccd560beAndreas HuberATSParser::Program::Program(
196d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang        ATSParser *parser, unsigned programNumber, unsigned programMapPID,
197d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang        int64_t lastRecoveredPTS)
198f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    : mParser(parser),
199386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber      mProgramNumber(programNumber),
200f933441648ef6a71dee783d733aac17b9508b452Andreas Huber      mProgramMapPID(programMapPID),
201bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber      mFirstPTSValid(false),
202799c9682b3776a55d234396aee4a302437150c26Chong Zhang      mFirstPTS(0),
203d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang      mLastRecoveredPTS(lastRecoveredPTS) {
2043856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("new program number %u", programNumber);
205cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
206cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
2078dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberbool ATSParser::Program::parsePSISection(
2088dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        unsigned pid, ABitReader *br, status_t *err) {
20906528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber    *err = OK;
21006528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber
2118dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    if (pid != mProgramMapPID) {
2128dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        return false;
2138dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    }
214cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
2158dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    *err = parseProgramMap(br);
21606528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber
2178dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    return true;
2188dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber}
2198dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
2208dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberbool ATSParser::Program::parsePID(
22187f2a558dd12043631e12c361abef301bf603140Andreas Huber        unsigned pid, unsigned continuity_counter,
22287f2a558dd12043631e12c361abef301bf603140Andreas Huber        unsigned payload_unit_start_indicator,
2238dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        ABitReader *br, status_t *err) {
2248dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    *err = OK;
225cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
226cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    ssize_t index = mStreams.indexOfKey(pid);
227cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    if (index < 0) {
228cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        return false;
229cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
230cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
2315403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber    *err = mStreams.editValueAt(index)->parse(
23287f2a558dd12043631e12c361abef301bf603140Andreas Huber            continuity_counter, payload_unit_start_indicator, br);
233cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
234cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    return true;
235cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
236cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
23732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Hubervoid ATSParser::Program::signalDiscontinuity(
23832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        DiscontinuityType type, const sp<AMessage> &extra) {
239b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber    int64_t mediaTimeUs;
240b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber    if ((type & DISCONTINUITY_TIME)
241b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber            && extra != NULL
242b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber            && extra->findInt64(
243b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber                IStreamListener::kKeyMediaTimeUs, &mediaTimeUs)) {
244b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber        mFirstPTSValid = false;
245b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber    }
246b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber
2472a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    for (size_t i = 0; i < mStreams.size(); ++i) {
24832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        mStreams.editValueAt(i)->signalDiscontinuity(type, extra);
249f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
250f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
251f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
252f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ATSParser::Program::signalEOS(status_t finalResult) {
253f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    for (size_t i = 0; i < mStreams.size(); ++i) {
254f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        mStreams.editValueAt(i)->signalEOS(finalResult);
2552a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    }
2562a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber}
2572a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber
2589bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhangbool ATSParser::Program::switchPIDs(const Vector<StreamInfo> &infos) {
2599bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang    bool success = false;
2609bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang
2619bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang    if (mStreams.size() == infos.size()) {
2629bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        // build type->PIDs map for old and new mapping
2639bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        size_t i;
2649bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        KeyedVector<int32_t, Vector<int32_t> > oldType2PIDs, newType2PIDs;
2659bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        for (i = 0; i < mStreams.size(); ++i) {
2669bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            ssize_t index = oldType2PIDs.indexOfKey(mStreams[i]->type());
2679bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            if (index < 0) {
2689bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                oldType2PIDs.add(mStreams[i]->type(), Vector<int32_t>());
2699bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            }
2709bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            oldType2PIDs.editValueFor(mStreams[i]->type()).push_back(mStreams[i]->pid());
2719bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        }
2729bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        for (i = 0; i < infos.size(); ++i) {
2739bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            ssize_t index = newType2PIDs.indexOfKey(infos[i].mType);
2749bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            if (index < 0) {
2759bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                newType2PIDs.add(infos[i].mType, Vector<int32_t>());
2769bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            }
2779bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            newType2PIDs.editValueFor(infos[i].mType).push_back(infos[i].mPID);
2789bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        }
2799bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang
2809bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        // we can recover if the number of streams for each type hasn't changed
2819bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        if (oldType2PIDs.size() == newType2PIDs.size()) {
2829bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            success = true;
2839bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            for (i = 0; i < oldType2PIDs.size(); ++i) {
2849bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                // KeyedVector is sorted, we just compare key and size of each index
2859bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                if (oldType2PIDs.keyAt(i) != newType2PIDs.keyAt(i)
2869bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                        || oldType2PIDs[i].size() != newType2PIDs[i].size()) {
2879bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                     success = false;
2889bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                     break;
2899bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                }
2909bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            }
2919bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        }
2929bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang
2939bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        if (success) {
2949bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            // save current streams to temp
2959bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            KeyedVector<int32_t, sp<Stream> > temp;
2969bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            for (i = 0; i < mStreams.size(); ++i) {
2979bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                 temp.add(mStreams.keyAt(i), mStreams.editValueAt(i));
2989bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            }
2999bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang
3009bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            mStreams.clear();
3019bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            for (i = 0; i < temp.size(); ++i) {
3029bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                // The two checks below shouldn't happen,
3039bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                // we already checked above the stream count matches
3049bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                ssize_t index = newType2PIDs.indexOfKey(temp[i]->type());
305e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                if (index < 0) {
306e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                    return false;
307e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                }
3089bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                Vector<int32_t> &newPIDs = newType2PIDs.editValueAt(index);
309e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                if (newPIDs.isEmpty()) {
310e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                    return false;
311e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                }
3129bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang
3139bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                // get the next PID for temp[i]->type() in the new PID map
3149bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                Vector<int32_t>::iterator it = newPIDs.begin();
3159bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang
3169bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                // change the PID of the stream, and add it back
3179bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                temp.editValueAt(i)->setPID(*it);
3189bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                mStreams.add(temp[i]->pid(), temp.editValueAt(i));
3199bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang
3209bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                // removed the used PID
3219bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                newPIDs.erase(it);
3229bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            }
3239bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        }
3249bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang    }
3259bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang    return success;
3269bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang}
327bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber
32806528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huberstatus_t ATSParser::Program::parseProgramMap(ABitReader *br) {
329cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned table_id = br->getBits(8);
3303856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("  table_id = %u", table_id);
3316456ae745e919085c5024f784aaa2703f9695f98David Yeh    if (table_id != 0x02u) {
3326456ae745e919085c5024f784aaa2703f9695f98David Yeh        ALOGE("PMT data error!");
3336456ae745e919085c5024f784aaa2703f9695f98David Yeh        return ERROR_MALFORMED;
3346456ae745e919085c5024f784aaa2703f9695f98David Yeh    }
3356e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    unsigned section_syntax_indicator = br->getBits(1);
3363856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("  section_syntax_indicator = %u", section_syntax_indicator);
3376456ae745e919085c5024f784aaa2703f9695f98David Yeh    if (section_syntax_indicator != 1u) {
3386456ae745e919085c5024f784aaa2703f9695f98David Yeh        ALOGE("PMT data error!");
3396456ae745e919085c5024f784aaa2703f9695f98David Yeh        return ERROR_MALFORMED;
3406456ae745e919085c5024f784aaa2703f9695f98David Yeh    }
341cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
342e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim    br->skipBits(1);  // '0'
3436e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  reserved = %u", br->getBits(2));
344cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
345cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned section_length = br->getBits(12);
3463856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("  section_length = %u", section_length);
347cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
3486e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  program_number = %u", br->getBits(16));
3496e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  reserved = %u", br->getBits(2));
3506e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  version_number = %u", br->getBits(5));
3516e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  current_next_indicator = %u", br->getBits(1));
3526e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  section_number = %u", br->getBits(8));
3536e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  last_section_number = %u", br->getBits(8));
3546e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  reserved = %u", br->getBits(3));
35587f2a558dd12043631e12c361abef301bf603140Andreas Huber
35687f2a558dd12043631e12c361abef301bf603140Andreas Huber    unsigned PCR_PID = br->getBits(13);
35787f2a558dd12043631e12c361abef301bf603140Andreas Huber    ALOGV("  PCR_PID = 0x%04x", PCR_PID);
35887f2a558dd12043631e12c361abef301bf603140Andreas Huber
3596e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  reserved = %u", br->getBits(4));
360cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
361cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned program_info_length = br->getBits(12);
3623856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("  program_info_length = %u", program_info_length);
363cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
364cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    br->skipBits(program_info_length * 8);  // skip descriptors
365cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
366bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber    Vector<StreamInfo> infos;
367bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber
368cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    // infoBytesRemaining is the number of bytes that make up the
369cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    // variable length section of ES_infos. It does not include the
370cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    // final CRC.
371cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    size_t infoBytesRemaining = section_length - 9 - program_info_length - 4;
372cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
373e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim    while (infoBytesRemaining >= 5) {
374cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
375cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned streamType = br->getBits(8);
3763856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("    stream_type = 0x%02x", streamType);
377cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
3786e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber        MY_LOGV("    reserved = %u", br->getBits(3));
379cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
380cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned elementaryPID = br->getBits(13);
3813856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("    elementary_PID = 0x%04x", elementaryPID);
382cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
3836e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber        MY_LOGV("    reserved = %u", br->getBits(4));
384cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
385cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned ES_info_length = br->getBits(12);
3863856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("    ES_info_length = %u", ES_info_length);
387cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
388cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#if 0
389cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        br->skipBits(ES_info_length * 8);  // skip descriptors
390cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#else
391cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned info_bytes_remaining = ES_info_length;
392cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        while (info_bytes_remaining >= 2) {
3936e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber            MY_LOGV("      tag = 0x%02x", br->getBits(8));
394cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
395cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            unsigned descLength = br->getBits(8);
3963856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("      len = %u", descLength);
397cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
398e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            if (info_bytes_remaining < descLength) {
399e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                return ERROR_MALFORMED;
400e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            }
401cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            br->skipBits(descLength * 8);
402cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
403cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            info_bytes_remaining -= descLength + 2;
404cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        }
405cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#endif
406cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
407bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        StreamInfo info;
408bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        info.mType = streamType;
409bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        info.mPID = elementaryPID;
410bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        infos.push(info);
411cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
412cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        infoBytesRemaining -= 5 + ES_info_length;
413cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
414cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
415e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim    if (infoBytesRemaining != 0) {
416e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        ALOGW("Section data remains unconsumed");
417e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim    }
4186e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  CRC = 0x%08x", br->getBits(32));
419bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber
420bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber    bool PIDsChanged = false;
421bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber    for (size_t i = 0; i < infos.size(); ++i) {
422bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        StreamInfo &info = infos.editItemAt(i);
423bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber
424bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        ssize_t index = mStreams.indexOfKey(info.mPID);
425bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber
426bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        if (index >= 0 && mStreams.editValueAt(index)->type() != info.mType) {
427df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block            ALOGI("uh oh. stream PIDs have changed.");
428bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber            PIDsChanged = true;
429bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber            break;
430bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        }
431bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber    }
432bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber
433bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber    if (PIDsChanged) {
43406528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber#if 0
435df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block        ALOGI("before:");
43606528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber        for (size_t i = 0; i < mStreams.size(); ++i) {
43706528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber            sp<Stream> stream = mStreams.editValueAt(i);
43806528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber
439df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block            ALOGI("PID 0x%08x => type 0x%02x", stream->pid(), stream->type());
44006528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber        }
44106528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber
442df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block        ALOGI("after:");
44306528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber        for (size_t i = 0; i < infos.size(); ++i) {
44406528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber            StreamInfo &info = infos.editItemAt(i);
44506528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber
446df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block            ALOGI("PID 0x%08x => type 0x%02x", info.mPID, info.mType);
44706528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber        }
44806528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber#endif
44906528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber
4509bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        // we can recover if number of streams for each type remain the same
4519bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        bool success = switchPIDs(infos);
45206528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber
45306528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber        if (!success) {
454df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block            ALOGI("Stream PIDs changed and we cannot recover.");
45506528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber            return ERROR_MALFORMED;
45606528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber        }
457bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber    }
458bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber
459bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber    for (size_t i = 0; i < infos.size(); ++i) {
460bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        StreamInfo &info = infos.editItemAt(i);
461bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber
462bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        ssize_t index = mStreams.indexOfKey(info.mPID);
463bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber
464bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        if (index < 0) {
46587f2a558dd12043631e12c361abef301bf603140Andreas Huber            sp<Stream> stream = new Stream(
46687f2a558dd12043631e12c361abef301bf603140Andreas Huber                    this, info.mPID, info.mType, PCR_PID);
46787f2a558dd12043631e12c361abef301bf603140Andreas Huber
468bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber            mStreams.add(info.mPID, stream);
469bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        }
470bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber    }
47106528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber
47206528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber    return OK;
473cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
474cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
475799c9682b3776a55d234396aee4a302437150c26Chong Zhangint64_t ATSParser::Program::recoverPTS(uint64_t PTS_33bit) {
476799c9682b3776a55d234396aee4a302437150c26Chong Zhang    // We only have the lower 33-bit of the PTS. It could overflow within a
477799c9682b3776a55d234396aee4a302437150c26Chong Zhang    // reasonable amount of time. To handle the wrap-around, use fancy math
478799c9682b3776a55d234396aee4a302437150c26Chong Zhang    // to get an extended PTS that is within [-0xffffffff, 0xffffffff]
479799c9682b3776a55d234396aee4a302437150c26Chong Zhang    // of the latest recovered PTS.
4809bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang    if (mLastRecoveredPTS < 0ll) {
4819bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        // Use the original 33bit number for 1st frame, the reason is that
4829bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        // if 1st frame wraps to negative that's far away from 0, we could
4839bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        // never start. Only start wrapping around from 2nd frame.
4849bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        mLastRecoveredPTS = static_cast<int64_t>(PTS_33bit);
4859bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang    } else {
4869bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        mLastRecoveredPTS = static_cast<int64_t>(
4879bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                ((mLastRecoveredPTS - PTS_33bit + 0x100000000ll)
4889bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                & 0xfffffffe00000000ull) | PTS_33bit);
4899bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        // We start from 0, but recovered PTS could be slightly below 0.
4909bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        // Clamp it to 0 as rest of the pipeline doesn't take negative pts.
4919bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        // (eg. video is read first and starts at 0, but audio starts at 0xfffffff0)
4929bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        if (mLastRecoveredPTS < 0ll) {
4935c9054bc6efc080b265e028f2ebb1abd2a2e3953Chih-Hung Hsieh            ALOGI("Clamping negative recovered PTS (%" PRId64 ") to 0", mLastRecoveredPTS);
4949bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            mLastRecoveredPTS = 0ll;
4959bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        }
4969bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang    }
4979bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang
4989bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang    return mLastRecoveredPTS;
499799c9682b3776a55d234396aee4a302437150c26Chong Zhang}
500799c9682b3776a55d234396aee4a302437150c26Chong Zhang
501cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubersp<MediaSource> ATSParser::Program::getSource(SourceType type) {
502386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    size_t index = (type == AUDIO) ? 0 : 0;
503decd96988e495133e4a1728f612d4c9fdb4d218eAndreas Huber
504cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    for (size_t i = 0; i < mStreams.size(); ++i) {
505cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        sp<MediaSource> source = mStreams.editValueAt(i)->getSource(type);
506cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        if (source != NULL) {
507decd96988e495133e4a1728f612d4c9fdb4d218eAndreas Huber            if (index == 0) {
508decd96988e495133e4a1728f612d4c9fdb4d218eAndreas Huber                return source;
509decd96988e495133e4a1728f612d4c9fdb4d218eAndreas Huber            }
510decd96988e495133e4a1728f612d4c9fdb4d218eAndreas Huber            --index;
511cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        }
512cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
513cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
514cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    return NULL;
515cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
516cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
517bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shihbool ATSParser::Program::hasSource(SourceType type) const {
518bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih    for (size_t i = 0; i < mStreams.size(); ++i) {
519bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih        const sp<Stream> &stream = mStreams.valueAt(i);
520bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih        if (type == AUDIO && stream->isAudio()) {
521bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih            return true;
522bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih        } else if (type == VIDEO && stream->isVideo()) {
523bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih            return true;
524bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih        }
525bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih    }
526bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih
527bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih    return false;
528bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih}
529bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih
530bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huberint64_t ATSParser::Program::convertPTSToTimestamp(uint64_t PTS) {
531799c9682b3776a55d234396aee4a302437150c26Chong Zhang    PTS = recoverPTS(PTS);
532799c9682b3776a55d234396aee4a302437150c26Chong Zhang
533c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber    if (!(mParser->mFlags & TS_TIMESTAMPS_ARE_ABSOLUTE)) {
534c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber        if (!mFirstPTSValid) {
535c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber            mFirstPTSValid = true;
536c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber            mFirstPTS = PTS;
537c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber            PTS = 0;
538c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber        } else if (PTS < mFirstPTS) {
539c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber            PTS = 0;
540c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber        } else {
541c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber            PTS -= mFirstPTS;
542c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber        }
543bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    }
544bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber
54587f2a558dd12043631e12c361abef301bf603140Andreas Huber    int64_t timeUs = (PTS * 100) / 9;
54687f2a558dd12043631e12c361abef301bf603140Andreas Huber
54787f2a558dd12043631e12c361abef301bf603140Andreas Huber    if (mParser->mAbsoluteTimeAnchorUs >= 0ll) {
54887f2a558dd12043631e12c361abef301bf603140Andreas Huber        timeUs += mParser->mAbsoluteTimeAnchorUs;
54987f2a558dd12043631e12c361abef301bf603140Andreas Huber    }
55087f2a558dd12043631e12c361abef301bf603140Andreas Huber
551d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber    if (mParser->mTimeOffsetValid) {
552d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber        timeUs += mParser->mTimeOffsetUs;
553d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber    }
554d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber
55587f2a558dd12043631e12c361abef301bf603140Andreas Huber    return timeUs;
556bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber}
557bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber
558cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber////////////////////////////////////////////////////////////////////////////////
559cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
560bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas HuberATSParser::Stream::Stream(
56187f2a558dd12043631e12c361abef301bf603140Andreas Huber        Program *program,
56287f2a558dd12043631e12c361abef301bf603140Andreas Huber        unsigned elementaryPID,
56387f2a558dd12043631e12c361abef301bf603140Andreas Huber        unsigned streamType,
56487f2a558dd12043631e12c361abef301bf603140Andreas Huber        unsigned PCR_PID)
565bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    : mProgram(program),
566bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber      mElementaryPID(elementaryPID),
567cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber      mStreamType(streamType),
56887f2a558dd12043631e12c361abef301bf603140Andreas Huber      mPCR_PID(PCR_PID),
56987f2a558dd12043631e12c361abef301bf603140Andreas Huber      mExpectedContinuityCounter(-1),
5706a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber      mPayloadStarted(false),
571be9634d071e79b72a42a4504f64eda9e2a0bceb8Marco Nelissen      mEOSReached(false),
57290a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber      mPrevPTS(0),
573386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber      mQueue(NULL) {
574386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    switch (mStreamType) {
575386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        case STREAMTYPE_H264:
57687f2a558dd12043631e12c361abef301bf603140Andreas Huber            mQueue = new ElementaryStreamQueue(
57787f2a558dd12043631e12c361abef301bf603140Andreas Huber                    ElementaryStreamQueue::H264,
57887f2a558dd12043631e12c361abef301bf603140Andreas Huber                    (mProgram->parserFlags() & ALIGNED_VIDEO_DATA)
57987f2a558dd12043631e12c361abef301bf603140Andreas Huber                        ? ElementaryStreamQueue::kFlag_AlignedData : 0);
580386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            break;
5816e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        case STREAMTYPE_MPEG2_AUDIO_ADTS:
582386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            mQueue = new ElementaryStreamQueue(ElementaryStreamQueue::AAC);
583386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            break;
584386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        case STREAMTYPE_MPEG1_AUDIO:
585386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        case STREAMTYPE_MPEG2_AUDIO:
586386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            mQueue = new ElementaryStreamQueue(
587386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                    ElementaryStreamQueue::MPEG_AUDIO);
588386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            break;
589386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
590386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        case STREAMTYPE_MPEG1_VIDEO:
591386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        case STREAMTYPE_MPEG2_VIDEO:
592386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            mQueue = new ElementaryStreamQueue(
593386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                    ElementaryStreamQueue::MPEG_VIDEO);
594386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            break;
595386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
596386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        case STREAMTYPE_MPEG4_VIDEO:
597386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            mQueue = new ElementaryStreamQueue(
598386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                    ElementaryStreamQueue::MPEG4_VIDEO);
599386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            break;
600386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
6019bf32f06e8971c1d3eb4fc5edd74b69557f97212Chong Zhang        case STREAMTYPE_LPCM_AC3:
602d3c079ae9859011d118f94616d0069c2987013edChangwan Ryu        case STREAMTYPE_AC3:
603d3c079ae9859011d118f94616d0069c2987013edChangwan Ryu            mQueue = new ElementaryStreamQueue(
604d3c079ae9859011d118f94616d0069c2987013edChangwan Ryu                    ElementaryStreamQueue::AC3);
605d3c079ae9859011d118f94616d0069c2987013edChangwan Ryu            break;
606d3c079ae9859011d118f94616d0069c2987013edChangwan Ryu
6070852843d304006e3ab333081fddda13b07193de8Robert Shih        case STREAMTYPE_METADATA:
6080852843d304006e3ab333081fddda13b07193de8Robert Shih            mQueue = new ElementaryStreamQueue(
6090852843d304006e3ab333081fddda13b07193de8Robert Shih                    ElementaryStreamQueue::METADATA);
6100852843d304006e3ab333081fddda13b07193de8Robert Shih            break;
6110852843d304006e3ab333081fddda13b07193de8Robert Shih
612386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        default:
613386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            break;
614386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    }
615386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
6163856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("new stream PID 0x%02x, type 0x%02x", elementaryPID, streamType);
61718ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber
61818ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber    if (mQueue != NULL) {
61918ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber        mBuffer = new ABuffer(192 * 1024);
62018ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber        mBuffer->setRange(0, 0);
62118ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber    }
622cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
623cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
624cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas HuberATSParser::Stream::~Stream() {
625386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    delete mQueue;
626386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    mQueue = NULL;
627cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
628cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
6295403129e2a2f44620f2ac8109889e5a61be08732Andreas Huberstatus_t ATSParser::Stream::parse(
63087f2a558dd12043631e12c361abef301bf603140Andreas Huber        unsigned continuity_counter,
631cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned payload_unit_start_indicator, ABitReader *br) {
63218ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber    if (mQueue == NULL) {
6335403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber        return OK;
63418ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber    }
63518ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber
63687f2a558dd12043631e12c361abef301bf603140Andreas Huber    if (mExpectedContinuityCounter >= 0
63787f2a558dd12043631e12c361abef301bf603140Andreas Huber            && (unsigned)mExpectedContinuityCounter != continuity_counter) {
63887f2a558dd12043631e12c361abef301bf603140Andreas Huber        ALOGI("discontinuity on stream pid 0x%04x", mElementaryPID);
63987f2a558dd12043631e12c361abef301bf603140Andreas Huber
64087f2a558dd12043631e12c361abef301bf603140Andreas Huber        mPayloadStarted = false;
64187f2a558dd12043631e12c361abef301bf603140Andreas Huber        mBuffer->setRange(0, 0);
64287f2a558dd12043631e12c361abef301bf603140Andreas Huber        mExpectedContinuityCounter = -1;
64387f2a558dd12043631e12c361abef301bf603140Andreas Huber
64494a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber#if 0
64594a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber        // Uncomment this if you'd rather see no corruption whatsoever on
64694a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber        // screen and suspend updates until we come across another IDR frame.
64794a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber
64894a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber        if (mStreamType == STREAMTYPE_H264) {
64994a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber            ALOGI("clearing video queue");
65094a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber            mQueue->clear(true /* clearFormat */);
65194a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber        }
65294a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber#endif
65394a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber
65466830855846db5c211c2da6c055ca9b4167e8974Chong Zhang        if (!payload_unit_start_indicator) {
65566830855846db5c211c2da6c055ca9b4167e8974Chong Zhang            return OK;
65666830855846db5c211c2da6c055ca9b4167e8974Chong Zhang        }
65787f2a558dd12043631e12c361abef301bf603140Andreas Huber    }
65887f2a558dd12043631e12c361abef301bf603140Andreas Huber
65987f2a558dd12043631e12c361abef301bf603140Andreas Huber    mExpectedContinuityCounter = (continuity_counter + 1) & 0x0f;
66087f2a558dd12043631e12c361abef301bf603140Andreas Huber
661cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    if (payload_unit_start_indicator) {
662cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        if (mPayloadStarted) {
663cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            // Otherwise we run the danger of receiving the trailing bytes
664cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            // of a PES packet that we never saw the start of and assuming
665cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            // we have a a complete PES packet.
666cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
6675403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber            status_t err = flush();
6685403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber
6695403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber            if (err != OK) {
6705403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber                return err;
6715403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber            }
672cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        }
673cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
674cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        mPayloadStarted = true;
675cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
676cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
677cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    if (!mPayloadStarted) {
6785403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber        return OK;
679cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
680cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
681cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    size_t payloadSizeBits = br->numBitsLeft();
682e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim    if (payloadSizeBits % 8 != 0u) {
683e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        ALOGE("Wrong value");
684e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        return BAD_VALUE;
685e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim    }
686cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
6873e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber    size_t neededSize = mBuffer->size() + payloadSizeBits / 8;
6883e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber    if (mBuffer->capacity() < neededSize) {
6893e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber        // Increment in multiples of 64K.
6903e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber        neededSize = (neededSize + 65535) & ~65535;
6913e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber
692b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross        ALOGI("resizing buffer to %zu bytes", neededSize);
6933e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber
6943e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber        sp<ABuffer> newBuffer = new ABuffer(neededSize);
6953e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber        memcpy(newBuffer->data(), mBuffer->data(), mBuffer->size());
6963e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber        newBuffer->setRange(0, mBuffer->size());
6973e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber        mBuffer = newBuffer;
6983e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber    }
699cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
700cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    memcpy(mBuffer->data() + mBuffer->size(), br->data(), payloadSizeBits / 8);
701cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    mBuffer->setRange(0, mBuffer->size() + payloadSizeBits / 8);
7025403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber
7035403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber    return OK;
704cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
705cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
7066e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huberbool ATSParser::Stream::isVideo() const {
7076e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    switch (mStreamType) {
7086e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        case STREAMTYPE_H264:
7096e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        case STREAMTYPE_MPEG1_VIDEO:
7106e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        case STREAMTYPE_MPEG2_VIDEO:
7116e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        case STREAMTYPE_MPEG4_VIDEO:
7126e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber            return true;
7136e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
7146e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        default:
7156e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber            return false;
7166e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    }
7176e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber}
7186e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
7196e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huberbool ATSParser::Stream::isAudio() const {
7206e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    switch (mStreamType) {
7216e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        case STREAMTYPE_MPEG1_AUDIO:
7226e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        case STREAMTYPE_MPEG2_AUDIO:
7236e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        case STREAMTYPE_MPEG2_AUDIO_ADTS:
7249bf32f06e8971c1d3eb4fc5edd74b69557f97212Chong Zhang        case STREAMTYPE_LPCM_AC3:
725d3c079ae9859011d118f94616d0069c2987013edChangwan Ryu        case STREAMTYPE_AC3:
7266e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber            return true;
7276e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
7286e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        default:
7296e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber            return false;
7306e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    }
7316e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber}
7326e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
7330852843d304006e3ab333081fddda13b07193de8Robert Shihbool ATSParser::Stream::isMeta() const {
7340852843d304006e3ab333081fddda13b07193de8Robert Shih    if (mStreamType == STREAMTYPE_METADATA) {
7350852843d304006e3ab333081fddda13b07193de8Robert Shih        return true;
7360852843d304006e3ab333081fddda13b07193de8Robert Shih    }
7370852843d304006e3ab333081fddda13b07193de8Robert Shih    return false;
7380852843d304006e3ab333081fddda13b07193de8Robert Shih}
7390852843d304006e3ab333081fddda13b07193de8Robert Shih
74032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Hubervoid ATSParser::Stream::signalDiscontinuity(
74132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        DiscontinuityType type, const sp<AMessage> &extra) {
7420389cc09f7b90f155a8942a0d2e1925cad1dbe2dMarco Nelissen    mExpectedContinuityCounter = -1;
7430389cc09f7b90f155a8942a0d2e1925cad1dbe2dMarco Nelissen
74418ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber    if (mQueue == NULL) {
74518ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber        return;
74618ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber    }
74718ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber
7482a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    mPayloadStarted = false;
749aabbdc7401ae24a4199f12a283985deb648673c0Robert Shih    mEOSReached = false;
7502a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    mBuffer->setRange(0, 0);
7512a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber
7526e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    bool clearFormat = false;
7536e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    if (isAudio()) {
7546e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        if (type & DISCONTINUITY_AUDIO_FORMAT) {
7556e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber            clearFormat = true;
7566e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        }
7576e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    } else {
7586e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        if (type & DISCONTINUITY_VIDEO_FORMAT) {
7596e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber            clearFormat = true;
7606e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        }
7616e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    }
762f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
7636e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    mQueue->clear(clearFormat);
76432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
7656e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    if (type & DISCONTINUITY_TIME) {
7666e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        uint64_t resumeAtPTS;
7676e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        if (extra != NULL
7686e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                && extra->findInt64(
7696e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    IStreamListener::kKeyResumeAtPTS,
7706e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    (int64_t *)&resumeAtPTS)) {
7716e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber            int64_t resumeAtMediaTimeUs =
7726e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                mProgram->convertPTSToTimestamp(resumeAtPTS);
77332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
774c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia            extra->setInt64("resume-at-mediaTimeUs", resumeAtMediaTimeUs);
775e332a9181cf6a3155ed1a0fd2afc212ccb1f2753Andreas Huber        }
7766e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    }
777f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
7786e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    if (mSource != NULL) {
779632740c58119a132ce19f6d498e39c5c3773971aChong Zhang        mSource->queueDiscontinuity(type, extra, true);
780bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    }
781f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
782bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber
783f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ATSParser::Stream::signalEOS(status_t finalResult) {
784f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (mSource != NULL) {
785f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        mSource->signalEOS(finalResult);
7862a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    }
787be9634d071e79b72a42a4504f64eda9e2a0bceb8Marco Nelissen    mEOSReached = true;
788be9634d071e79b72a42a4504f64eda9e2a0bceb8Marco Nelissen    flush();
7892a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber}
7902a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber
7915403129e2a2f44620f2ac8109889e5a61be08732Andreas Huberstatus_t ATSParser::Stream::parsePES(ABitReader *br) {
792cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned packet_startcode_prefix = br->getBits(24);
793cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
7943856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("packet_startcode_prefix = 0x%08x", packet_startcode_prefix);
795cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
796386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    if (packet_startcode_prefix != 1) {
7973856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("Supposedly payload_unit_start=1 unit does not start "
798386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber             "with startcode.");
7995403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber
8005403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber        return ERROR_MALFORMED;
801386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    }
802386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
803cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned stream_id = br->getBits(8);
8043856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("stream_id = 0x%02x", stream_id);
805cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
806cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned PES_packet_length = br->getBits(16);
8073856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("PES_packet_length = %u", PES_packet_length);
808cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
809cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    if (stream_id != 0xbc  // program_stream_map
810cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            && stream_id != 0xbe  // padding_stream
811cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            && stream_id != 0xbf  // private_stream_2
812cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            && stream_id != 0xf0  // ECM
813cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            && stream_id != 0xf1  // EMM
814cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            && stream_id != 0xff  // program_stream_directory
815cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            && stream_id != 0xf2  // DSMCC
816cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            && stream_id != 0xf8) {  // H.222.1 type E
817e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        if (br->getBits(2) != 2u) {
818e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            return ERROR_MALFORMED;
819e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        }
820cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
8216e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber        MY_LOGV("PES_scrambling_control = %u", br->getBits(2));
8226e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber        MY_LOGV("PES_priority = %u", br->getBits(1));
8236e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber        MY_LOGV("data_alignment_indicator = %u", br->getBits(1));
8246e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber        MY_LOGV("copyright = %u", br->getBits(1));
8256e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber        MY_LOGV("original_or_copy = %u", br->getBits(1));
826cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
827cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned PTS_DTS_flags = br->getBits(2);
8283856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("PTS_DTS_flags = %u", PTS_DTS_flags);
829cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
830cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned ESCR_flag = br->getBits(1);
8313856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("ESCR_flag = %u", ESCR_flag);
832cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
833cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned ES_rate_flag = br->getBits(1);
8343856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("ES_rate_flag = %u", ES_rate_flag);
835cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
836cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned DSM_trick_mode_flag = br->getBits(1);
8373856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("DSM_trick_mode_flag = %u", DSM_trick_mode_flag);
838cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
839cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned additional_copy_info_flag = br->getBits(1);
8403856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("additional_copy_info_flag = %u", additional_copy_info_flag);
841cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
8426e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber        MY_LOGV("PES_CRC_flag = %u", br->getBits(1));
8436e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber        MY_LOGV("PES_extension_flag = %u", br->getBits(1));
844cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
845cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned PES_header_data_length = br->getBits(8);
8463856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("PES_header_data_length = %u", PES_header_data_length);
847cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
848cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned optional_bytes_remaining = PES_header_data_length;
849cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
850cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        uint64_t PTS = 0, DTS = 0;
851cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
852cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        if (PTS_DTS_flags == 2 || PTS_DTS_flags == 3) {
853e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            if (optional_bytes_remaining < 5u) {
854e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                return ERROR_MALFORMED;
855e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            }
856cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
8576456ae745e919085c5024f784aaa2703f9695f98David Yeh            if (br->getBits(4) != PTS_DTS_flags) {
8586456ae745e919085c5024f784aaa2703f9695f98David Yeh                return ERROR_MALFORMED;
8596456ae745e919085c5024f784aaa2703f9695f98David Yeh            }
860cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            PTS = ((uint64_t)br->getBits(3)) << 30;
861e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            if (br->getBits(1) != 1u) {
862e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                return ERROR_MALFORMED;
863e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            }
864cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            PTS |= ((uint64_t)br->getBits(15)) << 15;
865e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            if (br->getBits(1) != 1u) {
866e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                return ERROR_MALFORMED;
867e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            }
868cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            PTS |= br->getBits(15);
869e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            if (br->getBits(1) != 1u) {
870e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                return ERROR_MALFORMED;
871e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            }
872cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
873b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross            ALOGV("PTS = 0x%016" PRIx64 " (%.2f)", PTS, PTS / 90000.0);
874cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
875cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            optional_bytes_remaining -= 5;
876cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
877cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            if (PTS_DTS_flags == 3) {
878e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                if (optional_bytes_remaining < 5u) {
879e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                    return ERROR_MALFORMED;
880e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                }
881cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
882e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                if (br->getBits(4) != 1u) {
883e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                    return ERROR_MALFORMED;
884e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                }
885cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
886cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber                DTS = ((uint64_t)br->getBits(3)) << 30;
887e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                if (br->getBits(1) != 1u) {
888e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                    return ERROR_MALFORMED;
889e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                }
890cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber                DTS |= ((uint64_t)br->getBits(15)) << 15;
891e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                if (br->getBits(1) != 1u) {
892e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                    return ERROR_MALFORMED;
893e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                }
894cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber                DTS |= br->getBits(15);
895e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                if (br->getBits(1) != 1u) {
896e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                    return ERROR_MALFORMED;
897e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                }
898cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
899b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross                ALOGV("DTS = %" PRIu64, DTS);
900cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
901cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber                optional_bytes_remaining -= 5;
902cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            }
903cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        }
904cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
905cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        if (ESCR_flag) {
906e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            if (optional_bytes_remaining < 6u) {
907e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                return ERROR_MALFORMED;
908e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            }
909cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
910cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            br->getBits(2);
911cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
912cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            uint64_t ESCR = ((uint64_t)br->getBits(3)) << 30;
913e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            if (br->getBits(1) != 1u) {
914e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                return ERROR_MALFORMED;
915e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            }
916cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            ESCR |= ((uint64_t)br->getBits(15)) << 15;
917e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            if (br->getBits(1) != 1u) {
918e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                return ERROR_MALFORMED;
919e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            }
920cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            ESCR |= br->getBits(15);
921e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            if (br->getBits(1) != 1u) {
922e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                return ERROR_MALFORMED;
923e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            }
924cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
925b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross            ALOGV("ESCR = %" PRIu64, ESCR);
9266e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber            MY_LOGV("ESCR_extension = %u", br->getBits(9));
927cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
928e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            if (br->getBits(1) != 1u) {
929e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                return ERROR_MALFORMED;
930e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            }
931cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
932cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            optional_bytes_remaining -= 6;
933cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        }
934cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
935cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        if (ES_rate_flag) {
936e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            if (optional_bytes_remaining < 3u) {
937e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                return ERROR_MALFORMED;
938e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            }
939cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
940e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            if (br->getBits(1) != 1u) {
941e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                return ERROR_MALFORMED;
942e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            }
9436e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber            MY_LOGV("ES_rate = %u", br->getBits(22));
944e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            if (br->getBits(1) != 1u) {
945e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                return ERROR_MALFORMED;
946e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            }
947cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
948cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            optional_bytes_remaining -= 3;
949cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        }
950cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
951cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        br->skipBits(optional_bytes_remaining * 8);
952cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
953cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        // ES data follows.
954cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
955cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        if (PES_packet_length != 0) {
956e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            if (PES_packet_length < PES_header_data_length + 3) {
957e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                return ERROR_MALFORMED;
958e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            }
959cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
960cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            unsigned dataLength =
961cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber                PES_packet_length - 3 - PES_header_data_length;
962cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
9635403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber            if (br->numBitsLeft() < dataLength * 8) {
96429357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block                ALOGE("PES packet does not carry enough data to contain "
965b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross                     "payload. (numBitsLeft = %zu, required = %u)",
9665403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber                     br->numBitsLeft(), dataLength * 8);
9675403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber
9685403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber                return ERROR_MALFORMED;
9695403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber            }
9705403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber
971e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            if (br->numBitsLeft() < dataLength * 8) {
972e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                return ERROR_MALFORMED;
973e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            }
9740da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber
9750da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber            onPayloadData(
9760da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber                    PTS_DTS_flags, PTS, DTS, br->data(), dataLength);
977cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
978cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            br->skipBits(dataLength * 8);
979cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        } else {
9800da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber            onPayloadData(
9810da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber                    PTS_DTS_flags, PTS, DTS,
9820da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber                    br->data(), br->numBitsLeft() / 8);
9830da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber
984cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            size_t payloadSizeBits = br->numBitsLeft();
985e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            if (payloadSizeBits % 8 != 0u) {
986e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                return ERROR_MALFORMED;
987e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            }
988cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
989b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross            ALOGV("There's %zu bytes of payload.", payloadSizeBits / 8);
990cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        }
991cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    } else if (stream_id == 0xbe) {  // padding_stream
992e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        if (PES_packet_length == 0u) {
993e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            return ERROR_MALFORMED;
994e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        }
995cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        br->skipBits(PES_packet_length * 8);
996cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    } else {
997e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        if (PES_packet_length == 0u) {
998e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            return ERROR_MALFORMED;
999e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        }
1000cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        br->skipBits(PES_packet_length * 8);
1001cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
10025403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber
10035403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber    return OK;
1004cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
1005cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
10065403129e2a2f44620f2ac8109889e5a61be08732Andreas Huberstatus_t ATSParser::Stream::flush() {
1007cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    if (mBuffer->size() == 0) {
10085403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber        return OK;
1009cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
1010cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1011b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross    ALOGV("flushing stream 0x%04x size = %zu", mElementaryPID, mBuffer->size());
1012cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1013cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    ABitReader br(mBuffer->data(), mBuffer->size());
10145403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber
10155403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber    status_t err = parsePES(&br);
1016cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1017cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    mBuffer->setRange(0, 0);
10185403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber
10195403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber    return err;
1020cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
1021cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1022cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubervoid ATSParser::Stream::onPayloadData(
102384333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber        unsigned PTS_DTS_flags, uint64_t PTS, uint64_t /* DTS */,
1024cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        const uint8_t *data, size_t size) {
102590a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber#if 0
102690a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber    ALOGI("payload streamType 0x%02x, PTS = 0x%016llx, dPTS = %lld",
102790a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber          mStreamType,
102890a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber          PTS,
102990a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber          (int64_t)PTS - mPrevPTS);
103090a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber    mPrevPTS = PTS;
103190a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber#endif
103290a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber
10333856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("onPayloadData mStreamType=0x%02x", mStreamType);
1034cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
103598a46cf165d8de3779874eba01803bbc485f45b9Andreas Huber    int64_t timeUs = 0ll;  // no presentation timestamp available.
103698a46cf165d8de3779874eba01803bbc485f45b9Andreas Huber    if (PTS_DTS_flags == 2 || PTS_DTS_flags == 3) {
103798a46cf165d8de3779874eba01803bbc485f45b9Andreas Huber        timeUs = mProgram->convertPTSToTimestamp(PTS);
103898a46cf165d8de3779874eba01803bbc485f45b9Andreas Huber    }
103982f7321b03eec1e40af9d681370f754ee0279582Andreas Huber
1040386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    status_t err = mQueue->appendData(data, size, timeUs);
1041decd96988e495133e4a1728f612d4c9fdb4d218eAndreas Huber
1042be9634d071e79b72a42a4504f64eda9e2a0bceb8Marco Nelissen    if (mEOSReached) {
1043be9634d071e79b72a42a4504f64eda9e2a0bceb8Marco Nelissen        mQueue->signalEOS();
1044be9634d071e79b72a42a4504f64eda9e2a0bceb8Marco Nelissen    }
1045be9634d071e79b72a42a4504f64eda9e2a0bceb8Marco Nelissen
1046decd96988e495133e4a1728f612d4c9fdb4d218eAndreas Huber    if (err != OK) {
1047decd96988e495133e4a1728f612d4c9fdb4d218eAndreas Huber        return;
1048decd96988e495133e4a1728f612d4c9fdb4d218eAndreas Huber    }
104982f7321b03eec1e40af9d681370f754ee0279582Andreas Huber
10506a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber    sp<ABuffer> accessUnit;
1051386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    while ((accessUnit = mQueue->dequeueAccessUnit()) != NULL) {
10526a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber        if (mSource == NULL) {
1053386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            sp<MetaData> meta = mQueue->getFormat();
105482f7321b03eec1e40af9d681370f754ee0279582Andreas Huber
10556a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber            if (meta != NULL) {
10563856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                ALOGV("Stream PID 0x%08x of type 0x%02x now has data.",
1057386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                     mElementaryPID, mStreamType);
1058386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
1059309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih                const char *mime;
1060309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih                if (meta->findCString(kKeyMIMEType, &mime)
1061309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih                        && !strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_AVC)
1062309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih                        && !IsIDR(accessUnit)) {
1063309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih                    continue;
1064309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih                }
10656a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber                mSource = new AnotherPacketSource(meta);
10666a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber                mSource->queueAccessUnit(accessUnit);
106782f7321b03eec1e40af9d681370f754ee0279582Andreas Huber            }
1068386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        } else if (mQueue->getFormat() != NULL) {
10692a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber            // After a discontinuity we invalidate the queue's format
10702a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber            // and won't enqueue any access units to the source until
10712a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber            // the queue has reestablished the new format.
10725bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
10735bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            if (mSource->getFormat() == NULL) {
1074386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                mSource->setFormat(mQueue->getFormat());
10755bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            }
10766a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber            mSource->queueAccessUnit(accessUnit);
107782f7321b03eec1e40af9d681370f754ee0279582Andreas Huber        }
107882f7321b03eec1e40af9d681370f754ee0279582Andreas Huber    }
107982f7321b03eec1e40af9d681370f754ee0279582Andreas Huber}
108082f7321b03eec1e40af9d681370f754ee0279582Andreas Huber
1081cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubersp<MediaSource> ATSParser::Stream::getSource(SourceType type) {
1082386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    switch (type) {
1083386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        case VIDEO:
1084386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        {
10856e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber            if (isVideo()) {
1086386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                return mSource;
1087386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            }
1088386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            break;
1089386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        }
1090386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
1091386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        case AUDIO:
1092386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        {
10936e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber            if (isAudio()) {
1094386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                return mSource;
1095386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            }
1096386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            break;
1097386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        }
1098386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
10990852843d304006e3ab333081fddda13b07193de8Robert Shih        case META:
11000852843d304006e3ab333081fddda13b07193de8Robert Shih        {
11010852843d304006e3ab333081fddda13b07193de8Robert Shih            if (isMeta()) {
11020852843d304006e3ab333081fddda13b07193de8Robert Shih                return mSource;
11030852843d304006e3ab333081fddda13b07193de8Robert Shih            }
11040852843d304006e3ab333081fddda13b07193de8Robert Shih            break;
11050852843d304006e3ab333081fddda13b07193de8Robert Shih        }
11060852843d304006e3ab333081fddda13b07193de8Robert Shih
1107386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        default:
1108386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            break;
1109cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
1110cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1111cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    return NULL;
1112cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
1113cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1114cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber////////////////////////////////////////////////////////////////////////////////
1115cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1116c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas HuberATSParser::ATSParser(uint32_t flags)
111787f2a558dd12043631e12c361abef301bf603140Andreas Huber    : mFlags(flags),
111887f2a558dd12043631e12c361abef301bf603140Andreas Huber      mAbsoluteTimeAnchorUs(-1ll),
1119d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber      mTimeOffsetValid(false),
1120d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber      mTimeOffsetUs(0ll),
1121d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang      mLastRecoveredPTS(-1ll),
112287f2a558dd12043631e12c361abef301bf603140Andreas Huber      mNumTSPacketsParsed(0),
112387f2a558dd12043631e12c361abef301bf603140Andreas Huber      mNumPCRs(0) {
11248dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    mPSISections.add(0 /* PID */, new PSISection);
1125cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
1126cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1127cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas HuberATSParser::~ATSParser() {
1128cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
1129cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
113006528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huberstatus_t ATSParser::feedTSPacket(const void *data, size_t size) {
1131e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim    if (size != kTSPacketSize) {
1132e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        ALOGE("Wrong TS packet size");
1133e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        return BAD_VALUE;
1134e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim    }
1135cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1136cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    ABitReader br((const uint8_t *)data, kTSPacketSize);
113706528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber    return parseTS(&br);
1138cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
1139cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
114032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Hubervoid ATSParser::signalDiscontinuity(
114132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        DiscontinuityType type, const sp<AMessage> &extra) {
1142b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber    int64_t mediaTimeUs;
1143d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang    if ((type & DISCONTINUITY_TIME) && extra != NULL) {
1144d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang        if (extra->findInt64(IStreamListener::kKeyMediaTimeUs, &mediaTimeUs)) {
1145d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang            mAbsoluteTimeAnchorUs = mediaTimeUs;
1146d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang        }
1147d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang        if ((mFlags & TS_TIMESTAMPS_ARE_ABSOLUTE)
1148d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang                && extra->findInt64(
1149d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang                    IStreamListener::kKeyRecentMediaTimeUs, &mediaTimeUs)) {
1150d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang            if (mAbsoluteTimeAnchorUs >= 0ll) {
1151d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang                mediaTimeUs -= mAbsoluteTimeAnchorUs;
1152d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang            }
1153d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang            if (mTimeOffsetValid) {
1154d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang                mediaTimeUs -= mTimeOffsetUs;
1155d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang            }
1156d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang            mLastRecoveredPTS = (mediaTimeUs * 9) / 100;
1157d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang        }
1158b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber    } else if (type == DISCONTINUITY_ABSOLUTE_TIME) {
115987f2a558dd12043631e12c361abef301bf603140Andreas Huber        int64_t timeUs;
1160e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        if (!extra->findInt64("timeUs", &timeUs)) {
1161e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            ALOGE("timeUs not found");
1162e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            return;
1163e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        }
116487f2a558dd12043631e12c361abef301bf603140Andreas Huber
1165e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        if (!mPrograms.empty()) {
1166e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            ALOGE("mPrograms is not empty");
1167e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            return;
1168e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        }
116987f2a558dd12043631e12c361abef301bf603140Andreas Huber        mAbsoluteTimeAnchorUs = timeUs;
117087f2a558dd12043631e12c361abef301bf603140Andreas Huber        return;
1171d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber    } else if (type == DISCONTINUITY_TIME_OFFSET) {
1172d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber        int64_t offset;
1173e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        if (!extra->findInt64("offset", &offset)) {
1174e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            ALOGE("offset not found");
1175e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            return;
1176e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        }
1177d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber
1178d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber        mTimeOffsetValid = true;
1179d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber        mTimeOffsetUs = offset;
1180d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber        return;
118187f2a558dd12043631e12c361abef301bf603140Andreas Huber    }
118287f2a558dd12043631e12c361abef301bf603140Andreas Huber
1183f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    for (size_t i = 0; i < mPrograms.size(); ++i) {
118432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        mPrograms.editItemAt(i)->signalDiscontinuity(type, extra);
1185f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
1186f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
1187f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1188f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ATSParser::signalEOS(status_t finalResult) {
1189e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim    if (finalResult == (status_t) OK) {
1190e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        ALOGE("finalResult not OK");
1191e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        return;
1192e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim    }
1193f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
11942a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    for (size_t i = 0; i < mPrograms.size(); ++i) {
1195f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        mPrograms.editItemAt(i)->signalEOS(finalResult);
11962a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    }
11972a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber}
11982a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber
1199cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubervoid ATSParser::parseProgramAssociationTable(ABitReader *br) {
1200cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned table_id = br->getBits(8);
12013856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("  table_id = %u", table_id);
12026456ae745e919085c5024f784aaa2703f9695f98David Yeh    if (table_id != 0x00u) {
12036456ae745e919085c5024f784aaa2703f9695f98David Yeh        ALOGE("PAT data error!");
12046456ae745e919085c5024f784aaa2703f9695f98David Yeh        return ;
12056456ae745e919085c5024f784aaa2703f9695f98David Yeh    }
1206cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned section_syntax_indictor = br->getBits(1);
12073856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("  section_syntax_indictor = %u", section_syntax_indictor);
1208cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1209e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim    br->skipBits(1);  // '0'
12106e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  reserved = %u", br->getBits(2));
1211cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1212cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned section_length = br->getBits(12);
12133856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("  section_length = %u", section_length);
1214cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
12156e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  transport_stream_id = %u", br->getBits(16));
12166e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  reserved = %u", br->getBits(2));
12176e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  version_number = %u", br->getBits(5));
12186e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  current_next_indicator = %u", br->getBits(1));
12196e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  section_number = %u", br->getBits(8));
12206e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  last_section_number = %u", br->getBits(8));
1221cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1222cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    size_t numProgramBytes = (section_length - 5 /* header */ - 4 /* crc */);
1223cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1224cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    for (size_t i = 0; i < numProgramBytes / 4; ++i) {
1225cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned program_number = br->getBits(16);
12263856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("    program_number = %u", program_number);
1227cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
12286e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber        MY_LOGV("    reserved = %u", br->getBits(3));
1229cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1230cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        if (program_number == 0) {
12316e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber            MY_LOGV("    network_PID = 0x%04x", br->getBits(13));
1232cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        } else {
1233cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            unsigned programMapPID = br->getBits(13);
1234cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
12353856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("    program_map_PID = 0x%04x", programMapPID);
1236cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1237386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            bool found = false;
1238386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            for (size_t index = 0; index < mPrograms.size(); ++index) {
1239386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                const sp<Program> &program = mPrograms.itemAt(index);
1240386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
1241386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                if (program->number() == program_number) {
1242386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                    program->updateProgramMapPID(programMapPID);
1243386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                    found = true;
1244386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                    break;
1245386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                }
1246386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            }
1247386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
1248386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            if (!found) {
1249386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                mPrograms.push(
1250d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang                        new Program(this, program_number, programMapPID, mLastRecoveredPTS));
1251386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            }
12528dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
12538dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            if (mPSISections.indexOfKey(programMapPID) < 0) {
12548dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                mPSISections.add(programMapPID, new PSISection);
12558dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            }
1256cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        }
1257cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
1258cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
12596e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  CRC = 0x%08x", br->getBits(32));
1260cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
1261cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
126206528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huberstatus_t ATSParser::parsePID(
1263cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        ABitReader *br, unsigned PID,
126487f2a558dd12043631e12c361abef301bf603140Andreas Huber        unsigned continuity_counter,
1265cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned payload_unit_start_indicator) {
12668dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    ssize_t sectionIndex = mPSISections.indexOfKey(PID);
12678dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
12688dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    if (sectionIndex >= 0) {
12694b4bb11b8747adeb2efe56c7df4ab6803dd7db41Andreas Huber        sp<PSISection> section = mPSISections.valueAt(sectionIndex);
12708dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
1271cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        if (payload_unit_start_indicator) {
12726456ae745e919085c5024f784aaa2703f9695f98David Yeh            if (!section->isEmpty()) {
12739bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                ALOGW("parsePID encounters payload_unit_start_indicator when section is not empty");
12749bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                section->clear();
12756456ae745e919085c5024f784aaa2703f9695f98David Yeh            }
12768dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
1277cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            unsigned skip = br->getBits(8);
12789ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim            section->setSkipBytes(skip + 1);  // skip filler bytes + pointer field itself
1279cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            br->skipBits(skip * 8);
1280cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        }
12818dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
1282e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        if (br->numBitsLeft() % 8 != 0) {
1283e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            return ERROR_MALFORMED;
1284e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        }
12858dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        status_t err = section->append(br->data(), br->numBitsLeft() / 8);
12868dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
12878dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        if (err != OK) {
12888dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            return err;
12898dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        }
12908dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
12918dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        if (!section->isComplete()) {
12928dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            return OK;
12938dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        }
12948dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
12959ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim        if (!section->isCRCOkay()) {
12969ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim            return BAD_VALUE;
12979ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim        }
12988dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        ABitReader sectionBits(section->data(), section->size());
12998dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
13008dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        if (PID == 0) {
13018dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            parseProgramAssociationTable(&sectionBits);
13028dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        } else {
13038dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            bool handled = false;
13048dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            for (size_t i = 0; i < mPrograms.size(); ++i) {
13058dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                status_t err;
13068dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                if (!mPrograms.editItemAt(i)->parsePSISection(
13078dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                            PID, &sectionBits, &err)) {
13088dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                    continue;
13098dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                }
13108dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
13118dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                if (err != OK) {
13128dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                    return err;
13138dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                }
13148dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
13158dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                handled = true;
13168dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                break;
13178dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            }
13188dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
13198dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            if (!handled) {
13208dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                mPSISections.removeItem(PID);
13214b4bb11b8747adeb2efe56c7df4ab6803dd7db41Andreas Huber                section.clear();
13228dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            }
13238dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        }
13248dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
13254b4bb11b8747adeb2efe56c7df4ab6803dd7db41Andreas Huber        if (section != NULL) {
13264b4bb11b8747adeb2efe56c7df4ab6803dd7db41Andreas Huber            section->clear();
13274b4bb11b8747adeb2efe56c7df4ab6803dd7db41Andreas Huber        }
13288dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
132906528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber        return OK;
1330cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
1331cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1332cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    bool handled = false;
1333cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    for (size_t i = 0; i < mPrograms.size(); ++i) {
133406528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber        status_t err;
1335cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        if (mPrograms.editItemAt(i)->parsePID(
133687f2a558dd12043631e12c361abef301bf603140Andreas Huber                    PID, continuity_counter, payload_unit_start_indicator,
133787f2a558dd12043631e12c361abef301bf603140Andreas Huber                    br, &err)) {
133806528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber            if (err != OK) {
133906528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber                return err;
134006528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber            }
134106528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber
1342cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            handled = true;
1343cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            break;
1344cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        }
1345cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
1346cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1347cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    if (!handled) {
13483856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("PID 0x%04x not handled.", PID);
1349cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
135006528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber
135106528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber    return OK;
1352cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
1353cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1354e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kimstatus_t ATSParser::parseAdaptationField(ABitReader *br, unsigned PID) {
1355cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned adaptation_field_length = br->getBits(8);
135687f2a558dd12043631e12c361abef301bf603140Andreas Huber
1357cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    if (adaptation_field_length > 0) {
135887f2a558dd12043631e12c361abef301bf603140Andreas Huber        unsigned discontinuity_indicator = br->getBits(1);
135987f2a558dd12043631e12c361abef301bf603140Andreas Huber
136087f2a558dd12043631e12c361abef301bf603140Andreas Huber        if (discontinuity_indicator) {
136187f2a558dd12043631e12c361abef301bf603140Andreas Huber            ALOGV("PID 0x%04x: discontinuity_indicator = 1 (!!!)", PID);
136287f2a558dd12043631e12c361abef301bf603140Andreas Huber        }
136387f2a558dd12043631e12c361abef301bf603140Andreas Huber
136487f2a558dd12043631e12c361abef301bf603140Andreas Huber        br->skipBits(2);
136587f2a558dd12043631e12c361abef301bf603140Andreas Huber        unsigned PCR_flag = br->getBits(1);
136687f2a558dd12043631e12c361abef301bf603140Andreas Huber
136787f2a558dd12043631e12c361abef301bf603140Andreas Huber        size_t numBitsRead = 4;
136887f2a558dd12043631e12c361abef301bf603140Andreas Huber
136987f2a558dd12043631e12c361abef301bf603140Andreas Huber        if (PCR_flag) {
1370e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            if (adaptation_field_length * 8 < 52) {
1371e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                return ERROR_MALFORMED;
1372e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            }
137387f2a558dd12043631e12c361abef301bf603140Andreas Huber            br->skipBits(4);
137487f2a558dd12043631e12c361abef301bf603140Andreas Huber            uint64_t PCR_base = br->getBits(32);
137587f2a558dd12043631e12c361abef301bf603140Andreas Huber            PCR_base = (PCR_base << 1) | br->getBits(1);
137687f2a558dd12043631e12c361abef301bf603140Andreas Huber
137787f2a558dd12043631e12c361abef301bf603140Andreas Huber            br->skipBits(6);
137887f2a558dd12043631e12c361abef301bf603140Andreas Huber            unsigned PCR_ext = br->getBits(9);
137987f2a558dd12043631e12c361abef301bf603140Andreas Huber
138087f2a558dd12043631e12c361abef301bf603140Andreas Huber            // The number of bytes from the start of the current
138187f2a558dd12043631e12c361abef301bf603140Andreas Huber            // MPEG2 transport stream packet up and including
138287f2a558dd12043631e12c361abef301bf603140Andreas Huber            // the final byte of this PCR_ext field.
138387f2a558dd12043631e12c361abef301bf603140Andreas Huber            size_t byteOffsetFromStartOfTSPacket =
138487f2a558dd12043631e12c361abef301bf603140Andreas Huber                (188 - br->numBitsLeft() / 8);
138587f2a558dd12043631e12c361abef301bf603140Andreas Huber
138687f2a558dd12043631e12c361abef301bf603140Andreas Huber            uint64_t PCR = PCR_base * 300 + PCR_ext;
138787f2a558dd12043631e12c361abef301bf603140Andreas Huber
1388b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross            ALOGV("PID 0x%04x: PCR = 0x%016" PRIx64 " (%.2f)",
138987f2a558dd12043631e12c361abef301bf603140Andreas Huber                  PID, PCR, PCR / 27E6);
139087f2a558dd12043631e12c361abef301bf603140Andreas Huber
139187f2a558dd12043631e12c361abef301bf603140Andreas Huber            // The number of bytes received by this parser up to and
139287f2a558dd12043631e12c361abef301bf603140Andreas Huber            // including the final byte of this PCR_ext field.
139387f2a558dd12043631e12c361abef301bf603140Andreas Huber            size_t byteOffsetFromStart =
139487f2a558dd12043631e12c361abef301bf603140Andreas Huber                mNumTSPacketsParsed * 188 + byteOffsetFromStartOfTSPacket;
139587f2a558dd12043631e12c361abef301bf603140Andreas Huber
139687f2a558dd12043631e12c361abef301bf603140Andreas Huber            for (size_t i = 0; i < mPrograms.size(); ++i) {
139787f2a558dd12043631e12c361abef301bf603140Andreas Huber                updatePCR(PID, PCR, byteOffsetFromStart);
139887f2a558dd12043631e12c361abef301bf603140Andreas Huber            }
139987f2a558dd12043631e12c361abef301bf603140Andreas Huber
140087f2a558dd12043631e12c361abef301bf603140Andreas Huber            numBitsRead += 52;
140187f2a558dd12043631e12c361abef301bf603140Andreas Huber        }
140287f2a558dd12043631e12c361abef301bf603140Andreas Huber
140387f2a558dd12043631e12c361abef301bf603140Andreas Huber        br->skipBits(adaptation_field_length * 8 - numBitsRead);
1404cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
1405e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim    return OK;
1406cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
1407cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
140806528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huberstatus_t ATSParser::parseTS(ABitReader *br) {
14093856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("---");
1410cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1411cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned sync_byte = br->getBits(8);
14126456ae745e919085c5024f784aaa2703f9695f98David Yeh    if (sync_byte != 0x47u) {
14136456ae745e919085c5024f784aaa2703f9695f98David Yeh        ALOGE("[error] parseTS: return error as sync_byte=0x%x", sync_byte);
14146456ae745e919085c5024f784aaa2703f9695f98David Yeh        return BAD_VALUE;
14156456ae745e919085c5024f784aaa2703f9695f98David Yeh    }
1416cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
141752668ca838e1869676ff95e7388f93ec1858b1e9Andreas Huber    if (br->getBits(1)) {  // transport_error_indicator
141852668ca838e1869676ff95e7388f93ec1858b1e9Andreas Huber        // silently ignore.
141952668ca838e1869676ff95e7388f93ec1858b1e9Andreas Huber        return OK;
142052668ca838e1869676ff95e7388f93ec1858b1e9Andreas Huber    }
1421cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1422cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned payload_unit_start_indicator = br->getBits(1);
14233856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("payload_unit_start_indicator = %u", payload_unit_start_indicator);
1424cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
14256e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("transport_priority = %u", br->getBits(1));
1426cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1427cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned PID = br->getBits(13);
14283856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("PID = 0x%04x", PID);
1429cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
14306e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("transport_scrambling_control = %u", br->getBits(2));
1431cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1432cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned adaptation_field_control = br->getBits(2);
14333856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("adaptation_field_control = %u", adaptation_field_control);
1434cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
14350da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber    unsigned continuity_counter = br->getBits(4);
143687f2a558dd12043631e12c361abef301bf603140Andreas Huber    ALOGV("PID = 0x%04x, continuity_counter = %u", PID, continuity_counter);
14370da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber
1438df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block    // ALOGI("PID = 0x%04x, continuity_counter = %u", PID, continuity_counter);
1439cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
144087f2a558dd12043631e12c361abef301bf603140Andreas Huber    status_t err = OK;
144187f2a558dd12043631e12c361abef301bf603140Andreas Huber
1442e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim    if (adaptation_field_control == 2 || adaptation_field_control == 3) {
1443e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        err = parseAdaptationField(br, PID);
1444e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim    }
1445e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim    if (err == OK) {
1446e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        if (adaptation_field_control == 1 || adaptation_field_control == 3) {
1447e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            err = parsePID(
1448e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                    br, PID, continuity_counter, payload_unit_start_indicator);
1449e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        }
1450cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
145106528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber
145287f2a558dd12043631e12c361abef301bf603140Andreas Huber    ++mNumTSPacketsParsed;
145387f2a558dd12043631e12c361abef301bf603140Andreas Huber
145487f2a558dd12043631e12c361abef301bf603140Andreas Huber    return err;
1455cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
1456cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1457cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubersp<MediaSource> ATSParser::getSource(SourceType type) {
1458386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    int which = -1;  // any
1459386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
1460cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    for (size_t i = 0; i < mPrograms.size(); ++i) {
1461386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        const sp<Program> &program = mPrograms.editItemAt(i);
1462386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
1463386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        if (which >= 0 && (int)program->number() != which) {
1464386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            continue;
1465386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        }
1466386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
1467386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        sp<MediaSource> source = program->getSource(type);
1468cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1469cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        if (source != NULL) {
1470cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            return source;
1471cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        }
1472cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
1473cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1474cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    return NULL;
1475cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
1476cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1477bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shihbool ATSParser::hasSource(SourceType type) const {
1478bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih    for (size_t i = 0; i < mPrograms.size(); ++i) {
1479bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih        const sp<Program> &program = mPrograms.itemAt(i);
1480bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih        if (program->hasSource(type)) {
1481bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih            return true;
1482bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih        }
1483bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih    }
1484bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih
1485bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih    return false;
1486bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih}
1487bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih
148843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huberbool ATSParser::PTSTimeDeltaEstablished() {
148943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    if (mPrograms.isEmpty()) {
149043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        return false;
149143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    }
149243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
149343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    return mPrograms.editItemAt(0)->PTSTimeDeltaEstablished();
149443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber}
149543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
149687f2a558dd12043631e12c361abef301bf603140Andreas Hubervoid ATSParser::updatePCR(
149784333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber        unsigned /* PID */, uint64_t PCR, size_t byteOffsetFromStart) {
1498b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross    ALOGV("PCR 0x%016" PRIx64 " @ %zu", PCR, byteOffsetFromStart);
149987f2a558dd12043631e12c361abef301bf603140Andreas Huber
150087f2a558dd12043631e12c361abef301bf603140Andreas Huber    if (mNumPCRs == 2) {
150187f2a558dd12043631e12c361abef301bf603140Andreas Huber        mPCR[0] = mPCR[1];
150287f2a558dd12043631e12c361abef301bf603140Andreas Huber        mPCRBytes[0] = mPCRBytes[1];
150387f2a558dd12043631e12c361abef301bf603140Andreas Huber        mSystemTimeUs[0] = mSystemTimeUs[1];
150487f2a558dd12043631e12c361abef301bf603140Andreas Huber        mNumPCRs = 1;
150587f2a558dd12043631e12c361abef301bf603140Andreas Huber    }
150687f2a558dd12043631e12c361abef301bf603140Andreas Huber
150787f2a558dd12043631e12c361abef301bf603140Andreas Huber    mPCR[mNumPCRs] = PCR;
150887f2a558dd12043631e12c361abef301bf603140Andreas Huber    mPCRBytes[mNumPCRs] = byteOffsetFromStart;
150987f2a558dd12043631e12c361abef301bf603140Andreas Huber    mSystemTimeUs[mNumPCRs] = ALooper::GetNowUs();
151087f2a558dd12043631e12c361abef301bf603140Andreas Huber
151187f2a558dd12043631e12c361abef301bf603140Andreas Huber    ++mNumPCRs;
151287f2a558dd12043631e12c361abef301bf603140Andreas Huber
151387f2a558dd12043631e12c361abef301bf603140Andreas Huber    if (mNumPCRs == 2) {
151487f2a558dd12043631e12c361abef301bf603140Andreas Huber        double transportRate =
151587f2a558dd12043631e12c361abef301bf603140Andreas Huber            (mPCRBytes[1] - mPCRBytes[0]) * 27E6 / (mPCR[1] - mPCR[0]);
151687f2a558dd12043631e12c361abef301bf603140Andreas Huber
151787f2a558dd12043631e12c361abef301bf603140Andreas Huber        ALOGV("transportRate = %.2f bytes/sec", transportRate);
151887f2a558dd12043631e12c361abef301bf603140Andreas Huber    }
151987f2a558dd12043631e12c361abef301bf603140Andreas Huber}
152087f2a558dd12043631e12c361abef301bf603140Andreas Huber
15218dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber////////////////////////////////////////////////////////////////////////////////
15228dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
15239ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim
15249ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim// CRC32 used for PSI section. The table was generated by following command:
15259ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim// $ python pycrc.py --model crc-32-mpeg --algorithm table-driven --generate c
15269ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim// Visit http://www.tty1.net/pycrc/index_en.html for more details.
15279ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kimuint32_t ATSParser::PSISection::CRC_TABLE[] = {
15289ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9,
15299ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x130476dc, 0x17c56b6b, 0x1a864db2, 0x1e475005,
15309ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61,
15319ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd,
15329ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9,
15339ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75,
15349ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011,
15359ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x791d4014, 0x7ddc5da3, 0x709f7b7a, 0x745e66cd,
15369ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039,
15379ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5,
15389ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xbe2b5b58, 0xbaea46ef, 0xb7a96036, 0xb3687d81,
15399ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d,
15409ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49,
15419ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95,
15429ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1,
15439ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d,
15449ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x34867077, 0x30476dc0, 0x3d044b19, 0x39c556ae,
15459ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072,
15469ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16,
15479ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca,
15489ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde,
15499ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02,
15509ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x5e9f46bf, 0x5a5e5b08, 0x571d7dd1, 0x53dc6066,
15519ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,
15529ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e,
15539ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xbfa1b04b, 0xbb60adfc, 0xb6238b25, 0xb2e29692,
15549ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6,
15559ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a,
15569ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e,
15579ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2,
15589ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686,
15599ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xd5b88683, 0xd1799b34, 0xdc3abded, 0xd8fba05a,
15609ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637,
15619ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb,
15629ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f,
15639ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53,
15649ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47,
15659ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x36194d42, 0x32d850f5, 0x3f9b762c, 0x3b5a6b9b,
15669ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff,
15679ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623,
15689ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xf12f560e, 0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7,
15699ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b,
15709ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f,
15719ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3,
15729ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7,
15739ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b,
15749ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x9b3660c6, 0x9ff77d71, 0x92b45ba8, 0x9675461f,
15759ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3,
15769ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640,
15779ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c,
15789ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8,
15799ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24,
15809ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x119b4be9, 0x155a565e, 0x18197087, 0x1cd86d30,
15819ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec,
15829ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088,
15839ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x2497d08d, 0x2056cd3a, 0x2d15ebe3, 0x29d4f654,
15849ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0,
15859ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c,
15869ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18,
15879ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4,
15889ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0,
15899ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x9abc8bd5, 0x9e7d9662, 0x933eb0bb, 0x97ffad0c,
15909ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668,
15919ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4
15929ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    };
15939ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim
15949ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk KimATSParser::PSISection::PSISection() :
15959ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    mSkipBytes(0) {
15968dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber}
15978dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
15988dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas HuberATSParser::PSISection::~PSISection() {
15998dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber}
16008dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
16018dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberstatus_t ATSParser::PSISection::append(const void *data, size_t size) {
16028dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    if (mBuffer == NULL || mBuffer->size() + size > mBuffer->capacity()) {
16038dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        size_t newCapacity =
16048dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            (mBuffer == NULL) ? size : mBuffer->capacity() + size;
16058dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
16068dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        newCapacity = (newCapacity + 1023) & ~1023;
16078dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
16088dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        sp<ABuffer> newBuffer = new ABuffer(newCapacity);
16098dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
16108dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        if (mBuffer != NULL) {
16118dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            memcpy(newBuffer->data(), mBuffer->data(), mBuffer->size());
16128dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            newBuffer->setRange(0, mBuffer->size());
16138dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        } else {
16148dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            newBuffer->setRange(0, 0);
16158dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        }
16168dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
16178dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        mBuffer = newBuffer;
16188dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    }
16198dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
16208dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    memcpy(mBuffer->data() + mBuffer->size(), data, size);
16218dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    mBuffer->setRange(0, mBuffer->size() + size);
16228dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
16238dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    return OK;
16248dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber}
16258dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
16269ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kimvoid ATSParser::PSISection::setSkipBytes(uint8_t skip) {
16279ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    mSkipBytes = skip;
16289ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim}
16299ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim
16308dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Hubervoid ATSParser::PSISection::clear() {
16318dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    if (mBuffer != NULL) {
16328dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        mBuffer->setRange(0, 0);
16338dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    }
16349ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    mSkipBytes = 0;
16358dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber}
16368dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
16378dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberbool ATSParser::PSISection::isComplete() const {
16388dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    if (mBuffer == NULL || mBuffer->size() < 3) {
16398dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        return false;
16408dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    }
16418dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
16428dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    unsigned sectionLength = U16_AT(mBuffer->data() + 1) & 0xfff;
16438dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    return mBuffer->size() >= sectionLength + 3;
16448dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber}
16458dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
16468dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberbool ATSParser::PSISection::isEmpty() const {
16478dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    return mBuffer == NULL || mBuffer->size() == 0;
16488dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber}
16498dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
16508dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberconst uint8_t *ATSParser::PSISection::data() const {
16518dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    return mBuffer == NULL ? NULL : mBuffer->data();
16528dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber}
16538dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
16548dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Hubersize_t ATSParser::PSISection::size() const {
16558dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    return mBuffer == NULL ? 0 : mBuffer->size();
16568dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber}
16578dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
16589ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kimbool ATSParser::PSISection::isCRCOkay() const {
16599ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    if (!isComplete()) {
16609ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim        return false;
16619ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    }
16629ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    uint8_t* data = mBuffer->data();
16639ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim
16649ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    // Return true if section_syntax_indicator says no section follows the field section_length.
16659ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    if ((data[1] & 0x80) == 0) {
16669ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim        return true;
16679ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    }
16689ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim
16699ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    unsigned sectionLength = U16_AT(data + 1) & 0xfff;
16709ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    ALOGV("sectionLength %u, skip %u", sectionLength, mSkipBytes);
16719ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim
16729ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    // Skip the preceding field present when payload start indicator is on.
16739ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    sectionLength -= mSkipBytes;
16749ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim
16759ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    uint32_t crc = 0xffffffff;
16769ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    for(unsigned i = 0; i < sectionLength + 4 /* crc */; i++) {
16779ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim        uint8_t b = data[i];
16789ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim        int index = ((crc >> 24) ^ (b & 0xff)) & 0xff;
16799ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim        crc = CRC_TABLE[index] ^ (crc << 8);
16809ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    }
16819ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    ALOGV("crc: %08x\n", crc);
16829ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    return (crc == 0);
16839ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim}
1684cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}  // namespace android
1685