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