ATSParser.cpp revision 15d02f84351eaca14099bde11cfbf6f124bea71f
1cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber/* 2cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * Copyright (C) 2010 The Android Open Source Project 3cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * 4cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 5cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * you may not use this file except in compliance with the License. 6cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * You may obtain a copy of the License at 7cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * 8cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 9cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * 10cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * Unless required by applicable law or agreed to in writing, software 11cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 12cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * See the License for the specific language governing permissions and 14cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * limitations under the License. 15cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber */ 16cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 176e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber//#define LOG_NDEBUG 0 186e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber#define LOG_TAG "ATSParser" 196e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber#include <utils/Log.h> 20cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include "ATSParser.h" 21cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include "AnotherPacketSource.h" 223b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang#include "CasManager.h" 236a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber#include "ESQueue.h" 24cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 25d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang#include <android/hardware/cas/native/1.0/IDescrambler.h> 26d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang#include <cutils/native_handle.h> 2785f12e9b9062402d6110df3f7099707912040edbAndreas Huber#include <media/stagefright/foundation/ABitReader.h> 28cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/foundation/ABuffer.h> 29cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/foundation/ADebug.h> 30cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/foundation/AMessage.h> 31607612858f3afad1ade51a098aafa2a41523b5f7Dongwon Kang#include <media/stagefright/foundation/ByteUtils.h> 3215d02f84351eaca14099bde11cfbf6f124bea71fDongwon Kang#include <media/stagefright/foundation/MediaKeys.h> 33d91dc5a0602f54fc0d4d2187f37b5b8169bb62c3Dongwon Kang#include <media/stagefright/foundation/avc_utils.h> 34cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/foundation/hexdump.h> 35cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/MediaDefs.h> 36cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/MediaErrors.h> 37cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/MetaData.h> 3832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber#include <media/IStreamSource.h> 39cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <utils/KeyedVector.h> 409bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang#include <utils/Vector.h> 41cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 42b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross#include <inttypes.h> 43b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross 44cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubernamespace android { 45d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhangusing hardware::hidl_handle; 46d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhangusing hardware::hidl_memory; 47d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhangusing hardware::hidl_string; 48d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhangusing hardware::hidl_vec; 49d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhangusing namespace hardware::cas::V1_0; 50d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhangusing namespace hardware::cas::native::V1_0; 51cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 526e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber// I want the expression "y" evaluated even if verbose logging is off. 536e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber#define MY_LOGV(x, y) \ 543856b090cd04ba5dd4a59a12430ed724d5995909Steve Block do { unsigned tmp = y; ALOGV(x, tmp); } while (0) 556e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber 56cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberstatic const size_t kTSPacketSize = 188; 57cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 58cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberstruct ATSParser::Program : public RefBase { 59d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang Program(ATSParser *parser, unsigned programNumber, unsigned programMapPID, 60d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang int64_t lastRecoveredPTS); 61cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 628dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber bool parsePSISection( 638dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber unsigned pid, ABitReader *br, status_t *err); 648dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 65540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim // Pass to appropriate stream according to pid, and set event if it's a PES 66540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim // with a sync frame. 67540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim // Note that the method itself does not touch event. 68cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber bool parsePID( 6987f2a558dd12043631e12c361abef301bf603140Andreas Huber unsigned pid, unsigned continuity_counter, 7087f2a558dd12043631e12c361abef301bf603140Andreas Huber unsigned payload_unit_start_indicator, 713b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang unsigned transport_scrambling_control, 723b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang unsigned random_access_indicator, 73540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim ABitReader *br, status_t *err, SyncEvent *event); 74cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 7532f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber void signalDiscontinuity( 7632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber DiscontinuityType type, const sp<AMessage> &extra); 7732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 78f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void signalEOS(status_t finalResult); 792a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber 80cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber sp<MediaSource> getSource(SourceType type); 81bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih bool hasSource(SourceType type) const; 82cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 83bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber int64_t convertPTSToTimestamp(uint64_t PTS); 84bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber 8543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber bool PTSTimeDeltaEstablished() const { 8643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber return mFirstPTSValid; 8743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 8843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 89386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber unsigned number() const { return mProgramNumber; } 90386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber 91386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber void updateProgramMapPID(unsigned programMapPID) { 92386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber mProgramMapPID = programMapPID; 93386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber } 94386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber 958dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber unsigned programMapPID() const { 968dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber return mProgramMapPID; 978dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber } 988dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 9987f2a558dd12043631e12c361abef301bf603140Andreas Huber uint32_t parserFlags() const { 10087f2a558dd12043631e12c361abef301bf603140Andreas Huber return mParser->mFlags; 10187f2a558dd12043631e12c361abef301bf603140Andreas Huber } 10287f2a558dd12043631e12c361abef301bf603140Andreas Huber 1033b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang sp<CasManager> casManager() const { 1043b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang return mParser->mCasManager; 1053b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang } 1063b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang 10782e147049625a4cfdcb228a1de7efda594d446c9Robert Shih uint64_t firstPTS() const { 10882e147049625a4cfdcb228a1de7efda594d446c9Robert Shih return mFirstPTS; 10982e147049625a4cfdcb228a1de7efda594d446c9Robert Shih } 11082e147049625a4cfdcb228a1de7efda594d446c9Robert Shih 1113b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang void updateCasSessions(); 1123b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang 1133a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania void signalNewSampleAesKey(const sp<AMessage> &keyItem); 1143a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania 115cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberprivate: 1169bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang struct StreamInfo { 1179bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang unsigned mType; 1189bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang unsigned mPID; 1193b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang int32_t mCASystemId; 1209bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang }; 1219bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang 122f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ATSParser *mParser; 123386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber unsigned mProgramNumber; 124cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned mProgramMapPID; 125cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber KeyedVector<unsigned, sp<Stream> > mStreams; 126bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber bool mFirstPTSValid; 127bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber uint64_t mFirstPTS; 128799c9682b3776a55d234396aee4a302437150c26Chong Zhang int64_t mLastRecoveredPTS; 1293a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania sp<AMessage> mSampleAesKeyItem; 130cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 13106528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber status_t parseProgramMap(ABitReader *br); 132799c9682b3776a55d234396aee4a302437150c26Chong Zhang int64_t recoverPTS(uint64_t PTS_33bit); 1333b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang bool findCADescriptor( 1343b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang ABitReader *br, unsigned infoLength, CADescriptor *caDescriptor); 1359bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang bool switchPIDs(const Vector<StreamInfo> &infos); 136cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 137cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(Program); 138cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}; 139cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 140cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberstruct ATSParser::Stream : public RefBase { 14187f2a558dd12043631e12c361abef301bf603140Andreas Huber Stream(Program *program, 14287f2a558dd12043631e12c361abef301bf603140Andreas Huber unsigned elementaryPID, 14387f2a558dd12043631e12c361abef301bf603140Andreas Huber unsigned streamType, 1443b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang unsigned PCR_PID, 1453b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang int32_t CA_system_ID); 146cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 147bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber unsigned type() const { return mStreamType; } 148bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber unsigned pid() const { return mElementaryPID; } 149bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber void setPID(unsigned pid) { mElementaryPID = pid; } 150bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber 151bc7aae4ff7e72e5bf0fa888f946835840a4357bbChong Zhang void setCasInfo( 152bc7aae4ff7e72e5bf0fa888f946835840a4357bbChong Zhang int32_t systemId, 1533b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang const sp<IDescrambler> &descrambler, 1543b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang const std::vector<uint8_t> &sessionId); 1553b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang 156540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim // Parse the payload and set event when PES with a sync frame is detected. 1579558f6dd733dc450270f38b9a139d384d273ce0aWei Jia // This method knows when a PES starts; so record mPesStartOffsets in that 158540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim // case. 1595403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber status_t parse( 16087f2a558dd12043631e12c361abef301bf603140Andreas Huber unsigned continuity_counter, 161cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned payload_unit_start_indicator, 1623b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang unsigned transport_scrambling_control, 1633b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang unsigned random_access_indicator, 164540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim ABitReader *br, 165540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim SyncEvent *event); 166cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 16732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber void signalDiscontinuity( 16832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber DiscontinuityType type, const sp<AMessage> &extra); 16932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 170f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void signalEOS(status_t finalResult); 1712a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber 17282e147049625a4cfdcb228a1de7efda594d446c9Robert Shih SourceType getSourceType(); 173cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber sp<MediaSource> getSource(SourceType type); 174cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 175bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih bool isAudio() const; 176bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih bool isVideo() const; 1770852843d304006e3ab333081fddda13b07193de8Robert Shih bool isMeta() const; 178bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih 1793a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania void signalNewSampleAesKey(const sp<AMessage> &keyItem); 1803a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania 181cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberprotected: 182cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber virtual ~Stream(); 183cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 184cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberprivate: 1853b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang struct SubSampleInfo { 1863b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang size_t subSampleSize; 1873b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang unsigned transport_scrambling_mode; 1883b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang unsigned random_access_indicator; 1893b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang }; 190bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber Program *mProgram; 191cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned mElementaryPID; 192cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned mStreamType; 19387f2a558dd12043631e12c361abef301bf603140Andreas Huber unsigned mPCR_PID; 19487f2a558dd12043631e12c361abef301bf603140Andreas Huber int32_t mExpectedContinuityCounter; 195cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 196cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber sp<ABuffer> mBuffer; 197cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber sp<AnotherPacketSource> mSource; 198cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber bool mPayloadStarted; 199be9634d071e79b72a42a4504f64eda9e2a0bceb8Marco Nelissen bool mEOSReached; 200cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 20190a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber uint64_t mPrevPTS; 2029558f6dd733dc450270f38b9a139d384d273ce0aWei Jia List<off64_t> mPesStartOffsets; 20390a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber 204386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber ElementaryStreamQueue *mQueue; 2056a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber 2063b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang bool mScrambled; 2073a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania bool mSampleEncrypted; 2083a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania sp<AMessage> mSampleAesKeyItem; 2093b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang sp<IMemory> mMem; 2103b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang sp<MemoryDealer> mDealer; 211d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang hardware::cas::native::V1_0::SharedBuffer mDescramblerSrcBuffer; 2123b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang sp<ABuffer> mDescrambledBuffer; 2133b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang List<SubSampleInfo> mSubSamples; 2143b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang sp<IDescrambler> mDescrambler; 2153b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang 216540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim // Flush accumulated payload if necessary --- i.e. at EOS or at the start of 217540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim // another payload. event is set if the flushed payload is PES with a sync 218540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim // frame. 219540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim status_t flush(SyncEvent *event); 2203b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang 2213b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang // Flush accumulated payload for scrambled streams if necessary --- i.e. at 2223b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang // EOS or at the start of another payload. event is set if the flushed 2233b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang // payload is PES with a sync frame. 2243b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang status_t flushScrambled(SyncEvent *event); 2253b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang 2263b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang // Check if a PES packet is scrambled at PES level. 2273b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang uint32_t getPesScramblingControl(ABitReader *br, int32_t *pesOffset); 2283b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang 229540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim // Strip and parse PES headers and pass remaining payload into onPayload 230540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim // with parsed metadata. event is set if the PES contains a sync frame. 231540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim status_t parsePES(ABitReader *br, SyncEvent *event); 232540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim 233540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim // Feed the payload into mQueue and if a packet is identified, queue it 234540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim // into mSource. If the packet is a sync frame. set event with start offset 235540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim // and timestamp of the packet. 236cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber void onPayloadData( 237cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned PTS_DTS_flags, uint64_t PTS, uint64_t DTS, 2383b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang unsigned PES_scrambling_control, 2393b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang const uint8_t *data, size_t size, 2403b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang int32_t payloadOffset, SyncEvent *event); 2413b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang 2423b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang // Ensure internal buffers can hold specified size, and will re-allocate 2433b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang // as needed. 244d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang bool ensureBufferCapacity(size_t size); 24582f7321b03eec1e40af9d681370f754ee0279582Andreas Huber 246cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(Stream); 247cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}; 248cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 2498dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberstruct ATSParser::PSISection : public RefBase { 2508dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber PSISection(); 2518dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 2528dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber status_t append(const void *data, size_t size); 2539ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim void setSkipBytes(uint8_t skip); 2548dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber void clear(); 2558dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 2568dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber bool isComplete() const; 2578dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber bool isEmpty() const; 2589ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim bool isCRCOkay() const; 2598dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 2608dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber const uint8_t *data() const; 2618dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber size_t size() const; 2628dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 2638dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberprotected: 2648dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber virtual ~PSISection(); 2658dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 2668dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberprivate: 2678dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber sp<ABuffer> mBuffer; 2689ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim uint8_t mSkipBytes; 2699ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim static uint32_t CRC_TABLE[]; 2708dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 2718dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber DISALLOW_EVIL_CONSTRUCTORS(PSISection); 2728dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber}; 2738dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 274540006666b4191cd78391378f1c66c21bcf0c4cdWonsik KimATSParser::SyncEvent::SyncEvent(off64_t offset) 2759558f6dd733dc450270f38b9a139d384d273ce0aWei Jia : mHasReturnedData(false), mOffset(offset), mTimeUs(0) {} 276540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim 277540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kimvoid ATSParser::SyncEvent::init(off64_t offset, const sp<MediaSource> &source, 27882e147049625a4cfdcb228a1de7efda594d446c9Robert Shih int64_t timeUs, SourceType type) { 2799558f6dd733dc450270f38b9a139d384d273ce0aWei Jia mHasReturnedData = true; 280540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim mOffset = offset; 281540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim mMediaSource = source; 282540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim mTimeUs = timeUs; 28382e147049625a4cfdcb228a1de7efda594d446c9Robert Shih mType = type; 284540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim} 285540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim 2869558f6dd733dc450270f38b9a139d384d273ce0aWei Jiavoid ATSParser::SyncEvent::reset() { 2879558f6dd733dc450270f38b9a139d384d273ce0aWei Jia mHasReturnedData = false; 2889558f6dd733dc450270f38b9a139d384d273ce0aWei Jia} 289cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber//////////////////////////////////////////////////////////////////////////////// 290cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 291386d609dc513e838c7e7c4c46c604493ccd560beAndreas HuberATSParser::Program::Program( 292d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang ATSParser *parser, unsigned programNumber, unsigned programMapPID, 293d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang int64_t lastRecoveredPTS) 294f933441648ef6a71dee783d733aac17b9508b452Andreas Huber : mParser(parser), 295386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber mProgramNumber(programNumber), 296f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mProgramMapPID(programMapPID), 297bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber mFirstPTSValid(false), 298799c9682b3776a55d234396aee4a302437150c26Chong Zhang mFirstPTS(0), 299d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang mLastRecoveredPTS(lastRecoveredPTS) { 3003856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("new program number %u", programNumber); 301cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 302cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 3038dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberbool ATSParser::Program::parsePSISection( 3048dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber unsigned pid, ABitReader *br, status_t *err) { 30506528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber *err = OK; 30606528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber 3078dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber if (pid != mProgramMapPID) { 3088dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber return false; 3098dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber } 310cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 3118dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber *err = parseProgramMap(br); 31206528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber 3138dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber return true; 3148dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber} 3158dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 3168dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberbool ATSParser::Program::parsePID( 31787f2a558dd12043631e12c361abef301bf603140Andreas Huber unsigned pid, unsigned continuity_counter, 31887f2a558dd12043631e12c361abef301bf603140Andreas Huber unsigned payload_unit_start_indicator, 3193b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang unsigned transport_scrambling_control, 3203b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang unsigned random_access_indicator, 321540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim ABitReader *br, status_t *err, SyncEvent *event) { 3228dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber *err = OK; 323cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 324cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber ssize_t index = mStreams.indexOfKey(pid); 325cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (index < 0) { 326cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber return false; 327cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 328cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 3295403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber *err = mStreams.editValueAt(index)->parse( 3303b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang continuity_counter, 3313b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang payload_unit_start_indicator, 3323b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang transport_scrambling_control, 3333b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang random_access_indicator, 3343b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang br, event); 335cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 336cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber return true; 337cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 338cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 33932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Hubervoid ATSParser::Program::signalDiscontinuity( 34032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber DiscontinuityType type, const sp<AMessage> &extra) { 341b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber int64_t mediaTimeUs; 342b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber if ((type & DISCONTINUITY_TIME) 343b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber && extra != NULL 344b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber && extra->findInt64( 34515d02f84351eaca14099bde11cfbf6f124bea71fDongwon Kang kATSParserKeyMediaTimeUs, &mediaTimeUs)) { 346b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber mFirstPTSValid = false; 347b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber } 348b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber 3492a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber for (size_t i = 0; i < mStreams.size(); ++i) { 35032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber mStreams.editValueAt(i)->signalDiscontinuity(type, extra); 351f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 352f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 353f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 354f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ATSParser::Program::signalEOS(status_t finalResult) { 355f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (size_t i = 0; i < mStreams.size(); ++i) { 356f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mStreams.editValueAt(i)->signalEOS(finalResult); 3572a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber } 3582a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber} 3592a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber 3609bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhangbool ATSParser::Program::switchPIDs(const Vector<StreamInfo> &infos) { 3619bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang bool success = false; 3629bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang 3639bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang if (mStreams.size() == infos.size()) { 3649bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang // build type->PIDs map for old and new mapping 3659bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang size_t i; 3669bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang KeyedVector<int32_t, Vector<int32_t> > oldType2PIDs, newType2PIDs; 3679bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang for (i = 0; i < mStreams.size(); ++i) { 3689bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang ssize_t index = oldType2PIDs.indexOfKey(mStreams[i]->type()); 3699bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang if (index < 0) { 3709bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang oldType2PIDs.add(mStreams[i]->type(), Vector<int32_t>()); 3719bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang } 3729bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang oldType2PIDs.editValueFor(mStreams[i]->type()).push_back(mStreams[i]->pid()); 3739bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang } 3749bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang for (i = 0; i < infos.size(); ++i) { 3759bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang ssize_t index = newType2PIDs.indexOfKey(infos[i].mType); 3769bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang if (index < 0) { 3779bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang newType2PIDs.add(infos[i].mType, Vector<int32_t>()); 3789bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang } 3799bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang newType2PIDs.editValueFor(infos[i].mType).push_back(infos[i].mPID); 3809bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang } 3819bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang 3829bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang // we can recover if the number of streams for each type hasn't changed 3839bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang if (oldType2PIDs.size() == newType2PIDs.size()) { 3849bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang success = true; 3859bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang for (i = 0; i < oldType2PIDs.size(); ++i) { 3869bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang // KeyedVector is sorted, we just compare key and size of each index 3879bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang if (oldType2PIDs.keyAt(i) != newType2PIDs.keyAt(i) 3889bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang || oldType2PIDs[i].size() != newType2PIDs[i].size()) { 3899bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang success = false; 3909bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang break; 3919bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang } 3929bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang } 3939bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang } 3949bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang 3959bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang if (success) { 3969bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang // save current streams to temp 3979bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang KeyedVector<int32_t, sp<Stream> > temp; 3989bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang for (i = 0; i < mStreams.size(); ++i) { 3999bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang temp.add(mStreams.keyAt(i), mStreams.editValueAt(i)); 4009bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang } 4019bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang 4029bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang mStreams.clear(); 4039bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang for (i = 0; i < temp.size(); ++i) { 4049bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang // The two checks below shouldn't happen, 4059bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang // we already checked above the stream count matches 4069bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang ssize_t index = newType2PIDs.indexOfKey(temp[i]->type()); 407e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (index < 0) { 408e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return false; 409e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 4109bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang Vector<int32_t> &newPIDs = newType2PIDs.editValueAt(index); 411e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (newPIDs.isEmpty()) { 412e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return false; 413e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 4149bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang 4159bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang // get the next PID for temp[i]->type() in the new PID map 4169bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang Vector<int32_t>::iterator it = newPIDs.begin(); 4179bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang 4189bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang // change the PID of the stream, and add it back 4199bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang temp.editValueAt(i)->setPID(*it); 4209bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang mStreams.add(temp[i]->pid(), temp.editValueAt(i)); 4219bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang 4229bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang // removed the used PID 4239bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang newPIDs.erase(it); 4249bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang } 4259bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang } 4269bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang } 4279bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang return success; 4289bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang} 429bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber 4303b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhangbool ATSParser::Program::findCADescriptor( 4313b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang ABitReader *br, unsigned infoLength, 4323b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang ATSParser::CADescriptor *caDescriptor) { 4333b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang bool found = false; 4343b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang while (infoLength > 2) { 4353b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang unsigned descriptor_tag = br->getBits(8); 4363b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang ALOGV(" tag = 0x%02x", descriptor_tag); 4373b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang 4383b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang unsigned descriptor_length = br->getBits(8); 4393b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang ALOGV(" len = %u", descriptor_length); 4403b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang 4413b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang infoLength -= 2; 4423b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang if (descriptor_length > infoLength) { 4433b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang break; 4443b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang } 4453b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang if (descriptor_tag == 9 && descriptor_length >= 4) { 4463b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang found = true; 4473b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang caDescriptor->mSystemID = br->getBits(16); 4483b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang caDescriptor->mPID = br->getBits(16) & 0x1fff; 4493b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang infoLength -= 4; 4503b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang caDescriptor->mPrivateData.assign( 4513b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang br->data(), br->data() + descriptor_length - 4); 4523b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang break; 4533b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang } else { 4543b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang infoLength -= descriptor_length; 4553b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang br->skipBits(descriptor_length * 8); 4563b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang } 4573b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang } 4583b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang br->skipBits(infoLength * 8); 4593b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang return found; 4603b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang} 4613b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang 46206528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huberstatus_t ATSParser::Program::parseProgramMap(ABitReader *br) { 463cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned table_id = br->getBits(8); 4643856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV(" table_id = %u", table_id); 4656456ae745e919085c5024f784aaa2703f9695f98David Yeh if (table_id != 0x02u) { 4666456ae745e919085c5024f784aaa2703f9695f98David Yeh ALOGE("PMT data error!"); 4676456ae745e919085c5024f784aaa2703f9695f98David Yeh return ERROR_MALFORMED; 4686456ae745e919085c5024f784aaa2703f9695f98David Yeh } 4696e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber unsigned section_syntax_indicator = br->getBits(1); 4703856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV(" section_syntax_indicator = %u", section_syntax_indicator); 4716456ae745e919085c5024f784aaa2703f9695f98David Yeh if (section_syntax_indicator != 1u) { 4726456ae745e919085c5024f784aaa2703f9695f98David Yeh ALOGE("PMT data error!"); 4736456ae745e919085c5024f784aaa2703f9695f98David Yeh return ERROR_MALFORMED; 4746456ae745e919085c5024f784aaa2703f9695f98David Yeh } 475cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 476e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim br->skipBits(1); // '0' 4776e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" reserved = %u", br->getBits(2)); 478cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 479cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned section_length = br->getBits(12); 4803856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV(" section_length = %u", section_length); 481cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 4826e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" program_number = %u", br->getBits(16)); 4836e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" reserved = %u", br->getBits(2)); 4846e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" version_number = %u", br->getBits(5)); 4856e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" current_next_indicator = %u", br->getBits(1)); 4866e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" section_number = %u", br->getBits(8)); 4876e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" last_section_number = %u", br->getBits(8)); 4886e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" reserved = %u", br->getBits(3)); 48987f2a558dd12043631e12c361abef301bf603140Andreas Huber 49087f2a558dd12043631e12c361abef301bf603140Andreas Huber unsigned PCR_PID = br->getBits(13); 49187f2a558dd12043631e12c361abef301bf603140Andreas Huber ALOGV(" PCR_PID = 0x%04x", PCR_PID); 49287f2a558dd12043631e12c361abef301bf603140Andreas Huber 4936e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" reserved = %u", br->getBits(4)); 494cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 495cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned program_info_length = br->getBits(12); 4963856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV(" program_info_length = %u", program_info_length); 497cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 4983b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang // descriptors 4993b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang CADescriptor programCA; 5003b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang bool hasProgramCA = findCADescriptor(br, program_info_length, &programCA); 5013b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang if (hasProgramCA && !mParser->mCasManager->addProgram( 5023b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang mProgramNumber, programCA)) { 5033b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang return ERROR_MALFORMED; 5043b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang } 505cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 506bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber Vector<StreamInfo> infos; 507bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber 508cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber // infoBytesRemaining is the number of bytes that make up the 509cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber // variable length section of ES_infos. It does not include the 510cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber // final CRC. 511cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber size_t infoBytesRemaining = section_length - 9 - program_info_length - 4; 512cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 513e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim while (infoBytesRemaining >= 5) { 514cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 515cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned streamType = br->getBits(8); 5163856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV(" stream_type = 0x%02x", streamType); 517cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 5186e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" reserved = %u", br->getBits(3)); 519cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 520cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned elementaryPID = br->getBits(13); 5213856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV(" elementary_PID = 0x%04x", elementaryPID); 522cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 5236e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" reserved = %u", br->getBits(4)); 524cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 525cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned ES_info_length = br->getBits(12); 5263856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV(" ES_info_length = %u", ES_info_length); 527cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 5283b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang CADescriptor streamCA; 5293b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang bool hasStreamCA = findCADescriptor(br, ES_info_length, &streamCA); 5303b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang if (hasStreamCA && !mParser->mCasManager->addStream( 5313b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang mProgramNumber, elementaryPID, streamCA)) { 5323b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang return ERROR_MALFORMED; 533cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 534bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber StreamInfo info; 535bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber info.mType = streamType; 536bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber info.mPID = elementaryPID; 5373b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang info.mCASystemId = hasProgramCA ? programCA.mSystemID : 5383b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang hasStreamCA ? streamCA.mSystemID : -1; 539bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber infos.push(info); 540cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 541cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber infoBytesRemaining -= 5 + ES_info_length; 542cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 543cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 544e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (infoBytesRemaining != 0) { 545e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim ALOGW("Section data remains unconsumed"); 546e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 5476e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" CRC = 0x%08x", br->getBits(32)); 548bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber 549bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber bool PIDsChanged = false; 550bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber for (size_t i = 0; i < infos.size(); ++i) { 551bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber StreamInfo &info = infos.editItemAt(i); 552bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber 553bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber ssize_t index = mStreams.indexOfKey(info.mPID); 554bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber 555bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber if (index >= 0 && mStreams.editValueAt(index)->type() != info.mType) { 556df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block ALOGI("uh oh. stream PIDs have changed."); 557bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber PIDsChanged = true; 558bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber break; 559bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber } 560bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber } 561bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber 562bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber if (PIDsChanged) { 56306528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber#if 0 564df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block ALOGI("before:"); 56506528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber for (size_t i = 0; i < mStreams.size(); ++i) { 56606528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber sp<Stream> stream = mStreams.editValueAt(i); 56706528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber 568df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block ALOGI("PID 0x%08x => type 0x%02x", stream->pid(), stream->type()); 56906528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber } 57006528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber 571df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block ALOGI("after:"); 57206528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber for (size_t i = 0; i < infos.size(); ++i) { 57306528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber StreamInfo &info = infos.editItemAt(i); 57406528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber 575df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block ALOGI("PID 0x%08x => type 0x%02x", info.mPID, info.mType); 57606528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber } 57706528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber#endif 57806528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber 5799bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang // we can recover if number of streams for each type remain the same 5809bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang bool success = switchPIDs(infos); 58106528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber 58206528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber if (!success) { 583df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block ALOGI("Stream PIDs changed and we cannot recover."); 58406528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber return ERROR_MALFORMED; 58506528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber } 586bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber } 587bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber 5883b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang bool isAddingScrambledStream = false; 589bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber for (size_t i = 0; i < infos.size(); ++i) { 590bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber StreamInfo &info = infos.editItemAt(i); 591bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber 5923b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang if (mParser->mCasManager->isCAPid(info.mPID)) { 5933b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang // skip CA streams (EMM/ECM) 5943b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang continue; 5953b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang } 596bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber ssize_t index = mStreams.indexOfKey(info.mPID); 597bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber 598bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber if (index < 0) { 59987f2a558dd12043631e12c361abef301bf603140Andreas Huber sp<Stream> stream = new Stream( 6003b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang this, info.mPID, info.mType, PCR_PID, info.mCASystemId); 60187f2a558dd12043631e12c361abef301bf603140Andreas Huber 6023a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania if (mSampleAesKeyItem != NULL) { 6033a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania stream->signalNewSampleAesKey(mSampleAesKeyItem); 6043a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania } 6053a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania 6063b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang isAddingScrambledStream |= info.mCASystemId >= 0; 607bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber mStreams.add(info.mPID, stream); 608bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber } 609bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber } 61006528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber 6113b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang if (isAddingScrambledStream) { 6123b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang ALOGI("Receiving scrambled streams without descrambler!"); 6133b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang return ERROR_DRM_DECRYPT_UNIT_NOT_INITIALIZED; 6143b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang } 61506528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber return OK; 616cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 617cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 618799c9682b3776a55d234396aee4a302437150c26Chong Zhangint64_t ATSParser::Program::recoverPTS(uint64_t PTS_33bit) { 619799c9682b3776a55d234396aee4a302437150c26Chong Zhang // We only have the lower 33-bit of the PTS. It could overflow within a 620799c9682b3776a55d234396aee4a302437150c26Chong Zhang // reasonable amount of time. To handle the wrap-around, use fancy math 621799c9682b3776a55d234396aee4a302437150c26Chong Zhang // to get an extended PTS that is within [-0xffffffff, 0xffffffff] 622799c9682b3776a55d234396aee4a302437150c26Chong Zhang // of the latest recovered PTS. 6239bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang if (mLastRecoveredPTS < 0ll) { 6249bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang // Use the original 33bit number for 1st frame, the reason is that 6259bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang // if 1st frame wraps to negative that's far away from 0, we could 6269bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang // never start. Only start wrapping around from 2nd frame. 6279bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang mLastRecoveredPTS = static_cast<int64_t>(PTS_33bit); 6289bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang } else { 6299bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang mLastRecoveredPTS = static_cast<int64_t>( 6303728ba367f1e23e652c5539d9488aa0d0d4ec9d7Chad Brubaker ((mLastRecoveredPTS - static_cast<int64_t>(PTS_33bit) + 0x100000000ll) 6319bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang & 0xfffffffe00000000ull) | PTS_33bit); 6329bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang // We start from 0, but recovered PTS could be slightly below 0. 6339bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang // Clamp it to 0 as rest of the pipeline doesn't take negative pts. 6349bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang // (eg. video is read first and starts at 0, but audio starts at 0xfffffff0) 6359bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang if (mLastRecoveredPTS < 0ll) { 6365c9054bc6efc080b265e028f2ebb1abd2a2e3953Chih-Hung Hsieh ALOGI("Clamping negative recovered PTS (%" PRId64 ") to 0", mLastRecoveredPTS); 6379bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang mLastRecoveredPTS = 0ll; 6389bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang } 6399bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang } 6409bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang 6419bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang return mLastRecoveredPTS; 642799c9682b3776a55d234396aee4a302437150c26Chong Zhang} 643799c9682b3776a55d234396aee4a302437150c26Chong Zhang 644cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubersp<MediaSource> ATSParser::Program::getSource(SourceType type) { 645cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber for (size_t i = 0; i < mStreams.size(); ++i) { 646cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber sp<MediaSource> source = mStreams.editValueAt(i)->getSource(type); 647cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (source != NULL) { 6489ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih return source; 649cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 650cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 651cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 652cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber return NULL; 653cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 654cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 655bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shihbool ATSParser::Program::hasSource(SourceType type) const { 656bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih for (size_t i = 0; i < mStreams.size(); ++i) { 657bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih const sp<Stream> &stream = mStreams.valueAt(i); 658bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih if (type == AUDIO && stream->isAudio()) { 659bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih return true; 660bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih } else if (type == VIDEO && stream->isVideo()) { 661bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih return true; 6629ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih } else if (type == META && stream->isMeta()) { 6639ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih return true; 664bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih } 665bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih } 666bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih 667bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih return false; 668bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih} 669bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih 670bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huberint64_t ATSParser::Program::convertPTSToTimestamp(uint64_t PTS) { 671799c9682b3776a55d234396aee4a302437150c26Chong Zhang PTS = recoverPTS(PTS); 672799c9682b3776a55d234396aee4a302437150c26Chong Zhang 673c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber if (!(mParser->mFlags & TS_TIMESTAMPS_ARE_ABSOLUTE)) { 674c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber if (!mFirstPTSValid) { 675c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber mFirstPTSValid = true; 676c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber mFirstPTS = PTS; 677c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber PTS = 0; 678c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber } else if (PTS < mFirstPTS) { 679c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber PTS = 0; 680c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber } else { 681c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber PTS -= mFirstPTS; 682c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber } 683bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber } 684bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber 68587f2a558dd12043631e12c361abef301bf603140Andreas Huber int64_t timeUs = (PTS * 100) / 9; 68687f2a558dd12043631e12c361abef301bf603140Andreas Huber 68787f2a558dd12043631e12c361abef301bf603140Andreas Huber if (mParser->mAbsoluteTimeAnchorUs >= 0ll) { 68887f2a558dd12043631e12c361abef301bf603140Andreas Huber timeUs += mParser->mAbsoluteTimeAnchorUs; 68987f2a558dd12043631e12c361abef301bf603140Andreas Huber } 69087f2a558dd12043631e12c361abef301bf603140Andreas Huber 691d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber if (mParser->mTimeOffsetValid) { 692d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber timeUs += mParser->mTimeOffsetUs; 693d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber } 694d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber 69587f2a558dd12043631e12c361abef301bf603140Andreas Huber return timeUs; 696bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber} 697bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber 6983b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhangvoid ATSParser::Program::updateCasSessions() { 6993b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang for (size_t i = 0; i < mStreams.size(); ++i) { 7003b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang sp<Stream> &stream = mStreams.editValueAt(i); 7013b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang sp<IDescrambler> descrambler; 7023b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang std::vector<uint8_t> sessionId; 703bc7aae4ff7e72e5bf0fa888f946835840a4357bbChong Zhang int32_t systemId; 704bc7aae4ff7e72e5bf0fa888f946835840a4357bbChong Zhang if (mParser->mCasManager->getCasInfo(mProgramNumber, stream->pid(), 705bc7aae4ff7e72e5bf0fa888f946835840a4357bbChong Zhang &systemId, &descrambler, &sessionId)) { 706bc7aae4ff7e72e5bf0fa888f946835840a4357bbChong Zhang stream->setCasInfo(systemId, descrambler, sessionId); 7073b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang } 7083b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang } 7093b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang} 7103b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang 711cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber//////////////////////////////////////////////////////////////////////////////// 7123b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhangstatic const size_t kInitialStreamBufferSize = 192 * 1024; 713cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 714bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas HuberATSParser::Stream::Stream( 71587f2a558dd12043631e12c361abef301bf603140Andreas Huber Program *program, 71687f2a558dd12043631e12c361abef301bf603140Andreas Huber unsigned elementaryPID, 71787f2a558dd12043631e12c361abef301bf603140Andreas Huber unsigned streamType, 7183b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang unsigned PCR_PID, 7193b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang int32_t CA_system_ID) 720bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber : mProgram(program), 721bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber mElementaryPID(elementaryPID), 722cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber mStreamType(streamType), 72387f2a558dd12043631e12c361abef301bf603140Andreas Huber mPCR_PID(PCR_PID), 72487f2a558dd12043631e12c361abef301bf603140Andreas Huber mExpectedContinuityCounter(-1), 7256a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber mPayloadStarted(false), 726be9634d071e79b72a42a4504f64eda9e2a0bceb8Marco Nelissen mEOSReached(false), 72790a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber mPrevPTS(0), 7283b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang mQueue(NULL), 7293b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang mScrambled(CA_system_ID >= 0) { 7303b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang 7313a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania mSampleEncrypted = 7323a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania mStreamType == STREAMTYPE_H264_ENCRYPTED || 7333a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania mStreamType == STREAMTYPE_AAC_ENCRYPTED || 7343a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania mStreamType == STREAMTYPE_AC3_ENCRYPTED; 7353a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania 7363a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania ALOGV("new stream PID 0x%02x, type 0x%02x, scrambled %d, SampleEncrypted: %d", 7373a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania elementaryPID, streamType, mScrambled, mSampleEncrypted); 7383a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania 7393a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania uint32_t flags = 7403a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania (isVideo() && mScrambled) ? ElementaryStreamQueue::kFlag_ScrambledData : 7413a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania (mSampleEncrypted) ? ElementaryStreamQueue::kFlag_SampleEncryptedData : 7423a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania 0; 7433b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang 7443b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang ElementaryStreamQueue::Mode mode = ElementaryStreamQueue::INVALID; 7453b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang 746386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber switch (mStreamType) { 747386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber case STREAMTYPE_H264: 7483a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania case STREAMTYPE_H264_ENCRYPTED: 7493b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang mode = ElementaryStreamQueue::H264; 7503b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang flags |= (mProgram->parserFlags() & ALIGNED_VIDEO_DATA) ? 7513b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang ElementaryStreamQueue::kFlag_AlignedData : 0; 752386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber break; 7533b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang 7546e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber case STREAMTYPE_MPEG2_AUDIO_ADTS: 7553a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania case STREAMTYPE_AAC_ENCRYPTED: 7563b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang mode = ElementaryStreamQueue::AAC; 757386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber break; 7583b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang 759386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber case STREAMTYPE_MPEG1_AUDIO: 760386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber case STREAMTYPE_MPEG2_AUDIO: 7613b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang mode = ElementaryStreamQueue::MPEG_AUDIO; 762386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber break; 763386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber 764386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber case STREAMTYPE_MPEG1_VIDEO: 765386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber case STREAMTYPE_MPEG2_VIDEO: 7663b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang mode = ElementaryStreamQueue::MPEG_VIDEO; 767386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber break; 768386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber 769386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber case STREAMTYPE_MPEG4_VIDEO: 7703b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang mode = ElementaryStreamQueue::MPEG4_VIDEO; 771386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber break; 772386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber 7739bf32f06e8971c1d3eb4fc5edd74b69557f97212Chong Zhang case STREAMTYPE_LPCM_AC3: 774d3c079ae9859011d118f94616d0069c2987013edChangwan Ryu case STREAMTYPE_AC3: 7753a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania case STREAMTYPE_AC3_ENCRYPTED: 7763b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang mode = ElementaryStreamQueue::AC3; 777d3c079ae9859011d118f94616d0069c2987013edChangwan Ryu break; 778d3c079ae9859011d118f94616d0069c2987013edChangwan Ryu 7790852843d304006e3ab333081fddda13b07193de8Robert Shih case STREAMTYPE_METADATA: 7803b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang mode = ElementaryStreamQueue::METADATA; 7810852843d304006e3ab333081fddda13b07193de8Robert Shih break; 7820852843d304006e3ab333081fddda13b07193de8Robert Shih 783386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber default: 7843b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang ALOGE("stream PID 0x%02x has invalid stream type 0x%02x", 7853b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang elementaryPID, streamType); 7863b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang return; 787386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber } 788386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber 7893b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang mQueue = new ElementaryStreamQueue(mode, flags); 79018ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber 79118ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber if (mQueue != NULL) { 7923a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania if (mSampleAesKeyItem != NULL) { 7933a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania mQueue->signalNewSampleAesKey(mSampleAesKeyItem); 7943a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania } 7953a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania 7963b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang ensureBufferCapacity(kInitialStreamBufferSize); 7973b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang 7983b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang if (mScrambled && (isAudio() || isVideo())) { 7993b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang // Set initial format to scrambled 8003b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang sp<MetaData> meta = new MetaData(); 8013b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang meta->setCString(kKeyMIMEType, 8023b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang isAudio() ? MEDIA_MIMETYPE_AUDIO_SCRAMBLED 8033b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang : MEDIA_MIMETYPE_VIDEO_SCRAMBLED); 804bc7aae4ff7e72e5bf0fa888f946835840a4357bbChong Zhang // for MediaExtractor.CasInfo 805bc7aae4ff7e72e5bf0fa888f946835840a4357bbChong Zhang meta->setInt32(kKeyCASystemID, CA_system_ID); 8063b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang mSource = new AnotherPacketSource(meta); 8073b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang } 80818ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber } 809cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 810cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 811cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas HuberATSParser::Stream::~Stream() { 812386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber delete mQueue; 813386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber mQueue = NULL; 814cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 815cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 816d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhangbool ATSParser::Stream::ensureBufferCapacity(size_t neededSize) { 8173b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang if (mBuffer != NULL && mBuffer->capacity() >= neededSize) { 818d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang return true; 8193b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang } 8203b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang 8213b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang ALOGV("ensureBufferCapacity: current size %zu, new size %zu, scrambled %d", 8223b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang mBuffer == NULL ? 0 : mBuffer->capacity(), neededSize, mScrambled); 8233b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang 8243b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang sp<ABuffer> newBuffer, newScrambledBuffer; 8253b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang sp<IMemory> newMem; 8263b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang sp<MemoryDealer> newDealer; 8273b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang if (mScrambled) { 8283b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang size_t alignment = MemoryDealer::getAllocationAlignment(); 8293b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang neededSize = (neededSize + (alignment - 1)) & ~(alignment - 1); 8303b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang // Align to multiples of 64K. 8313b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang neededSize = (neededSize + 65535) & ~65535; 8323b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang newDealer = new MemoryDealer(neededSize, "ATSParser"); 8333b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang newMem = newDealer->allocate(neededSize); 8343b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang newScrambledBuffer = new ABuffer(newMem->pointer(), newMem->size()); 8353b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang 8363b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang if (mDescrambledBuffer != NULL) { 8373b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang memcpy(newScrambledBuffer->data(), 8383b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang mDescrambledBuffer->data(), mDescrambledBuffer->size()); 8393b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang newScrambledBuffer->setRange(0, mDescrambledBuffer->size()); 8403b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang } else { 8413b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang newScrambledBuffer->setRange(0, 0); 8423b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang } 8433b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang mMem = newMem; 8443b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang mDealer = newDealer; 8453b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang mDescrambledBuffer = newScrambledBuffer; 846d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang 847d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang ssize_t offset; 848d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang size_t size; 849d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang sp<IMemoryHeap> heap = newMem->getMemory(&offset, &size); 850d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang if (heap == NULL) { 851d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang return false; 852d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang } 853d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang native_handle_t* nativeHandle = native_handle_create(1, 0); 854d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang if (!nativeHandle) { 855d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang ALOGE("[stream %d] failed to create native handle", mElementaryPID); 856d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang return false; 857d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang } 858d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang nativeHandle->data[0] = heap->getHeapID(); 859d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang mDescramblerSrcBuffer.heapBase = hidl_memory("ashmem", 860d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang hidl_handle(nativeHandle), heap->getSize()); 861d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang mDescramblerSrcBuffer.offset = (uint64_t) offset; 862d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang mDescramblerSrcBuffer.size = (uint64_t) size; 863d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang 864d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang ALOGD("[stream %d] created shared buffer for descrambling, offset %zd, size %zu", 865d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang mElementaryPID, offset, size); 8663b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang } else { 8673b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang // Align to multiples of 64K. 8683b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang neededSize = (neededSize + 65535) & ~65535; 8693b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang } 8703b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang 8713b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang newBuffer = new ABuffer(neededSize); 8723b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang if (mBuffer != NULL) { 8733b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang memcpy(newBuffer->data(), mBuffer->data(), mBuffer->size()); 8743b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang newBuffer->setRange(0, mBuffer->size()); 8753b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang } else { 8763b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang newBuffer->setRange(0, 0); 8773b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang } 8783b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang mBuffer = newBuffer; 879d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang return true; 8803b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang} 8813b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang 8825403129e2a2f44620f2ac8109889e5a61be08732Andreas Huberstatus_t ATSParser::Stream::parse( 88387f2a558dd12043631e12c361abef301bf603140Andreas Huber unsigned continuity_counter, 8843b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang unsigned payload_unit_start_indicator, 8853b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang unsigned transport_scrambling_control, 8863b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang unsigned random_access_indicator, 8873b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang ABitReader *br, SyncEvent *event) { 88818ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber if (mQueue == NULL) { 8895403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber return OK; 89018ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber } 89118ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber 89287f2a558dd12043631e12c361abef301bf603140Andreas Huber if (mExpectedContinuityCounter >= 0 89387f2a558dd12043631e12c361abef301bf603140Andreas Huber && (unsigned)mExpectedContinuityCounter != continuity_counter) { 89487f2a558dd12043631e12c361abef301bf603140Andreas Huber ALOGI("discontinuity on stream pid 0x%04x", mElementaryPID); 89587f2a558dd12043631e12c361abef301bf603140Andreas Huber 89687f2a558dd12043631e12c361abef301bf603140Andreas Huber mPayloadStarted = false; 8979558f6dd733dc450270f38b9a139d384d273ce0aWei Jia mPesStartOffsets.clear(); 89887f2a558dd12043631e12c361abef301bf603140Andreas Huber mBuffer->setRange(0, 0); 8993b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang mSubSamples.clear(); 90087f2a558dd12043631e12c361abef301bf603140Andreas Huber mExpectedContinuityCounter = -1; 90187f2a558dd12043631e12c361abef301bf603140Andreas Huber 90294a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber#if 0 90394a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber // Uncomment this if you'd rather see no corruption whatsoever on 90494a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber // screen and suspend updates until we come across another IDR frame. 90594a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber 90694a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber if (mStreamType == STREAMTYPE_H264) { 90794a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber ALOGI("clearing video queue"); 90894a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber mQueue->clear(true /* clearFormat */); 90994a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber } 91094a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber#endif 91194a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber 91266830855846db5c211c2da6c055ca9b4167e8974Chong Zhang if (!payload_unit_start_indicator) { 91366830855846db5c211c2da6c055ca9b4167e8974Chong Zhang return OK; 91466830855846db5c211c2da6c055ca9b4167e8974Chong Zhang } 91587f2a558dd12043631e12c361abef301bf603140Andreas Huber } 91687f2a558dd12043631e12c361abef301bf603140Andreas Huber 91787f2a558dd12043631e12c361abef301bf603140Andreas Huber mExpectedContinuityCounter = (continuity_counter + 1) & 0x0f; 91887f2a558dd12043631e12c361abef301bf603140Andreas Huber 919cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (payload_unit_start_indicator) { 920540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim off64_t offset = (event != NULL) ? event->getOffset() : 0; 921cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (mPayloadStarted) { 922cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber // Otherwise we run the danger of receiving the trailing bytes 923cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber // of a PES packet that we never saw the start of and assuming 924cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber // we have a a complete PES packet. 925cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 926540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim status_t err = flush(event); 9275403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber 9285403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber if (err != OK) { 92965959d34fdab8319dbf765be5fbf7ff8051eedf1Wonsik Kim ALOGW("Error (%08x) happened while flushing; we simply discard " 93065959d34fdab8319dbf765be5fbf7ff8051eedf1Wonsik Kim "the PES packet and continue.", err); 9315403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber } 932cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 933cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 934cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber mPayloadStarted = true; 935b08d83e972ba8cb08a6e361d5cdaf97857bcf21fWei Jia // There should be at most 2 elements in |mPesStartOffsets|. 936b08d83e972ba8cb08a6e361d5cdaf97857bcf21fWei Jia while (mPesStartOffsets.size() >= 2) { 937b08d83e972ba8cb08a6e361d5cdaf97857bcf21fWei Jia mPesStartOffsets.erase(mPesStartOffsets.begin()); 938b08d83e972ba8cb08a6e361d5cdaf97857bcf21fWei Jia } 9399558f6dd733dc450270f38b9a139d384d273ce0aWei Jia mPesStartOffsets.push_back(offset); 940cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 941cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 942cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (!mPayloadStarted) { 9435403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber return OK; 944cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 945cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 946cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber size_t payloadSizeBits = br->numBitsLeft(); 947e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (payloadSizeBits % 8 != 0u) { 948e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim ALOGE("Wrong value"); 949e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return BAD_VALUE; 950e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 951cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 9523e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber size_t neededSize = mBuffer->size() + payloadSizeBits / 8; 953d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang if (!ensureBufferCapacity(neededSize)) { 954d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang return NO_MEMORY; 955d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang } 956cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 957cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber memcpy(mBuffer->data() + mBuffer->size(), br->data(), payloadSizeBits / 8); 958cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber mBuffer->setRange(0, mBuffer->size() + payloadSizeBits / 8); 9595403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber 9603b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang if (mScrambled) { 9613b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang mSubSamples.push_back({payloadSizeBits / 8, 9623b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang transport_scrambling_control, random_access_indicator}); 9633b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang } 9643b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang 9655403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber return OK; 966cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 967cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 9686e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huberbool ATSParser::Stream::isVideo() const { 9696e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber switch (mStreamType) { 9706e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber case STREAMTYPE_H264: 9713a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania case STREAMTYPE_H264_ENCRYPTED: 9726e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber case STREAMTYPE_MPEG1_VIDEO: 9736e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber case STREAMTYPE_MPEG2_VIDEO: 9746e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber case STREAMTYPE_MPEG4_VIDEO: 9756e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber return true; 9766e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 9776e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber default: 9786e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber return false; 9796e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } 9806e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber} 9816e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 9826e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huberbool ATSParser::Stream::isAudio() const { 9836e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber switch (mStreamType) { 9846e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber case STREAMTYPE_MPEG1_AUDIO: 9856e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber case STREAMTYPE_MPEG2_AUDIO: 9866e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber case STREAMTYPE_MPEG2_AUDIO_ADTS: 9879bf32f06e8971c1d3eb4fc5edd74b69557f97212Chong Zhang case STREAMTYPE_LPCM_AC3: 988d3c079ae9859011d118f94616d0069c2987013edChangwan Ryu case STREAMTYPE_AC3: 9893a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania case STREAMTYPE_AAC_ENCRYPTED: 9903a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania case STREAMTYPE_AC3_ENCRYPTED: 9916e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber return true; 9926e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 9936e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber default: 9946e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber return false; 9956e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } 9966e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber} 9976e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 9980852843d304006e3ab333081fddda13b07193de8Robert Shihbool ATSParser::Stream::isMeta() const { 9990852843d304006e3ab333081fddda13b07193de8Robert Shih if (mStreamType == STREAMTYPE_METADATA) { 10000852843d304006e3ab333081fddda13b07193de8Robert Shih return true; 10010852843d304006e3ab333081fddda13b07193de8Robert Shih } 10020852843d304006e3ab333081fddda13b07193de8Robert Shih return false; 10030852843d304006e3ab333081fddda13b07193de8Robert Shih} 10040852843d304006e3ab333081fddda13b07193de8Robert Shih 100532f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Hubervoid ATSParser::Stream::signalDiscontinuity( 100632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber DiscontinuityType type, const sp<AMessage> &extra) { 10070389cc09f7b90f155a8942a0d2e1925cad1dbe2dMarco Nelissen mExpectedContinuityCounter = -1; 10080389cc09f7b90f155a8942a0d2e1925cad1dbe2dMarco Nelissen 100918ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber if (mQueue == NULL) { 101018ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber return; 101118ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber } 101218ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber 10132a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber mPayloadStarted = false; 10149558f6dd733dc450270f38b9a139d384d273ce0aWei Jia mPesStartOffsets.clear(); 1015aabbdc7401ae24a4199f12a283985deb648673c0Robert Shih mEOSReached = false; 10162a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber mBuffer->setRange(0, 0); 10173b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang mSubSamples.clear(); 10182a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber 10196e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber bool clearFormat = false; 10206e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (isAudio()) { 10216e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (type & DISCONTINUITY_AUDIO_FORMAT) { 10226e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber clearFormat = true; 10236e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } 10246e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } else { 10256e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (type & DISCONTINUITY_VIDEO_FORMAT) { 10266e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber clearFormat = true; 10276e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } 10286e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } 1029f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 10306e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber mQueue->clear(clearFormat); 103132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 10326e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (type & DISCONTINUITY_TIME) { 10336e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber uint64_t resumeAtPTS; 10346e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (extra != NULL 10356e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber && extra->findInt64( 103615d02f84351eaca14099bde11cfbf6f124bea71fDongwon Kang kATSParserKeyResumeAtPTS, 10376e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber (int64_t *)&resumeAtPTS)) { 10386e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber int64_t resumeAtMediaTimeUs = 10396e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber mProgram->convertPTSToTimestamp(resumeAtPTS); 104032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 1041c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia extra->setInt64("resume-at-mediaTimeUs", resumeAtMediaTimeUs); 1042e332a9181cf6a3155ed1a0fd2afc212ccb1f2753Andreas Huber } 10436e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } 1044f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 10456e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (mSource != NULL) { 10463b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang sp<MetaData> meta = mSource->getFormat(); 10473b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang const char* mime; 10483b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang if (clearFormat && meta != NULL && meta->findCString(kKeyMIMEType, &mime) 10493b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang && (!strncasecmp(mime, MEDIA_MIMETYPE_AUDIO_SCRAMBLED, 15) 10503b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang || !strncasecmp(mime, MEDIA_MIMETYPE_VIDEO_SCRAMBLED, 15))){ 10513b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang mSource->clear(); 10523b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang } else { 10533b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang mSource->queueDiscontinuity(type, extra, true); 10543b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang } 1055bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber } 1056f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1057bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber 1058f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ATSParser::Stream::signalEOS(status_t finalResult) { 1059f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mSource != NULL) { 1060f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mSource->signalEOS(finalResult); 10612a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber } 1062be9634d071e79b72a42a4504f64eda9e2a0bceb8Marco Nelissen mEOSReached = true; 1063540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim flush(NULL); 10642a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber} 10652a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber 1066540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kimstatus_t ATSParser::Stream::parsePES(ABitReader *br, SyncEvent *event) { 10673b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang const uint8_t *basePtr = br->data(); 10683b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang 1069cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned packet_startcode_prefix = br->getBits(24); 1070cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 10713856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("packet_startcode_prefix = 0x%08x", packet_startcode_prefix); 1072cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1073386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber if (packet_startcode_prefix != 1) { 10743856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Supposedly payload_unit_start=1 unit does not start " 1075386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber "with startcode."); 10765403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber 10775403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber return ERROR_MALFORMED; 1078386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber } 1079386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber 1080cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned stream_id = br->getBits(8); 10813856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("stream_id = 0x%02x", stream_id); 1082cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1083cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned PES_packet_length = br->getBits(16); 10843856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("PES_packet_length = %u", PES_packet_length); 1085cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1086cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (stream_id != 0xbc // program_stream_map 1087cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber && stream_id != 0xbe // padding_stream 1088cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber && stream_id != 0xbf // private_stream_2 1089cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber && stream_id != 0xf0 // ECM 1090cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber && stream_id != 0xf1 // EMM 1091cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber && stream_id != 0xff // program_stream_directory 1092cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber && stream_id != 0xf2 // DSMCC 1093cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber && stream_id != 0xf8) { // H.222.1 type E 1094e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (br->getBits(2) != 2u) { 1095e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 1096e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 1097cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 10983b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang unsigned PES_scrambling_control = br->getBits(2); 10993b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang ALOGV("PES_scrambling_control = %u", PES_scrambling_control); 11003b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang 11016e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV("PES_priority = %u", br->getBits(1)); 11026e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV("data_alignment_indicator = %u", br->getBits(1)); 11036e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV("copyright = %u", br->getBits(1)); 11046e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV("original_or_copy = %u", br->getBits(1)); 1105cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1106cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned PTS_DTS_flags = br->getBits(2); 11073856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("PTS_DTS_flags = %u", PTS_DTS_flags); 1108cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1109cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned ESCR_flag = br->getBits(1); 11103856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("ESCR_flag = %u", ESCR_flag); 1111cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1112cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned ES_rate_flag = br->getBits(1); 11133856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("ES_rate_flag = %u", ES_rate_flag); 1114cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1115cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned DSM_trick_mode_flag = br->getBits(1); 11163856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("DSM_trick_mode_flag = %u", DSM_trick_mode_flag); 1117cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1118cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned additional_copy_info_flag = br->getBits(1); 11193856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("additional_copy_info_flag = %u", additional_copy_info_flag); 1120cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 11216e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV("PES_CRC_flag = %u", br->getBits(1)); 11226e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV("PES_extension_flag = %u", br->getBits(1)); 1123cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1124cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned PES_header_data_length = br->getBits(8); 11253856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("PES_header_data_length = %u", PES_header_data_length); 1126cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1127cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned optional_bytes_remaining = PES_header_data_length; 1128cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1129cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber uint64_t PTS = 0, DTS = 0; 1130cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1131cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (PTS_DTS_flags == 2 || PTS_DTS_flags == 3) { 1132e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (optional_bytes_remaining < 5u) { 1133e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 1134e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 1135cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 11366456ae745e919085c5024f784aaa2703f9695f98David Yeh if (br->getBits(4) != PTS_DTS_flags) { 11376456ae745e919085c5024f784aaa2703f9695f98David Yeh return ERROR_MALFORMED; 11386456ae745e919085c5024f784aaa2703f9695f98David Yeh } 1139cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber PTS = ((uint64_t)br->getBits(3)) << 30; 1140e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (br->getBits(1) != 1u) { 1141e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 1142e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 1143cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber PTS |= ((uint64_t)br->getBits(15)) << 15; 1144e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (br->getBits(1) != 1u) { 1145e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 1146e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 1147cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber PTS |= br->getBits(15); 1148e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (br->getBits(1) != 1u) { 1149e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 1150e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 1151cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1152b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross ALOGV("PTS = 0x%016" PRIx64 " (%.2f)", PTS, PTS / 90000.0); 1153cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1154cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber optional_bytes_remaining -= 5; 1155cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1156cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (PTS_DTS_flags == 3) { 1157e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (optional_bytes_remaining < 5u) { 1158e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 1159e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 1160cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1161e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (br->getBits(4) != 1u) { 1162e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 1163e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 1164cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1165cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber DTS = ((uint64_t)br->getBits(3)) << 30; 1166e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (br->getBits(1) != 1u) { 1167e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 1168e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 1169cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber DTS |= ((uint64_t)br->getBits(15)) << 15; 1170e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (br->getBits(1) != 1u) { 1171e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 1172e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 1173cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber DTS |= br->getBits(15); 1174e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (br->getBits(1) != 1u) { 1175e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 1176e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 1177cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1178b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross ALOGV("DTS = %" PRIu64, DTS); 1179cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1180cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber optional_bytes_remaining -= 5; 1181cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 1182cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 1183cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1184cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (ESCR_flag) { 1185e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (optional_bytes_remaining < 6u) { 1186e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 1187e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 1188cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1189cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber br->getBits(2); 1190cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1191cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber uint64_t ESCR = ((uint64_t)br->getBits(3)) << 30; 1192e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (br->getBits(1) != 1u) { 1193e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 1194e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 1195cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber ESCR |= ((uint64_t)br->getBits(15)) << 15; 1196e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (br->getBits(1) != 1u) { 1197e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 1198e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 1199cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber ESCR |= br->getBits(15); 1200e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (br->getBits(1) != 1u) { 1201e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 1202e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 1203cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1204b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross ALOGV("ESCR = %" PRIu64, ESCR); 12056e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV("ESCR_extension = %u", br->getBits(9)); 1206cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1207e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (br->getBits(1) != 1u) { 1208e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 1209e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 1210cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1211cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber optional_bytes_remaining -= 6; 1212cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 1213cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1214cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (ES_rate_flag) { 1215e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (optional_bytes_remaining < 3u) { 1216e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 1217e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 1218cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1219e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (br->getBits(1) != 1u) { 1220e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 1221e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 12226e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV("ES_rate = %u", br->getBits(22)); 1223e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (br->getBits(1) != 1u) { 1224e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 1225e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 1226cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1227cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber optional_bytes_remaining -= 3; 1228cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 1229cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1230cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber br->skipBits(optional_bytes_remaining * 8); 1231cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1232cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber // ES data follows. 12333b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang int32_t pesOffset = br->data() - basePtr; 1234cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1235cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (PES_packet_length != 0) { 1236e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (PES_packet_length < PES_header_data_length + 3) { 1237e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 1238e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 1239cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1240cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned dataLength = 1241cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber PES_packet_length - 3 - PES_header_data_length; 1242cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 12435403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber if (br->numBitsLeft() < dataLength * 8) { 124429357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("PES packet does not carry enough data to contain " 1245b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross "payload. (numBitsLeft = %zu, required = %u)", 12465403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber br->numBitsLeft(), dataLength * 8); 12475403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber 12485403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber return ERROR_MALFORMED; 12495403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber } 12505403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber 12513b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang ALOGV("There's %u bytes of payload, PES_packet_length=%u, offset=%d", 12523b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang dataLength, PES_packet_length, pesOffset); 12533b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang 12540da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber onPayloadData( 12553b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang PTS_DTS_flags, PTS, DTS, PES_scrambling_control, 12563b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang br->data(), dataLength, pesOffset, event); 1257cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1258cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber br->skipBits(dataLength * 8); 1259cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } else { 12600da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber onPayloadData( 12613b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang PTS_DTS_flags, PTS, DTS, PES_scrambling_control, 12623b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang br->data(), br->numBitsLeft() / 8, pesOffset, event); 12630da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber 1264cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber size_t payloadSizeBits = br->numBitsLeft(); 1265e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (payloadSizeBits % 8 != 0u) { 1266e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 1267e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 1268cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 12693b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang ALOGV("There's %zu bytes of payload, offset=%d", 12703b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang payloadSizeBits / 8, pesOffset); 1271cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 1272cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } else if (stream_id == 0xbe) { // padding_stream 1273e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (PES_packet_length == 0u) { 1274e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 1275e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 1276cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber br->skipBits(PES_packet_length * 8); 1277cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } else { 1278e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (PES_packet_length == 0u) { 1279e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 1280e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 1281cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber br->skipBits(PES_packet_length * 8); 1282cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 12835403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber 12845403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber return OK; 1285cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 1286cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 12873b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhanguint32_t ATSParser::Stream::getPesScramblingControl( 12883b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang ABitReader *br, int32_t *pesOffset) { 12893b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang unsigned packet_startcode_prefix = br->getBits(24); 12903b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang 12913b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang ALOGV("packet_startcode_prefix = 0x%08x", packet_startcode_prefix); 12923b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang 12933b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang if (packet_startcode_prefix != 1) { 12943b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang ALOGV("unit does not start with startcode."); 12953b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang return 0; 12963b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang } 12973b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang 12983b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang if (br->numBitsLeft() < 48) { 12993b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang return 0; 13003b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang } 13013b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang 13023b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang unsigned stream_id = br->getBits(8); 13033b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang ALOGV("stream_id = 0x%02x", stream_id); 13043b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang 13053b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang br->skipBits(16); // PES_packet_length 13063b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang 13073b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang if (stream_id != 0xbc // program_stream_map 13083b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang && stream_id != 0xbe // padding_stream 13093b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang && stream_id != 0xbf // private_stream_2 13103b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang && stream_id != 0xf0 // ECM 13113b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang && stream_id != 0xf1 // EMM 13123b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang && stream_id != 0xff // program_stream_directory 13133b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang && stream_id != 0xf2 // DSMCC 13143b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang && stream_id != 0xf8) { // H.222.1 type E 13153b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang if (br->getBits(2) != 2u) { 13163b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang return 0; 13173b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang } 13183b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang 13193b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang unsigned PES_scrambling_control = br->getBits(2); 13203b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang ALOGV("PES_scrambling_control = %u", PES_scrambling_control); 13213b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang 13223b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang if (PES_scrambling_control == 0) { 13233b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang return 0; 13243b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang } 13253b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang 13263b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang br->skipBits(12); // don't care 13273b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang 13283b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang unsigned PES_header_data_length = br->getBits(8); 13293b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang ALOGV("PES_header_data_length = %u", PES_header_data_length); 13303b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang 13313b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang if (PES_header_data_length * 8 > br->numBitsLeft()) { 13323b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang return 0; 13333b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang } 13343b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang 13353b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang *pesOffset = 9 + PES_header_data_length; 13363b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang ALOGD("found PES_scrambling_control=%d, PES offset=%d", 13373b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang PES_scrambling_control, *pesOffset); 13383b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang return PES_scrambling_control; 13393b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang } 13403b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang 13413b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang return 0; 13423b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang} 13433b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang 13443b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhangstatus_t ATSParser::Stream::flushScrambled(SyncEvent *event) { 13453b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang if (mDescrambler == NULL) { 13463b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang ALOGE("received scrambled packets without descrambler!"); 13473b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang return UNKNOWN_ERROR; 13483b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang } 13493b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang 13503b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang if (mDescrambledBuffer == NULL || mMem == NULL) { 13513b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang ALOGE("received scrambled packets without shared memory!"); 13523b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang 13533b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang return UNKNOWN_ERROR; 13543b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang } 13553b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang 13563b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang int32_t pesOffset = 0; 13573b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang int32_t descrambleSubSamples = 0, descrambleBytes = 0; 13583b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang uint32_t tsScramblingControl = 0, pesScramblingControl = 0; 13593b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang 13603b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang // First, go over subsamples to find TS-level scrambling key id, and 13613b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang // calculate how many subsample we need to descramble (assuming we don't 13623b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang // have PES-level scrambling). 13633b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang for (auto it = mSubSamples.begin(); it != mSubSamples.end(); it++) { 13643b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang if (it->transport_scrambling_mode != 0) { 13653b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang // TODO: handle keyId change, use the first non-zero keyId for now. 13663b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang if (tsScramblingControl == 0) { 13673b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang tsScramblingControl = it->transport_scrambling_mode; 13683b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang } 13693b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang } 13703b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang if (tsScramblingControl == 0 || descrambleSubSamples == 0 13713b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang || !mQueue->isScrambled()) { 13723b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang descrambleSubSamples++; 13733b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang descrambleBytes += it->subSampleSize; 13743b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang } 13753b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang } 13763b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang // If not scrambled at TS-level, check PES-level scrambling 13773b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang if (tsScramblingControl == 0) { 13783b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang ABitReader br(mBuffer->data(), mBuffer->size()); 13793b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang pesScramblingControl = getPesScramblingControl(&br, &pesOffset); 13803b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang // If not scrambled at PES-level either, or scrambled at PES-level but 13813b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang // requires output to remain scrambled, we don't need to descramble 13823b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang // anything. 13833b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang if (pesScramblingControl == 0 || mQueue->isScrambled()) { 13843b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang descrambleSubSamples = 0; 13853b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang descrambleBytes = 0; 13863b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang } 13873b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang } 13883b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang 13893b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang uint32_t sctrl = tsScramblingControl != 0 ? 13903b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang tsScramblingControl : pesScramblingControl; 13913b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang 13923b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang // Perform the 1st pass descrambling if needed 13933b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang if (descrambleBytes > 0) { 13943b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang memcpy(mDescrambledBuffer->data(), mBuffer->data(), descrambleBytes); 13953b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang mDescrambledBuffer->setRange(0, descrambleBytes); 13963b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang 1397d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang hidl_vec<SubSample> subSamples; 1398d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang subSamples.resize(descrambleSubSamples); 13993b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang 14003b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang int32_t i = 0; 14013b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang for (auto it = mSubSamples.begin(); 14023b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang it != mSubSamples.end() && i < descrambleSubSamples; it++, i++) { 14033b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang if (it->transport_scrambling_mode != 0 || pesScramblingControl != 0) { 1404d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang subSamples[i].numBytesOfClearData = 0; 1405d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang subSamples[i].numBytesOfEncryptedData = it->subSampleSize; 14063b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang } else { 1407d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang subSamples[i].numBytesOfClearData = it->subSampleSize; 1408d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang subSamples[i].numBytesOfEncryptedData = 0; 14093b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang } 14103b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang } 1411d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang 1412d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang uint64_t srcOffset = 0, dstOffset = 0; 14133b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang // If scrambled at PES-level, PES header should be skipped 14143b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang if (pesScramblingControl != 0) { 1415d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang srcOffset = dstOffset = pesOffset; 1416d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang subSamples[0].numBytesOfEncryptedData -= pesOffset; 14173b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang } 14183b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang 1419d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang Status status = Status::OK; 1420d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang uint32_t bytesWritten = 0; 1421d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang hidl_string detailedError; 1422d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang 1423d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang DestinationBuffer dstBuffer; 1424d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang dstBuffer.type = BufferType::SHARED_MEMORY; 1425d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang dstBuffer.nonsecureMemory = mDescramblerSrcBuffer; 1426d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang 1427d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang auto returnVoid = mDescrambler->descramble( 1428d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang (ScramblingControl) sctrl, 1429d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang subSamples, 1430d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang mDescramblerSrcBuffer, 1431d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang srcOffset, 1432d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang dstBuffer, 1433d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang dstOffset, 1434d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang [&status, &bytesWritten, &detailedError] ( 1435d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang Status _status, uint32_t _bytesWritten, 1436d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang const hidl_string& _detailedError) { 1437d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang status = _status; 1438d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang bytesWritten = _bytesWritten; 1439d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang detailedError = _detailedError; 1440d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang }); 1441d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang 1442d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang if (!returnVoid.isOk()) { 1443d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang ALOGE("[stream %d] descramble failed, trans=%s", 1444d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang mElementaryPID, returnVoid.description().c_str()); 14453b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang return UNKNOWN_ERROR; 14463b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang } 14473b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang 14483b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang ALOGV("[stream %d] descramble succeeded, %d bytes", 1449d5a416a49d5074e2966f5fe255561cbaaf31a325Chong Zhang mElementaryPID, bytesWritten); 14503b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang memcpy(mBuffer->data(), mDescrambledBuffer->data(), descrambleBytes); 14513b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang } 14523b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang 14533b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang if (mQueue->isScrambled()) { 14543b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang // Queue subSample info for scrambled queue 14553b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang sp<ABuffer> clearSizesBuffer = new ABuffer(mSubSamples.size() * 4); 14563b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang sp<ABuffer> encSizesBuffer = new ABuffer(mSubSamples.size() * 4); 14573b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang int32_t *clearSizePtr = (int32_t*)clearSizesBuffer->data(); 14583b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang int32_t *encSizePtr = (int32_t*)encSizesBuffer->data(); 14593b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang int32_t isSync = 0; 14603b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang int32_t i = 0; 14613b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang for (auto it = mSubSamples.begin(); 14623b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang it != mSubSamples.end(); it++, i++) { 14633b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang if ((it->transport_scrambling_mode == 0 14643b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang && pesScramblingControl == 0) 14653b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang || i < descrambleSubSamples) { 14663b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang clearSizePtr[i] = it->subSampleSize; 14673b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang encSizePtr[i] = 0; 14683b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang } else { 14693b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang clearSizePtr[i] = 0; 14703b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang encSizePtr[i] = it->subSampleSize; 14713b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang } 14723b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang isSync |= it->random_access_indicator; 14733b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang } 14743b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang // Pass the original TS subsample size now. The PES header adjust 14753b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang // will be applied when the scrambled AU is dequeued. 14763b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang mQueue->appendScrambledData( 14773b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang mBuffer->data(), mBuffer->size(), sctrl, 14783b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang isSync, clearSizesBuffer, encSizesBuffer); 14793b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang } 14803b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang 14813b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang ABitReader br(mBuffer->data(), mBuffer->size()); 14823b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang status_t err = parsePES(&br, event); 14833b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang 14843b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang if (err != OK) { 14853b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang ALOGE("[stream %d] failed to parse descrambled PES, err=%d", 14863b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang mElementaryPID, err); 14873b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang } 14883b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang 14893b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang return err; 14903b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang} 14913b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang 14923b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang 1493540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kimstatus_t ATSParser::Stream::flush(SyncEvent *event) { 1494f2cecd570c35d3b6422396dd51c0b4202732bceaJaesung Chung if (mBuffer == NULL || mBuffer->size() == 0) { 14955403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber return OK; 1496cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 1497cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1498b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross ALOGV("flushing stream 0x%04x size = %zu", mElementaryPID, mBuffer->size()); 1499cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 15003b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang status_t err = OK; 15013b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang if (mScrambled) { 15023b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang err = flushScrambled(event); 15033b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang mSubSamples.clear(); 15043b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang } else { 15053b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang ABitReader br(mBuffer->data(), mBuffer->size()); 15063b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang err = parsePES(&br, event); 15073b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang } 1508cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1509cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber mBuffer->setRange(0, 0); 15105403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber 15115403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber return err; 1512cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 1513cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1514cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubervoid ATSParser::Stream::onPayloadData( 151584333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber unsigned PTS_DTS_flags, uint64_t PTS, uint64_t /* DTS */, 15163b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang unsigned PES_scrambling_control, 15173b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang const uint8_t *data, size_t size, 15183b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang int32_t payloadOffset, SyncEvent *event) { 151990a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber#if 0 152090a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber ALOGI("payload streamType 0x%02x, PTS = 0x%016llx, dPTS = %lld", 152190a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber mStreamType, 152290a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber PTS, 152390a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber (int64_t)PTS - mPrevPTS); 152490a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber mPrevPTS = PTS; 152590a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber#endif 152690a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber 15273a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania ALOGV("onPayloadData mStreamType=0x%02x size: %zu", mStreamType, size); 1528cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 152998a46cf165d8de3779874eba01803bbc485f45b9Andreas Huber int64_t timeUs = 0ll; // no presentation timestamp available. 153098a46cf165d8de3779874eba01803bbc485f45b9Andreas Huber if (PTS_DTS_flags == 2 || PTS_DTS_flags == 3) { 153198a46cf165d8de3779874eba01803bbc485f45b9Andreas Huber timeUs = mProgram->convertPTSToTimestamp(PTS); 153298a46cf165d8de3779874eba01803bbc485f45b9Andreas Huber } 153382f7321b03eec1e40af9d681370f754ee0279582Andreas Huber 15343b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang status_t err = mQueue->appendData( 15353b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang data, size, timeUs, payloadOffset, PES_scrambling_control); 1536decd96988e495133e4a1728f612d4c9fdb4d218eAndreas Huber 1537be9634d071e79b72a42a4504f64eda9e2a0bceb8Marco Nelissen if (mEOSReached) { 1538be9634d071e79b72a42a4504f64eda9e2a0bceb8Marco Nelissen mQueue->signalEOS(); 1539be9634d071e79b72a42a4504f64eda9e2a0bceb8Marco Nelissen } 1540be9634d071e79b72a42a4504f64eda9e2a0bceb8Marco Nelissen 1541decd96988e495133e4a1728f612d4c9fdb4d218eAndreas Huber if (err != OK) { 1542decd96988e495133e4a1728f612d4c9fdb4d218eAndreas Huber return; 1543decd96988e495133e4a1728f612d4c9fdb4d218eAndreas Huber } 154482f7321b03eec1e40af9d681370f754ee0279582Andreas Huber 15456a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber sp<ABuffer> accessUnit; 1546540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim bool found = false; 1547386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber while ((accessUnit = mQueue->dequeueAccessUnit()) != NULL) { 15486a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber if (mSource == NULL) { 1549386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber sp<MetaData> meta = mQueue->getFormat(); 155082f7321b03eec1e40af9d681370f754ee0279582Andreas Huber 15516a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber if (meta != NULL) { 15523856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Stream PID 0x%08x of type 0x%02x now has data.", 1553386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber mElementaryPID, mStreamType); 1554386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber 1555309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih const char *mime; 1556309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih if (meta->findCString(kKeyMIMEType, &mime) 15573b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang && !strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_AVC)) { 15583b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang int32_t sync = 0; 15593b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang if (!accessUnit->meta()->findInt32("isSync", &sync) || !sync) { 15603b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang continue; 15613b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang } 1562309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih } 15636a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber mSource = new AnotherPacketSource(meta); 15646a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber mSource->queueAccessUnit(accessUnit); 15653a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania ALOGV("onPayloadData: created AnotherPacketSource PID 0x%08x of type 0x%02x", 15663a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania mElementaryPID, mStreamType); 156782f7321b03eec1e40af9d681370f754ee0279582Andreas Huber } 1568386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber } else if (mQueue->getFormat() != NULL) { 15692a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber // After a discontinuity we invalidate the queue's format 15702a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber // and won't enqueue any access units to the source until 15712a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber // the queue has reestablished the new format. 15725bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 15735bc087c573c70c84c6a39946457590b42d392a33Andreas Huber if (mSource->getFormat() == NULL) { 1574386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber mSource->setFormat(mQueue->getFormat()); 15755bc087c573c70c84c6a39946457590b42d392a33Andreas Huber } 15766a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber mSource->queueAccessUnit(accessUnit); 157782f7321b03eec1e40af9d681370f754ee0279582Andreas Huber } 1578540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim 1579b08d83e972ba8cb08a6e361d5cdaf97857bcf21fWei Jia // Every access unit has a pesStartOffset queued in |mPesStartOffsets|. 1580b08d83e972ba8cb08a6e361d5cdaf97857bcf21fWei Jia off64_t pesStartOffset = -1; 1581b08d83e972ba8cb08a6e361d5cdaf97857bcf21fWei Jia if (!mPesStartOffsets.empty()) { 1582b08d83e972ba8cb08a6e361d5cdaf97857bcf21fWei Jia pesStartOffset = *mPesStartOffsets.begin(); 1583b08d83e972ba8cb08a6e361d5cdaf97857bcf21fWei Jia mPesStartOffsets.erase(mPesStartOffsets.begin()); 1584b08d83e972ba8cb08a6e361d5cdaf97857bcf21fWei Jia } 1585b08d83e972ba8cb08a6e361d5cdaf97857bcf21fWei Jia 1586b08d83e972ba8cb08a6e361d5cdaf97857bcf21fWei Jia if (pesStartOffset >= 0 && (event != NULL) && !found && mQueue->getFormat() != NULL) { 1587540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim int32_t sync = 0; 1588540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim if (accessUnit->meta()->findInt32("isSync", &sync) && sync) { 1589540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim int64_t timeUs; 1590540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim if (accessUnit->meta()->findInt64("timeUs", &timeUs)) { 1591540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim found = true; 159282e147049625a4cfdcb228a1de7efda594d446c9Robert Shih event->init(pesStartOffset, mSource, timeUs, getSourceType()); 1593540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim } 1594540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim } 1595540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim } 159682f7321b03eec1e40af9d681370f754ee0279582Andreas Huber } 159782f7321b03eec1e40af9d681370f754ee0279582Andreas Huber} 159882f7321b03eec1e40af9d681370f754ee0279582Andreas Huber 159982e147049625a4cfdcb228a1de7efda594d446c9Robert ShihATSParser::SourceType ATSParser::Stream::getSourceType() { 160082e147049625a4cfdcb228a1de7efda594d446c9Robert Shih if (isVideo()) { 160182e147049625a4cfdcb228a1de7efda594d446c9Robert Shih return VIDEO; 160282e147049625a4cfdcb228a1de7efda594d446c9Robert Shih } else if (isAudio()) { 160382e147049625a4cfdcb228a1de7efda594d446c9Robert Shih return AUDIO; 160482e147049625a4cfdcb228a1de7efda594d446c9Robert Shih } else if (isMeta()) { 160582e147049625a4cfdcb228a1de7efda594d446c9Robert Shih return META; 160682e147049625a4cfdcb228a1de7efda594d446c9Robert Shih } 160782e147049625a4cfdcb228a1de7efda594d446c9Robert Shih return NUM_SOURCE_TYPES; 160882e147049625a4cfdcb228a1de7efda594d446c9Robert Shih} 160982e147049625a4cfdcb228a1de7efda594d446c9Robert Shih 1610cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubersp<MediaSource> ATSParser::Stream::getSource(SourceType type) { 1611386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber switch (type) { 1612386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber case VIDEO: 1613386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber { 16146e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (isVideo()) { 1615386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber return mSource; 1616386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber } 1617386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber break; 1618386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber } 1619386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber 1620386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber case AUDIO: 1621386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber { 16226e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (isAudio()) { 1623386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber return mSource; 1624386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber } 1625386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber break; 1626386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber } 1627386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber 16280852843d304006e3ab333081fddda13b07193de8Robert Shih case META: 16290852843d304006e3ab333081fddda13b07193de8Robert Shih { 16300852843d304006e3ab333081fddda13b07193de8Robert Shih if (isMeta()) { 16310852843d304006e3ab333081fddda13b07193de8Robert Shih return mSource; 16320852843d304006e3ab333081fddda13b07193de8Robert Shih } 16330852843d304006e3ab333081fddda13b07193de8Robert Shih break; 16340852843d304006e3ab333081fddda13b07193de8Robert Shih } 16350852843d304006e3ab333081fddda13b07193de8Robert Shih 1636386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber default: 1637386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber break; 1638cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 1639cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1640cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber return NULL; 1641cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 1642cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1643bc7aae4ff7e72e5bf0fa888f946835840a4357bbChong Zhangvoid ATSParser::Stream::setCasInfo( 1644bc7aae4ff7e72e5bf0fa888f946835840a4357bbChong Zhang int32_t systemId, const sp<IDescrambler> &descrambler, 16453b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang const std::vector<uint8_t> &sessionId) { 16463b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang if (mSource != NULL && mDescrambler == NULL && descrambler != NULL) { 16473b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang signalDiscontinuity(DISCONTINUITY_FORMAT_ONLY, NULL); 16483b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang mDescrambler = descrambler; 16493b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang if (mQueue->isScrambled()) { 1650bc7aae4ff7e72e5bf0fa888f946835840a4357bbChong Zhang mQueue->setCasInfo(systemId, sessionId); 16513b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang } 16523b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang } 16533b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang} 16543b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang 1655cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber//////////////////////////////////////////////////////////////////////////////// 1656cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1657c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas HuberATSParser::ATSParser(uint32_t flags) 165887f2a558dd12043631e12c361abef301bf603140Andreas Huber : mFlags(flags), 165987f2a558dd12043631e12c361abef301bf603140Andreas Huber mAbsoluteTimeAnchorUs(-1ll), 1660d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber mTimeOffsetValid(false), 1661d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber mTimeOffsetUs(0ll), 1662d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang mLastRecoveredPTS(-1ll), 166387f2a558dd12043631e12c361abef301bf603140Andreas Huber mNumTSPacketsParsed(0), 166487f2a558dd12043631e12c361abef301bf603140Andreas Huber mNumPCRs(0) { 16658dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber mPSISections.add(0 /* PID */, new PSISection); 16663b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang mCasManager = new CasManager(); 1667cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 1668cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1669cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas HuberATSParser::~ATSParser() { 1670cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 1671cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1672540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kimstatus_t ATSParser::feedTSPacket(const void *data, size_t size, 1673540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim SyncEvent *event) { 1674e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (size != kTSPacketSize) { 1675e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim ALOGE("Wrong TS packet size"); 1676e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return BAD_VALUE; 1677e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 1678cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1679cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber ABitReader br((const uint8_t *)data, kTSPacketSize); 1680540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim return parseTS(&br, event); 1681cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 1682cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 16833b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhangstatus_t ATSParser::setMediaCas(const sp<ICas> &cas) { 16843b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang status_t err = mCasManager->setMediaCas(cas); 16853b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang if (err != OK) { 16863b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang return err; 16873b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang } 16883b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang for (size_t i = 0; i < mPrograms.size(); ++i) { 16893b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang mPrograms.editItemAt(i)->updateCasSessions(); 16903b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang } 16913b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang return OK; 16923b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang} 16933b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang 169432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Hubervoid ATSParser::signalDiscontinuity( 169532f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber DiscontinuityType type, const sp<AMessage> &extra) { 1696b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber int64_t mediaTimeUs; 1697d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang if ((type & DISCONTINUITY_TIME) && extra != NULL) { 169815d02f84351eaca14099bde11cfbf6f124bea71fDongwon Kang if (extra->findInt64(kATSParserKeyMediaTimeUs, &mediaTimeUs)) { 1699d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang mAbsoluteTimeAnchorUs = mediaTimeUs; 1700d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang } 1701d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang if ((mFlags & TS_TIMESTAMPS_ARE_ABSOLUTE) 1702d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang && extra->findInt64( 170315d02f84351eaca14099bde11cfbf6f124bea71fDongwon Kang kATSParserKeyRecentMediaTimeUs, &mediaTimeUs)) { 1704d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang if (mAbsoluteTimeAnchorUs >= 0ll) { 1705d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang mediaTimeUs -= mAbsoluteTimeAnchorUs; 1706d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang } 1707d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang if (mTimeOffsetValid) { 1708d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang mediaTimeUs -= mTimeOffsetUs; 1709d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang } 1710d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang mLastRecoveredPTS = (mediaTimeUs * 9) / 100; 1711d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang } 1712b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber } else if (type == DISCONTINUITY_ABSOLUTE_TIME) { 171387f2a558dd12043631e12c361abef301bf603140Andreas Huber int64_t timeUs; 1714e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (!extra->findInt64("timeUs", &timeUs)) { 1715e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim ALOGE("timeUs not found"); 1716e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return; 1717e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 171887f2a558dd12043631e12c361abef301bf603140Andreas Huber 1719e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (!mPrograms.empty()) { 1720e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim ALOGE("mPrograms is not empty"); 1721e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return; 1722e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 172387f2a558dd12043631e12c361abef301bf603140Andreas Huber mAbsoluteTimeAnchorUs = timeUs; 172487f2a558dd12043631e12c361abef301bf603140Andreas Huber return; 1725d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber } else if (type == DISCONTINUITY_TIME_OFFSET) { 1726d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber int64_t offset; 1727e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (!extra->findInt64("offset", &offset)) { 1728e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim ALOGE("offset not found"); 1729e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return; 1730e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 1731d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber 1732d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber mTimeOffsetValid = true; 1733d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber mTimeOffsetUs = offset; 1734d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber return; 173587f2a558dd12043631e12c361abef301bf603140Andreas Huber } 173687f2a558dd12043631e12c361abef301bf603140Andreas Huber 1737f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (size_t i = 0; i < mPrograms.size(); ++i) { 173832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber mPrograms.editItemAt(i)->signalDiscontinuity(type, extra); 1739f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1740f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1741f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1742f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ATSParser::signalEOS(status_t finalResult) { 1743e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (finalResult == (status_t) OK) { 1744e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim ALOGE("finalResult not OK"); 1745e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return; 1746e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 1747f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 17482a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber for (size_t i = 0; i < mPrograms.size(); ++i) { 1749f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mPrograms.editItemAt(i)->signalEOS(finalResult); 17502a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber } 17512a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber} 17522a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber 1753cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubervoid ATSParser::parseProgramAssociationTable(ABitReader *br) { 1754cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned table_id = br->getBits(8); 17553856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV(" table_id = %u", table_id); 17566456ae745e919085c5024f784aaa2703f9695f98David Yeh if (table_id != 0x00u) { 17576456ae745e919085c5024f784aaa2703f9695f98David Yeh ALOGE("PAT data error!"); 17586456ae745e919085c5024f784aaa2703f9695f98David Yeh return ; 17596456ae745e919085c5024f784aaa2703f9695f98David Yeh } 1760cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned section_syntax_indictor = br->getBits(1); 17613856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV(" section_syntax_indictor = %u", section_syntax_indictor); 1762cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1763e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim br->skipBits(1); // '0' 17646e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" reserved = %u", br->getBits(2)); 1765cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1766cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned section_length = br->getBits(12); 17673856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV(" section_length = %u", section_length); 1768cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 17696e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" transport_stream_id = %u", br->getBits(16)); 17706e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" reserved = %u", br->getBits(2)); 17716e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" version_number = %u", br->getBits(5)); 17726e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" current_next_indicator = %u", br->getBits(1)); 17736e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" section_number = %u", br->getBits(8)); 17746e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" last_section_number = %u", br->getBits(8)); 1775cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1776cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber size_t numProgramBytes = (section_length - 5 /* header */ - 4 /* crc */); 1777cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1778cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber for (size_t i = 0; i < numProgramBytes / 4; ++i) { 1779cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned program_number = br->getBits(16); 17803856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV(" program_number = %u", program_number); 1781cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 17826e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" reserved = %u", br->getBits(3)); 1783cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1784cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (program_number == 0) { 17856e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" network_PID = 0x%04x", br->getBits(13)); 1786cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } else { 1787cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned programMapPID = br->getBits(13); 1788cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 17893856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV(" program_map_PID = 0x%04x", programMapPID); 1790cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1791386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber bool found = false; 1792386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber for (size_t index = 0; index < mPrograms.size(); ++index) { 1793386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber const sp<Program> &program = mPrograms.itemAt(index); 1794386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber 1795386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber if (program->number() == program_number) { 1796386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber program->updateProgramMapPID(programMapPID); 1797386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber found = true; 1798386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber break; 1799386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber } 1800386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber } 1801386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber 1802386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber if (!found) { 1803386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber mPrograms.push( 1804d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang new Program(this, program_number, programMapPID, mLastRecoveredPTS)); 18053a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania if (mSampleAesKeyItem != NULL) { 18063a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania mPrograms.top()->signalNewSampleAesKey(mSampleAesKeyItem); 18073a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania } 1808386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber } 18098dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 18108dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber if (mPSISections.indexOfKey(programMapPID) < 0) { 18118dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber mPSISections.add(programMapPID, new PSISection); 18128dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber } 1813cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 1814cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 1815cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 18166e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" CRC = 0x%08x", br->getBits(32)); 1817cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 1818cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 181906528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huberstatus_t ATSParser::parsePID( 1820cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber ABitReader *br, unsigned PID, 182187f2a558dd12043631e12c361abef301bf603140Andreas Huber unsigned continuity_counter, 1822540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim unsigned payload_unit_start_indicator, 18233b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang unsigned transport_scrambling_control, 18243b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang unsigned random_access_indicator, 1825540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim SyncEvent *event) { 18268dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber ssize_t sectionIndex = mPSISections.indexOfKey(PID); 18278dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 18288dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber if (sectionIndex >= 0) { 18294b4bb11b8747adeb2efe56c7df4ab6803dd7db41Andreas Huber sp<PSISection> section = mPSISections.valueAt(sectionIndex); 18308dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 1831cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (payload_unit_start_indicator) { 18326456ae745e919085c5024f784aaa2703f9695f98David Yeh if (!section->isEmpty()) { 18339bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang ALOGW("parsePID encounters payload_unit_start_indicator when section is not empty"); 18349bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang section->clear(); 18356456ae745e919085c5024f784aaa2703f9695f98David Yeh } 18368dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 1837cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned skip = br->getBits(8); 18389ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim section->setSkipBytes(skip + 1); // skip filler bytes + pointer field itself 1839cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber br->skipBits(skip * 8); 1840cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 18418dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 1842e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (br->numBitsLeft() % 8 != 0) { 1843e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 1844e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 18458dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber status_t err = section->append(br->data(), br->numBitsLeft() / 8); 18468dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 18478dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber if (err != OK) { 18488dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber return err; 18498dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber } 18508dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 18518dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber if (!section->isComplete()) { 18528dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber return OK; 18538dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber } 18548dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 18559ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim if (!section->isCRCOkay()) { 18569ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim return BAD_VALUE; 18579ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim } 18588dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber ABitReader sectionBits(section->data(), section->size()); 18598dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 18608dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber if (PID == 0) { 18618dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber parseProgramAssociationTable(§ionBits); 18628dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber } else { 18638dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber bool handled = false; 18648dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber for (size_t i = 0; i < mPrograms.size(); ++i) { 18658dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber status_t err; 18668dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber if (!mPrograms.editItemAt(i)->parsePSISection( 18678dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber PID, §ionBits, &err)) { 18688dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber continue; 18698dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber } 18708dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 18718dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber if (err != OK) { 18728dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber return err; 18738dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber } 18748dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 18758dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber handled = true; 18768dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber break; 18778dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber } 18788dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 18798dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber if (!handled) { 18808dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber mPSISections.removeItem(PID); 18814b4bb11b8747adeb2efe56c7df4ab6803dd7db41Andreas Huber section.clear(); 18828dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber } 18838dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber } 18848dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 18854b4bb11b8747adeb2efe56c7df4ab6803dd7db41Andreas Huber if (section != NULL) { 18864b4bb11b8747adeb2efe56c7df4ab6803dd7db41Andreas Huber section->clear(); 18874b4bb11b8747adeb2efe56c7df4ab6803dd7db41Andreas Huber } 18888dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 188906528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber return OK; 1890cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 1891cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1892cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber bool handled = false; 1893cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber for (size_t i = 0; i < mPrograms.size(); ++i) { 189406528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber status_t err; 1895cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (mPrograms.editItemAt(i)->parsePID( 18963b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang PID, continuity_counter, 18973b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang payload_unit_start_indicator, 18983b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang transport_scrambling_control, 18993b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang random_access_indicator, 1900540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim br, &err, event)) { 190106528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber if (err != OK) { 190206528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber return err; 190306528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber } 190406528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber 1905cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber handled = true; 1906cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber break; 1907cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 1908cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 1909cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1910cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (!handled) { 19113b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang handled = mCasManager->parsePID(br, PID); 19123b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang } 19133b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang 19143b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang if (!handled) { 19153856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("PID 0x%04x not handled.", PID); 1916cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 191706528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber 191806528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber return OK; 1919cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 1920cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 19213b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhangstatus_t ATSParser::parseAdaptationField( 19223b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang ABitReader *br, unsigned PID, unsigned *random_access_indicator) { 19233b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang *random_access_indicator = 0; 1924cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned adaptation_field_length = br->getBits(8); 192587f2a558dd12043631e12c361abef301bf603140Andreas Huber 1926cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (adaptation_field_length > 0) { 19278a1fa1ebc2375c9dcaca2b78918c6740fff2ca74Jaesung Chung if (adaptation_field_length * 8 > br->numBitsLeft()) { 19288a1fa1ebc2375c9dcaca2b78918c6740fff2ca74Jaesung Chung ALOGV("Adaptation field should be included in a single TS packet."); 19298a1fa1ebc2375c9dcaca2b78918c6740fff2ca74Jaesung Chung return ERROR_MALFORMED; 19308a1fa1ebc2375c9dcaca2b78918c6740fff2ca74Jaesung Chung } 19318a1fa1ebc2375c9dcaca2b78918c6740fff2ca74Jaesung Chung 193287f2a558dd12043631e12c361abef301bf603140Andreas Huber unsigned discontinuity_indicator = br->getBits(1); 193387f2a558dd12043631e12c361abef301bf603140Andreas Huber 193487f2a558dd12043631e12c361abef301bf603140Andreas Huber if (discontinuity_indicator) { 193587f2a558dd12043631e12c361abef301bf603140Andreas Huber ALOGV("PID 0x%04x: discontinuity_indicator = 1 (!!!)", PID); 193687f2a558dd12043631e12c361abef301bf603140Andreas Huber } 193787f2a558dd12043631e12c361abef301bf603140Andreas Huber 19383b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang *random_access_indicator = br->getBits(1); 19393b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang if (*random_access_indicator) { 19403b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang ALOGV("PID 0x%04x: random_access_indicator = 1", PID); 19413b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang } 19423b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang 19433b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang unsigned elementary_stream_priority_indicator = br->getBits(1); 19443b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang if (elementary_stream_priority_indicator) { 19453b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang ALOGV("PID 0x%04x: elementary_stream_priority_indicator = 1", PID); 19463b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang } 19473b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang 194887f2a558dd12043631e12c361abef301bf603140Andreas Huber unsigned PCR_flag = br->getBits(1); 194987f2a558dd12043631e12c361abef301bf603140Andreas Huber 195087f2a558dd12043631e12c361abef301bf603140Andreas Huber size_t numBitsRead = 4; 195187f2a558dd12043631e12c361abef301bf603140Andreas Huber 195287f2a558dd12043631e12c361abef301bf603140Andreas Huber if (PCR_flag) { 1953e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (adaptation_field_length * 8 < 52) { 1954e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 1955e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 195687f2a558dd12043631e12c361abef301bf603140Andreas Huber br->skipBits(4); 195787f2a558dd12043631e12c361abef301bf603140Andreas Huber uint64_t PCR_base = br->getBits(32); 195887f2a558dd12043631e12c361abef301bf603140Andreas Huber PCR_base = (PCR_base << 1) | br->getBits(1); 195987f2a558dd12043631e12c361abef301bf603140Andreas Huber 196087f2a558dd12043631e12c361abef301bf603140Andreas Huber br->skipBits(6); 196187f2a558dd12043631e12c361abef301bf603140Andreas Huber unsigned PCR_ext = br->getBits(9); 196287f2a558dd12043631e12c361abef301bf603140Andreas Huber 196387f2a558dd12043631e12c361abef301bf603140Andreas Huber // The number of bytes from the start of the current 196487f2a558dd12043631e12c361abef301bf603140Andreas Huber // MPEG2 transport stream packet up and including 196587f2a558dd12043631e12c361abef301bf603140Andreas Huber // the final byte of this PCR_ext field. 196687f2a558dd12043631e12c361abef301bf603140Andreas Huber size_t byteOffsetFromStartOfTSPacket = 196787f2a558dd12043631e12c361abef301bf603140Andreas Huber (188 - br->numBitsLeft() / 8); 196887f2a558dd12043631e12c361abef301bf603140Andreas Huber 196987f2a558dd12043631e12c361abef301bf603140Andreas Huber uint64_t PCR = PCR_base * 300 + PCR_ext; 197087f2a558dd12043631e12c361abef301bf603140Andreas Huber 1971b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross ALOGV("PID 0x%04x: PCR = 0x%016" PRIx64 " (%.2f)", 197287f2a558dd12043631e12c361abef301bf603140Andreas Huber PID, PCR, PCR / 27E6); 197387f2a558dd12043631e12c361abef301bf603140Andreas Huber 197487f2a558dd12043631e12c361abef301bf603140Andreas Huber // The number of bytes received by this parser up to and 197587f2a558dd12043631e12c361abef301bf603140Andreas Huber // including the final byte of this PCR_ext field. 197619cec89f8b05fd05f8034ee1a4cd39ee09c33f02Marco Nelissen uint64_t byteOffsetFromStart = 197719cec89f8b05fd05f8034ee1a4cd39ee09c33f02Marco Nelissen uint64_t(mNumTSPacketsParsed) * 188 + byteOffsetFromStartOfTSPacket; 197887f2a558dd12043631e12c361abef301bf603140Andreas Huber 197987f2a558dd12043631e12c361abef301bf603140Andreas Huber for (size_t i = 0; i < mPrograms.size(); ++i) { 198087f2a558dd12043631e12c361abef301bf603140Andreas Huber updatePCR(PID, PCR, byteOffsetFromStart); 198187f2a558dd12043631e12c361abef301bf603140Andreas Huber } 198287f2a558dd12043631e12c361abef301bf603140Andreas Huber 198387f2a558dd12043631e12c361abef301bf603140Andreas Huber numBitsRead += 52; 198487f2a558dd12043631e12c361abef301bf603140Andreas Huber } 198587f2a558dd12043631e12c361abef301bf603140Andreas Huber 198687f2a558dd12043631e12c361abef301bf603140Andreas Huber br->skipBits(adaptation_field_length * 8 - numBitsRead); 1987cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 1988e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return OK; 1989cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 1990cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1991540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kimstatus_t ATSParser::parseTS(ABitReader *br, SyncEvent *event) { 19923856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("---"); 1993cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1994cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned sync_byte = br->getBits(8); 19956456ae745e919085c5024f784aaa2703f9695f98David Yeh if (sync_byte != 0x47u) { 19966456ae745e919085c5024f784aaa2703f9695f98David Yeh ALOGE("[error] parseTS: return error as sync_byte=0x%x", sync_byte); 19976456ae745e919085c5024f784aaa2703f9695f98David Yeh return BAD_VALUE; 19986456ae745e919085c5024f784aaa2703f9695f98David Yeh } 1999cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 200052668ca838e1869676ff95e7388f93ec1858b1e9Andreas Huber if (br->getBits(1)) { // transport_error_indicator 200152668ca838e1869676ff95e7388f93ec1858b1e9Andreas Huber // silently ignore. 200252668ca838e1869676ff95e7388f93ec1858b1e9Andreas Huber return OK; 200352668ca838e1869676ff95e7388f93ec1858b1e9Andreas Huber } 2004cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 2005cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned payload_unit_start_indicator = br->getBits(1); 20063856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("payload_unit_start_indicator = %u", payload_unit_start_indicator); 2007cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 20086e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV("transport_priority = %u", br->getBits(1)); 2009cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 2010cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned PID = br->getBits(13); 20113856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("PID = 0x%04x", PID); 2012cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 20133b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang unsigned transport_scrambling_control = br->getBits(2); 20143b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang ALOGV("transport_scrambling_control = %u", transport_scrambling_control); 2015cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 2016cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned adaptation_field_control = br->getBits(2); 20173856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("adaptation_field_control = %u", adaptation_field_control); 2018cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 20190da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber unsigned continuity_counter = br->getBits(4); 202087f2a558dd12043631e12c361abef301bf603140Andreas Huber ALOGV("PID = 0x%04x, continuity_counter = %u", PID, continuity_counter); 20210da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber 2022df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block // ALOGI("PID = 0x%04x, continuity_counter = %u", PID, continuity_counter); 2023cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 202487f2a558dd12043631e12c361abef301bf603140Andreas Huber status_t err = OK; 202587f2a558dd12043631e12c361abef301bf603140Andreas Huber 20263b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang unsigned random_access_indicator = 0; 2027e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (adaptation_field_control == 2 || adaptation_field_control == 3) { 20283b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang err = parseAdaptationField(br, PID, &random_access_indicator); 2029e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 2030e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (err == OK) { 2031e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (adaptation_field_control == 1 || adaptation_field_control == 3) { 2032540006666b4191cd78391378f1c66c21bcf0c4cdWonsik Kim err = parsePID(br, PID, continuity_counter, 20333b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang payload_unit_start_indicator, 20343b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang transport_scrambling_control, 20353b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang random_access_indicator, 20363b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang event); 2037e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 2038cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 203906528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber 204087f2a558dd12043631e12c361abef301bf603140Andreas Huber ++mNumTSPacketsParsed; 204187f2a558dd12043631e12c361abef301bf603140Andreas Huber 204287f2a558dd12043631e12c361abef301bf603140Andreas Huber return err; 2043cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 2044cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 2045cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubersp<MediaSource> ATSParser::getSource(SourceType type) { 20469ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih sp<MediaSource> firstSourceFound; 2047cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber for (size_t i = 0; i < mPrograms.size(); ++i) { 2048386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber const sp<Program> &program = mPrograms.editItemAt(i); 20499ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih sp<MediaSource> source = program->getSource(type); 20509ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih if (source == NULL) { 2051386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber continue; 2052386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber } 20539ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih if (firstSourceFound == NULL) { 20549ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih firstSourceFound = source; 20559ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih } 20569ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih // Prefer programs with both audio/video 20579ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih switch (type) { 20589ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih case VIDEO: { 20599ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih if (program->hasSource(AUDIO)) { 20609ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih return source; 20619ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih } 20629ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih break; 20639ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih } 2064386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber 20659ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih case AUDIO: { 20669ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih if (program->hasSource(VIDEO)) { 20679ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih return source; 20689ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih } 20699ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih break; 20709ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih } 2071cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 20729ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih default: 20739ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih return source; 2074cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 2075cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 2076cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 20779ff1e728de605c4cbc61bc95bb36e515b93654fbRobert Shih return firstSourceFound; 2078cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 2079cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 2080bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shihbool ATSParser::hasSource(SourceType type) const { 2081bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih for (size_t i = 0; i < mPrograms.size(); ++i) { 2082bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih const sp<Program> &program = mPrograms.itemAt(i); 2083bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih if (program->hasSource(type)) { 2084bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih return true; 2085bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih } 2086bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih } 2087bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih 2088bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih return false; 2089bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih} 2090bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih 209143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huberbool ATSParser::PTSTimeDeltaEstablished() { 209243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mPrograms.isEmpty()) { 209343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber return false; 209443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 209543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 209643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber return mPrograms.editItemAt(0)->PTSTimeDeltaEstablished(); 209743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber} 209843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 209982e147049625a4cfdcb228a1de7efda594d446c9Robert Shihint64_t ATSParser::getFirstPTSTimeUs() { 210082e147049625a4cfdcb228a1de7efda594d446c9Robert Shih for (size_t i = 0; i < mPrograms.size(); ++i) { 210182e147049625a4cfdcb228a1de7efda594d446c9Robert Shih sp<ATSParser::Program> program = mPrograms.itemAt(i); 210282e147049625a4cfdcb228a1de7efda594d446c9Robert Shih if (program->PTSTimeDeltaEstablished()) { 210382e147049625a4cfdcb228a1de7efda594d446c9Robert Shih return (program->firstPTS() * 100) / 9; 210482e147049625a4cfdcb228a1de7efda594d446c9Robert Shih } 210582e147049625a4cfdcb228a1de7efda594d446c9Robert Shih } 210682e147049625a4cfdcb228a1de7efda594d446c9Robert Shih return -1; 210782e147049625a4cfdcb228a1de7efda594d446c9Robert Shih} 210882e147049625a4cfdcb228a1de7efda594d446c9Robert Shih 2109c9fa35cf7c9c11a8acb77128db1a6a13f1befe3cChad Brubaker__attribute__((no_sanitize("integer"))) 211087f2a558dd12043631e12c361abef301bf603140Andreas Hubervoid ATSParser::updatePCR( 211119cec89f8b05fd05f8034ee1a4cd39ee09c33f02Marco Nelissen unsigned /* PID */, uint64_t PCR, uint64_t byteOffsetFromStart) { 211219cec89f8b05fd05f8034ee1a4cd39ee09c33f02Marco Nelissen ALOGV("PCR 0x%016" PRIx64 " @ %" PRIx64, PCR, byteOffsetFromStart); 211387f2a558dd12043631e12c361abef301bf603140Andreas Huber 211487f2a558dd12043631e12c361abef301bf603140Andreas Huber if (mNumPCRs == 2) { 211587f2a558dd12043631e12c361abef301bf603140Andreas Huber mPCR[0] = mPCR[1]; 211687f2a558dd12043631e12c361abef301bf603140Andreas Huber mPCRBytes[0] = mPCRBytes[1]; 211787f2a558dd12043631e12c361abef301bf603140Andreas Huber mSystemTimeUs[0] = mSystemTimeUs[1]; 211887f2a558dd12043631e12c361abef301bf603140Andreas Huber mNumPCRs = 1; 211987f2a558dd12043631e12c361abef301bf603140Andreas Huber } 212087f2a558dd12043631e12c361abef301bf603140Andreas Huber 212187f2a558dd12043631e12c361abef301bf603140Andreas Huber mPCR[mNumPCRs] = PCR; 212287f2a558dd12043631e12c361abef301bf603140Andreas Huber mPCRBytes[mNumPCRs] = byteOffsetFromStart; 212387f2a558dd12043631e12c361abef301bf603140Andreas Huber mSystemTimeUs[mNumPCRs] = ALooper::GetNowUs(); 212487f2a558dd12043631e12c361abef301bf603140Andreas Huber 212587f2a558dd12043631e12c361abef301bf603140Andreas Huber ++mNumPCRs; 212687f2a558dd12043631e12c361abef301bf603140Andreas Huber 212787f2a558dd12043631e12c361abef301bf603140Andreas Huber if (mNumPCRs == 2) { 2128c9fa35cf7c9c11a8acb77128db1a6a13f1befe3cChad Brubaker /* Unsigned overflow here */ 212987f2a558dd12043631e12c361abef301bf603140Andreas Huber double transportRate = 213087f2a558dd12043631e12c361abef301bf603140Andreas Huber (mPCRBytes[1] - mPCRBytes[0]) * 27E6 / (mPCR[1] - mPCR[0]); 213187f2a558dd12043631e12c361abef301bf603140Andreas Huber 213287f2a558dd12043631e12c361abef301bf603140Andreas Huber ALOGV("transportRate = %.2f bytes/sec", transportRate); 213387f2a558dd12043631e12c361abef301bf603140Andreas Huber } 213487f2a558dd12043631e12c361abef301bf603140Andreas Huber} 213587f2a558dd12043631e12c361abef301bf603140Andreas Huber 21368dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber//////////////////////////////////////////////////////////////////////////////// 21378dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 21389ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 21399ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim// CRC32 used for PSI section. The table was generated by following command: 21409ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim// $ python pycrc.py --model crc-32-mpeg --algorithm table-driven --generate c 21419ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim// Visit http://www.tty1.net/pycrc/index_en.html for more details. 21429ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kimuint32_t ATSParser::PSISection::CRC_TABLE[] = { 21439ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9, 21449ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x130476dc, 0x17c56b6b, 0x1a864db2, 0x1e475005, 21459ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61, 21469ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd, 21479ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9, 21489ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75, 21499ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011, 21509ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x791d4014, 0x7ddc5da3, 0x709f7b7a, 0x745e66cd, 21519ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039, 21529ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, 21539ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0xbe2b5b58, 0xbaea46ef, 0xb7a96036, 0xb3687d81, 21549ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d, 21559ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49, 21569ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95, 21579ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1, 21589ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, 21599ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x34867077, 0x30476dc0, 0x3d044b19, 0x39c556ae, 21609ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072, 21619ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16, 21629ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca, 21639ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde, 21649ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02, 21659ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x5e9f46bf, 0x5a5e5b08, 0x571d7dd1, 0x53dc6066, 21669ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba, 21679ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, 21689ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0xbfa1b04b, 0xbb60adfc, 0xb6238b25, 0xb2e29692, 21699ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6, 21709ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a, 21719ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e, 21729ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2, 21739ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686, 21749ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0xd5b88683, 0xd1799b34, 0xdc3abded, 0xd8fba05a, 21759ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637, 21769ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb, 21779ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f, 21789ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53, 21799ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47, 21809ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x36194d42, 0x32d850f5, 0x3f9b762c, 0x3b5a6b9b, 21819ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff, 21829ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623, 21839ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0xf12f560e, 0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7, 21849ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b, 21859ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f, 21869ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3, 21879ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7, 21889ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b, 21899ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x9b3660c6, 0x9ff77d71, 0x92b45ba8, 0x9675461f, 21909ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3, 21919ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640, 21929ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c, 21939ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8, 21949ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24, 21959ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x119b4be9, 0x155a565e, 0x18197087, 0x1cd86d30, 21969ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec, 21979ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, 21989ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x2497d08d, 0x2056cd3a, 0x2d15ebe3, 0x29d4f654, 21999ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0, 22009ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c, 22019ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18, 22029ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4, 22039ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0, 22049ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x9abc8bd5, 0x9e7d9662, 0x933eb0bb, 0x97ffad0c, 22059ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668, 22069ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4 22079ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim }; 22089ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 22099ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk KimATSParser::PSISection::PSISection() : 22109ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim mSkipBytes(0) { 22118dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber} 22128dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 22138dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas HuberATSParser::PSISection::~PSISection() { 22148dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber} 22158dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 22168dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberstatus_t ATSParser::PSISection::append(const void *data, size_t size) { 22178dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber if (mBuffer == NULL || mBuffer->size() + size > mBuffer->capacity()) { 22188dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber size_t newCapacity = 22198dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber (mBuffer == NULL) ? size : mBuffer->capacity() + size; 22208dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 22218dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber newCapacity = (newCapacity + 1023) & ~1023; 22228dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 22238dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber sp<ABuffer> newBuffer = new ABuffer(newCapacity); 22248dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 22258dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber if (mBuffer != NULL) { 22268dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber memcpy(newBuffer->data(), mBuffer->data(), mBuffer->size()); 22278dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber newBuffer->setRange(0, mBuffer->size()); 22288dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber } else { 22298dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber newBuffer->setRange(0, 0); 22308dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber } 22318dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 22328dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber mBuffer = newBuffer; 22338dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber } 22348dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 22358dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber memcpy(mBuffer->data() + mBuffer->size(), data, size); 22368dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber mBuffer->setRange(0, mBuffer->size() + size); 22378dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 22388dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber return OK; 22398dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber} 22408dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 22419ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kimvoid ATSParser::PSISection::setSkipBytes(uint8_t skip) { 22429ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim mSkipBytes = skip; 22439ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim} 22449ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 22458dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Hubervoid ATSParser::PSISection::clear() { 22468dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber if (mBuffer != NULL) { 22478dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber mBuffer->setRange(0, 0); 22488dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber } 22499ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim mSkipBytes = 0; 22508dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber} 22518dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 22528dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberbool ATSParser::PSISection::isComplete() const { 22538dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber if (mBuffer == NULL || mBuffer->size() < 3) { 22548dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber return false; 22558dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber } 22568dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 22578dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber unsigned sectionLength = U16_AT(mBuffer->data() + 1) & 0xfff; 22588dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber return mBuffer->size() >= sectionLength + 3; 22598dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber} 22608dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 22618dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberbool ATSParser::PSISection::isEmpty() const { 22628dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber return mBuffer == NULL || mBuffer->size() == 0; 22638dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber} 22648dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 22658dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberconst uint8_t *ATSParser::PSISection::data() const { 22668dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber return mBuffer == NULL ? NULL : mBuffer->data(); 22678dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber} 22688dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 22698dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Hubersize_t ATSParser::PSISection::size() const { 22708dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber return mBuffer == NULL ? 0 : mBuffer->size(); 22718dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber} 22728dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 22739ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kimbool ATSParser::PSISection::isCRCOkay() const { 22749ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim if (!isComplete()) { 22759ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim return false; 22769ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim } 22779ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim uint8_t* data = mBuffer->data(); 22789ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 22799ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim // Return true if section_syntax_indicator says no section follows the field section_length. 22809ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim if ((data[1] & 0x80) == 0) { 22819ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim return true; 22829ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim } 22839ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 22849ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim unsigned sectionLength = U16_AT(data + 1) & 0xfff; 22859ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim ALOGV("sectionLength %u, skip %u", sectionLength, mSkipBytes); 22869ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 2287c0c9f50d15f7b9ed539c0c6277296d083f41b293Marco Nelissen 2288c0c9f50d15f7b9ed539c0c6277296d083f41b293Marco Nelissen if(sectionLength < mSkipBytes) { 2289c0c9f50d15f7b9ed539c0c6277296d083f41b293Marco Nelissen ALOGE("b/28333006"); 2290c0c9f50d15f7b9ed539c0c6277296d083f41b293Marco Nelissen android_errorWriteLog(0x534e4554, "28333006"); 2291c0c9f50d15f7b9ed539c0c6277296d083f41b293Marco Nelissen return false; 2292c0c9f50d15f7b9ed539c0c6277296d083f41b293Marco Nelissen } 2293c0c9f50d15f7b9ed539c0c6277296d083f41b293Marco Nelissen 22949ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim // Skip the preceding field present when payload start indicator is on. 22959ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim sectionLength -= mSkipBytes; 22969ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 22979ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim uint32_t crc = 0xffffffff; 22989ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim for(unsigned i = 0; i < sectionLength + 4 /* crc */; i++) { 22999ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim uint8_t b = data[i]; 23009ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim int index = ((crc >> 24) ^ (b & 0xff)) & 0xff; 23019ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim crc = CRC_TABLE[index] ^ (crc << 8); 23029ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim } 23039ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim ALOGV("crc: %08x\n", crc); 23049ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim return (crc == 0); 23059ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim} 23063a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania 23073a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania// SAMPLE_AES key handling 23083a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania// TODO: Merge these to their respective class after Widevine-HLS 23093a37f3e948b600405e0c70b8a241778fda44168eHassan Shojaniavoid ATSParser::signalNewSampleAesKey(const sp<AMessage> &keyItem) { 23103a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania ALOGD("signalNewSampleAesKey: %p", keyItem.get()); 23113a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania 23123a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania mSampleAesKeyItem = keyItem; 23133a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania 23143a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania // a NULL key item will propagate to existing ElementaryStreamQueues 23153a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania for (size_t i = 0; i < mPrograms.size(); ++i) { 23163a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania mPrograms[i]->signalNewSampleAesKey(keyItem); 23173a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania } 23183a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania} 23193a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania 23203a37f3e948b600405e0c70b8a241778fda44168eHassan Shojaniavoid ATSParser::Program::signalNewSampleAesKey(const sp<AMessage> &keyItem) { 23213a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania ALOGD("Program::signalNewSampleAesKey: %p", keyItem.get()); 23223a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania 23233a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania mSampleAesKeyItem = keyItem; 23243a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania 23253a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania // a NULL key item will propagate to existing ElementaryStreamQueues 23263a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania for (size_t i = 0; i < mStreams.size(); ++i) { 23273a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania mStreams[i]->signalNewSampleAesKey(keyItem); 23283a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania } 23293a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania} 23303a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania 23313a37f3e948b600405e0c70b8a241778fda44168eHassan Shojaniavoid ATSParser::Stream::signalNewSampleAesKey(const sp<AMessage> &keyItem) { 23323a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania ALOGD("Stream::signalNewSampleAesKey: 0x%04x size = %zu keyItem: %p", 23333a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania mElementaryPID, mBuffer->size(), keyItem.get()); 23343a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania 23353a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania // a NULL key item will propagate to existing ElementaryStreamQueues 23363a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania mSampleAesKeyItem = keyItem; 23373a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania 23383a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania flush(NULL); 23393a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania mQueue->signalNewSampleAesKey(keyItem); 23403a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania} 23413a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania 2342cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} // namespace android 2343