ATSParser.cpp revision 49ce671c4efa4c5d038351ca441e34c5afa5241f
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"
24cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
25d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang#include <android/hardware/cas/native/1.0/IDescrambler.h>
2649ce671c4efa4c5d038351ca441e34c5afa5241fDongwon Kang#include <binder/IMemory.h>
2749ce671c4efa4c5d038351ca441e34c5afa5241fDongwon Kang#include <binder/MemoryDealer.h>
28d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang#include <cutils/native_handle.h>
2985f12e9b9062402d6110df3f7099707912040edbAndreas Huber#include <media/stagefright/foundation/ABitReader.h>
30cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/foundation/ABuffer.h>
31cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/foundation/ADebug.h>
32cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/foundation/AMessage.h>
33607612858f3afad1ade51a098aafa2a41523b5f7Dongwon Kang#include <media/stagefright/foundation/ByteUtils.h>
3415d02f84351eaca14099bde11cfbf6f124bea71fDongwon Kang#include <media/stagefright/foundation/MediaKeys.h>
35d91dc5a0602f54fc0d4d2187f37b5b8169bb62c3Dongwon Kang#include <media/stagefright/foundation/avc_utils.h>
36cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/foundation/hexdump.h>
37cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/MediaDefs.h>
38cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/MediaErrors.h>
39cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/MetaData.h>
4032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber#include <media/IStreamSource.h>
41cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <utils/KeyedVector.h>
429bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang#include <utils/Vector.h>
43cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
44b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross#include <inttypes.h>
45b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross
46cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubernamespace android {
47d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhangusing hardware::hidl_handle;
48d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhangusing hardware::hidl_memory;
49d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhangusing hardware::hidl_string;
50d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhangusing hardware::hidl_vec;
51d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhangusing namespace hardware::cas::V1_0;
52d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhangusing namespace hardware::cas::native::V1_0;
53cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
546e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber// I want the expression "y" evaluated even if verbose logging is off.
556e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber#define MY_LOGV(x, y) \
563856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    do { unsigned tmp = y; ALOGV(x, tmp); } while (0)
576e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber
58cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberstatic const size_t kTSPacketSize = 188;
59cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
60cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberstruct ATSParser::Program : public RefBase {
61d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang    Program(ATSParser *parser, unsigned programNumber, unsigned programMapPID,
62d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang            int64_t lastRecoveredPTS);
63cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
648dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    bool parsePSISection(
658dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            unsigned pid, ABitReader *br, status_t *err);
668dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
67540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    // Pass to appropriate stream according to pid, and set event if it's a PES
68540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    // with a sync frame.
69540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    // Note that the method itself does not touch event.
70cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    bool parsePID(
7187f2a558dd12043631e12c361abef301bf603140Andreas Huber            unsigned pid, unsigned continuity_counter,
7287f2a558dd12043631e12c361abef301bf603140Andreas Huber            unsigned payload_unit_start_indicator,
733b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            unsigned transport_scrambling_control,
743b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            unsigned random_access_indicator,
75540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim            ABitReader *br, status_t *err, SyncEvent *event);
76cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
7732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber    void signalDiscontinuity(
7832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            DiscontinuityType type, const sp<AMessage> &extra);
7932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
80f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    void signalEOS(status_t finalResult);
812a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber
82cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    sp<MediaSource> getSource(SourceType type);
83bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih    bool hasSource(SourceType type) const;
84cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
85bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    int64_t convertPTSToTimestamp(uint64_t PTS);
86bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber
8743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    bool PTSTimeDeltaEstablished() const {
8843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        return mFirstPTSValid;
8943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    }
9043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
91386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    unsigned number() const { return mProgramNumber; }
92386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
93386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    void updateProgramMapPID(unsigned programMapPID) {
94386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        mProgramMapPID = programMapPID;
95386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    }
96386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
978dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    unsigned programMapPID() const {
988dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        return mProgramMapPID;
998dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    }
1008dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
10187f2a558dd12043631e12c361abef301bf603140Andreas Huber    uint32_t parserFlags() const {
10287f2a558dd12043631e12c361abef301bf603140Andreas Huber        return mParser->mFlags;
10387f2a558dd12043631e12c361abef301bf603140Andreas Huber    }
10487f2a558dd12043631e12c361abef301bf603140Andreas Huber
1053b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    sp<CasManager> casManager() const {
1063b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        return mParser->mCasManager;
1073b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    }
1083b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
10982e147049625a4cfdcb228a1de7efda594d446c9Robert Shih    uint64_t firstPTS() const {
11082e147049625a4cfdcb228a1de7efda594d446c9Robert Shih        return mFirstPTS;
11182e147049625a4cfdcb228a1de7efda594d446c9Robert Shih    }
11282e147049625a4cfdcb228a1de7efda594d446c9Robert Shih
1133b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    void updateCasSessions();
1143b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
1153a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania    void signalNewSampleAesKey(const sp<AMessage> &keyItem);
1163a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania
117cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberprivate:
1189bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang    struct StreamInfo {
1199bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        unsigned mType;
1209bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        unsigned mPID;
1213b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        int32_t mCASystemId;
1229bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang    };
1239bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang
124f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    ATSParser *mParser;
125386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    unsigned mProgramNumber;
126cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned mProgramMapPID;
127cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    KeyedVector<unsigned, sp<Stream> > mStreams;
128bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    bool mFirstPTSValid;
129bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    uint64_t mFirstPTS;
130799c9682b3776a55d234396aee4a302437150c26Chong Zhang    int64_t mLastRecoveredPTS;
1313a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania    sp<AMessage> mSampleAesKeyItem;
132cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
13306528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber    status_t parseProgramMap(ABitReader *br);
134799c9682b3776a55d234396aee4a302437150c26Chong Zhang    int64_t recoverPTS(uint64_t PTS_33bit);
1353b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    bool findCADescriptor(
1363b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            ABitReader *br, unsigned infoLength, CADescriptor *caDescriptor);
1379bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang    bool switchPIDs(const Vector<StreamInfo> &infos);
138cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
139cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    DISALLOW_EVIL_CONSTRUCTORS(Program);
140cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber};
141cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
142cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberstruct ATSParser::Stream : public RefBase {
14387f2a558dd12043631e12c361abef301bf603140Andreas Huber    Stream(Program *program,
14487f2a558dd12043631e12c361abef301bf603140Andreas Huber           unsigned elementaryPID,
14587f2a558dd12043631e12c361abef301bf603140Andreas Huber           unsigned streamType,
1463b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang           unsigned PCR_PID,
1473b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang           int32_t CA_system_ID);
148cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
149bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber    unsigned type() const { return mStreamType; }
150bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber    unsigned pid() const { return mElementaryPID; }
151bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber    void setPID(unsigned pid) { mElementaryPID = pid; }
152bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber
153bc7aae4ff7e72e5bf0fa888f946835840a4357bbChong Zhang    void setCasInfo(
154bc7aae4ff7e72e5bf0fa888f946835840a4357bbChong Zhang            int32_t systemId,
1553b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            const sp<IDescrambler> &descrambler,
1563b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            const std::vector<uint8_t> &sessionId);
1573b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
158540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    // Parse the payload and set event when PES with a sync frame is detected.
1599558f6dd733dc450270f38b9a139d384d273ce0aWei Jia    // This method knows when a PES starts; so record mPesStartOffsets in that
160540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    // case.
1615403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber    status_t parse(
16287f2a558dd12043631e12c361abef301bf603140Andreas Huber            unsigned continuity_counter,
163cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            unsigned payload_unit_start_indicator,
1643b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            unsigned transport_scrambling_control,
1653b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            unsigned random_access_indicator,
166540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim            ABitReader *br,
167540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim            SyncEvent *event);
168cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
16932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber    void signalDiscontinuity(
17032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            DiscontinuityType type, const sp<AMessage> &extra);
17132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
172f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    void signalEOS(status_t finalResult);
1732a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber
17482e147049625a4cfdcb228a1de7efda594d446c9Robert Shih    SourceType getSourceType();
175cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    sp<MediaSource> getSource(SourceType type);
176cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
177bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih    bool isAudio() const;
178bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih    bool isVideo() const;
1790852843d304006e3ab333081fddda13b07193de8Robert Shih    bool isMeta() const;
180bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih
1813a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania    void signalNewSampleAesKey(const sp<AMessage> &keyItem);
1823a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania
183cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberprotected:
184cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    virtual ~Stream();
185cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
186cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberprivate:
1873b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    struct SubSampleInfo {
1883b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        size_t subSampleSize;
1893b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        unsigned transport_scrambling_mode;
1903b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        unsigned random_access_indicator;
1913b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    };
192bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    Program *mProgram;
193cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned mElementaryPID;
194cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned mStreamType;
19587f2a558dd12043631e12c361abef301bf603140Andreas Huber    unsigned mPCR_PID;
19687f2a558dd12043631e12c361abef301bf603140Andreas Huber    int32_t mExpectedContinuityCounter;
197cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
198cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    sp<ABuffer> mBuffer;
199cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    sp<AnotherPacketSource> mSource;
200cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    bool mPayloadStarted;
201be9634d071e79b72a42a4504f64eda9e2a0bceb8Marco Nelissen    bool mEOSReached;
202cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
20390a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber    uint64_t mPrevPTS;
2049558f6dd733dc450270f38b9a139d384d273ce0aWei Jia    List<off64_t> mPesStartOffsets;
20590a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber
206386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    ElementaryStreamQueue *mQueue;
2076a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber
2083b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    bool mScrambled;
2093a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania    bool mSampleEncrypted;
2103a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania    sp<AMessage> mSampleAesKeyItem;
2113b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    sp<IMemory> mMem;
2123b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    sp<MemoryDealer> mDealer;
213d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang    hardware::cas::native::V1_0::SharedBuffer mDescramblerSrcBuffer;
2143b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    sp<ABuffer> mDescrambledBuffer;
2153b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    List<SubSampleInfo> mSubSamples;
2163b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    sp<IDescrambler> mDescrambler;
2173b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
218540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    // Flush accumulated payload if necessary --- i.e. at EOS or at the start of
219540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    // another payload. event is set if the flushed payload is PES with a sync
220540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    // frame.
221540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    status_t flush(SyncEvent *event);
2223b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
2233b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    // Flush accumulated payload for scrambled streams if necessary --- i.e. at
2243b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    // EOS or at the start of another payload. event is set if the flushed
2253b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    // payload is PES with a sync frame.
2263b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    status_t flushScrambled(SyncEvent *event);
2273b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
2283b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    // Check if a PES packet is scrambled at PES level.
2293b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    uint32_t getPesScramblingControl(ABitReader *br, int32_t *pesOffset);
2303b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
231540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    // Strip and parse PES headers and pass remaining payload into onPayload
232540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    // with parsed metadata. event is set if the PES contains a sync frame.
233540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    status_t parsePES(ABitReader *br, SyncEvent *event);
234540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim
235540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    // Feed the payload into mQueue and if a packet is identified, queue it
236540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    // into mSource. If the packet is a sync frame. set event with start offset
237540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    // and timestamp of the packet.
238cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    void onPayloadData(
239cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            unsigned PTS_DTS_flags, uint64_t PTS, uint64_t DTS,
2403b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            unsigned PES_scrambling_control,
2413b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            const uint8_t *data, size_t size,
2423b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            int32_t payloadOffset, SyncEvent *event);
2433b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
2443b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    // Ensure internal buffers can hold specified size, and will re-allocate
2453b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    // as needed.
246d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang    bool ensureBufferCapacity(size_t size);
24782f7321b03eec1e40af9d681370f754ee0279582Andreas Huber
248cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    DISALLOW_EVIL_CONSTRUCTORS(Stream);
249cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber};
250cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
2518dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberstruct ATSParser::PSISection : public RefBase {
2528dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    PSISection();
2538dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
2548dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    status_t append(const void *data, size_t size);
2559ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    void setSkipBytes(uint8_t skip);
2568dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    void clear();
2578dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
2588dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    bool isComplete() const;
2598dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    bool isEmpty() const;
2609ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    bool isCRCOkay() const;
2618dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
2628dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    const uint8_t *data() const;
2638dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    size_t size() const;
2648dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
2658dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberprotected:
2668dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    virtual ~PSISection();
2678dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
2688dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberprivate:
2698dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    sp<ABuffer> mBuffer;
2709ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    uint8_t mSkipBytes;
2719ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    static uint32_t CRC_TABLE[];
2728dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
2738dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    DISALLOW_EVIL_CONSTRUCTORS(PSISection);
2748dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber};
2758dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
276540006666b4191cd78391378f1c66c21bcf0c4cdWonsik KimATSParser::SyncEvent::SyncEvent(off64_t offset)
2779558f6dd733dc450270f38b9a139d384d273ce0aWei Jia    : mHasReturnedData(false), mOffset(offset), mTimeUs(0) {}
278540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim
279540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kimvoid ATSParser::SyncEvent::init(off64_t offset, const sp<MediaSource> &source,
28082e147049625a4cfdcb228a1de7efda594d446c9Robert Shih        int64_t timeUs, SourceType type) {
2819558f6dd733dc450270f38b9a139d384d273ce0aWei Jia    mHasReturnedData = true;
282540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    mOffset = offset;
283540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    mMediaSource = source;
284540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    mTimeUs = timeUs;
28582e147049625a4cfdcb228a1de7efda594d446c9Robert Shih    mType = type;
286540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim}
287540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim
2889558f6dd733dc450270f38b9a139d384d273ce0aWei Jiavoid ATSParser::SyncEvent::reset() {
2899558f6dd733dc450270f38b9a139d384d273ce0aWei Jia    mHasReturnedData = false;
2909558f6dd733dc450270f38b9a139d384d273ce0aWei Jia}
291cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber////////////////////////////////////////////////////////////////////////////////
292cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
293386d609dc513e838c7e7c4c46c604493ccd560beAndreas HuberATSParser::Program::Program(
294d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang        ATSParser *parser, unsigned programNumber, unsigned programMapPID,
295d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang        int64_t lastRecoveredPTS)
296f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    : mParser(parser),
297386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber      mProgramNumber(programNumber),
298f933441648ef6a71dee783d733aac17b9508b452Andreas Huber      mProgramMapPID(programMapPID),
299bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber      mFirstPTSValid(false),
300799c9682b3776a55d234396aee4a302437150c26Chong Zhang      mFirstPTS(0),
301d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang      mLastRecoveredPTS(lastRecoveredPTS) {
3023856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("new program number %u", programNumber);
303cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
304cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
3058dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberbool ATSParser::Program::parsePSISection(
3068dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        unsigned pid, ABitReader *br, status_t *err) {
30706528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber    *err = OK;
30806528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber
3098dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    if (pid != mProgramMapPID) {
3108dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        return false;
3118dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    }
312cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
3138dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    *err = parseProgramMap(br);
31406528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber
3158dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    return true;
3168dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber}
3178dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
3188dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberbool ATSParser::Program::parsePID(
31987f2a558dd12043631e12c361abef301bf603140Andreas Huber        unsigned pid, unsigned continuity_counter,
32087f2a558dd12043631e12c361abef301bf603140Andreas Huber        unsigned payload_unit_start_indicator,
3213b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        unsigned transport_scrambling_control,
3223b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        unsigned random_access_indicator,
323540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim        ABitReader *br, status_t *err, SyncEvent *event) {
3248dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    *err = OK;
325cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
326cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    ssize_t index = mStreams.indexOfKey(pid);
327cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    if (index < 0) {
328cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        return false;
329cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
330cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
3315403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber    *err = mStreams.editValueAt(index)->parse(
3323b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            continuity_counter,
3333b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            payload_unit_start_indicator,
3343b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            transport_scrambling_control,
3353b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            random_access_indicator,
3363b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            br, event);
337cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
338cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    return true;
339cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
340cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
34132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Hubervoid ATSParser::Program::signalDiscontinuity(
34232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        DiscontinuityType type, const sp<AMessage> &extra) {
343b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber    int64_t mediaTimeUs;
344b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber    if ((type & DISCONTINUITY_TIME)
345b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber            && extra != NULL
346b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber            && extra->findInt64(
34715d02f84351eaca14099bde11cfbf6f124bea71fDongwon Kang                kATSParserKeyMediaTimeUs, &mediaTimeUs)) {
348b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber        mFirstPTSValid = false;
349b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber    }
350b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber
3512a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    for (size_t i = 0; i < mStreams.size(); ++i) {
35232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        mStreams.editValueAt(i)->signalDiscontinuity(type, extra);
353f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
354f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
355f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
356f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ATSParser::Program::signalEOS(status_t finalResult) {
357f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    for (size_t i = 0; i < mStreams.size(); ++i) {
358f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        mStreams.editValueAt(i)->signalEOS(finalResult);
3592a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    }
3602a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber}
3612a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber
3629bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhangbool ATSParser::Program::switchPIDs(const Vector<StreamInfo> &infos) {
3639bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang    bool success = false;
3649bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang
3659bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang    if (mStreams.size() == infos.size()) {
3669bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        // build type->PIDs map for old and new mapping
3679bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        size_t i;
3689bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        KeyedVector<int32_t, Vector<int32_t> > oldType2PIDs, newType2PIDs;
3699bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        for (i = 0; i < mStreams.size(); ++i) {
3709bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            ssize_t index = oldType2PIDs.indexOfKey(mStreams[i]->type());
3719bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            if (index < 0) {
3729bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                oldType2PIDs.add(mStreams[i]->type(), Vector<int32_t>());
3739bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            }
3749bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            oldType2PIDs.editValueFor(mStreams[i]->type()).push_back(mStreams[i]->pid());
3759bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        }
3769bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        for (i = 0; i < infos.size(); ++i) {
3779bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            ssize_t index = newType2PIDs.indexOfKey(infos[i].mType);
3789bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            if (index < 0) {
3799bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                newType2PIDs.add(infos[i].mType, Vector<int32_t>());
3809bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            }
3819bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            newType2PIDs.editValueFor(infos[i].mType).push_back(infos[i].mPID);
3829bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        }
3839bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang
3849bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        // we can recover if the number of streams for each type hasn't changed
3859bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        if (oldType2PIDs.size() == newType2PIDs.size()) {
3869bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            success = true;
3879bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            for (i = 0; i < oldType2PIDs.size(); ++i) {
3889bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                // KeyedVector is sorted, we just compare key and size of each index
3899bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                if (oldType2PIDs.keyAt(i) != newType2PIDs.keyAt(i)
3909bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                        || oldType2PIDs[i].size() != newType2PIDs[i].size()) {
3919bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                     success = false;
3929bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                     break;
3939bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                }
3949bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            }
3959bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        }
3969bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang
3979bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        if (success) {
3989bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            // save current streams to temp
3999bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            KeyedVector<int32_t, sp<Stream> > temp;
4009bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            for (i = 0; i < mStreams.size(); ++i) {
4019bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                 temp.add(mStreams.keyAt(i), mStreams.editValueAt(i));
4029bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            }
4039bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang
4049bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            mStreams.clear();
4059bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            for (i = 0; i < temp.size(); ++i) {
4069bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                // The two checks below shouldn't happen,
4079bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                // we already checked above the stream count matches
4089bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                ssize_t index = newType2PIDs.indexOfKey(temp[i]->type());
409e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                if (index < 0) {
410e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                    return false;
411e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                }
4129bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                Vector<int32_t> &newPIDs = newType2PIDs.editValueAt(index);
413e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                if (newPIDs.isEmpty()) {
414e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                    return false;
415e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                }
4169bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang
4179bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                // get the next PID for temp[i]->type() in the new PID map
4189bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                Vector<int32_t>::iterator it = newPIDs.begin();
4199bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang
4209bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                // change the PID of the stream, and add it back
4219bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                temp.editValueAt(i)->setPID(*it);
4229bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                mStreams.add(temp[i]->pid(), temp.editValueAt(i));
4239bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang
4249bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                // removed the used PID
4259bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                newPIDs.erase(it);
4269bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            }
4279bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        }
4289bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang    }
4299bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang    return success;
4309bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang}
431bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber
4323b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhangbool ATSParser::Program::findCADescriptor(
4333b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        ABitReader *br, unsigned infoLength,
4343b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        ATSParser::CADescriptor *caDescriptor) {
4353b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    bool found = false;
4363b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    while (infoLength > 2) {
4373b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        unsigned descriptor_tag = br->getBits(8);
4383b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        ALOGV("      tag = 0x%02x", descriptor_tag);
4393b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
4403b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        unsigned descriptor_length = br->getBits(8);
4413b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        ALOGV("      len = %u", descriptor_length);
4423b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
4433b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        infoLength -= 2;
4443b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        if (descriptor_length > infoLength) {
4453b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            break;
4463b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        }
4473b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        if (descriptor_tag == 9 && descriptor_length >= 4) {
4483b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            found = true;
4493b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            caDescriptor->mSystemID = br->getBits(16);
4503b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            caDescriptor->mPID = br->getBits(16) & 0x1fff;
4513b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            infoLength -= 4;
4523b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            caDescriptor->mPrivateData.assign(
4533b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                    br->data(), br->data() + descriptor_length - 4);
4543b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            break;
4553b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        } else {
4563b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            infoLength -= descriptor_length;
4573b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            br->skipBits(descriptor_length * 8);
4583b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        }
4593b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    }
4603b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    br->skipBits(infoLength * 8);
4613b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    return found;
4623b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang}
4633b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
46406528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huberstatus_t ATSParser::Program::parseProgramMap(ABitReader *br) {
465cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned table_id = br->getBits(8);
4663856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("  table_id = %u", table_id);
4676456ae745e919085c5024f784aaa2703f9695f98David Yeh    if (table_id != 0x02u) {
4686456ae745e919085c5024f784aaa2703f9695f98David Yeh        ALOGE("PMT data error!");
4696456ae745e919085c5024f784aaa2703f9695f98David Yeh        return ERROR_MALFORMED;
4706456ae745e919085c5024f784aaa2703f9695f98David Yeh    }
4716e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    unsigned section_syntax_indicator = br->getBits(1);
4723856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("  section_syntax_indicator = %u", section_syntax_indicator);
4736456ae745e919085c5024f784aaa2703f9695f98David Yeh    if (section_syntax_indicator != 1u) {
4746456ae745e919085c5024f784aaa2703f9695f98David Yeh        ALOGE("PMT data error!");
4756456ae745e919085c5024f784aaa2703f9695f98David Yeh        return ERROR_MALFORMED;
4766456ae745e919085c5024f784aaa2703f9695f98David Yeh    }
477cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
478e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim    br->skipBits(1);  // '0'
4796e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  reserved = %u", br->getBits(2));
480cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
481cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned section_length = br->getBits(12);
4823856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("  section_length = %u", section_length);
483cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
4846e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  program_number = %u", br->getBits(16));
4856e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  reserved = %u", br->getBits(2));
4866e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  version_number = %u", br->getBits(5));
4876e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  current_next_indicator = %u", br->getBits(1));
4886e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  section_number = %u", br->getBits(8));
4896e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  last_section_number = %u", br->getBits(8));
4906e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  reserved = %u", br->getBits(3));
49187f2a558dd12043631e12c361abef301bf603140Andreas Huber
49287f2a558dd12043631e12c361abef301bf603140Andreas Huber    unsigned PCR_PID = br->getBits(13);
49387f2a558dd12043631e12c361abef301bf603140Andreas Huber    ALOGV("  PCR_PID = 0x%04x", PCR_PID);
49487f2a558dd12043631e12c361abef301bf603140Andreas Huber
4956e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  reserved = %u", br->getBits(4));
496cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
497cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned program_info_length = br->getBits(12);
4983856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("  program_info_length = %u", program_info_length);
499cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
5003b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    // descriptors
5013b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    CADescriptor programCA;
5023b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    bool hasProgramCA = findCADescriptor(br, program_info_length, &programCA);
5033b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    if (hasProgramCA && !mParser->mCasManager->addProgram(
5043b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            mProgramNumber, programCA)) {
5053b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        return ERROR_MALFORMED;
5063b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    }
507cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
508bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber    Vector<StreamInfo> infos;
509bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber
510cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    // infoBytesRemaining is the number of bytes that make up the
511cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    // variable length section of ES_infos. It does not include the
512cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    // final CRC.
513cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    size_t infoBytesRemaining = section_length - 9 - program_info_length - 4;
514cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
515e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim    while (infoBytesRemaining >= 5) {
516cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
517cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned streamType = br->getBits(8);
5183856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("    stream_type = 0x%02x", streamType);
519cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
5206e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber        MY_LOGV("    reserved = %u", br->getBits(3));
521cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
522cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned elementaryPID = br->getBits(13);
5233856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("    elementary_PID = 0x%04x", elementaryPID);
524cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
5256e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber        MY_LOGV("    reserved = %u", br->getBits(4));
526cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
527cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned ES_info_length = br->getBits(12);
5283856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("    ES_info_length = %u", ES_info_length);
529cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
5303b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        CADescriptor streamCA;
5313b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        bool hasStreamCA = findCADescriptor(br, ES_info_length, &streamCA);
5323b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        if (hasStreamCA && !mParser->mCasManager->addStream(
5333b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                mProgramNumber, elementaryPID, streamCA)) {
5343b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            return ERROR_MALFORMED;
535cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        }
536bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        StreamInfo info;
537bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        info.mType = streamType;
538bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        info.mPID = elementaryPID;
5393b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        info.mCASystemId = hasProgramCA ? programCA.mSystemID :
5403b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                           hasStreamCA ? streamCA.mSystemID  : -1;
541bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        infos.push(info);
542cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
543cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        infoBytesRemaining -= 5 + ES_info_length;
544cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
545cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
546e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim    if (infoBytesRemaining != 0) {
547e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        ALOGW("Section data remains unconsumed");
548e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim    }
5496e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  CRC = 0x%08x", br->getBits(32));
550bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber
551bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber    bool PIDsChanged = false;
552bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber    for (size_t i = 0; i < infos.size(); ++i) {
553bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        StreamInfo &info = infos.editItemAt(i);
554bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber
555bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        ssize_t index = mStreams.indexOfKey(info.mPID);
556bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber
557bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        if (index >= 0 && mStreams.editValueAt(index)->type() != info.mType) {
558df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block            ALOGI("uh oh. stream PIDs have changed.");
559bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber            PIDsChanged = true;
560bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber            break;
561bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        }
562bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber    }
563bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber
564bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber    if (PIDsChanged) {
56506528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber#if 0
566df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block        ALOGI("before:");
56706528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber        for (size_t i = 0; i < mStreams.size(); ++i) {
56806528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber            sp<Stream> stream = mStreams.editValueAt(i);
56906528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber
570df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block            ALOGI("PID 0x%08x => type 0x%02x", stream->pid(), stream->type());
57106528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber        }
57206528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber
573df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block        ALOGI("after:");
57406528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber        for (size_t i = 0; i < infos.size(); ++i) {
57506528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber            StreamInfo &info = infos.editItemAt(i);
57606528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber
577df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block            ALOGI("PID 0x%08x => type 0x%02x", info.mPID, info.mType);
57806528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber        }
57906528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber#endif
58006528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber
5819bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        // we can recover if number of streams for each type remain the same
5829bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        bool success = switchPIDs(infos);
58306528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber
58406528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber        if (!success) {
585df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block            ALOGI("Stream PIDs changed and we cannot recover.");
58606528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber            return ERROR_MALFORMED;
58706528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber        }
588bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber    }
589bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber
5903b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    bool isAddingScrambledStream = false;
591bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber    for (size_t i = 0; i < infos.size(); ++i) {
592bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        StreamInfo &info = infos.editItemAt(i);
593bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber
5943b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        if (mParser->mCasManager->isCAPid(info.mPID)) {
5953b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            // skip CA streams (EMM/ECM)
5963b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            continue;
5973b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        }
598bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        ssize_t index = mStreams.indexOfKey(info.mPID);
599bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber
600bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        if (index < 0) {
60187f2a558dd12043631e12c361abef301bf603140Andreas Huber            sp<Stream> stream = new Stream(
6023b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                    this, info.mPID, info.mType, PCR_PID, info.mCASystemId);
60387f2a558dd12043631e12c361abef301bf603140Andreas Huber
6043a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania            if (mSampleAesKeyItem != NULL) {
6053a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania                stream->signalNewSampleAesKey(mSampleAesKeyItem);
6063a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania            }
6073a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania
6083b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            isAddingScrambledStream |= info.mCASystemId >= 0;
609bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber            mStreams.add(info.mPID, stream);
610bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber        }
611bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber    }
61206528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber
6133b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    if (isAddingScrambledStream) {
6143b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        ALOGI("Receiving scrambled streams without descrambler!");
6153b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        return ERROR_DRM_DECRYPT_UNIT_NOT_INITIALIZED;
6163b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    }
61706528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber    return OK;
618cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
619cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
620799c9682b3776a55d234396aee4a302437150c26Chong Zhangint64_t ATSParser::Program::recoverPTS(uint64_t PTS_33bit) {
621799c9682b3776a55d234396aee4a302437150c26Chong Zhang    // We only have the lower 33-bit of the PTS. It could overflow within a
622799c9682b3776a55d234396aee4a302437150c26Chong Zhang    // reasonable amount of time. To handle the wrap-around, use fancy math
623799c9682b3776a55d234396aee4a302437150c26Chong Zhang    // to get an extended PTS that is within [-0xffffffff, 0xffffffff]
624799c9682b3776a55d234396aee4a302437150c26Chong Zhang    // of the latest recovered PTS.
6259bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang    if (mLastRecoveredPTS < 0ll) {
6269bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        // Use the original 33bit number for 1st frame, the reason is that
6279bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        // if 1st frame wraps to negative that's far away from 0, we could
6289bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        // never start. Only start wrapping around from 2nd frame.
6299bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        mLastRecoveredPTS = static_cast<int64_t>(PTS_33bit);
6309bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang    } else {
6319bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        mLastRecoveredPTS = static_cast<int64_t>(
6323728ba367f1e23e652c5539d9488aa0d0d4ec9d7Chad Brubaker                ((mLastRecoveredPTS - static_cast<int64_t>(PTS_33bit) + 0x100000000ll)
6339bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                & 0xfffffffe00000000ull) | PTS_33bit);
6349bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        // We start from 0, but recovered PTS could be slightly below 0.
6359bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        // Clamp it to 0 as rest of the pipeline doesn't take negative pts.
6369bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        // (eg. video is read first and starts at 0, but audio starts at 0xfffffff0)
6379bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        if (mLastRecoveredPTS < 0ll) {
6385c9054bc6efc080b265e028f2ebb1abd2a2e3953Chih-Hung Hsieh            ALOGI("Clamping negative recovered PTS (%" PRId64 ") to 0", mLastRecoveredPTS);
6399bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang            mLastRecoveredPTS = 0ll;
6409bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang        }
6419bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang    }
6429bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang
6439bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang    return mLastRecoveredPTS;
644799c9682b3776a55d234396aee4a302437150c26Chong Zhang}
645799c9682b3776a55d234396aee4a302437150c26Chong Zhang
646cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubersp<MediaSource> ATSParser::Program::getSource(SourceType type) {
647cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    for (size_t i = 0; i < mStreams.size(); ++i) {
648cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        sp<MediaSource> source = mStreams.editValueAt(i)->getSource(type);
649cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        if (source != NULL) {
6509ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih            return source;
651cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        }
652cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
653cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
654cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    return NULL;
655cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
656cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
657bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shihbool ATSParser::Program::hasSource(SourceType type) const {
658bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih    for (size_t i = 0; i < mStreams.size(); ++i) {
659bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih        const sp<Stream> &stream = mStreams.valueAt(i);
660bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih        if (type == AUDIO && stream->isAudio()) {
661bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih            return true;
662bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih        } else if (type == VIDEO && stream->isVideo()) {
663bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih            return true;
6649ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih        } else if (type == META && stream->isMeta()) {
6659ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih            return true;
666bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih        }
667bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih    }
668bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih
669bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih    return false;
670bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih}
671bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih
672bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huberint64_t ATSParser::Program::convertPTSToTimestamp(uint64_t PTS) {
673799c9682b3776a55d234396aee4a302437150c26Chong Zhang    PTS = recoverPTS(PTS);
674799c9682b3776a55d234396aee4a302437150c26Chong Zhang
675c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber    if (!(mParser->mFlags & TS_TIMESTAMPS_ARE_ABSOLUTE)) {
676c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber        if (!mFirstPTSValid) {
677c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber            mFirstPTSValid = true;
678c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber            mFirstPTS = PTS;
679c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber            PTS = 0;
680c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber        } else if (PTS < mFirstPTS) {
681c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber            PTS = 0;
682c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber        } else {
683c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber            PTS -= mFirstPTS;
684c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber        }
685bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    }
686bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber
68787f2a558dd12043631e12c361abef301bf603140Andreas Huber    int64_t timeUs = (PTS * 100) / 9;
68887f2a558dd12043631e12c361abef301bf603140Andreas Huber
68987f2a558dd12043631e12c361abef301bf603140Andreas Huber    if (mParser->mAbsoluteTimeAnchorUs >= 0ll) {
69087f2a558dd12043631e12c361abef301bf603140Andreas Huber        timeUs += mParser->mAbsoluteTimeAnchorUs;
69187f2a558dd12043631e12c361abef301bf603140Andreas Huber    }
69287f2a558dd12043631e12c361abef301bf603140Andreas Huber
693d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber    if (mParser->mTimeOffsetValid) {
694d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber        timeUs += mParser->mTimeOffsetUs;
695d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber    }
696d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber
69787f2a558dd12043631e12c361abef301bf603140Andreas Huber    return timeUs;
698bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber}
699bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber
7003b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhangvoid ATSParser::Program::updateCasSessions() {
7013b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    for (size_t i = 0; i < mStreams.size(); ++i) {
7023b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        sp<Stream> &stream = mStreams.editValueAt(i);
7033b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        sp<IDescrambler> descrambler;
7043b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        std::vector<uint8_t> sessionId;
705bc7aae4ff7e72e5bf0fa888f946835840a4357bbChong Zhang        int32_t systemId;
706bc7aae4ff7e72e5bf0fa888f946835840a4357bbChong Zhang        if (mParser->mCasManager->getCasInfo(mProgramNumber, stream->pid(),
707bc7aae4ff7e72e5bf0fa888f946835840a4357bbChong Zhang                &systemId, &descrambler, &sessionId)) {
708bc7aae4ff7e72e5bf0fa888f946835840a4357bbChong Zhang            stream->setCasInfo(systemId, descrambler, sessionId);
7093b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        }
7103b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    }
7113b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang}
7123b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
713cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber////////////////////////////////////////////////////////////////////////////////
7143b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhangstatic const size_t kInitialStreamBufferSize = 192 * 1024;
715cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
716bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas HuberATSParser::Stream::Stream(
71787f2a558dd12043631e12c361abef301bf603140Andreas Huber        Program *program,
71887f2a558dd12043631e12c361abef301bf603140Andreas Huber        unsigned elementaryPID,
71987f2a558dd12043631e12c361abef301bf603140Andreas Huber        unsigned streamType,
7203b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        unsigned PCR_PID,
7213b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        int32_t CA_system_ID)
722bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    : mProgram(program),
723bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber      mElementaryPID(elementaryPID),
724cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber      mStreamType(streamType),
72587f2a558dd12043631e12c361abef301bf603140Andreas Huber      mPCR_PID(PCR_PID),
72687f2a558dd12043631e12c361abef301bf603140Andreas Huber      mExpectedContinuityCounter(-1),
7276a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber      mPayloadStarted(false),
728be9634d071e79b72a42a4504f64eda9e2a0bceb8Marco Nelissen      mEOSReached(false),
72990a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber      mPrevPTS(0),
7303b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang      mQueue(NULL),
7313b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang      mScrambled(CA_system_ID >= 0) {
7323b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
7333a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania    mSampleEncrypted =
7343a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania            mStreamType == STREAMTYPE_H264_ENCRYPTED ||
7353a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania            mStreamType == STREAMTYPE_AAC_ENCRYPTED  ||
7363a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania            mStreamType == STREAMTYPE_AC3_ENCRYPTED;
7373a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania
7383a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania    ALOGV("new stream PID 0x%02x, type 0x%02x, scrambled %d, SampleEncrypted: %d",
7393a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania            elementaryPID, streamType, mScrambled, mSampleEncrypted);
7403a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania
7413a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania    uint32_t flags =
7423a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania            (isVideo() && mScrambled) ? ElementaryStreamQueue::kFlag_ScrambledData :
7433a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania            (mSampleEncrypted) ? ElementaryStreamQueue::kFlag_SampleEncryptedData :
7443a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania            0;
7453b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
7463b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    ElementaryStreamQueue::Mode mode = ElementaryStreamQueue::INVALID;
7473b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
748386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    switch (mStreamType) {
749386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        case STREAMTYPE_H264:
7503a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania        case STREAMTYPE_H264_ENCRYPTED:
7513b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            mode = ElementaryStreamQueue::H264;
7523b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            flags |= (mProgram->parserFlags() & ALIGNED_VIDEO_DATA) ?
7533b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                    ElementaryStreamQueue::kFlag_AlignedData : 0;
754386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            break;
7553b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
7566e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        case STREAMTYPE_MPEG2_AUDIO_ADTS:
7573a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania        case STREAMTYPE_AAC_ENCRYPTED:
7583b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            mode = ElementaryStreamQueue::AAC;
759386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            break;
7603b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
761386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        case STREAMTYPE_MPEG1_AUDIO:
762386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        case STREAMTYPE_MPEG2_AUDIO:
7633b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            mode = ElementaryStreamQueue::MPEG_AUDIO;
764386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            break;
765386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
766386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        case STREAMTYPE_MPEG1_VIDEO:
767386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        case STREAMTYPE_MPEG2_VIDEO:
7683b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            mode = ElementaryStreamQueue::MPEG_VIDEO;
769386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            break;
770386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
771386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        case STREAMTYPE_MPEG4_VIDEO:
7723b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            mode = ElementaryStreamQueue::MPEG4_VIDEO;
773386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            break;
774386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
7759bf32f06e8971c1d3eb4fc5edd74b69557f97212Chong Zhang        case STREAMTYPE_LPCM_AC3:
776d3c079ae9859011d118f94616d0069c2987013edChangwan Ryu        case STREAMTYPE_AC3:
7773a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania        case STREAMTYPE_AC3_ENCRYPTED:
7783b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            mode = ElementaryStreamQueue::AC3;
779d3c079ae9859011d118f94616d0069c2987013edChangwan Ryu            break;
780d3c079ae9859011d118f94616d0069c2987013edChangwan Ryu
7810852843d304006e3ab333081fddda13b07193de8Robert Shih        case STREAMTYPE_METADATA:
7823b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            mode = ElementaryStreamQueue::METADATA;
7830852843d304006e3ab333081fddda13b07193de8Robert Shih            break;
7840852843d304006e3ab333081fddda13b07193de8Robert Shih
785386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        default:
7863b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            ALOGE("stream PID 0x%02x has invalid stream type 0x%02x",
7873b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                    elementaryPID, streamType);
7883b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            return;
789386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    }
790386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
7913b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    mQueue = new ElementaryStreamQueue(mode, flags);
79218ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber
79318ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber    if (mQueue != NULL) {
7943a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania        if (mSampleAesKeyItem != NULL) {
7953a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania            mQueue->signalNewSampleAesKey(mSampleAesKeyItem);
7963a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania        }
7973a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania
7983b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        ensureBufferCapacity(kInitialStreamBufferSize);
7993b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
8003b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        if (mScrambled && (isAudio() || isVideo())) {
8013b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            // Set initial format to scrambled
8023b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            sp<MetaData> meta = new MetaData();
8033b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            meta->setCString(kKeyMIMEType,
8043b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                    isAudio() ? MEDIA_MIMETYPE_AUDIO_SCRAMBLED
8053b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                              : MEDIA_MIMETYPE_VIDEO_SCRAMBLED);
806bc7aae4ff7e72e5bf0fa888f946835840a4357bbChong Zhang            // for MediaExtractor.CasInfo
807bc7aae4ff7e72e5bf0fa888f946835840a4357bbChong Zhang            meta->setInt32(kKeyCASystemID, CA_system_ID);
8083b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            mSource = new AnotherPacketSource(meta);
8093b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        }
81018ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber    }
811cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
812cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
813cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas HuberATSParser::Stream::~Stream() {
814386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    delete mQueue;
815386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    mQueue = NULL;
816cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
817cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
818d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhangbool ATSParser::Stream::ensureBufferCapacity(size_t neededSize) {
8193b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    if (mBuffer != NULL && mBuffer->capacity() >= neededSize) {
820d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang        return true;
8213b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    }
8223b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
8233b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    ALOGV("ensureBufferCapacity: current size %zu, new size %zu, scrambled %d",
8243b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            mBuffer == NULL ? 0 : mBuffer->capacity(), neededSize, mScrambled);
8253b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
8263b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    sp<ABuffer> newBuffer, newScrambledBuffer;
8273b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    sp<IMemory> newMem;
8283b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    sp<MemoryDealer> newDealer;
8293b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    if (mScrambled) {
8303b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        size_t alignment = MemoryDealer::getAllocationAlignment();
8313b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        neededSize = (neededSize + (alignment - 1)) & ~(alignment - 1);
8323b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        // Align to multiples of 64K.
8333b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        neededSize = (neededSize + 65535) & ~65535;
8343b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        newDealer = new MemoryDealer(neededSize, "ATSParser");
8353b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        newMem = newDealer->allocate(neededSize);
8363b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        newScrambledBuffer = new ABuffer(newMem->pointer(), newMem->size());
8373b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
8383b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        if (mDescrambledBuffer != NULL) {
8393b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            memcpy(newScrambledBuffer->data(),
8403b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                    mDescrambledBuffer->data(), mDescrambledBuffer->size());
8413b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            newScrambledBuffer->setRange(0, mDescrambledBuffer->size());
8423b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        } else {
8433b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            newScrambledBuffer->setRange(0, 0);
8443b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        }
8453b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        mMem = newMem;
8463b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        mDealer = newDealer;
8473b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        mDescrambledBuffer = newScrambledBuffer;
848d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang
849d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang        ssize_t offset;
850d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang        size_t size;
851d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang        sp<IMemoryHeap> heap = newMem->getMemory(&offset, &size);
852d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang        if (heap == NULL) {
853d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang            return false;
854d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang        }
855d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang        native_handle_t* nativeHandle = native_handle_create(1, 0);
856d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang        if (!nativeHandle) {
857d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang            ALOGE("[stream %d] failed to create native handle", mElementaryPID);
858d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang            return false;
859d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang        }
860d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang        nativeHandle->data[0] = heap->getHeapID();
861d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang        mDescramblerSrcBuffer.heapBase = hidl_memory("ashmem",
862d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang                hidl_handle(nativeHandle), heap->getSize());
863d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang        mDescramblerSrcBuffer.offset = (uint64_t) offset;
864d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang        mDescramblerSrcBuffer.size = (uint64_t) size;
865d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang
866d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang        ALOGD("[stream %d] created shared buffer for descrambling, offset %zd, size %zu",
867d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang                mElementaryPID, offset, size);
8683b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    } else {
8693b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        // Align to multiples of 64K.
8703b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        neededSize = (neededSize + 65535) & ~65535;
8713b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    }
8723b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
8733b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    newBuffer = new ABuffer(neededSize);
8743b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    if (mBuffer != NULL) {
8753b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        memcpy(newBuffer->data(), mBuffer->data(), mBuffer->size());
8763b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        newBuffer->setRange(0, mBuffer->size());
8773b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    } else {
8783b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        newBuffer->setRange(0, 0);
8793b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    }
8803b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    mBuffer = newBuffer;
881d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang    return true;
8823b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang}
8833b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
8845403129e2a2f44620f2ac8109889e5a61be08732Andreas Huberstatus_t ATSParser::Stream::parse(
88587f2a558dd12043631e12c361abef301bf603140Andreas Huber        unsigned continuity_counter,
8863b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        unsigned payload_unit_start_indicator,
8873b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        unsigned transport_scrambling_control,
8883b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        unsigned random_access_indicator,
8893b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        ABitReader *br, SyncEvent *event) {
89018ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber    if (mQueue == NULL) {
8915403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber        return OK;
89218ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber    }
89318ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber
89487f2a558dd12043631e12c361abef301bf603140Andreas Huber    if (mExpectedContinuityCounter >= 0
89587f2a558dd12043631e12c361abef301bf603140Andreas Huber            && (unsigned)mExpectedContinuityCounter != continuity_counter) {
89687f2a558dd12043631e12c361abef301bf603140Andreas Huber        ALOGI("discontinuity on stream pid 0x%04x", mElementaryPID);
89787f2a558dd12043631e12c361abef301bf603140Andreas Huber
89887f2a558dd12043631e12c361abef301bf603140Andreas Huber        mPayloadStarted = false;
8999558f6dd733dc450270f38b9a139d384d273ce0aWei Jia        mPesStartOffsets.clear();
90087f2a558dd12043631e12c361abef301bf603140Andreas Huber        mBuffer->setRange(0, 0);
9013b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        mSubSamples.clear();
90287f2a558dd12043631e12c361abef301bf603140Andreas Huber        mExpectedContinuityCounter = -1;
90387f2a558dd12043631e12c361abef301bf603140Andreas Huber
90494a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber#if 0
90594a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber        // Uncomment this if you'd rather see no corruption whatsoever on
90694a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber        // screen and suspend updates until we come across another IDR frame.
90794a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber
90894a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber        if (mStreamType == STREAMTYPE_H264) {
90994a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber            ALOGI("clearing video queue");
91094a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber            mQueue->clear(true /* clearFormat */);
91194a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber        }
91294a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber#endif
91394a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber
91466830855846db5c211c2da6c055ca9b4167e8974Chong Zhang        if (!payload_unit_start_indicator) {
91566830855846db5c211c2da6c055ca9b4167e8974Chong Zhang            return OK;
91666830855846db5c211c2da6c055ca9b4167e8974Chong Zhang        }
91787f2a558dd12043631e12c361abef301bf603140Andreas Huber    }
91887f2a558dd12043631e12c361abef301bf603140Andreas Huber
91987f2a558dd12043631e12c361abef301bf603140Andreas Huber    mExpectedContinuityCounter = (continuity_counter + 1) & 0x0f;
92087f2a558dd12043631e12c361abef301bf603140Andreas Huber
921cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    if (payload_unit_start_indicator) {
922540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim        off64_t offset = (event != NULL) ? event->getOffset() : 0;
923cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        if (mPayloadStarted) {
924cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            // Otherwise we run the danger of receiving the trailing bytes
925cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            // of a PES packet that we never saw the start of and assuming
926cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            // we have a a complete PES packet.
927cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
928540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim            status_t err = flush(event);
9295403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber
9305403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber            if (err != OK) {
93165959d34fdab8319dbf765be5fbf7ff8051eedf1Wonsik Kim                ALOGW("Error (%08x) happened while flushing; we simply discard "
93265959d34fdab8319dbf765be5fbf7ff8051eedf1Wonsik Kim                      "the PES packet and continue.", err);
9335403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber            }
934cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        }
935cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
936cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        mPayloadStarted = true;
937b08d83e972ba8cb08a6e361d5cdaf97857bcf21fWei Jia        // There should be at most 2 elements in |mPesStartOffsets|.
938b08d83e972ba8cb08a6e361d5cdaf97857bcf21fWei Jia        while (mPesStartOffsets.size() >= 2) {
939b08d83e972ba8cb08a6e361d5cdaf97857bcf21fWei Jia            mPesStartOffsets.erase(mPesStartOffsets.begin());
940b08d83e972ba8cb08a6e361d5cdaf97857bcf21fWei Jia        }
9419558f6dd733dc450270f38b9a139d384d273ce0aWei Jia        mPesStartOffsets.push_back(offset);
942cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
943cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
944cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    if (!mPayloadStarted) {
9455403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber        return OK;
946cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
947cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
948cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    size_t payloadSizeBits = br->numBitsLeft();
949e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim    if (payloadSizeBits % 8 != 0u) {
950e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        ALOGE("Wrong value");
951e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        return BAD_VALUE;
952e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim    }
953cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
9543e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber    size_t neededSize = mBuffer->size() + payloadSizeBits / 8;
955d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang    if (!ensureBufferCapacity(neededSize)) {
956d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang        return NO_MEMORY;
957d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang    }
958cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
959cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    memcpy(mBuffer->data() + mBuffer->size(), br->data(), payloadSizeBits / 8);
960cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    mBuffer->setRange(0, mBuffer->size() + payloadSizeBits / 8);
9615403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber
9623b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    if (mScrambled) {
9633b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        mSubSamples.push_back({payloadSizeBits / 8,
9643b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                 transport_scrambling_control, random_access_indicator});
9653b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    }
9663b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
9675403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber    return OK;
968cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
969cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
9706e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huberbool ATSParser::Stream::isVideo() const {
9716e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    switch (mStreamType) {
9726e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        case STREAMTYPE_H264:
9733a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania        case STREAMTYPE_H264_ENCRYPTED:
9746e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        case STREAMTYPE_MPEG1_VIDEO:
9756e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        case STREAMTYPE_MPEG2_VIDEO:
9766e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        case STREAMTYPE_MPEG4_VIDEO:
9776e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber            return true;
9786e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
9796e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        default:
9806e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber            return false;
9816e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    }
9826e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber}
9836e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
9846e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huberbool ATSParser::Stream::isAudio() const {
9856e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    switch (mStreamType) {
9866e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        case STREAMTYPE_MPEG1_AUDIO:
9876e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        case STREAMTYPE_MPEG2_AUDIO:
9886e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        case STREAMTYPE_MPEG2_AUDIO_ADTS:
9899bf32f06e8971c1d3eb4fc5edd74b69557f97212Chong Zhang        case STREAMTYPE_LPCM_AC3:
990d3c079ae9859011d118f94616d0069c2987013edChangwan Ryu        case STREAMTYPE_AC3:
9913a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania        case STREAMTYPE_AAC_ENCRYPTED:
9923a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania        case STREAMTYPE_AC3_ENCRYPTED:
9936e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber            return true;
9946e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
9956e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        default:
9966e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber            return false;
9976e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    }
9986e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber}
9996e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
10000852843d304006e3ab333081fddda13b07193de8Robert Shihbool ATSParser::Stream::isMeta() const {
10010852843d304006e3ab333081fddda13b07193de8Robert Shih    if (mStreamType == STREAMTYPE_METADATA) {
10020852843d304006e3ab333081fddda13b07193de8Robert Shih        return true;
10030852843d304006e3ab333081fddda13b07193de8Robert Shih    }
10040852843d304006e3ab333081fddda13b07193de8Robert Shih    return false;
10050852843d304006e3ab333081fddda13b07193de8Robert Shih}
10060852843d304006e3ab333081fddda13b07193de8Robert Shih
100732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Hubervoid ATSParser::Stream::signalDiscontinuity(
100832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        DiscontinuityType type, const sp<AMessage> &extra) {
10090389cc09f7b90f155a8942a0d2e1925cad1dbe2dMarco Nelissen    mExpectedContinuityCounter = -1;
10100389cc09f7b90f155a8942a0d2e1925cad1dbe2dMarco Nelissen
101118ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber    if (mQueue == NULL) {
101218ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber        return;
101318ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber    }
101418ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber
10152a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    mPayloadStarted = false;
10169558f6dd733dc450270f38b9a139d384d273ce0aWei Jia    mPesStartOffsets.clear();
1017aabbdc7401ae24a4199f12a283985deb648673c0Robert Shih    mEOSReached = false;
10182a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    mBuffer->setRange(0, 0);
10193b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    mSubSamples.clear();
10202a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber
10216e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    bool clearFormat = false;
10226e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    if (isAudio()) {
10236e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        if (type & DISCONTINUITY_AUDIO_FORMAT) {
10246e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber            clearFormat = true;
10256e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        }
10266e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    } else {
10276e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        if (type & DISCONTINUITY_VIDEO_FORMAT) {
10286e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber            clearFormat = true;
10296e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        }
10306e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    }
1031f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
10326e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    mQueue->clear(clearFormat);
103332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
10346e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    if (type & DISCONTINUITY_TIME) {
10356e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        uint64_t resumeAtPTS;
10366e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        if (extra != NULL
10376e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                && extra->findInt64(
103815d02f84351eaca14099bde11cfbf6f124bea71fDongwon Kang                    kATSParserKeyResumeAtPTS,
10396e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    (int64_t *)&resumeAtPTS)) {
10406e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber            int64_t resumeAtMediaTimeUs =
10416e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                mProgram->convertPTSToTimestamp(resumeAtPTS);
104232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
1043c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia            extra->setInt64("resume-at-mediaTimeUs", resumeAtMediaTimeUs);
1044e332a9181cf6a3155ed1a0fd2afc212ccb1f2753Andreas Huber        }
10456e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    }
1046f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
10476e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    if (mSource != NULL) {
10483b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        sp<MetaData> meta = mSource->getFormat();
10493b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        const char* mime;
10503b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        if (clearFormat && meta != NULL && meta->findCString(kKeyMIMEType, &mime)
10513b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                && (!strncasecmp(mime, MEDIA_MIMETYPE_AUDIO_SCRAMBLED, 15)
10523b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                 || !strncasecmp(mime, MEDIA_MIMETYPE_VIDEO_SCRAMBLED, 15))){
10533b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            mSource->clear();
10543b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        } else {
10553b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            mSource->queueDiscontinuity(type, extra, true);
10563b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        }
1057bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    }
1058f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
1059bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber
1060f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ATSParser::Stream::signalEOS(status_t finalResult) {
1061f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (mSource != NULL) {
1062f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        mSource->signalEOS(finalResult);
10632a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    }
1064be9634d071e79b72a42a4504f64eda9e2a0bceb8Marco Nelissen    mEOSReached = true;
1065540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    flush(NULL);
10662a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber}
10672a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber
1068540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kimstatus_t ATSParser::Stream::parsePES(ABitReader *br, SyncEvent *event) {
10693b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    const uint8_t *basePtr = br->data();
10703b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
1071cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned packet_startcode_prefix = br->getBits(24);
1072cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
10733856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("packet_startcode_prefix = 0x%08x", packet_startcode_prefix);
1074cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1075386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    if (packet_startcode_prefix != 1) {
10763856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("Supposedly payload_unit_start=1 unit does not start "
1077386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber             "with startcode.");
10785403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber
10795403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber        return ERROR_MALFORMED;
1080386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    }
1081386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
1082cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned stream_id = br->getBits(8);
10833856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("stream_id = 0x%02x", stream_id);
1084cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1085cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned PES_packet_length = br->getBits(16);
10863856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("PES_packet_length = %u", PES_packet_length);
1087cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1088cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    if (stream_id != 0xbc  // program_stream_map
1089cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            && stream_id != 0xbe  // padding_stream
1090cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            && stream_id != 0xbf  // private_stream_2
1091cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            && stream_id != 0xf0  // ECM
1092cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            && stream_id != 0xf1  // EMM
1093cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            && stream_id != 0xff  // program_stream_directory
1094cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            && stream_id != 0xf2  // DSMCC
1095cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            && stream_id != 0xf8) {  // H.222.1 type E
1096e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        if (br->getBits(2) != 2u) {
1097e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            return ERROR_MALFORMED;
1098e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        }
1099cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
11003b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        unsigned PES_scrambling_control = br->getBits(2);
11013b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        ALOGV("PES_scrambling_control = %u", PES_scrambling_control);
11023b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
11036e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber        MY_LOGV("PES_priority = %u", br->getBits(1));
11046e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber        MY_LOGV("data_alignment_indicator = %u", br->getBits(1));
11056e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber        MY_LOGV("copyright = %u", br->getBits(1));
11066e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber        MY_LOGV("original_or_copy = %u", br->getBits(1));
1107cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1108cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned PTS_DTS_flags = br->getBits(2);
11093856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("PTS_DTS_flags = %u", PTS_DTS_flags);
1110cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1111cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned ESCR_flag = br->getBits(1);
11123856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("ESCR_flag = %u", ESCR_flag);
1113cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1114cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned ES_rate_flag = br->getBits(1);
11153856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("ES_rate_flag = %u", ES_rate_flag);
1116cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1117cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned DSM_trick_mode_flag = br->getBits(1);
11183856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("DSM_trick_mode_flag = %u", DSM_trick_mode_flag);
1119cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1120cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned additional_copy_info_flag = br->getBits(1);
11213856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("additional_copy_info_flag = %u", additional_copy_info_flag);
1122cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
11236e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber        MY_LOGV("PES_CRC_flag = %u", br->getBits(1));
11246e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber        MY_LOGV("PES_extension_flag = %u", br->getBits(1));
1125cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1126cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned PES_header_data_length = br->getBits(8);
11273856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("PES_header_data_length = %u", PES_header_data_length);
1128cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1129cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned optional_bytes_remaining = PES_header_data_length;
1130cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1131cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        uint64_t PTS = 0, DTS = 0;
1132cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1133cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        if (PTS_DTS_flags == 2 || PTS_DTS_flags == 3) {
1134e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            if (optional_bytes_remaining < 5u) {
1135e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                return ERROR_MALFORMED;
1136e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            }
1137cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
11386456ae745e919085c5024f784aaa2703f9695f98David Yeh            if (br->getBits(4) != PTS_DTS_flags) {
11396456ae745e919085c5024f784aaa2703f9695f98David Yeh                return ERROR_MALFORMED;
11406456ae745e919085c5024f784aaa2703f9695f98David Yeh            }
1141cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            PTS = ((uint64_t)br->getBits(3)) << 30;
1142e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            if (br->getBits(1) != 1u) {
1143e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                return ERROR_MALFORMED;
1144e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            }
1145cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            PTS |= ((uint64_t)br->getBits(15)) << 15;
1146e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            if (br->getBits(1) != 1u) {
1147e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                return ERROR_MALFORMED;
1148e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            }
1149cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            PTS |= br->getBits(15);
1150e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            if (br->getBits(1) != 1u) {
1151e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                return ERROR_MALFORMED;
1152e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            }
1153cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1154b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross            ALOGV("PTS = 0x%016" PRIx64 " (%.2f)", PTS, PTS / 90000.0);
1155cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1156cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            optional_bytes_remaining -= 5;
1157cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1158cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            if (PTS_DTS_flags == 3) {
1159e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                if (optional_bytes_remaining < 5u) {
1160e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                    return ERROR_MALFORMED;
1161e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                }
1162cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1163e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                if (br->getBits(4) != 1u) {
1164e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                    return ERROR_MALFORMED;
1165e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                }
1166cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1167cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber                DTS = ((uint64_t)br->getBits(3)) << 30;
1168e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                if (br->getBits(1) != 1u) {
1169e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                    return ERROR_MALFORMED;
1170e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                }
1171cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber                DTS |= ((uint64_t)br->getBits(15)) << 15;
1172e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                if (br->getBits(1) != 1u) {
1173e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                    return ERROR_MALFORMED;
1174e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                }
1175cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber                DTS |= br->getBits(15);
1176e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                if (br->getBits(1) != 1u) {
1177e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                    return ERROR_MALFORMED;
1178e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                }
1179cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1180b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross                ALOGV("DTS = %" PRIu64, DTS);
1181cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1182cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber                optional_bytes_remaining -= 5;
1183cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            }
1184cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        }
1185cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1186cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        if (ESCR_flag) {
1187e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            if (optional_bytes_remaining < 6u) {
1188e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                return ERROR_MALFORMED;
1189e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            }
1190cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1191cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            br->getBits(2);
1192cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1193cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            uint64_t ESCR = ((uint64_t)br->getBits(3)) << 30;
1194e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            if (br->getBits(1) != 1u) {
1195e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                return ERROR_MALFORMED;
1196e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            }
1197cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            ESCR |= ((uint64_t)br->getBits(15)) << 15;
1198e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            if (br->getBits(1) != 1u) {
1199e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                return ERROR_MALFORMED;
1200e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            }
1201cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            ESCR |= br->getBits(15);
1202e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            if (br->getBits(1) != 1u) {
1203e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                return ERROR_MALFORMED;
1204e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            }
1205cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1206b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross            ALOGV("ESCR = %" PRIu64, ESCR);
12076e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber            MY_LOGV("ESCR_extension = %u", br->getBits(9));
1208cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1209e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            if (br->getBits(1) != 1u) {
1210e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                return ERROR_MALFORMED;
1211e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            }
1212cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1213cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            optional_bytes_remaining -= 6;
1214cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        }
1215cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1216cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        if (ES_rate_flag) {
1217e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            if (optional_bytes_remaining < 3u) {
1218e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                return ERROR_MALFORMED;
1219e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            }
1220cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1221e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            if (br->getBits(1) != 1u) {
1222e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                return ERROR_MALFORMED;
1223e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            }
12246e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber            MY_LOGV("ES_rate = %u", br->getBits(22));
1225e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            if (br->getBits(1) != 1u) {
1226e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                return ERROR_MALFORMED;
1227e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            }
1228cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1229cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            optional_bytes_remaining -= 3;
1230cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        }
1231cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1232cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        br->skipBits(optional_bytes_remaining * 8);
1233cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1234cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        // ES data follows.
12353b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        int32_t pesOffset = br->data() - basePtr;
1236cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1237cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        if (PES_packet_length != 0) {
1238e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            if (PES_packet_length < PES_header_data_length + 3) {
1239e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                return ERROR_MALFORMED;
1240e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            }
1241cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1242cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            unsigned dataLength =
1243cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber                PES_packet_length - 3 - PES_header_data_length;
1244cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
12455403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber            if (br->numBitsLeft() < dataLength * 8) {
124629357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block                ALOGE("PES packet does not carry enough data to contain "
1247b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross                     "payload. (numBitsLeft = %zu, required = %u)",
12485403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber                     br->numBitsLeft(), dataLength * 8);
12495403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber
12505403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber                return ERROR_MALFORMED;
12515403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber            }
12525403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber
12533b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            ALOGV("There's %u bytes of payload, PES_packet_length=%u, offset=%d",
12543b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                    dataLength, PES_packet_length, pesOffset);
12553b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
12560da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber            onPayloadData(
12573b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                    PTS_DTS_flags, PTS, DTS, PES_scrambling_control,
12583b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                    br->data(), dataLength, pesOffset, event);
1259cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1260cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            br->skipBits(dataLength * 8);
1261cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        } else {
12620da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber            onPayloadData(
12633b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                    PTS_DTS_flags, PTS, DTS, PES_scrambling_control,
12643b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                    br->data(), br->numBitsLeft() / 8, pesOffset, event);
12650da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber
1266cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            size_t payloadSizeBits = br->numBitsLeft();
1267e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            if (payloadSizeBits % 8 != 0u) {
1268e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                return ERROR_MALFORMED;
1269e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            }
1270cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
12713b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            ALOGV("There's %zu bytes of payload, offset=%d",
12723b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                    payloadSizeBits / 8, pesOffset);
1273cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        }
1274cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    } else if (stream_id == 0xbe) {  // padding_stream
1275e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        if (PES_packet_length == 0u) {
1276e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            return ERROR_MALFORMED;
1277e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        }
1278cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        br->skipBits(PES_packet_length * 8);
1279cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    } else {
1280e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        if (PES_packet_length == 0u) {
1281e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            return ERROR_MALFORMED;
1282e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        }
1283cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        br->skipBits(PES_packet_length * 8);
1284cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
12855403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber
12865403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber    return OK;
1287cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
1288cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
12893b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhanguint32_t ATSParser::Stream::getPesScramblingControl(
12903b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        ABitReader *br, int32_t *pesOffset) {
12913b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    unsigned packet_startcode_prefix = br->getBits(24);
12923b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
12933b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    ALOGV("packet_startcode_prefix = 0x%08x", packet_startcode_prefix);
12943b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
12953b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    if (packet_startcode_prefix != 1) {
12963b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        ALOGV("unit does not start with startcode.");
12973b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        return 0;
12983b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    }
12993b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
13003b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    if (br->numBitsLeft() < 48) {
13013b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        return 0;
13023b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    }
13033b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
13043b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    unsigned stream_id = br->getBits(8);
13053b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    ALOGV("stream_id = 0x%02x", stream_id);
13063b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
13073b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    br->skipBits(16); // PES_packet_length
13083b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
13093b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    if (stream_id != 0xbc  // program_stream_map
13103b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            && stream_id != 0xbe  // padding_stream
13113b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            && stream_id != 0xbf  // private_stream_2
13123b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            && stream_id != 0xf0  // ECM
13133b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            && stream_id != 0xf1  // EMM
13143b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            && stream_id != 0xff  // program_stream_directory
13153b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            && stream_id != 0xf2  // DSMCC
13163b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            && stream_id != 0xf8) {  // H.222.1 type E
13173b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        if (br->getBits(2) != 2u) {
13183b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            return 0;
13193b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        }
13203b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
13213b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        unsigned PES_scrambling_control = br->getBits(2);
13223b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        ALOGV("PES_scrambling_control = %u", PES_scrambling_control);
13233b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
13243b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        if (PES_scrambling_control == 0) {
13253b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            return 0;
13263b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        }
13273b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
13283b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        br->skipBits(12); // don't care
13293b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
13303b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        unsigned PES_header_data_length = br->getBits(8);
13313b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        ALOGV("PES_header_data_length = %u", PES_header_data_length);
13323b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
13333b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        if (PES_header_data_length * 8 > br->numBitsLeft()) {
13343b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            return 0;
13353b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        }
13363b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
13373b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        *pesOffset = 9 + PES_header_data_length;
13383b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        ALOGD("found PES_scrambling_control=%d, PES offset=%d",
13393b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                PES_scrambling_control, *pesOffset);
13403b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        return PES_scrambling_control;
13413b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    }
13423b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
13433b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    return 0;
13443b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang}
13453b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
13463b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhangstatus_t ATSParser::Stream::flushScrambled(SyncEvent *event) {
13473b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    if (mDescrambler == NULL) {
13483b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        ALOGE("received scrambled packets without descrambler!");
13493b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        return UNKNOWN_ERROR;
13503b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    }
13513b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
13523b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    if (mDescrambledBuffer == NULL || mMem == NULL) {
13533b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        ALOGE("received scrambled packets without shared memory!");
13543b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
13553b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        return UNKNOWN_ERROR;
13563b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    }
13573b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
13583b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    int32_t pesOffset = 0;
13593b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    int32_t descrambleSubSamples = 0, descrambleBytes = 0;
13603b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    uint32_t tsScramblingControl = 0, pesScramblingControl = 0;
13613b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
13623b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    // First, go over subsamples to find TS-level scrambling key id, and
13633b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    // calculate how many subsample we need to descramble (assuming we don't
13643b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    // have PES-level scrambling).
13653b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    for (auto it = mSubSamples.begin(); it != mSubSamples.end(); it++) {
13663b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        if (it->transport_scrambling_mode != 0) {
13673b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            // TODO: handle keyId change, use the first non-zero keyId for now.
13683b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            if (tsScramblingControl == 0) {
13693b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                tsScramblingControl = it->transport_scrambling_mode;
13703b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            }
13713b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        }
13723b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        if (tsScramblingControl == 0 || descrambleSubSamples == 0
13733b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                || !mQueue->isScrambled()) {
13743b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            descrambleSubSamples++;
13753b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            descrambleBytes += it->subSampleSize;
13763b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        }
13773b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    }
13783b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    // If not scrambled at TS-level, check PES-level scrambling
13793b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    if (tsScramblingControl == 0) {
13803b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        ABitReader br(mBuffer->data(), mBuffer->size());
13813b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        pesScramblingControl = getPesScramblingControl(&br, &pesOffset);
13823b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        // If not scrambled at PES-level either, or scrambled at PES-level but
13833b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        // requires output to remain scrambled, we don't need to descramble
13843b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        // anything.
13853b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        if (pesScramblingControl == 0 || mQueue->isScrambled()) {
13863b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            descrambleSubSamples = 0;
13873b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            descrambleBytes = 0;
13883b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        }
13893b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    }
13903b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
13913b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    uint32_t sctrl = tsScramblingControl != 0 ?
13923b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            tsScramblingControl : pesScramblingControl;
13933b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
13943b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    // Perform the 1st pass descrambling if needed
13953b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    if (descrambleBytes > 0) {
13963b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        memcpy(mDescrambledBuffer->data(), mBuffer->data(), descrambleBytes);
13973b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        mDescrambledBuffer->setRange(0, descrambleBytes);
13983b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
1399d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang        hidl_vec<SubSample> subSamples;
1400d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang        subSamples.resize(descrambleSubSamples);
14013b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
14023b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        int32_t i = 0;
14033b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        for (auto it = mSubSamples.begin();
14043b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                it != mSubSamples.end() && i < descrambleSubSamples; it++, i++) {
14053b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            if (it->transport_scrambling_mode != 0 || pesScramblingControl != 0) {
1406d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang                subSamples[i].numBytesOfClearData = 0;
1407d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang                subSamples[i].numBytesOfEncryptedData = it->subSampleSize;
14083b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            } else {
1409d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang                subSamples[i].numBytesOfClearData = it->subSampleSize;
1410d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang                subSamples[i].numBytesOfEncryptedData = 0;
14113b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            }
14123b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        }
1413d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang
1414d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang        uint64_t srcOffset = 0, dstOffset = 0;
14153b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        // If scrambled at PES-level, PES header should be skipped
14163b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        if (pesScramblingControl != 0) {
1417d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang            srcOffset = dstOffset = pesOffset;
1418d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang            subSamples[0].numBytesOfEncryptedData -= pesOffset;
14193b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        }
14203b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
1421d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang        Status status = Status::OK;
1422d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang        uint32_t bytesWritten = 0;
1423d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang        hidl_string detailedError;
1424d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang
1425d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang        DestinationBuffer dstBuffer;
1426d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang        dstBuffer.type = BufferType::SHARED_MEMORY;
1427d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang        dstBuffer.nonsecureMemory = mDescramblerSrcBuffer;
1428d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang
1429d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang        auto returnVoid = mDescrambler->descramble(
1430d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang                (ScramblingControl) sctrl,
1431d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang                subSamples,
1432d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang                mDescramblerSrcBuffer,
1433d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang                srcOffset,
1434d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang                dstBuffer,
1435d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang                dstOffset,
1436d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang                [&status, &bytesWritten, &detailedError] (
1437d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang                        Status _status, uint32_t _bytesWritten,
1438d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang                        const hidl_string& _detailedError) {
1439d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang                    status = _status;
1440d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang                    bytesWritten = _bytesWritten;
1441d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang                    detailedError = _detailedError;
1442d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang                });
1443d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang
1444d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang        if (!returnVoid.isOk()) {
1445d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang            ALOGE("[stream %d] descramble failed, trans=%s",
1446d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang                    mElementaryPID, returnVoid.description().c_str());
14473b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            return UNKNOWN_ERROR;
14483b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        }
14493b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
14503b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        ALOGV("[stream %d] descramble succeeded, %d bytes",
1451d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang                mElementaryPID, bytesWritten);
14523b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        memcpy(mBuffer->data(), mDescrambledBuffer->data(), descrambleBytes);
14533b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    }
14543b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
14553b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    if (mQueue->isScrambled()) {
14563b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        // Queue subSample info for scrambled queue
14573b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        sp<ABuffer> clearSizesBuffer = new ABuffer(mSubSamples.size() * 4);
14583b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        sp<ABuffer> encSizesBuffer = new ABuffer(mSubSamples.size() * 4);
14593b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        int32_t *clearSizePtr = (int32_t*)clearSizesBuffer->data();
14603b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        int32_t *encSizePtr = (int32_t*)encSizesBuffer->data();
14613b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        int32_t isSync = 0;
14623b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        int32_t i = 0;
14633b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        for (auto it = mSubSamples.begin();
14643b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                it != mSubSamples.end(); it++, i++) {
14653b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            if ((it->transport_scrambling_mode == 0
14663b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                    && pesScramblingControl == 0)
14673b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                    || i < descrambleSubSamples) {
14683b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                clearSizePtr[i] = it->subSampleSize;
14693b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                encSizePtr[i] = 0;
14703b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            } else {
14713b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                clearSizePtr[i] = 0;
14723b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                encSizePtr[i] = it->subSampleSize;
14733b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            }
14743b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            isSync |= it->random_access_indicator;
14753b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        }
14763b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        // Pass the original TS subsample size now. The PES header adjust
14773b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        // will be applied when the scrambled AU is dequeued.
14783b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        mQueue->appendScrambledData(
14793b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                mBuffer->data(), mBuffer->size(), sctrl,
14803b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                isSync, clearSizesBuffer, encSizesBuffer);
14813b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    }
14823b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
14833b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    ABitReader br(mBuffer->data(), mBuffer->size());
14843b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    status_t err = parsePES(&br, event);
14853b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
14863b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    if (err != OK) {
14873b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        ALOGE("[stream %d] failed to parse descrambled PES, err=%d",
14883b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                mElementaryPID, err);
14893b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    }
14903b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
14913b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    return err;
14923b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang}
14933b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
14943b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
1495540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kimstatus_t ATSParser::Stream::flush(SyncEvent *event) {
1496f2cecd570c35d3b6422396dd51c0b4202732bceaJaesung Chung    if (mBuffer == NULL || mBuffer->size() == 0) {
14975403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber        return OK;
1498cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
1499cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1500b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross    ALOGV("flushing stream 0x%04x size = %zu", mElementaryPID, mBuffer->size());
1501cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
15023b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    status_t err = OK;
15033b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    if (mScrambled) {
15043b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        err = flushScrambled(event);
15053b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        mSubSamples.clear();
15063b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    } else {
15073b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        ABitReader br(mBuffer->data(), mBuffer->size());
15083b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        err = parsePES(&br, event);
15093b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    }
1510cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1511cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    mBuffer->setRange(0, 0);
15125403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber
15135403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber    return err;
1514cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
1515cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1516cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubervoid ATSParser::Stream::onPayloadData(
151784333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber        unsigned PTS_DTS_flags, uint64_t PTS, uint64_t /* DTS */,
15183b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        unsigned PES_scrambling_control,
15193b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        const uint8_t *data, size_t size,
15203b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        int32_t payloadOffset, SyncEvent *event) {
152190a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber#if 0
152290a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber    ALOGI("payload streamType 0x%02x, PTS = 0x%016llx, dPTS = %lld",
152390a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber          mStreamType,
152490a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber          PTS,
152590a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber          (int64_t)PTS - mPrevPTS);
152690a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber    mPrevPTS = PTS;
152790a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber#endif
152890a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber
15293a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania    ALOGV("onPayloadData mStreamType=0x%02x size: %zu", mStreamType, size);
1530cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
153198a46cf165d8de3779874eba01803bbc485f45b9Andreas Huber    int64_t timeUs = 0ll;  // no presentation timestamp available.
153298a46cf165d8de3779874eba01803bbc485f45b9Andreas Huber    if (PTS_DTS_flags == 2 || PTS_DTS_flags == 3) {
153398a46cf165d8de3779874eba01803bbc485f45b9Andreas Huber        timeUs = mProgram->convertPTSToTimestamp(PTS);
153498a46cf165d8de3779874eba01803bbc485f45b9Andreas Huber    }
153582f7321b03eec1e40af9d681370f754ee0279582Andreas Huber
15363b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    status_t err = mQueue->appendData(
15373b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            data, size, timeUs, payloadOffset, PES_scrambling_control);
1538decd96988e495133e4a1728f612d4c9fdb4d218eAndreas Huber
1539be9634d071e79b72a42a4504f64eda9e2a0bceb8Marco Nelissen    if (mEOSReached) {
1540be9634d071e79b72a42a4504f64eda9e2a0bceb8Marco Nelissen        mQueue->signalEOS();
1541be9634d071e79b72a42a4504f64eda9e2a0bceb8Marco Nelissen    }
1542be9634d071e79b72a42a4504f64eda9e2a0bceb8Marco Nelissen
1543decd96988e495133e4a1728f612d4c9fdb4d218eAndreas Huber    if (err != OK) {
1544decd96988e495133e4a1728f612d4c9fdb4d218eAndreas Huber        return;
1545decd96988e495133e4a1728f612d4c9fdb4d218eAndreas Huber    }
154682f7321b03eec1e40af9d681370f754ee0279582Andreas Huber
15476a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber    sp<ABuffer> accessUnit;
1548540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    bool found = false;
1549386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    while ((accessUnit = mQueue->dequeueAccessUnit()) != NULL) {
15506a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber        if (mSource == NULL) {
1551386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            sp<MetaData> meta = mQueue->getFormat();
155282f7321b03eec1e40af9d681370f754ee0279582Andreas Huber
15536a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber            if (meta != NULL) {
15543856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                ALOGV("Stream PID 0x%08x of type 0x%02x now has data.",
1555386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                     mElementaryPID, mStreamType);
1556386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
1557309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih                const char *mime;
1558309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih                if (meta->findCString(kKeyMIMEType, &mime)
15593b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                        && !strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_AVC)) {
15603b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                    int32_t sync = 0;
15613b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                    if (!accessUnit->meta()->findInt32("isSync", &sync) || !sync) {
15623b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                        continue;
15633b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                    }
1564309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih                }
15656a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber                mSource = new AnotherPacketSource(meta);
15666a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber                mSource->queueAccessUnit(accessUnit);
15673a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania                ALOGV("onPayloadData: created AnotherPacketSource PID 0x%08x of type 0x%02x",
15683a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania                        mElementaryPID, mStreamType);
156982f7321b03eec1e40af9d681370f754ee0279582Andreas Huber            }
1570386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        } else if (mQueue->getFormat() != NULL) {
15712a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber            // After a discontinuity we invalidate the queue's format
15722a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber            // and won't enqueue any access units to the source until
15732a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber            // the queue has reestablished the new format.
15745bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
15755bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            if (mSource->getFormat() == NULL) {
1576386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                mSource->setFormat(mQueue->getFormat());
15775bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            }
15786a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber            mSource->queueAccessUnit(accessUnit);
157982f7321b03eec1e40af9d681370f754ee0279582Andreas Huber        }
1580540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim
1581b08d83e972ba8cb08a6e361d5cdaf97857bcf21fWei Jia        // Every access unit has a pesStartOffset queued in |mPesStartOffsets|.
1582b08d83e972ba8cb08a6e361d5cdaf97857bcf21fWei Jia        off64_t pesStartOffset = -1;
1583b08d83e972ba8cb08a6e361d5cdaf97857bcf21fWei Jia        if (!mPesStartOffsets.empty()) {
1584b08d83e972ba8cb08a6e361d5cdaf97857bcf21fWei Jia            pesStartOffset = *mPesStartOffsets.begin();
1585b08d83e972ba8cb08a6e361d5cdaf97857bcf21fWei Jia            mPesStartOffsets.erase(mPesStartOffsets.begin());
1586b08d83e972ba8cb08a6e361d5cdaf97857bcf21fWei Jia        }
1587b08d83e972ba8cb08a6e361d5cdaf97857bcf21fWei Jia
1588b08d83e972ba8cb08a6e361d5cdaf97857bcf21fWei Jia        if (pesStartOffset >= 0 && (event != NULL) && !found && mQueue->getFormat() != NULL) {
1589540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim            int32_t sync = 0;
1590540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim            if (accessUnit->meta()->findInt32("isSync", &sync) && sync) {
1591540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim                int64_t timeUs;
1592540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim                if (accessUnit->meta()->findInt64("timeUs", &timeUs)) {
1593540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim                    found = true;
159482e147049625a4cfdcb228a1de7efda594d446c9Robert Shih                    event->init(pesStartOffset, mSource, timeUs, getSourceType());
1595540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim                }
1596540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim            }
1597540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim        }
159882f7321b03eec1e40af9d681370f754ee0279582Andreas Huber    }
159982f7321b03eec1e40af9d681370f754ee0279582Andreas Huber}
160082f7321b03eec1e40af9d681370f754ee0279582Andreas Huber
160182e147049625a4cfdcb228a1de7efda594d446c9Robert ShihATSParser::SourceType ATSParser::Stream::getSourceType() {
160282e147049625a4cfdcb228a1de7efda594d446c9Robert Shih    if (isVideo()) {
160382e147049625a4cfdcb228a1de7efda594d446c9Robert Shih        return VIDEO;
160482e147049625a4cfdcb228a1de7efda594d446c9Robert Shih    } else if (isAudio()) {
160582e147049625a4cfdcb228a1de7efda594d446c9Robert Shih        return AUDIO;
160682e147049625a4cfdcb228a1de7efda594d446c9Robert Shih    } else if (isMeta()) {
160782e147049625a4cfdcb228a1de7efda594d446c9Robert Shih        return META;
160882e147049625a4cfdcb228a1de7efda594d446c9Robert Shih    }
160982e147049625a4cfdcb228a1de7efda594d446c9Robert Shih    return NUM_SOURCE_TYPES;
161082e147049625a4cfdcb228a1de7efda594d446c9Robert Shih}
161182e147049625a4cfdcb228a1de7efda594d446c9Robert Shih
1612cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubersp<MediaSource> ATSParser::Stream::getSource(SourceType type) {
1613386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    switch (type) {
1614386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        case VIDEO:
1615386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        {
16166e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber            if (isVideo()) {
1617386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                return mSource;
1618386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            }
1619386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            break;
1620386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        }
1621386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
1622386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        case AUDIO:
1623386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        {
16246e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber            if (isAudio()) {
1625386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                return mSource;
1626386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            }
1627386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            break;
1628386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        }
1629386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
16300852843d304006e3ab333081fddda13b07193de8Robert Shih        case META:
16310852843d304006e3ab333081fddda13b07193de8Robert Shih        {
16320852843d304006e3ab333081fddda13b07193de8Robert Shih            if (isMeta()) {
16330852843d304006e3ab333081fddda13b07193de8Robert Shih                return mSource;
16340852843d304006e3ab333081fddda13b07193de8Robert Shih            }
16350852843d304006e3ab333081fddda13b07193de8Robert Shih            break;
16360852843d304006e3ab333081fddda13b07193de8Robert Shih        }
16370852843d304006e3ab333081fddda13b07193de8Robert Shih
1638386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        default:
1639386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            break;
1640cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
1641cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1642cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    return NULL;
1643cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
1644cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1645bc7aae4ff7e72e5bf0fa888f946835840a4357bbChong Zhangvoid ATSParser::Stream::setCasInfo(
1646bc7aae4ff7e72e5bf0fa888f946835840a4357bbChong Zhang        int32_t systemId, const sp<IDescrambler> &descrambler,
16473b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        const std::vector<uint8_t> &sessionId) {
16483b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    if (mSource != NULL && mDescrambler == NULL && descrambler != NULL) {
16493b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        signalDiscontinuity(DISCONTINUITY_FORMAT_ONLY, NULL);
16503b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        mDescrambler = descrambler;
16513b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        if (mQueue->isScrambled()) {
1652bc7aae4ff7e72e5bf0fa888f946835840a4357bbChong Zhang            mQueue->setCasInfo(systemId, sessionId);
16533b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        }
16543b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    }
16553b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang}
16563b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
1657cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber////////////////////////////////////////////////////////////////////////////////
1658cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1659c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas HuberATSParser::ATSParser(uint32_t flags)
166087f2a558dd12043631e12c361abef301bf603140Andreas Huber    : mFlags(flags),
166187f2a558dd12043631e12c361abef301bf603140Andreas Huber      mAbsoluteTimeAnchorUs(-1ll),
1662d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber      mTimeOffsetValid(false),
1663d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber      mTimeOffsetUs(0ll),
1664d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang      mLastRecoveredPTS(-1ll),
166587f2a558dd12043631e12c361abef301bf603140Andreas Huber      mNumTSPacketsParsed(0),
166687f2a558dd12043631e12c361abef301bf603140Andreas Huber      mNumPCRs(0) {
16678dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    mPSISections.add(0 /* PID */, new PSISection);
16683b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    mCasManager = new CasManager();
1669cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
1670cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1671cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas HuberATSParser::~ATSParser() {
1672cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
1673cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1674540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kimstatus_t ATSParser::feedTSPacket(const void *data, size_t size,
1675540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim        SyncEvent *event) {
1676e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim    if (size != kTSPacketSize) {
1677e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        ALOGE("Wrong TS packet size");
1678e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        return BAD_VALUE;
1679e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim    }
1680cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1681cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    ABitReader br((const uint8_t *)data, kTSPacketSize);
1682540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim    return parseTS(&br, event);
1683cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
1684cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
16853b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhangstatus_t ATSParser::setMediaCas(const sp<ICas> &cas) {
16863b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    status_t err = mCasManager->setMediaCas(cas);
16873b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    if (err != OK) {
16883b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        return err;
16893b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    }
16903b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    for (size_t i = 0; i < mPrograms.size(); ++i) {
16913b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        mPrograms.editItemAt(i)->updateCasSessions();
16923b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    }
16933b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    return OK;
16943b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang}
16953b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
169632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Hubervoid ATSParser::signalDiscontinuity(
169732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        DiscontinuityType type, const sp<AMessage> &extra) {
1698b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber    int64_t mediaTimeUs;
1699d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang    if ((type & DISCONTINUITY_TIME) && extra != NULL) {
170015d02f84351eaca14099bde11cfbf6f124bea71fDongwon Kang        if (extra->findInt64(kATSParserKeyMediaTimeUs, &mediaTimeUs)) {
1701d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang            mAbsoluteTimeAnchorUs = mediaTimeUs;
1702d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang        }
1703d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang        if ((mFlags & TS_TIMESTAMPS_ARE_ABSOLUTE)
1704d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang                && extra->findInt64(
170515d02f84351eaca14099bde11cfbf6f124bea71fDongwon Kang                    kATSParserKeyRecentMediaTimeUs, &mediaTimeUs)) {
1706d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang            if (mAbsoluteTimeAnchorUs >= 0ll) {
1707d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang                mediaTimeUs -= mAbsoluteTimeAnchorUs;
1708d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang            }
1709d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang            if (mTimeOffsetValid) {
1710d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang                mediaTimeUs -= mTimeOffsetUs;
1711d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang            }
1712d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang            mLastRecoveredPTS = (mediaTimeUs * 9) / 100;
1713d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang        }
1714b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber    } else if (type == DISCONTINUITY_ABSOLUTE_TIME) {
171587f2a558dd12043631e12c361abef301bf603140Andreas Huber        int64_t timeUs;
1716e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        if (!extra->findInt64("timeUs", &timeUs)) {
1717e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            ALOGE("timeUs not found");
1718e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            return;
1719e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        }
172087f2a558dd12043631e12c361abef301bf603140Andreas Huber
1721e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        if (!mPrograms.empty()) {
1722e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            ALOGE("mPrograms is not empty");
1723e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            return;
1724e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        }
172587f2a558dd12043631e12c361abef301bf603140Andreas Huber        mAbsoluteTimeAnchorUs = timeUs;
172687f2a558dd12043631e12c361abef301bf603140Andreas Huber        return;
1727d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber    } else if (type == DISCONTINUITY_TIME_OFFSET) {
1728d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber        int64_t offset;
1729e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        if (!extra->findInt64("offset", &offset)) {
1730e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            ALOGE("offset not found");
1731e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            return;
1732e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        }
1733d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber
1734d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber        mTimeOffsetValid = true;
1735d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber        mTimeOffsetUs = offset;
1736d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber        return;
173787f2a558dd12043631e12c361abef301bf603140Andreas Huber    }
173887f2a558dd12043631e12c361abef301bf603140Andreas Huber
1739f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    for (size_t i = 0; i < mPrograms.size(); ++i) {
174032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        mPrograms.editItemAt(i)->signalDiscontinuity(type, extra);
1741f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
1742f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
1743f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1744f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ATSParser::signalEOS(status_t finalResult) {
1745e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim    if (finalResult == (status_t) OK) {
1746e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        ALOGE("finalResult not OK");
1747e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        return;
1748e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim    }
1749f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
17502a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    for (size_t i = 0; i < mPrograms.size(); ++i) {
1751f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        mPrograms.editItemAt(i)->signalEOS(finalResult);
17522a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    }
17532a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber}
17542a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber
1755cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubervoid ATSParser::parseProgramAssociationTable(ABitReader *br) {
1756cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned table_id = br->getBits(8);
17573856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("  table_id = %u", table_id);
17586456ae745e919085c5024f784aaa2703f9695f98David Yeh    if (table_id != 0x00u) {
17596456ae745e919085c5024f784aaa2703f9695f98David Yeh        ALOGE("PAT data error!");
17606456ae745e919085c5024f784aaa2703f9695f98David Yeh        return ;
17616456ae745e919085c5024f784aaa2703f9695f98David Yeh    }
1762cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned section_syntax_indictor = br->getBits(1);
17633856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("  section_syntax_indictor = %u", section_syntax_indictor);
1764cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1765e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim    br->skipBits(1);  // '0'
17666e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  reserved = %u", br->getBits(2));
1767cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1768cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned section_length = br->getBits(12);
17693856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("  section_length = %u", section_length);
1770cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
17716e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  transport_stream_id = %u", br->getBits(16));
17726e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  reserved = %u", br->getBits(2));
17736e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  version_number = %u", br->getBits(5));
17746e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  current_next_indicator = %u", br->getBits(1));
17756e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  section_number = %u", br->getBits(8));
17766e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  last_section_number = %u", br->getBits(8));
1777cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1778cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    size_t numProgramBytes = (section_length - 5 /* header */ - 4 /* crc */);
1779cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1780cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    for (size_t i = 0; i < numProgramBytes / 4; ++i) {
1781cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        unsigned program_number = br->getBits(16);
17823856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("    program_number = %u", program_number);
1783cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
17846e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber        MY_LOGV("    reserved = %u", br->getBits(3));
1785cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1786cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        if (program_number == 0) {
17876e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber            MY_LOGV("    network_PID = 0x%04x", br->getBits(13));
1788cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        } else {
1789cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            unsigned programMapPID = br->getBits(13);
1790cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
17913856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("    program_map_PID = 0x%04x", programMapPID);
1792cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1793386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            bool found = false;
1794386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            for (size_t index = 0; index < mPrograms.size(); ++index) {
1795386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                const sp<Program> &program = mPrograms.itemAt(index);
1796386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
1797386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                if (program->number() == program_number) {
1798386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                    program->updateProgramMapPID(programMapPID);
1799386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                    found = true;
1800386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                    break;
1801386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                }
1802386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            }
1803386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
1804386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            if (!found) {
1805386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber                mPrograms.push(
1806d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang                        new Program(this, program_number, programMapPID, mLastRecoveredPTS));
18073a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania                if (mSampleAesKeyItem != NULL) {
18083a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania                    mPrograms.top()->signalNewSampleAesKey(mSampleAesKeyItem);
18093a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania                }
1810386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            }
18118dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
18128dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            if (mPSISections.indexOfKey(programMapPID) < 0) {
18138dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                mPSISections.add(programMapPID, new PSISection);
18148dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            }
1815cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        }
1816cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
1817cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
18186e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("  CRC = 0x%08x", br->getBits(32));
1819cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
1820cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
182106528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huberstatus_t ATSParser::parsePID(
1822cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        ABitReader *br, unsigned PID,
182387f2a558dd12043631e12c361abef301bf603140Andreas Huber        unsigned continuity_counter,
1824540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim        unsigned payload_unit_start_indicator,
18253b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        unsigned transport_scrambling_control,
18263b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        unsigned random_access_indicator,
1827540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim        SyncEvent *event) {
18288dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    ssize_t sectionIndex = mPSISections.indexOfKey(PID);
18298dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
18308dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    if (sectionIndex >= 0) {
18314b4bb11b8747adeb2efe56c7df4ab6803dd7db41Andreas Huber        sp<PSISection> section = mPSISections.valueAt(sectionIndex);
18328dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
1833cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        if (payload_unit_start_indicator) {
18346456ae745e919085c5024f784aaa2703f9695f98David Yeh            if (!section->isEmpty()) {
18359bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                ALOGW("parsePID encounters payload_unit_start_indicator when section is not empty");
18369bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang                section->clear();
18376456ae745e919085c5024f784aaa2703f9695f98David Yeh            }
18388dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
1839cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            unsigned skip = br->getBits(8);
18409ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim            section->setSkipBytes(skip + 1);  // skip filler bytes + pointer field itself
1841cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            br->skipBits(skip * 8);
1842cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        }
18438dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
1844e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        if (br->numBitsLeft() % 8 != 0) {
1845e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            return ERROR_MALFORMED;
1846e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        }
18478dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        status_t err = section->append(br->data(), br->numBitsLeft() / 8);
18488dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
18498dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        if (err != OK) {
18508dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            return err;
18518dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        }
18528dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
18538dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        if (!section->isComplete()) {
18548dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            return OK;
18558dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        }
18568dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
18579ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim        if (!section->isCRCOkay()) {
18589ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim            return BAD_VALUE;
18599ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim        }
18608dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        ABitReader sectionBits(section->data(), section->size());
18618dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
18628dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        if (PID == 0) {
18638dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            parseProgramAssociationTable(&sectionBits);
18648dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        } else {
18658dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            bool handled = false;
18668dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            for (size_t i = 0; i < mPrograms.size(); ++i) {
18678dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                status_t err;
18688dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                if (!mPrograms.editItemAt(i)->parsePSISection(
18698dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                            PID, &sectionBits, &err)) {
18708dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                    continue;
18718dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                }
18728dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
18738dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                if (err != OK) {
18748dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                    return err;
18758dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                }
18768dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
18778dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                handled = true;
18788dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                break;
18798dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            }
18808dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
18818dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            if (!handled) {
18828dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber                mPSISections.removeItem(PID);
18834b4bb11b8747adeb2efe56c7df4ab6803dd7db41Andreas Huber                section.clear();
18848dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            }
18858dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        }
18868dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
18874b4bb11b8747adeb2efe56c7df4ab6803dd7db41Andreas Huber        if (section != NULL) {
18884b4bb11b8747adeb2efe56c7df4ab6803dd7db41Andreas Huber            section->clear();
18894b4bb11b8747adeb2efe56c7df4ab6803dd7db41Andreas Huber        }
18908dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
189106528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber        return OK;
1892cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
1893cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1894cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    bool handled = false;
1895cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    for (size_t i = 0; i < mPrograms.size(); ++i) {
189606528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber        status_t err;
1897cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        if (mPrograms.editItemAt(i)->parsePID(
18983b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                    PID, continuity_counter,
18993b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                    payload_unit_start_indicator,
19003b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                    transport_scrambling_control,
19013b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                    random_access_indicator,
1902540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim                    br, &err, event)) {
190306528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber            if (err != OK) {
190406528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber                return err;
190506528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber            }
190606528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber
1907cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            handled = true;
1908cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber            break;
1909cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        }
1910cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
1911cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1912cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    if (!handled) {
19133b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        handled = mCasManager->parsePID(br, PID);
19143b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    }
19153b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
19163b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    if (!handled) {
19173856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("PID 0x%04x not handled.", PID);
1918cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
191906528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber
192006528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber    return OK;
1921cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
1922cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
19233b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhangstatus_t ATSParser::parseAdaptationField(
19243b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        ABitReader *br, unsigned PID, unsigned *random_access_indicator) {
19253b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    *random_access_indicator = 0;
1926cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned adaptation_field_length = br->getBits(8);
192787f2a558dd12043631e12c361abef301bf603140Andreas Huber
1928cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    if (adaptation_field_length > 0) {
19298a1fa1ebc2375c9dcaca2b78918c6740fff2ca74Jaesung Chung        if (adaptation_field_length * 8 > br->numBitsLeft()) {
19308a1fa1ebc2375c9dcaca2b78918c6740fff2ca74Jaesung Chung            ALOGV("Adaptation field should be included in a single TS packet.");
19318a1fa1ebc2375c9dcaca2b78918c6740fff2ca74Jaesung Chung            return ERROR_MALFORMED;
19328a1fa1ebc2375c9dcaca2b78918c6740fff2ca74Jaesung Chung        }
19338a1fa1ebc2375c9dcaca2b78918c6740fff2ca74Jaesung Chung
193487f2a558dd12043631e12c361abef301bf603140Andreas Huber        unsigned discontinuity_indicator = br->getBits(1);
193587f2a558dd12043631e12c361abef301bf603140Andreas Huber
193687f2a558dd12043631e12c361abef301bf603140Andreas Huber        if (discontinuity_indicator) {
193787f2a558dd12043631e12c361abef301bf603140Andreas Huber            ALOGV("PID 0x%04x: discontinuity_indicator = 1 (!!!)", PID);
193887f2a558dd12043631e12c361abef301bf603140Andreas Huber        }
193987f2a558dd12043631e12c361abef301bf603140Andreas Huber
19403b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        *random_access_indicator = br->getBits(1);
19413b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        if (*random_access_indicator) {
19423b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            ALOGV("PID 0x%04x: random_access_indicator = 1", PID);
19433b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        }
19443b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
19453b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        unsigned elementary_stream_priority_indicator = br->getBits(1);
19463b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        if (elementary_stream_priority_indicator) {
19473b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            ALOGV("PID 0x%04x: elementary_stream_priority_indicator = 1", PID);
19483b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        }
19493b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
195087f2a558dd12043631e12c361abef301bf603140Andreas Huber        unsigned PCR_flag = br->getBits(1);
195187f2a558dd12043631e12c361abef301bf603140Andreas Huber
195287f2a558dd12043631e12c361abef301bf603140Andreas Huber        size_t numBitsRead = 4;
195387f2a558dd12043631e12c361abef301bf603140Andreas Huber
195487f2a558dd12043631e12c361abef301bf603140Andreas Huber        if (PCR_flag) {
1955e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            if (adaptation_field_length * 8 < 52) {
1956e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim                return ERROR_MALFORMED;
1957e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim            }
195887f2a558dd12043631e12c361abef301bf603140Andreas Huber            br->skipBits(4);
195987f2a558dd12043631e12c361abef301bf603140Andreas Huber            uint64_t PCR_base = br->getBits(32);
196087f2a558dd12043631e12c361abef301bf603140Andreas Huber            PCR_base = (PCR_base << 1) | br->getBits(1);
196187f2a558dd12043631e12c361abef301bf603140Andreas Huber
196287f2a558dd12043631e12c361abef301bf603140Andreas Huber            br->skipBits(6);
196387f2a558dd12043631e12c361abef301bf603140Andreas Huber            unsigned PCR_ext = br->getBits(9);
196487f2a558dd12043631e12c361abef301bf603140Andreas Huber
196587f2a558dd12043631e12c361abef301bf603140Andreas Huber            // The number of bytes from the start of the current
196687f2a558dd12043631e12c361abef301bf603140Andreas Huber            // MPEG2 transport stream packet up and including
196787f2a558dd12043631e12c361abef301bf603140Andreas Huber            // the final byte of this PCR_ext field.
196887f2a558dd12043631e12c361abef301bf603140Andreas Huber            size_t byteOffsetFromStartOfTSPacket =
196987f2a558dd12043631e12c361abef301bf603140Andreas Huber                (188 - br->numBitsLeft() / 8);
197087f2a558dd12043631e12c361abef301bf603140Andreas Huber
197187f2a558dd12043631e12c361abef301bf603140Andreas Huber            uint64_t PCR = PCR_base * 300 + PCR_ext;
197287f2a558dd12043631e12c361abef301bf603140Andreas Huber
1973b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross            ALOGV("PID 0x%04x: PCR = 0x%016" PRIx64 " (%.2f)",
197487f2a558dd12043631e12c361abef301bf603140Andreas Huber                  PID, PCR, PCR / 27E6);
197587f2a558dd12043631e12c361abef301bf603140Andreas Huber
197687f2a558dd12043631e12c361abef301bf603140Andreas Huber            // The number of bytes received by this parser up to and
197787f2a558dd12043631e12c361abef301bf603140Andreas Huber            // including the final byte of this PCR_ext field.
197819cec89f8b05fd05f8034ee1a4cd39ee09c33f02Marco Nelissen            uint64_t byteOffsetFromStart =
197919cec89f8b05fd05f8034ee1a4cd39ee09c33f02Marco Nelissen                uint64_t(mNumTSPacketsParsed) * 188 + byteOffsetFromStartOfTSPacket;
198087f2a558dd12043631e12c361abef301bf603140Andreas Huber
198187f2a558dd12043631e12c361abef301bf603140Andreas Huber            for (size_t i = 0; i < mPrograms.size(); ++i) {
198287f2a558dd12043631e12c361abef301bf603140Andreas Huber                updatePCR(PID, PCR, byteOffsetFromStart);
198387f2a558dd12043631e12c361abef301bf603140Andreas Huber            }
198487f2a558dd12043631e12c361abef301bf603140Andreas Huber
198587f2a558dd12043631e12c361abef301bf603140Andreas Huber            numBitsRead += 52;
198687f2a558dd12043631e12c361abef301bf603140Andreas Huber        }
198787f2a558dd12043631e12c361abef301bf603140Andreas Huber
198887f2a558dd12043631e12c361abef301bf603140Andreas Huber        br->skipBits(adaptation_field_length * 8 - numBitsRead);
1989cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
1990e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim    return OK;
1991cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
1992cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1993540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kimstatus_t ATSParser::parseTS(ABitReader *br, SyncEvent *event) {
19943856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("---");
1995cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
1996cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned sync_byte = br->getBits(8);
19976456ae745e919085c5024f784aaa2703f9695f98David Yeh    if (sync_byte != 0x47u) {
19986456ae745e919085c5024f784aaa2703f9695f98David Yeh        ALOGE("[error] parseTS: return error as sync_byte=0x%x", sync_byte);
19996456ae745e919085c5024f784aaa2703f9695f98David Yeh        return BAD_VALUE;
20006456ae745e919085c5024f784aaa2703f9695f98David Yeh    }
2001cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
200252668ca838e1869676ff95e7388f93ec1858b1e9Andreas Huber    if (br->getBits(1)) {  // transport_error_indicator
200352668ca838e1869676ff95e7388f93ec1858b1e9Andreas Huber        // silently ignore.
200452668ca838e1869676ff95e7388f93ec1858b1e9Andreas Huber        return OK;
200552668ca838e1869676ff95e7388f93ec1858b1e9Andreas Huber    }
2006cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
2007cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned payload_unit_start_indicator = br->getBits(1);
20083856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("payload_unit_start_indicator = %u", payload_unit_start_indicator);
2009cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
20106e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    MY_LOGV("transport_priority = %u", br->getBits(1));
2011cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
2012cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned PID = br->getBits(13);
20133856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("PID = 0x%04x", PID);
2014cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
20153b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    unsigned transport_scrambling_control = br->getBits(2);
20163b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    ALOGV("transport_scrambling_control = %u", transport_scrambling_control);
2017cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
2018cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    unsigned adaptation_field_control = br->getBits(2);
20193856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("adaptation_field_control = %u", adaptation_field_control);
2020cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
20210da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber    unsigned continuity_counter = br->getBits(4);
202287f2a558dd12043631e12c361abef301bf603140Andreas Huber    ALOGV("PID = 0x%04x, continuity_counter = %u", PID, continuity_counter);
20230da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber
2024df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block    // ALOGI("PID = 0x%04x, continuity_counter = %u", PID, continuity_counter);
2025cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
202687f2a558dd12043631e12c361abef301bf603140Andreas Huber    status_t err = OK;
202787f2a558dd12043631e12c361abef301bf603140Andreas Huber
20283b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    unsigned random_access_indicator = 0;
2029e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim    if (adaptation_field_control == 2 || adaptation_field_control == 3) {
20303b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        err = parseAdaptationField(br, PID, &random_access_indicator);
2031e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim    }
2032e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim    if (err == OK) {
2033e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        if (adaptation_field_control == 1 || adaptation_field_control == 3) {
2034540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim            err = parsePID(br, PID, continuity_counter,
20353b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                    payload_unit_start_indicator,
20363b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                    transport_scrambling_control,
20373b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                    random_access_indicator,
20383b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang                    event);
2039e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim        }
2040cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
204106528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber
204287f2a558dd12043631e12c361abef301bf603140Andreas Huber    ++mNumTSPacketsParsed;
204387f2a558dd12043631e12c361abef301bf603140Andreas Huber
204487f2a558dd12043631e12c361abef301bf603140Andreas Huber    return err;
2045cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
2046cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
2047cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubersp<MediaSource> ATSParser::getSource(SourceType type) {
20489ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih    sp<MediaSource> firstSourceFound;
2049cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    for (size_t i = 0; i < mPrograms.size(); ++i) {
2050386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        const sp<Program> &program = mPrograms.editItemAt(i);
20519ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih        sp<MediaSource> source = program->getSource(type);
20529ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih        if (source == NULL) {
2053386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber            continue;
2054386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        }
20559ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih        if (firstSourceFound == NULL) {
20569ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih            firstSourceFound = source;
20579ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih        }
20589ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih        // Prefer programs with both audio/video
20599ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih        switch (type) {
20609ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih            case VIDEO: {
20619ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih                if (program->hasSource(AUDIO)) {
20629ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih                    return source;
20639ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih                }
20649ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih                break;
20659ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih            }
2066386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber
20679ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih            case AUDIO: {
20689ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih                if (program->hasSource(VIDEO)) {
20699ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih                    return source;
20709ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih                }
20719ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih                break;
20729ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih            }
2073cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
20749ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih            default:
20759ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih                return source;
2076cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber        }
2077cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber    }
2078cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
20799ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih    return firstSourceFound;
2080cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}
2081cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber
2082bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shihbool ATSParser::hasSource(SourceType type) const {
2083bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih    for (size_t i = 0; i < mPrograms.size(); ++i) {
2084bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih        const sp<Program> &program = mPrograms.itemAt(i);
2085bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih        if (program->hasSource(type)) {
2086bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih            return true;
2087bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih        }
2088bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih    }
2089bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih
2090bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih    return false;
2091bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih}
2092bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih
209343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huberbool ATSParser::PTSTimeDeltaEstablished() {
209443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    if (mPrograms.isEmpty()) {
209543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        return false;
209643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    }
209743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
209843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    return mPrograms.editItemAt(0)->PTSTimeDeltaEstablished();
209943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber}
210043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
210182e147049625a4cfdcb228a1de7efda594d446c9Robert Shihint64_t ATSParser::getFirstPTSTimeUs() {
210282e147049625a4cfdcb228a1de7efda594d446c9Robert Shih    for (size_t i = 0; i < mPrograms.size(); ++i) {
210382e147049625a4cfdcb228a1de7efda594d446c9Robert Shih        sp<ATSParser::Program> program = mPrograms.itemAt(i);
210482e147049625a4cfdcb228a1de7efda594d446c9Robert Shih        if (program->PTSTimeDeltaEstablished()) {
210582e147049625a4cfdcb228a1de7efda594d446c9Robert Shih            return (program->firstPTS() * 100) / 9;
210682e147049625a4cfdcb228a1de7efda594d446c9Robert Shih        }
210782e147049625a4cfdcb228a1de7efda594d446c9Robert Shih    }
210882e147049625a4cfdcb228a1de7efda594d446c9Robert Shih    return -1;
210982e147049625a4cfdcb228a1de7efda594d446c9Robert Shih}
211082e147049625a4cfdcb228a1de7efda594d446c9Robert Shih
2111c9fa35cf7c9c11a8acb77128db1a6a13f1befe3cChad Brubaker__attribute__((no_sanitize("integer")))
211287f2a558dd12043631e12c361abef301bf603140Andreas Hubervoid ATSParser::updatePCR(
211319cec89f8b05fd05f8034ee1a4cd39ee09c33f02Marco Nelissen        unsigned /* PID */, uint64_t PCR, uint64_t byteOffsetFromStart) {
211419cec89f8b05fd05f8034ee1a4cd39ee09c33f02Marco Nelissen    ALOGV("PCR 0x%016" PRIx64 " @ %" PRIx64, PCR, byteOffsetFromStart);
211587f2a558dd12043631e12c361abef301bf603140Andreas Huber
211687f2a558dd12043631e12c361abef301bf603140Andreas Huber    if (mNumPCRs == 2) {
211787f2a558dd12043631e12c361abef301bf603140Andreas Huber        mPCR[0] = mPCR[1];
211887f2a558dd12043631e12c361abef301bf603140Andreas Huber        mPCRBytes[0] = mPCRBytes[1];
211987f2a558dd12043631e12c361abef301bf603140Andreas Huber        mSystemTimeUs[0] = mSystemTimeUs[1];
212087f2a558dd12043631e12c361abef301bf603140Andreas Huber        mNumPCRs = 1;
212187f2a558dd12043631e12c361abef301bf603140Andreas Huber    }
212287f2a558dd12043631e12c361abef301bf603140Andreas Huber
212387f2a558dd12043631e12c361abef301bf603140Andreas Huber    mPCR[mNumPCRs] = PCR;
212487f2a558dd12043631e12c361abef301bf603140Andreas Huber    mPCRBytes[mNumPCRs] = byteOffsetFromStart;
212587f2a558dd12043631e12c361abef301bf603140Andreas Huber    mSystemTimeUs[mNumPCRs] = ALooper::GetNowUs();
212687f2a558dd12043631e12c361abef301bf603140Andreas Huber
212787f2a558dd12043631e12c361abef301bf603140Andreas Huber    ++mNumPCRs;
212887f2a558dd12043631e12c361abef301bf603140Andreas Huber
212987f2a558dd12043631e12c361abef301bf603140Andreas Huber    if (mNumPCRs == 2) {
2130c9fa35cf7c9c11a8acb77128db1a6a13f1befe3cChad Brubaker        /* Unsigned overflow here */
213187f2a558dd12043631e12c361abef301bf603140Andreas Huber        double transportRate =
213287f2a558dd12043631e12c361abef301bf603140Andreas Huber            (mPCRBytes[1] - mPCRBytes[0]) * 27E6 / (mPCR[1] - mPCR[0]);
213387f2a558dd12043631e12c361abef301bf603140Andreas Huber
213487f2a558dd12043631e12c361abef301bf603140Andreas Huber        ALOGV("transportRate = %.2f bytes/sec", transportRate);
213587f2a558dd12043631e12c361abef301bf603140Andreas Huber    }
213687f2a558dd12043631e12c361abef301bf603140Andreas Huber}
213787f2a558dd12043631e12c361abef301bf603140Andreas Huber
21388dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber////////////////////////////////////////////////////////////////////////////////
21398dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
21409ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim
21419ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim// CRC32 used for PSI section. The table was generated by following command:
21429ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim// $ python pycrc.py --model crc-32-mpeg --algorithm table-driven --generate c
21439ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim// Visit http://www.tty1.net/pycrc/index_en.html for more details.
21449ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kimuint32_t ATSParser::PSISection::CRC_TABLE[] = {
21459ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9,
21469ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x130476dc, 0x17c56b6b, 0x1a864db2, 0x1e475005,
21479ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61,
21489ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd,
21499ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9,
21509ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75,
21519ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011,
21529ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x791d4014, 0x7ddc5da3, 0x709f7b7a, 0x745e66cd,
21539ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039,
21549ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5,
21559ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xbe2b5b58, 0xbaea46ef, 0xb7a96036, 0xb3687d81,
21569ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d,
21579ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49,
21589ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95,
21599ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1,
21609ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d,
21619ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x34867077, 0x30476dc0, 0x3d044b19, 0x39c556ae,
21629ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072,
21639ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16,
21649ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca,
21659ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde,
21669ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02,
21679ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x5e9f46bf, 0x5a5e5b08, 0x571d7dd1, 0x53dc6066,
21689ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,
21699ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e,
21709ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xbfa1b04b, 0xbb60adfc, 0xb6238b25, 0xb2e29692,
21719ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6,
21729ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a,
21739ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e,
21749ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2,
21759ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686,
21769ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xd5b88683, 0xd1799b34, 0xdc3abded, 0xd8fba05a,
21779ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637,
21789ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb,
21799ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f,
21809ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53,
21819ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47,
21829ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x36194d42, 0x32d850f5, 0x3f9b762c, 0x3b5a6b9b,
21839ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff,
21849ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623,
21859ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xf12f560e, 0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7,
21869ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b,
21879ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f,
21889ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3,
21899ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7,
21909ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b,
21919ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x9b3660c6, 0x9ff77d71, 0x92b45ba8, 0x9675461f,
21929ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3,
21939ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640,
21949ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c,
21959ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8,
21969ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24,
21979ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x119b4be9, 0x155a565e, 0x18197087, 0x1cd86d30,
21989ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec,
21999ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088,
22009ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x2497d08d, 0x2056cd3a, 0x2d15ebe3, 0x29d4f654,
22019ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0,
22029ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c,
22039ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18,
22049ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4,
22059ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0,
22069ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0x9abc8bd5, 0x9e7d9662, 0x933eb0bb, 0x97ffad0c,
22079ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668,
22089ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4
22099ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    };
22109ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim
22119ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk KimATSParser::PSISection::PSISection() :
22129ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    mSkipBytes(0) {
22138dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber}
22148dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
22158dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas HuberATSParser::PSISection::~PSISection() {
22168dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber}
22178dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
22188dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberstatus_t ATSParser::PSISection::append(const void *data, size_t size) {
22198dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    if (mBuffer == NULL || mBuffer->size() + size > mBuffer->capacity()) {
22208dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        size_t newCapacity =
22218dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            (mBuffer == NULL) ? size : mBuffer->capacity() + size;
22228dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
22238dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        newCapacity = (newCapacity + 1023) & ~1023;
22248dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
22258dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        sp<ABuffer> newBuffer = new ABuffer(newCapacity);
22268dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
22278dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        if (mBuffer != NULL) {
22288dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            memcpy(newBuffer->data(), mBuffer->data(), mBuffer->size());
22298dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            newBuffer->setRange(0, mBuffer->size());
22308dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        } else {
22318dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber            newBuffer->setRange(0, 0);
22328dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        }
22338dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
22348dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        mBuffer = newBuffer;
22358dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    }
22368dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
22378dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    memcpy(mBuffer->data() + mBuffer->size(), data, size);
22388dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    mBuffer->setRange(0, mBuffer->size() + size);
22398dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
22408dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    return OK;
22418dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber}
22428dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
22439ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kimvoid ATSParser::PSISection::setSkipBytes(uint8_t skip) {
22449ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    mSkipBytes = skip;
22459ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim}
22469ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim
22478dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Hubervoid ATSParser::PSISection::clear() {
22488dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    if (mBuffer != NULL) {
22498dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        mBuffer->setRange(0, 0);
22508dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    }
22519ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    mSkipBytes = 0;
22528dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber}
22538dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
22548dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberbool ATSParser::PSISection::isComplete() const {
22558dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    if (mBuffer == NULL || mBuffer->size() < 3) {
22568dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber        return false;
22578dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    }
22588dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
22598dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    unsigned sectionLength = U16_AT(mBuffer->data() + 1) & 0xfff;
22608dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    return mBuffer->size() >= sectionLength + 3;
22618dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber}
22628dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
22638dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberbool ATSParser::PSISection::isEmpty() const {
22648dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    return mBuffer == NULL || mBuffer->size() == 0;
22658dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber}
22668dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
22678dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberconst uint8_t *ATSParser::PSISection::data() const {
22688dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    return mBuffer == NULL ? NULL : mBuffer->data();
22698dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber}
22708dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
22718dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Hubersize_t ATSParser::PSISection::size() const {
22728dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber    return mBuffer == NULL ? 0 : mBuffer->size();
22738dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber}
22748dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber
22759ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kimbool ATSParser::PSISection::isCRCOkay() const {
22769ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    if (!isComplete()) {
22779ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim        return false;
22789ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    }
22799ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    uint8_t* data = mBuffer->data();
22809ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim
22819ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    // Return true if section_syntax_indicator says no section follows the field section_length.
22829ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    if ((data[1] & 0x80) == 0) {
22839ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim        return true;
22849ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    }
22859ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim
22869ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    unsigned sectionLength = U16_AT(data + 1) & 0xfff;
22879ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    ALOGV("sectionLength %u, skip %u", sectionLength, mSkipBytes);
22889ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim
2289c0c9f50d15f7b9ed539c0c6277296d083f41b293Marco Nelissen
2290c0c9f50d15f7b9ed539c0c6277296d083f41b293Marco Nelissen    if(sectionLength < mSkipBytes) {
2291c0c9f50d15f7b9ed539c0c6277296d083f41b293Marco Nelissen        ALOGE("b/28333006");
2292c0c9f50d15f7b9ed539c0c6277296d083f41b293Marco Nelissen        android_errorWriteLog(0x534e4554, "28333006");
2293c0c9f50d15f7b9ed539c0c6277296d083f41b293Marco Nelissen        return false;
2294c0c9f50d15f7b9ed539c0c6277296d083f41b293Marco Nelissen    }
2295c0c9f50d15f7b9ed539c0c6277296d083f41b293Marco Nelissen
22969ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    // Skip the preceding field present when payload start indicator is on.
22979ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    sectionLength -= mSkipBytes;
22989ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim
22999ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    uint32_t crc = 0xffffffff;
23009ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    for(unsigned i = 0; i < sectionLength + 4 /* crc */; i++) {
23019ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim        uint8_t b = data[i];
23029ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim        int index = ((crc >> 24) ^ (b & 0xff)) & 0xff;
23039ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim        crc = CRC_TABLE[index] ^ (crc << 8);
23049ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    }
23059ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    ALOGV("crc: %08x\n", crc);
23069ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim    return (crc == 0);
23079ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim}
23083a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania
23093a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania// SAMPLE_AES key handling
23103a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania// TODO: Merge these to their respective class after Widevine-HLS
23113a37f3e948b600405e0c70b8a241778fda44168eHassan Shojaniavoid ATSParser::signalNewSampleAesKey(const sp<AMessage> &keyItem) {
23123a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania    ALOGD("signalNewSampleAesKey: %p", keyItem.get());
23133a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania
23143a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania    mSampleAesKeyItem = keyItem;
23153a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania
23163a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania    // a NULL key item will propagate to existing ElementaryStreamQueues
23173a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania    for (size_t i = 0; i < mPrograms.size(); ++i) {
23183a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania        mPrograms[i]->signalNewSampleAesKey(keyItem);
23193a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania    }
23203a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania}
23213a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania
23223a37f3e948b600405e0c70b8a241778fda44168eHassan Shojaniavoid ATSParser::Program::signalNewSampleAesKey(const sp<AMessage> &keyItem) {
23233a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania    ALOGD("Program::signalNewSampleAesKey: %p", keyItem.get());
23243a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania
23253a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania    mSampleAesKeyItem = keyItem;
23263a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania
23273a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania    // a NULL key item will propagate to existing ElementaryStreamQueues
23283a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania    for (size_t i = 0; i < mStreams.size(); ++i) {
23293a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania        mStreams[i]->signalNewSampleAesKey(keyItem);
23303a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania    }
23313a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania}
23323a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania
23333a37f3e948b600405e0c70b8a241778fda44168eHassan Shojaniavoid ATSParser::Stream::signalNewSampleAesKey(const sp<AMessage> &keyItem) {
23343a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania    ALOGD("Stream::signalNewSampleAesKey: 0x%04x size = %zu keyItem: %p",
23353a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania          mElementaryPID, mBuffer->size(), keyItem.get());
23363a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania
23373a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania    // a NULL key item will propagate to existing ElementaryStreamQueues
23383a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania    mSampleAesKeyItem = keyItem;
23393a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania
23403a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania    flush(NULL);
23413a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania    mQueue->signalNewSampleAesKey(keyItem);
23423a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania}
23433a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania
2344cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}  // namespace android
2345