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
57540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    // Pass to appropriate stream according to pid, and set event if it's a PES
58540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    // with a sync frame.
59540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    // Note that the method itself does not touch event.
60cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    bool parsePID(
6187f2a558dd12043631e12c361abef301bf603140Andreas Huber            unsigned pid, unsigned continuity_counter,
6287f2a558dd12043631e12c361abef301bf603140Andreas Huber            unsigned payload_unit_start_indicator,
63540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim            ABitReader *br, status_t *err, SyncEvent *event);
64cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
6532f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber    void signalDiscontinuity(
6632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            DiscontinuityType type, const sp<AMessage> &extra);
6732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
68f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    void signalEOS(status_t finalResult);
692a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber
70cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    sp<MediaSource> getSource(SourceType type);
71bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih    bool hasSource(SourceType type) const;
72cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
73bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    int64_t convertPTSToTimestamp(uint64_t PTS);
74bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber
7543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    bool PTSTimeDeltaEstablished() const {
7643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        return mFirstPTSValid;
7743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    }
7843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
79386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    unsigned number() const { return mProgramNumber; }
80386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
81386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    void updateProgramMapPID(unsigned programMapPID) {
82386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        mProgramMapPID = programMapPID;
83386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    }
84386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
858dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    unsigned programMapPID() const {
868dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        return mProgramMapPID;
878dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    }
888dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
8987f2a558dd12043631e12c361abef301bf603140Andreas Huber    uint32_t parserFlags() const {
9087f2a558dd12043631e12c361abef301bf603140Andreas Huber        return mParser->mFlags;
9187f2a558dd12043631e12c361abef301bf603140Andreas Huber    }
9287f2a558dd12043631e12c361abef301bf603140Andreas Huber
93cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberprivate:
949bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang    struct StreamInfo {
959bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        unsigned mType;
969bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        unsigned mPID;
979bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang    };
989bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang
99f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    ATSParser *mParser;
100386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    unsigned mProgramNumber;
101cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned mProgramMapPID;
102cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    KeyedVector<unsigned, sp<Stream> > mStreams;
103bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    bool mFirstPTSValid;
104bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    uint64_t mFirstPTS;
105799c9682b3776a55d234396aee4a302437150c26Chong Zhang    int64_t mLastRecoveredPTS;
106cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
10706528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber    status_t parseProgramMap(ABitReader *br);
108799c9682b3776a55d234396aee4a302437150c26Chong Zhang    int64_t recoverPTS(uint64_t PTS_33bit);
1099bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang    bool switchPIDs(const Vector<StreamInfo> &infos);
110cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
111cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    DISALLOW_EVIL_CONSTRUCTORS(Program);
112cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber};
113cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
114cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberstruct ATSParser::Stream : public RefBase {
11587f2a558dd12043631e12c361abef301bf603140Andreas Huber    Stream(Program *program,
11687f2a558dd12043631e12c361abef301bf603140Andreas Huber           unsigned elementaryPID,
11787f2a558dd12043631e12c361abef301bf603140Andreas Huber           unsigned streamType,
11887f2a558dd12043631e12c361abef301bf603140Andreas Huber           unsigned PCR_PID);
119cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
120bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber    unsigned type() const { return mStreamType; }
121bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber    unsigned pid() const { return mElementaryPID; }
122bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber    void setPID(unsigned pid) { mElementaryPID = pid; }
123bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber
124540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    // Parse the payload and set event when PES with a sync frame is detected.
1259558f6dd733dc450270f38b9a139d384d273ce0aWei Jia    // This method knows when a PES starts; so record mPesStartOffsets in that
126540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    // case.
1275403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber    status_t parse(
12887f2a558dd12043631e12c361abef301bf603140Andreas Huber            unsigned continuity_counter,
129cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            unsigned payload_unit_start_indicator,
130540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim            ABitReader *br,
131540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim            SyncEvent *event);
132cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
13332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber    void signalDiscontinuity(
13432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            DiscontinuityType type, const sp<AMessage> &extra);
13532f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
136f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    void signalEOS(status_t finalResult);
1372a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber
138cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    sp<MediaSource> getSource(SourceType type);
139cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
140bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih    bool isAudio() const;
141bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih    bool isVideo() const;
1420852843d304006e3ab333081fddda13b07193de8Robert Shih    bool isMeta() const;
143bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih
144cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberprotected:
145cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    virtual ~Stream();
146cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
147cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberprivate:
148bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    Program *mProgram;
149cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned mElementaryPID;
150cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned mStreamType;
15187f2a558dd12043631e12c361abef301bf603140Andreas Huber    unsigned mPCR_PID;
15287f2a558dd12043631e12c361abef301bf603140Andreas Huber    int32_t mExpectedContinuityCounter;
153cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
154cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    sp<ABuffer> mBuffer;
155cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    sp<AnotherPacketSource> mSource;
156cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    bool mPayloadStarted;
157be9634d071e79b72a42a4504f64eda9e2a0bceb8Marco Nelissen    bool mEOSReached;
158cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
15990a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber    uint64_t mPrevPTS;
1609558f6dd733dc450270f38b9a139d384d273ce0aWei Jia    List<off64_t> mPesStartOffsets;
16190a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber
162386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    ElementaryStreamQueue *mQueue;
1636a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber
164540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    // Flush accumulated payload if necessary --- i.e. at EOS or at the start of
165540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    // another payload. event is set if the flushed payload is PES with a sync
166540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    // frame.
167540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    status_t flush(SyncEvent *event);
168540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    // Strip and parse PES headers and pass remaining payload into onPayload
169540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    // with parsed metadata. event is set if the PES contains a sync frame.
170540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    status_t parsePES(ABitReader *br, SyncEvent *event);
171540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim
172540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    // Feed the payload into mQueue and if a packet is identified, queue it
173540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    // into mSource. If the packet is a sync frame. set event with start offset
174540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    // and timestamp of the packet.
175cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    void onPayloadData(
176cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            unsigned PTS_DTS_flags, uint64_t PTS, uint64_t DTS,
177540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim            const uint8_t *data, size_t size, SyncEvent *event);
17882f7321b03eec1e40af9d681370f754ee0279582Andreas Huber
179cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    DISALLOW_EVIL_CONSTRUCTORS(Stream);
180cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber};
181cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1828dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberstruct ATSParser::PSISection : public RefBase {
1838dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    PSISection();
1848dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
1858dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    status_t append(const void *data, size_t size);
1869ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    void setSkipBytes(uint8_t skip);
1878dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    void clear();
1888dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
1898dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    bool isComplete() const;
1908dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    bool isEmpty() const;
1919ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    bool isCRCOkay() const;
1928dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
1938dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    const uint8_t *data() const;
1948dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    size_t size() const;
1958dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
1968dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberprotected:
1978dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    virtual ~PSISection();
1988dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
1998dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberprivate:
2008dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    sp<ABuffer> mBuffer;
2019ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    uint8_t mSkipBytes;
2029ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    static uint32_t CRC_TABLE[];
2038dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
2048dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    DISALLOW_EVIL_CONSTRUCTORS(PSISection);
2058dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber};
2068dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
207540006666b4191cd78391378f1c66c21bcf0c4cdWonsik KimATSParser::SyncEvent::SyncEvent(off64_t offset)
2089558f6dd733dc450270f38b9a139d384d273ce0aWei Jia    : mHasReturnedData(false), mOffset(offset), mTimeUs(0) {}
209540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim
210540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kimvoid ATSParser::SyncEvent::init(off64_t offset, const sp<MediaSource> &source,
211540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim        int64_t timeUs) {
2129558f6dd733dc450270f38b9a139d384d273ce0aWei Jia    mHasReturnedData = true;
213540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    mOffset = offset;
214540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    mMediaSource = source;
215540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    mTimeUs = timeUs;
216540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim}
217540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim
2189558f6dd733dc450270f38b9a139d384d273ce0aWei Jiavoid ATSParser::SyncEvent::reset() {
2199558f6dd733dc450270f38b9a139d384d273ce0aWei Jia    mHasReturnedData = false;
2209558f6dd733dc450270f38b9a139d384d273ce0aWei Jia}
221cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber////////////////////////////////////////////////////////////////////////////////
222cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
223386d609dc513e838c7e7c4c46c604493ccd560beAndreas HuberATSParser::Program::Program(
224d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang        ATSParser *parser, unsigned programNumber, unsigned programMapPID,
225d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang        int64_t lastRecoveredPTS)
226f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    : mParser(parser),
227386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber      mProgramNumber(programNumber),
228f933441648ef6a71dee783d733aac17b9508b452Andreas Huber      mProgramMapPID(programMapPID),
229bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber      mFirstPTSValid(false),
230799c9682b3776a55d234396aee4a302437150c26Chong Zhang      mFirstPTS(0),
231d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang      mLastRecoveredPTS(lastRecoveredPTS) {
2323856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("new program number %u", programNumber);
233cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
234cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
2358dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberbool ATSParser::Program::parsePSISection(
2368dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        unsigned pid, ABitReader *br, status_t *err) {
23706528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber    *err = OK;
23806528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber
2398dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    if (pid != mProgramMapPID) {
2408dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        return false;
2418dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    }
242cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
2438dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    *err = parseProgramMap(br);
24406528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber
2458dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    return true;
2468dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber}
2478dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
2488dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberbool ATSParser::Program::parsePID(
24987f2a558dd12043631e12c361abef301bf603140Andreas Huber        unsigned pid, unsigned continuity_counter,
25087f2a558dd12043631e12c361abef301bf603140Andreas Huber        unsigned payload_unit_start_indicator,
251540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim        ABitReader *br, status_t *err, SyncEvent *event) {
2528dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    *err = OK;
253cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
254cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    ssize_t index = mStreams.indexOfKey(pid);
255cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    if (index < 0) {
256cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        return false;
257cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
258cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
2595403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber    *err = mStreams.editValueAt(index)->parse(
260540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim            continuity_counter, payload_unit_start_indicator, br, event);
261cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
262cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    return true;
263cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
264cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
26532f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Hubervoid ATSParser::Program::signalDiscontinuity(
26632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        DiscontinuityType type, const sp<AMessage> &extra) {
267b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber    int64_t mediaTimeUs;
268b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber    if ((type & DISCONTINUITY_TIME)
269b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber            && extra != NULL
270b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber            && extra->findInt64(
271b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber                IStreamListener::kKeyMediaTimeUs, &mediaTimeUs)) {
272b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber        mFirstPTSValid = false;
273b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber    }
274b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber
2752a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    for (size_t i = 0; i < mStreams.size(); ++i) {
27632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        mStreams.editValueAt(i)->signalDiscontinuity(type, extra);
277f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
278f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
279f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
280f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ATSParser::Program::signalEOS(status_t finalResult) {
281f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    for (size_t i = 0; i < mStreams.size(); ++i) {
282f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        mStreams.editValueAt(i)->signalEOS(finalResult);
2832a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    }
2842a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber}
2852a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber
2869bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhangbool ATSParser::Program::switchPIDs(const Vector<StreamInfo> &infos) {
2879bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang    bool success = false;
2889bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang
2899bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang    if (mStreams.size() == infos.size()) {
2909bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        // build type->PIDs map for old and new mapping
2919bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        size_t i;
2929bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        KeyedVector<int32_t, Vector<int32_t> > oldType2PIDs, newType2PIDs;
2939bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        for (i = 0; i < mStreams.size(); ++i) {
2949bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            ssize_t index = oldType2PIDs.indexOfKey(mStreams[i]->type());
2959bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            if (index < 0) {
2969bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                oldType2PIDs.add(mStreams[i]->type(), Vector<int32_t>());
2979bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            }
2989bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            oldType2PIDs.editValueFor(mStreams[i]->type()).push_back(mStreams[i]->pid());
2999bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        }
3009bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        for (i = 0; i < infos.size(); ++i) {
3019bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            ssize_t index = newType2PIDs.indexOfKey(infos[i].mType);
3029bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            if (index < 0) {
3039bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                newType2PIDs.add(infos[i].mType, Vector<int32_t>());
3049bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            }
3059bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            newType2PIDs.editValueFor(infos[i].mType).push_back(infos[i].mPID);
3069bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        }
3079bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang
3089bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        // we can recover if the number of streams for each type hasn't changed
3099bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        if (oldType2PIDs.size() == newType2PIDs.size()) {
3109bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            success = true;
3119bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            for (i = 0; i < oldType2PIDs.size(); ++i) {
3129bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                // KeyedVector is sorted, we just compare key and size of each index
3139bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                if (oldType2PIDs.keyAt(i) != newType2PIDs.keyAt(i)
3149bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                        || oldType2PIDs[i].size() != newType2PIDs[i].size()) {
3159bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                     success = false;
3169bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                     break;
3179bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                }
3189bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            }
3199bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        }
3209bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang
3219bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        if (success) {
3229bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            // save current streams to temp
3239bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            KeyedVector<int32_t, sp<Stream> > temp;
3249bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            for (i = 0; i < mStreams.size(); ++i) {
3259bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                 temp.add(mStreams.keyAt(i), mStreams.editValueAt(i));
3269bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            }
3279bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang
3289bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            mStreams.clear();
3299bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            for (i = 0; i < temp.size(); ++i) {
3309bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                // The two checks below shouldn't happen,
3319bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                // we already checked above the stream count matches
3329bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                ssize_t index = newType2PIDs.indexOfKey(temp[i]->type());
333e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                if (index < 0) {
334e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                    return false;
335e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                }
3369bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                Vector<int32_t> &newPIDs = newType2PIDs.editValueAt(index);
337e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                if (newPIDs.isEmpty()) {
338e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                    return false;
339e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                }
3409bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang
3419bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                // get the next PID for temp[i]->type() in the new PID map
3429bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                Vector<int32_t>::iterator it = newPIDs.begin();
3439bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang
3449bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                // change the PID of the stream, and add it back
3459bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                temp.editValueAt(i)->setPID(*it);
3469bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                mStreams.add(temp[i]->pid(), temp.editValueAt(i));
3479bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang
3489bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                // removed the used PID
3499bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                newPIDs.erase(it);
3509bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            }
3519bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        }
3529bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang    }
3539bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang    return success;
3549bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang}
355bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber
35606528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huberstatus_t ATSParser::Program::parseProgramMap(ABitReader *br) {
357cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned table_id = br->getBits(8);
3583856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("  table_id = %u", table_id);
3596456ae745e919085c5024f784aaa2703f9695f98David Yeh    if (table_id != 0x02u) {
3606456ae745e919085c5024f784aaa2703f9695f98David Yeh        ALOGE("PMT data error!");
3616456ae745e919085c5024f784aaa2703f9695f98David Yeh        return ERROR_MALFORMED;
3626456ae745e919085c5024f784aaa2703f9695f98David Yeh    }
3636e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    unsigned section_syntax_indicator = br->getBits(1);
3643856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("  section_syntax_indicator = %u", section_syntax_indicator);
3656456ae745e919085c5024f784aaa2703f9695f98David Yeh    if (section_syntax_indicator != 1u) {
3666456ae745e919085c5024f784aaa2703f9695f98David Yeh        ALOGE("PMT data error!");
3676456ae745e919085c5024f784aaa2703f9695f98David Yeh        return ERROR_MALFORMED;
3686456ae745e919085c5024f784aaa2703f9695f98David Yeh    }
369cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
370e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim    br->skipBits(1);  // '0'
3716e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  reserved = %u", br->getBits(2));
372cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
373cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned section_length = br->getBits(12);
3743856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("  section_length = %u", section_length);
375cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
3766e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  program_number = %u", br->getBits(16));
3776e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  reserved = %u", br->getBits(2));
3786e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  version_number = %u", br->getBits(5));
3796e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  current_next_indicator = %u", br->getBits(1));
3806e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  section_number = %u", br->getBits(8));
3816e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  last_section_number = %u", br->getBits(8));
3826e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  reserved = %u", br->getBits(3));
38387f2a558dd12043631e12c361abef301bf603140Andreas Huber
38487f2a558dd12043631e12c361abef301bf603140Andreas Huber    unsigned PCR_PID = br->getBits(13);
38587f2a558dd12043631e12c361abef301bf603140Andreas Huber    ALOGV("  PCR_PID = 0x%04x", PCR_PID);
38687f2a558dd12043631e12c361abef301bf603140Andreas Huber
3876e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  reserved = %u", br->getBits(4));
388cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
389cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned program_info_length = br->getBits(12);
3903856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("  program_info_length = %u", program_info_length);
391cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
392cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    br->skipBits(program_info_length * 8);  // skip descriptors
393cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
394bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber    Vector<StreamInfo> infos;
395bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber
396cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    // infoBytesRemaining is the number of bytes that make up the
397cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    // variable length section of ES_infos. It does not include the
398cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    // final CRC.
399cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    size_t infoBytesRemaining = section_length - 9 - program_info_length - 4;
400cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
401e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim    while (infoBytesRemaining >= 5) {
402cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
403cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned streamType = br->getBits(8);
4043856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("    stream_type = 0x%02x", streamType);
405cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
4066e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber        MY_LOGV("    reserved = %u", br->getBits(3));
407cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
408cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned elementaryPID = br->getBits(13);
4093856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("    elementary_PID = 0x%04x", elementaryPID);
410cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
4116e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber        MY_LOGV("    reserved = %u", br->getBits(4));
412cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
413cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned ES_info_length = br->getBits(12);
4143856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("    ES_info_length = %u", ES_info_length);
415cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
416cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#if 0
417cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        br->skipBits(ES_info_length * 8);  // skip descriptors
418cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#else
419cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned info_bytes_remaining = ES_info_length;
420cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        while (info_bytes_remaining >= 2) {
4216e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber            MY_LOGV("      tag = 0x%02x", br->getBits(8));
422cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
423cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            unsigned descLength = br->getBits(8);
4243856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("      len = %u", descLength);
425cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
426e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            if (info_bytes_remaining < descLength) {
427e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                return ERROR_MALFORMED;
428e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            }
429cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            br->skipBits(descLength * 8);
430cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
431cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            info_bytes_remaining -= descLength + 2;
432cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        }
433cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#endif
434cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
435bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        StreamInfo info;
436bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        info.mType = streamType;
437bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        info.mPID = elementaryPID;
438bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        infos.push(info);
439cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
440cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        infoBytesRemaining -= 5 + ES_info_length;
441cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
442cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
443e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim    if (infoBytesRemaining != 0) {
444e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        ALOGW("Section data remains unconsumed");
445e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim    }
4466e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  CRC = 0x%08x", br->getBits(32));
447bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber
448bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber    bool PIDsChanged = false;
449bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber    for (size_t i = 0; i < infos.size(); ++i) {
450bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        StreamInfo &info = infos.editItemAt(i);
451bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber
452bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        ssize_t index = mStreams.indexOfKey(info.mPID);
453bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber
454bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        if (index >= 0 && mStreams.editValueAt(index)->type() != info.mType) {
455df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block            ALOGI("uh oh. stream PIDs have changed.");
456bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber            PIDsChanged = true;
457bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber            break;
458bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        }
459bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber    }
460bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber
461bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber    if (PIDsChanged) {
46206528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber#if 0
463df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block        ALOGI("before:");
46406528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber        for (size_t i = 0; i < mStreams.size(); ++i) {
46506528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber            sp<Stream> stream = mStreams.editValueAt(i);
46606528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber
467df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block            ALOGI("PID 0x%08x => type 0x%02x", stream->pid(), stream->type());
46806528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber        }
46906528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber
470df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block        ALOGI("after:");
47106528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber        for (size_t i = 0; i < infos.size(); ++i) {
47206528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber            StreamInfo &info = infos.editItemAt(i);
47306528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber
474df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block            ALOGI("PID 0x%08x => type 0x%02x", info.mPID, info.mType);
47506528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber        }
47606528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber#endif
47706528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber
4789bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        // we can recover if number of streams for each type remain the same
4799bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        bool success = switchPIDs(infos);
48006528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber
48106528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber        if (!success) {
482df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block            ALOGI("Stream PIDs changed and we cannot recover.");
48306528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber            return ERROR_MALFORMED;
48406528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber        }
485bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber    }
486bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber
487bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber    for (size_t i = 0; i < infos.size(); ++i) {
488bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        StreamInfo &info = infos.editItemAt(i);
489bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber
490bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        ssize_t index = mStreams.indexOfKey(info.mPID);
491bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber
492bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        if (index < 0) {
49387f2a558dd12043631e12c361abef301bf603140Andreas Huber            sp<Stream> stream = new Stream(
49487f2a558dd12043631e12c361abef301bf603140Andreas Huber                    this, info.mPID, info.mType, PCR_PID);
49587f2a558dd12043631e12c361abef301bf603140Andreas Huber
496bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber            mStreams.add(info.mPID, stream);
497bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        }
498bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber    }
49906528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber
50006528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber    return OK;
501cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
502cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
503799c9682b3776a55d234396aee4a302437150c26Chong Zhangint64_t ATSParser::Program::recoverPTS(uint64_t PTS_33bit) {
504799c9682b3776a55d234396aee4a302437150c26Chong Zhang    // We only have the lower 33-bit of the PTS. It could overflow within a
505799c9682b3776a55d234396aee4a302437150c26Chong Zhang    // reasonable amount of time. To handle the wrap-around, use fancy math
506799c9682b3776a55d234396aee4a302437150c26Chong Zhang    // to get an extended PTS that is within [-0xffffffff, 0xffffffff]
507799c9682b3776a55d234396aee4a302437150c26Chong Zhang    // of the latest recovered PTS.
5089bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang    if (mLastRecoveredPTS < 0ll) {
5099bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        // Use the original 33bit number for 1st frame, the reason is that
5109bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        // if 1st frame wraps to negative that's far away from 0, we could
5119bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        // never start. Only start wrapping around from 2nd frame.
5129bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        mLastRecoveredPTS = static_cast<int64_t>(PTS_33bit);
5139bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang    } else {
5149bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        mLastRecoveredPTS = static_cast<int64_t>(
5153728ba367f1e23e652c5539d9488aa0d0d4ec9d7Chad Brubaker                ((mLastRecoveredPTS - static_cast<int64_t>(PTS_33bit) + 0x100000000ll)
5169bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                & 0xfffffffe00000000ull) | PTS_33bit);
5179bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        // We start from 0, but recovered PTS could be slightly below 0.
5189bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        // Clamp it to 0 as rest of the pipeline doesn't take negative pts.
5199bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        // (eg. video is read first and starts at 0, but audio starts at 0xfffffff0)
5209bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        if (mLastRecoveredPTS < 0ll) {
5215c9054bc6efc080b265e028f2ebb1abd2a2e3953Chih-Hung Hsieh            ALOGI("Clamping negative recovered PTS (%" PRId64 ") to 0", mLastRecoveredPTS);
5229bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            mLastRecoveredPTS = 0ll;
5239bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        }
5249bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang    }
5259bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang
5269bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang    return mLastRecoveredPTS;
527799c9682b3776a55d234396aee4a302437150c26Chong Zhang}
528799c9682b3776a55d234396aee4a302437150c26Chong Zhang
529cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubersp<MediaSource> ATSParser::Program::getSource(SourceType type) {
530cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    for (size_t i = 0; i < mStreams.size(); ++i) {
531cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        sp<MediaSource> source = mStreams.editValueAt(i)->getSource(type);
532cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        if (source != NULL) {
5339ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih            return source;
534cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        }
535cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
536cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
537cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    return NULL;
538cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
539cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
540bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shihbool ATSParser::Program::hasSource(SourceType type) const {
541bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih    for (size_t i = 0; i < mStreams.size(); ++i) {
542bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih        const sp<Stream> &stream = mStreams.valueAt(i);
543bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih        if (type == AUDIO && stream->isAudio()) {
544bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih            return true;
545bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih        } else if (type == VIDEO && stream->isVideo()) {
546bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih            return true;
5479ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih        } else if (type == META && stream->isMeta()) {
5489ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih            return true;
549bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih        }
550bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih    }
551bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih
552bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih    return false;
553bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih}
554bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih
555bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huberint64_t ATSParser::Program::convertPTSToTimestamp(uint64_t PTS) {
556799c9682b3776a55d234396aee4a302437150c26Chong Zhang    PTS = recoverPTS(PTS);
557799c9682b3776a55d234396aee4a302437150c26Chong Zhang
558c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber    if (!(mParser->mFlags & TS_TIMESTAMPS_ARE_ABSOLUTE)) {
559c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber        if (!mFirstPTSValid) {
560c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber            mFirstPTSValid = true;
561c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber            mFirstPTS = PTS;
562c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber            PTS = 0;
563c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber        } else if (PTS < mFirstPTS) {
564c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber            PTS = 0;
565c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber        } else {
566c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber            PTS -= mFirstPTS;
567c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber        }
568bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    }
569bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber
57087f2a558dd12043631e12c361abef301bf603140Andreas Huber    int64_t timeUs = (PTS * 100) / 9;
57187f2a558dd12043631e12c361abef301bf603140Andreas Huber
57287f2a558dd12043631e12c361abef301bf603140Andreas Huber    if (mParser->mAbsoluteTimeAnchorUs >= 0ll) {
57387f2a558dd12043631e12c361abef301bf603140Andreas Huber        timeUs += mParser->mAbsoluteTimeAnchorUs;
57487f2a558dd12043631e12c361abef301bf603140Andreas Huber    }
57587f2a558dd12043631e12c361abef301bf603140Andreas Huber
576d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber    if (mParser->mTimeOffsetValid) {
577d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber        timeUs += mParser->mTimeOffsetUs;
578d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber    }
579d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber
58087f2a558dd12043631e12c361abef301bf603140Andreas Huber    return timeUs;
581bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber}
582bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber
583cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber////////////////////////////////////////////////////////////////////////////////
584cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
585bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas HuberATSParser::Stream::Stream(
58687f2a558dd12043631e12c361abef301bf603140Andreas Huber        Program *program,
58787f2a558dd12043631e12c361abef301bf603140Andreas Huber        unsigned elementaryPID,
58887f2a558dd12043631e12c361abef301bf603140Andreas Huber        unsigned streamType,
58987f2a558dd12043631e12c361abef301bf603140Andreas Huber        unsigned PCR_PID)
590bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    : mProgram(program),
591bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber      mElementaryPID(elementaryPID),
592cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber      mStreamType(streamType),
59387f2a558dd12043631e12c361abef301bf603140Andreas Huber      mPCR_PID(PCR_PID),
59487f2a558dd12043631e12c361abef301bf603140Andreas Huber      mExpectedContinuityCounter(-1),
5956a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber      mPayloadStarted(false),
596be9634d071e79b72a42a4504f64eda9e2a0bceb8Marco Nelissen      mEOSReached(false),
59790a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber      mPrevPTS(0),
598386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber      mQueue(NULL) {
599386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    switch (mStreamType) {
600386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        case STREAMTYPE_H264:
60187f2a558dd12043631e12c361abef301bf603140Andreas Huber            mQueue = new ElementaryStreamQueue(
60287f2a558dd12043631e12c361abef301bf603140Andreas Huber                    ElementaryStreamQueue::H264,
60387f2a558dd12043631e12c361abef301bf603140Andreas Huber                    (mProgram->parserFlags() & ALIGNED_VIDEO_DATA)
60487f2a558dd12043631e12c361abef301bf603140Andreas Huber                        ? ElementaryStreamQueue::kFlag_AlignedData : 0);
605386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            break;
6066e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        case STREAMTYPE_MPEG2_AUDIO_ADTS:
607386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            mQueue = new ElementaryStreamQueue(ElementaryStreamQueue::AAC);
608386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            break;
609386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        case STREAMTYPE_MPEG1_AUDIO:
610386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        case STREAMTYPE_MPEG2_AUDIO:
611386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            mQueue = new ElementaryStreamQueue(
612386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                    ElementaryStreamQueue::MPEG_AUDIO);
613386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            break;
614386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
615386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        case STREAMTYPE_MPEG1_VIDEO:
616386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        case STREAMTYPE_MPEG2_VIDEO:
617386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            mQueue = new ElementaryStreamQueue(
618386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                    ElementaryStreamQueue::MPEG_VIDEO);
619386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            break;
620386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
621386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        case STREAMTYPE_MPEG4_VIDEO:
622386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            mQueue = new ElementaryStreamQueue(
623386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                    ElementaryStreamQueue::MPEG4_VIDEO);
624386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            break;
625386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
6269bf32f06e8971c1d3eb4fc5edd74b69557f97212Chong Zhang        case STREAMTYPE_LPCM_AC3:
627d3c079ae9859011d118f94616d0069c2987013edChangwan Ryu        case STREAMTYPE_AC3:
628d3c079ae9859011d118f94616d0069c2987013edChangwan Ryu            mQueue = new ElementaryStreamQueue(
629d3c079ae9859011d118f94616d0069c2987013edChangwan Ryu                    ElementaryStreamQueue::AC3);
630d3c079ae9859011d118f94616d0069c2987013edChangwan Ryu            break;
631d3c079ae9859011d118f94616d0069c2987013edChangwan Ryu
6320852843d304006e3ab333081fddda13b07193de8Robert Shih        case STREAMTYPE_METADATA:
6330852843d304006e3ab333081fddda13b07193de8Robert Shih            mQueue = new ElementaryStreamQueue(
6340852843d304006e3ab333081fddda13b07193de8Robert Shih                    ElementaryStreamQueue::METADATA);
6350852843d304006e3ab333081fddda13b07193de8Robert Shih            break;
6360852843d304006e3ab333081fddda13b07193de8Robert Shih
637386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        default:
638386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            break;
639386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    }
640386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
6413856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("new stream PID 0x%02x, type 0x%02x", elementaryPID, streamType);
64218ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber
64318ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber    if (mQueue != NULL) {
64418ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber        mBuffer = new ABuffer(192 * 1024);
64518ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber        mBuffer->setRange(0, 0);
64618ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber    }
647cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
648cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
649cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas HuberATSParser::Stream::~Stream() {
650386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    delete mQueue;
651386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    mQueue = NULL;
652cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
653cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
6545403129e2a2f44620f2ac8109889e5a61be08732Andreas Huberstatus_t ATSParser::Stream::parse(
65587f2a558dd12043631e12c361abef301bf603140Andreas Huber        unsigned continuity_counter,
656540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim        unsigned payload_unit_start_indicator, ABitReader *br,
657540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim        SyncEvent *event) {
65818ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber    if (mQueue == NULL) {
6595403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber        return OK;
66018ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber    }
66118ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber
66287f2a558dd12043631e12c361abef301bf603140Andreas Huber    if (mExpectedContinuityCounter >= 0
66387f2a558dd12043631e12c361abef301bf603140Andreas Huber            && (unsigned)mExpectedContinuityCounter != continuity_counter) {
66487f2a558dd12043631e12c361abef301bf603140Andreas Huber        ALOGI("discontinuity on stream pid 0x%04x", mElementaryPID);
66587f2a558dd12043631e12c361abef301bf603140Andreas Huber
66687f2a558dd12043631e12c361abef301bf603140Andreas Huber        mPayloadStarted = false;
6679558f6dd733dc450270f38b9a139d384d273ce0aWei Jia        mPesStartOffsets.clear();
66887f2a558dd12043631e12c361abef301bf603140Andreas Huber        mBuffer->setRange(0, 0);
66987f2a558dd12043631e12c361abef301bf603140Andreas Huber        mExpectedContinuityCounter = -1;
67087f2a558dd12043631e12c361abef301bf603140Andreas Huber
67194a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber#if 0
67294a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber        // Uncomment this if you'd rather see no corruption whatsoever on
67394a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber        // screen and suspend updates until we come across another IDR frame.
67494a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber
67594a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber        if (mStreamType == STREAMTYPE_H264) {
67694a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber            ALOGI("clearing video queue");
67794a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber            mQueue->clear(true /* clearFormat */);
67894a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber        }
67994a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber#endif
68094a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber
68166830855846db5c211c2da6c055ca9b4167e8974Chong Zhang        if (!payload_unit_start_indicator) {
68266830855846db5c211c2da6c055ca9b4167e8974Chong Zhang            return OK;
68366830855846db5c211c2da6c055ca9b4167e8974Chong Zhang        }
68487f2a558dd12043631e12c361abef301bf603140Andreas Huber    }
68587f2a558dd12043631e12c361abef301bf603140Andreas Huber
68687f2a558dd12043631e12c361abef301bf603140Andreas Huber    mExpectedContinuityCounter = (continuity_counter + 1) & 0x0f;
68787f2a558dd12043631e12c361abef301bf603140Andreas Huber
688cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    if (payload_unit_start_indicator) {
689540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim        off64_t offset = (event != NULL) ? event->getOffset() : 0;
690cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        if (mPayloadStarted) {
691cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            // Otherwise we run the danger of receiving the trailing bytes
692cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            // of a PES packet that we never saw the start of and assuming
693cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            // we have a a complete PES packet.
694cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
695540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim            status_t err = flush(event);
6965403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber
6975403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber            if (err != OK) {
69865959d34fdab8319dbf765be5fbf7ff8051eedf1Wonsik Kim                ALOGW("Error (%08x) happened while flushing; we simply discard "
69965959d34fdab8319dbf765be5fbf7ff8051eedf1Wonsik Kim                      "the PES packet and continue.", err);
7005403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber            }
701cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        }
702cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
703cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        mPayloadStarted = true;
7049558f6dd733dc450270f38b9a139d384d273ce0aWei Jia        mPesStartOffsets.push_back(offset);
705cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
706cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
707cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    if (!mPayloadStarted) {
7085403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber        return OK;
709cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
710cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
711cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    size_t payloadSizeBits = br->numBitsLeft();
712e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim    if (payloadSizeBits % 8 != 0u) {
713e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        ALOGE("Wrong value");
714e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        return BAD_VALUE;
715e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim    }
716cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
7173e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber    size_t neededSize = mBuffer->size() + payloadSizeBits / 8;
7183e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber    if (mBuffer->capacity() < neededSize) {
7193e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber        // Increment in multiples of 64K.
7203e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber        neededSize = (neededSize + 65535) & ~65535;
7213e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber
722b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross        ALOGI("resizing buffer to %zu bytes", neededSize);
7233e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber
7243e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber        sp<ABuffer> newBuffer = new ABuffer(neededSize);
7253e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber        memcpy(newBuffer->data(), mBuffer->data(), mBuffer->size());
7263e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber        newBuffer->setRange(0, mBuffer->size());
7273e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber        mBuffer = newBuffer;
7283e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber    }
729cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
730cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    memcpy(mBuffer->data() + mBuffer->size(), br->data(), payloadSizeBits / 8);
731cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    mBuffer->setRange(0, mBuffer->size() + payloadSizeBits / 8);
7325403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber
7335403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber    return OK;
734cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
735cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
7366e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huberbool ATSParser::Stream::isVideo() const {
7376e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    switch (mStreamType) {
7386e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        case STREAMTYPE_H264:
7396e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        case STREAMTYPE_MPEG1_VIDEO:
7406e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        case STREAMTYPE_MPEG2_VIDEO:
7416e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        case STREAMTYPE_MPEG4_VIDEO:
7426e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber            return true;
7436e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
7446e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        default:
7456e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber            return false;
7466e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    }
7476e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber}
7486e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
7496e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huberbool ATSParser::Stream::isAudio() const {
7506e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    switch (mStreamType) {
7516e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        case STREAMTYPE_MPEG1_AUDIO:
7526e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        case STREAMTYPE_MPEG2_AUDIO:
7536e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        case STREAMTYPE_MPEG2_AUDIO_ADTS:
7549bf32f06e8971c1d3eb4fc5edd74b69557f97212Chong Zhang        case STREAMTYPE_LPCM_AC3:
755d3c079ae9859011d118f94616d0069c2987013edChangwan Ryu        case STREAMTYPE_AC3:
7566e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber            return true;
7576e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
7586e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        default:
7596e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber            return false;
7606e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    }
7616e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber}
7626e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
7630852843d304006e3ab333081fddda13b07193de8Robert Shihbool ATSParser::Stream::isMeta() const {
7640852843d304006e3ab333081fddda13b07193de8Robert Shih    if (mStreamType == STREAMTYPE_METADATA) {
7650852843d304006e3ab333081fddda13b07193de8Robert Shih        return true;
7660852843d304006e3ab333081fddda13b07193de8Robert Shih    }
7670852843d304006e3ab333081fddda13b07193de8Robert Shih    return false;
7680852843d304006e3ab333081fddda13b07193de8Robert Shih}
7690852843d304006e3ab333081fddda13b07193de8Robert Shih
77032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Hubervoid ATSParser::Stream::signalDiscontinuity(
77132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        DiscontinuityType type, const sp<AMessage> &extra) {
7720389cc09f7b90f155a8942a0d2e1925cad1dbe2dMarco Nelissen    mExpectedContinuityCounter = -1;
7730389cc09f7b90f155a8942a0d2e1925cad1dbe2dMarco Nelissen
77418ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber    if (mQueue == NULL) {
77518ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber        return;
77618ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber    }
77718ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber
7782a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    mPayloadStarted = false;
7799558f6dd733dc450270f38b9a139d384d273ce0aWei Jia    mPesStartOffsets.clear();
780aabbdc7401ae24a4199f12a283985deb648673c0Robert Shih    mEOSReached = false;
7812a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    mBuffer->setRange(0, 0);
7822a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber
7836e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    bool clearFormat = false;
7846e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    if (isAudio()) {
7856e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        if (type & DISCONTINUITY_AUDIO_FORMAT) {
7866e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber            clearFormat = true;
7876e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        }
7886e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    } else {
7896e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        if (type & DISCONTINUITY_VIDEO_FORMAT) {
7906e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber            clearFormat = true;
7916e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        }
7926e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    }
793f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
7946e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    mQueue->clear(clearFormat);
79532f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
7966e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    if (type & DISCONTINUITY_TIME) {
7976e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        uint64_t resumeAtPTS;
7986e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        if (extra != NULL
7996e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                && extra->findInt64(
8006e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    IStreamListener::kKeyResumeAtPTS,
8016e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    (int64_t *)&resumeAtPTS)) {
8026e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber            int64_t resumeAtMediaTimeUs =
8036e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                mProgram->convertPTSToTimestamp(resumeAtPTS);
80432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
805c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia            extra->setInt64("resume-at-mediaTimeUs", resumeAtMediaTimeUs);
806e332a9181cf6a3155ed1a0fd2afc212ccb1f2753Andreas Huber        }
8076e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    }
808f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
8096e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    if (mSource != NULL) {
810632740c58119a132ce19f6d498e39c5c3773971aChong Zhang        mSource->queueDiscontinuity(type, extra, true);
811bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    }
812f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
813bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber
814f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ATSParser::Stream::signalEOS(status_t finalResult) {
815f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (mSource != NULL) {
816f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        mSource->signalEOS(finalResult);
8172a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    }
818be9634d071e79b72a42a4504f64eda9e2a0bceb8Marco Nelissen    mEOSReached = true;
819540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    flush(NULL);
8202a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber}
8212a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber
822540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kimstatus_t ATSParser::Stream::parsePES(ABitReader *br, SyncEvent *event) {
823cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned packet_startcode_prefix = br->getBits(24);
824cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
8253856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("packet_startcode_prefix = 0x%08x", packet_startcode_prefix);
826cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
827386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    if (packet_startcode_prefix != 1) {
8283856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("Supposedly payload_unit_start=1 unit does not start "
829386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber             "with startcode.");
8305403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber
8315403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber        return ERROR_MALFORMED;
832386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    }
833386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
834cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned stream_id = br->getBits(8);
8353856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("stream_id = 0x%02x", stream_id);
836cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
837cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned PES_packet_length = br->getBits(16);
8383856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("PES_packet_length = %u", PES_packet_length);
839cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
840cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    if (stream_id != 0xbc  // program_stream_map
841cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            && stream_id != 0xbe  // padding_stream
842cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            && stream_id != 0xbf  // private_stream_2
843cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            && stream_id != 0xf0  // ECM
844cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            && stream_id != 0xf1  // EMM
845cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            && stream_id != 0xff  // program_stream_directory
846cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            && stream_id != 0xf2  // DSMCC
847cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            && stream_id != 0xf8) {  // H.222.1 type E
848e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        if (br->getBits(2) != 2u) {
849e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            return ERROR_MALFORMED;
850e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        }
851cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
8526e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber        MY_LOGV("PES_scrambling_control = %u", br->getBits(2));
8536e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber        MY_LOGV("PES_priority = %u", br->getBits(1));
8546e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber        MY_LOGV("data_alignment_indicator = %u", br->getBits(1));
8556e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber        MY_LOGV("copyright = %u", br->getBits(1));
8566e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber        MY_LOGV("original_or_copy = %u", br->getBits(1));
857cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
858cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned PTS_DTS_flags = br->getBits(2);
8593856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("PTS_DTS_flags = %u", PTS_DTS_flags);
860cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
861cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned ESCR_flag = br->getBits(1);
8623856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("ESCR_flag = %u", ESCR_flag);
863cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
864cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned ES_rate_flag = br->getBits(1);
8653856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("ES_rate_flag = %u", ES_rate_flag);
866cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
867cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned DSM_trick_mode_flag = br->getBits(1);
8683856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("DSM_trick_mode_flag = %u", DSM_trick_mode_flag);
869cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
870cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned additional_copy_info_flag = br->getBits(1);
8713856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("additional_copy_info_flag = %u", additional_copy_info_flag);
872cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
8736e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber        MY_LOGV("PES_CRC_flag = %u", br->getBits(1));
8746e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber        MY_LOGV("PES_extension_flag = %u", br->getBits(1));
875cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
876cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned PES_header_data_length = br->getBits(8);
8773856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("PES_header_data_length = %u", PES_header_data_length);
878cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
879cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned optional_bytes_remaining = PES_header_data_length;
880cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
881cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        uint64_t PTS = 0, DTS = 0;
882cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
883cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        if (PTS_DTS_flags == 2 || PTS_DTS_flags == 3) {
884e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            if (optional_bytes_remaining < 5u) {
885e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                return ERROR_MALFORMED;
886e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            }
887cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
8886456ae745e919085c5024f784aaa2703f9695f98David Yeh            if (br->getBits(4) != PTS_DTS_flags) {
8896456ae745e919085c5024f784aaa2703f9695f98David Yeh                return ERROR_MALFORMED;
8906456ae745e919085c5024f784aaa2703f9695f98David Yeh            }
891cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            PTS = ((uint64_t)br->getBits(3)) << 30;
892e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            if (br->getBits(1) != 1u) {
893e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                return ERROR_MALFORMED;
894e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            }
895cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            PTS |= ((uint64_t)br->getBits(15)) << 15;
896e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            if (br->getBits(1) != 1u) {
897e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                return ERROR_MALFORMED;
898e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            }
899cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            PTS |= br->getBits(15);
900e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            if (br->getBits(1) != 1u) {
901e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                return ERROR_MALFORMED;
902e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            }
903cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
904b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross            ALOGV("PTS = 0x%016" PRIx64 " (%.2f)", PTS, PTS / 90000.0);
905cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
906cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            optional_bytes_remaining -= 5;
907cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
908cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            if (PTS_DTS_flags == 3) {
909e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                if (optional_bytes_remaining < 5u) {
910e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                    return ERROR_MALFORMED;
911e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                }
912cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
913e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                if (br->getBits(4) != 1u) {
914e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                    return ERROR_MALFORMED;
915e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                }
916cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
917cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber                DTS = ((uint64_t)br->getBits(3)) << 30;
918e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                if (br->getBits(1) != 1u) {
919e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                    return ERROR_MALFORMED;
920e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                }
921cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber                DTS |= ((uint64_t)br->getBits(15)) << 15;
922e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                if (br->getBits(1) != 1u) {
923e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                    return ERROR_MALFORMED;
924e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                }
925cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber                DTS |= br->getBits(15);
926e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                if (br->getBits(1) != 1u) {
927e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                    return ERROR_MALFORMED;
928e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                }
929cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
930b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross                ALOGV("DTS = %" PRIu64, DTS);
931cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
932cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber                optional_bytes_remaining -= 5;
933cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            }
934cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        }
935cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
936cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        if (ESCR_flag) {
937e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            if (optional_bytes_remaining < 6u) {
938e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                return ERROR_MALFORMED;
939e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            }
940cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
941cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            br->getBits(2);
942cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
943cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            uint64_t ESCR = ((uint64_t)br->getBits(3)) << 30;
944e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            if (br->getBits(1) != 1u) {
945e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                return ERROR_MALFORMED;
946e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            }
947cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            ESCR |= ((uint64_t)br->getBits(15)) << 15;
948e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            if (br->getBits(1) != 1u) {
949e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                return ERROR_MALFORMED;
950e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            }
951cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            ESCR |= br->getBits(15);
952e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            if (br->getBits(1) != 1u) {
953e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                return ERROR_MALFORMED;
954e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            }
955cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
956b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross            ALOGV("ESCR = %" PRIu64, ESCR);
9576e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber            MY_LOGV("ESCR_extension = %u", br->getBits(9));
958cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
959e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            if (br->getBits(1) != 1u) {
960e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                return ERROR_MALFORMED;
961e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            }
962cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
963cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            optional_bytes_remaining -= 6;
964cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        }
965cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
966cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        if (ES_rate_flag) {
967e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            if (optional_bytes_remaining < 3u) {
968e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                return ERROR_MALFORMED;
969e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            }
970cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
971e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            if (br->getBits(1) != 1u) {
972e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                return ERROR_MALFORMED;
973e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            }
9746e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber            MY_LOGV("ES_rate = %u", br->getBits(22));
975e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            if (br->getBits(1) != 1u) {
976e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                return ERROR_MALFORMED;
977e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            }
978cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
979cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            optional_bytes_remaining -= 3;
980cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        }
981cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
982cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        br->skipBits(optional_bytes_remaining * 8);
983cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
984cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        // ES data follows.
985cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
986cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        if (PES_packet_length != 0) {
987e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            if (PES_packet_length < PES_header_data_length + 3) {
988e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                return ERROR_MALFORMED;
989e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            }
990cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
991cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            unsigned dataLength =
992cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber                PES_packet_length - 3 - PES_header_data_length;
993cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
9945403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber            if (br->numBitsLeft() < dataLength * 8) {
99529357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block                ALOGE("PES packet does not carry enough data to contain "
996b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross                     "payload. (numBitsLeft = %zu, required = %u)",
9975403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber                     br->numBitsLeft(), dataLength * 8);
9985403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber
9995403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber                return ERROR_MALFORMED;
10005403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber            }
10015403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber
10020da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber            onPayloadData(
1003540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim                    PTS_DTS_flags, PTS, DTS, br->data(), dataLength, event);
1004cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1005cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            br->skipBits(dataLength * 8);
1006cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        } else {
10070da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber            onPayloadData(
10080da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber                    PTS_DTS_flags, PTS, DTS,
1009540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim                    br->data(), br->numBitsLeft() / 8, event);
10100da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber
1011cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            size_t payloadSizeBits = br->numBitsLeft();
1012e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            if (payloadSizeBits % 8 != 0u) {
1013e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                return ERROR_MALFORMED;
1014e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            }
1015cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1016b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross            ALOGV("There's %zu bytes of payload.", payloadSizeBits / 8);
1017cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        }
1018cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    } else if (stream_id == 0xbe) {  // padding_stream
1019e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        if (PES_packet_length == 0u) {
1020e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            return ERROR_MALFORMED;
1021e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        }
1022cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        br->skipBits(PES_packet_length * 8);
1023cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    } else {
1024e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        if (PES_packet_length == 0u) {
1025e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            return ERROR_MALFORMED;
1026e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        }
1027cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        br->skipBits(PES_packet_length * 8);
1028cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
10295403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber
10305403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber    return OK;
1031cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
1032cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1033540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kimstatus_t ATSParser::Stream::flush(SyncEvent *event) {
1034f2cecd570c35d3b6422396dd51c0b4202732bceaJaesung Chung    if (mBuffer == NULL || mBuffer->size() == 0) {
10355403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber        return OK;
1036cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
1037cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1038b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross    ALOGV("flushing stream 0x%04x size = %zu", mElementaryPID, mBuffer->size());
1039cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1040cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    ABitReader br(mBuffer->data(), mBuffer->size());
10415403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber
1042540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    status_t err = parsePES(&br, event);
1043cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1044cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    mBuffer->setRange(0, 0);
10455403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber
10465403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber    return err;
1047cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
1048cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1049cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubervoid ATSParser::Stream::onPayloadData(
105084333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber        unsigned PTS_DTS_flags, uint64_t PTS, uint64_t /* DTS */,
1051540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim        const uint8_t *data, size_t size, SyncEvent *event) {
105290a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber#if 0
105390a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber    ALOGI("payload streamType 0x%02x, PTS = 0x%016llx, dPTS = %lld",
105490a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber          mStreamType,
105590a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber          PTS,
105690a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber          (int64_t)PTS - mPrevPTS);
105790a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber    mPrevPTS = PTS;
105890a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber#endif
105990a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber
10603856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("onPayloadData mStreamType=0x%02x", mStreamType);
1061cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
106298a46cf165d8de3779874eba01803bbc485f45b9Andreas Huber    int64_t timeUs = 0ll;  // no presentation timestamp available.
106398a46cf165d8de3779874eba01803bbc485f45b9Andreas Huber    if (PTS_DTS_flags == 2 || PTS_DTS_flags == 3) {
106498a46cf165d8de3779874eba01803bbc485f45b9Andreas Huber        timeUs = mProgram->convertPTSToTimestamp(PTS);
106598a46cf165d8de3779874eba01803bbc485f45b9Andreas Huber    }
106682f7321b03eec1e40af9d681370f754ee0279582Andreas Huber
1067386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    status_t err = mQueue->appendData(data, size, timeUs);
1068decd96988e495133e4a1728f612d4c9fdb4d218eAndreas Huber
1069be9634d071e79b72a42a4504f64eda9e2a0bceb8Marco Nelissen    if (mEOSReached) {
1070be9634d071e79b72a42a4504f64eda9e2a0bceb8Marco Nelissen        mQueue->signalEOS();
1071be9634d071e79b72a42a4504f64eda9e2a0bceb8Marco Nelissen    }
1072be9634d071e79b72a42a4504f64eda9e2a0bceb8Marco Nelissen
1073decd96988e495133e4a1728f612d4c9fdb4d218eAndreas Huber    if (err != OK) {
1074decd96988e495133e4a1728f612d4c9fdb4d218eAndreas Huber        return;
1075decd96988e495133e4a1728f612d4c9fdb4d218eAndreas Huber    }
107682f7321b03eec1e40af9d681370f754ee0279582Andreas Huber
10776a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber    sp<ABuffer> accessUnit;
1078540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    bool found = false;
1079386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    while ((accessUnit = mQueue->dequeueAccessUnit()) != NULL) {
10806a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber        if (mSource == NULL) {
1081386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            sp<MetaData> meta = mQueue->getFormat();
108282f7321b03eec1e40af9d681370f754ee0279582Andreas Huber
10836a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber            if (meta != NULL) {
10843856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                ALOGV("Stream PID 0x%08x of type 0x%02x now has data.",
1085386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                     mElementaryPID, mStreamType);
1086386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
1087309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih                const char *mime;
1088309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih                if (meta->findCString(kKeyMIMEType, &mime)
1089309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih                        && !strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_AVC)
1090309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih                        && !IsIDR(accessUnit)) {
1091309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih                    continue;
1092309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih                }
10936a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber                mSource = new AnotherPacketSource(meta);
10946a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber                mSource->queueAccessUnit(accessUnit);
109582f7321b03eec1e40af9d681370f754ee0279582Andreas Huber            }
1096386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        } else if (mQueue->getFormat() != NULL) {
10972a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber            // After a discontinuity we invalidate the queue's format
10982a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber            // and won't enqueue any access units to the source until
10992a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber            // the queue has reestablished the new format.
11005bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
11015bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            if (mSource->getFormat() == NULL) {
1102386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                mSource->setFormat(mQueue->getFormat());
11035bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            }
11046a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber            mSource->queueAccessUnit(accessUnit);
110582f7321b03eec1e40af9d681370f754ee0279582Andreas Huber        }
1106540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim
1107540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim        if ((event != NULL) && !found && mQueue->getFormat() != NULL) {
1108540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim            int32_t sync = 0;
1109540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim            if (accessUnit->meta()->findInt32("isSync", &sync) && sync) {
1110540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim                int64_t timeUs;
1111540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim                if (accessUnit->meta()->findInt64("timeUs", &timeUs)) {
1112540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim                    found = true;
11139558f6dd733dc450270f38b9a139d384d273ce0aWei Jia                    off64_t pesStartOffset = *mPesStartOffsets.begin();
11149558f6dd733dc450270f38b9a139d384d273ce0aWei Jia                    event->init(pesStartOffset, mSource, timeUs);
11159558f6dd733dc450270f38b9a139d384d273ce0aWei Jia                    mPesStartOffsets.erase(mPesStartOffsets.begin());
1116540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim                }
1117540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim            }
1118540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim        }
111982f7321b03eec1e40af9d681370f754ee0279582Andreas Huber    }
112082f7321b03eec1e40af9d681370f754ee0279582Andreas Huber}
112182f7321b03eec1e40af9d681370f754ee0279582Andreas Huber
1122cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubersp<MediaSource> ATSParser::Stream::getSource(SourceType type) {
1123386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    switch (type) {
1124386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        case VIDEO:
1125386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        {
11266e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber            if (isVideo()) {
1127386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                return mSource;
1128386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            }
1129386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            break;
1130386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        }
1131386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
1132386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        case AUDIO:
1133386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        {
11346e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber            if (isAudio()) {
1135386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                return mSource;
1136386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            }
1137386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            break;
1138386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        }
1139386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
11400852843d304006e3ab333081fddda13b07193de8Robert Shih        case META:
11410852843d304006e3ab333081fddda13b07193de8Robert Shih        {
11420852843d304006e3ab333081fddda13b07193de8Robert Shih            if (isMeta()) {
11430852843d304006e3ab333081fddda13b07193de8Robert Shih                return mSource;
11440852843d304006e3ab333081fddda13b07193de8Robert Shih            }
11450852843d304006e3ab333081fddda13b07193de8Robert Shih            break;
11460852843d304006e3ab333081fddda13b07193de8Robert Shih        }
11470852843d304006e3ab333081fddda13b07193de8Robert Shih
1148386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        default:
1149386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            break;
1150cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
1151cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1152cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    return NULL;
1153cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
1154cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1155cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber////////////////////////////////////////////////////////////////////////////////
1156cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1157c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas HuberATSParser::ATSParser(uint32_t flags)
115887f2a558dd12043631e12c361abef301bf603140Andreas Huber    : mFlags(flags),
115987f2a558dd12043631e12c361abef301bf603140Andreas Huber      mAbsoluteTimeAnchorUs(-1ll),
1160d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber      mTimeOffsetValid(false),
1161d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber      mTimeOffsetUs(0ll),
1162d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang      mLastRecoveredPTS(-1ll),
116387f2a558dd12043631e12c361abef301bf603140Andreas Huber      mNumTSPacketsParsed(0),
116487f2a558dd12043631e12c361abef301bf603140Andreas Huber      mNumPCRs(0) {
11658dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    mPSISections.add(0 /* PID */, new PSISection);
1166cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
1167cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1168cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas HuberATSParser::~ATSParser() {
1169cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
1170cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1171540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kimstatus_t ATSParser::feedTSPacket(const void *data, size_t size,
1172540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim        SyncEvent *event) {
1173e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim    if (size != kTSPacketSize) {
1174e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        ALOGE("Wrong TS packet size");
1175e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        return BAD_VALUE;
1176e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim    }
1177cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1178cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    ABitReader br((const uint8_t *)data, kTSPacketSize);
1179540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    return parseTS(&br, event);
1180cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
1181cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
118232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Hubervoid ATSParser::signalDiscontinuity(
118332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        DiscontinuityType type, const sp<AMessage> &extra) {
1184b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber    int64_t mediaTimeUs;
1185d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang    if ((type & DISCONTINUITY_TIME) && extra != NULL) {
1186d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang        if (extra->findInt64(IStreamListener::kKeyMediaTimeUs, &mediaTimeUs)) {
1187d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang            mAbsoluteTimeAnchorUs = mediaTimeUs;
1188d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang        }
1189d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang        if ((mFlags & TS_TIMESTAMPS_ARE_ABSOLUTE)
1190d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang                && extra->findInt64(
1191d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang                    IStreamListener::kKeyRecentMediaTimeUs, &mediaTimeUs)) {
1192d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang            if (mAbsoluteTimeAnchorUs >= 0ll) {
1193d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang                mediaTimeUs -= mAbsoluteTimeAnchorUs;
1194d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang            }
1195d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang            if (mTimeOffsetValid) {
1196d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang                mediaTimeUs -= mTimeOffsetUs;
1197d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang            }
1198d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang            mLastRecoveredPTS = (mediaTimeUs * 9) / 100;
1199d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang        }
1200b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber    } else if (type == DISCONTINUITY_ABSOLUTE_TIME) {
120187f2a558dd12043631e12c361abef301bf603140Andreas Huber        int64_t timeUs;
1202e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        if (!extra->findInt64("timeUs", &timeUs)) {
1203e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            ALOGE("timeUs not found");
1204e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            return;
1205e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        }
120687f2a558dd12043631e12c361abef301bf603140Andreas Huber
1207e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        if (!mPrograms.empty()) {
1208e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            ALOGE("mPrograms is not empty");
1209e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            return;
1210e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        }
121187f2a558dd12043631e12c361abef301bf603140Andreas Huber        mAbsoluteTimeAnchorUs = timeUs;
121287f2a558dd12043631e12c361abef301bf603140Andreas Huber        return;
1213d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber    } else if (type == DISCONTINUITY_TIME_OFFSET) {
1214d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber        int64_t offset;
1215e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        if (!extra->findInt64("offset", &offset)) {
1216e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            ALOGE("offset not found");
1217e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            return;
1218e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        }
1219d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber
1220d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber        mTimeOffsetValid = true;
1221d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber        mTimeOffsetUs = offset;
1222d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber        return;
122387f2a558dd12043631e12c361abef301bf603140Andreas Huber    }
122487f2a558dd12043631e12c361abef301bf603140Andreas Huber
1225f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    for (size_t i = 0; i < mPrograms.size(); ++i) {
122632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        mPrograms.editItemAt(i)->signalDiscontinuity(type, extra);
1227f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
1228f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
1229f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1230f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ATSParser::signalEOS(status_t finalResult) {
1231e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim    if (finalResult == (status_t) OK) {
1232e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        ALOGE("finalResult not OK");
1233e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        return;
1234e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim    }
1235f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
12362a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    for (size_t i = 0; i < mPrograms.size(); ++i) {
1237f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        mPrograms.editItemAt(i)->signalEOS(finalResult);
12382a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    }
12392a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber}
12402a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber
1241cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubervoid ATSParser::parseProgramAssociationTable(ABitReader *br) {
1242cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned table_id = br->getBits(8);
12433856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("  table_id = %u", table_id);
12446456ae745e919085c5024f784aaa2703f9695f98David Yeh    if (table_id != 0x00u) {
12456456ae745e919085c5024f784aaa2703f9695f98David Yeh        ALOGE("PAT data error!");
12466456ae745e919085c5024f784aaa2703f9695f98David Yeh        return ;
12476456ae745e919085c5024f784aaa2703f9695f98David Yeh    }
1248cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned section_syntax_indictor = br->getBits(1);
12493856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("  section_syntax_indictor = %u", section_syntax_indictor);
1250cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1251e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim    br->skipBits(1);  // '0'
12526e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  reserved = %u", br->getBits(2));
1253cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1254cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned section_length = br->getBits(12);
12553856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("  section_length = %u", section_length);
1256cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
12576e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  transport_stream_id = %u", br->getBits(16));
12586e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  reserved = %u", br->getBits(2));
12596e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  version_number = %u", br->getBits(5));
12606e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  current_next_indicator = %u", br->getBits(1));
12616e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  section_number = %u", br->getBits(8));
12626e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  last_section_number = %u", br->getBits(8));
1263cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1264cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    size_t numProgramBytes = (section_length - 5 /* header */ - 4 /* crc */);
1265cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1266cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    for (size_t i = 0; i < numProgramBytes / 4; ++i) {
1267cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned program_number = br->getBits(16);
12683856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("    program_number = %u", program_number);
1269cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
12706e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber        MY_LOGV("    reserved = %u", br->getBits(3));
1271cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1272cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        if (program_number == 0) {
12736e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber            MY_LOGV("    network_PID = 0x%04x", br->getBits(13));
1274cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        } else {
1275cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            unsigned programMapPID = br->getBits(13);
1276cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
12773856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("    program_map_PID = 0x%04x", programMapPID);
1278cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1279386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            bool found = false;
1280386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            for (size_t index = 0; index < mPrograms.size(); ++index) {
1281386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                const sp<Program> &program = mPrograms.itemAt(index);
1282386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
1283386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                if (program->number() == program_number) {
1284386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                    program->updateProgramMapPID(programMapPID);
1285386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                    found = true;
1286386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                    break;
1287386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                }
1288386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            }
1289386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
1290386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            if (!found) {
1291386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                mPrograms.push(
1292d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang                        new Program(this, program_number, programMapPID, mLastRecoveredPTS));
1293386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            }
12948dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
12958dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            if (mPSISections.indexOfKey(programMapPID) < 0) {
12968dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                mPSISections.add(programMapPID, new PSISection);
12978dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            }
1298cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        }
1299cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
1300cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
13016e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  CRC = 0x%08x", br->getBits(32));
1302cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
1303cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
130406528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huberstatus_t ATSParser::parsePID(
1305cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        ABitReader *br, unsigned PID,
130687f2a558dd12043631e12c361abef301bf603140Andreas Huber        unsigned continuity_counter,
1307540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim        unsigned payload_unit_start_indicator,
1308540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim        SyncEvent *event) {
13098dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    ssize_t sectionIndex = mPSISections.indexOfKey(PID);
13108dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
13118dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    if (sectionIndex >= 0) {
13124b4bb11b8747adeb2efe56c7df4ab6803dd7db41Andreas Huber        sp<PSISection> section = mPSISections.valueAt(sectionIndex);
13138dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
1314cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        if (payload_unit_start_indicator) {
13156456ae745e919085c5024f784aaa2703f9695f98David Yeh            if (!section->isEmpty()) {
13169bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                ALOGW("parsePID encounters payload_unit_start_indicator when section is not empty");
13179bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                section->clear();
13186456ae745e919085c5024f784aaa2703f9695f98David Yeh            }
13198dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
1320cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            unsigned skip = br->getBits(8);
13219ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim            section->setSkipBytes(skip + 1);  // skip filler bytes + pointer field itself
1322cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            br->skipBits(skip * 8);
1323cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        }
13248dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
1325e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        if (br->numBitsLeft() % 8 != 0) {
1326e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            return ERROR_MALFORMED;
1327e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        }
13288dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        status_t err = section->append(br->data(), br->numBitsLeft() / 8);
13298dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
13308dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        if (err != OK) {
13318dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            return err;
13328dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        }
13338dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
13348dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        if (!section->isComplete()) {
13358dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            return OK;
13368dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        }
13378dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
13389ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim        if (!section->isCRCOkay()) {
13399ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim            return BAD_VALUE;
13409ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim        }
13418dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        ABitReader sectionBits(section->data(), section->size());
13428dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
13438dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        if (PID == 0) {
13448dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            parseProgramAssociationTable(&sectionBits);
13458dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        } else {
13468dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            bool handled = false;
13478dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            for (size_t i = 0; i < mPrograms.size(); ++i) {
13488dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                status_t err;
13498dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                if (!mPrograms.editItemAt(i)->parsePSISection(
13508dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                            PID, &sectionBits, &err)) {
13518dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                    continue;
13528dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                }
13538dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
13548dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                if (err != OK) {
13558dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                    return err;
13568dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                }
13578dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
13588dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                handled = true;
13598dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                break;
13608dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            }
13618dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
13628dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            if (!handled) {
13638dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                mPSISections.removeItem(PID);
13644b4bb11b8747adeb2efe56c7df4ab6803dd7db41Andreas Huber                section.clear();
13658dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            }
13668dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        }
13678dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
13684b4bb11b8747adeb2efe56c7df4ab6803dd7db41Andreas Huber        if (section != NULL) {
13694b4bb11b8747adeb2efe56c7df4ab6803dd7db41Andreas Huber            section->clear();
13704b4bb11b8747adeb2efe56c7df4ab6803dd7db41Andreas Huber        }
13718dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
137206528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber        return OK;
1373cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
1374cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1375cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    bool handled = false;
1376cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    for (size_t i = 0; i < mPrograms.size(); ++i) {
137706528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber        status_t err;
1378cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        if (mPrograms.editItemAt(i)->parsePID(
137987f2a558dd12043631e12c361abef301bf603140Andreas Huber                    PID, continuity_counter, payload_unit_start_indicator,
1380540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim                    br, &err, event)) {
138106528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber            if (err != OK) {
138206528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber                return err;
138306528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber            }
138406528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber
1385cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            handled = true;
1386cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            break;
1387cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        }
1388cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
1389cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1390cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    if (!handled) {
13913856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("PID 0x%04x not handled.", PID);
1392cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
139306528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber
139406528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber    return OK;
1395cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
1396cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1397e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kimstatus_t ATSParser::parseAdaptationField(ABitReader *br, unsigned PID) {
1398cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned adaptation_field_length = br->getBits(8);
139987f2a558dd12043631e12c361abef301bf603140Andreas Huber
1400cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    if (adaptation_field_length > 0) {
14018a1fa1ebc2375c9dcaca2b78918c6740fff2ca74Jaesung Chung        if (adaptation_field_length * 8 > br->numBitsLeft()) {
14028a1fa1ebc2375c9dcaca2b78918c6740fff2ca74Jaesung Chung            ALOGV("Adaptation field should be included in a single TS packet.");
14038a1fa1ebc2375c9dcaca2b78918c6740fff2ca74Jaesung Chung            return ERROR_MALFORMED;
14048a1fa1ebc2375c9dcaca2b78918c6740fff2ca74Jaesung Chung        }
14058a1fa1ebc2375c9dcaca2b78918c6740fff2ca74Jaesung Chung
140687f2a558dd12043631e12c361abef301bf603140Andreas Huber        unsigned discontinuity_indicator = br->getBits(1);
140787f2a558dd12043631e12c361abef301bf603140Andreas Huber
140887f2a558dd12043631e12c361abef301bf603140Andreas Huber        if (discontinuity_indicator) {
140987f2a558dd12043631e12c361abef301bf603140Andreas Huber            ALOGV("PID 0x%04x: discontinuity_indicator = 1 (!!!)", PID);
141087f2a558dd12043631e12c361abef301bf603140Andreas Huber        }
141187f2a558dd12043631e12c361abef301bf603140Andreas Huber
141287f2a558dd12043631e12c361abef301bf603140Andreas Huber        br->skipBits(2);
141387f2a558dd12043631e12c361abef301bf603140Andreas Huber        unsigned PCR_flag = br->getBits(1);
141487f2a558dd12043631e12c361abef301bf603140Andreas Huber
141587f2a558dd12043631e12c361abef301bf603140Andreas Huber        size_t numBitsRead = 4;
141687f2a558dd12043631e12c361abef301bf603140Andreas Huber
141787f2a558dd12043631e12c361abef301bf603140Andreas Huber        if (PCR_flag) {
1418e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            if (adaptation_field_length * 8 < 52) {
1419e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                return ERROR_MALFORMED;
1420e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            }
142187f2a558dd12043631e12c361abef301bf603140Andreas Huber            br->skipBits(4);
142287f2a558dd12043631e12c361abef301bf603140Andreas Huber            uint64_t PCR_base = br->getBits(32);
142387f2a558dd12043631e12c361abef301bf603140Andreas Huber            PCR_base = (PCR_base << 1) | br->getBits(1);
142487f2a558dd12043631e12c361abef301bf603140Andreas Huber
142587f2a558dd12043631e12c361abef301bf603140Andreas Huber            br->skipBits(6);
142687f2a558dd12043631e12c361abef301bf603140Andreas Huber            unsigned PCR_ext = br->getBits(9);
142787f2a558dd12043631e12c361abef301bf603140Andreas Huber
142887f2a558dd12043631e12c361abef301bf603140Andreas Huber            // The number of bytes from the start of the current
142987f2a558dd12043631e12c361abef301bf603140Andreas Huber            // MPEG2 transport stream packet up and including
143087f2a558dd12043631e12c361abef301bf603140Andreas Huber            // the final byte of this PCR_ext field.
143187f2a558dd12043631e12c361abef301bf603140Andreas Huber            size_t byteOffsetFromStartOfTSPacket =
143287f2a558dd12043631e12c361abef301bf603140Andreas Huber                (188 - br->numBitsLeft() / 8);
143387f2a558dd12043631e12c361abef301bf603140Andreas Huber
143487f2a558dd12043631e12c361abef301bf603140Andreas Huber            uint64_t PCR = PCR_base * 300 + PCR_ext;
143587f2a558dd12043631e12c361abef301bf603140Andreas Huber
1436b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross            ALOGV("PID 0x%04x: PCR = 0x%016" PRIx64 " (%.2f)",
143787f2a558dd12043631e12c361abef301bf603140Andreas Huber                  PID, PCR, PCR / 27E6);
143887f2a558dd12043631e12c361abef301bf603140Andreas Huber
143987f2a558dd12043631e12c361abef301bf603140Andreas Huber            // The number of bytes received by this parser up to and
144087f2a558dd12043631e12c361abef301bf603140Andreas Huber            // including the final byte of this PCR_ext field.
144119cec89f8b05fd05f8034ee1a4cd39ee09c33f02Marco Nelissen            uint64_t byteOffsetFromStart =
144219cec89f8b05fd05f8034ee1a4cd39ee09c33f02Marco Nelissen                uint64_t(mNumTSPacketsParsed) * 188 + byteOffsetFromStartOfTSPacket;
144387f2a558dd12043631e12c361abef301bf603140Andreas Huber
144487f2a558dd12043631e12c361abef301bf603140Andreas Huber            for (size_t i = 0; i < mPrograms.size(); ++i) {
144587f2a558dd12043631e12c361abef301bf603140Andreas Huber                updatePCR(PID, PCR, byteOffsetFromStart);
144687f2a558dd12043631e12c361abef301bf603140Andreas Huber            }
144787f2a558dd12043631e12c361abef301bf603140Andreas Huber
144887f2a558dd12043631e12c361abef301bf603140Andreas Huber            numBitsRead += 52;
144987f2a558dd12043631e12c361abef301bf603140Andreas Huber        }
145087f2a558dd12043631e12c361abef301bf603140Andreas Huber
145187f2a558dd12043631e12c361abef301bf603140Andreas Huber        br->skipBits(adaptation_field_length * 8 - numBitsRead);
1452cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
1453e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim    return OK;
1454cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
1455cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1456540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kimstatus_t ATSParser::parseTS(ABitReader *br, SyncEvent *event) {
14573856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("---");
1458cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1459cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned sync_byte = br->getBits(8);
14606456ae745e919085c5024f784aaa2703f9695f98David Yeh    if (sync_byte != 0x47u) {
14616456ae745e919085c5024f784aaa2703f9695f98David Yeh        ALOGE("[error] parseTS: return error as sync_byte=0x%x", sync_byte);
14626456ae745e919085c5024f784aaa2703f9695f98David Yeh        return BAD_VALUE;
14636456ae745e919085c5024f784aaa2703f9695f98David Yeh    }
1464cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
146552668ca838e1869676ff95e7388f93ec1858b1e9Andreas Huber    if (br->getBits(1)) {  // transport_error_indicator
146652668ca838e1869676ff95e7388f93ec1858b1e9Andreas Huber        // silently ignore.
146752668ca838e1869676ff95e7388f93ec1858b1e9Andreas Huber        return OK;
146852668ca838e1869676ff95e7388f93ec1858b1e9Andreas Huber    }
1469cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1470cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned payload_unit_start_indicator = br->getBits(1);
14713856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("payload_unit_start_indicator = %u", payload_unit_start_indicator);
1472cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
14736e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("transport_priority = %u", br->getBits(1));
1474cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1475cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned PID = br->getBits(13);
14763856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("PID = 0x%04x", PID);
1477cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
14786e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("transport_scrambling_control = %u", br->getBits(2));
1479cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1480cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned adaptation_field_control = br->getBits(2);
14813856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("adaptation_field_control = %u", adaptation_field_control);
1482cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
14830da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber    unsigned continuity_counter = br->getBits(4);
148487f2a558dd12043631e12c361abef301bf603140Andreas Huber    ALOGV("PID = 0x%04x, continuity_counter = %u", PID, continuity_counter);
14850da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber
1486df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block    // ALOGI("PID = 0x%04x, continuity_counter = %u", PID, continuity_counter);
1487cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
148887f2a558dd12043631e12c361abef301bf603140Andreas Huber    status_t err = OK;
148987f2a558dd12043631e12c361abef301bf603140Andreas Huber
1490e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim    if (adaptation_field_control == 2 || adaptation_field_control == 3) {
1491e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        err = parseAdaptationField(br, PID);
1492e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim    }
1493e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim    if (err == OK) {
1494e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        if (adaptation_field_control == 1 || adaptation_field_control == 3) {
1495540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim            err = parsePID(br, PID, continuity_counter,
1496540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim                    payload_unit_start_indicator, event);
1497e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        }
1498cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
149906528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber
150087f2a558dd12043631e12c361abef301bf603140Andreas Huber    ++mNumTSPacketsParsed;
150187f2a558dd12043631e12c361abef301bf603140Andreas Huber
150287f2a558dd12043631e12c361abef301bf603140Andreas Huber    return err;
1503cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
1504cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1505cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubersp<MediaSource> ATSParser::getSource(SourceType type) {
15069ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih    sp<MediaSource> firstSourceFound;
1507cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    for (size_t i = 0; i < mPrograms.size(); ++i) {
1508386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        const sp<Program> &program = mPrograms.editItemAt(i);
15099ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih        sp<MediaSource> source = program->getSource(type);
15109ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih        if (source == NULL) {
1511386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            continue;
1512386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        }
15139ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih        if (firstSourceFound == NULL) {
15149ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih            firstSourceFound = source;
15159ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih        }
15169ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih        // Prefer programs with both audio/video
15179ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih        switch (type) {
15189ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih            case VIDEO: {
15199ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih                if (program->hasSource(AUDIO)) {
15209ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih                    return source;
15219ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih                }
15229ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih                break;
15239ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih            }
1524386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
15259ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih            case AUDIO: {
15269ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih                if (program->hasSource(VIDEO)) {
15279ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih                    return source;
15289ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih                }
15299ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih                break;
15309ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih            }
1531cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
15329ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih            default:
15339ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih                return source;
1534cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        }
1535cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
1536cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
15379ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih    return firstSourceFound;
1538cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
1539cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1540bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shihbool ATSParser::hasSource(SourceType type) const {
1541bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih    for (size_t i = 0; i < mPrograms.size(); ++i) {
1542bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih        const sp<Program> &program = mPrograms.itemAt(i);
1543bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih        if (program->hasSource(type)) {
1544bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih            return true;
1545bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih        }
1546bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih    }
1547bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih
1548bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih    return false;
1549bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih}
1550bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih
155143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huberbool ATSParser::PTSTimeDeltaEstablished() {
155243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    if (mPrograms.isEmpty()) {
155343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        return false;
155443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    }
155543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
155643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    return mPrograms.editItemAt(0)->PTSTimeDeltaEstablished();
155743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber}
155843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
1559c9fa35cf7c9c11a8acb77128db1a6a13f1befe3cChad Brubaker__attribute__((no_sanitize("integer")))
156087f2a558dd12043631e12c361abef301bf603140Andreas Hubervoid ATSParser::updatePCR(
156119cec89f8b05fd05f8034ee1a4cd39ee09c33f02Marco Nelissen        unsigned /* PID */, uint64_t PCR, uint64_t byteOffsetFromStart) {
156219cec89f8b05fd05f8034ee1a4cd39ee09c33f02Marco Nelissen    ALOGV("PCR 0x%016" PRIx64 " @ %" PRIx64, PCR, byteOffsetFromStart);
156387f2a558dd12043631e12c361abef301bf603140Andreas Huber
156487f2a558dd12043631e12c361abef301bf603140Andreas Huber    if (mNumPCRs == 2) {
156587f2a558dd12043631e12c361abef301bf603140Andreas Huber        mPCR[0] = mPCR[1];
156687f2a558dd12043631e12c361abef301bf603140Andreas Huber        mPCRBytes[0] = mPCRBytes[1];
156787f2a558dd12043631e12c361abef301bf603140Andreas Huber        mSystemTimeUs[0] = mSystemTimeUs[1];
156887f2a558dd12043631e12c361abef301bf603140Andreas Huber        mNumPCRs = 1;
156987f2a558dd12043631e12c361abef301bf603140Andreas Huber    }
157087f2a558dd12043631e12c361abef301bf603140Andreas Huber
157187f2a558dd12043631e12c361abef301bf603140Andreas Huber    mPCR[mNumPCRs] = PCR;
157287f2a558dd12043631e12c361abef301bf603140Andreas Huber    mPCRBytes[mNumPCRs] = byteOffsetFromStart;
157387f2a558dd12043631e12c361abef301bf603140Andreas Huber    mSystemTimeUs[mNumPCRs] = ALooper::GetNowUs();
157487f2a558dd12043631e12c361abef301bf603140Andreas Huber
157587f2a558dd12043631e12c361abef301bf603140Andreas Huber    ++mNumPCRs;
157687f2a558dd12043631e12c361abef301bf603140Andreas Huber
157787f2a558dd12043631e12c361abef301bf603140Andreas Huber    if (mNumPCRs == 2) {
1578c9fa35cf7c9c11a8acb77128db1a6a13f1befe3cChad Brubaker        /* Unsigned overflow here */
157987f2a558dd12043631e12c361abef301bf603140Andreas Huber        double transportRate =
158087f2a558dd12043631e12c361abef301bf603140Andreas Huber            (mPCRBytes[1] - mPCRBytes[0]) * 27E6 / (mPCR[1] - mPCR[0]);
158187f2a558dd12043631e12c361abef301bf603140Andreas Huber
158287f2a558dd12043631e12c361abef301bf603140Andreas Huber        ALOGV("transportRate = %.2f bytes/sec", transportRate);
158387f2a558dd12043631e12c361abef301bf603140Andreas Huber    }
158487f2a558dd12043631e12c361abef301bf603140Andreas Huber}
158587f2a558dd12043631e12c361abef301bf603140Andreas Huber
15868dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber////////////////////////////////////////////////////////////////////////////////
15878dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
15889ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim
15899ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim// CRC32 used for PSI section. The table was generated by following command:
15909ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim// $ python pycrc.py --model crc-32-mpeg --algorithm table-driven --generate c
15919ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim// Visit http://www.tty1.net/pycrc/index_en.html for more details.
15929ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kimuint32_t ATSParser::PSISection::CRC_TABLE[] = {
15939ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9,
15949ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x130476dc, 0x17c56b6b, 0x1a864db2, 0x1e475005,
15959ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61,
15969ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd,
15979ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9,
15989ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75,
15999ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011,
16009ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x791d4014, 0x7ddc5da3, 0x709f7b7a, 0x745e66cd,
16019ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039,
16029ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5,
16039ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xbe2b5b58, 0xbaea46ef, 0xb7a96036, 0xb3687d81,
16049ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d,
16059ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49,
16069ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95,
16079ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1,
16089ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d,
16099ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x34867077, 0x30476dc0, 0x3d044b19, 0x39c556ae,
16109ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072,
16119ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16,
16129ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca,
16139ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde,
16149ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02,
16159ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x5e9f46bf, 0x5a5e5b08, 0x571d7dd1, 0x53dc6066,
16169ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,
16179ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e,
16189ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xbfa1b04b, 0xbb60adfc, 0xb6238b25, 0xb2e29692,
16199ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6,
16209ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a,
16219ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e,
16229ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2,
16239ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686,
16249ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xd5b88683, 0xd1799b34, 0xdc3abded, 0xd8fba05a,
16259ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637,
16269ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb,
16279ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f,
16289ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53,
16299ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47,
16309ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x36194d42, 0x32d850f5, 0x3f9b762c, 0x3b5a6b9b,
16319ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff,
16329ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623,
16339ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xf12f560e, 0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7,
16349ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b,
16359ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f,
16369ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3,
16379ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7,
16389ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b,
16399ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x9b3660c6, 0x9ff77d71, 0x92b45ba8, 0x9675461f,
16409ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3,
16419ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640,
16429ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c,
16439ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8,
16449ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24,
16459ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x119b4be9, 0x155a565e, 0x18197087, 0x1cd86d30,
16469ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec,
16479ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088,
16489ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x2497d08d, 0x2056cd3a, 0x2d15ebe3, 0x29d4f654,
16499ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0,
16509ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c,
16519ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18,
16529ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4,
16539ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0,
16549ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x9abc8bd5, 0x9e7d9662, 0x933eb0bb, 0x97ffad0c,
16559ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668,
16569ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4
16579ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    };
16589ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim
16599ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk KimATSParser::PSISection::PSISection() :
16609ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    mSkipBytes(0) {
16618dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber}
16628dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
16638dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas HuberATSParser::PSISection::~PSISection() {
16648dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber}
16658dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
16668dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberstatus_t ATSParser::PSISection::append(const void *data, size_t size) {
16678dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    if (mBuffer == NULL || mBuffer->size() + size > mBuffer->capacity()) {
16688dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        size_t newCapacity =
16698dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            (mBuffer == NULL) ? size : mBuffer->capacity() + size;
16708dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
16718dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        newCapacity = (newCapacity + 1023) & ~1023;
16728dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
16738dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        sp<ABuffer> newBuffer = new ABuffer(newCapacity);
16748dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
16758dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        if (mBuffer != NULL) {
16768dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            memcpy(newBuffer->data(), mBuffer->data(), mBuffer->size());
16778dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            newBuffer->setRange(0, mBuffer->size());
16788dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        } else {
16798dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            newBuffer->setRange(0, 0);
16808dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        }
16818dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
16828dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        mBuffer = newBuffer;
16838dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    }
16848dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
16858dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    memcpy(mBuffer->data() + mBuffer->size(), data, size);
16868dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    mBuffer->setRange(0, mBuffer->size() + size);
16878dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
16888dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    return OK;
16898dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber}
16908dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
16919ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kimvoid ATSParser::PSISection::setSkipBytes(uint8_t skip) {
16929ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    mSkipBytes = skip;
16939ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim}
16949ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim
16958dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Hubervoid ATSParser::PSISection::clear() {
16968dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    if (mBuffer != NULL) {
16978dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        mBuffer->setRange(0, 0);
16988dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    }
16999ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    mSkipBytes = 0;
17008dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber}
17018dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
17028dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberbool ATSParser::PSISection::isComplete() const {
17038dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    if (mBuffer == NULL || mBuffer->size() < 3) {
17048dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        return false;
17058dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    }
17068dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
17078dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    unsigned sectionLength = U16_AT(mBuffer->data() + 1) & 0xfff;
17088dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    return mBuffer->size() >= sectionLength + 3;
17098dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber}
17108dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
17118dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberbool ATSParser::PSISection::isEmpty() const {
17128dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    return mBuffer == NULL || mBuffer->size() == 0;
17138dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber}
17148dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
17158dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberconst uint8_t *ATSParser::PSISection::data() const {
17168dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    return mBuffer == NULL ? NULL : mBuffer->data();
17178dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber}
17188dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
17198dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Hubersize_t ATSParser::PSISection::size() const {
17208dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    return mBuffer == NULL ? 0 : mBuffer->size();
17218dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber}
17228dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
17239ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kimbool ATSParser::PSISection::isCRCOkay() const {
17249ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    if (!isComplete()) {
17259ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim        return false;
17269ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    }
17279ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    uint8_t* data = mBuffer->data();
17289ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim
17299ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    // Return true if section_syntax_indicator says no section follows the field section_length.
17309ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    if ((data[1] & 0x80) == 0) {
17319ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim        return true;
17329ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    }
17339ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim
17349ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    unsigned sectionLength = U16_AT(data + 1) & 0xfff;
17359ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    ALOGV("sectionLength %u, skip %u", sectionLength, mSkipBytes);
17369ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim
1737c0c9f50d15f7b9ed539c0c6277296d083f41b293Marco Nelissen
1738c0c9f50d15f7b9ed539c0c6277296d083f41b293Marco Nelissen    if(sectionLength < mSkipBytes) {
1739c0c9f50d15f7b9ed539c0c6277296d083f41b293Marco Nelissen        ALOGE("b/28333006");
1740c0c9f50d15f7b9ed539c0c6277296d083f41b293Marco Nelissen        android_errorWriteLog(0x534e4554, "28333006");
1741c0c9f50d15f7b9ed539c0c6277296d083f41b293Marco Nelissen        return false;
1742c0c9f50d15f7b9ed539c0c6277296d083f41b293Marco Nelissen    }
1743c0c9f50d15f7b9ed539c0c6277296d083f41b293Marco Nelissen
17449ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    // Skip the preceding field present when payload start indicator is on.
17459ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    sectionLength -= mSkipBytes;
17469ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim
17479ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    uint32_t crc = 0xffffffff;
17489ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    for(unsigned i = 0; i < sectionLength + 4 /* crc */; i++) {
17499ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim        uint8_t b = data[i];
17509ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim        int index = ((crc >> 24) ^ (b & 0xff)) & 0xff;
17519ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim        crc = CRC_TABLE[index] ^ (crc << 8);
17529ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    }
17539ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    ALOGV("crc: %08x\n", crc);
17549ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    return (crc == 0);
17559ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim}
1756cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}  // namespace android
1757