ATSParser.cpp revision 3b2847fa5506dc265d2e46f067bfbb66ae209f74
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>
20cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include "ATSParser.h"
21cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include "AnotherPacketSource.h"
223b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang#include "CasManager.h"
236a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber#include "ESQueue.h"
2485f12e9b9062402d6110df3f7099707912040edbAndreas Huber#include "include/avc_utils.h"
25cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
263b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang#include <android/media/IDescrambler.h>
273b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang#include <binder/MemoryDealer.h>
2885f12e9b9062402d6110df3f7099707912040edbAndreas Huber#include <media/stagefright/foundation/ABitReader.h>
29cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/foundation/ABuffer.h>
30cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/foundation/ADebug.h>
31cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/foundation/AMessage.h>
32cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/foundation/hexdump.h>
33cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/MediaDefs.h>
34cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/MediaErrors.h>
35cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/MetaData.h>
368dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber#include <media/stagefright/Utils.h>
3732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber#include <media/IStreamSource.h>
38cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <utils/KeyedVector.h>
399bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang#include <utils/Vector.h>
40cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
41b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross#include <inttypes.h>
42b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross
43cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubernamespace android {
443b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhangusing binder::Status;
453b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhangusing MediaDescrambler::DescrambleInfo;
46cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
476e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber// I want the expression "y" evaluated even if verbose logging is off.
486e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber#define MY_LOGV(x, y) \
493856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    do { unsigned tmp = y; ALOGV(x, tmp); } while (0)
506e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber
51cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberstatic const size_t kTSPacketSize = 188;
52cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
53cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberstruct ATSParser::Program : public RefBase {
54d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang    Program(ATSParser *parser, unsigned programNumber, unsigned programMapPID,
55d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang            int64_t lastRecoveredPTS);
56cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
578dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    bool parsePSISection(
588dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            unsigned pid, ABitReader *br, status_t *err);
598dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
60540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    // Pass to appropriate stream according to pid, and set event if it's a PES
61540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    // with a sync frame.
62540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    // Note that the method itself does not touch event.
63cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    bool parsePID(
6487f2a558dd12043631e12c361abef301bf603140Andreas Huber            unsigned pid, unsigned continuity_counter,
6587f2a558dd12043631e12c361abef301bf603140Andreas Huber            unsigned payload_unit_start_indicator,
663b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            unsigned transport_scrambling_control,
673b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            unsigned random_access_indicator,
68540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim            ABitReader *br, status_t *err, SyncEvent *event);
69cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
7032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber    void signalDiscontinuity(
7132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            DiscontinuityType type, const sp<AMessage> &extra);
7232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
73f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    void signalEOS(status_t finalResult);
742a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber
75cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    sp<MediaSource> getSource(SourceType type);
76bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih    bool hasSource(SourceType type) const;
77cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
78bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    int64_t convertPTSToTimestamp(uint64_t PTS);
79bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber
8043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    bool PTSTimeDeltaEstablished() const {
8143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        return mFirstPTSValid;
8243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    }
8343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
84386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    unsigned number() const { return mProgramNumber; }
85386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
86386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    void updateProgramMapPID(unsigned programMapPID) {
87386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        mProgramMapPID = programMapPID;
88386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    }
89386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
908dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    unsigned programMapPID() const {
918dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        return mProgramMapPID;
928dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    }
938dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
9487f2a558dd12043631e12c361abef301bf603140Andreas Huber    uint32_t parserFlags() const {
9587f2a558dd12043631e12c361abef301bf603140Andreas Huber        return mParser->mFlags;
9687f2a558dd12043631e12c361abef301bf603140Andreas Huber    }
9787f2a558dd12043631e12c361abef301bf603140Andreas Huber
983b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    sp<CasManager> casManager() const {
993b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        return mParser->mCasManager;
1003b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    }
1013b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
10282e147049625a4cfdcb228a1de7efda594d446c9Robert Shih    uint64_t firstPTS() const {
10382e147049625a4cfdcb228a1de7efda594d446c9Robert Shih        return mFirstPTS;
10482e147049625a4cfdcb228a1de7efda594d446c9Robert Shih    }
10582e147049625a4cfdcb228a1de7efda594d446c9Robert Shih
1063b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    void updateCasSessions();
1073b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
108cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberprivate:
1099bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang    struct StreamInfo {
1109bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        unsigned mType;
1119bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        unsigned mPID;
1123b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        int32_t mCASystemId;
1139bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang    };
1149bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang
115f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    ATSParser *mParser;
116386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    unsigned mProgramNumber;
117cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned mProgramMapPID;
118cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    KeyedVector<unsigned, sp<Stream> > mStreams;
119bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    bool mFirstPTSValid;
120bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    uint64_t mFirstPTS;
121799c9682b3776a55d234396aee4a302437150c26Chong Zhang    int64_t mLastRecoveredPTS;
122cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
12306528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber    status_t parseProgramMap(ABitReader *br);
124799c9682b3776a55d234396aee4a302437150c26Chong Zhang    int64_t recoverPTS(uint64_t PTS_33bit);
1253b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    bool findCADescriptor(
1263b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            ABitReader *br, unsigned infoLength, CADescriptor *caDescriptor);
1279bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang    bool switchPIDs(const Vector<StreamInfo> &infos);
128cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
129cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    DISALLOW_EVIL_CONSTRUCTORS(Program);
130cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber};
131cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
132cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberstruct ATSParser::Stream : public RefBase {
13387f2a558dd12043631e12c361abef301bf603140Andreas Huber    Stream(Program *program,
13487f2a558dd12043631e12c361abef301bf603140Andreas Huber           unsigned elementaryPID,
13587f2a558dd12043631e12c361abef301bf603140Andreas Huber           unsigned streamType,
1363b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang           unsigned PCR_PID,
1373b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang           int32_t CA_system_ID);
138cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
139bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber    unsigned type() const { return mStreamType; }
140bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber    unsigned pid() const { return mElementaryPID; }
141bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber    void setPID(unsigned pid) { mElementaryPID = pid; }
142bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber
1433b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    void setCasSession(
1443b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            const sp<IDescrambler> &descrambler,
1453b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            const std::vector<uint8_t> &sessionId);
1463b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
147540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    // Parse the payload and set event when PES with a sync frame is detected.
1489558f6dd733dc450270f38b9a139d384d273ce0aWei Jia    // This method knows when a PES starts; so record mPesStartOffsets in that
149540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    // case.
1505403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber    status_t parse(
15187f2a558dd12043631e12c361abef301bf603140Andreas Huber            unsigned continuity_counter,
152cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            unsigned payload_unit_start_indicator,
1533b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            unsigned transport_scrambling_control,
1543b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            unsigned random_access_indicator,
155540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim            ABitReader *br,
156540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim            SyncEvent *event);
157cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
15832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber    void signalDiscontinuity(
15932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            DiscontinuityType type, const sp<AMessage> &extra);
16032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
161f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    void signalEOS(status_t finalResult);
1622a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber
16382e147049625a4cfdcb228a1de7efda594d446c9Robert Shih    SourceType getSourceType();
164cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    sp<MediaSource> getSource(SourceType type);
165cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
166bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih    bool isAudio() const;
167bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih    bool isVideo() const;
1680852843d304006e3ab333081fddda13b07193de8Robert Shih    bool isMeta() const;
169bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih
170cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberprotected:
171cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    virtual ~Stream();
172cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
173cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberprivate:
1743b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    struct SubSampleInfo {
1753b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        size_t subSampleSize;
1763b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        unsigned transport_scrambling_mode;
1773b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        unsigned random_access_indicator;
1783b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    };
179bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    Program *mProgram;
180cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned mElementaryPID;
181cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned mStreamType;
18287f2a558dd12043631e12c361abef301bf603140Andreas Huber    unsigned mPCR_PID;
18387f2a558dd12043631e12c361abef301bf603140Andreas Huber    int32_t mExpectedContinuityCounter;
184cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
185cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    sp<ABuffer> mBuffer;
186cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    sp<AnotherPacketSource> mSource;
187cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    bool mPayloadStarted;
188be9634d071e79b72a42a4504f64eda9e2a0bceb8Marco Nelissen    bool mEOSReached;
189cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
19090a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber    uint64_t mPrevPTS;
1919558f6dd733dc450270f38b9a139d384d273ce0aWei Jia    List<off64_t> mPesStartOffsets;
19290a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber
193386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    ElementaryStreamQueue *mQueue;
1946a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber
1953b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    bool mScrambled;
1963b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    sp<IMemory> mMem;
1973b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    sp<MemoryDealer> mDealer;
1983b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    sp<ABuffer> mDescrambledBuffer;
1993b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    List<SubSampleInfo> mSubSamples;
2003b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    sp<IDescrambler> mDescrambler;
2013b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
202540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    // Flush accumulated payload if necessary --- i.e. at EOS or at the start of
203540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    // another payload. event is set if the flushed payload is PES with a sync
204540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    // frame.
205540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    status_t flush(SyncEvent *event);
2063b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
2073b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    // Flush accumulated payload for scrambled streams if necessary --- i.e. at
2083b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    // EOS or at the start of another payload. event is set if the flushed
2093b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    // payload is PES with a sync frame.
2103b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    status_t flushScrambled(SyncEvent *event);
2113b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
2123b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    // Check if a PES packet is scrambled at PES level.
2133b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    uint32_t getPesScramblingControl(ABitReader *br, int32_t *pesOffset);
2143b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
215540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    // Strip and parse PES headers and pass remaining payload into onPayload
216540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    // with parsed metadata. event is set if the PES contains a sync frame.
217540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    status_t parsePES(ABitReader *br, SyncEvent *event);
218540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim
219540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    // Feed the payload into mQueue and if a packet is identified, queue it
220540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    // into mSource. If the packet is a sync frame. set event with start offset
221540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    // and timestamp of the packet.
222cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    void onPayloadData(
223cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            unsigned PTS_DTS_flags, uint64_t PTS, uint64_t DTS,
2243b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            unsigned PES_scrambling_control,
2253b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            const uint8_t *data, size_t size,
2263b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            int32_t payloadOffset, SyncEvent *event);
2273b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
2283b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    // Ensure internal buffers can hold specified size, and will re-allocate
2293b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    // as needed.
2303b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    void ensureBufferCapacity(size_t size);
23182f7321b03eec1e40af9d681370f754ee0279582Andreas Huber
232cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    DISALLOW_EVIL_CONSTRUCTORS(Stream);
233cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber};
234cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
2358dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberstruct ATSParser::PSISection : public RefBase {
2368dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    PSISection();
2378dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
2388dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    status_t append(const void *data, size_t size);
2399ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    void setSkipBytes(uint8_t skip);
2408dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    void clear();
2418dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
2428dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    bool isComplete() const;
2438dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    bool isEmpty() const;
2449ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    bool isCRCOkay() const;
2458dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
2468dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    const uint8_t *data() const;
2478dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    size_t size() const;
2488dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
2498dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberprotected:
2508dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    virtual ~PSISection();
2518dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
2528dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberprivate:
2538dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    sp<ABuffer> mBuffer;
2549ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    uint8_t mSkipBytes;
2559ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    static uint32_t CRC_TABLE[];
2568dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
2578dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    DISALLOW_EVIL_CONSTRUCTORS(PSISection);
2588dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber};
2598dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
260540006666b4191cd78391378f1c66c21bcf0c4cdWonsik KimATSParser::SyncEvent::SyncEvent(off64_t offset)
2619558f6dd733dc450270f38b9a139d384d273ce0aWei Jia    : mHasReturnedData(false), mOffset(offset), mTimeUs(0) {}
262540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim
263540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kimvoid ATSParser::SyncEvent::init(off64_t offset, const sp<MediaSource> &source,
26482e147049625a4cfdcb228a1de7efda594d446c9Robert Shih        int64_t timeUs, SourceType type) {
2659558f6dd733dc450270f38b9a139d384d273ce0aWei Jia    mHasReturnedData = true;
266540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    mOffset = offset;
267540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    mMediaSource = source;
268540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    mTimeUs = timeUs;
26982e147049625a4cfdcb228a1de7efda594d446c9Robert Shih    mType = type;
270540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim}
271540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim
2729558f6dd733dc450270f38b9a139d384d273ce0aWei Jiavoid ATSParser::SyncEvent::reset() {
2739558f6dd733dc450270f38b9a139d384d273ce0aWei Jia    mHasReturnedData = false;
2749558f6dd733dc450270f38b9a139d384d273ce0aWei Jia}
275cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber////////////////////////////////////////////////////////////////////////////////
276cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
277386d609dc513e838c7e7c4c46c604493ccd560beAndreas HuberATSParser::Program::Program(
278d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang        ATSParser *parser, unsigned programNumber, unsigned programMapPID,
279d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang        int64_t lastRecoveredPTS)
280f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    : mParser(parser),
281386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber      mProgramNumber(programNumber),
282f933441648ef6a71dee783d733aac17b9508b452Andreas Huber      mProgramMapPID(programMapPID),
283bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber      mFirstPTSValid(false),
284799c9682b3776a55d234396aee4a302437150c26Chong Zhang      mFirstPTS(0),
285d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang      mLastRecoveredPTS(lastRecoveredPTS) {
2863856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("new program number %u", programNumber);
287cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
288cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
2898dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberbool ATSParser::Program::parsePSISection(
2908dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        unsigned pid, ABitReader *br, status_t *err) {
29106528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber    *err = OK;
29206528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber
2938dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    if (pid != mProgramMapPID) {
2948dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        return false;
2958dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    }
296cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
2978dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    *err = parseProgramMap(br);
29806528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber
2998dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    return true;
3008dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber}
3018dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
3028dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberbool ATSParser::Program::parsePID(
30387f2a558dd12043631e12c361abef301bf603140Andreas Huber        unsigned pid, unsigned continuity_counter,
30487f2a558dd12043631e12c361abef301bf603140Andreas Huber        unsigned payload_unit_start_indicator,
3053b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        unsigned transport_scrambling_control,
3063b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        unsigned random_access_indicator,
307540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim        ABitReader *br, status_t *err, SyncEvent *event) {
3088dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    *err = OK;
309cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
310cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    ssize_t index = mStreams.indexOfKey(pid);
311cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    if (index < 0) {
312cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        return false;
313cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
314cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
3155403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber    *err = mStreams.editValueAt(index)->parse(
3163b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            continuity_counter,
3173b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            payload_unit_start_indicator,
3183b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            transport_scrambling_control,
3193b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            random_access_indicator,
3203b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            br, event);
321cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
322cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    return true;
323cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
324cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
32532f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Hubervoid ATSParser::Program::signalDiscontinuity(
32632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        DiscontinuityType type, const sp<AMessage> &extra) {
327b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber    int64_t mediaTimeUs;
328b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber    if ((type & DISCONTINUITY_TIME)
329b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber            && extra != NULL
330b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber            && extra->findInt64(
331b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber                IStreamListener::kKeyMediaTimeUs, &mediaTimeUs)) {
332b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber        mFirstPTSValid = false;
333b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber    }
334b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber
3352a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    for (size_t i = 0; i < mStreams.size(); ++i) {
33632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        mStreams.editValueAt(i)->signalDiscontinuity(type, extra);
337f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
338f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
339f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
340f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ATSParser::Program::signalEOS(status_t finalResult) {
341f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    for (size_t i = 0; i < mStreams.size(); ++i) {
342f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        mStreams.editValueAt(i)->signalEOS(finalResult);
3432a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    }
3442a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber}
3452a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber
3469bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhangbool ATSParser::Program::switchPIDs(const Vector<StreamInfo> &infos) {
3479bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang    bool success = false;
3489bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang
3499bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang    if (mStreams.size() == infos.size()) {
3509bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        // build type->PIDs map for old and new mapping
3519bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        size_t i;
3529bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        KeyedVector<int32_t, Vector<int32_t> > oldType2PIDs, newType2PIDs;
3539bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        for (i = 0; i < mStreams.size(); ++i) {
3549bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            ssize_t index = oldType2PIDs.indexOfKey(mStreams[i]->type());
3559bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            if (index < 0) {
3569bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                oldType2PIDs.add(mStreams[i]->type(), Vector<int32_t>());
3579bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            }
3589bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            oldType2PIDs.editValueFor(mStreams[i]->type()).push_back(mStreams[i]->pid());
3599bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        }
3609bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        for (i = 0; i < infos.size(); ++i) {
3619bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            ssize_t index = newType2PIDs.indexOfKey(infos[i].mType);
3629bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            if (index < 0) {
3639bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                newType2PIDs.add(infos[i].mType, Vector<int32_t>());
3649bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            }
3659bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            newType2PIDs.editValueFor(infos[i].mType).push_back(infos[i].mPID);
3669bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        }
3679bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang
3689bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        // we can recover if the number of streams for each type hasn't changed
3699bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        if (oldType2PIDs.size() == newType2PIDs.size()) {
3709bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            success = true;
3719bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            for (i = 0; i < oldType2PIDs.size(); ++i) {
3729bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                // KeyedVector is sorted, we just compare key and size of each index
3739bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                if (oldType2PIDs.keyAt(i) != newType2PIDs.keyAt(i)
3749bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                        || oldType2PIDs[i].size() != newType2PIDs[i].size()) {
3759bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                     success = false;
3769bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                     break;
3779bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                }
3789bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            }
3799bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        }
3809bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang
3819bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        if (success) {
3829bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            // save current streams to temp
3839bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            KeyedVector<int32_t, sp<Stream> > temp;
3849bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            for (i = 0; i < mStreams.size(); ++i) {
3859bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                 temp.add(mStreams.keyAt(i), mStreams.editValueAt(i));
3869bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            }
3879bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang
3889bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            mStreams.clear();
3899bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            for (i = 0; i < temp.size(); ++i) {
3909bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                // The two checks below shouldn't happen,
3919bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                // we already checked above the stream count matches
3929bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                ssize_t index = newType2PIDs.indexOfKey(temp[i]->type());
393e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                if (index < 0) {
394e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                    return false;
395e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                }
3969bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                Vector<int32_t> &newPIDs = newType2PIDs.editValueAt(index);
397e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                if (newPIDs.isEmpty()) {
398e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                    return false;
399e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                }
4009bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang
4019bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                // get the next PID for temp[i]->type() in the new PID map
4029bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                Vector<int32_t>::iterator it = newPIDs.begin();
4039bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang
4049bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                // change the PID of the stream, and add it back
4059bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                temp.editValueAt(i)->setPID(*it);
4069bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                mStreams.add(temp[i]->pid(), temp.editValueAt(i));
4079bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang
4089bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                // removed the used PID
4099bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                newPIDs.erase(it);
4109bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            }
4119bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        }
4129bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang    }
4139bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang    return success;
4149bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang}
415bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber
4163b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhangbool ATSParser::Program::findCADescriptor(
4173b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        ABitReader *br, unsigned infoLength,
4183b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        ATSParser::CADescriptor *caDescriptor) {
4193b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    bool found = false;
4203b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    while (infoLength > 2) {
4213b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        unsigned descriptor_tag = br->getBits(8);
4223b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        ALOGV("      tag = 0x%02x", descriptor_tag);
4233b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
4243b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        unsigned descriptor_length = br->getBits(8);
4253b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        ALOGV("      len = %u", descriptor_length);
4263b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
4273b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        infoLength -= 2;
4283b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        if (descriptor_length > infoLength) {
4293b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            break;
4303b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        }
4313b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        if (descriptor_tag == 9 && descriptor_length >= 4) {
4323b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            found = true;
4333b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            caDescriptor->mSystemID = br->getBits(16);
4343b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            caDescriptor->mPID = br->getBits(16) & 0x1fff;
4353b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            infoLength -= 4;
4363b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            caDescriptor->mPrivateData.assign(
4373b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                    br->data(), br->data() + descriptor_length - 4);
4383b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            break;
4393b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        } else {
4403b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            infoLength -= descriptor_length;
4413b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            br->skipBits(descriptor_length * 8);
4423b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        }
4433b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    }
4443b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    br->skipBits(infoLength * 8);
4453b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    return found;
4463b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang}
4473b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
44806528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huberstatus_t ATSParser::Program::parseProgramMap(ABitReader *br) {
449cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned table_id = br->getBits(8);
4503856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("  table_id = %u", table_id);
4516456ae745e919085c5024f784aaa2703f9695f98David Yeh    if (table_id != 0x02u) {
4526456ae745e919085c5024f784aaa2703f9695f98David Yeh        ALOGE("PMT data error!");
4536456ae745e919085c5024f784aaa2703f9695f98David Yeh        return ERROR_MALFORMED;
4546456ae745e919085c5024f784aaa2703f9695f98David Yeh    }
4556e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    unsigned section_syntax_indicator = br->getBits(1);
4563856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("  section_syntax_indicator = %u", section_syntax_indicator);
4576456ae745e919085c5024f784aaa2703f9695f98David Yeh    if (section_syntax_indicator != 1u) {
4586456ae745e919085c5024f784aaa2703f9695f98David Yeh        ALOGE("PMT data error!");
4596456ae745e919085c5024f784aaa2703f9695f98David Yeh        return ERROR_MALFORMED;
4606456ae745e919085c5024f784aaa2703f9695f98David Yeh    }
461cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
462e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim    br->skipBits(1);  // '0'
4636e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  reserved = %u", br->getBits(2));
464cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
465cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned section_length = br->getBits(12);
4663856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("  section_length = %u", section_length);
467cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
4686e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  program_number = %u", br->getBits(16));
4696e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  reserved = %u", br->getBits(2));
4706e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  version_number = %u", br->getBits(5));
4716e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  current_next_indicator = %u", br->getBits(1));
4726e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  section_number = %u", br->getBits(8));
4736e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  last_section_number = %u", br->getBits(8));
4746e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  reserved = %u", br->getBits(3));
47587f2a558dd12043631e12c361abef301bf603140Andreas Huber
47687f2a558dd12043631e12c361abef301bf603140Andreas Huber    unsigned PCR_PID = br->getBits(13);
47787f2a558dd12043631e12c361abef301bf603140Andreas Huber    ALOGV("  PCR_PID = 0x%04x", PCR_PID);
47887f2a558dd12043631e12c361abef301bf603140Andreas Huber
4796e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  reserved = %u", br->getBits(4));
480cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
481cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned program_info_length = br->getBits(12);
4823856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("  program_info_length = %u", program_info_length);
483cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
4843b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    // descriptors
4853b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    CADescriptor programCA;
4863b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    bool hasProgramCA = findCADescriptor(br, program_info_length, &programCA);
4873b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    if (hasProgramCA && !mParser->mCasManager->addProgram(
4883b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            mProgramNumber, programCA)) {
4893b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        return ERROR_MALFORMED;
4903b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    }
491cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
492bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber    Vector<StreamInfo> infos;
493bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber
494cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    // infoBytesRemaining is the number of bytes that make up the
495cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    // variable length section of ES_infos. It does not include the
496cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    // final CRC.
497cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    size_t infoBytesRemaining = section_length - 9 - program_info_length - 4;
498cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
499e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim    while (infoBytesRemaining >= 5) {
500cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
501cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned streamType = br->getBits(8);
5023856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("    stream_type = 0x%02x", streamType);
503cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
5046e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber        MY_LOGV("    reserved = %u", br->getBits(3));
505cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
506cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned elementaryPID = br->getBits(13);
5073856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("    elementary_PID = 0x%04x", elementaryPID);
508cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
5096e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber        MY_LOGV("    reserved = %u", br->getBits(4));
510cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
511cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned ES_info_length = br->getBits(12);
5123856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("    ES_info_length = %u", ES_info_length);
513cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
5143b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        CADescriptor streamCA;
5153b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        bool hasStreamCA = findCADescriptor(br, ES_info_length, &streamCA);
5163b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        if (hasStreamCA && !mParser->mCasManager->addStream(
5173b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                mProgramNumber, elementaryPID, streamCA)) {
5183b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            return ERROR_MALFORMED;
519cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        }
520bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        StreamInfo info;
521bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        info.mType = streamType;
522bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        info.mPID = elementaryPID;
5233b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        info.mCASystemId = hasProgramCA ? programCA.mSystemID :
5243b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                           hasStreamCA ? streamCA.mSystemID  : -1;
525bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        infos.push(info);
526cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
527cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        infoBytesRemaining -= 5 + ES_info_length;
528cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
529cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
530e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim    if (infoBytesRemaining != 0) {
531e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        ALOGW("Section data remains unconsumed");
532e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim    }
5336e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  CRC = 0x%08x", br->getBits(32));
534bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber
535bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber    bool PIDsChanged = false;
536bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber    for (size_t i = 0; i < infos.size(); ++i) {
537bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        StreamInfo &info = infos.editItemAt(i);
538bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber
539bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        ssize_t index = mStreams.indexOfKey(info.mPID);
540bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber
541bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        if (index >= 0 && mStreams.editValueAt(index)->type() != info.mType) {
542df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block            ALOGI("uh oh. stream PIDs have changed.");
543bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber            PIDsChanged = true;
544bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber            break;
545bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        }
546bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber    }
547bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber
548bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber    if (PIDsChanged) {
54906528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber#if 0
550df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block        ALOGI("before:");
55106528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber        for (size_t i = 0; i < mStreams.size(); ++i) {
55206528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber            sp<Stream> stream = mStreams.editValueAt(i);
55306528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber
554df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block            ALOGI("PID 0x%08x => type 0x%02x", stream->pid(), stream->type());
55506528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber        }
55606528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber
557df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block        ALOGI("after:");
55806528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber        for (size_t i = 0; i < infos.size(); ++i) {
55906528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber            StreamInfo &info = infos.editItemAt(i);
56006528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber
561df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block            ALOGI("PID 0x%08x => type 0x%02x", info.mPID, info.mType);
56206528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber        }
56306528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber#endif
56406528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber
5659bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        // we can recover if number of streams for each type remain the same
5669bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        bool success = switchPIDs(infos);
56706528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber
56806528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber        if (!success) {
569df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block            ALOGI("Stream PIDs changed and we cannot recover.");
57006528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber            return ERROR_MALFORMED;
57106528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber        }
572bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber    }
573bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber
5743b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    bool isAddingScrambledStream = false;
575bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber    for (size_t i = 0; i < infos.size(); ++i) {
576bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        StreamInfo &info = infos.editItemAt(i);
577bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber
5783b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        if (mParser->mCasManager->isCAPid(info.mPID)) {
5793b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            // skip CA streams (EMM/ECM)
5803b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            continue;
5813b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        }
582bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        ssize_t index = mStreams.indexOfKey(info.mPID);
583bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber
584bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        if (index < 0) {
58587f2a558dd12043631e12c361abef301bf603140Andreas Huber            sp<Stream> stream = new Stream(
5863b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                    this, info.mPID, info.mType, PCR_PID, info.mCASystemId);
58787f2a558dd12043631e12c361abef301bf603140Andreas Huber
5883b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            isAddingScrambledStream |= info.mCASystemId >= 0;
589bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber            mStreams.add(info.mPID, stream);
590bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        }
591bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber    }
59206528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber
5933b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    if (isAddingScrambledStream) {
5943b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        ALOGI("Receiving scrambled streams without descrambler!");
5953b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        return ERROR_DRM_DECRYPT_UNIT_NOT_INITIALIZED;
5963b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    }
59706528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber    return OK;
598cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
599cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
600799c9682b3776a55d234396aee4a302437150c26Chong Zhangint64_t ATSParser::Program::recoverPTS(uint64_t PTS_33bit) {
601799c9682b3776a55d234396aee4a302437150c26Chong Zhang    // We only have the lower 33-bit of the PTS. It could overflow within a
602799c9682b3776a55d234396aee4a302437150c26Chong Zhang    // reasonable amount of time. To handle the wrap-around, use fancy math
603799c9682b3776a55d234396aee4a302437150c26Chong Zhang    // to get an extended PTS that is within [-0xffffffff, 0xffffffff]
604799c9682b3776a55d234396aee4a302437150c26Chong Zhang    // of the latest recovered PTS.
6059bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang    if (mLastRecoveredPTS < 0ll) {
6069bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        // Use the original 33bit number for 1st frame, the reason is that
6079bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        // if 1st frame wraps to negative that's far away from 0, we could
6089bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        // never start. Only start wrapping around from 2nd frame.
6099bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        mLastRecoveredPTS = static_cast<int64_t>(PTS_33bit);
6109bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang    } else {
6119bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        mLastRecoveredPTS = static_cast<int64_t>(
6123728ba367f1e23e652c5539d9488aa0d0d4ec9d7Chad Brubaker                ((mLastRecoveredPTS - static_cast<int64_t>(PTS_33bit) + 0x100000000ll)
6139bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                & 0xfffffffe00000000ull) | PTS_33bit);
6149bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        // We start from 0, but recovered PTS could be slightly below 0.
6159bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        // Clamp it to 0 as rest of the pipeline doesn't take negative pts.
6169bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        // (eg. video is read first and starts at 0, but audio starts at 0xfffffff0)
6179bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        if (mLastRecoveredPTS < 0ll) {
6185c9054bc6efc080b265e028f2ebb1abd2a2e3953Chih-Hung Hsieh            ALOGI("Clamping negative recovered PTS (%" PRId64 ") to 0", mLastRecoveredPTS);
6199bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            mLastRecoveredPTS = 0ll;
6209bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        }
6219bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang    }
6229bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang
6239bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang    return mLastRecoveredPTS;
624799c9682b3776a55d234396aee4a302437150c26Chong Zhang}
625799c9682b3776a55d234396aee4a302437150c26Chong Zhang
626cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubersp<MediaSource> ATSParser::Program::getSource(SourceType type) {
627cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    for (size_t i = 0; i < mStreams.size(); ++i) {
628cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        sp<MediaSource> source = mStreams.editValueAt(i)->getSource(type);
629cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        if (source != NULL) {
6309ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih            return source;
631cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        }
632cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
633cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
634cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    return NULL;
635cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
636cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
637bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shihbool ATSParser::Program::hasSource(SourceType type) const {
638bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih    for (size_t i = 0; i < mStreams.size(); ++i) {
639bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih        const sp<Stream> &stream = mStreams.valueAt(i);
640bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih        if (type == AUDIO && stream->isAudio()) {
641bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih            return true;
642bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih        } else if (type == VIDEO && stream->isVideo()) {
643bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih            return true;
6449ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih        } else if (type == META && stream->isMeta()) {
6459ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih            return true;
646bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih        }
647bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih    }
648bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih
649bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih    return false;
650bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih}
651bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih
652bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huberint64_t ATSParser::Program::convertPTSToTimestamp(uint64_t PTS) {
653799c9682b3776a55d234396aee4a302437150c26Chong Zhang    PTS = recoverPTS(PTS);
654799c9682b3776a55d234396aee4a302437150c26Chong Zhang
655c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber    if (!(mParser->mFlags & TS_TIMESTAMPS_ARE_ABSOLUTE)) {
656c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber        if (!mFirstPTSValid) {
657c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber            mFirstPTSValid = true;
658c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber            mFirstPTS = PTS;
659c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber            PTS = 0;
660c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber        } else if (PTS < mFirstPTS) {
661c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber            PTS = 0;
662c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber        } else {
663c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber            PTS -= mFirstPTS;
664c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber        }
665bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    }
666bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber
66787f2a558dd12043631e12c361abef301bf603140Andreas Huber    int64_t timeUs = (PTS * 100) / 9;
66887f2a558dd12043631e12c361abef301bf603140Andreas Huber
66987f2a558dd12043631e12c361abef301bf603140Andreas Huber    if (mParser->mAbsoluteTimeAnchorUs >= 0ll) {
67087f2a558dd12043631e12c361abef301bf603140Andreas Huber        timeUs += mParser->mAbsoluteTimeAnchorUs;
67187f2a558dd12043631e12c361abef301bf603140Andreas Huber    }
67287f2a558dd12043631e12c361abef301bf603140Andreas Huber
673d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber    if (mParser->mTimeOffsetValid) {
674d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber        timeUs += mParser->mTimeOffsetUs;
675d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber    }
676d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber
67787f2a558dd12043631e12c361abef301bf603140Andreas Huber    return timeUs;
678bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber}
679bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber
6803b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhangvoid ATSParser::Program::updateCasSessions() {
6813b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    for (size_t i = 0; i < mStreams.size(); ++i) {
6823b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        sp<Stream> &stream = mStreams.editValueAt(i);
6833b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        sp<IDescrambler> descrambler;
6843b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        std::vector<uint8_t> sessionId;
6853b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        if (mParser->mCasManager->getCasSession(
6863b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                mProgramNumber, stream->pid(), &descrambler, &sessionId)) {
6873b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            stream->setCasSession(descrambler, sessionId);
6883b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        }
6893b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    }
6903b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang}
6913b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
692cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber////////////////////////////////////////////////////////////////////////////////
6933b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhangstatic const size_t kInitialStreamBufferSize = 192 * 1024;
694cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
695bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas HuberATSParser::Stream::Stream(
69687f2a558dd12043631e12c361abef301bf603140Andreas Huber        Program *program,
69787f2a558dd12043631e12c361abef301bf603140Andreas Huber        unsigned elementaryPID,
69887f2a558dd12043631e12c361abef301bf603140Andreas Huber        unsigned streamType,
6993b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        unsigned PCR_PID,
7003b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        int32_t CA_system_ID)
701bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    : mProgram(program),
702bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber      mElementaryPID(elementaryPID),
703cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber      mStreamType(streamType),
70487f2a558dd12043631e12c361abef301bf603140Andreas Huber      mPCR_PID(PCR_PID),
70587f2a558dd12043631e12c361abef301bf603140Andreas Huber      mExpectedContinuityCounter(-1),
7066a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber      mPayloadStarted(false),
707be9634d071e79b72a42a4504f64eda9e2a0bceb8Marco Nelissen      mEOSReached(false),
70890a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber      mPrevPTS(0),
7093b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang      mQueue(NULL),
7103b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang      mScrambled(CA_system_ID >= 0) {
7113b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    ALOGV("new stream PID 0x%02x, type 0x%02x, scrambled %d",
7123b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            elementaryPID, streamType, mScrambled);
7133b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
7143b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    uint32_t flags = (isVideo() && mScrambled) ?
7153b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            ElementaryStreamQueue::kFlag_ScrambledData : 0;
7163b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
7173b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    ElementaryStreamQueue::Mode mode = ElementaryStreamQueue::INVALID;
7183b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
719386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    switch (mStreamType) {
720386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        case STREAMTYPE_H264:
7213b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            mode = ElementaryStreamQueue::H264;
7223b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            flags |= (mProgram->parserFlags() & ALIGNED_VIDEO_DATA) ?
7233b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                    ElementaryStreamQueue::kFlag_AlignedData : 0;
724386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            break;
7253b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
7266e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        case STREAMTYPE_MPEG2_AUDIO_ADTS:
7273b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            mode = ElementaryStreamQueue::AAC;
728386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            break;
7293b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
730386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        case STREAMTYPE_MPEG1_AUDIO:
731386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        case STREAMTYPE_MPEG2_AUDIO:
7323b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            mode = ElementaryStreamQueue::MPEG_AUDIO;
733386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            break;
734386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
735386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        case STREAMTYPE_MPEG1_VIDEO:
736386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        case STREAMTYPE_MPEG2_VIDEO:
7373b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            mode = ElementaryStreamQueue::MPEG_VIDEO;
738386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            break;
739386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
740386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        case STREAMTYPE_MPEG4_VIDEO:
7413b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            mode = ElementaryStreamQueue::MPEG4_VIDEO;
742386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            break;
743386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
7449bf32f06e8971c1d3eb4fc5edd74b69557f97212Chong Zhang        case STREAMTYPE_LPCM_AC3:
745d3c079ae9859011d118f94616d0069c2987013edChangwan Ryu        case STREAMTYPE_AC3:
7463b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            mode = ElementaryStreamQueue::AC3;
747d3c079ae9859011d118f94616d0069c2987013edChangwan Ryu            break;
748d3c079ae9859011d118f94616d0069c2987013edChangwan Ryu
7490852843d304006e3ab333081fddda13b07193de8Robert Shih        case STREAMTYPE_METADATA:
7503b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            mode = ElementaryStreamQueue::METADATA;
7510852843d304006e3ab333081fddda13b07193de8Robert Shih            break;
7520852843d304006e3ab333081fddda13b07193de8Robert Shih
753386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        default:
7543b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            ALOGE("stream PID 0x%02x has invalid stream type 0x%02x",
7553b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                    elementaryPID, streamType);
7563b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            return;
757386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    }
758386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
7593b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    mQueue = new ElementaryStreamQueue(mode, flags);
76018ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber
76118ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber    if (mQueue != NULL) {
7623b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        ensureBufferCapacity(kInitialStreamBufferSize);
7633b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
7643b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        if (mScrambled && (isAudio() || isVideo())) {
7653b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            // Set initial format to scrambled
7663b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            sp<MetaData> meta = new MetaData();
7673b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            meta->setCString(kKeyMIMEType,
7683b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                    isAudio() ? MEDIA_MIMETYPE_AUDIO_SCRAMBLED
7693b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                              : MEDIA_MIMETYPE_VIDEO_SCRAMBLED);
7703b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            // for DrmInitData
7713b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            meta->setData(kKeyCas, 0, &CA_system_ID, sizeof(CA_system_ID));
7723b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            mSource = new AnotherPacketSource(meta);
7733b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        }
77418ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber    }
775cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
776cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
777cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas HuberATSParser::Stream::~Stream() {
778386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    delete mQueue;
779386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    mQueue = NULL;
780cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
781cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
7823b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhangvoid ATSParser::Stream::ensureBufferCapacity(size_t neededSize) {
7833b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    if (mBuffer != NULL && mBuffer->capacity() >= neededSize) {
7843b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        return;
7853b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    }
7863b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
7873b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    ALOGV("ensureBufferCapacity: current size %zu, new size %zu, scrambled %d",
7883b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            mBuffer == NULL ? 0 : mBuffer->capacity(), neededSize, mScrambled);
7893b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
7903b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    sp<ABuffer> newBuffer, newScrambledBuffer;
7913b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    sp<IMemory> newMem;
7923b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    sp<MemoryDealer> newDealer;
7933b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    if (mScrambled) {
7943b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        size_t alignment = MemoryDealer::getAllocationAlignment();
7953b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        neededSize = (neededSize + (alignment - 1)) & ~(alignment - 1);
7963b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        // Align to multiples of 64K.
7973b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        neededSize = (neededSize + 65535) & ~65535;
7983b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        newDealer = new MemoryDealer(neededSize, "ATSParser");
7993b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        newMem = newDealer->allocate(neededSize);
8003b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        newScrambledBuffer = new ABuffer(newMem->pointer(), newMem->size());
8013b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
8023b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        if (mDescrambledBuffer != NULL) {
8033b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            memcpy(newScrambledBuffer->data(),
8043b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                    mDescrambledBuffer->data(), mDescrambledBuffer->size());
8053b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            newScrambledBuffer->setRange(0, mDescrambledBuffer->size());
8063b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        } else {
8073b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            newScrambledBuffer->setRange(0, 0);
8083b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        }
8093b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        mMem = newMem;
8103b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        mDealer = newDealer;
8113b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        mDescrambledBuffer = newScrambledBuffer;
8123b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    } else {
8133b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        // Align to multiples of 64K.
8143b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        neededSize = (neededSize + 65535) & ~65535;
8153b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    }
8163b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
8173b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    newBuffer = new ABuffer(neededSize);
8183b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    if (mBuffer != NULL) {
8193b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        memcpy(newBuffer->data(), mBuffer->data(), mBuffer->size());
8203b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        newBuffer->setRange(0, mBuffer->size());
8213b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    } else {
8223b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        newBuffer->setRange(0, 0);
8233b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    }
8243b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    mBuffer = newBuffer;
8253b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang}
8263b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
8275403129e2a2f44620f2ac8109889e5a61be08732Andreas Huberstatus_t ATSParser::Stream::parse(
82887f2a558dd12043631e12c361abef301bf603140Andreas Huber        unsigned continuity_counter,
8293b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        unsigned payload_unit_start_indicator,
8303b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        unsigned transport_scrambling_control,
8313b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        unsigned random_access_indicator,
8323b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        ABitReader *br, SyncEvent *event) {
83318ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber    if (mQueue == NULL) {
8345403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber        return OK;
83518ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber    }
83618ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber
83787f2a558dd12043631e12c361abef301bf603140Andreas Huber    if (mExpectedContinuityCounter >= 0
83887f2a558dd12043631e12c361abef301bf603140Andreas Huber            && (unsigned)mExpectedContinuityCounter != continuity_counter) {
83987f2a558dd12043631e12c361abef301bf603140Andreas Huber        ALOGI("discontinuity on stream pid 0x%04x", mElementaryPID);
84087f2a558dd12043631e12c361abef301bf603140Andreas Huber
84187f2a558dd12043631e12c361abef301bf603140Andreas Huber        mPayloadStarted = false;
8429558f6dd733dc450270f38b9a139d384d273ce0aWei Jia        mPesStartOffsets.clear();
84387f2a558dd12043631e12c361abef301bf603140Andreas Huber        mBuffer->setRange(0, 0);
8443b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        mSubSamples.clear();
84587f2a558dd12043631e12c361abef301bf603140Andreas Huber        mExpectedContinuityCounter = -1;
84687f2a558dd12043631e12c361abef301bf603140Andreas Huber
84794a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber#if 0
84894a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber        // Uncomment this if you'd rather see no corruption whatsoever on
84994a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber        // screen and suspend updates until we come across another IDR frame.
85094a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber
85194a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber        if (mStreamType == STREAMTYPE_H264) {
85294a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber            ALOGI("clearing video queue");
85394a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber            mQueue->clear(true /* clearFormat */);
85494a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber        }
85594a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber#endif
85694a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber
85766830855846db5c211c2da6c055ca9b4167e8974Chong Zhang        if (!payload_unit_start_indicator) {
85866830855846db5c211c2da6c055ca9b4167e8974Chong Zhang            return OK;
85966830855846db5c211c2da6c055ca9b4167e8974Chong Zhang        }
86087f2a558dd12043631e12c361abef301bf603140Andreas Huber    }
86187f2a558dd12043631e12c361abef301bf603140Andreas Huber
86287f2a558dd12043631e12c361abef301bf603140Andreas Huber    mExpectedContinuityCounter = (continuity_counter + 1) & 0x0f;
86387f2a558dd12043631e12c361abef301bf603140Andreas Huber
864cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    if (payload_unit_start_indicator) {
865540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim        off64_t offset = (event != NULL) ? event->getOffset() : 0;
866cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        if (mPayloadStarted) {
867cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            // Otherwise we run the danger of receiving the trailing bytes
868cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            // of a PES packet that we never saw the start of and assuming
869cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            // we have a a complete PES packet.
870cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
871540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim            status_t err = flush(event);
8725403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber
8735403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber            if (err != OK) {
87465959d34fdab8319dbf765be5fbf7ff8051eedf1Wonsik Kim                ALOGW("Error (%08x) happened while flushing; we simply discard "
87565959d34fdab8319dbf765be5fbf7ff8051eedf1Wonsik Kim                      "the PES packet and continue.", err);
8765403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber            }
877cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        }
878cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
879cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        mPayloadStarted = true;
880b08d83e972ba8cb08a6e361d5cdaf97857bcf21fWei Jia        // There should be at most 2 elements in |mPesStartOffsets|.
881b08d83e972ba8cb08a6e361d5cdaf97857bcf21fWei Jia        while (mPesStartOffsets.size() >= 2) {
882b08d83e972ba8cb08a6e361d5cdaf97857bcf21fWei Jia            mPesStartOffsets.erase(mPesStartOffsets.begin());
883b08d83e972ba8cb08a6e361d5cdaf97857bcf21fWei Jia        }
8849558f6dd733dc450270f38b9a139d384d273ce0aWei Jia        mPesStartOffsets.push_back(offset);
885cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
886cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
887cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    if (!mPayloadStarted) {
8885403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber        return OK;
889cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
890cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
891cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    size_t payloadSizeBits = br->numBitsLeft();
892e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim    if (payloadSizeBits % 8 != 0u) {
893e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        ALOGE("Wrong value");
894e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        return BAD_VALUE;
895e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim    }
896cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
8973e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber    size_t neededSize = mBuffer->size() + payloadSizeBits / 8;
8983b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    ensureBufferCapacity(neededSize);
899cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
900cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    memcpy(mBuffer->data() + mBuffer->size(), br->data(), payloadSizeBits / 8);
901cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    mBuffer->setRange(0, mBuffer->size() + payloadSizeBits / 8);
9025403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber
9033b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    if (mScrambled) {
9043b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        mSubSamples.push_back({payloadSizeBits / 8,
9053b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                 transport_scrambling_control, random_access_indicator});
9063b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    }
9073b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
9085403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber    return OK;
909cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
910cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
9116e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huberbool ATSParser::Stream::isVideo() const {
9126e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    switch (mStreamType) {
9136e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        case STREAMTYPE_H264:
9146e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        case STREAMTYPE_MPEG1_VIDEO:
9156e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        case STREAMTYPE_MPEG2_VIDEO:
9166e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        case STREAMTYPE_MPEG4_VIDEO:
9176e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber            return true;
9186e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
9196e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        default:
9206e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber            return false;
9216e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    }
9226e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber}
9236e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
9246e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huberbool ATSParser::Stream::isAudio() const {
9256e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    switch (mStreamType) {
9266e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        case STREAMTYPE_MPEG1_AUDIO:
9276e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        case STREAMTYPE_MPEG2_AUDIO:
9286e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        case STREAMTYPE_MPEG2_AUDIO_ADTS:
9299bf32f06e8971c1d3eb4fc5edd74b69557f97212Chong Zhang        case STREAMTYPE_LPCM_AC3:
930d3c079ae9859011d118f94616d0069c2987013edChangwan Ryu        case STREAMTYPE_AC3:
9316e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber            return true;
9326e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
9336e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        default:
9346e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber            return false;
9356e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    }
9366e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber}
9376e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
9380852843d304006e3ab333081fddda13b07193de8Robert Shihbool ATSParser::Stream::isMeta() const {
9390852843d304006e3ab333081fddda13b07193de8Robert Shih    if (mStreamType == STREAMTYPE_METADATA) {
9400852843d304006e3ab333081fddda13b07193de8Robert Shih        return true;
9410852843d304006e3ab333081fddda13b07193de8Robert Shih    }
9420852843d304006e3ab333081fddda13b07193de8Robert Shih    return false;
9430852843d304006e3ab333081fddda13b07193de8Robert Shih}
9440852843d304006e3ab333081fddda13b07193de8Robert Shih
94532f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Hubervoid ATSParser::Stream::signalDiscontinuity(
94632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        DiscontinuityType type, const sp<AMessage> &extra) {
9470389cc09f7b90f155a8942a0d2e1925cad1dbe2dMarco Nelissen    mExpectedContinuityCounter = -1;
9480389cc09f7b90f155a8942a0d2e1925cad1dbe2dMarco Nelissen
94918ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber    if (mQueue == NULL) {
95018ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber        return;
95118ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber    }
95218ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber
9532a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    mPayloadStarted = false;
9549558f6dd733dc450270f38b9a139d384d273ce0aWei Jia    mPesStartOffsets.clear();
955aabbdc7401ae24a4199f12a283985deb648673c0Robert Shih    mEOSReached = false;
9562a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    mBuffer->setRange(0, 0);
9573b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    mSubSamples.clear();
9582a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber
9596e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    bool clearFormat = false;
9606e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    if (isAudio()) {
9616e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        if (type & DISCONTINUITY_AUDIO_FORMAT) {
9626e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber            clearFormat = true;
9636e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        }
9646e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    } else {
9656e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        if (type & DISCONTINUITY_VIDEO_FORMAT) {
9666e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber            clearFormat = true;
9676e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        }
9686e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    }
969f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
9706e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    mQueue->clear(clearFormat);
97132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
9726e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    if (type & DISCONTINUITY_TIME) {
9736e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        uint64_t resumeAtPTS;
9746e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        if (extra != NULL
9756e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                && extra->findInt64(
9766e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    IStreamListener::kKeyResumeAtPTS,
9776e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    (int64_t *)&resumeAtPTS)) {
9786e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber            int64_t resumeAtMediaTimeUs =
9796e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                mProgram->convertPTSToTimestamp(resumeAtPTS);
98032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
981c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia            extra->setInt64("resume-at-mediaTimeUs", resumeAtMediaTimeUs);
982e332a9181cf6a3155ed1a0fd2afc212ccb1f2753Andreas Huber        }
9836e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    }
984f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
9856e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    if (mSource != NULL) {
9863b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        sp<MetaData> meta = mSource->getFormat();
9873b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        const char* mime;
9883b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        if (clearFormat && meta != NULL && meta->findCString(kKeyMIMEType, &mime)
9893b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                && (!strncasecmp(mime, MEDIA_MIMETYPE_AUDIO_SCRAMBLED, 15)
9903b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                 || !strncasecmp(mime, MEDIA_MIMETYPE_VIDEO_SCRAMBLED, 15))){
9913b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            mSource->clear();
9923b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        } else {
9933b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            mSource->queueDiscontinuity(type, extra, true);
9943b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        }
995bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    }
996f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
997bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber
998f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ATSParser::Stream::signalEOS(status_t finalResult) {
999f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (mSource != NULL) {
1000f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        mSource->signalEOS(finalResult);
10012a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    }
1002be9634d071e79b72a42a4504f64eda9e2a0bceb8Marco Nelissen    mEOSReached = true;
1003540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    flush(NULL);
10042a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber}
10052a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber
1006540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kimstatus_t ATSParser::Stream::parsePES(ABitReader *br, SyncEvent *event) {
10073b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    const uint8_t *basePtr = br->data();
10083b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
1009cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned packet_startcode_prefix = br->getBits(24);
1010cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
10113856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("packet_startcode_prefix = 0x%08x", packet_startcode_prefix);
1012cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1013386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    if (packet_startcode_prefix != 1) {
10143856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("Supposedly payload_unit_start=1 unit does not start "
1015386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber             "with startcode.");
10165403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber
10175403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber        return ERROR_MALFORMED;
1018386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    }
1019386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
1020cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned stream_id = br->getBits(8);
10213856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("stream_id = 0x%02x", stream_id);
1022cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1023cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned PES_packet_length = br->getBits(16);
10243856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("PES_packet_length = %u", PES_packet_length);
1025cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1026cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    if (stream_id != 0xbc  // program_stream_map
1027cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            && stream_id != 0xbe  // padding_stream
1028cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            && stream_id != 0xbf  // private_stream_2
1029cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            && stream_id != 0xf0  // ECM
1030cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            && stream_id != 0xf1  // EMM
1031cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            && stream_id != 0xff  // program_stream_directory
1032cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            && stream_id != 0xf2  // DSMCC
1033cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            && stream_id != 0xf8) {  // H.222.1 type E
1034e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        if (br->getBits(2) != 2u) {
1035e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            return ERROR_MALFORMED;
1036e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        }
1037cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
10383b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        unsigned PES_scrambling_control = br->getBits(2);
10393b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        ALOGV("PES_scrambling_control = %u", PES_scrambling_control);
10403b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
10416e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber        MY_LOGV("PES_priority = %u", br->getBits(1));
10426e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber        MY_LOGV("data_alignment_indicator = %u", br->getBits(1));
10436e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber        MY_LOGV("copyright = %u", br->getBits(1));
10446e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber        MY_LOGV("original_or_copy = %u", br->getBits(1));
1045cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1046cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned PTS_DTS_flags = br->getBits(2);
10473856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("PTS_DTS_flags = %u", PTS_DTS_flags);
1048cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1049cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned ESCR_flag = br->getBits(1);
10503856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("ESCR_flag = %u", ESCR_flag);
1051cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1052cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned ES_rate_flag = br->getBits(1);
10533856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("ES_rate_flag = %u", ES_rate_flag);
1054cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1055cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned DSM_trick_mode_flag = br->getBits(1);
10563856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("DSM_trick_mode_flag = %u", DSM_trick_mode_flag);
1057cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1058cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned additional_copy_info_flag = br->getBits(1);
10593856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("additional_copy_info_flag = %u", additional_copy_info_flag);
1060cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
10616e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber        MY_LOGV("PES_CRC_flag = %u", br->getBits(1));
10626e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber        MY_LOGV("PES_extension_flag = %u", br->getBits(1));
1063cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1064cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned PES_header_data_length = br->getBits(8);
10653856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("PES_header_data_length = %u", PES_header_data_length);
1066cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1067cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned optional_bytes_remaining = PES_header_data_length;
1068cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1069cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        uint64_t PTS = 0, DTS = 0;
1070cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1071cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        if (PTS_DTS_flags == 2 || PTS_DTS_flags == 3) {
1072e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            if (optional_bytes_remaining < 5u) {
1073e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                return ERROR_MALFORMED;
1074e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            }
1075cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
10766456ae745e919085c5024f784aaa2703f9695f98David Yeh            if (br->getBits(4) != PTS_DTS_flags) {
10776456ae745e919085c5024f784aaa2703f9695f98David Yeh                return ERROR_MALFORMED;
10786456ae745e919085c5024f784aaa2703f9695f98David Yeh            }
1079cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            PTS = ((uint64_t)br->getBits(3)) << 30;
1080e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            if (br->getBits(1) != 1u) {
1081e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                return ERROR_MALFORMED;
1082e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            }
1083cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            PTS |= ((uint64_t)br->getBits(15)) << 15;
1084e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            if (br->getBits(1) != 1u) {
1085e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                return ERROR_MALFORMED;
1086e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            }
1087cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            PTS |= br->getBits(15);
1088e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            if (br->getBits(1) != 1u) {
1089e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                return ERROR_MALFORMED;
1090e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            }
1091cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1092b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross            ALOGV("PTS = 0x%016" PRIx64 " (%.2f)", PTS, PTS / 90000.0);
1093cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1094cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            optional_bytes_remaining -= 5;
1095cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1096cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            if (PTS_DTS_flags == 3) {
1097e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                if (optional_bytes_remaining < 5u) {
1098e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                    return ERROR_MALFORMED;
1099e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                }
1100cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1101e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                if (br->getBits(4) != 1u) {
1102e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                    return ERROR_MALFORMED;
1103e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                }
1104cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1105cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber                DTS = ((uint64_t)br->getBits(3)) << 30;
1106e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                if (br->getBits(1) != 1u) {
1107e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                    return ERROR_MALFORMED;
1108e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                }
1109cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber                DTS |= ((uint64_t)br->getBits(15)) << 15;
1110e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                if (br->getBits(1) != 1u) {
1111e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                    return ERROR_MALFORMED;
1112e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                }
1113cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber                DTS |= br->getBits(15);
1114e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                if (br->getBits(1) != 1u) {
1115e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                    return ERROR_MALFORMED;
1116e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                }
1117cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1118b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross                ALOGV("DTS = %" PRIu64, DTS);
1119cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1120cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber                optional_bytes_remaining -= 5;
1121cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            }
1122cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        }
1123cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1124cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        if (ESCR_flag) {
1125e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            if (optional_bytes_remaining < 6u) {
1126e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                return ERROR_MALFORMED;
1127e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            }
1128cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1129cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            br->getBits(2);
1130cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1131cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            uint64_t ESCR = ((uint64_t)br->getBits(3)) << 30;
1132e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            if (br->getBits(1) != 1u) {
1133e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                return ERROR_MALFORMED;
1134e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            }
1135cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            ESCR |= ((uint64_t)br->getBits(15)) << 15;
1136e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            if (br->getBits(1) != 1u) {
1137e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                return ERROR_MALFORMED;
1138e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            }
1139cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            ESCR |= br->getBits(15);
1140e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            if (br->getBits(1) != 1u) {
1141e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                return ERROR_MALFORMED;
1142e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            }
1143cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1144b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross            ALOGV("ESCR = %" PRIu64, ESCR);
11456e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber            MY_LOGV("ESCR_extension = %u", br->getBits(9));
1146cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1147e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            if (br->getBits(1) != 1u) {
1148e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                return ERROR_MALFORMED;
1149e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            }
1150cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1151cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            optional_bytes_remaining -= 6;
1152cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        }
1153cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1154cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        if (ES_rate_flag) {
1155e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            if (optional_bytes_remaining < 3u) {
1156e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                return ERROR_MALFORMED;
1157e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            }
1158cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1159e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            if (br->getBits(1) != 1u) {
1160e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                return ERROR_MALFORMED;
1161e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            }
11626e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber            MY_LOGV("ES_rate = %u", br->getBits(22));
1163e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            if (br->getBits(1) != 1u) {
1164e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                return ERROR_MALFORMED;
1165e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            }
1166cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1167cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            optional_bytes_remaining -= 3;
1168cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        }
1169cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1170cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        br->skipBits(optional_bytes_remaining * 8);
1171cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1172cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        // ES data follows.
11733b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        int32_t pesOffset = br->data() - basePtr;
1174cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1175cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        if (PES_packet_length != 0) {
1176e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            if (PES_packet_length < PES_header_data_length + 3) {
1177e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                return ERROR_MALFORMED;
1178e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            }
1179cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1180cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            unsigned dataLength =
1181cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber                PES_packet_length - 3 - PES_header_data_length;
1182cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
11835403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber            if (br->numBitsLeft() < dataLength * 8) {
118429357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block                ALOGE("PES packet does not carry enough data to contain "
1185b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross                     "payload. (numBitsLeft = %zu, required = %u)",
11865403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber                     br->numBitsLeft(), dataLength * 8);
11875403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber
11885403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber                return ERROR_MALFORMED;
11895403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber            }
11905403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber
11913b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            ALOGV("There's %u bytes of payload, PES_packet_length=%u, offset=%d",
11923b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                    dataLength, PES_packet_length, pesOffset);
11933b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
11940da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber            onPayloadData(
11953b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                    PTS_DTS_flags, PTS, DTS, PES_scrambling_control,
11963b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                    br->data(), dataLength, pesOffset, event);
1197cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1198cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            br->skipBits(dataLength * 8);
1199cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        } else {
12000da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber            onPayloadData(
12013b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                    PTS_DTS_flags, PTS, DTS, PES_scrambling_control,
12023b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                    br->data(), br->numBitsLeft() / 8, pesOffset, event);
12030da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber
1204cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            size_t payloadSizeBits = br->numBitsLeft();
1205e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            if (payloadSizeBits % 8 != 0u) {
1206e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                return ERROR_MALFORMED;
1207e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            }
1208cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
12093b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            ALOGV("There's %zu bytes of payload, offset=%d",
12103b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                    payloadSizeBits / 8, pesOffset);
1211cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        }
1212cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    } else if (stream_id == 0xbe) {  // padding_stream
1213e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        if (PES_packet_length == 0u) {
1214e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            return ERROR_MALFORMED;
1215e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        }
1216cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        br->skipBits(PES_packet_length * 8);
1217cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    } else {
1218e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        if (PES_packet_length == 0u) {
1219e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            return ERROR_MALFORMED;
1220e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        }
1221cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        br->skipBits(PES_packet_length * 8);
1222cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
12235403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber
12245403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber    return OK;
1225cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
1226cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
12273b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhanguint32_t ATSParser::Stream::getPesScramblingControl(
12283b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        ABitReader *br, int32_t *pesOffset) {
12293b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    unsigned packet_startcode_prefix = br->getBits(24);
12303b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
12313b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    ALOGV("packet_startcode_prefix = 0x%08x", packet_startcode_prefix);
12323b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
12333b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    if (packet_startcode_prefix != 1) {
12343b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        ALOGV("unit does not start with startcode.");
12353b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        return 0;
12363b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    }
12373b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
12383b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    if (br->numBitsLeft() < 48) {
12393b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        return 0;
12403b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    }
12413b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
12423b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    unsigned stream_id = br->getBits(8);
12433b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    ALOGV("stream_id = 0x%02x", stream_id);
12443b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
12453b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    br->skipBits(16); // PES_packet_length
12463b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
12473b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    if (stream_id != 0xbc  // program_stream_map
12483b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            && stream_id != 0xbe  // padding_stream
12493b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            && stream_id != 0xbf  // private_stream_2
12503b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            && stream_id != 0xf0  // ECM
12513b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            && stream_id != 0xf1  // EMM
12523b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            && stream_id != 0xff  // program_stream_directory
12533b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            && stream_id != 0xf2  // DSMCC
12543b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            && stream_id != 0xf8) {  // H.222.1 type E
12553b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        if (br->getBits(2) != 2u) {
12563b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            return 0;
12573b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        }
12583b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
12593b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        unsigned PES_scrambling_control = br->getBits(2);
12603b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        ALOGV("PES_scrambling_control = %u", PES_scrambling_control);
12613b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
12623b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        if (PES_scrambling_control == 0) {
12633b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            return 0;
12643b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        }
12653b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
12663b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        br->skipBits(12); // don't care
12673b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
12683b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        unsigned PES_header_data_length = br->getBits(8);
12693b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        ALOGV("PES_header_data_length = %u", PES_header_data_length);
12703b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
12713b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        if (PES_header_data_length * 8 > br->numBitsLeft()) {
12723b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            return 0;
12733b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        }
12743b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
12753b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        *pesOffset = 9 + PES_header_data_length;
12763b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        ALOGD("found PES_scrambling_control=%d, PES offset=%d",
12773b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                PES_scrambling_control, *pesOffset);
12783b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        return PES_scrambling_control;
12793b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    }
12803b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
12813b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    return 0;
12823b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang}
12833b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
12843b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhangstatus_t ATSParser::Stream::flushScrambled(SyncEvent *event) {
12853b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    if (mDescrambler == NULL) {
12863b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        ALOGE("received scrambled packets without descrambler!");
12873b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        return UNKNOWN_ERROR;
12883b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    }
12893b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
12903b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    if (mDescrambledBuffer == NULL || mMem == NULL) {
12913b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        ALOGE("received scrambled packets without shared memory!");
12923b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
12933b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        return UNKNOWN_ERROR;
12943b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    }
12953b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
12963b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    int32_t pesOffset = 0;
12973b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    int32_t descrambleSubSamples = 0, descrambleBytes = 0;
12983b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    uint32_t tsScramblingControl = 0, pesScramblingControl = 0;
12993b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
13003b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    // First, go over subsamples to find TS-level scrambling key id, and
13013b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    // calculate how many subsample we need to descramble (assuming we don't
13023b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    // have PES-level scrambling).
13033b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    for (auto it = mSubSamples.begin(); it != mSubSamples.end(); it++) {
13043b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        if (it->transport_scrambling_mode != 0) {
13053b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            // TODO: handle keyId change, use the first non-zero keyId for now.
13063b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            if (tsScramblingControl == 0) {
13073b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                tsScramblingControl = it->transport_scrambling_mode;
13083b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            }
13093b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        }
13103b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        if (tsScramblingControl == 0 || descrambleSubSamples == 0
13113b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                || !mQueue->isScrambled()) {
13123b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            descrambleSubSamples++;
13133b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            descrambleBytes += it->subSampleSize;
13143b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        }
13153b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    }
13163b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    // If not scrambled at TS-level, check PES-level scrambling
13173b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    if (tsScramblingControl == 0) {
13183b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        ABitReader br(mBuffer->data(), mBuffer->size());
13193b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        pesScramblingControl = getPesScramblingControl(&br, &pesOffset);
13203b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        // If not scrambled at PES-level either, or scrambled at PES-level but
13213b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        // requires output to remain scrambled, we don't need to descramble
13223b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        // anything.
13233b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        if (pesScramblingControl == 0 || mQueue->isScrambled()) {
13243b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            descrambleSubSamples = 0;
13253b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            descrambleBytes = 0;
13263b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        }
13273b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    }
13283b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
13293b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    uint32_t sctrl = tsScramblingControl != 0 ?
13303b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            tsScramblingControl : pesScramblingControl;
13313b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
13323b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    // Perform the 1st pass descrambling if needed
13333b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    if (descrambleBytes > 0) {
13343b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        memcpy(mDescrambledBuffer->data(), mBuffer->data(), descrambleBytes);
13353b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        mDescrambledBuffer->setRange(0, descrambleBytes);
13363b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
13373b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        sp<ABuffer> subSamples = new ABuffer(
13383b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                sizeof(DescramblerPlugin::SubSample) * descrambleSubSamples);
13393b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
13403b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        DescrambleInfo info;
13413b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        info.dstType = DescrambleInfo::kDestinationTypeVmPointer;
13423b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        info.scramblingControl = (DescramblerPlugin::ScramblingControl)sctrl;
13433b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        info.numSubSamples = descrambleSubSamples;
13443b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        info.subSamples = (DescramblerPlugin::SubSample *)subSamples->data();
13453b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        info.srcMem = mMem;
13463b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        info.srcOffset = 0;
13473b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        info.dstPtr = NULL; // in-place descrambling into srcMem
13483b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        info.dstOffset = 0;
13493b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
13503b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        int32_t i = 0;
13513b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        for (auto it = mSubSamples.begin();
13523b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                it != mSubSamples.end() && i < descrambleSubSamples; it++, i++) {
13533b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            if (it->transport_scrambling_mode != 0 || pesScramblingControl != 0) {
13543b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                info.subSamples[i].mNumBytesOfClearData = 0;
13553b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                info.subSamples[i].mNumBytesOfEncryptedData = it->subSampleSize;
13563b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            } else {
13573b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                info.subSamples[i].mNumBytesOfClearData = it->subSampleSize;
13583b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                info.subSamples[i].mNumBytesOfEncryptedData = 0;
13593b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            }
13603b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        }
13613b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        // If scrambled at PES-level, PES header should be skipped
13623b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        if (pesScramblingControl != 0) {
13633b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            info.srcOffset = info.dstOffset = pesOffset;
13643b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            info.subSamples[0].mNumBytesOfEncryptedData -= pesOffset;
13653b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        }
13663b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
13673b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        int32_t result;
13683b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        Status status = mDescrambler->descramble(info, &result);
13693b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
13703b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        if (!status.isOk()) {
13713b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            ALOGE("[stream %d] descramble failed, exceptionCode=%d",
13723b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                    mElementaryPID, status.exceptionCode());
13733b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            return UNKNOWN_ERROR;
13743b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        }
13753b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
13763b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        ALOGV("[stream %d] descramble succeeded, %d bytes",
13773b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                mElementaryPID, result);
13783b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        memcpy(mBuffer->data(), mDescrambledBuffer->data(), descrambleBytes);
13793b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    }
13803b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
13813b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    if (mQueue->isScrambled()) {
13823b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        // Queue subSample info for scrambled queue
13833b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        sp<ABuffer> clearSizesBuffer = new ABuffer(mSubSamples.size() * 4);
13843b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        sp<ABuffer> encSizesBuffer = new ABuffer(mSubSamples.size() * 4);
13853b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        int32_t *clearSizePtr = (int32_t*)clearSizesBuffer->data();
13863b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        int32_t *encSizePtr = (int32_t*)encSizesBuffer->data();
13873b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        int32_t isSync = 0;
13883b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        int32_t i = 0;
13893b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        for (auto it = mSubSamples.begin();
13903b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                it != mSubSamples.end(); it++, i++) {
13913b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            if ((it->transport_scrambling_mode == 0
13923b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                    && pesScramblingControl == 0)
13933b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                    || i < descrambleSubSamples) {
13943b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                clearSizePtr[i] = it->subSampleSize;
13953b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                encSizePtr[i] = 0;
13963b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            } else {
13973b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                clearSizePtr[i] = 0;
13983b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                encSizePtr[i] = it->subSampleSize;
13993b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            }
14003b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            isSync |= it->random_access_indicator;
14013b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        }
14023b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        // Pass the original TS subsample size now. The PES header adjust
14033b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        // will be applied when the scrambled AU is dequeued.
14043b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        mQueue->appendScrambledData(
14053b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                mBuffer->data(), mBuffer->size(), sctrl,
14063b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                isSync, clearSizesBuffer, encSizesBuffer);
14073b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    }
14083b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
14093b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    ABitReader br(mBuffer->data(), mBuffer->size());
14103b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    status_t err = parsePES(&br, event);
14113b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
14123b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    if (err != OK) {
14133b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        ALOGE("[stream %d] failed to parse descrambled PES, err=%d",
14143b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                mElementaryPID, err);
14153b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    }
14163b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
14173b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    return err;
14183b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang}
14193b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
14203b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
1421540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kimstatus_t ATSParser::Stream::flush(SyncEvent *event) {
1422f2cecd570c35d3b6422396dd51c0b4202732bceaJaesung Chung    if (mBuffer == NULL || mBuffer->size() == 0) {
14235403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber        return OK;
1424cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
1425cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1426b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross    ALOGV("flushing stream 0x%04x size = %zu", mElementaryPID, mBuffer->size());
1427cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
14283b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    status_t err = OK;
14293b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    if (mScrambled) {
14303b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        err = flushScrambled(event);
14313b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        mSubSamples.clear();
14323b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    } else {
14333b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        ABitReader br(mBuffer->data(), mBuffer->size());
14343b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        err = parsePES(&br, event);
14353b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    }
1436cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1437cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    mBuffer->setRange(0, 0);
14385403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber
14395403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber    return err;
1440cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
1441cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1442cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubervoid ATSParser::Stream::onPayloadData(
144384333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber        unsigned PTS_DTS_flags, uint64_t PTS, uint64_t /* DTS */,
14443b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        unsigned PES_scrambling_control,
14453b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        const uint8_t *data, size_t size,
14463b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        int32_t payloadOffset, SyncEvent *event) {
144790a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber#if 0
144890a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber    ALOGI("payload streamType 0x%02x, PTS = 0x%016llx, dPTS = %lld",
144990a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber          mStreamType,
145090a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber          PTS,
145190a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber          (int64_t)PTS - mPrevPTS);
145290a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber    mPrevPTS = PTS;
145390a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber#endif
145490a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber
14553856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("onPayloadData mStreamType=0x%02x", mStreamType);
1456cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
145798a46cf165d8de3779874eba01803bbc485f45b9Andreas Huber    int64_t timeUs = 0ll;  // no presentation timestamp available.
145898a46cf165d8de3779874eba01803bbc485f45b9Andreas Huber    if (PTS_DTS_flags == 2 || PTS_DTS_flags == 3) {
145998a46cf165d8de3779874eba01803bbc485f45b9Andreas Huber        timeUs = mProgram->convertPTSToTimestamp(PTS);
146098a46cf165d8de3779874eba01803bbc485f45b9Andreas Huber    }
146182f7321b03eec1e40af9d681370f754ee0279582Andreas Huber
14623b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    status_t err = mQueue->appendData(
14633b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            data, size, timeUs, payloadOffset, PES_scrambling_control);
1464decd96988e495133e4a1728f612d4c9fdb4d218eAndreas Huber
1465be9634d071e79b72a42a4504f64eda9e2a0bceb8Marco Nelissen    if (mEOSReached) {
1466be9634d071e79b72a42a4504f64eda9e2a0bceb8Marco Nelissen        mQueue->signalEOS();
1467be9634d071e79b72a42a4504f64eda9e2a0bceb8Marco Nelissen    }
1468be9634d071e79b72a42a4504f64eda9e2a0bceb8Marco Nelissen
1469decd96988e495133e4a1728f612d4c9fdb4d218eAndreas Huber    if (err != OK) {
1470decd96988e495133e4a1728f612d4c9fdb4d218eAndreas Huber        return;
1471decd96988e495133e4a1728f612d4c9fdb4d218eAndreas Huber    }
147282f7321b03eec1e40af9d681370f754ee0279582Andreas Huber
14736a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber    sp<ABuffer> accessUnit;
1474540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    bool found = false;
1475386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    while ((accessUnit = mQueue->dequeueAccessUnit()) != NULL) {
14766a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber        if (mSource == NULL) {
1477386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            sp<MetaData> meta = mQueue->getFormat();
147882f7321b03eec1e40af9d681370f754ee0279582Andreas Huber
14796a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber            if (meta != NULL) {
14803856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                ALOGV("Stream PID 0x%08x of type 0x%02x now has data.",
1481386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                     mElementaryPID, mStreamType);
1482386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
1483309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih                const char *mime;
1484309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih                if (meta->findCString(kKeyMIMEType, &mime)
14853b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                        && !strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_AVC)) {
14863b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                    int32_t sync = 0;
14873b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                    if (!accessUnit->meta()->findInt32("isSync", &sync) || !sync) {
14883b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                        continue;
14893b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                    }
1490309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih                }
14916a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber                mSource = new AnotherPacketSource(meta);
14926a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber                mSource->queueAccessUnit(accessUnit);
149382f7321b03eec1e40af9d681370f754ee0279582Andreas Huber            }
1494386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        } else if (mQueue->getFormat() != NULL) {
14952a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber            // After a discontinuity we invalidate the queue's format
14962a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber            // and won't enqueue any access units to the source until
14972a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber            // the queue has reestablished the new format.
14985bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
14995bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            if (mSource->getFormat() == NULL) {
1500386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                mSource->setFormat(mQueue->getFormat());
15015bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            }
15026a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber            mSource->queueAccessUnit(accessUnit);
150382f7321b03eec1e40af9d681370f754ee0279582Andreas Huber        }
1504540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim
1505b08d83e972ba8cb08a6e361d5cdaf97857bcf21fWei Jia        // Every access unit has a pesStartOffset queued in |mPesStartOffsets|.
1506b08d83e972ba8cb08a6e361d5cdaf97857bcf21fWei Jia        off64_t pesStartOffset = -1;
1507b08d83e972ba8cb08a6e361d5cdaf97857bcf21fWei Jia        if (!mPesStartOffsets.empty()) {
1508b08d83e972ba8cb08a6e361d5cdaf97857bcf21fWei Jia            pesStartOffset = *mPesStartOffsets.begin();
1509b08d83e972ba8cb08a6e361d5cdaf97857bcf21fWei Jia            mPesStartOffsets.erase(mPesStartOffsets.begin());
1510b08d83e972ba8cb08a6e361d5cdaf97857bcf21fWei Jia        }
1511b08d83e972ba8cb08a6e361d5cdaf97857bcf21fWei Jia
1512b08d83e972ba8cb08a6e361d5cdaf97857bcf21fWei Jia        if (pesStartOffset >= 0 && (event != NULL) && !found && mQueue->getFormat() != NULL) {
1513540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim            int32_t sync = 0;
1514540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim            if (accessUnit->meta()->findInt32("isSync", &sync) && sync) {
1515540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim                int64_t timeUs;
1516540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim                if (accessUnit->meta()->findInt64("timeUs", &timeUs)) {
1517540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim                    found = true;
151882e147049625a4cfdcb228a1de7efda594d446c9Robert Shih                    event->init(pesStartOffset, mSource, timeUs, getSourceType());
1519540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim                }
1520540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim            }
1521540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim        }
152282f7321b03eec1e40af9d681370f754ee0279582Andreas Huber    }
152382f7321b03eec1e40af9d681370f754ee0279582Andreas Huber}
152482f7321b03eec1e40af9d681370f754ee0279582Andreas Huber
152582e147049625a4cfdcb228a1de7efda594d446c9Robert ShihATSParser::SourceType ATSParser::Stream::getSourceType() {
152682e147049625a4cfdcb228a1de7efda594d446c9Robert Shih    if (isVideo()) {
152782e147049625a4cfdcb228a1de7efda594d446c9Robert Shih        return VIDEO;
152882e147049625a4cfdcb228a1de7efda594d446c9Robert Shih    } else if (isAudio()) {
152982e147049625a4cfdcb228a1de7efda594d446c9Robert Shih        return AUDIO;
153082e147049625a4cfdcb228a1de7efda594d446c9Robert Shih    } else if (isMeta()) {
153182e147049625a4cfdcb228a1de7efda594d446c9Robert Shih        return META;
153282e147049625a4cfdcb228a1de7efda594d446c9Robert Shih    }
153382e147049625a4cfdcb228a1de7efda594d446c9Robert Shih    return NUM_SOURCE_TYPES;
153482e147049625a4cfdcb228a1de7efda594d446c9Robert Shih}
153582e147049625a4cfdcb228a1de7efda594d446c9Robert Shih
1536cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubersp<MediaSource> ATSParser::Stream::getSource(SourceType type) {
1537386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    switch (type) {
1538386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        case VIDEO:
1539386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        {
15406e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber            if (isVideo()) {
1541386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                return mSource;
1542386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            }
1543386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            break;
1544386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        }
1545386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
1546386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        case AUDIO:
1547386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        {
15486e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber            if (isAudio()) {
1549386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                return mSource;
1550386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            }
1551386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            break;
1552386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        }
1553386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
15540852843d304006e3ab333081fddda13b07193de8Robert Shih        case META:
15550852843d304006e3ab333081fddda13b07193de8Robert Shih        {
15560852843d304006e3ab333081fddda13b07193de8Robert Shih            if (isMeta()) {
15570852843d304006e3ab333081fddda13b07193de8Robert Shih                return mSource;
15580852843d304006e3ab333081fddda13b07193de8Robert Shih            }
15590852843d304006e3ab333081fddda13b07193de8Robert Shih            break;
15600852843d304006e3ab333081fddda13b07193de8Robert Shih        }
15610852843d304006e3ab333081fddda13b07193de8Robert Shih
1562386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        default:
1563386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            break;
1564cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
1565cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1566cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    return NULL;
1567cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
1568cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
15693b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhangvoid ATSParser::Stream::setCasSession(
15703b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        const sp<IDescrambler> &descrambler,
15713b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        const std::vector<uint8_t> &sessionId) {
15723b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    if (mSource != NULL && mDescrambler == NULL && descrambler != NULL) {
15733b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        signalDiscontinuity(DISCONTINUITY_FORMAT_ONLY, NULL);
15743b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        mDescrambler = descrambler;
15753b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        if (mQueue->isScrambled()) {
15763b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            mQueue->setCasSession(sessionId);
15773b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        }
15783b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    }
15793b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang}
15803b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
1581cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber////////////////////////////////////////////////////////////////////////////////
1582cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1583c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas HuberATSParser::ATSParser(uint32_t flags)
158487f2a558dd12043631e12c361abef301bf603140Andreas Huber    : mFlags(flags),
158587f2a558dd12043631e12c361abef301bf603140Andreas Huber      mAbsoluteTimeAnchorUs(-1ll),
1586d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber      mTimeOffsetValid(false),
1587d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber      mTimeOffsetUs(0ll),
1588d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang      mLastRecoveredPTS(-1ll),
158987f2a558dd12043631e12c361abef301bf603140Andreas Huber      mNumTSPacketsParsed(0),
159087f2a558dd12043631e12c361abef301bf603140Andreas Huber      mNumPCRs(0) {
15918dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    mPSISections.add(0 /* PID */, new PSISection);
15923b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    mCasManager = new CasManager();
1593cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
1594cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1595cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas HuberATSParser::~ATSParser() {
1596cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
1597cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1598540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kimstatus_t ATSParser::feedTSPacket(const void *data, size_t size,
1599540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim        SyncEvent *event) {
1600e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim    if (size != kTSPacketSize) {
1601e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        ALOGE("Wrong TS packet size");
1602e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        return BAD_VALUE;
1603e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim    }
1604cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1605cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    ABitReader br((const uint8_t *)data, kTSPacketSize);
1606540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    return parseTS(&br, event);
1607cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
1608cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
16093b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhangstatus_t ATSParser::setMediaCas(const sp<ICas> &cas) {
16103b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    status_t err = mCasManager->setMediaCas(cas);
16113b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    if (err != OK) {
16123b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        return err;
16133b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    }
16143b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    for (size_t i = 0; i < mPrograms.size(); ++i) {
16153b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        mPrograms.editItemAt(i)->updateCasSessions();
16163b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    }
16173b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    return OK;
16183b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang}
16193b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
162032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Hubervoid ATSParser::signalDiscontinuity(
162132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        DiscontinuityType type, const sp<AMessage> &extra) {
1622b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber    int64_t mediaTimeUs;
1623d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang    if ((type & DISCONTINUITY_TIME) && extra != NULL) {
1624d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang        if (extra->findInt64(IStreamListener::kKeyMediaTimeUs, &mediaTimeUs)) {
1625d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang            mAbsoluteTimeAnchorUs = mediaTimeUs;
1626d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang        }
1627d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang        if ((mFlags & TS_TIMESTAMPS_ARE_ABSOLUTE)
1628d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang                && extra->findInt64(
1629d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang                    IStreamListener::kKeyRecentMediaTimeUs, &mediaTimeUs)) {
1630d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang            if (mAbsoluteTimeAnchorUs >= 0ll) {
1631d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang                mediaTimeUs -= mAbsoluteTimeAnchorUs;
1632d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang            }
1633d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang            if (mTimeOffsetValid) {
1634d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang                mediaTimeUs -= mTimeOffsetUs;
1635d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang            }
1636d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang            mLastRecoveredPTS = (mediaTimeUs * 9) / 100;
1637d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang        }
1638b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber    } else if (type == DISCONTINUITY_ABSOLUTE_TIME) {
163987f2a558dd12043631e12c361abef301bf603140Andreas Huber        int64_t timeUs;
1640e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        if (!extra->findInt64("timeUs", &timeUs)) {
1641e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            ALOGE("timeUs not found");
1642e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            return;
1643e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        }
164487f2a558dd12043631e12c361abef301bf603140Andreas Huber
1645e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        if (!mPrograms.empty()) {
1646e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            ALOGE("mPrograms is not empty");
1647e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            return;
1648e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        }
164987f2a558dd12043631e12c361abef301bf603140Andreas Huber        mAbsoluteTimeAnchorUs = timeUs;
165087f2a558dd12043631e12c361abef301bf603140Andreas Huber        return;
1651d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber    } else if (type == DISCONTINUITY_TIME_OFFSET) {
1652d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber        int64_t offset;
1653e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        if (!extra->findInt64("offset", &offset)) {
1654e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            ALOGE("offset not found");
1655e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            return;
1656e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        }
1657d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber
1658d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber        mTimeOffsetValid = true;
1659d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber        mTimeOffsetUs = offset;
1660d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber        return;
166187f2a558dd12043631e12c361abef301bf603140Andreas Huber    }
166287f2a558dd12043631e12c361abef301bf603140Andreas Huber
1663f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    for (size_t i = 0; i < mPrograms.size(); ++i) {
166432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        mPrograms.editItemAt(i)->signalDiscontinuity(type, extra);
1665f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
1666f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
1667f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1668f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ATSParser::signalEOS(status_t finalResult) {
1669e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim    if (finalResult == (status_t) OK) {
1670e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        ALOGE("finalResult not OK");
1671e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        return;
1672e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim    }
1673f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
16742a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    for (size_t i = 0; i < mPrograms.size(); ++i) {
1675f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        mPrograms.editItemAt(i)->signalEOS(finalResult);
16762a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    }
16772a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber}
16782a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber
1679cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubervoid ATSParser::parseProgramAssociationTable(ABitReader *br) {
1680cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned table_id = br->getBits(8);
16813856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("  table_id = %u", table_id);
16826456ae745e919085c5024f784aaa2703f9695f98David Yeh    if (table_id != 0x00u) {
16836456ae745e919085c5024f784aaa2703f9695f98David Yeh        ALOGE("PAT data error!");
16846456ae745e919085c5024f784aaa2703f9695f98David Yeh        return ;
16856456ae745e919085c5024f784aaa2703f9695f98David Yeh    }
1686cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned section_syntax_indictor = br->getBits(1);
16873856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("  section_syntax_indictor = %u", section_syntax_indictor);
1688cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1689e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim    br->skipBits(1);  // '0'
16906e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  reserved = %u", br->getBits(2));
1691cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1692cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned section_length = br->getBits(12);
16933856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("  section_length = %u", section_length);
1694cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
16956e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  transport_stream_id = %u", br->getBits(16));
16966e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  reserved = %u", br->getBits(2));
16976e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  version_number = %u", br->getBits(5));
16986e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  current_next_indicator = %u", br->getBits(1));
16996e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  section_number = %u", br->getBits(8));
17006e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  last_section_number = %u", br->getBits(8));
1701cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1702cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    size_t numProgramBytes = (section_length - 5 /* header */ - 4 /* crc */);
1703cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1704cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    for (size_t i = 0; i < numProgramBytes / 4; ++i) {
1705cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned program_number = br->getBits(16);
17063856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("    program_number = %u", program_number);
1707cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
17086e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber        MY_LOGV("    reserved = %u", br->getBits(3));
1709cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1710cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        if (program_number == 0) {
17116e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber            MY_LOGV("    network_PID = 0x%04x", br->getBits(13));
1712cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        } else {
1713cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            unsigned programMapPID = br->getBits(13);
1714cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
17153856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("    program_map_PID = 0x%04x", programMapPID);
1716cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1717386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            bool found = false;
1718386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            for (size_t index = 0; index < mPrograms.size(); ++index) {
1719386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                const sp<Program> &program = mPrograms.itemAt(index);
1720386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
1721386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                if (program->number() == program_number) {
1722386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                    program->updateProgramMapPID(programMapPID);
1723386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                    found = true;
1724386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                    break;
1725386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                }
1726386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            }
1727386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
1728386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            if (!found) {
1729386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                mPrograms.push(
1730d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang                        new Program(this, program_number, programMapPID, mLastRecoveredPTS));
1731386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            }
17328dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
17338dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            if (mPSISections.indexOfKey(programMapPID) < 0) {
17348dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                mPSISections.add(programMapPID, new PSISection);
17358dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            }
1736cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        }
1737cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
1738cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
17396e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  CRC = 0x%08x", br->getBits(32));
1740cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
1741cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
174206528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huberstatus_t ATSParser::parsePID(
1743cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        ABitReader *br, unsigned PID,
174487f2a558dd12043631e12c361abef301bf603140Andreas Huber        unsigned continuity_counter,
1745540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim        unsigned payload_unit_start_indicator,
17463b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        unsigned transport_scrambling_control,
17473b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        unsigned random_access_indicator,
1748540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim        SyncEvent *event) {
17498dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    ssize_t sectionIndex = mPSISections.indexOfKey(PID);
17508dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
17518dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    if (sectionIndex >= 0) {
17524b4bb11b8747adeb2efe56c7df4ab6803dd7db41Andreas Huber        sp<PSISection> section = mPSISections.valueAt(sectionIndex);
17538dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
1754cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        if (payload_unit_start_indicator) {
17556456ae745e919085c5024f784aaa2703f9695f98David Yeh            if (!section->isEmpty()) {
17569bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                ALOGW("parsePID encounters payload_unit_start_indicator when section is not empty");
17579bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                section->clear();
17586456ae745e919085c5024f784aaa2703f9695f98David Yeh            }
17598dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
1760cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            unsigned skip = br->getBits(8);
17619ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim            section->setSkipBytes(skip + 1);  // skip filler bytes + pointer field itself
1762cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            br->skipBits(skip * 8);
1763cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        }
17648dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
1765e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        if (br->numBitsLeft() % 8 != 0) {
1766e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            return ERROR_MALFORMED;
1767e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        }
17688dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        status_t err = section->append(br->data(), br->numBitsLeft() / 8);
17698dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
17708dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        if (err != OK) {
17718dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            return err;
17728dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        }
17738dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
17748dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        if (!section->isComplete()) {
17758dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            return OK;
17768dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        }
17778dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
17789ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim        if (!section->isCRCOkay()) {
17799ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim            return BAD_VALUE;
17809ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim        }
17818dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        ABitReader sectionBits(section->data(), section->size());
17828dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
17838dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        if (PID == 0) {
17848dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            parseProgramAssociationTable(&sectionBits);
17858dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        } else {
17868dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            bool handled = false;
17878dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            for (size_t i = 0; i < mPrograms.size(); ++i) {
17888dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                status_t err;
17898dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                if (!mPrograms.editItemAt(i)->parsePSISection(
17908dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                            PID, &sectionBits, &err)) {
17918dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                    continue;
17928dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                }
17938dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
17948dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                if (err != OK) {
17958dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                    return err;
17968dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                }
17978dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
17988dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                handled = true;
17998dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                break;
18008dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            }
18018dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
18028dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            if (!handled) {
18038dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                mPSISections.removeItem(PID);
18044b4bb11b8747adeb2efe56c7df4ab6803dd7db41Andreas Huber                section.clear();
18058dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            }
18068dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        }
18078dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
18084b4bb11b8747adeb2efe56c7df4ab6803dd7db41Andreas Huber        if (section != NULL) {
18094b4bb11b8747adeb2efe56c7df4ab6803dd7db41Andreas Huber            section->clear();
18104b4bb11b8747adeb2efe56c7df4ab6803dd7db41Andreas Huber        }
18118dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
181206528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber        return OK;
1813cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
1814cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1815cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    bool handled = false;
1816cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    for (size_t i = 0; i < mPrograms.size(); ++i) {
181706528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber        status_t err;
1818cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        if (mPrograms.editItemAt(i)->parsePID(
18193b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                    PID, continuity_counter,
18203b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                    payload_unit_start_indicator,
18213b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                    transport_scrambling_control,
18223b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                    random_access_indicator,
1823540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim                    br, &err, event)) {
182406528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber            if (err != OK) {
182506528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber                return err;
182606528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber            }
182706528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber
1828cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            handled = true;
1829cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            break;
1830cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        }
1831cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
1832cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1833cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    if (!handled) {
18343b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        handled = mCasManager->parsePID(br, PID);
18353b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    }
18363b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
18373b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    if (!handled) {
18383856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("PID 0x%04x not handled.", PID);
1839cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
184006528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber
184106528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber    return OK;
1842cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
1843cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
18443b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhangstatus_t ATSParser::parseAdaptationField(
18453b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        ABitReader *br, unsigned PID, unsigned *random_access_indicator) {
18463b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    *random_access_indicator = 0;
1847cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned adaptation_field_length = br->getBits(8);
184887f2a558dd12043631e12c361abef301bf603140Andreas Huber
1849cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    if (adaptation_field_length > 0) {
18508a1fa1ebc2375c9dcaca2b78918c6740fff2ca74Jaesung Chung        if (adaptation_field_length * 8 > br->numBitsLeft()) {
18518a1fa1ebc2375c9dcaca2b78918c6740fff2ca74Jaesung Chung            ALOGV("Adaptation field should be included in a single TS packet.");
18528a1fa1ebc2375c9dcaca2b78918c6740fff2ca74Jaesung Chung            return ERROR_MALFORMED;
18538a1fa1ebc2375c9dcaca2b78918c6740fff2ca74Jaesung Chung        }
18548a1fa1ebc2375c9dcaca2b78918c6740fff2ca74Jaesung Chung
185587f2a558dd12043631e12c361abef301bf603140Andreas Huber        unsigned discontinuity_indicator = br->getBits(1);
185687f2a558dd12043631e12c361abef301bf603140Andreas Huber
185787f2a558dd12043631e12c361abef301bf603140Andreas Huber        if (discontinuity_indicator) {
185887f2a558dd12043631e12c361abef301bf603140Andreas Huber            ALOGV("PID 0x%04x: discontinuity_indicator = 1 (!!!)", PID);
185987f2a558dd12043631e12c361abef301bf603140Andreas Huber        }
186087f2a558dd12043631e12c361abef301bf603140Andreas Huber
18613b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        *random_access_indicator = br->getBits(1);
18623b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        if (*random_access_indicator) {
18633b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            ALOGV("PID 0x%04x: random_access_indicator = 1", PID);
18643b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        }
18653b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
18663b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        unsigned elementary_stream_priority_indicator = br->getBits(1);
18673b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        if (elementary_stream_priority_indicator) {
18683b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            ALOGV("PID 0x%04x: elementary_stream_priority_indicator = 1", PID);
18693b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        }
18703b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
187187f2a558dd12043631e12c361abef301bf603140Andreas Huber        unsigned PCR_flag = br->getBits(1);
187287f2a558dd12043631e12c361abef301bf603140Andreas Huber
187387f2a558dd12043631e12c361abef301bf603140Andreas Huber        size_t numBitsRead = 4;
187487f2a558dd12043631e12c361abef301bf603140Andreas Huber
187587f2a558dd12043631e12c361abef301bf603140Andreas Huber        if (PCR_flag) {
1876e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            if (adaptation_field_length * 8 < 52) {
1877e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                return ERROR_MALFORMED;
1878e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            }
187987f2a558dd12043631e12c361abef301bf603140Andreas Huber            br->skipBits(4);
188087f2a558dd12043631e12c361abef301bf603140Andreas Huber            uint64_t PCR_base = br->getBits(32);
188187f2a558dd12043631e12c361abef301bf603140Andreas Huber            PCR_base = (PCR_base << 1) | br->getBits(1);
188287f2a558dd12043631e12c361abef301bf603140Andreas Huber
188387f2a558dd12043631e12c361abef301bf603140Andreas Huber            br->skipBits(6);
188487f2a558dd12043631e12c361abef301bf603140Andreas Huber            unsigned PCR_ext = br->getBits(9);
188587f2a558dd12043631e12c361abef301bf603140Andreas Huber
188687f2a558dd12043631e12c361abef301bf603140Andreas Huber            // The number of bytes from the start of the current
188787f2a558dd12043631e12c361abef301bf603140Andreas Huber            // MPEG2 transport stream packet up and including
188887f2a558dd12043631e12c361abef301bf603140Andreas Huber            // the final byte of this PCR_ext field.
188987f2a558dd12043631e12c361abef301bf603140Andreas Huber            size_t byteOffsetFromStartOfTSPacket =
189087f2a558dd12043631e12c361abef301bf603140Andreas Huber                (188 - br->numBitsLeft() / 8);
189187f2a558dd12043631e12c361abef301bf603140Andreas Huber
189287f2a558dd12043631e12c361abef301bf603140Andreas Huber            uint64_t PCR = PCR_base * 300 + PCR_ext;
189387f2a558dd12043631e12c361abef301bf603140Andreas Huber
1894b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross            ALOGV("PID 0x%04x: PCR = 0x%016" PRIx64 " (%.2f)",
189587f2a558dd12043631e12c361abef301bf603140Andreas Huber                  PID, PCR, PCR / 27E6);
189687f2a558dd12043631e12c361abef301bf603140Andreas Huber
189787f2a558dd12043631e12c361abef301bf603140Andreas Huber            // The number of bytes received by this parser up to and
189887f2a558dd12043631e12c361abef301bf603140Andreas Huber            // including the final byte of this PCR_ext field.
189919cec89f8b05fd05f8034ee1a4cd39ee09c33f02Marco Nelissen            uint64_t byteOffsetFromStart =
190019cec89f8b05fd05f8034ee1a4cd39ee09c33f02Marco Nelissen                uint64_t(mNumTSPacketsParsed) * 188 + byteOffsetFromStartOfTSPacket;
190187f2a558dd12043631e12c361abef301bf603140Andreas Huber
190287f2a558dd12043631e12c361abef301bf603140Andreas Huber            for (size_t i = 0; i < mPrograms.size(); ++i) {
190387f2a558dd12043631e12c361abef301bf603140Andreas Huber                updatePCR(PID, PCR, byteOffsetFromStart);
190487f2a558dd12043631e12c361abef301bf603140Andreas Huber            }
190587f2a558dd12043631e12c361abef301bf603140Andreas Huber
190687f2a558dd12043631e12c361abef301bf603140Andreas Huber            numBitsRead += 52;
190787f2a558dd12043631e12c361abef301bf603140Andreas Huber        }
190887f2a558dd12043631e12c361abef301bf603140Andreas Huber
190987f2a558dd12043631e12c361abef301bf603140Andreas Huber        br->skipBits(adaptation_field_length * 8 - numBitsRead);
1910cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
1911e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim    return OK;
1912cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
1913cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1914540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kimstatus_t ATSParser::parseTS(ABitReader *br, SyncEvent *event) {
19153856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("---");
1916cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1917cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned sync_byte = br->getBits(8);
19186456ae745e919085c5024f784aaa2703f9695f98David Yeh    if (sync_byte != 0x47u) {
19196456ae745e919085c5024f784aaa2703f9695f98David Yeh        ALOGE("[error] parseTS: return error as sync_byte=0x%x", sync_byte);
19206456ae745e919085c5024f784aaa2703f9695f98David Yeh        return BAD_VALUE;
19216456ae745e919085c5024f784aaa2703f9695f98David Yeh    }
1922cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
192352668ca838e1869676ff95e7388f93ec1858b1e9Andreas Huber    if (br->getBits(1)) {  // transport_error_indicator
192452668ca838e1869676ff95e7388f93ec1858b1e9Andreas Huber        // silently ignore.
192552668ca838e1869676ff95e7388f93ec1858b1e9Andreas Huber        return OK;
192652668ca838e1869676ff95e7388f93ec1858b1e9Andreas Huber    }
1927cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1928cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned payload_unit_start_indicator = br->getBits(1);
19293856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("payload_unit_start_indicator = %u", payload_unit_start_indicator);
1930cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
19316e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("transport_priority = %u", br->getBits(1));
1932cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1933cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned PID = br->getBits(13);
19343856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("PID = 0x%04x", PID);
1935cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
19363b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    unsigned transport_scrambling_control = br->getBits(2);
19373b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    ALOGV("transport_scrambling_control = %u", transport_scrambling_control);
1938cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1939cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned adaptation_field_control = br->getBits(2);
19403856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("adaptation_field_control = %u", adaptation_field_control);
1941cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
19420da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber    unsigned continuity_counter = br->getBits(4);
194387f2a558dd12043631e12c361abef301bf603140Andreas Huber    ALOGV("PID = 0x%04x, continuity_counter = %u", PID, continuity_counter);
19440da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber
1945df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block    // ALOGI("PID = 0x%04x, continuity_counter = %u", PID, continuity_counter);
1946cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
194787f2a558dd12043631e12c361abef301bf603140Andreas Huber    status_t err = OK;
194887f2a558dd12043631e12c361abef301bf603140Andreas Huber
19493b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    unsigned random_access_indicator = 0;
1950e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim    if (adaptation_field_control == 2 || adaptation_field_control == 3) {
19513b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        err = parseAdaptationField(br, PID, &random_access_indicator);
1952e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim    }
1953e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim    if (err == OK) {
1954e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        if (adaptation_field_control == 1 || adaptation_field_control == 3) {
1955540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim            err = parsePID(br, PID, continuity_counter,
19563b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                    payload_unit_start_indicator,
19573b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                    transport_scrambling_control,
19583b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                    random_access_indicator,
19593b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                    event);
1960e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        }
1961cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
196206528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber
196387f2a558dd12043631e12c361abef301bf603140Andreas Huber    ++mNumTSPacketsParsed;
196487f2a558dd12043631e12c361abef301bf603140Andreas Huber
196587f2a558dd12043631e12c361abef301bf603140Andreas Huber    return err;
1966cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
1967cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1968cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubersp<MediaSource> ATSParser::getSource(SourceType type) {
19699ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih    sp<MediaSource> firstSourceFound;
1970cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    for (size_t i = 0; i < mPrograms.size(); ++i) {
1971386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        const sp<Program> &program = mPrograms.editItemAt(i);
19729ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih        sp<MediaSource> source = program->getSource(type);
19739ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih        if (source == NULL) {
1974386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            continue;
1975386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        }
19769ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih        if (firstSourceFound == NULL) {
19779ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih            firstSourceFound = source;
19789ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih        }
19799ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih        // Prefer programs with both audio/video
19809ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih        switch (type) {
19819ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih            case VIDEO: {
19829ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih                if (program->hasSource(AUDIO)) {
19839ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih                    return source;
19849ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih                }
19859ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih                break;
19869ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih            }
1987386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
19889ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih            case AUDIO: {
19899ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih                if (program->hasSource(VIDEO)) {
19909ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih                    return source;
19919ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih                }
19929ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih                break;
19939ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih            }
1994cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
19959ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih            default:
19969ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih                return source;
1997cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        }
1998cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
1999cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
20009ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih    return firstSourceFound;
2001cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
2002cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
2003bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shihbool ATSParser::hasSource(SourceType type) const {
2004bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih    for (size_t i = 0; i < mPrograms.size(); ++i) {
2005bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih        const sp<Program> &program = mPrograms.itemAt(i);
2006bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih        if (program->hasSource(type)) {
2007bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih            return true;
2008bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih        }
2009bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih    }
2010bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih
2011bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih    return false;
2012bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih}
2013bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih
201443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huberbool ATSParser::PTSTimeDeltaEstablished() {
201543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    if (mPrograms.isEmpty()) {
201643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        return false;
201743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    }
201843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
201943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    return mPrograms.editItemAt(0)->PTSTimeDeltaEstablished();
202043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber}
202143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
202282e147049625a4cfdcb228a1de7efda594d446c9Robert Shihint64_t ATSParser::getFirstPTSTimeUs() {
202382e147049625a4cfdcb228a1de7efda594d446c9Robert Shih    for (size_t i = 0; i < mPrograms.size(); ++i) {
202482e147049625a4cfdcb228a1de7efda594d446c9Robert Shih        sp<ATSParser::Program> program = mPrograms.itemAt(i);
202582e147049625a4cfdcb228a1de7efda594d446c9Robert Shih        if (program->PTSTimeDeltaEstablished()) {
202682e147049625a4cfdcb228a1de7efda594d446c9Robert Shih            return (program->firstPTS() * 100) / 9;
202782e147049625a4cfdcb228a1de7efda594d446c9Robert Shih        }
202882e147049625a4cfdcb228a1de7efda594d446c9Robert Shih    }
202982e147049625a4cfdcb228a1de7efda594d446c9Robert Shih    return -1;
203082e147049625a4cfdcb228a1de7efda594d446c9Robert Shih}
203182e147049625a4cfdcb228a1de7efda594d446c9Robert Shih
2032c9fa35cf7c9c11a8acb77128db1a6a13f1befe3cChad Brubaker__attribute__((no_sanitize("integer")))
203387f2a558dd12043631e12c361abef301bf603140Andreas Hubervoid ATSParser::updatePCR(
203419cec89f8b05fd05f8034ee1a4cd39ee09c33f02Marco Nelissen        unsigned /* PID */, uint64_t PCR, uint64_t byteOffsetFromStart) {
203519cec89f8b05fd05f8034ee1a4cd39ee09c33f02Marco Nelissen    ALOGV("PCR 0x%016" PRIx64 " @ %" PRIx64, PCR, byteOffsetFromStart);
203687f2a558dd12043631e12c361abef301bf603140Andreas Huber
203787f2a558dd12043631e12c361abef301bf603140Andreas Huber    if (mNumPCRs == 2) {
203887f2a558dd12043631e12c361abef301bf603140Andreas Huber        mPCR[0] = mPCR[1];
203987f2a558dd12043631e12c361abef301bf603140Andreas Huber        mPCRBytes[0] = mPCRBytes[1];
204087f2a558dd12043631e12c361abef301bf603140Andreas Huber        mSystemTimeUs[0] = mSystemTimeUs[1];
204187f2a558dd12043631e12c361abef301bf603140Andreas Huber        mNumPCRs = 1;
204287f2a558dd12043631e12c361abef301bf603140Andreas Huber    }
204387f2a558dd12043631e12c361abef301bf603140Andreas Huber
204487f2a558dd12043631e12c361abef301bf603140Andreas Huber    mPCR[mNumPCRs] = PCR;
204587f2a558dd12043631e12c361abef301bf603140Andreas Huber    mPCRBytes[mNumPCRs] = byteOffsetFromStart;
204687f2a558dd12043631e12c361abef301bf603140Andreas Huber    mSystemTimeUs[mNumPCRs] = ALooper::GetNowUs();
204787f2a558dd12043631e12c361abef301bf603140Andreas Huber
204887f2a558dd12043631e12c361abef301bf603140Andreas Huber    ++mNumPCRs;
204987f2a558dd12043631e12c361abef301bf603140Andreas Huber
205087f2a558dd12043631e12c361abef301bf603140Andreas Huber    if (mNumPCRs == 2) {
2051c9fa35cf7c9c11a8acb77128db1a6a13f1befe3cChad Brubaker        /* Unsigned overflow here */
205287f2a558dd12043631e12c361abef301bf603140Andreas Huber        double transportRate =
205387f2a558dd12043631e12c361abef301bf603140Andreas Huber            (mPCRBytes[1] - mPCRBytes[0]) * 27E6 / (mPCR[1] - mPCR[0]);
205487f2a558dd12043631e12c361abef301bf603140Andreas Huber
205587f2a558dd12043631e12c361abef301bf603140Andreas Huber        ALOGV("transportRate = %.2f bytes/sec", transportRate);
205687f2a558dd12043631e12c361abef301bf603140Andreas Huber    }
205787f2a558dd12043631e12c361abef301bf603140Andreas Huber}
205887f2a558dd12043631e12c361abef301bf603140Andreas Huber
20598dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber////////////////////////////////////////////////////////////////////////////////
20608dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
20619ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim
20629ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim// CRC32 used for PSI section. The table was generated by following command:
20639ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim// $ python pycrc.py --model crc-32-mpeg --algorithm table-driven --generate c
20649ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim// Visit http://www.tty1.net/pycrc/index_en.html for more details.
20659ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kimuint32_t ATSParser::PSISection::CRC_TABLE[] = {
20669ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9,
20679ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x130476dc, 0x17c56b6b, 0x1a864db2, 0x1e475005,
20689ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61,
20699ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd,
20709ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9,
20719ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75,
20729ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011,
20739ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x791d4014, 0x7ddc5da3, 0x709f7b7a, 0x745e66cd,
20749ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039,
20759ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5,
20769ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xbe2b5b58, 0xbaea46ef, 0xb7a96036, 0xb3687d81,
20779ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d,
20789ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49,
20799ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95,
20809ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1,
20819ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d,
20829ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x34867077, 0x30476dc0, 0x3d044b19, 0x39c556ae,
20839ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072,
20849ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16,
20859ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca,
20869ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde,
20879ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02,
20889ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x5e9f46bf, 0x5a5e5b08, 0x571d7dd1, 0x53dc6066,
20899ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,
20909ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e,
20919ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xbfa1b04b, 0xbb60adfc, 0xb6238b25, 0xb2e29692,
20929ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6,
20939ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a,
20949ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e,
20959ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2,
20969ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686,
20979ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xd5b88683, 0xd1799b34, 0xdc3abded, 0xd8fba05a,
20989ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637,
20999ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb,
21009ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f,
21019ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53,
21029ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47,
21039ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x36194d42, 0x32d850f5, 0x3f9b762c, 0x3b5a6b9b,
21049ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff,
21059ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623,
21069ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xf12f560e, 0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7,
21079ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b,
21089ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f,
21099ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3,
21109ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7,
21119ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b,
21129ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x9b3660c6, 0x9ff77d71, 0x92b45ba8, 0x9675461f,
21139ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3,
21149ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640,
21159ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c,
21169ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8,
21179ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24,
21189ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x119b4be9, 0x155a565e, 0x18197087, 0x1cd86d30,
21199ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec,
21209ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088,
21219ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x2497d08d, 0x2056cd3a, 0x2d15ebe3, 0x29d4f654,
21229ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0,
21239ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c,
21249ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18,
21259ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4,
21269ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0,
21279ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x9abc8bd5, 0x9e7d9662, 0x933eb0bb, 0x97ffad0c,
21289ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668,
21299ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4
21309ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    };
21319ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim
21329ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk KimATSParser::PSISection::PSISection() :
21339ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    mSkipBytes(0) {
21348dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber}
21358dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
21368dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas HuberATSParser::PSISection::~PSISection() {
21378dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber}
21388dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
21398dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberstatus_t ATSParser::PSISection::append(const void *data, size_t size) {
21408dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    if (mBuffer == NULL || mBuffer->size() + size > mBuffer->capacity()) {
21418dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        size_t newCapacity =
21428dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            (mBuffer == NULL) ? size : mBuffer->capacity() + size;
21438dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
21448dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        newCapacity = (newCapacity + 1023) & ~1023;
21458dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
21468dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        sp<ABuffer> newBuffer = new ABuffer(newCapacity);
21478dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
21488dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        if (mBuffer != NULL) {
21498dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            memcpy(newBuffer->data(), mBuffer->data(), mBuffer->size());
21508dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            newBuffer->setRange(0, mBuffer->size());
21518dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        } else {
21528dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            newBuffer->setRange(0, 0);
21538dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        }
21548dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
21558dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        mBuffer = newBuffer;
21568dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    }
21578dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
21588dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    memcpy(mBuffer->data() + mBuffer->size(), data, size);
21598dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    mBuffer->setRange(0, mBuffer->size() + size);
21608dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
21618dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    return OK;
21628dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber}
21638dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
21649ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kimvoid ATSParser::PSISection::setSkipBytes(uint8_t skip) {
21659ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    mSkipBytes = skip;
21669ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim}
21679ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim
21688dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Hubervoid ATSParser::PSISection::clear() {
21698dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    if (mBuffer != NULL) {
21708dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        mBuffer->setRange(0, 0);
21718dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    }
21729ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    mSkipBytes = 0;
21738dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber}
21748dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
21758dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberbool ATSParser::PSISection::isComplete() const {
21768dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    if (mBuffer == NULL || mBuffer->size() < 3) {
21778dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        return false;
21788dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    }
21798dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
21808dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    unsigned sectionLength = U16_AT(mBuffer->data() + 1) & 0xfff;
21818dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    return mBuffer->size() >= sectionLength + 3;
21828dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber}
21838dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
21848dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberbool ATSParser::PSISection::isEmpty() const {
21858dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    return mBuffer == NULL || mBuffer->size() == 0;
21868dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber}
21878dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
21888dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberconst uint8_t *ATSParser::PSISection::data() const {
21898dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    return mBuffer == NULL ? NULL : mBuffer->data();
21908dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber}
21918dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
21928dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Hubersize_t ATSParser::PSISection::size() const {
21938dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    return mBuffer == NULL ? 0 : mBuffer->size();
21948dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber}
21958dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
21969ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kimbool ATSParser::PSISection::isCRCOkay() const {
21979ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    if (!isComplete()) {
21989ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim        return false;
21999ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    }
22009ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    uint8_t* data = mBuffer->data();
22019ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim
22029ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    // Return true if section_syntax_indicator says no section follows the field section_length.
22039ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    if ((data[1] & 0x80) == 0) {
22049ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim        return true;
22059ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    }
22069ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim
22079ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    unsigned sectionLength = U16_AT(data + 1) & 0xfff;
22089ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    ALOGV("sectionLength %u, skip %u", sectionLength, mSkipBytes);
22099ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim
2210c0c9f50d15f7b9ed539c0c6277296d083f41b293Marco Nelissen
2211c0c9f50d15f7b9ed539c0c6277296d083f41b293Marco Nelissen    if(sectionLength < mSkipBytes) {
2212c0c9f50d15f7b9ed539c0c6277296d083f41b293Marco Nelissen        ALOGE("b/28333006");
2213c0c9f50d15f7b9ed539c0c6277296d083f41b293Marco Nelissen        android_errorWriteLog(0x534e4554, "28333006");
2214c0c9f50d15f7b9ed539c0c6277296d083f41b293Marco Nelissen        return false;
2215c0c9f50d15f7b9ed539c0c6277296d083f41b293Marco Nelissen    }
2216c0c9f50d15f7b9ed539c0c6277296d083f41b293Marco Nelissen
22179ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    // Skip the preceding field present when payload start indicator is on.
22189ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    sectionLength -= mSkipBytes;
22199ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim
22209ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    uint32_t crc = 0xffffffff;
22219ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    for(unsigned i = 0; i < sectionLength + 4 /* crc */; i++) {
22229ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim        uint8_t b = data[i];
22239ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim        int index = ((crc >> 24) ^ (b & 0xff)) & 0xff;
22249ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim        crc = CRC_TABLE[index] ^ (crc << 8);
22259ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    }
22269ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    ALOGV("crc: %08x\n", crc);
22279ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    return (crc == 0);
22289ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim}
2229cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}  // namespace android
2230