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