ATSParser.cpp revision 0852843d304006e3ab333081fddda13b07193de8
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());
3059bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                CHECK(index >= 0);
3069bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                Vector<int32_t> &newPIDs = newType2PIDs.editValueAt(index);
3079bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                CHECK(newPIDs.size() > 0);
3089bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang
3099bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                // get the next PID for temp[i]->type() in the new PID map
3109bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                Vector<int32_t>::iterator it = newPIDs.begin();
3119bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang
3129bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                // change the PID of the stream, and add it back
3139bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                temp.editValueAt(i)->setPID(*it);
3149bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                mStreams.add(temp[i]->pid(), temp.editValueAt(i));
3159bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang
3169bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                // removed the used PID
3179bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                newPIDs.erase(it);
3189bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            }
3199bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        }
3209bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang    }
3219bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang    return success;
3229bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang}
323bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber
32406528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huberstatus_t ATSParser::Program::parseProgramMap(ABitReader *br) {
325cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned table_id = br->getBits(8);
3263856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("  table_id = %u", table_id);
3276456ae745e919085c5024f784aaa2703f9695f98David Yeh    if (table_id != 0x02u) {
3286456ae745e919085c5024f784aaa2703f9695f98David Yeh        ALOGE("PMT data error!");
3296456ae745e919085c5024f784aaa2703f9695f98David Yeh        return ERROR_MALFORMED;
3306456ae745e919085c5024f784aaa2703f9695f98David Yeh    }
3316e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    unsigned section_syntax_indicator = br->getBits(1);
3323856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("  section_syntax_indicator = %u", section_syntax_indicator);
3336456ae745e919085c5024f784aaa2703f9695f98David Yeh    if (section_syntax_indicator != 1u) {
3346456ae745e919085c5024f784aaa2703f9695f98David Yeh        ALOGE("PMT data error!");
3356456ae745e919085c5024f784aaa2703f9695f98David Yeh        return ERROR_MALFORMED;
3366456ae745e919085c5024f784aaa2703f9695f98David Yeh    }
337cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
338cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    CHECK_EQ(br->getBits(1), 0u);
3396e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  reserved = %u", br->getBits(2));
340cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
341cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned section_length = br->getBits(12);
3423856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("  section_length = %u", section_length);
343f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK_EQ(section_length & 0xc00, 0u);
344cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    CHECK_LE(section_length, 1021u);
345cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
3466e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  program_number = %u", br->getBits(16));
3476e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  reserved = %u", br->getBits(2));
3486e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  version_number = %u", br->getBits(5));
3496e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  current_next_indicator = %u", br->getBits(1));
3506e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  section_number = %u", br->getBits(8));
3516e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  last_section_number = %u", br->getBits(8));
3526e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  reserved = %u", br->getBits(3));
35387f2a558dd12043631e12c361abef301bf603140Andreas Huber
35487f2a558dd12043631e12c361abef301bf603140Andreas Huber    unsigned PCR_PID = br->getBits(13);
35587f2a558dd12043631e12c361abef301bf603140Andreas Huber    ALOGV("  PCR_PID = 0x%04x", PCR_PID);
35687f2a558dd12043631e12c361abef301bf603140Andreas Huber
3576e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  reserved = %u", br->getBits(4));
358cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
359cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned program_info_length = br->getBits(12);
3603856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("  program_info_length = %u", program_info_length);
361f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK_EQ(program_info_length & 0xc00, 0u);
362cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
363cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    br->skipBits(program_info_length * 8);  // skip descriptors
364cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
365bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber    Vector<StreamInfo> infos;
366bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber
367cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    // infoBytesRemaining is the number of bytes that make up the
368cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    // variable length section of ES_infos. It does not include the
369cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    // final CRC.
370cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    size_t infoBytesRemaining = section_length - 9 - program_info_length - 4;
371cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
372cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    while (infoBytesRemaining > 0) {
373cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        CHECK_GE(infoBytesRemaining, 5u);
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);
387f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        CHECK_EQ(ES_info_length & 0xc00, 0u);
388cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
389cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        CHECK_GE(infoBytesRemaining - 5, ES_info_length);
390cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
391cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#if 0
392cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        br->skipBits(ES_info_length * 8);  // skip descriptors
393cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#else
394cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned info_bytes_remaining = ES_info_length;
395cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        while (info_bytes_remaining >= 2) {
3966e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber            MY_LOGV("      tag = 0x%02x", br->getBits(8));
397cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
398cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            unsigned descLength = br->getBits(8);
3993856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("      len = %u", descLength);
400cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
401cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            CHECK_GE(info_bytes_remaining, 2 + descLength);
402cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
403cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            br->skipBits(descLength * 8);
404cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
405cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            info_bytes_remaining -= descLength + 2;
406cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        }
407cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        CHECK_EQ(info_bytes_remaining, 0u);
408cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#endif
409cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
410bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        StreamInfo info;
411bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        info.mType = streamType;
412bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        info.mPID = elementaryPID;
413bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        infos.push(info);
414cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
415cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        infoBytesRemaining -= 5 + ES_info_length;
416cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
417cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
418cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    CHECK_EQ(infoBytesRemaining, 0u);
4196e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  CRC = 0x%08x", br->getBits(32));
420bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber
421bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber    bool PIDsChanged = false;
422bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber    for (size_t i = 0; i < infos.size(); ++i) {
423bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        StreamInfo &info = infos.editItemAt(i);
424bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber
425bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        ssize_t index = mStreams.indexOfKey(info.mPID);
426bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber
427bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        if (index >= 0 && mStreams.editValueAt(index)->type() != info.mType) {
428df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block            ALOGI("uh oh. stream PIDs have changed.");
429bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber            PIDsChanged = true;
430bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber            break;
431bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        }
432bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber    }
433bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber
434bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber    if (PIDsChanged) {
43506528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber#if 0
436df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block        ALOGI("before:");
43706528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber        for (size_t i = 0; i < mStreams.size(); ++i) {
43806528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber            sp<Stream> stream = mStreams.editValueAt(i);
43906528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber
440df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block            ALOGI("PID 0x%08x => type 0x%02x", stream->pid(), stream->type());
44106528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber        }
44206528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber
443df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block        ALOGI("after:");
44406528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber        for (size_t i = 0; i < infos.size(); ++i) {
44506528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber            StreamInfo &info = infos.editItemAt(i);
44606528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber
447df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block            ALOGI("PID 0x%08x => type 0x%02x", info.mPID, info.mType);
44806528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber        }
44906528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber#endif
45006528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber
4519bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        // we can recover if number of streams for each type remain the same
4529bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        bool success = switchPIDs(infos);
45306528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber
45406528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber        if (!success) {
455df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block            ALOGI("Stream PIDs changed and we cannot recover.");
45606528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber            return ERROR_MALFORMED;
45706528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber        }
458bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber    }
459bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber
460bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber    for (size_t i = 0; i < infos.size(); ++i) {
461bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        StreamInfo &info = infos.editItemAt(i);
462bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber
463bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        ssize_t index = mStreams.indexOfKey(info.mPID);
464bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber
465bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        if (index < 0) {
46687f2a558dd12043631e12c361abef301bf603140Andreas Huber            sp<Stream> stream = new Stream(
46787f2a558dd12043631e12c361abef301bf603140Andreas Huber                    this, info.mPID, info.mType, PCR_PID);
46887f2a558dd12043631e12c361abef301bf603140Andreas Huber
469bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber            mStreams.add(info.mPID, stream);
470bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        }
471bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber    }
47206528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber
47306528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber    return OK;
474cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
475cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
476799c9682b3776a55d234396aee4a302437150c26Chong Zhangint64_t ATSParser::Program::recoverPTS(uint64_t PTS_33bit) {
477799c9682b3776a55d234396aee4a302437150c26Chong Zhang    // We only have the lower 33-bit of the PTS. It could overflow within a
478799c9682b3776a55d234396aee4a302437150c26Chong Zhang    // reasonable amount of time. To handle the wrap-around, use fancy math
479799c9682b3776a55d234396aee4a302437150c26Chong Zhang    // to get an extended PTS that is within [-0xffffffff, 0xffffffff]
480799c9682b3776a55d234396aee4a302437150c26Chong Zhang    // of the latest recovered PTS.
4819bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang    if (mLastRecoveredPTS < 0ll) {
4829bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        // Use the original 33bit number for 1st frame, the reason is that
4839bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        // if 1st frame wraps to negative that's far away from 0, we could
4849bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        // never start. Only start wrapping around from 2nd frame.
4859bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        mLastRecoveredPTS = static_cast<int64_t>(PTS_33bit);
4869bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang    } else {
4879bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        mLastRecoveredPTS = static_cast<int64_t>(
4889bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                ((mLastRecoveredPTS - PTS_33bit + 0x100000000ll)
4899bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                & 0xfffffffe00000000ull) | PTS_33bit);
4909bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        // We start from 0, but recovered PTS could be slightly below 0.
4919bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        // Clamp it to 0 as rest of the pipeline doesn't take negative pts.
4929bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        // (eg. video is read first and starts at 0, but audio starts at 0xfffffff0)
4939bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        if (mLastRecoveredPTS < 0ll) {
4945c9054bc6efc080b265e028f2ebb1abd2a2e3953Chih-Hung Hsieh            ALOGI("Clamping negative recovered PTS (%" PRId64 ") to 0", mLastRecoveredPTS);
4959bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            mLastRecoveredPTS = 0ll;
4969bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        }
4979bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang    }
4989bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang
4999bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang    return mLastRecoveredPTS;
500799c9682b3776a55d234396aee4a302437150c26Chong Zhang}
501799c9682b3776a55d234396aee4a302437150c26Chong Zhang
502cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubersp<MediaSource> ATSParser::Program::getSource(SourceType type) {
503386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    size_t index = (type == AUDIO) ? 0 : 0;
504decd96988e495133e4a1728f612d4c9fdb4d218eAndreas Huber
505cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    for (size_t i = 0; i < mStreams.size(); ++i) {
506cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        sp<MediaSource> source = mStreams.editValueAt(i)->getSource(type);
507cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        if (source != NULL) {
508decd96988e495133e4a1728f612d4c9fdb4d218eAndreas Huber            if (index == 0) {
509decd96988e495133e4a1728f612d4c9fdb4d218eAndreas Huber                return source;
510decd96988e495133e4a1728f612d4c9fdb4d218eAndreas Huber            }
511decd96988e495133e4a1728f612d4c9fdb4d218eAndreas Huber            --index;
512cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        }
513cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
514cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
515cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    return NULL;
516cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
517cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
518bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shihbool ATSParser::Program::hasSource(SourceType type) const {
519bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih    for (size_t i = 0; i < mStreams.size(); ++i) {
520bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih        const sp<Stream> &stream = mStreams.valueAt(i);
521bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih        if (type == AUDIO && stream->isAudio()) {
522bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih            return true;
523bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih        } else if (type == VIDEO && stream->isVideo()) {
524bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih            return true;
525bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih        }
526bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih    }
527bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih
528bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih    return false;
529bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih}
530bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih
531bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huberint64_t ATSParser::Program::convertPTSToTimestamp(uint64_t PTS) {
532799c9682b3776a55d234396aee4a302437150c26Chong Zhang    PTS = recoverPTS(PTS);
533799c9682b3776a55d234396aee4a302437150c26Chong Zhang
534c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber    if (!(mParser->mFlags & TS_TIMESTAMPS_ARE_ABSOLUTE)) {
535c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber        if (!mFirstPTSValid) {
536c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber            mFirstPTSValid = true;
537c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber            mFirstPTS = PTS;
538c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber            PTS = 0;
539c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber        } else if (PTS < mFirstPTS) {
540c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber            PTS = 0;
541c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber        } else {
542c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber            PTS -= mFirstPTS;
543c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber        }
544bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    }
545bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber
54687f2a558dd12043631e12c361abef301bf603140Andreas Huber    int64_t timeUs = (PTS * 100) / 9;
54787f2a558dd12043631e12c361abef301bf603140Andreas Huber
54887f2a558dd12043631e12c361abef301bf603140Andreas Huber    if (mParser->mAbsoluteTimeAnchorUs >= 0ll) {
54987f2a558dd12043631e12c361abef301bf603140Andreas Huber        timeUs += mParser->mAbsoluteTimeAnchorUs;
55087f2a558dd12043631e12c361abef301bf603140Andreas Huber    }
55187f2a558dd12043631e12c361abef301bf603140Andreas Huber
552d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber    if (mParser->mTimeOffsetValid) {
553d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber        timeUs += mParser->mTimeOffsetUs;
554d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber    }
555d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber
55687f2a558dd12043631e12c361abef301bf603140Andreas Huber    return timeUs;
557bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber}
558bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber
559cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber////////////////////////////////////////////////////////////////////////////////
560cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
561bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas HuberATSParser::Stream::Stream(
56287f2a558dd12043631e12c361abef301bf603140Andreas Huber        Program *program,
56387f2a558dd12043631e12c361abef301bf603140Andreas Huber        unsigned elementaryPID,
56487f2a558dd12043631e12c361abef301bf603140Andreas Huber        unsigned streamType,
56587f2a558dd12043631e12c361abef301bf603140Andreas Huber        unsigned PCR_PID)
566bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    : mProgram(program),
567bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber      mElementaryPID(elementaryPID),
568cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber      mStreamType(streamType),
56987f2a558dd12043631e12c361abef301bf603140Andreas Huber      mPCR_PID(PCR_PID),
57087f2a558dd12043631e12c361abef301bf603140Andreas Huber      mExpectedContinuityCounter(-1),
5716a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber      mPayloadStarted(false),
572be9634d071e79b72a42a4504f64eda9e2a0bceb8Marco Nelissen      mEOSReached(false),
57390a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber      mPrevPTS(0),
574386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber      mQueue(NULL) {
575386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    switch (mStreamType) {
576386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        case STREAMTYPE_H264:
57787f2a558dd12043631e12c361abef301bf603140Andreas Huber            mQueue = new ElementaryStreamQueue(
57887f2a558dd12043631e12c361abef301bf603140Andreas Huber                    ElementaryStreamQueue::H264,
57987f2a558dd12043631e12c361abef301bf603140Andreas Huber                    (mProgram->parserFlags() & ALIGNED_VIDEO_DATA)
58087f2a558dd12043631e12c361abef301bf603140Andreas Huber                        ? ElementaryStreamQueue::kFlag_AlignedData : 0);
581386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            break;
5826e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        case STREAMTYPE_MPEG2_AUDIO_ADTS:
583386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            mQueue = new ElementaryStreamQueue(ElementaryStreamQueue::AAC);
584386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            break;
585386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        case STREAMTYPE_MPEG1_AUDIO:
586386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        case STREAMTYPE_MPEG2_AUDIO:
587386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            mQueue = new ElementaryStreamQueue(
588386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                    ElementaryStreamQueue::MPEG_AUDIO);
589386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            break;
590386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
591386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        case STREAMTYPE_MPEG1_VIDEO:
592386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        case STREAMTYPE_MPEG2_VIDEO:
593386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            mQueue = new ElementaryStreamQueue(
594386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                    ElementaryStreamQueue::MPEG_VIDEO);
595386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            break;
596386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
597386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        case STREAMTYPE_MPEG4_VIDEO:
598386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            mQueue = new ElementaryStreamQueue(
599386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                    ElementaryStreamQueue::MPEG4_VIDEO);
600386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            break;
601386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
6029bf32f06e8971c1d3eb4fc5edd74b69557f97212Chong Zhang        case STREAMTYPE_LPCM_AC3:
603d3c079ae9859011d118f94616d0069c2987013edChangwan Ryu        case STREAMTYPE_AC3:
604d3c079ae9859011d118f94616d0069c2987013edChangwan Ryu            mQueue = new ElementaryStreamQueue(
605d3c079ae9859011d118f94616d0069c2987013edChangwan Ryu                    ElementaryStreamQueue::AC3);
606d3c079ae9859011d118f94616d0069c2987013edChangwan Ryu            break;
607d3c079ae9859011d118f94616d0069c2987013edChangwan Ryu
6080852843d304006e3ab333081fddda13b07193de8Robert Shih        case STREAMTYPE_METADATA:
6090852843d304006e3ab333081fddda13b07193de8Robert Shih            mQueue = new ElementaryStreamQueue(
6100852843d304006e3ab333081fddda13b07193de8Robert Shih                    ElementaryStreamQueue::METADATA);
6110852843d304006e3ab333081fddda13b07193de8Robert Shih            break;
6120852843d304006e3ab333081fddda13b07193de8Robert Shih
613386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        default:
614386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            break;
615386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    }
616386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
6173856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("new stream PID 0x%02x, type 0x%02x", elementaryPID, streamType);
61818ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber
61918ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber    if (mQueue != NULL) {
62018ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber        mBuffer = new ABuffer(192 * 1024);
62118ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber        mBuffer->setRange(0, 0);
62218ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber    }
623cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
624cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
625cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas HuberATSParser::Stream::~Stream() {
626386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    delete mQueue;
627386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    mQueue = NULL;
628cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
629cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
6305403129e2a2f44620f2ac8109889e5a61be08732Andreas Huberstatus_t ATSParser::Stream::parse(
63187f2a558dd12043631e12c361abef301bf603140Andreas Huber        unsigned continuity_counter,
632cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned payload_unit_start_indicator, ABitReader *br) {
63318ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber    if (mQueue == NULL) {
6345403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber        return OK;
63518ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber    }
63618ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber
63787f2a558dd12043631e12c361abef301bf603140Andreas Huber    if (mExpectedContinuityCounter >= 0
63887f2a558dd12043631e12c361abef301bf603140Andreas Huber            && (unsigned)mExpectedContinuityCounter != continuity_counter) {
63987f2a558dd12043631e12c361abef301bf603140Andreas Huber        ALOGI("discontinuity on stream pid 0x%04x", mElementaryPID);
64087f2a558dd12043631e12c361abef301bf603140Andreas Huber
64187f2a558dd12043631e12c361abef301bf603140Andreas Huber        mPayloadStarted = false;
64287f2a558dd12043631e12c361abef301bf603140Andreas Huber        mBuffer->setRange(0, 0);
64387f2a558dd12043631e12c361abef301bf603140Andreas Huber        mExpectedContinuityCounter = -1;
64487f2a558dd12043631e12c361abef301bf603140Andreas Huber
64594a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber#if 0
64694a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber        // Uncomment this if you'd rather see no corruption whatsoever on
64794a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber        // screen and suspend updates until we come across another IDR frame.
64894a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber
64994a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber        if (mStreamType == STREAMTYPE_H264) {
65094a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber            ALOGI("clearing video queue");
65194a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber            mQueue->clear(true /* clearFormat */);
65294a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber        }
65394a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber#endif
65494a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber
65566830855846db5c211c2da6c055ca9b4167e8974Chong Zhang        if (!payload_unit_start_indicator) {
65666830855846db5c211c2da6c055ca9b4167e8974Chong Zhang            return OK;
65766830855846db5c211c2da6c055ca9b4167e8974Chong Zhang        }
65887f2a558dd12043631e12c361abef301bf603140Andreas Huber    }
65987f2a558dd12043631e12c361abef301bf603140Andreas Huber
66087f2a558dd12043631e12c361abef301bf603140Andreas Huber    mExpectedContinuityCounter = (continuity_counter + 1) & 0x0f;
66187f2a558dd12043631e12c361abef301bf603140Andreas Huber
662cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    if (payload_unit_start_indicator) {
663cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        if (mPayloadStarted) {
664cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            // Otherwise we run the danger of receiving the trailing bytes
665cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            // of a PES packet that we never saw the start of and assuming
666cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            // we have a a complete PES packet.
667cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
6685403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber            status_t err = flush();
6695403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber
6705403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber            if (err != OK) {
6715403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber                return err;
6725403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber            }
673cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        }
674cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
675cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        mPayloadStarted = true;
676cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
677cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
678cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    if (!mPayloadStarted) {
6795403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber        return OK;
680cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
681cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
682cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    size_t payloadSizeBits = br->numBitsLeft();
683f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK_EQ(payloadSizeBits % 8, 0u);
684cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
6853e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber    size_t neededSize = mBuffer->size() + payloadSizeBits / 8;
6863e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber    if (mBuffer->capacity() < neededSize) {
6873e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber        // Increment in multiples of 64K.
6883e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber        neededSize = (neededSize + 65535) & ~65535;
6893e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber
690b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross        ALOGI("resizing buffer to %zu bytes", neededSize);
6913e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber
6923e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber        sp<ABuffer> newBuffer = new ABuffer(neededSize);
6933e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber        memcpy(newBuffer->data(), mBuffer->data(), mBuffer->size());
6943e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber        newBuffer->setRange(0, mBuffer->size());
6953e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber        mBuffer = newBuffer;
6963e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber    }
697cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
698cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    memcpy(mBuffer->data() + mBuffer->size(), br->data(), payloadSizeBits / 8);
699cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    mBuffer->setRange(0, mBuffer->size() + payloadSizeBits / 8);
7005403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber
7015403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber    return OK;
702cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
703cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
7046e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huberbool ATSParser::Stream::isVideo() const {
7056e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    switch (mStreamType) {
7066e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        case STREAMTYPE_H264:
7076e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        case STREAMTYPE_MPEG1_VIDEO:
7086e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        case STREAMTYPE_MPEG2_VIDEO:
7096e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        case STREAMTYPE_MPEG4_VIDEO:
7106e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber            return true;
7116e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
7126e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        default:
7136e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber            return false;
7146e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    }
7156e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber}
7166e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
7176e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huberbool ATSParser::Stream::isAudio() const {
7186e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    switch (mStreamType) {
7196e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        case STREAMTYPE_MPEG1_AUDIO:
7206e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        case STREAMTYPE_MPEG2_AUDIO:
7216e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        case STREAMTYPE_MPEG2_AUDIO_ADTS:
7229bf32f06e8971c1d3eb4fc5edd74b69557f97212Chong Zhang        case STREAMTYPE_LPCM_AC3:
723d3c079ae9859011d118f94616d0069c2987013edChangwan Ryu        case STREAMTYPE_AC3:
7246e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber            return true;
7256e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
7266e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        default:
7276e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber            return false;
7286e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    }
7296e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber}
7306e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
7310852843d304006e3ab333081fddda13b07193de8Robert Shihbool ATSParser::Stream::isMeta() const {
7320852843d304006e3ab333081fddda13b07193de8Robert Shih    if (mStreamType == STREAMTYPE_METADATA) {
7330852843d304006e3ab333081fddda13b07193de8Robert Shih        return true;
7340852843d304006e3ab333081fddda13b07193de8Robert Shih    }
7350852843d304006e3ab333081fddda13b07193de8Robert Shih    return false;
7360852843d304006e3ab333081fddda13b07193de8Robert Shih}
7370852843d304006e3ab333081fddda13b07193de8Robert Shih
73832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Hubervoid ATSParser::Stream::signalDiscontinuity(
73932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        DiscontinuityType type, const sp<AMessage> &extra) {
7400389cc09f7b90f155a8942a0d2e1925cad1dbe2dMarco Nelissen    mExpectedContinuityCounter = -1;
7410389cc09f7b90f155a8942a0d2e1925cad1dbe2dMarco Nelissen
74218ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber    if (mQueue == NULL) {
74318ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber        return;
74418ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber    }
74518ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber
7462a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    mPayloadStarted = false;
7472a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    mBuffer->setRange(0, 0);
7482a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber
7496e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    bool clearFormat = false;
7506e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    if (isAudio()) {
7516e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        if (type & DISCONTINUITY_AUDIO_FORMAT) {
7526e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber            clearFormat = true;
7536e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        }
7546e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    } else {
7556e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        if (type & DISCONTINUITY_VIDEO_FORMAT) {
7566e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber            clearFormat = true;
7576e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        }
7586e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    }
759f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
7606e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    mQueue->clear(clearFormat);
76132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
7626e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    if (type & DISCONTINUITY_TIME) {
7636e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        uint64_t resumeAtPTS;
7646e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        if (extra != NULL
7656e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                && extra->findInt64(
7666e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    IStreamListener::kKeyResumeAtPTS,
7676e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    (int64_t *)&resumeAtPTS)) {
7686e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber            int64_t resumeAtMediaTimeUs =
7696e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                mProgram->convertPTSToTimestamp(resumeAtPTS);
77032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
771c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia            extra->setInt64("resume-at-mediaTimeUs", resumeAtMediaTimeUs);
772e332a9181cf6a3155ed1a0fd2afc212ccb1f2753Andreas Huber        }
7736e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    }
774f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
7756e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    if (mSource != NULL) {
776632740c58119a132ce19f6d498e39c5c3773971aChong Zhang        mSource->queueDiscontinuity(type, extra, true);
777bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    }
778f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
779bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber
780f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ATSParser::Stream::signalEOS(status_t finalResult) {
781f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (mSource != NULL) {
782f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        mSource->signalEOS(finalResult);
7832a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    }
784be9634d071e79b72a42a4504f64eda9e2a0bceb8Marco Nelissen    mEOSReached = true;
785be9634d071e79b72a42a4504f64eda9e2a0bceb8Marco Nelissen    flush();
7862a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber}
7872a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber
7885403129e2a2f44620f2ac8109889e5a61be08732Andreas Huberstatus_t ATSParser::Stream::parsePES(ABitReader *br) {
789cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned packet_startcode_prefix = br->getBits(24);
790cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
7913856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("packet_startcode_prefix = 0x%08x", packet_startcode_prefix);
792cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
793386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    if (packet_startcode_prefix != 1) {
7943856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("Supposedly payload_unit_start=1 unit does not start "
795386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber             "with startcode.");
7965403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber
7975403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber        return ERROR_MALFORMED;
798386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    }
799386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
800cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    CHECK_EQ(packet_startcode_prefix, 0x000001u);
801cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
802cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned stream_id = br->getBits(8);
8033856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("stream_id = 0x%02x", stream_id);
804cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
805cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned PES_packet_length = br->getBits(16);
8063856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("PES_packet_length = %u", PES_packet_length);
807cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
808cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    if (stream_id != 0xbc  // program_stream_map
809cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            && stream_id != 0xbe  // padding_stream
810cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            && stream_id != 0xbf  // private_stream_2
811cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            && stream_id != 0xf0  // ECM
812cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            && stream_id != 0xf1  // EMM
813cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            && stream_id != 0xff  // program_stream_directory
814cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            && stream_id != 0xf2  // DSMCC
815cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            && stream_id != 0xf8) {  // H.222.1 type E
816cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        CHECK_EQ(br->getBits(2), 2u);
817cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
8186e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber        MY_LOGV("PES_scrambling_control = %u", br->getBits(2));
8196e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber        MY_LOGV("PES_priority = %u", br->getBits(1));
8206e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber        MY_LOGV("data_alignment_indicator = %u", br->getBits(1));
8216e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber        MY_LOGV("copyright = %u", br->getBits(1));
8226e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber        MY_LOGV("original_or_copy = %u", br->getBits(1));
823cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
824cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned PTS_DTS_flags = br->getBits(2);
8253856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("PTS_DTS_flags = %u", PTS_DTS_flags);
826cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
827cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned ESCR_flag = br->getBits(1);
8283856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("ESCR_flag = %u", ESCR_flag);
829cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
830cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned ES_rate_flag = br->getBits(1);
8313856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("ES_rate_flag = %u", ES_rate_flag);
832cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
833cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned DSM_trick_mode_flag = br->getBits(1);
8343856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("DSM_trick_mode_flag = %u", DSM_trick_mode_flag);
835cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
836cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned additional_copy_info_flag = br->getBits(1);
8373856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("additional_copy_info_flag = %u", additional_copy_info_flag);
838cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
8396e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber        MY_LOGV("PES_CRC_flag = %u", br->getBits(1));
8406e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber        MY_LOGV("PES_extension_flag = %u", br->getBits(1));
841cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
842cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned PES_header_data_length = br->getBits(8);
8433856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("PES_header_data_length = %u", PES_header_data_length);
844cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
845cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned optional_bytes_remaining = PES_header_data_length;
846cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
847cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        uint64_t PTS = 0, DTS = 0;
848cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
849cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        if (PTS_DTS_flags == 2 || PTS_DTS_flags == 3) {
850cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            CHECK_GE(optional_bytes_remaining, 5u);
851cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
8526456ae745e919085c5024f784aaa2703f9695f98David Yeh            if (br->getBits(4) != PTS_DTS_flags) {
8536456ae745e919085c5024f784aaa2703f9695f98David Yeh                ALOGE("PES data Error!");
8546456ae745e919085c5024f784aaa2703f9695f98David Yeh                return ERROR_MALFORMED;
8556456ae745e919085c5024f784aaa2703f9695f98David Yeh            }
856cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            PTS = ((uint64_t)br->getBits(3)) << 30;
857cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            CHECK_EQ(br->getBits(1), 1u);
858cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            PTS |= ((uint64_t)br->getBits(15)) << 15;
859cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            CHECK_EQ(br->getBits(1), 1u);
860cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            PTS |= br->getBits(15);
861cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            CHECK_EQ(br->getBits(1), 1u);
862cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
863b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross            ALOGV("PTS = 0x%016" PRIx64 " (%.2f)", PTS, PTS / 90000.0);
864cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
865cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            optional_bytes_remaining -= 5;
866cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
867cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            if (PTS_DTS_flags == 3) {
868cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber                CHECK_GE(optional_bytes_remaining, 5u);
869cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
870cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber                CHECK_EQ(br->getBits(4), 1u);
871cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
872cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber                DTS = ((uint64_t)br->getBits(3)) << 30;
873cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber                CHECK_EQ(br->getBits(1), 1u);
874cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber                DTS |= ((uint64_t)br->getBits(15)) << 15;
875cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber                CHECK_EQ(br->getBits(1), 1u);
876cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber                DTS |= br->getBits(15);
877cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber                CHECK_EQ(br->getBits(1), 1u);
878cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
879b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross                ALOGV("DTS = %" PRIu64, DTS);
880cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
881cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber                optional_bytes_remaining -= 5;
882cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            }
883cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        }
884cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
885cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        if (ESCR_flag) {
886cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            CHECK_GE(optional_bytes_remaining, 6u);
887cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
888cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            br->getBits(2);
889cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
890cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            uint64_t ESCR = ((uint64_t)br->getBits(3)) << 30;
891cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            CHECK_EQ(br->getBits(1), 1u);
892cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            ESCR |= ((uint64_t)br->getBits(15)) << 15;
893cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            CHECK_EQ(br->getBits(1), 1u);
894cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            ESCR |= br->getBits(15);
895cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            CHECK_EQ(br->getBits(1), 1u);
896cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
897b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross            ALOGV("ESCR = %" PRIu64, ESCR);
8986e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber            MY_LOGV("ESCR_extension = %u", br->getBits(9));
899cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
900cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            CHECK_EQ(br->getBits(1), 1u);
901cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
902cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            optional_bytes_remaining -= 6;
903cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        }
904cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
905cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        if (ES_rate_flag) {
906cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            CHECK_GE(optional_bytes_remaining, 3u);
907cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
908cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            CHECK_EQ(br->getBits(1), 1u);
9096e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber            MY_LOGV("ES_rate = %u", br->getBits(22));
910cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            CHECK_EQ(br->getBits(1), 1u);
911cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
912cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            optional_bytes_remaining -= 3;
913cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        }
914cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
915cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        br->skipBits(optional_bytes_remaining * 8);
916cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
917cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        // ES data follows.
918cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
919cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        if (PES_packet_length != 0) {
920cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            CHECK_GE(PES_packet_length, PES_header_data_length + 3);
921cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
922cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            unsigned dataLength =
923cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber                PES_packet_length - 3 - PES_header_data_length;
924cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
9255403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber            if (br->numBitsLeft() < dataLength * 8) {
92629357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block                ALOGE("PES packet does not carry enough data to contain "
927b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross                     "payload. (numBitsLeft = %zu, required = %u)",
9285403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber                     br->numBitsLeft(), dataLength * 8);
9295403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber
9305403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber                return ERROR_MALFORMED;
9315403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber            }
9325403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber
9330da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber            CHECK_GE(br->numBitsLeft(), dataLength * 8);
9340da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber
9350da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber            onPayloadData(
9360da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber                    PTS_DTS_flags, PTS, DTS, br->data(), dataLength);
937cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
938cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            br->skipBits(dataLength * 8);
939cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        } else {
9400da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber            onPayloadData(
9410da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber                    PTS_DTS_flags, PTS, DTS,
9420da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber                    br->data(), br->numBitsLeft() / 8);
9430da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber
944cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            size_t payloadSizeBits = br->numBitsLeft();
945f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK_EQ(payloadSizeBits % 8, 0u);
946cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
947b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross            ALOGV("There's %zu bytes of payload.", payloadSizeBits / 8);
948cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        }
949cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    } else if (stream_id == 0xbe) {  // padding_stream
950cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        CHECK_NE(PES_packet_length, 0u);
951cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        br->skipBits(PES_packet_length * 8);
952cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    } else {
953cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        CHECK_NE(PES_packet_length, 0u);
954cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        br->skipBits(PES_packet_length * 8);
955cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
9565403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber
9575403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber    return OK;
958cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
959cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
9605403129e2a2f44620f2ac8109889e5a61be08732Andreas Huberstatus_t ATSParser::Stream::flush() {
961cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    if (mBuffer->size() == 0) {
9625403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber        return OK;
963cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
964cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
965b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross    ALOGV("flushing stream 0x%04x size = %zu", mElementaryPID, mBuffer->size());
966cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
967cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    ABitReader br(mBuffer->data(), mBuffer->size());
9685403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber
9695403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber    status_t err = parsePES(&br);
970cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
971cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    mBuffer->setRange(0, 0);
9725403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber
9735403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber    return err;
974cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
975cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
976cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubervoid ATSParser::Stream::onPayloadData(
97784333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber        unsigned PTS_DTS_flags, uint64_t PTS, uint64_t /* DTS */,
978cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        const uint8_t *data, size_t size) {
97990a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber#if 0
98090a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber    ALOGI("payload streamType 0x%02x, PTS = 0x%016llx, dPTS = %lld",
98190a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber          mStreamType,
98290a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber          PTS,
98390a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber          (int64_t)PTS - mPrevPTS);
98490a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber    mPrevPTS = PTS;
98590a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber#endif
98690a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber
9873856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("onPayloadData mStreamType=0x%02x", mStreamType);
988cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
98998a46cf165d8de3779874eba01803bbc485f45b9Andreas Huber    int64_t timeUs = 0ll;  // no presentation timestamp available.
99098a46cf165d8de3779874eba01803bbc485f45b9Andreas Huber    if (PTS_DTS_flags == 2 || PTS_DTS_flags == 3) {
99198a46cf165d8de3779874eba01803bbc485f45b9Andreas Huber        timeUs = mProgram->convertPTSToTimestamp(PTS);
99298a46cf165d8de3779874eba01803bbc485f45b9Andreas Huber    }
99382f7321b03eec1e40af9d681370f754ee0279582Andreas Huber
994386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    status_t err = mQueue->appendData(data, size, timeUs);
995decd96988e495133e4a1728f612d4c9fdb4d218eAndreas Huber
996be9634d071e79b72a42a4504f64eda9e2a0bceb8Marco Nelissen    if (mEOSReached) {
997be9634d071e79b72a42a4504f64eda9e2a0bceb8Marco Nelissen        mQueue->signalEOS();
998be9634d071e79b72a42a4504f64eda9e2a0bceb8Marco Nelissen    }
999be9634d071e79b72a42a4504f64eda9e2a0bceb8Marco Nelissen
1000decd96988e495133e4a1728f612d4c9fdb4d218eAndreas Huber    if (err != OK) {
1001decd96988e495133e4a1728f612d4c9fdb4d218eAndreas Huber        return;
1002decd96988e495133e4a1728f612d4c9fdb4d218eAndreas Huber    }
100382f7321b03eec1e40af9d681370f754ee0279582Andreas Huber
10046a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber    sp<ABuffer> accessUnit;
1005386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    while ((accessUnit = mQueue->dequeueAccessUnit()) != NULL) {
10066a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber        if (mSource == NULL) {
1007386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            sp<MetaData> meta = mQueue->getFormat();
100882f7321b03eec1e40af9d681370f754ee0279582Andreas Huber
10096a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber            if (meta != NULL) {
10103856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                ALOGV("Stream PID 0x%08x of type 0x%02x now has data.",
1011386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                     mElementaryPID, mStreamType);
1012386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
1013309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih                const char *mime;
1014309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih                if (meta->findCString(kKeyMIMEType, &mime)
1015309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih                        && !strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_AVC)
1016309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih                        && !IsIDR(accessUnit)) {
1017309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih                    continue;
1018309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih                }
10196a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber                mSource = new AnotherPacketSource(meta);
10206a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber                mSource->queueAccessUnit(accessUnit);
102182f7321b03eec1e40af9d681370f754ee0279582Andreas Huber            }
1022386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        } else if (mQueue->getFormat() != NULL) {
10232a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber            // After a discontinuity we invalidate the queue's format
10242a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber            // and won't enqueue any access units to the source until
10252a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber            // the queue has reestablished the new format.
10265bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
10275bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            if (mSource->getFormat() == NULL) {
1028386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                mSource->setFormat(mQueue->getFormat());
10295bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            }
10306a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber            mSource->queueAccessUnit(accessUnit);
103182f7321b03eec1e40af9d681370f754ee0279582Andreas Huber        }
103282f7321b03eec1e40af9d681370f754ee0279582Andreas Huber    }
103382f7321b03eec1e40af9d681370f754ee0279582Andreas Huber}
103482f7321b03eec1e40af9d681370f754ee0279582Andreas Huber
1035cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubersp<MediaSource> ATSParser::Stream::getSource(SourceType type) {
1036386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    switch (type) {
1037386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        case VIDEO:
1038386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        {
10396e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber            if (isVideo()) {
1040386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                return mSource;
1041386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            }
1042386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            break;
1043386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        }
1044386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
1045386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        case AUDIO:
1046386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        {
10476e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber            if (isAudio()) {
1048386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                return mSource;
1049386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            }
1050386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            break;
1051386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        }
1052386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
10530852843d304006e3ab333081fddda13b07193de8Robert Shih        case META:
10540852843d304006e3ab333081fddda13b07193de8Robert Shih        {
10550852843d304006e3ab333081fddda13b07193de8Robert Shih            if (isMeta()) {
10560852843d304006e3ab333081fddda13b07193de8Robert Shih                return mSource;
10570852843d304006e3ab333081fddda13b07193de8Robert Shih            }
10580852843d304006e3ab333081fddda13b07193de8Robert Shih            break;
10590852843d304006e3ab333081fddda13b07193de8Robert Shih        }
10600852843d304006e3ab333081fddda13b07193de8Robert Shih
1061386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        default:
1062386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            break;
1063cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
1064cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1065cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    return NULL;
1066cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
1067cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1068cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber////////////////////////////////////////////////////////////////////////////////
1069cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1070c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas HuberATSParser::ATSParser(uint32_t flags)
107187f2a558dd12043631e12c361abef301bf603140Andreas Huber    : mFlags(flags),
107287f2a558dd12043631e12c361abef301bf603140Andreas Huber      mAbsoluteTimeAnchorUs(-1ll),
1073d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber      mTimeOffsetValid(false),
1074d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber      mTimeOffsetUs(0ll),
1075d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang      mLastRecoveredPTS(-1ll),
107687f2a558dd12043631e12c361abef301bf603140Andreas Huber      mNumTSPacketsParsed(0),
107787f2a558dd12043631e12c361abef301bf603140Andreas Huber      mNumPCRs(0) {
10788dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    mPSISections.add(0 /* PID */, new PSISection);
1079cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
1080cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1081cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas HuberATSParser::~ATSParser() {
1082cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
1083cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
108406528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huberstatus_t ATSParser::feedTSPacket(const void *data, size_t size) {
1085cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    CHECK_EQ(size, kTSPacketSize);
1086cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1087cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    ABitReader br((const uint8_t *)data, kTSPacketSize);
108806528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber    return parseTS(&br);
1089cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
1090cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
109132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Hubervoid ATSParser::signalDiscontinuity(
109232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        DiscontinuityType type, const sp<AMessage> &extra) {
1093b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber    int64_t mediaTimeUs;
1094d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang    if ((type & DISCONTINUITY_TIME) && extra != NULL) {
1095d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang        if (extra->findInt64(IStreamListener::kKeyMediaTimeUs, &mediaTimeUs)) {
1096d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang            mAbsoluteTimeAnchorUs = mediaTimeUs;
1097d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang        }
1098d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang        if ((mFlags & TS_TIMESTAMPS_ARE_ABSOLUTE)
1099d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang                && extra->findInt64(
1100d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang                    IStreamListener::kKeyRecentMediaTimeUs, &mediaTimeUs)) {
1101d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang            if (mAbsoluteTimeAnchorUs >= 0ll) {
1102d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang                mediaTimeUs -= mAbsoluteTimeAnchorUs;
1103d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang            }
1104d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang            if (mTimeOffsetValid) {
1105d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang                mediaTimeUs -= mTimeOffsetUs;
1106d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang            }
1107d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang            mLastRecoveredPTS = (mediaTimeUs * 9) / 100;
1108d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang        }
1109b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber    } else if (type == DISCONTINUITY_ABSOLUTE_TIME) {
111087f2a558dd12043631e12c361abef301bf603140Andreas Huber        int64_t timeUs;
111187f2a558dd12043631e12c361abef301bf603140Andreas Huber        CHECK(extra->findInt64("timeUs", &timeUs));
111287f2a558dd12043631e12c361abef301bf603140Andreas Huber
111387f2a558dd12043631e12c361abef301bf603140Andreas Huber        CHECK(mPrograms.empty());
111487f2a558dd12043631e12c361abef301bf603140Andreas Huber        mAbsoluteTimeAnchorUs = timeUs;
111587f2a558dd12043631e12c361abef301bf603140Andreas Huber        return;
1116d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber    } else if (type == DISCONTINUITY_TIME_OFFSET) {
1117d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber        int64_t offset;
1118d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber        CHECK(extra->findInt64("offset", &offset));
1119d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber
1120d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber        mTimeOffsetValid = true;
1121d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber        mTimeOffsetUs = offset;
1122d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber        return;
112387f2a558dd12043631e12c361abef301bf603140Andreas Huber    }
112487f2a558dd12043631e12c361abef301bf603140Andreas Huber
1125f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    for (size_t i = 0; i < mPrograms.size(); ++i) {
112632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        mPrograms.editItemAt(i)->signalDiscontinuity(type, extra);
1127f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
1128f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
1129f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1130f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ATSParser::signalEOS(status_t finalResult) {
1131f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK_NE(finalResult, (status_t)OK);
1132f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
11332a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    for (size_t i = 0; i < mPrograms.size(); ++i) {
1134f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        mPrograms.editItemAt(i)->signalEOS(finalResult);
11352a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    }
11362a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber}
11372a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber
1138cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubervoid ATSParser::parseProgramAssociationTable(ABitReader *br) {
1139cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned table_id = br->getBits(8);
11403856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("  table_id = %u", table_id);
11416456ae745e919085c5024f784aaa2703f9695f98David Yeh    if (table_id != 0x00u) {
11426456ae745e919085c5024f784aaa2703f9695f98David Yeh        ALOGE("PAT data error!");
11436456ae745e919085c5024f784aaa2703f9695f98David Yeh        return ;
11446456ae745e919085c5024f784aaa2703f9695f98David Yeh    }
1145cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned section_syntax_indictor = br->getBits(1);
11463856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("  section_syntax_indictor = %u", section_syntax_indictor);
1147cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    CHECK_EQ(section_syntax_indictor, 1u);
1148cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1149cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    CHECK_EQ(br->getBits(1), 0u);
11506e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  reserved = %u", br->getBits(2));
1151cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1152cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned section_length = br->getBits(12);
11533856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("  section_length = %u", section_length);
1154f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK_EQ(section_length & 0xc00, 0u);
1155cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
11566e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  transport_stream_id = %u", br->getBits(16));
11576e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  reserved = %u", br->getBits(2));
11586e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  version_number = %u", br->getBits(5));
11596e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  current_next_indicator = %u", br->getBits(1));
11606e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  section_number = %u", br->getBits(8));
11616e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  last_section_number = %u", br->getBits(8));
1162cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1163cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    size_t numProgramBytes = (section_length - 5 /* header */ - 4 /* crc */);
1164cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    CHECK_EQ((numProgramBytes % 4), 0u);
1165cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1166cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    for (size_t i = 0; i < numProgramBytes / 4; ++i) {
1167cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned program_number = br->getBits(16);
11683856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("    program_number = %u", program_number);
1169cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
11706e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber        MY_LOGV("    reserved = %u", br->getBits(3));
1171cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1172cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        if (program_number == 0) {
11736e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber            MY_LOGV("    network_PID = 0x%04x", br->getBits(13));
1174cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        } else {
1175cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            unsigned programMapPID = br->getBits(13);
1176cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
11773856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("    program_map_PID = 0x%04x", programMapPID);
1178cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1179386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            bool found = false;
1180386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            for (size_t index = 0; index < mPrograms.size(); ++index) {
1181386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                const sp<Program> &program = mPrograms.itemAt(index);
1182386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
1183386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                if (program->number() == program_number) {
1184386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                    program->updateProgramMapPID(programMapPID);
1185386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                    found = true;
1186386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                    break;
1187386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                }
1188386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            }
1189386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
1190386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            if (!found) {
1191386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                mPrograms.push(
1192d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang                        new Program(this, program_number, programMapPID, mLastRecoveredPTS));
1193386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            }
11948dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
11958dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            if (mPSISections.indexOfKey(programMapPID) < 0) {
11968dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                mPSISections.add(programMapPID, new PSISection);
11978dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            }
1198cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        }
1199cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
1200cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
12016e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  CRC = 0x%08x", br->getBits(32));
1202cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
1203cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
120406528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huberstatus_t ATSParser::parsePID(
1205cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        ABitReader *br, unsigned PID,
120687f2a558dd12043631e12c361abef301bf603140Andreas Huber        unsigned continuity_counter,
1207cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned payload_unit_start_indicator) {
12088dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    ssize_t sectionIndex = mPSISections.indexOfKey(PID);
12098dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
12108dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    if (sectionIndex >= 0) {
12114b4bb11b8747adeb2efe56c7df4ab6803dd7db41Andreas Huber        sp<PSISection> section = mPSISections.valueAt(sectionIndex);
12128dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
1213cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        if (payload_unit_start_indicator) {
12146456ae745e919085c5024f784aaa2703f9695f98David Yeh            if (!section->isEmpty()) {
12159bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                ALOGW("parsePID encounters payload_unit_start_indicator when section is not empty");
12169bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                section->clear();
12176456ae745e919085c5024f784aaa2703f9695f98David Yeh            }
12188dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
1219cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            unsigned skip = br->getBits(8);
12209ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim            section->setSkipBytes(skip + 1);  // skip filler bytes + pointer field itself
1221cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            br->skipBits(skip * 8);
1222cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        }
12238dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
12248dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        CHECK((br->numBitsLeft() % 8) == 0);
12258dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        status_t err = section->append(br->data(), br->numBitsLeft() / 8);
12268dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
12278dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        if (err != OK) {
12288dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            return err;
12298dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        }
12308dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
12318dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        if (!section->isComplete()) {
12328dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            return OK;
12338dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        }
12348dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
12359ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim        if (!section->isCRCOkay()) {
12369ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim            return BAD_VALUE;
12379ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim        }
12388dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        ABitReader sectionBits(section->data(), section->size());
12398dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
12408dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        if (PID == 0) {
12418dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            parseProgramAssociationTable(&sectionBits);
12428dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        } else {
12438dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            bool handled = false;
12448dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            for (size_t i = 0; i < mPrograms.size(); ++i) {
12458dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                status_t err;
12468dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                if (!mPrograms.editItemAt(i)->parsePSISection(
12478dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                            PID, &sectionBits, &err)) {
12488dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                    continue;
12498dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                }
12508dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
12518dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                if (err != OK) {
12528dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                    return err;
12538dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                }
12548dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
12558dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                handled = true;
12568dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                break;
12578dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            }
12588dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
12598dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            if (!handled) {
12608dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                mPSISections.removeItem(PID);
12614b4bb11b8747adeb2efe56c7df4ab6803dd7db41Andreas Huber                section.clear();
12628dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            }
12638dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        }
12648dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
12654b4bb11b8747adeb2efe56c7df4ab6803dd7db41Andreas Huber        if (section != NULL) {
12664b4bb11b8747adeb2efe56c7df4ab6803dd7db41Andreas Huber            section->clear();
12674b4bb11b8747adeb2efe56c7df4ab6803dd7db41Andreas Huber        }
12688dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
126906528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber        return OK;
1270cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
1271cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1272cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    bool handled = false;
1273cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    for (size_t i = 0; i < mPrograms.size(); ++i) {
127406528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber        status_t err;
1275cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        if (mPrograms.editItemAt(i)->parsePID(
127687f2a558dd12043631e12c361abef301bf603140Andreas Huber                    PID, continuity_counter, payload_unit_start_indicator,
127787f2a558dd12043631e12c361abef301bf603140Andreas Huber                    br, &err)) {
127806528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber            if (err != OK) {
127906528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber                return err;
128006528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber            }
128106528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber
1282cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            handled = true;
1283cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            break;
1284cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        }
1285cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
1286cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1287cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    if (!handled) {
12883856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("PID 0x%04x not handled.", PID);
1289cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
129006528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber
129106528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber    return OK;
1292cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
1293cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
129487f2a558dd12043631e12c361abef301bf603140Andreas Hubervoid ATSParser::parseAdaptationField(ABitReader *br, unsigned PID) {
1295cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned adaptation_field_length = br->getBits(8);
129687f2a558dd12043631e12c361abef301bf603140Andreas Huber
1297cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    if (adaptation_field_length > 0) {
129887f2a558dd12043631e12c361abef301bf603140Andreas Huber        unsigned discontinuity_indicator = br->getBits(1);
129987f2a558dd12043631e12c361abef301bf603140Andreas Huber
130087f2a558dd12043631e12c361abef301bf603140Andreas Huber        if (discontinuity_indicator) {
130187f2a558dd12043631e12c361abef301bf603140Andreas Huber            ALOGV("PID 0x%04x: discontinuity_indicator = 1 (!!!)", PID);
130287f2a558dd12043631e12c361abef301bf603140Andreas Huber        }
130387f2a558dd12043631e12c361abef301bf603140Andreas Huber
130487f2a558dd12043631e12c361abef301bf603140Andreas Huber        br->skipBits(2);
130587f2a558dd12043631e12c361abef301bf603140Andreas Huber        unsigned PCR_flag = br->getBits(1);
130687f2a558dd12043631e12c361abef301bf603140Andreas Huber
130787f2a558dd12043631e12c361abef301bf603140Andreas Huber        size_t numBitsRead = 4;
130887f2a558dd12043631e12c361abef301bf603140Andreas Huber
130987f2a558dd12043631e12c361abef301bf603140Andreas Huber        if (PCR_flag) {
131087f2a558dd12043631e12c361abef301bf603140Andreas Huber            br->skipBits(4);
131187f2a558dd12043631e12c361abef301bf603140Andreas Huber            uint64_t PCR_base = br->getBits(32);
131287f2a558dd12043631e12c361abef301bf603140Andreas Huber            PCR_base = (PCR_base << 1) | br->getBits(1);
131387f2a558dd12043631e12c361abef301bf603140Andreas Huber
131487f2a558dd12043631e12c361abef301bf603140Andreas Huber            br->skipBits(6);
131587f2a558dd12043631e12c361abef301bf603140Andreas Huber            unsigned PCR_ext = br->getBits(9);
131687f2a558dd12043631e12c361abef301bf603140Andreas Huber
131787f2a558dd12043631e12c361abef301bf603140Andreas Huber            // The number of bytes from the start of the current
131887f2a558dd12043631e12c361abef301bf603140Andreas Huber            // MPEG2 transport stream packet up and including
131987f2a558dd12043631e12c361abef301bf603140Andreas Huber            // the final byte of this PCR_ext field.
132087f2a558dd12043631e12c361abef301bf603140Andreas Huber            size_t byteOffsetFromStartOfTSPacket =
132187f2a558dd12043631e12c361abef301bf603140Andreas Huber                (188 - br->numBitsLeft() / 8);
132287f2a558dd12043631e12c361abef301bf603140Andreas Huber
132387f2a558dd12043631e12c361abef301bf603140Andreas Huber            uint64_t PCR = PCR_base * 300 + PCR_ext;
132487f2a558dd12043631e12c361abef301bf603140Andreas Huber
1325b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross            ALOGV("PID 0x%04x: PCR = 0x%016" PRIx64 " (%.2f)",
132687f2a558dd12043631e12c361abef301bf603140Andreas Huber                  PID, PCR, PCR / 27E6);
132787f2a558dd12043631e12c361abef301bf603140Andreas Huber
132887f2a558dd12043631e12c361abef301bf603140Andreas Huber            // The number of bytes received by this parser up to and
132987f2a558dd12043631e12c361abef301bf603140Andreas Huber            // including the final byte of this PCR_ext field.
133087f2a558dd12043631e12c361abef301bf603140Andreas Huber            size_t byteOffsetFromStart =
133187f2a558dd12043631e12c361abef301bf603140Andreas Huber                mNumTSPacketsParsed * 188 + byteOffsetFromStartOfTSPacket;
133287f2a558dd12043631e12c361abef301bf603140Andreas Huber
133387f2a558dd12043631e12c361abef301bf603140Andreas Huber            for (size_t i = 0; i < mPrograms.size(); ++i) {
133487f2a558dd12043631e12c361abef301bf603140Andreas Huber                updatePCR(PID, PCR, byteOffsetFromStart);
133587f2a558dd12043631e12c361abef301bf603140Andreas Huber            }
133687f2a558dd12043631e12c361abef301bf603140Andreas Huber
133787f2a558dd12043631e12c361abef301bf603140Andreas Huber            numBitsRead += 52;
133887f2a558dd12043631e12c361abef301bf603140Andreas Huber        }
133987f2a558dd12043631e12c361abef301bf603140Andreas Huber
134087f2a558dd12043631e12c361abef301bf603140Andreas Huber        CHECK_GE(adaptation_field_length * 8, numBitsRead);
134187f2a558dd12043631e12c361abef301bf603140Andreas Huber
134287f2a558dd12043631e12c361abef301bf603140Andreas Huber        br->skipBits(adaptation_field_length * 8 - numBitsRead);
1343cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
1344cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
1345cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
134606528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huberstatus_t ATSParser::parseTS(ABitReader *br) {
13473856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("---");
1348cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1349cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned sync_byte = br->getBits(8);
13506456ae745e919085c5024f784aaa2703f9695f98David Yeh    if (sync_byte != 0x47u) {
13516456ae745e919085c5024f784aaa2703f9695f98David Yeh        ALOGE("[error] parseTS: return error as sync_byte=0x%x", sync_byte);
13526456ae745e919085c5024f784aaa2703f9695f98David Yeh        return BAD_VALUE;
13536456ae745e919085c5024f784aaa2703f9695f98David Yeh    }
1354cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
135552668ca838e1869676ff95e7388f93ec1858b1e9Andreas Huber    if (br->getBits(1)) {  // transport_error_indicator
135652668ca838e1869676ff95e7388f93ec1858b1e9Andreas Huber        // silently ignore.
135752668ca838e1869676ff95e7388f93ec1858b1e9Andreas Huber        return OK;
135852668ca838e1869676ff95e7388f93ec1858b1e9Andreas Huber    }
1359cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1360cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned payload_unit_start_indicator = br->getBits(1);
13613856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("payload_unit_start_indicator = %u", payload_unit_start_indicator);
1362cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
13636e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("transport_priority = %u", br->getBits(1));
1364cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1365cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned PID = br->getBits(13);
13663856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("PID = 0x%04x", PID);
1367cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
13686e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("transport_scrambling_control = %u", br->getBits(2));
1369cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1370cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned adaptation_field_control = br->getBits(2);
13713856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("adaptation_field_control = %u", adaptation_field_control);
1372cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
13730da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber    unsigned continuity_counter = br->getBits(4);
137487f2a558dd12043631e12c361abef301bf603140Andreas Huber    ALOGV("PID = 0x%04x, continuity_counter = %u", PID, continuity_counter);
13750da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber
1376df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block    // ALOGI("PID = 0x%04x, continuity_counter = %u", PID, continuity_counter);
1377cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1378cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    if (adaptation_field_control == 2 || adaptation_field_control == 3) {
137987f2a558dd12043631e12c361abef301bf603140Andreas Huber        parseAdaptationField(br, PID);
1380cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
1381cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
138287f2a558dd12043631e12c361abef301bf603140Andreas Huber    status_t err = OK;
138387f2a558dd12043631e12c361abef301bf603140Andreas Huber
1384cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    if (adaptation_field_control == 1 || adaptation_field_control == 3) {
138587f2a558dd12043631e12c361abef301bf603140Andreas Huber        err = parsePID(
138687f2a558dd12043631e12c361abef301bf603140Andreas Huber                br, PID, continuity_counter, payload_unit_start_indicator);
1387cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
138806528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber
138987f2a558dd12043631e12c361abef301bf603140Andreas Huber    ++mNumTSPacketsParsed;
139087f2a558dd12043631e12c361abef301bf603140Andreas Huber
139187f2a558dd12043631e12c361abef301bf603140Andreas Huber    return err;
1392cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
1393cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1394cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubersp<MediaSource> ATSParser::getSource(SourceType type) {
1395386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    int which = -1;  // any
1396386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
1397cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    for (size_t i = 0; i < mPrograms.size(); ++i) {
1398386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        const sp<Program> &program = mPrograms.editItemAt(i);
1399386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
1400386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        if (which >= 0 && (int)program->number() != which) {
1401386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            continue;
1402386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        }
1403386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
1404386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        sp<MediaSource> source = program->getSource(type);
1405cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1406cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        if (source != NULL) {
1407cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            return source;
1408cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        }
1409cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
1410cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1411cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    return NULL;
1412cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
1413cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1414bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shihbool ATSParser::hasSource(SourceType type) const {
1415bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih    for (size_t i = 0; i < mPrograms.size(); ++i) {
1416bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih        const sp<Program> &program = mPrograms.itemAt(i);
1417bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih        if (program->hasSource(type)) {
1418bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih            return true;
1419bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih        }
1420bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih    }
1421bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih
1422bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih    return false;
1423bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih}
1424bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih
142543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huberbool ATSParser::PTSTimeDeltaEstablished() {
142643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    if (mPrograms.isEmpty()) {
142743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        return false;
142843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    }
142943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
143043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    return mPrograms.editItemAt(0)->PTSTimeDeltaEstablished();
143143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber}
143243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
143387f2a558dd12043631e12c361abef301bf603140Andreas Hubervoid ATSParser::updatePCR(
143484333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber        unsigned /* PID */, uint64_t PCR, size_t byteOffsetFromStart) {
1435b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross    ALOGV("PCR 0x%016" PRIx64 " @ %zu", PCR, byteOffsetFromStart);
143687f2a558dd12043631e12c361abef301bf603140Andreas Huber
143787f2a558dd12043631e12c361abef301bf603140Andreas Huber    if (mNumPCRs == 2) {
143887f2a558dd12043631e12c361abef301bf603140Andreas Huber        mPCR[0] = mPCR[1];
143987f2a558dd12043631e12c361abef301bf603140Andreas Huber        mPCRBytes[0] = mPCRBytes[1];
144087f2a558dd12043631e12c361abef301bf603140Andreas Huber        mSystemTimeUs[0] = mSystemTimeUs[1];
144187f2a558dd12043631e12c361abef301bf603140Andreas Huber        mNumPCRs = 1;
144287f2a558dd12043631e12c361abef301bf603140Andreas Huber    }
144387f2a558dd12043631e12c361abef301bf603140Andreas Huber
144487f2a558dd12043631e12c361abef301bf603140Andreas Huber    mPCR[mNumPCRs] = PCR;
144587f2a558dd12043631e12c361abef301bf603140Andreas Huber    mPCRBytes[mNumPCRs] = byteOffsetFromStart;
144687f2a558dd12043631e12c361abef301bf603140Andreas Huber    mSystemTimeUs[mNumPCRs] = ALooper::GetNowUs();
144787f2a558dd12043631e12c361abef301bf603140Andreas Huber
144887f2a558dd12043631e12c361abef301bf603140Andreas Huber    ++mNumPCRs;
144987f2a558dd12043631e12c361abef301bf603140Andreas Huber
145087f2a558dd12043631e12c361abef301bf603140Andreas Huber    if (mNumPCRs == 2) {
145187f2a558dd12043631e12c361abef301bf603140Andreas Huber        double transportRate =
145287f2a558dd12043631e12c361abef301bf603140Andreas Huber            (mPCRBytes[1] - mPCRBytes[0]) * 27E6 / (mPCR[1] - mPCR[0]);
145387f2a558dd12043631e12c361abef301bf603140Andreas Huber
145487f2a558dd12043631e12c361abef301bf603140Andreas Huber        ALOGV("transportRate = %.2f bytes/sec", transportRate);
145587f2a558dd12043631e12c361abef301bf603140Andreas Huber    }
145687f2a558dd12043631e12c361abef301bf603140Andreas Huber}
145787f2a558dd12043631e12c361abef301bf603140Andreas Huber
14588dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber////////////////////////////////////////////////////////////////////////////////
14598dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
14609ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim
14619ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim// CRC32 used for PSI section. The table was generated by following command:
14629ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim// $ python pycrc.py --model crc-32-mpeg --algorithm table-driven --generate c
14639ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim// Visit http://www.tty1.net/pycrc/index_en.html for more details.
14649ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kimuint32_t ATSParser::PSISection::CRC_TABLE[] = {
14659ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9,
14669ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x130476dc, 0x17c56b6b, 0x1a864db2, 0x1e475005,
14679ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61,
14689ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd,
14699ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9,
14709ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75,
14719ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011,
14729ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x791d4014, 0x7ddc5da3, 0x709f7b7a, 0x745e66cd,
14739ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039,
14749ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5,
14759ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xbe2b5b58, 0xbaea46ef, 0xb7a96036, 0xb3687d81,
14769ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d,
14779ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49,
14789ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95,
14799ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1,
14809ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d,
14819ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x34867077, 0x30476dc0, 0x3d044b19, 0x39c556ae,
14829ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072,
14839ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16,
14849ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca,
14859ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde,
14869ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02,
14879ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x5e9f46bf, 0x5a5e5b08, 0x571d7dd1, 0x53dc6066,
14889ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,
14899ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e,
14909ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xbfa1b04b, 0xbb60adfc, 0xb6238b25, 0xb2e29692,
14919ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6,
14929ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a,
14939ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e,
14949ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2,
14959ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686,
14969ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xd5b88683, 0xd1799b34, 0xdc3abded, 0xd8fba05a,
14979ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637,
14989ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb,
14999ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f,
15009ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53,
15019ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47,
15029ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x36194d42, 0x32d850f5, 0x3f9b762c, 0x3b5a6b9b,
15039ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff,
15049ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623,
15059ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xf12f560e, 0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7,
15069ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b,
15079ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f,
15089ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3,
15099ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7,
15109ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b,
15119ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x9b3660c6, 0x9ff77d71, 0x92b45ba8, 0x9675461f,
15129ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3,
15139ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640,
15149ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c,
15159ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8,
15169ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24,
15179ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x119b4be9, 0x155a565e, 0x18197087, 0x1cd86d30,
15189ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec,
15199ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088,
15209ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x2497d08d, 0x2056cd3a, 0x2d15ebe3, 0x29d4f654,
15219ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0,
15229ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c,
15239ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18,
15249ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4,
15259ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0,
15269ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x9abc8bd5, 0x9e7d9662, 0x933eb0bb, 0x97ffad0c,
15279ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668,
15289ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4
15299ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    };
15309ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim
15319ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk KimATSParser::PSISection::PSISection() :
15329ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    mSkipBytes(0) {
15338dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber}
15348dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
15358dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas HuberATSParser::PSISection::~PSISection() {
15368dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber}
15378dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
15388dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberstatus_t ATSParser::PSISection::append(const void *data, size_t size) {
15398dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    if (mBuffer == NULL || mBuffer->size() + size > mBuffer->capacity()) {
15408dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        size_t newCapacity =
15418dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            (mBuffer == NULL) ? size : mBuffer->capacity() + size;
15428dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
15438dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        newCapacity = (newCapacity + 1023) & ~1023;
15448dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
15458dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        sp<ABuffer> newBuffer = new ABuffer(newCapacity);
15468dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
15478dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        if (mBuffer != NULL) {
15488dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            memcpy(newBuffer->data(), mBuffer->data(), mBuffer->size());
15498dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            newBuffer->setRange(0, mBuffer->size());
15508dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        } else {
15518dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            newBuffer->setRange(0, 0);
15528dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        }
15538dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
15548dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        mBuffer = newBuffer;
15558dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    }
15568dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
15578dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    memcpy(mBuffer->data() + mBuffer->size(), data, size);
15588dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    mBuffer->setRange(0, mBuffer->size() + size);
15598dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
15608dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    return OK;
15618dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber}
15628dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
15639ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kimvoid ATSParser::PSISection::setSkipBytes(uint8_t skip) {
15649ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    mSkipBytes = skip;
15659ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim}
15669ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim
15678dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Hubervoid ATSParser::PSISection::clear() {
15688dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    if (mBuffer != NULL) {
15698dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        mBuffer->setRange(0, 0);
15708dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    }
15719ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    mSkipBytes = 0;
15728dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber}
15738dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
15748dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberbool ATSParser::PSISection::isComplete() const {
15758dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    if (mBuffer == NULL || mBuffer->size() < 3) {
15768dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        return false;
15778dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    }
15788dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
15798dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    unsigned sectionLength = U16_AT(mBuffer->data() + 1) & 0xfff;
15808dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    return mBuffer->size() >= sectionLength + 3;
15818dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber}
15828dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
15838dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberbool ATSParser::PSISection::isEmpty() const {
15848dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    return mBuffer == NULL || mBuffer->size() == 0;
15858dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber}
15868dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
15878dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberconst uint8_t *ATSParser::PSISection::data() const {
15888dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    return mBuffer == NULL ? NULL : mBuffer->data();
15898dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber}
15908dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
15918dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Hubersize_t ATSParser::PSISection::size() const {
15928dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    return mBuffer == NULL ? 0 : mBuffer->size();
15938dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber}
15948dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
15959ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kimbool ATSParser::PSISection::isCRCOkay() const {
15969ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    if (!isComplete()) {
15979ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim        return false;
15989ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    }
15999ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    uint8_t* data = mBuffer->data();
16009ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim
16019ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    // Return true if section_syntax_indicator says no section follows the field section_length.
16029ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    if ((data[1] & 0x80) == 0) {
16039ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim        return true;
16049ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    }
16059ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim
16069ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    unsigned sectionLength = U16_AT(data + 1) & 0xfff;
16079ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    ALOGV("sectionLength %u, skip %u", sectionLength, mSkipBytes);
16089ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim
16099ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    // Skip the preceding field present when payload start indicator is on.
16109ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    sectionLength -= mSkipBytes;
16119ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim
16129ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    uint32_t crc = 0xffffffff;
16139ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    for(unsigned i = 0; i < sectionLength + 4 /* crc */; i++) {
16149ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim        uint8_t b = data[i];
16159ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim        int index = ((crc >> 24) ^ (b & 0xff)) & 0xff;
16169ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim        crc = CRC_TABLE[index] ^ (crc << 8);
16179ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    }
16189ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    ALOGV("crc: %08x\n", crc);
16199ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    return (crc == 0);
16209ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim}
1621cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}  // namespace android
1622