ATSParser.cpp revision bc7aae4ff7e72e5bf0fa888f946835840a4357bb
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
143bc7aae4ff7e72e5bf0fa888f946835840a4357bbChong Zhang    void setCasInfo(
144bc7aae4ff7e72e5bf0fa888f946835840a4357bbChong Zhang            int32_t systemId,
1453b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            const sp<IDescrambler> &descrambler,
1463b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            const std::vector<uint8_t> &sessionId);
1473b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
148540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    // Parse the payload and set event when PES with a sync frame is detected.
1499558f6dd733dc450270f38b9a139d384d273ce0aWei Jia    // This method knows when a PES starts; so record mPesStartOffsets in that
150540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    // case.
1515403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber    status_t parse(
15287f2a558dd12043631e12c361abef301bf603140Andreas Huber            unsigned continuity_counter,
153cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            unsigned payload_unit_start_indicator,
1543b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            unsigned transport_scrambling_control,
1553b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            unsigned random_access_indicator,
156540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim            ABitReader *br,
157540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim            SyncEvent *event);
158cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
15932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber    void signalDiscontinuity(
16032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            DiscontinuityType type, const sp<AMessage> &extra);
16132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
162f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    void signalEOS(status_t finalResult);
1632a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber
16482e147049625a4cfdcb228a1de7efda594d446c9Robert Shih    SourceType getSourceType();
165cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    sp<MediaSource> getSource(SourceType type);
166cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
167bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih    bool isAudio() const;
168bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih    bool isVideo() const;
1690852843d304006e3ab333081fddda13b07193de8Robert Shih    bool isMeta() const;
170bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih
171cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberprotected:
172cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    virtual ~Stream();
173cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
174cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberprivate:
1753b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    struct SubSampleInfo {
1763b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        size_t subSampleSize;
1773b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        unsigned transport_scrambling_mode;
1783b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        unsigned random_access_indicator;
1793b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    };
180bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    Program *mProgram;
181cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned mElementaryPID;
182cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned mStreamType;
18387f2a558dd12043631e12c361abef301bf603140Andreas Huber    unsigned mPCR_PID;
18487f2a558dd12043631e12c361abef301bf603140Andreas Huber    int32_t mExpectedContinuityCounter;
185cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
186cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    sp<ABuffer> mBuffer;
187cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    sp<AnotherPacketSource> mSource;
188cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    bool mPayloadStarted;
189be9634d071e79b72a42a4504f64eda9e2a0bceb8Marco Nelissen    bool mEOSReached;
190cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
19190a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber    uint64_t mPrevPTS;
1929558f6dd733dc450270f38b9a139d384d273ce0aWei Jia    List<off64_t> mPesStartOffsets;
19390a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber
194386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    ElementaryStreamQueue *mQueue;
1956a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber
1963b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    bool mScrambled;
1973b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    sp<IMemory> mMem;
1983b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    sp<MemoryDealer> mDealer;
1993b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    sp<ABuffer> mDescrambledBuffer;
2003b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    List<SubSampleInfo> mSubSamples;
2013b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    sp<IDescrambler> mDescrambler;
2023b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
203540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    // Flush accumulated payload if necessary --- i.e. at EOS or at the start of
204540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    // another payload. event is set if the flushed payload is PES with a sync
205540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    // frame.
206540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    status_t flush(SyncEvent *event);
2073b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
2083b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    // Flush accumulated payload for scrambled streams if necessary --- i.e. at
2093b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    // EOS or at the start of another payload. event is set if the flushed
2103b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    // payload is PES with a sync frame.
2113b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    status_t flushScrambled(SyncEvent *event);
2123b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
2133b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    // Check if a PES packet is scrambled at PES level.
2143b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    uint32_t getPesScramblingControl(ABitReader *br, int32_t *pesOffset);
2153b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
216540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    // Strip and parse PES headers and pass remaining payload into onPayload
217540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    // with parsed metadata. event is set if the PES contains a sync frame.
218540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    status_t parsePES(ABitReader *br, SyncEvent *event);
219540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim
220540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    // Feed the payload into mQueue and if a packet is identified, queue it
221540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    // into mSource. If the packet is a sync frame. set event with start offset
222540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    // and timestamp of the packet.
223cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    void onPayloadData(
224cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            unsigned PTS_DTS_flags, uint64_t PTS, uint64_t DTS,
2253b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            unsigned PES_scrambling_control,
2263b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            const uint8_t *data, size_t size,
2273b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            int32_t payloadOffset, SyncEvent *event);
2283b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
2293b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    // Ensure internal buffers can hold specified size, and will re-allocate
2303b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    // as needed.
2313b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    void ensureBufferCapacity(size_t size);
23282f7321b03eec1e40af9d681370f754ee0279582Andreas Huber
233cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    DISALLOW_EVIL_CONSTRUCTORS(Stream);
234cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber};
235cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
2368dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberstruct ATSParser::PSISection : public RefBase {
2378dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    PSISection();
2388dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
2398dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    status_t append(const void *data, size_t size);
2409ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    void setSkipBytes(uint8_t skip);
2418dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    void clear();
2428dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
2438dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    bool isComplete() const;
2448dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    bool isEmpty() const;
2459ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    bool isCRCOkay() const;
2468dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
2478dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    const uint8_t *data() const;
2488dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    size_t size() const;
2498dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
2508dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberprotected:
2518dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    virtual ~PSISection();
2528dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
2538dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberprivate:
2548dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    sp<ABuffer> mBuffer;
2559ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    uint8_t mSkipBytes;
2569ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    static uint32_t CRC_TABLE[];
2578dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
2588dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    DISALLOW_EVIL_CONSTRUCTORS(PSISection);
2598dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber};
2608dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
261540006666b4191cd78391378f1c66c21bcf0c4cdWonsik KimATSParser::SyncEvent::SyncEvent(off64_t offset)
2629558f6dd733dc450270f38b9a139d384d273ce0aWei Jia    : mHasReturnedData(false), mOffset(offset), mTimeUs(0) {}
263540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim
264540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kimvoid ATSParser::SyncEvent::init(off64_t offset, const sp<MediaSource> &source,
26582e147049625a4cfdcb228a1de7efda594d446c9Robert Shih        int64_t timeUs, SourceType type) {
2669558f6dd733dc450270f38b9a139d384d273ce0aWei Jia    mHasReturnedData = true;
267540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    mOffset = offset;
268540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    mMediaSource = source;
269540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    mTimeUs = timeUs;
27082e147049625a4cfdcb228a1de7efda594d446c9Robert Shih    mType = type;
271540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim}
272540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim
2739558f6dd733dc450270f38b9a139d384d273ce0aWei Jiavoid ATSParser::SyncEvent::reset() {
2749558f6dd733dc450270f38b9a139d384d273ce0aWei Jia    mHasReturnedData = false;
2759558f6dd733dc450270f38b9a139d384d273ce0aWei Jia}
276cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber////////////////////////////////////////////////////////////////////////////////
277cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
278386d609dc513e838c7e7c4c46c604493ccd560beAndreas HuberATSParser::Program::Program(
279d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang        ATSParser *parser, unsigned programNumber, unsigned programMapPID,
280d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang        int64_t lastRecoveredPTS)
281f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    : mParser(parser),
282386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber      mProgramNumber(programNumber),
283f933441648ef6a71dee783d733aac17b9508b452Andreas Huber      mProgramMapPID(programMapPID),
284bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber      mFirstPTSValid(false),
285799c9682b3776a55d234396aee4a302437150c26Chong Zhang      mFirstPTS(0),
286d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang      mLastRecoveredPTS(lastRecoveredPTS) {
2873856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("new program number %u", programNumber);
288cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
289cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
2908dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberbool ATSParser::Program::parsePSISection(
2918dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        unsigned pid, ABitReader *br, status_t *err) {
29206528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber    *err = OK;
29306528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber
2948dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    if (pid != mProgramMapPID) {
2958dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        return false;
2968dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    }
297cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
2988dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    *err = parseProgramMap(br);
29906528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber
3008dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    return true;
3018dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber}
3028dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
3038dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberbool ATSParser::Program::parsePID(
30487f2a558dd12043631e12c361abef301bf603140Andreas Huber        unsigned pid, unsigned continuity_counter,
30587f2a558dd12043631e12c361abef301bf603140Andreas Huber        unsigned payload_unit_start_indicator,
3063b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        unsigned transport_scrambling_control,
3073b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        unsigned random_access_indicator,
308540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim        ABitReader *br, status_t *err, SyncEvent *event) {
3098dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    *err = OK;
310cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
311cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    ssize_t index = mStreams.indexOfKey(pid);
312cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    if (index < 0) {
313cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        return false;
314cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
315cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
3165403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber    *err = mStreams.editValueAt(index)->parse(
3173b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            continuity_counter,
3183b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            payload_unit_start_indicator,
3193b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            transport_scrambling_control,
3203b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            random_access_indicator,
3213b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            br, event);
322cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
323cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    return true;
324cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
325cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
32632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Hubervoid ATSParser::Program::signalDiscontinuity(
32732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        DiscontinuityType type, const sp<AMessage> &extra) {
328b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber    int64_t mediaTimeUs;
329b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber    if ((type & DISCONTINUITY_TIME)
330b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber            && extra != NULL
331b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber            && extra->findInt64(
332b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber                IStreamListener::kKeyMediaTimeUs, &mediaTimeUs)) {
333b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber        mFirstPTSValid = false;
334b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber    }
335b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber
3362a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    for (size_t i = 0; i < mStreams.size(); ++i) {
33732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        mStreams.editValueAt(i)->signalDiscontinuity(type, extra);
338f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
339f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
340f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
341f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ATSParser::Program::signalEOS(status_t finalResult) {
342f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    for (size_t i = 0; i < mStreams.size(); ++i) {
343f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        mStreams.editValueAt(i)->signalEOS(finalResult);
3442a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    }
3452a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber}
3462a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber
3479bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhangbool ATSParser::Program::switchPIDs(const Vector<StreamInfo> &infos) {
3489bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang    bool success = false;
3499bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang
3509bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang    if (mStreams.size() == infos.size()) {
3519bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        // build type->PIDs map for old and new mapping
3529bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        size_t i;
3539bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        KeyedVector<int32_t, Vector<int32_t> > oldType2PIDs, newType2PIDs;
3549bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        for (i = 0; i < mStreams.size(); ++i) {
3559bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            ssize_t index = oldType2PIDs.indexOfKey(mStreams[i]->type());
3569bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            if (index < 0) {
3579bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                oldType2PIDs.add(mStreams[i]->type(), Vector<int32_t>());
3589bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            }
3599bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            oldType2PIDs.editValueFor(mStreams[i]->type()).push_back(mStreams[i]->pid());
3609bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        }
3619bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        for (i = 0; i < infos.size(); ++i) {
3629bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            ssize_t index = newType2PIDs.indexOfKey(infos[i].mType);
3639bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            if (index < 0) {
3649bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                newType2PIDs.add(infos[i].mType, Vector<int32_t>());
3659bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            }
3669bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            newType2PIDs.editValueFor(infos[i].mType).push_back(infos[i].mPID);
3679bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        }
3689bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang
3699bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        // we can recover if the number of streams for each type hasn't changed
3709bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        if (oldType2PIDs.size() == newType2PIDs.size()) {
3719bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            success = true;
3729bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            for (i = 0; i < oldType2PIDs.size(); ++i) {
3739bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                // KeyedVector is sorted, we just compare key and size of each index
3749bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                if (oldType2PIDs.keyAt(i) != newType2PIDs.keyAt(i)
3759bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                        || oldType2PIDs[i].size() != newType2PIDs[i].size()) {
3769bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                     success = false;
3779bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                     break;
3789bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                }
3799bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            }
3809bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        }
3819bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang
3829bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        if (success) {
3839bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            // save current streams to temp
3849bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            KeyedVector<int32_t, sp<Stream> > temp;
3859bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            for (i = 0; i < mStreams.size(); ++i) {
3869bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                 temp.add(mStreams.keyAt(i), mStreams.editValueAt(i));
3879bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            }
3889bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang
3899bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            mStreams.clear();
3909bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            for (i = 0; i < temp.size(); ++i) {
3919bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                // The two checks below shouldn't happen,
3929bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                // we already checked above the stream count matches
3939bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                ssize_t index = newType2PIDs.indexOfKey(temp[i]->type());
394e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                if (index < 0) {
395e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                    return false;
396e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                }
3979bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                Vector<int32_t> &newPIDs = newType2PIDs.editValueAt(index);
398e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                if (newPIDs.isEmpty()) {
399e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                    return false;
400e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                }
4019bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang
4029bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                // get the next PID for temp[i]->type() in the new PID map
4039bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                Vector<int32_t>::iterator it = newPIDs.begin();
4049bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang
4059bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                // change the PID of the stream, and add it back
4069bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                temp.editValueAt(i)->setPID(*it);
4079bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                mStreams.add(temp[i]->pid(), temp.editValueAt(i));
4089bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang
4099bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                // removed the used PID
4109bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                newPIDs.erase(it);
4119bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            }
4129bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        }
4139bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang    }
4149bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang    return success;
4159bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang}
416bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber
4173b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhangbool ATSParser::Program::findCADescriptor(
4183b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        ABitReader *br, unsigned infoLength,
4193b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        ATSParser::CADescriptor *caDescriptor) {
4203b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    bool found = false;
4213b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    while (infoLength > 2) {
4223b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        unsigned descriptor_tag = br->getBits(8);
4233b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        ALOGV("      tag = 0x%02x", descriptor_tag);
4243b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
4253b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        unsigned descriptor_length = br->getBits(8);
4263b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        ALOGV("      len = %u", descriptor_length);
4273b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
4283b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        infoLength -= 2;
4293b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        if (descriptor_length > infoLength) {
4303b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            break;
4313b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        }
4323b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        if (descriptor_tag == 9 && descriptor_length >= 4) {
4333b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            found = true;
4343b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            caDescriptor->mSystemID = br->getBits(16);
4353b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            caDescriptor->mPID = br->getBits(16) & 0x1fff;
4363b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            infoLength -= 4;
4373b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            caDescriptor->mPrivateData.assign(
4383b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                    br->data(), br->data() + descriptor_length - 4);
4393b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            break;
4403b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        } else {
4413b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            infoLength -= descriptor_length;
4423b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            br->skipBits(descriptor_length * 8);
4433b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        }
4443b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    }
4453b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    br->skipBits(infoLength * 8);
4463b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    return found;
4473b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang}
4483b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
44906528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huberstatus_t ATSParser::Program::parseProgramMap(ABitReader *br) {
450cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned table_id = br->getBits(8);
4513856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("  table_id = %u", table_id);
4526456ae745e919085c5024f784aaa2703f9695f98David Yeh    if (table_id != 0x02u) {
4536456ae745e919085c5024f784aaa2703f9695f98David Yeh        ALOGE("PMT data error!");
4546456ae745e919085c5024f784aaa2703f9695f98David Yeh        return ERROR_MALFORMED;
4556456ae745e919085c5024f784aaa2703f9695f98David Yeh    }
4566e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    unsigned section_syntax_indicator = br->getBits(1);
4573856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("  section_syntax_indicator = %u", section_syntax_indicator);
4586456ae745e919085c5024f784aaa2703f9695f98David Yeh    if (section_syntax_indicator != 1u) {
4596456ae745e919085c5024f784aaa2703f9695f98David Yeh        ALOGE("PMT data error!");
4606456ae745e919085c5024f784aaa2703f9695f98David Yeh        return ERROR_MALFORMED;
4616456ae745e919085c5024f784aaa2703f9695f98David Yeh    }
462cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
463e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim    br->skipBits(1);  // '0'
4646e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  reserved = %u", br->getBits(2));
465cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
466cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned section_length = br->getBits(12);
4673856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("  section_length = %u", section_length);
468cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
4696e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  program_number = %u", br->getBits(16));
4706e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  reserved = %u", br->getBits(2));
4716e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  version_number = %u", br->getBits(5));
4726e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  current_next_indicator = %u", br->getBits(1));
4736e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  section_number = %u", br->getBits(8));
4746e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  last_section_number = %u", br->getBits(8));
4756e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  reserved = %u", br->getBits(3));
47687f2a558dd12043631e12c361abef301bf603140Andreas Huber
47787f2a558dd12043631e12c361abef301bf603140Andreas Huber    unsigned PCR_PID = br->getBits(13);
47887f2a558dd12043631e12c361abef301bf603140Andreas Huber    ALOGV("  PCR_PID = 0x%04x", PCR_PID);
47987f2a558dd12043631e12c361abef301bf603140Andreas Huber
4806e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  reserved = %u", br->getBits(4));
481cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
482cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned program_info_length = br->getBits(12);
4833856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("  program_info_length = %u", program_info_length);
484cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
4853b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    // descriptors
4863b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    CADescriptor programCA;
4873b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    bool hasProgramCA = findCADescriptor(br, program_info_length, &programCA);
4883b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    if (hasProgramCA && !mParser->mCasManager->addProgram(
4893b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            mProgramNumber, programCA)) {
4903b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        return ERROR_MALFORMED;
4913b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    }
492cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
493bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber    Vector<StreamInfo> infos;
494bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber
495cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    // infoBytesRemaining is the number of bytes that make up the
496cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    // variable length section of ES_infos. It does not include the
497cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    // final CRC.
498cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    size_t infoBytesRemaining = section_length - 9 - program_info_length - 4;
499cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
500e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim    while (infoBytesRemaining >= 5) {
501cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
502cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned streamType = br->getBits(8);
5033856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("    stream_type = 0x%02x", streamType);
504cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
5056e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber        MY_LOGV("    reserved = %u", br->getBits(3));
506cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
507cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned elementaryPID = br->getBits(13);
5083856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("    elementary_PID = 0x%04x", elementaryPID);
509cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
5106e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber        MY_LOGV("    reserved = %u", br->getBits(4));
511cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
512cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned ES_info_length = br->getBits(12);
5133856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("    ES_info_length = %u", ES_info_length);
514cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
5153b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        CADescriptor streamCA;
5163b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        bool hasStreamCA = findCADescriptor(br, ES_info_length, &streamCA);
5173b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        if (hasStreamCA && !mParser->mCasManager->addStream(
5183b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                mProgramNumber, elementaryPID, streamCA)) {
5193b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            return ERROR_MALFORMED;
520cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        }
521bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        StreamInfo info;
522bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        info.mType = streamType;
523bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        info.mPID = elementaryPID;
5243b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        info.mCASystemId = hasProgramCA ? programCA.mSystemID :
5253b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                           hasStreamCA ? streamCA.mSystemID  : -1;
526bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        infos.push(info);
527cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
528cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        infoBytesRemaining -= 5 + ES_info_length;
529cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
530cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
531e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim    if (infoBytesRemaining != 0) {
532e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        ALOGW("Section data remains unconsumed");
533e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim    }
5346e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  CRC = 0x%08x", br->getBits(32));
535bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber
536bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber    bool PIDsChanged = false;
537bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber    for (size_t i = 0; i < infos.size(); ++i) {
538bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        StreamInfo &info = infos.editItemAt(i);
539bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber
540bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        ssize_t index = mStreams.indexOfKey(info.mPID);
541bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber
542bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        if (index >= 0 && mStreams.editValueAt(index)->type() != info.mType) {
543df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block            ALOGI("uh oh. stream PIDs have changed.");
544bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber            PIDsChanged = true;
545bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber            break;
546bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        }
547bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber    }
548bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber
549bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber    if (PIDsChanged) {
55006528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber#if 0
551df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block        ALOGI("before:");
55206528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber        for (size_t i = 0; i < mStreams.size(); ++i) {
55306528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber            sp<Stream> stream = mStreams.editValueAt(i);
55406528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber
555df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block            ALOGI("PID 0x%08x => type 0x%02x", stream->pid(), stream->type());
55606528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber        }
55706528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber
558df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block        ALOGI("after:");
55906528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber        for (size_t i = 0; i < infos.size(); ++i) {
56006528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber            StreamInfo &info = infos.editItemAt(i);
56106528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber
562df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block            ALOGI("PID 0x%08x => type 0x%02x", info.mPID, info.mType);
56306528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber        }
56406528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber#endif
56506528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber
5669bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        // we can recover if number of streams for each type remain the same
5679bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        bool success = switchPIDs(infos);
56806528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber
56906528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber        if (!success) {
570df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block            ALOGI("Stream PIDs changed and we cannot recover.");
57106528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber            return ERROR_MALFORMED;
57206528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber        }
573bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber    }
574bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber
5753b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    bool isAddingScrambledStream = false;
576bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber    for (size_t i = 0; i < infos.size(); ++i) {
577bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        StreamInfo &info = infos.editItemAt(i);
578bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber
5793b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        if (mParser->mCasManager->isCAPid(info.mPID)) {
5803b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            // skip CA streams (EMM/ECM)
5813b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            continue;
5823b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        }
583bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        ssize_t index = mStreams.indexOfKey(info.mPID);
584bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber
585bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        if (index < 0) {
58687f2a558dd12043631e12c361abef301bf603140Andreas Huber            sp<Stream> stream = new Stream(
5873b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                    this, info.mPID, info.mType, PCR_PID, info.mCASystemId);
58887f2a558dd12043631e12c361abef301bf603140Andreas Huber
5893b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            isAddingScrambledStream |= info.mCASystemId >= 0;
590bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber            mStreams.add(info.mPID, stream);
591bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        }
592bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber    }
59306528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber
5943b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    if (isAddingScrambledStream) {
5953b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        ALOGI("Receiving scrambled streams without descrambler!");
5963b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        return ERROR_DRM_DECRYPT_UNIT_NOT_INITIALIZED;
5973b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    }
59806528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber    return OK;
599cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
600cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
601799c9682b3776a55d234396aee4a302437150c26Chong Zhangint64_t ATSParser::Program::recoverPTS(uint64_t PTS_33bit) {
602799c9682b3776a55d234396aee4a302437150c26Chong Zhang    // We only have the lower 33-bit of the PTS. It could overflow within a
603799c9682b3776a55d234396aee4a302437150c26Chong Zhang    // reasonable amount of time. To handle the wrap-around, use fancy math
604799c9682b3776a55d234396aee4a302437150c26Chong Zhang    // to get an extended PTS that is within [-0xffffffff, 0xffffffff]
605799c9682b3776a55d234396aee4a302437150c26Chong Zhang    // of the latest recovered PTS.
6069bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang    if (mLastRecoveredPTS < 0ll) {
6079bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        // Use the original 33bit number for 1st frame, the reason is that
6089bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        // if 1st frame wraps to negative that's far away from 0, we could
6099bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        // never start. Only start wrapping around from 2nd frame.
6109bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        mLastRecoveredPTS = static_cast<int64_t>(PTS_33bit);
6119bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang    } else {
6129bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        mLastRecoveredPTS = static_cast<int64_t>(
6133728ba367f1e23e652c5539d9488aa0d0d4ec9d7Chad Brubaker                ((mLastRecoveredPTS - static_cast<int64_t>(PTS_33bit) + 0x100000000ll)
6149bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                & 0xfffffffe00000000ull) | PTS_33bit);
6159bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        // We start from 0, but recovered PTS could be slightly below 0.
6169bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        // Clamp it to 0 as rest of the pipeline doesn't take negative pts.
6179bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        // (eg. video is read first and starts at 0, but audio starts at 0xfffffff0)
6189bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        if (mLastRecoveredPTS < 0ll) {
6195c9054bc6efc080b265e028f2ebb1abd2a2e3953Chih-Hung Hsieh            ALOGI("Clamping negative recovered PTS (%" PRId64 ") to 0", mLastRecoveredPTS);
6209bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            mLastRecoveredPTS = 0ll;
6219bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        }
6229bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang    }
6239bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang
6249bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang    return mLastRecoveredPTS;
625799c9682b3776a55d234396aee4a302437150c26Chong Zhang}
626799c9682b3776a55d234396aee4a302437150c26Chong Zhang
627cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubersp<MediaSource> ATSParser::Program::getSource(SourceType type) {
628cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    for (size_t i = 0; i < mStreams.size(); ++i) {
629cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        sp<MediaSource> source = mStreams.editValueAt(i)->getSource(type);
630cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        if (source != NULL) {
6319ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih            return source;
632cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        }
633cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
634cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
635cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    return NULL;
636cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
637cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
638bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shihbool ATSParser::Program::hasSource(SourceType type) const {
639bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih    for (size_t i = 0; i < mStreams.size(); ++i) {
640bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih        const sp<Stream> &stream = mStreams.valueAt(i);
641bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih        if (type == AUDIO && stream->isAudio()) {
642bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih            return true;
643bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih        } else if (type == VIDEO && stream->isVideo()) {
644bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih            return true;
6459ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih        } else if (type == META && stream->isMeta()) {
6469ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih            return true;
647bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih        }
648bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih    }
649bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih
650bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih    return false;
651bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih}
652bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih
653bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huberint64_t ATSParser::Program::convertPTSToTimestamp(uint64_t PTS) {
654799c9682b3776a55d234396aee4a302437150c26Chong Zhang    PTS = recoverPTS(PTS);
655799c9682b3776a55d234396aee4a302437150c26Chong Zhang
656c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber    if (!(mParser->mFlags & TS_TIMESTAMPS_ARE_ABSOLUTE)) {
657c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber        if (!mFirstPTSValid) {
658c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber            mFirstPTSValid = true;
659c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber            mFirstPTS = PTS;
660c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber            PTS = 0;
661c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber        } else if (PTS < mFirstPTS) {
662c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber            PTS = 0;
663c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber        } else {
664c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber            PTS -= mFirstPTS;
665c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber        }
666bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    }
667bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber
66887f2a558dd12043631e12c361abef301bf603140Andreas Huber    int64_t timeUs = (PTS * 100) / 9;
66987f2a558dd12043631e12c361abef301bf603140Andreas Huber
67087f2a558dd12043631e12c361abef301bf603140Andreas Huber    if (mParser->mAbsoluteTimeAnchorUs >= 0ll) {
67187f2a558dd12043631e12c361abef301bf603140Andreas Huber        timeUs += mParser->mAbsoluteTimeAnchorUs;
67287f2a558dd12043631e12c361abef301bf603140Andreas Huber    }
67387f2a558dd12043631e12c361abef301bf603140Andreas Huber
674d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber    if (mParser->mTimeOffsetValid) {
675d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber        timeUs += mParser->mTimeOffsetUs;
676d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber    }
677d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber
67887f2a558dd12043631e12c361abef301bf603140Andreas Huber    return timeUs;
679bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber}
680bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber
6813b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhangvoid ATSParser::Program::updateCasSessions() {
6823b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    for (size_t i = 0; i < mStreams.size(); ++i) {
6833b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        sp<Stream> &stream = mStreams.editValueAt(i);
6843b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        sp<IDescrambler> descrambler;
6853b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        std::vector<uint8_t> sessionId;
686bc7aae4ff7e72e5bf0fa888f946835840a4357bbChong Zhang        int32_t systemId;
687bc7aae4ff7e72e5bf0fa888f946835840a4357bbChong Zhang        if (mParser->mCasManager->getCasInfo(mProgramNumber, stream->pid(),
688bc7aae4ff7e72e5bf0fa888f946835840a4357bbChong Zhang                &systemId, &descrambler, &sessionId)) {
689bc7aae4ff7e72e5bf0fa888f946835840a4357bbChong Zhang            stream->setCasInfo(systemId, descrambler, sessionId);
6903b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        }
6913b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    }
6923b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang}
6933b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
694cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber////////////////////////////////////////////////////////////////////////////////
6953b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhangstatic const size_t kInitialStreamBufferSize = 192 * 1024;
696cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
697bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas HuberATSParser::Stream::Stream(
69887f2a558dd12043631e12c361abef301bf603140Andreas Huber        Program *program,
69987f2a558dd12043631e12c361abef301bf603140Andreas Huber        unsigned elementaryPID,
70087f2a558dd12043631e12c361abef301bf603140Andreas Huber        unsigned streamType,
7013b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        unsigned PCR_PID,
7023b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        int32_t CA_system_ID)
703bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    : mProgram(program),
704bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber      mElementaryPID(elementaryPID),
705cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber      mStreamType(streamType),
70687f2a558dd12043631e12c361abef301bf603140Andreas Huber      mPCR_PID(PCR_PID),
70787f2a558dd12043631e12c361abef301bf603140Andreas Huber      mExpectedContinuityCounter(-1),
7086a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber      mPayloadStarted(false),
709be9634d071e79b72a42a4504f64eda9e2a0bceb8Marco Nelissen      mEOSReached(false),
71090a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber      mPrevPTS(0),
7113b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang      mQueue(NULL),
7123b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang      mScrambled(CA_system_ID >= 0) {
7133b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    ALOGV("new stream PID 0x%02x, type 0x%02x, scrambled %d",
7143b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            elementaryPID, streamType, mScrambled);
7153b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
7163b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    uint32_t flags = (isVideo() && mScrambled) ?
7173b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            ElementaryStreamQueue::kFlag_ScrambledData : 0;
7183b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
7193b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    ElementaryStreamQueue::Mode mode = ElementaryStreamQueue::INVALID;
7203b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
721386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    switch (mStreamType) {
722386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        case STREAMTYPE_H264:
7233b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            mode = ElementaryStreamQueue::H264;
7243b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            flags |= (mProgram->parserFlags() & ALIGNED_VIDEO_DATA) ?
7253b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                    ElementaryStreamQueue::kFlag_AlignedData : 0;
726386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            break;
7273b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
7286e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        case STREAMTYPE_MPEG2_AUDIO_ADTS:
7293b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            mode = ElementaryStreamQueue::AAC;
730386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            break;
7313b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
732386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        case STREAMTYPE_MPEG1_AUDIO:
733386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        case STREAMTYPE_MPEG2_AUDIO:
7343b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            mode = ElementaryStreamQueue::MPEG_AUDIO;
735386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            break;
736386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
737386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        case STREAMTYPE_MPEG1_VIDEO:
738386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        case STREAMTYPE_MPEG2_VIDEO:
7393b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            mode = ElementaryStreamQueue::MPEG_VIDEO;
740386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            break;
741386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
742386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        case STREAMTYPE_MPEG4_VIDEO:
7433b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            mode = ElementaryStreamQueue::MPEG4_VIDEO;
744386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            break;
745386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
7469bf32f06e8971c1d3eb4fc5edd74b69557f97212Chong Zhang        case STREAMTYPE_LPCM_AC3:
747d3c079ae9859011d118f94616d0069c2987013edChangwan Ryu        case STREAMTYPE_AC3:
7483b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            mode = ElementaryStreamQueue::AC3;
749d3c079ae9859011d118f94616d0069c2987013edChangwan Ryu            break;
750d3c079ae9859011d118f94616d0069c2987013edChangwan Ryu
7510852843d304006e3ab333081fddda13b07193de8Robert Shih        case STREAMTYPE_METADATA:
7523b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            mode = ElementaryStreamQueue::METADATA;
7530852843d304006e3ab333081fddda13b07193de8Robert Shih            break;
7540852843d304006e3ab333081fddda13b07193de8Robert Shih
755386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        default:
7563b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            ALOGE("stream PID 0x%02x has invalid stream type 0x%02x",
7573b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                    elementaryPID, streamType);
7583b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            return;
759386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    }
760386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
7613b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    mQueue = new ElementaryStreamQueue(mode, flags);
76218ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber
76318ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber    if (mQueue != NULL) {
7643b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        ensureBufferCapacity(kInitialStreamBufferSize);
7653b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
7663b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        if (mScrambled && (isAudio() || isVideo())) {
7673b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            // Set initial format to scrambled
7683b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            sp<MetaData> meta = new MetaData();
7693b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            meta->setCString(kKeyMIMEType,
7703b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                    isAudio() ? MEDIA_MIMETYPE_AUDIO_SCRAMBLED
7713b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                              : MEDIA_MIMETYPE_VIDEO_SCRAMBLED);
772bc7aae4ff7e72e5bf0fa888f946835840a4357bbChong Zhang            // for MediaExtractor.CasInfo
773bc7aae4ff7e72e5bf0fa888f946835840a4357bbChong Zhang            meta->setInt32(kKeyCASystemID, CA_system_ID);
7743b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            mSource = new AnotherPacketSource(meta);
7753b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        }
77618ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber    }
777cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
778cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
779cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas HuberATSParser::Stream::~Stream() {
780386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    delete mQueue;
781386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    mQueue = NULL;
782cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
783cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
7843b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhangvoid ATSParser::Stream::ensureBufferCapacity(size_t neededSize) {
7853b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    if (mBuffer != NULL && mBuffer->capacity() >= neededSize) {
7863b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        return;
7873b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    }
7883b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
7893b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    ALOGV("ensureBufferCapacity: current size %zu, new size %zu, scrambled %d",
7903b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            mBuffer == NULL ? 0 : mBuffer->capacity(), neededSize, mScrambled);
7913b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
7923b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    sp<ABuffer> newBuffer, newScrambledBuffer;
7933b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    sp<IMemory> newMem;
7943b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    sp<MemoryDealer> newDealer;
7953b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    if (mScrambled) {
7963b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        size_t alignment = MemoryDealer::getAllocationAlignment();
7973b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        neededSize = (neededSize + (alignment - 1)) & ~(alignment - 1);
7983b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        // Align to multiples of 64K.
7993b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        neededSize = (neededSize + 65535) & ~65535;
8003b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        newDealer = new MemoryDealer(neededSize, "ATSParser");
8013b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        newMem = newDealer->allocate(neededSize);
8023b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        newScrambledBuffer = new ABuffer(newMem->pointer(), newMem->size());
8033b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
8043b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        if (mDescrambledBuffer != NULL) {
8053b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            memcpy(newScrambledBuffer->data(),
8063b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                    mDescrambledBuffer->data(), mDescrambledBuffer->size());
8073b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            newScrambledBuffer->setRange(0, mDescrambledBuffer->size());
8083b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        } else {
8093b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            newScrambledBuffer->setRange(0, 0);
8103b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        }
8113b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        mMem = newMem;
8123b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        mDealer = newDealer;
8133b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        mDescrambledBuffer = newScrambledBuffer;
8143b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    } else {
8153b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        // Align to multiples of 64K.
8163b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        neededSize = (neededSize + 65535) & ~65535;
8173b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    }
8183b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
8193b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    newBuffer = new ABuffer(neededSize);
8203b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    if (mBuffer != NULL) {
8213b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        memcpy(newBuffer->data(), mBuffer->data(), mBuffer->size());
8223b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        newBuffer->setRange(0, mBuffer->size());
8233b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    } else {
8243b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        newBuffer->setRange(0, 0);
8253b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    }
8263b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    mBuffer = newBuffer;
8273b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang}
8283b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
8295403129e2a2f44620f2ac8109889e5a61be08732Andreas Huberstatus_t ATSParser::Stream::parse(
83087f2a558dd12043631e12c361abef301bf603140Andreas Huber        unsigned continuity_counter,
8313b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        unsigned payload_unit_start_indicator,
8323b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        unsigned transport_scrambling_control,
8333b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        unsigned random_access_indicator,
8343b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        ABitReader *br, SyncEvent *event) {
83518ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber    if (mQueue == NULL) {
8365403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber        return OK;
83718ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber    }
83818ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber
83987f2a558dd12043631e12c361abef301bf603140Andreas Huber    if (mExpectedContinuityCounter >= 0
84087f2a558dd12043631e12c361abef301bf603140Andreas Huber            && (unsigned)mExpectedContinuityCounter != continuity_counter) {
84187f2a558dd12043631e12c361abef301bf603140Andreas Huber        ALOGI("discontinuity on stream pid 0x%04x", mElementaryPID);
84287f2a558dd12043631e12c361abef301bf603140Andreas Huber
84387f2a558dd12043631e12c361abef301bf603140Andreas Huber        mPayloadStarted = false;
8449558f6dd733dc450270f38b9a139d384d273ce0aWei Jia        mPesStartOffsets.clear();
84587f2a558dd12043631e12c361abef301bf603140Andreas Huber        mBuffer->setRange(0, 0);
8463b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        mSubSamples.clear();
84787f2a558dd12043631e12c361abef301bf603140Andreas Huber        mExpectedContinuityCounter = -1;
84887f2a558dd12043631e12c361abef301bf603140Andreas Huber
84994a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber#if 0
85094a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber        // Uncomment this if you'd rather see no corruption whatsoever on
85194a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber        // screen and suspend updates until we come across another IDR frame.
85294a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber
85394a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber        if (mStreamType == STREAMTYPE_H264) {
85494a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber            ALOGI("clearing video queue");
85594a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber            mQueue->clear(true /* clearFormat */);
85694a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber        }
85794a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber#endif
85894a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber
85966830855846db5c211c2da6c055ca9b4167e8974Chong Zhang        if (!payload_unit_start_indicator) {
86066830855846db5c211c2da6c055ca9b4167e8974Chong Zhang            return OK;
86166830855846db5c211c2da6c055ca9b4167e8974Chong Zhang        }
86287f2a558dd12043631e12c361abef301bf603140Andreas Huber    }
86387f2a558dd12043631e12c361abef301bf603140Andreas Huber
86487f2a558dd12043631e12c361abef301bf603140Andreas Huber    mExpectedContinuityCounter = (continuity_counter + 1) & 0x0f;
86587f2a558dd12043631e12c361abef301bf603140Andreas Huber
866cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    if (payload_unit_start_indicator) {
867540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim        off64_t offset = (event != NULL) ? event->getOffset() : 0;
868cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        if (mPayloadStarted) {
869cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            // Otherwise we run the danger of receiving the trailing bytes
870cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            // of a PES packet that we never saw the start of and assuming
871cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            // we have a a complete PES packet.
872cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
873540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim            status_t err = flush(event);
8745403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber
8755403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber            if (err != OK) {
87665959d34fdab8319dbf765be5fbf7ff8051eedf1Wonsik Kim                ALOGW("Error (%08x) happened while flushing; we simply discard "
87765959d34fdab8319dbf765be5fbf7ff8051eedf1Wonsik Kim                      "the PES packet and continue.", err);
8785403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber            }
879cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        }
880cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
881cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        mPayloadStarted = true;
882b08d83e972ba8cb08a6e361d5cdaf97857bcf21fWei Jia        // There should be at most 2 elements in |mPesStartOffsets|.
883b08d83e972ba8cb08a6e361d5cdaf97857bcf21fWei Jia        while (mPesStartOffsets.size() >= 2) {
884b08d83e972ba8cb08a6e361d5cdaf97857bcf21fWei Jia            mPesStartOffsets.erase(mPesStartOffsets.begin());
885b08d83e972ba8cb08a6e361d5cdaf97857bcf21fWei Jia        }
8869558f6dd733dc450270f38b9a139d384d273ce0aWei Jia        mPesStartOffsets.push_back(offset);
887cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
888cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
889cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    if (!mPayloadStarted) {
8905403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber        return OK;
891cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
892cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
893cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    size_t payloadSizeBits = br->numBitsLeft();
894e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim    if (payloadSizeBits % 8 != 0u) {
895e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        ALOGE("Wrong value");
896e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        return BAD_VALUE;
897e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim    }
898cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
8993e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber    size_t neededSize = mBuffer->size() + payloadSizeBits / 8;
9003b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    ensureBufferCapacity(neededSize);
901cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
902cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    memcpy(mBuffer->data() + mBuffer->size(), br->data(), payloadSizeBits / 8);
903cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    mBuffer->setRange(0, mBuffer->size() + payloadSizeBits / 8);
9045403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber
9053b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    if (mScrambled) {
9063b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        mSubSamples.push_back({payloadSizeBits / 8,
9073b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                 transport_scrambling_control, random_access_indicator});
9083b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    }
9093b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
9105403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber    return OK;
911cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
912cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
9136e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huberbool ATSParser::Stream::isVideo() const {
9146e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    switch (mStreamType) {
9156e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        case STREAMTYPE_H264:
9166e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        case STREAMTYPE_MPEG1_VIDEO:
9176e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        case STREAMTYPE_MPEG2_VIDEO:
9186e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        case STREAMTYPE_MPEG4_VIDEO:
9196e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber            return true;
9206e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
9216e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        default:
9226e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber            return false;
9236e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    }
9246e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber}
9256e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
9266e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huberbool ATSParser::Stream::isAudio() const {
9276e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    switch (mStreamType) {
9286e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        case STREAMTYPE_MPEG1_AUDIO:
9296e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        case STREAMTYPE_MPEG2_AUDIO:
9306e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        case STREAMTYPE_MPEG2_AUDIO_ADTS:
9319bf32f06e8971c1d3eb4fc5edd74b69557f97212Chong Zhang        case STREAMTYPE_LPCM_AC3:
932d3c079ae9859011d118f94616d0069c2987013edChangwan Ryu        case STREAMTYPE_AC3:
9336e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber            return true;
9346e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
9356e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        default:
9366e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber            return false;
9376e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    }
9386e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber}
9396e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
9400852843d304006e3ab333081fddda13b07193de8Robert Shihbool ATSParser::Stream::isMeta() const {
9410852843d304006e3ab333081fddda13b07193de8Robert Shih    if (mStreamType == STREAMTYPE_METADATA) {
9420852843d304006e3ab333081fddda13b07193de8Robert Shih        return true;
9430852843d304006e3ab333081fddda13b07193de8Robert Shih    }
9440852843d304006e3ab333081fddda13b07193de8Robert Shih    return false;
9450852843d304006e3ab333081fddda13b07193de8Robert Shih}
9460852843d304006e3ab333081fddda13b07193de8Robert Shih
94732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Hubervoid ATSParser::Stream::signalDiscontinuity(
94832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        DiscontinuityType type, const sp<AMessage> &extra) {
9490389cc09f7b90f155a8942a0d2e1925cad1dbe2dMarco Nelissen    mExpectedContinuityCounter = -1;
9500389cc09f7b90f155a8942a0d2e1925cad1dbe2dMarco Nelissen
95118ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber    if (mQueue == NULL) {
95218ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber        return;
95318ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber    }
95418ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber
9552a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    mPayloadStarted = false;
9569558f6dd733dc450270f38b9a139d384d273ce0aWei Jia    mPesStartOffsets.clear();
957aabbdc7401ae24a4199f12a283985deb648673c0Robert Shih    mEOSReached = false;
9582a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    mBuffer->setRange(0, 0);
9593b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    mSubSamples.clear();
9602a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber
9616e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    bool clearFormat = false;
9626e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    if (isAudio()) {
9636e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        if (type & DISCONTINUITY_AUDIO_FORMAT) {
9646e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber            clearFormat = true;
9656e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        }
9666e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    } else {
9676e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        if (type & DISCONTINUITY_VIDEO_FORMAT) {
9686e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber            clearFormat = true;
9696e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        }
9706e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    }
971f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
9726e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    mQueue->clear(clearFormat);
97332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
9746e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    if (type & DISCONTINUITY_TIME) {
9756e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        uint64_t resumeAtPTS;
9766e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        if (extra != NULL
9776e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                && extra->findInt64(
9786e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    IStreamListener::kKeyResumeAtPTS,
9796e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    (int64_t *)&resumeAtPTS)) {
9806e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber            int64_t resumeAtMediaTimeUs =
9816e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                mProgram->convertPTSToTimestamp(resumeAtPTS);
98232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
983c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia            extra->setInt64("resume-at-mediaTimeUs", resumeAtMediaTimeUs);
984e332a9181cf6a3155ed1a0fd2afc212ccb1f2753Andreas Huber        }
9856e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    }
986f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
9876e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    if (mSource != NULL) {
9883b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        sp<MetaData> meta = mSource->getFormat();
9893b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        const char* mime;
9903b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        if (clearFormat && meta != NULL && meta->findCString(kKeyMIMEType, &mime)
9913b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                && (!strncasecmp(mime, MEDIA_MIMETYPE_AUDIO_SCRAMBLED, 15)
9923b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                 || !strncasecmp(mime, MEDIA_MIMETYPE_VIDEO_SCRAMBLED, 15))){
9933b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            mSource->clear();
9943b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        } else {
9953b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            mSource->queueDiscontinuity(type, extra, true);
9963b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        }
997bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    }
998f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
999bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber
1000f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ATSParser::Stream::signalEOS(status_t finalResult) {
1001f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (mSource != NULL) {
1002f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        mSource->signalEOS(finalResult);
10032a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    }
1004be9634d071e79b72a42a4504f64eda9e2a0bceb8Marco Nelissen    mEOSReached = true;
1005540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    flush(NULL);
10062a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber}
10072a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber
1008540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kimstatus_t ATSParser::Stream::parsePES(ABitReader *br, SyncEvent *event) {
10093b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    const uint8_t *basePtr = br->data();
10103b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
1011cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned packet_startcode_prefix = br->getBits(24);
1012cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
10133856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("packet_startcode_prefix = 0x%08x", packet_startcode_prefix);
1014cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1015386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    if (packet_startcode_prefix != 1) {
10163856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("Supposedly payload_unit_start=1 unit does not start "
1017386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber             "with startcode.");
10185403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber
10195403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber        return ERROR_MALFORMED;
1020386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    }
1021386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
1022cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned stream_id = br->getBits(8);
10233856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("stream_id = 0x%02x", stream_id);
1024cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1025cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned PES_packet_length = br->getBits(16);
10263856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("PES_packet_length = %u", PES_packet_length);
1027cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1028cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    if (stream_id != 0xbc  // program_stream_map
1029cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            && stream_id != 0xbe  // padding_stream
1030cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            && stream_id != 0xbf  // private_stream_2
1031cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            && stream_id != 0xf0  // ECM
1032cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            && stream_id != 0xf1  // EMM
1033cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            && stream_id != 0xff  // program_stream_directory
1034cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            && stream_id != 0xf2  // DSMCC
1035cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            && stream_id != 0xf8) {  // H.222.1 type E
1036e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        if (br->getBits(2) != 2u) {
1037e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            return ERROR_MALFORMED;
1038e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        }
1039cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
10403b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        unsigned PES_scrambling_control = br->getBits(2);
10413b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        ALOGV("PES_scrambling_control = %u", PES_scrambling_control);
10423b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
10436e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber        MY_LOGV("PES_priority = %u", br->getBits(1));
10446e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber        MY_LOGV("data_alignment_indicator = %u", br->getBits(1));
10456e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber        MY_LOGV("copyright = %u", br->getBits(1));
10466e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber        MY_LOGV("original_or_copy = %u", br->getBits(1));
1047cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1048cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned PTS_DTS_flags = br->getBits(2);
10493856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("PTS_DTS_flags = %u", PTS_DTS_flags);
1050cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1051cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned ESCR_flag = br->getBits(1);
10523856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("ESCR_flag = %u", ESCR_flag);
1053cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1054cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned ES_rate_flag = br->getBits(1);
10553856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("ES_rate_flag = %u", ES_rate_flag);
1056cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1057cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned DSM_trick_mode_flag = br->getBits(1);
10583856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("DSM_trick_mode_flag = %u", DSM_trick_mode_flag);
1059cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1060cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned additional_copy_info_flag = br->getBits(1);
10613856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("additional_copy_info_flag = %u", additional_copy_info_flag);
1062cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
10636e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber        MY_LOGV("PES_CRC_flag = %u", br->getBits(1));
10646e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber        MY_LOGV("PES_extension_flag = %u", br->getBits(1));
1065cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1066cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned PES_header_data_length = br->getBits(8);
10673856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("PES_header_data_length = %u", PES_header_data_length);
1068cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1069cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned optional_bytes_remaining = PES_header_data_length;
1070cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1071cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        uint64_t PTS = 0, DTS = 0;
1072cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1073cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        if (PTS_DTS_flags == 2 || PTS_DTS_flags == 3) {
1074e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            if (optional_bytes_remaining < 5u) {
1075e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                return ERROR_MALFORMED;
1076e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            }
1077cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
10786456ae745e919085c5024f784aaa2703f9695f98David Yeh            if (br->getBits(4) != PTS_DTS_flags) {
10796456ae745e919085c5024f784aaa2703f9695f98David Yeh                return ERROR_MALFORMED;
10806456ae745e919085c5024f784aaa2703f9695f98David Yeh            }
1081cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            PTS = ((uint64_t)br->getBits(3)) << 30;
1082e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            if (br->getBits(1) != 1u) {
1083e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                return ERROR_MALFORMED;
1084e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            }
1085cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            PTS |= ((uint64_t)br->getBits(15)) << 15;
1086e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            if (br->getBits(1) != 1u) {
1087e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                return ERROR_MALFORMED;
1088e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            }
1089cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            PTS |= br->getBits(15);
1090e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            if (br->getBits(1) != 1u) {
1091e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                return ERROR_MALFORMED;
1092e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            }
1093cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1094b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross            ALOGV("PTS = 0x%016" PRIx64 " (%.2f)", PTS, PTS / 90000.0);
1095cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1096cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            optional_bytes_remaining -= 5;
1097cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1098cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            if (PTS_DTS_flags == 3) {
1099e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                if (optional_bytes_remaining < 5u) {
1100e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                    return ERROR_MALFORMED;
1101e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                }
1102cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1103e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                if (br->getBits(4) != 1u) {
1104e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                    return ERROR_MALFORMED;
1105e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                }
1106cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1107cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber                DTS = ((uint64_t)br->getBits(3)) << 30;
1108e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                if (br->getBits(1) != 1u) {
1109e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                    return ERROR_MALFORMED;
1110e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                }
1111cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber                DTS |= ((uint64_t)br->getBits(15)) << 15;
1112e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                if (br->getBits(1) != 1u) {
1113e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                    return ERROR_MALFORMED;
1114e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                }
1115cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber                DTS |= br->getBits(15);
1116e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                if (br->getBits(1) != 1u) {
1117e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                    return ERROR_MALFORMED;
1118e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                }
1119cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1120b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross                ALOGV("DTS = %" PRIu64, DTS);
1121cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1122cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber                optional_bytes_remaining -= 5;
1123cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            }
1124cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        }
1125cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1126cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        if (ESCR_flag) {
1127e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            if (optional_bytes_remaining < 6u) {
1128e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                return ERROR_MALFORMED;
1129e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            }
1130cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1131cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            br->getBits(2);
1132cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1133cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            uint64_t ESCR = ((uint64_t)br->getBits(3)) << 30;
1134e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            if (br->getBits(1) != 1u) {
1135e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                return ERROR_MALFORMED;
1136e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            }
1137cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            ESCR |= ((uint64_t)br->getBits(15)) << 15;
1138e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            if (br->getBits(1) != 1u) {
1139e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                return ERROR_MALFORMED;
1140e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            }
1141cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            ESCR |= br->getBits(15);
1142e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            if (br->getBits(1) != 1u) {
1143e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                return ERROR_MALFORMED;
1144e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            }
1145cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1146b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross            ALOGV("ESCR = %" PRIu64, ESCR);
11476e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber            MY_LOGV("ESCR_extension = %u", br->getBits(9));
1148cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1149e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            if (br->getBits(1) != 1u) {
1150e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                return ERROR_MALFORMED;
1151e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            }
1152cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1153cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            optional_bytes_remaining -= 6;
1154cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        }
1155cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1156cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        if (ES_rate_flag) {
1157e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            if (optional_bytes_remaining < 3u) {
1158e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                return ERROR_MALFORMED;
1159e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            }
1160cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1161e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            if (br->getBits(1) != 1u) {
1162e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                return ERROR_MALFORMED;
1163e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            }
11646e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber            MY_LOGV("ES_rate = %u", br->getBits(22));
1165e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            if (br->getBits(1) != 1u) {
1166e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                return ERROR_MALFORMED;
1167e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            }
1168cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1169cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            optional_bytes_remaining -= 3;
1170cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        }
1171cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1172cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        br->skipBits(optional_bytes_remaining * 8);
1173cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1174cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        // ES data follows.
11753b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        int32_t pesOffset = br->data() - basePtr;
1176cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1177cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        if (PES_packet_length != 0) {
1178e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            if (PES_packet_length < PES_header_data_length + 3) {
1179e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                return ERROR_MALFORMED;
1180e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            }
1181cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1182cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            unsigned dataLength =
1183cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber                PES_packet_length - 3 - PES_header_data_length;
1184cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
11855403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber            if (br->numBitsLeft() < dataLength * 8) {
118629357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block                ALOGE("PES packet does not carry enough data to contain "
1187b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross                     "payload. (numBitsLeft = %zu, required = %u)",
11885403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber                     br->numBitsLeft(), dataLength * 8);
11895403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber
11905403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber                return ERROR_MALFORMED;
11915403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber            }
11925403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber
11933b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            ALOGV("There's %u bytes of payload, PES_packet_length=%u, offset=%d",
11943b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                    dataLength, PES_packet_length, pesOffset);
11953b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
11960da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber            onPayloadData(
11973b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                    PTS_DTS_flags, PTS, DTS, PES_scrambling_control,
11983b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                    br->data(), dataLength, pesOffset, event);
1199cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1200cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            br->skipBits(dataLength * 8);
1201cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        } else {
12020da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber            onPayloadData(
12033b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                    PTS_DTS_flags, PTS, DTS, PES_scrambling_control,
12043b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                    br->data(), br->numBitsLeft() / 8, pesOffset, event);
12050da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber
1206cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            size_t payloadSizeBits = br->numBitsLeft();
1207e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            if (payloadSizeBits % 8 != 0u) {
1208e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                return ERROR_MALFORMED;
1209e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            }
1210cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
12113b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            ALOGV("There's %zu bytes of payload, offset=%d",
12123b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                    payloadSizeBits / 8, pesOffset);
1213cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        }
1214cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    } else if (stream_id == 0xbe) {  // padding_stream
1215e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        if (PES_packet_length == 0u) {
1216e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            return ERROR_MALFORMED;
1217e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        }
1218cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        br->skipBits(PES_packet_length * 8);
1219cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    } else {
1220e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        if (PES_packet_length == 0u) {
1221e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            return ERROR_MALFORMED;
1222e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        }
1223cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        br->skipBits(PES_packet_length * 8);
1224cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
12255403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber
12265403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber    return OK;
1227cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
1228cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
12293b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhanguint32_t ATSParser::Stream::getPesScramblingControl(
12303b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        ABitReader *br, int32_t *pesOffset) {
12313b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    unsigned packet_startcode_prefix = br->getBits(24);
12323b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
12333b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    ALOGV("packet_startcode_prefix = 0x%08x", packet_startcode_prefix);
12343b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
12353b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    if (packet_startcode_prefix != 1) {
12363b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        ALOGV("unit does not start with startcode.");
12373b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        return 0;
12383b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    }
12393b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
12403b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    if (br->numBitsLeft() < 48) {
12413b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        return 0;
12423b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    }
12433b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
12443b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    unsigned stream_id = br->getBits(8);
12453b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    ALOGV("stream_id = 0x%02x", stream_id);
12463b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
12473b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    br->skipBits(16); // PES_packet_length
12483b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
12493b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    if (stream_id != 0xbc  // program_stream_map
12503b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            && stream_id != 0xbe  // padding_stream
12513b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            && stream_id != 0xbf  // private_stream_2
12523b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            && stream_id != 0xf0  // ECM
12533b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            && stream_id != 0xf1  // EMM
12543b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            && stream_id != 0xff  // program_stream_directory
12553b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            && stream_id != 0xf2  // DSMCC
12563b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            && stream_id != 0xf8) {  // H.222.1 type E
12573b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        if (br->getBits(2) != 2u) {
12583b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            return 0;
12593b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        }
12603b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
12613b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        unsigned PES_scrambling_control = br->getBits(2);
12623b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        ALOGV("PES_scrambling_control = %u", PES_scrambling_control);
12633b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
12643b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        if (PES_scrambling_control == 0) {
12653b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            return 0;
12663b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        }
12673b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
12683b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        br->skipBits(12); // don't care
12693b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
12703b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        unsigned PES_header_data_length = br->getBits(8);
12713b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        ALOGV("PES_header_data_length = %u", PES_header_data_length);
12723b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
12733b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        if (PES_header_data_length * 8 > br->numBitsLeft()) {
12743b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            return 0;
12753b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        }
12763b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
12773b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        *pesOffset = 9 + PES_header_data_length;
12783b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        ALOGD("found PES_scrambling_control=%d, PES offset=%d",
12793b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                PES_scrambling_control, *pesOffset);
12803b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        return PES_scrambling_control;
12813b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    }
12823b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
12833b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    return 0;
12843b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang}
12853b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
12863b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhangstatus_t ATSParser::Stream::flushScrambled(SyncEvent *event) {
12873b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    if (mDescrambler == NULL) {
12883b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        ALOGE("received scrambled packets without descrambler!");
12893b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        return UNKNOWN_ERROR;
12903b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    }
12913b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
12923b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    if (mDescrambledBuffer == NULL || mMem == NULL) {
12933b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        ALOGE("received scrambled packets without shared memory!");
12943b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
12953b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        return UNKNOWN_ERROR;
12963b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    }
12973b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
12983b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    int32_t pesOffset = 0;
12993b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    int32_t descrambleSubSamples = 0, descrambleBytes = 0;
13003b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    uint32_t tsScramblingControl = 0, pesScramblingControl = 0;
13013b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
13023b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    // First, go over subsamples to find TS-level scrambling key id, and
13033b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    // calculate how many subsample we need to descramble (assuming we don't
13043b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    // have PES-level scrambling).
13053b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    for (auto it = mSubSamples.begin(); it != mSubSamples.end(); it++) {
13063b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        if (it->transport_scrambling_mode != 0) {
13073b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            // TODO: handle keyId change, use the first non-zero keyId for now.
13083b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            if (tsScramblingControl == 0) {
13093b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                tsScramblingControl = it->transport_scrambling_mode;
13103b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            }
13113b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        }
13123b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        if (tsScramblingControl == 0 || descrambleSubSamples == 0
13133b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                || !mQueue->isScrambled()) {
13143b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            descrambleSubSamples++;
13153b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            descrambleBytes += it->subSampleSize;
13163b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        }
13173b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    }
13183b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    // If not scrambled at TS-level, check PES-level scrambling
13193b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    if (tsScramblingControl == 0) {
13203b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        ABitReader br(mBuffer->data(), mBuffer->size());
13213b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        pesScramblingControl = getPesScramblingControl(&br, &pesOffset);
13223b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        // If not scrambled at PES-level either, or scrambled at PES-level but
13233b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        // requires output to remain scrambled, we don't need to descramble
13243b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        // anything.
13253b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        if (pesScramblingControl == 0 || mQueue->isScrambled()) {
13263b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            descrambleSubSamples = 0;
13273b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            descrambleBytes = 0;
13283b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        }
13293b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    }
13303b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
13313b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    uint32_t sctrl = tsScramblingControl != 0 ?
13323b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            tsScramblingControl : pesScramblingControl;
13333b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
13343b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    // Perform the 1st pass descrambling if needed
13353b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    if (descrambleBytes > 0) {
13363b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        memcpy(mDescrambledBuffer->data(), mBuffer->data(), descrambleBytes);
13373b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        mDescrambledBuffer->setRange(0, descrambleBytes);
13383b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
13393b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        sp<ABuffer> subSamples = new ABuffer(
13403b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                sizeof(DescramblerPlugin::SubSample) * descrambleSubSamples);
13413b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
13423b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        DescrambleInfo info;
13433b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        info.dstType = DescrambleInfo::kDestinationTypeVmPointer;
13443b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        info.scramblingControl = (DescramblerPlugin::ScramblingControl)sctrl;
13453b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        info.numSubSamples = descrambleSubSamples;
13463b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        info.subSamples = (DescramblerPlugin::SubSample *)subSamples->data();
13473b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        info.srcMem = mMem;
13483b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        info.srcOffset = 0;
13493b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        info.dstPtr = NULL; // in-place descrambling into srcMem
13503b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        info.dstOffset = 0;
13513b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
13523b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        int32_t i = 0;
13533b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        for (auto it = mSubSamples.begin();
13543b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                it != mSubSamples.end() && i < descrambleSubSamples; it++, i++) {
13553b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            if (it->transport_scrambling_mode != 0 || pesScramblingControl != 0) {
13563b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                info.subSamples[i].mNumBytesOfClearData = 0;
13573b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                info.subSamples[i].mNumBytesOfEncryptedData = it->subSampleSize;
13583b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            } else {
13593b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                info.subSamples[i].mNumBytesOfClearData = it->subSampleSize;
13603b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                info.subSamples[i].mNumBytesOfEncryptedData = 0;
13613b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            }
13623b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        }
13633b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        // If scrambled at PES-level, PES header should be skipped
13643b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        if (pesScramblingControl != 0) {
13653b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            info.srcOffset = info.dstOffset = pesOffset;
13663b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            info.subSamples[0].mNumBytesOfEncryptedData -= pesOffset;
13673b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        }
13683b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
13693b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        int32_t result;
13703b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        Status status = mDescrambler->descramble(info, &result);
13713b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
13723b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        if (!status.isOk()) {
13733b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            ALOGE("[stream %d] descramble failed, exceptionCode=%d",
13743b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                    mElementaryPID, status.exceptionCode());
13753b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            return UNKNOWN_ERROR;
13763b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        }
13773b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
13783b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        ALOGV("[stream %d] descramble succeeded, %d bytes",
13793b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                mElementaryPID, result);
13803b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        memcpy(mBuffer->data(), mDescrambledBuffer->data(), descrambleBytes);
13813b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    }
13823b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
13833b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    if (mQueue->isScrambled()) {
13843b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        // Queue subSample info for scrambled queue
13853b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        sp<ABuffer> clearSizesBuffer = new ABuffer(mSubSamples.size() * 4);
13863b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        sp<ABuffer> encSizesBuffer = new ABuffer(mSubSamples.size() * 4);
13873b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        int32_t *clearSizePtr = (int32_t*)clearSizesBuffer->data();
13883b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        int32_t *encSizePtr = (int32_t*)encSizesBuffer->data();
13893b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        int32_t isSync = 0;
13903b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        int32_t i = 0;
13913b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        for (auto it = mSubSamples.begin();
13923b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                it != mSubSamples.end(); it++, i++) {
13933b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            if ((it->transport_scrambling_mode == 0
13943b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                    && pesScramblingControl == 0)
13953b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                    || i < descrambleSubSamples) {
13963b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                clearSizePtr[i] = it->subSampleSize;
13973b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                encSizePtr[i] = 0;
13983b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            } else {
13993b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                clearSizePtr[i] = 0;
14003b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                encSizePtr[i] = it->subSampleSize;
14013b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            }
14023b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            isSync |= it->random_access_indicator;
14033b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        }
14043b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        // Pass the original TS subsample size now. The PES header adjust
14053b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        // will be applied when the scrambled AU is dequeued.
14063b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        mQueue->appendScrambledData(
14073b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                mBuffer->data(), mBuffer->size(), sctrl,
14083b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                isSync, clearSizesBuffer, encSizesBuffer);
14093b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    }
14103b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
14113b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    ABitReader br(mBuffer->data(), mBuffer->size());
14123b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    status_t err = parsePES(&br, event);
14133b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
14143b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    if (err != OK) {
14153b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        ALOGE("[stream %d] failed to parse descrambled PES, err=%d",
14163b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                mElementaryPID, err);
14173b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    }
14183b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
14193b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    return err;
14203b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang}
14213b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
14223b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
1423540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kimstatus_t ATSParser::Stream::flush(SyncEvent *event) {
1424f2cecd570c35d3b6422396dd51c0b4202732bceaJaesung Chung    if (mBuffer == NULL || mBuffer->size() == 0) {
14255403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber        return OK;
1426cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
1427cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1428b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross    ALOGV("flushing stream 0x%04x size = %zu", mElementaryPID, mBuffer->size());
1429cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
14303b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    status_t err = OK;
14313b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    if (mScrambled) {
14323b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        err = flushScrambled(event);
14333b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        mSubSamples.clear();
14343b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    } else {
14353b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        ABitReader br(mBuffer->data(), mBuffer->size());
14363b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        err = parsePES(&br, event);
14373b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    }
1438cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1439cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    mBuffer->setRange(0, 0);
14405403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber
14415403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber    return err;
1442cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
1443cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1444cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubervoid ATSParser::Stream::onPayloadData(
144584333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber        unsigned PTS_DTS_flags, uint64_t PTS, uint64_t /* DTS */,
14463b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        unsigned PES_scrambling_control,
14473b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        const uint8_t *data, size_t size,
14483b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        int32_t payloadOffset, SyncEvent *event) {
144990a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber#if 0
145090a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber    ALOGI("payload streamType 0x%02x, PTS = 0x%016llx, dPTS = %lld",
145190a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber          mStreamType,
145290a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber          PTS,
145390a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber          (int64_t)PTS - mPrevPTS);
145490a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber    mPrevPTS = PTS;
145590a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber#endif
145690a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber
14573856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("onPayloadData mStreamType=0x%02x", mStreamType);
1458cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
145998a46cf165d8de3779874eba01803bbc485f45b9Andreas Huber    int64_t timeUs = 0ll;  // no presentation timestamp available.
146098a46cf165d8de3779874eba01803bbc485f45b9Andreas Huber    if (PTS_DTS_flags == 2 || PTS_DTS_flags == 3) {
146198a46cf165d8de3779874eba01803bbc485f45b9Andreas Huber        timeUs = mProgram->convertPTSToTimestamp(PTS);
146298a46cf165d8de3779874eba01803bbc485f45b9Andreas Huber    }
146382f7321b03eec1e40af9d681370f754ee0279582Andreas Huber
14643b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    status_t err = mQueue->appendData(
14653b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            data, size, timeUs, payloadOffset, PES_scrambling_control);
1466decd96988e495133e4a1728f612d4c9fdb4d218eAndreas Huber
1467be9634d071e79b72a42a4504f64eda9e2a0bceb8Marco Nelissen    if (mEOSReached) {
1468be9634d071e79b72a42a4504f64eda9e2a0bceb8Marco Nelissen        mQueue->signalEOS();
1469be9634d071e79b72a42a4504f64eda9e2a0bceb8Marco Nelissen    }
1470be9634d071e79b72a42a4504f64eda9e2a0bceb8Marco Nelissen
1471decd96988e495133e4a1728f612d4c9fdb4d218eAndreas Huber    if (err != OK) {
1472decd96988e495133e4a1728f612d4c9fdb4d218eAndreas Huber        return;
1473decd96988e495133e4a1728f612d4c9fdb4d218eAndreas Huber    }
147482f7321b03eec1e40af9d681370f754ee0279582Andreas Huber
14756a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber    sp<ABuffer> accessUnit;
1476540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    bool found = false;
1477386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    while ((accessUnit = mQueue->dequeueAccessUnit()) != NULL) {
14786a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber        if (mSource == NULL) {
1479386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            sp<MetaData> meta = mQueue->getFormat();
148082f7321b03eec1e40af9d681370f754ee0279582Andreas Huber
14816a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber            if (meta != NULL) {
14823856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                ALOGV("Stream PID 0x%08x of type 0x%02x now has data.",
1483386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                     mElementaryPID, mStreamType);
1484386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
1485309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih                const char *mime;
1486309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih                if (meta->findCString(kKeyMIMEType, &mime)
14873b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                        && !strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_AVC)) {
14883b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                    int32_t sync = 0;
14893b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                    if (!accessUnit->meta()->findInt32("isSync", &sync) || !sync) {
14903b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                        continue;
14913b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                    }
1492309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih                }
14936a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber                mSource = new AnotherPacketSource(meta);
14946a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber                mSource->queueAccessUnit(accessUnit);
149582f7321b03eec1e40af9d681370f754ee0279582Andreas Huber            }
1496386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        } else if (mQueue->getFormat() != NULL) {
14972a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber            // After a discontinuity we invalidate the queue's format
14982a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber            // and won't enqueue any access units to the source until
14992a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber            // the queue has reestablished the new format.
15005bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
15015bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            if (mSource->getFormat() == NULL) {
1502386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                mSource->setFormat(mQueue->getFormat());
15035bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            }
15046a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber            mSource->queueAccessUnit(accessUnit);
150582f7321b03eec1e40af9d681370f754ee0279582Andreas Huber        }
1506540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim
1507b08d83e972ba8cb08a6e361d5cdaf97857bcf21fWei Jia        // Every access unit has a pesStartOffset queued in |mPesStartOffsets|.
1508b08d83e972ba8cb08a6e361d5cdaf97857bcf21fWei Jia        off64_t pesStartOffset = -1;
1509b08d83e972ba8cb08a6e361d5cdaf97857bcf21fWei Jia        if (!mPesStartOffsets.empty()) {
1510b08d83e972ba8cb08a6e361d5cdaf97857bcf21fWei Jia            pesStartOffset = *mPesStartOffsets.begin();
1511b08d83e972ba8cb08a6e361d5cdaf97857bcf21fWei Jia            mPesStartOffsets.erase(mPesStartOffsets.begin());
1512b08d83e972ba8cb08a6e361d5cdaf97857bcf21fWei Jia        }
1513b08d83e972ba8cb08a6e361d5cdaf97857bcf21fWei Jia
1514b08d83e972ba8cb08a6e361d5cdaf97857bcf21fWei Jia        if (pesStartOffset >= 0 && (event != NULL) && !found && mQueue->getFormat() != NULL) {
1515540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim            int32_t sync = 0;
1516540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim            if (accessUnit->meta()->findInt32("isSync", &sync) && sync) {
1517540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim                int64_t timeUs;
1518540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim                if (accessUnit->meta()->findInt64("timeUs", &timeUs)) {
1519540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim                    found = true;
152082e147049625a4cfdcb228a1de7efda594d446c9Robert Shih                    event->init(pesStartOffset, mSource, timeUs, getSourceType());
1521540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim                }
1522540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim            }
1523540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim        }
152482f7321b03eec1e40af9d681370f754ee0279582Andreas Huber    }
152582f7321b03eec1e40af9d681370f754ee0279582Andreas Huber}
152682f7321b03eec1e40af9d681370f754ee0279582Andreas Huber
152782e147049625a4cfdcb228a1de7efda594d446c9Robert ShihATSParser::SourceType ATSParser::Stream::getSourceType() {
152882e147049625a4cfdcb228a1de7efda594d446c9Robert Shih    if (isVideo()) {
152982e147049625a4cfdcb228a1de7efda594d446c9Robert Shih        return VIDEO;
153082e147049625a4cfdcb228a1de7efda594d446c9Robert Shih    } else if (isAudio()) {
153182e147049625a4cfdcb228a1de7efda594d446c9Robert Shih        return AUDIO;
153282e147049625a4cfdcb228a1de7efda594d446c9Robert Shih    } else if (isMeta()) {
153382e147049625a4cfdcb228a1de7efda594d446c9Robert Shih        return META;
153482e147049625a4cfdcb228a1de7efda594d446c9Robert Shih    }
153582e147049625a4cfdcb228a1de7efda594d446c9Robert Shih    return NUM_SOURCE_TYPES;
153682e147049625a4cfdcb228a1de7efda594d446c9Robert Shih}
153782e147049625a4cfdcb228a1de7efda594d446c9Robert Shih
1538cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubersp<MediaSource> ATSParser::Stream::getSource(SourceType type) {
1539386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    switch (type) {
1540386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        case VIDEO:
1541386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        {
15426e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber            if (isVideo()) {
1543386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                return mSource;
1544386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            }
1545386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            break;
1546386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        }
1547386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
1548386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        case AUDIO:
1549386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        {
15506e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber            if (isAudio()) {
1551386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                return mSource;
1552386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            }
1553386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            break;
1554386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        }
1555386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
15560852843d304006e3ab333081fddda13b07193de8Robert Shih        case META:
15570852843d304006e3ab333081fddda13b07193de8Robert Shih        {
15580852843d304006e3ab333081fddda13b07193de8Robert Shih            if (isMeta()) {
15590852843d304006e3ab333081fddda13b07193de8Robert Shih                return mSource;
15600852843d304006e3ab333081fddda13b07193de8Robert Shih            }
15610852843d304006e3ab333081fddda13b07193de8Robert Shih            break;
15620852843d304006e3ab333081fddda13b07193de8Robert Shih        }
15630852843d304006e3ab333081fddda13b07193de8Robert Shih
1564386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        default:
1565386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            break;
1566cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
1567cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1568cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    return NULL;
1569cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
1570cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1571bc7aae4ff7e72e5bf0fa888f946835840a4357bbChong Zhangvoid ATSParser::Stream::setCasInfo(
1572bc7aae4ff7e72e5bf0fa888f946835840a4357bbChong Zhang        int32_t systemId, const sp<IDescrambler> &descrambler,
15733b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        const std::vector<uint8_t> &sessionId) {
15743b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    if (mSource != NULL && mDescrambler == NULL && descrambler != NULL) {
15753b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        signalDiscontinuity(DISCONTINUITY_FORMAT_ONLY, NULL);
15763b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        mDescrambler = descrambler;
15773b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        if (mQueue->isScrambled()) {
1578bc7aae4ff7e72e5bf0fa888f946835840a4357bbChong Zhang            mQueue->setCasInfo(systemId, sessionId);
15793b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        }
15803b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    }
15813b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang}
15823b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
1583cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber////////////////////////////////////////////////////////////////////////////////
1584cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1585c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas HuberATSParser::ATSParser(uint32_t flags)
158687f2a558dd12043631e12c361abef301bf603140Andreas Huber    : mFlags(flags),
158787f2a558dd12043631e12c361abef301bf603140Andreas Huber      mAbsoluteTimeAnchorUs(-1ll),
1588d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber      mTimeOffsetValid(false),
1589d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber      mTimeOffsetUs(0ll),
1590d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang      mLastRecoveredPTS(-1ll),
159187f2a558dd12043631e12c361abef301bf603140Andreas Huber      mNumTSPacketsParsed(0),
159287f2a558dd12043631e12c361abef301bf603140Andreas Huber      mNumPCRs(0) {
15938dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    mPSISections.add(0 /* PID */, new PSISection);
15943b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    mCasManager = new CasManager();
1595cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
1596cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1597cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas HuberATSParser::~ATSParser() {
1598cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
1599cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1600540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kimstatus_t ATSParser::feedTSPacket(const void *data, size_t size,
1601540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim        SyncEvent *event) {
1602e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim    if (size != kTSPacketSize) {
1603e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        ALOGE("Wrong TS packet size");
1604e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        return BAD_VALUE;
1605e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim    }
1606cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1607cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    ABitReader br((const uint8_t *)data, kTSPacketSize);
1608540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    return parseTS(&br, event);
1609cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
1610cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
16113b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhangstatus_t ATSParser::setMediaCas(const sp<ICas> &cas) {
16123b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    status_t err = mCasManager->setMediaCas(cas);
16133b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    if (err != OK) {
16143b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        return err;
16153b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    }
16163b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    for (size_t i = 0; i < mPrograms.size(); ++i) {
16173b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        mPrograms.editItemAt(i)->updateCasSessions();
16183b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    }
16193b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    return OK;
16203b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang}
16213b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
162232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Hubervoid ATSParser::signalDiscontinuity(
162332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        DiscontinuityType type, const sp<AMessage> &extra) {
1624b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber    int64_t mediaTimeUs;
1625d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang    if ((type & DISCONTINUITY_TIME) && extra != NULL) {
1626d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang        if (extra->findInt64(IStreamListener::kKeyMediaTimeUs, &mediaTimeUs)) {
1627d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang            mAbsoluteTimeAnchorUs = mediaTimeUs;
1628d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang        }
1629d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang        if ((mFlags & TS_TIMESTAMPS_ARE_ABSOLUTE)
1630d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang                && extra->findInt64(
1631d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang                    IStreamListener::kKeyRecentMediaTimeUs, &mediaTimeUs)) {
1632d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang            if (mAbsoluteTimeAnchorUs >= 0ll) {
1633d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang                mediaTimeUs -= mAbsoluteTimeAnchorUs;
1634d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang            }
1635d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang            if (mTimeOffsetValid) {
1636d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang                mediaTimeUs -= mTimeOffsetUs;
1637d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang            }
1638d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang            mLastRecoveredPTS = (mediaTimeUs * 9) / 100;
1639d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang        }
1640b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber    } else if (type == DISCONTINUITY_ABSOLUTE_TIME) {
164187f2a558dd12043631e12c361abef301bf603140Andreas Huber        int64_t timeUs;
1642e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        if (!extra->findInt64("timeUs", &timeUs)) {
1643e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            ALOGE("timeUs not found");
1644e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            return;
1645e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        }
164687f2a558dd12043631e12c361abef301bf603140Andreas Huber
1647e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        if (!mPrograms.empty()) {
1648e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            ALOGE("mPrograms is not empty");
1649e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            return;
1650e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        }
165187f2a558dd12043631e12c361abef301bf603140Andreas Huber        mAbsoluteTimeAnchorUs = timeUs;
165287f2a558dd12043631e12c361abef301bf603140Andreas Huber        return;
1653d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber    } else if (type == DISCONTINUITY_TIME_OFFSET) {
1654d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber        int64_t offset;
1655e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        if (!extra->findInt64("offset", &offset)) {
1656e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            ALOGE("offset not found");
1657e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            return;
1658e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        }
1659d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber
1660d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber        mTimeOffsetValid = true;
1661d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber        mTimeOffsetUs = offset;
1662d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber        return;
166387f2a558dd12043631e12c361abef301bf603140Andreas Huber    }
166487f2a558dd12043631e12c361abef301bf603140Andreas Huber
1665f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    for (size_t i = 0; i < mPrograms.size(); ++i) {
166632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        mPrograms.editItemAt(i)->signalDiscontinuity(type, extra);
1667f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
1668f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
1669f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1670f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ATSParser::signalEOS(status_t finalResult) {
1671e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim    if (finalResult == (status_t) OK) {
1672e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        ALOGE("finalResult not OK");
1673e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        return;
1674e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim    }
1675f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
16762a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    for (size_t i = 0; i < mPrograms.size(); ++i) {
1677f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        mPrograms.editItemAt(i)->signalEOS(finalResult);
16782a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    }
16792a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber}
16802a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber
1681cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubervoid ATSParser::parseProgramAssociationTable(ABitReader *br) {
1682cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned table_id = br->getBits(8);
16833856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("  table_id = %u", table_id);
16846456ae745e919085c5024f784aaa2703f9695f98David Yeh    if (table_id != 0x00u) {
16856456ae745e919085c5024f784aaa2703f9695f98David Yeh        ALOGE("PAT data error!");
16866456ae745e919085c5024f784aaa2703f9695f98David Yeh        return ;
16876456ae745e919085c5024f784aaa2703f9695f98David Yeh    }
1688cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned section_syntax_indictor = br->getBits(1);
16893856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("  section_syntax_indictor = %u", section_syntax_indictor);
1690cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1691e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim    br->skipBits(1);  // '0'
16926e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  reserved = %u", br->getBits(2));
1693cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1694cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned section_length = br->getBits(12);
16953856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("  section_length = %u", section_length);
1696cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
16976e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  transport_stream_id = %u", br->getBits(16));
16986e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  reserved = %u", br->getBits(2));
16996e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  version_number = %u", br->getBits(5));
17006e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  current_next_indicator = %u", br->getBits(1));
17016e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  section_number = %u", br->getBits(8));
17026e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  last_section_number = %u", br->getBits(8));
1703cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1704cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    size_t numProgramBytes = (section_length - 5 /* header */ - 4 /* crc */);
1705cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1706cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    for (size_t i = 0; i < numProgramBytes / 4; ++i) {
1707cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned program_number = br->getBits(16);
17083856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("    program_number = %u", program_number);
1709cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
17106e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber        MY_LOGV("    reserved = %u", br->getBits(3));
1711cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1712cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        if (program_number == 0) {
17136e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber            MY_LOGV("    network_PID = 0x%04x", br->getBits(13));
1714cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        } else {
1715cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            unsigned programMapPID = br->getBits(13);
1716cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
17173856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("    program_map_PID = 0x%04x", programMapPID);
1718cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1719386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            bool found = false;
1720386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            for (size_t index = 0; index < mPrograms.size(); ++index) {
1721386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                const sp<Program> &program = mPrograms.itemAt(index);
1722386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
1723386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                if (program->number() == program_number) {
1724386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                    program->updateProgramMapPID(programMapPID);
1725386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                    found = true;
1726386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                    break;
1727386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                }
1728386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            }
1729386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
1730386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            if (!found) {
1731386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                mPrograms.push(
1732d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang                        new Program(this, program_number, programMapPID, mLastRecoveredPTS));
1733386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            }
17348dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
17358dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            if (mPSISections.indexOfKey(programMapPID) < 0) {
17368dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                mPSISections.add(programMapPID, new PSISection);
17378dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            }
1738cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        }
1739cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
1740cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
17416e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  CRC = 0x%08x", br->getBits(32));
1742cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
1743cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
174406528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huberstatus_t ATSParser::parsePID(
1745cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        ABitReader *br, unsigned PID,
174687f2a558dd12043631e12c361abef301bf603140Andreas Huber        unsigned continuity_counter,
1747540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim        unsigned payload_unit_start_indicator,
17483b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        unsigned transport_scrambling_control,
17493b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        unsigned random_access_indicator,
1750540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim        SyncEvent *event) {
17518dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    ssize_t sectionIndex = mPSISections.indexOfKey(PID);
17528dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
17538dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    if (sectionIndex >= 0) {
17544b4bb11b8747adeb2efe56c7df4ab6803dd7db41Andreas Huber        sp<PSISection> section = mPSISections.valueAt(sectionIndex);
17558dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
1756cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        if (payload_unit_start_indicator) {
17576456ae745e919085c5024f784aaa2703f9695f98David Yeh            if (!section->isEmpty()) {
17589bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                ALOGW("parsePID encounters payload_unit_start_indicator when section is not empty");
17599bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                section->clear();
17606456ae745e919085c5024f784aaa2703f9695f98David Yeh            }
17618dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
1762cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            unsigned skip = br->getBits(8);
17639ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim            section->setSkipBytes(skip + 1);  // skip filler bytes + pointer field itself
1764cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            br->skipBits(skip * 8);
1765cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        }
17668dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
1767e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        if (br->numBitsLeft() % 8 != 0) {
1768e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            return ERROR_MALFORMED;
1769e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        }
17708dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        status_t err = section->append(br->data(), br->numBitsLeft() / 8);
17718dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
17728dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        if (err != OK) {
17738dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            return err;
17748dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        }
17758dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
17768dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        if (!section->isComplete()) {
17778dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            return OK;
17788dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        }
17798dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
17809ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim        if (!section->isCRCOkay()) {
17819ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim            return BAD_VALUE;
17829ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim        }
17838dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        ABitReader sectionBits(section->data(), section->size());
17848dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
17858dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        if (PID == 0) {
17868dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            parseProgramAssociationTable(&sectionBits);
17878dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        } else {
17888dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            bool handled = false;
17898dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            for (size_t i = 0; i < mPrograms.size(); ++i) {
17908dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                status_t err;
17918dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                if (!mPrograms.editItemAt(i)->parsePSISection(
17928dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                            PID, &sectionBits, &err)) {
17938dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                    continue;
17948dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                }
17958dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
17968dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                if (err != OK) {
17978dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                    return err;
17988dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                }
17998dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
18008dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                handled = true;
18018dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                break;
18028dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            }
18038dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
18048dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            if (!handled) {
18058dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                mPSISections.removeItem(PID);
18064b4bb11b8747adeb2efe56c7df4ab6803dd7db41Andreas Huber                section.clear();
18078dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            }
18088dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        }
18098dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
18104b4bb11b8747adeb2efe56c7df4ab6803dd7db41Andreas Huber        if (section != NULL) {
18114b4bb11b8747adeb2efe56c7df4ab6803dd7db41Andreas Huber            section->clear();
18124b4bb11b8747adeb2efe56c7df4ab6803dd7db41Andreas Huber        }
18138dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
181406528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber        return OK;
1815cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
1816cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1817cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    bool handled = false;
1818cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    for (size_t i = 0; i < mPrograms.size(); ++i) {
181906528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber        status_t err;
1820cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        if (mPrograms.editItemAt(i)->parsePID(
18213b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                    PID, continuity_counter,
18223b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                    payload_unit_start_indicator,
18233b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                    transport_scrambling_control,
18243b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                    random_access_indicator,
1825540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim                    br, &err, event)) {
182606528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber            if (err != OK) {
182706528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber                return err;
182806528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber            }
182906528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber
1830cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            handled = true;
1831cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            break;
1832cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        }
1833cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
1834cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1835cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    if (!handled) {
18363b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        handled = mCasManager->parsePID(br, PID);
18373b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    }
18383b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
18393b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    if (!handled) {
18403856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("PID 0x%04x not handled.", PID);
1841cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
184206528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber
184306528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber    return OK;
1844cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
1845cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
18463b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhangstatus_t ATSParser::parseAdaptationField(
18473b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        ABitReader *br, unsigned PID, unsigned *random_access_indicator) {
18483b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    *random_access_indicator = 0;
1849cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned adaptation_field_length = br->getBits(8);
185087f2a558dd12043631e12c361abef301bf603140Andreas Huber
1851cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    if (adaptation_field_length > 0) {
18528a1fa1ebc2375c9dcaca2b78918c6740fff2ca74Jaesung Chung        if (adaptation_field_length * 8 > br->numBitsLeft()) {
18538a1fa1ebc2375c9dcaca2b78918c6740fff2ca74Jaesung Chung            ALOGV("Adaptation field should be included in a single TS packet.");
18548a1fa1ebc2375c9dcaca2b78918c6740fff2ca74Jaesung Chung            return ERROR_MALFORMED;
18558a1fa1ebc2375c9dcaca2b78918c6740fff2ca74Jaesung Chung        }
18568a1fa1ebc2375c9dcaca2b78918c6740fff2ca74Jaesung Chung
185787f2a558dd12043631e12c361abef301bf603140Andreas Huber        unsigned discontinuity_indicator = br->getBits(1);
185887f2a558dd12043631e12c361abef301bf603140Andreas Huber
185987f2a558dd12043631e12c361abef301bf603140Andreas Huber        if (discontinuity_indicator) {
186087f2a558dd12043631e12c361abef301bf603140Andreas Huber            ALOGV("PID 0x%04x: discontinuity_indicator = 1 (!!!)", PID);
186187f2a558dd12043631e12c361abef301bf603140Andreas Huber        }
186287f2a558dd12043631e12c361abef301bf603140Andreas Huber
18633b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        *random_access_indicator = br->getBits(1);
18643b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        if (*random_access_indicator) {
18653b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            ALOGV("PID 0x%04x: random_access_indicator = 1", PID);
18663b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        }
18673b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
18683b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        unsigned elementary_stream_priority_indicator = br->getBits(1);
18693b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        if (elementary_stream_priority_indicator) {
18703b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            ALOGV("PID 0x%04x: elementary_stream_priority_indicator = 1", PID);
18713b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        }
18723b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
187387f2a558dd12043631e12c361abef301bf603140Andreas Huber        unsigned PCR_flag = br->getBits(1);
187487f2a558dd12043631e12c361abef301bf603140Andreas Huber
187587f2a558dd12043631e12c361abef301bf603140Andreas Huber        size_t numBitsRead = 4;
187687f2a558dd12043631e12c361abef301bf603140Andreas Huber
187787f2a558dd12043631e12c361abef301bf603140Andreas Huber        if (PCR_flag) {
1878e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            if (adaptation_field_length * 8 < 52) {
1879e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                return ERROR_MALFORMED;
1880e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            }
188187f2a558dd12043631e12c361abef301bf603140Andreas Huber            br->skipBits(4);
188287f2a558dd12043631e12c361abef301bf603140Andreas Huber            uint64_t PCR_base = br->getBits(32);
188387f2a558dd12043631e12c361abef301bf603140Andreas Huber            PCR_base = (PCR_base << 1) | br->getBits(1);
188487f2a558dd12043631e12c361abef301bf603140Andreas Huber
188587f2a558dd12043631e12c361abef301bf603140Andreas Huber            br->skipBits(6);
188687f2a558dd12043631e12c361abef301bf603140Andreas Huber            unsigned PCR_ext = br->getBits(9);
188787f2a558dd12043631e12c361abef301bf603140Andreas Huber
188887f2a558dd12043631e12c361abef301bf603140Andreas Huber            // The number of bytes from the start of the current
188987f2a558dd12043631e12c361abef301bf603140Andreas Huber            // MPEG2 transport stream packet up and including
189087f2a558dd12043631e12c361abef301bf603140Andreas Huber            // the final byte of this PCR_ext field.
189187f2a558dd12043631e12c361abef301bf603140Andreas Huber            size_t byteOffsetFromStartOfTSPacket =
189287f2a558dd12043631e12c361abef301bf603140Andreas Huber                (188 - br->numBitsLeft() / 8);
189387f2a558dd12043631e12c361abef301bf603140Andreas Huber
189487f2a558dd12043631e12c361abef301bf603140Andreas Huber            uint64_t PCR = PCR_base * 300 + PCR_ext;
189587f2a558dd12043631e12c361abef301bf603140Andreas Huber
1896b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross            ALOGV("PID 0x%04x: PCR = 0x%016" PRIx64 " (%.2f)",
189787f2a558dd12043631e12c361abef301bf603140Andreas Huber                  PID, PCR, PCR / 27E6);
189887f2a558dd12043631e12c361abef301bf603140Andreas Huber
189987f2a558dd12043631e12c361abef301bf603140Andreas Huber            // The number of bytes received by this parser up to and
190087f2a558dd12043631e12c361abef301bf603140Andreas Huber            // including the final byte of this PCR_ext field.
190119cec89f8b05fd05f8034ee1a4cd39ee09c33f02Marco Nelissen            uint64_t byteOffsetFromStart =
190219cec89f8b05fd05f8034ee1a4cd39ee09c33f02Marco Nelissen                uint64_t(mNumTSPacketsParsed) * 188 + byteOffsetFromStartOfTSPacket;
190387f2a558dd12043631e12c361abef301bf603140Andreas Huber
190487f2a558dd12043631e12c361abef301bf603140Andreas Huber            for (size_t i = 0; i < mPrograms.size(); ++i) {
190587f2a558dd12043631e12c361abef301bf603140Andreas Huber                updatePCR(PID, PCR, byteOffsetFromStart);
190687f2a558dd12043631e12c361abef301bf603140Andreas Huber            }
190787f2a558dd12043631e12c361abef301bf603140Andreas Huber
190887f2a558dd12043631e12c361abef301bf603140Andreas Huber            numBitsRead += 52;
190987f2a558dd12043631e12c361abef301bf603140Andreas Huber        }
191087f2a558dd12043631e12c361abef301bf603140Andreas Huber
191187f2a558dd12043631e12c361abef301bf603140Andreas Huber        br->skipBits(adaptation_field_length * 8 - numBitsRead);
1912cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
1913e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim    return OK;
1914cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
1915cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1916540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kimstatus_t ATSParser::parseTS(ABitReader *br, SyncEvent *event) {
19173856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("---");
1918cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1919cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned sync_byte = br->getBits(8);
19206456ae745e919085c5024f784aaa2703f9695f98David Yeh    if (sync_byte != 0x47u) {
19216456ae745e919085c5024f784aaa2703f9695f98David Yeh        ALOGE("[error] parseTS: return error as sync_byte=0x%x", sync_byte);
19226456ae745e919085c5024f784aaa2703f9695f98David Yeh        return BAD_VALUE;
19236456ae745e919085c5024f784aaa2703f9695f98David Yeh    }
1924cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
192552668ca838e1869676ff95e7388f93ec1858b1e9Andreas Huber    if (br->getBits(1)) {  // transport_error_indicator
192652668ca838e1869676ff95e7388f93ec1858b1e9Andreas Huber        // silently ignore.
192752668ca838e1869676ff95e7388f93ec1858b1e9Andreas Huber        return OK;
192852668ca838e1869676ff95e7388f93ec1858b1e9Andreas Huber    }
1929cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1930cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned payload_unit_start_indicator = br->getBits(1);
19313856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("payload_unit_start_indicator = %u", payload_unit_start_indicator);
1932cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
19336e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("transport_priority = %u", br->getBits(1));
1934cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1935cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned PID = br->getBits(13);
19363856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("PID = 0x%04x", PID);
1937cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
19383b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    unsigned transport_scrambling_control = br->getBits(2);
19393b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    ALOGV("transport_scrambling_control = %u", transport_scrambling_control);
1940cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1941cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned adaptation_field_control = br->getBits(2);
19423856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("adaptation_field_control = %u", adaptation_field_control);
1943cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
19440da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber    unsigned continuity_counter = br->getBits(4);
194587f2a558dd12043631e12c361abef301bf603140Andreas Huber    ALOGV("PID = 0x%04x, continuity_counter = %u", PID, continuity_counter);
19460da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber
1947df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block    // ALOGI("PID = 0x%04x, continuity_counter = %u", PID, continuity_counter);
1948cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
194987f2a558dd12043631e12c361abef301bf603140Andreas Huber    status_t err = OK;
195087f2a558dd12043631e12c361abef301bf603140Andreas Huber
19513b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    unsigned random_access_indicator = 0;
1952e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim    if (adaptation_field_control == 2 || adaptation_field_control == 3) {
19533b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        err = parseAdaptationField(br, PID, &random_access_indicator);
1954e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim    }
1955e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim    if (err == OK) {
1956e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        if (adaptation_field_control == 1 || adaptation_field_control == 3) {
1957540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim            err = parsePID(br, PID, continuity_counter,
19583b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                    payload_unit_start_indicator,
19593b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                    transport_scrambling_control,
19603b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                    random_access_indicator,
19613b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                    event);
1962e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        }
1963cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
196406528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber
196587f2a558dd12043631e12c361abef301bf603140Andreas Huber    ++mNumTSPacketsParsed;
196687f2a558dd12043631e12c361abef301bf603140Andreas Huber
196787f2a558dd12043631e12c361abef301bf603140Andreas Huber    return err;
1968cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
1969cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1970cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubersp<MediaSource> ATSParser::getSource(SourceType type) {
19719ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih    sp<MediaSource> firstSourceFound;
1972cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    for (size_t i = 0; i < mPrograms.size(); ++i) {
1973386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        const sp<Program> &program = mPrograms.editItemAt(i);
19749ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih        sp<MediaSource> source = program->getSource(type);
19759ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih        if (source == NULL) {
1976386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            continue;
1977386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        }
19789ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih        if (firstSourceFound == NULL) {
19799ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih            firstSourceFound = source;
19809ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih        }
19819ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih        // Prefer programs with both audio/video
19829ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih        switch (type) {
19839ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih            case VIDEO: {
19849ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih                if (program->hasSource(AUDIO)) {
19859ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih                    return source;
19869ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih                }
19879ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih                break;
19889ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih            }
1989386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
19909ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih            case AUDIO: {
19919ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih                if (program->hasSource(VIDEO)) {
19929ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih                    return source;
19939ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih                }
19949ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih                break;
19959ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih            }
1996cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
19979ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih            default:
19989ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih                return source;
1999cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        }
2000cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
2001cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
20029ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih    return firstSourceFound;
2003cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
2004cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
2005bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shihbool ATSParser::hasSource(SourceType type) const {
2006bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih    for (size_t i = 0; i < mPrograms.size(); ++i) {
2007bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih        const sp<Program> &program = mPrograms.itemAt(i);
2008bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih        if (program->hasSource(type)) {
2009bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih            return true;
2010bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih        }
2011bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih    }
2012bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih
2013bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih    return false;
2014bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih}
2015bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih
201643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huberbool ATSParser::PTSTimeDeltaEstablished() {
201743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    if (mPrograms.isEmpty()) {
201843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        return false;
201943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    }
202043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
202143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    return mPrograms.editItemAt(0)->PTSTimeDeltaEstablished();
202243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber}
202343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
202482e147049625a4cfdcb228a1de7efda594d446c9Robert Shihint64_t ATSParser::getFirstPTSTimeUs() {
202582e147049625a4cfdcb228a1de7efda594d446c9Robert Shih    for (size_t i = 0; i < mPrograms.size(); ++i) {
202682e147049625a4cfdcb228a1de7efda594d446c9Robert Shih        sp<ATSParser::Program> program = mPrograms.itemAt(i);
202782e147049625a4cfdcb228a1de7efda594d446c9Robert Shih        if (program->PTSTimeDeltaEstablished()) {
202882e147049625a4cfdcb228a1de7efda594d446c9Robert Shih            return (program->firstPTS() * 100) / 9;
202982e147049625a4cfdcb228a1de7efda594d446c9Robert Shih        }
203082e147049625a4cfdcb228a1de7efda594d446c9Robert Shih    }
203182e147049625a4cfdcb228a1de7efda594d446c9Robert Shih    return -1;
203282e147049625a4cfdcb228a1de7efda594d446c9Robert Shih}
203382e147049625a4cfdcb228a1de7efda594d446c9Robert Shih
2034c9fa35cf7c9c11a8acb77128db1a6a13f1befe3cChad Brubaker__attribute__((no_sanitize("integer")))
203587f2a558dd12043631e12c361abef301bf603140Andreas Hubervoid ATSParser::updatePCR(
203619cec89f8b05fd05f8034ee1a4cd39ee09c33f02Marco Nelissen        unsigned /* PID */, uint64_t PCR, uint64_t byteOffsetFromStart) {
203719cec89f8b05fd05f8034ee1a4cd39ee09c33f02Marco Nelissen    ALOGV("PCR 0x%016" PRIx64 " @ %" PRIx64, PCR, byteOffsetFromStart);
203887f2a558dd12043631e12c361abef301bf603140Andreas Huber
203987f2a558dd12043631e12c361abef301bf603140Andreas Huber    if (mNumPCRs == 2) {
204087f2a558dd12043631e12c361abef301bf603140Andreas Huber        mPCR[0] = mPCR[1];
204187f2a558dd12043631e12c361abef301bf603140Andreas Huber        mPCRBytes[0] = mPCRBytes[1];
204287f2a558dd12043631e12c361abef301bf603140Andreas Huber        mSystemTimeUs[0] = mSystemTimeUs[1];
204387f2a558dd12043631e12c361abef301bf603140Andreas Huber        mNumPCRs = 1;
204487f2a558dd12043631e12c361abef301bf603140Andreas Huber    }
204587f2a558dd12043631e12c361abef301bf603140Andreas Huber
204687f2a558dd12043631e12c361abef301bf603140Andreas Huber    mPCR[mNumPCRs] = PCR;
204787f2a558dd12043631e12c361abef301bf603140Andreas Huber    mPCRBytes[mNumPCRs] = byteOffsetFromStart;
204887f2a558dd12043631e12c361abef301bf603140Andreas Huber    mSystemTimeUs[mNumPCRs] = ALooper::GetNowUs();
204987f2a558dd12043631e12c361abef301bf603140Andreas Huber
205087f2a558dd12043631e12c361abef301bf603140Andreas Huber    ++mNumPCRs;
205187f2a558dd12043631e12c361abef301bf603140Andreas Huber
205287f2a558dd12043631e12c361abef301bf603140Andreas Huber    if (mNumPCRs == 2) {
2053c9fa35cf7c9c11a8acb77128db1a6a13f1befe3cChad Brubaker        /* Unsigned overflow here */
205487f2a558dd12043631e12c361abef301bf603140Andreas Huber        double transportRate =
205587f2a558dd12043631e12c361abef301bf603140Andreas Huber            (mPCRBytes[1] - mPCRBytes[0]) * 27E6 / (mPCR[1] - mPCR[0]);
205687f2a558dd12043631e12c361abef301bf603140Andreas Huber
205787f2a558dd12043631e12c361abef301bf603140Andreas Huber        ALOGV("transportRate = %.2f bytes/sec", transportRate);
205887f2a558dd12043631e12c361abef301bf603140Andreas Huber    }
205987f2a558dd12043631e12c361abef301bf603140Andreas Huber}
206087f2a558dd12043631e12c361abef301bf603140Andreas Huber
20618dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber////////////////////////////////////////////////////////////////////////////////
20628dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
20639ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim
20649ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim// CRC32 used for PSI section. The table was generated by following command:
20659ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim// $ python pycrc.py --model crc-32-mpeg --algorithm table-driven --generate c
20669ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim// Visit http://www.tty1.net/pycrc/index_en.html for more details.
20679ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kimuint32_t ATSParser::PSISection::CRC_TABLE[] = {
20689ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9,
20699ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x130476dc, 0x17c56b6b, 0x1a864db2, 0x1e475005,
20709ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61,
20719ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd,
20729ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9,
20739ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75,
20749ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011,
20759ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x791d4014, 0x7ddc5da3, 0x709f7b7a, 0x745e66cd,
20769ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039,
20779ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5,
20789ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xbe2b5b58, 0xbaea46ef, 0xb7a96036, 0xb3687d81,
20799ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d,
20809ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49,
20819ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95,
20829ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1,
20839ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d,
20849ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x34867077, 0x30476dc0, 0x3d044b19, 0x39c556ae,
20859ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072,
20869ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16,
20879ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca,
20889ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde,
20899ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02,
20909ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x5e9f46bf, 0x5a5e5b08, 0x571d7dd1, 0x53dc6066,
20919ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,
20929ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e,
20939ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xbfa1b04b, 0xbb60adfc, 0xb6238b25, 0xb2e29692,
20949ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6,
20959ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a,
20969ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e,
20979ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2,
20989ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686,
20999ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xd5b88683, 0xd1799b34, 0xdc3abded, 0xd8fba05a,
21009ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637,
21019ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb,
21029ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f,
21039ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53,
21049ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47,
21059ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x36194d42, 0x32d850f5, 0x3f9b762c, 0x3b5a6b9b,
21069ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff,
21079ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623,
21089ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xf12f560e, 0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7,
21099ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b,
21109ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f,
21119ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3,
21129ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7,
21139ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b,
21149ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x9b3660c6, 0x9ff77d71, 0x92b45ba8, 0x9675461f,
21159ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3,
21169ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640,
21179ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c,
21189ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8,
21199ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24,
21209ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x119b4be9, 0x155a565e, 0x18197087, 0x1cd86d30,
21219ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec,
21229ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088,
21239ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x2497d08d, 0x2056cd3a, 0x2d15ebe3, 0x29d4f654,
21249ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0,
21259ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c,
21269ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18,
21279ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4,
21289ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0,
21299ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x9abc8bd5, 0x9e7d9662, 0x933eb0bb, 0x97ffad0c,
21309ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668,
21319ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4
21329ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    };
21339ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim
21349ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk KimATSParser::PSISection::PSISection() :
21359ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    mSkipBytes(0) {
21368dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber}
21378dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
21388dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas HuberATSParser::PSISection::~PSISection() {
21398dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber}
21408dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
21418dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberstatus_t ATSParser::PSISection::append(const void *data, size_t size) {
21428dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    if (mBuffer == NULL || mBuffer->size() + size > mBuffer->capacity()) {
21438dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        size_t newCapacity =
21448dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            (mBuffer == NULL) ? size : mBuffer->capacity() + size;
21458dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
21468dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        newCapacity = (newCapacity + 1023) & ~1023;
21478dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
21488dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        sp<ABuffer> newBuffer = new ABuffer(newCapacity);
21498dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
21508dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        if (mBuffer != NULL) {
21518dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            memcpy(newBuffer->data(), mBuffer->data(), mBuffer->size());
21528dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            newBuffer->setRange(0, mBuffer->size());
21538dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        } else {
21548dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            newBuffer->setRange(0, 0);
21558dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        }
21568dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
21578dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        mBuffer = newBuffer;
21588dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    }
21598dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
21608dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    memcpy(mBuffer->data() + mBuffer->size(), data, size);
21618dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    mBuffer->setRange(0, mBuffer->size() + size);
21628dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
21638dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    return OK;
21648dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber}
21658dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
21669ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kimvoid ATSParser::PSISection::setSkipBytes(uint8_t skip) {
21679ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    mSkipBytes = skip;
21689ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim}
21699ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim
21708dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Hubervoid ATSParser::PSISection::clear() {
21718dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    if (mBuffer != NULL) {
21728dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        mBuffer->setRange(0, 0);
21738dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    }
21749ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    mSkipBytes = 0;
21758dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber}
21768dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
21778dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberbool ATSParser::PSISection::isComplete() const {
21788dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    if (mBuffer == NULL || mBuffer->size() < 3) {
21798dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        return false;
21808dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    }
21818dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
21828dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    unsigned sectionLength = U16_AT(mBuffer->data() + 1) & 0xfff;
21838dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    return mBuffer->size() >= sectionLength + 3;
21848dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber}
21858dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
21868dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberbool ATSParser::PSISection::isEmpty() const {
21878dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    return mBuffer == NULL || mBuffer->size() == 0;
21888dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber}
21898dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
21908dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberconst uint8_t *ATSParser::PSISection::data() const {
21918dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    return mBuffer == NULL ? NULL : mBuffer->data();
21928dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber}
21938dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
21948dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Hubersize_t ATSParser::PSISection::size() const {
21958dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    return mBuffer == NULL ? 0 : mBuffer->size();
21968dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber}
21978dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
21989ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kimbool ATSParser::PSISection::isCRCOkay() const {
21999ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    if (!isComplete()) {
22009ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim        return false;
22019ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    }
22029ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    uint8_t* data = mBuffer->data();
22039ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim
22049ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    // Return true if section_syntax_indicator says no section follows the field section_length.
22059ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    if ((data[1] & 0x80) == 0) {
22069ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim        return true;
22079ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    }
22089ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim
22099ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    unsigned sectionLength = U16_AT(data + 1) & 0xfff;
22109ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    ALOGV("sectionLength %u, skip %u", sectionLength, mSkipBytes);
22119ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim
2212c0c9f50d15f7b9ed539c0c6277296d083f41b293Marco Nelissen
2213c0c9f50d15f7b9ed539c0c6277296d083f41b293Marco Nelissen    if(sectionLength < mSkipBytes) {
2214c0c9f50d15f7b9ed539c0c6277296d083f41b293Marco Nelissen        ALOGE("b/28333006");
2215c0c9f50d15f7b9ed539c0c6277296d083f41b293Marco Nelissen        android_errorWriteLog(0x534e4554, "28333006");
2216c0c9f50d15f7b9ed539c0c6277296d083f41b293Marco Nelissen        return false;
2217c0c9f50d15f7b9ed539c0c6277296d083f41b293Marco Nelissen    }
2218c0c9f50d15f7b9ed539c0c6277296d083f41b293Marco Nelissen
22199ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    // Skip the preceding field present when payload start indicator is on.
22209ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    sectionLength -= mSkipBytes;
22219ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim
22229ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    uint32_t crc = 0xffffffff;
22239ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    for(unsigned i = 0; i < sectionLength + 4 /* crc */; i++) {
22249ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim        uint8_t b = data[i];
22259ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim        int index = ((crc >> 24) ^ (b & 0xff)) & 0xff;
22269ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim        crc = CRC_TABLE[index] ^ (crc << 8);
22279ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    }
22289ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    ALOGV("crc: %08x\n", crc);
22299ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    return (crc == 0);
22309ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim}
2231cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}  // namespace android
2232