blob: 1482072b3bd76b840c1b5b5f172fbd09ede6d8b1 [file] [log] [blame]
Andreas Hubercda17c62010-06-07 13:05:37 -07001/*
2 * Copyright (C) 2010 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Andreas Huber6e4c5c42010-09-21 13:13:15 -070017//#define LOG_NDEBUG 0
18#define LOG_TAG "ATSParser"
19#include <utils/Log.h>
Andreas Hubercda17c62010-06-07 13:05:37 -070020#include "ATSParser.h"
Andreas Hubercda17c62010-06-07 13:05:37 -070021#include "AnotherPacketSource.h"
Chong Zhang3b2847f2017-01-18 17:43:03 -080022#include "CasManager.h"
Andreas Huber6a63a932010-10-01 10:51:41 -070023#include "ESQueue.h"
Andreas Hubercda17c62010-06-07 13:05:37 -070024
Chong Zhangd5a416a2017-05-16 11:16:34 -070025#include <android/hardware/cas/native/1.0/IDescrambler.h>
Chong Zhang00c5c052018-12-17 14:15:58 -080026#include <android/hidl/allocator/1.0/IAllocator.h>
27#include <android/hidl/memory/1.0/IMemory.h>
Chong Zhangd5a416a2017-05-16 11:16:34 -070028#include <cutils/native_handle.h>
Chong Zhang00c5c052018-12-17 14:15:58 -080029#include <hidlmemory/mapping.h>
Chong Zhangd1af6412018-02-20 10:59:37 -080030#include <media/cas/DescramblerAPI.h>
Andreas Huber85f12e92010-08-19 10:39:47 -070031#include <media/stagefright/foundation/ABitReader.h>
Andreas Hubercda17c62010-06-07 13:05:37 -070032#include <media/stagefright/foundation/ABuffer.h>
33#include <media/stagefright/foundation/ADebug.h>
34#include <media/stagefright/foundation/AMessage.h>
Dongwon Kang60761282017-10-09 11:16:48 -070035#include <media/stagefright/foundation/ByteUtils.h>
Dongwon Kang15d02f82017-12-14 16:32:18 -080036#include <media/stagefright/foundation/MediaKeys.h>
Dongwon Kangd91dc5a2017-10-10 00:07:09 -070037#include <media/stagefright/foundation/avc_utils.h>
Andreas Hubercda17c62010-06-07 13:05:37 -070038#include <media/stagefright/foundation/hexdump.h>
39#include <media/stagefright/MediaDefs.h>
40#include <media/stagefright/MediaErrors.h>
41#include <media/stagefright/MetaData.h>
Andreas Huber32f3cef2011-03-02 15:34:46 -080042#include <media/IStreamSource.h>
Andreas Hubercda17c62010-06-07 13:05:37 -070043#include <utils/KeyedVector.h>
Chong Zhang9bcf3ae2015-03-08 15:59:01 -070044#include <utils/Vector.h>
Andreas Hubercda17c62010-06-07 13:05:37 -070045
Colin Crossb4a7a2d2014-03-19 16:59:00 -070046#include <inttypes.h>
47
Andreas Hubercda17c62010-06-07 13:05:37 -070048namespace android {
Chong Zhangd5a416a2017-05-16 11:16:34 -070049using hardware::hidl_string;
50using hardware::hidl_vec;
Chong Zhang00c5c052018-12-17 14:15:58 -080051using hardware::hidl_memory;
Chong Zhangd5a416a2017-05-16 11:16:34 -070052using namespace hardware::cas::V1_0;
53using namespace hardware::cas::native::V1_0;
Chong Zhang00c5c052018-12-17 14:15:58 -080054typedef hidl::allocator::V1_0::IAllocator TAllocator;
55typedef hidl::memory::V1_0::IMemory TMemory;
Andreas Hubercda17c62010-06-07 13:05:37 -070056
Andreas Huber6e4c5c42010-09-21 13:13:15 -070057// I want the expression "y" evaluated even if verbose logging is off.
58#define MY_LOGV(x, y) \
Steve Block3856b092011-10-20 11:56:00 +010059 do { unsigned tmp = y; ALOGV(x, tmp); } while (0)
Andreas Huber6e4c5c42010-09-21 13:13:15 -070060
Andreas Hubercda17c62010-06-07 13:05:37 -070061static const size_t kTSPacketSize = 188;
62
63struct ATSParser::Program : public RefBase {
Chong Zhangd47dfcb2015-03-27 15:53:45 -070064 Program(ATSParser *parser, unsigned programNumber, unsigned programMapPID,
65 int64_t lastRecoveredPTS);
Andreas Hubercda17c62010-06-07 13:05:37 -070066
Andreas Huber8dfa2282012-05-15 12:37:29 -070067 bool parsePSISection(
68 unsigned pid, ABitReader *br, status_t *err);
69
Wonsik Kim54000662015-04-13 10:59:06 +090070 // Pass to appropriate stream according to pid, and set event if it's a PES
71 // with a sync frame.
72 // Note that the method itself does not touch event.
Andreas Hubercda17c62010-06-07 13:05:37 -070073 bool parsePID(
Andreas Huber87f2a552012-08-31 13:55:24 -070074 unsigned pid, unsigned continuity_counter,
75 unsigned payload_unit_start_indicator,
Chong Zhang3b2847f2017-01-18 17:43:03 -080076 unsigned transport_scrambling_control,
77 unsigned random_access_indicator,
Wonsik Kim54000662015-04-13 10:59:06 +090078 ABitReader *br, status_t *err, SyncEvent *event);
Andreas Hubercda17c62010-06-07 13:05:37 -070079
Andreas Huber32f3cef2011-03-02 15:34:46 -080080 void signalDiscontinuity(
81 DiscontinuityType type, const sp<AMessage> &extra);
82
Andreas Huberf9334412010-12-15 15:17:42 -080083 void signalEOS(status_t finalResult);
Andreas Huber2a4d22d2010-09-08 14:32:20 -070084
Marco Nelissen45d54c62018-01-26 10:04:22 -080085 sp<AnotherPacketSource> getSource(SourceType type);
Robert Shihbf207272014-10-30 17:22:11 -070086 bool hasSource(SourceType type) const;
Andreas Hubercda17c62010-06-07 13:05:37 -070087
Andreas Huberbff07d02010-10-12 11:34:37 -070088 int64_t convertPTSToTimestamp(uint64_t PTS);
89
Andreas Huber43c3e6c2011-01-05 12:17:08 -080090 bool PTSTimeDeltaEstablished() const {
91 return mFirstPTSValid;
92 }
93
Andreas Huber386d6092011-05-19 08:37:39 -070094 unsigned number() const { return mProgramNumber; }
95
96 void updateProgramMapPID(unsigned programMapPID) {
97 mProgramMapPID = programMapPID;
98 }
99
Andreas Huber8dfa2282012-05-15 12:37:29 -0700100 unsigned programMapPID() const {
101 return mProgramMapPID;
102 }
103
Andreas Huber87f2a552012-08-31 13:55:24 -0700104 uint32_t parserFlags() const {
105 return mParser->mFlags;
106 }
107
Chong Zhang3b2847f2017-01-18 17:43:03 -0800108 sp<CasManager> casManager() const {
109 return mParser->mCasManager;
110 }
111
Robert Shih82e14702016-11-17 11:24:29 -0800112 uint64_t firstPTS() const {
113 return mFirstPTS;
114 }
115
Chong Zhang3b2847f2017-01-18 17:43:03 -0800116 void updateCasSessions();
117
Hassan Shojania3a37f3e2017-04-19 14:29:42 -0700118 void signalNewSampleAesKey(const sp<AMessage> &keyItem);
119
Andreas Hubercda17c62010-06-07 13:05:37 -0700120private:
Chong Zhang9bcf3ae2015-03-08 15:59:01 -0700121
Andreas Huberf9334412010-12-15 15:17:42 -0800122 ATSParser *mParser;
Andreas Huber386d6092011-05-19 08:37:39 -0700123 unsigned mProgramNumber;
Andreas Hubercda17c62010-06-07 13:05:37 -0700124 unsigned mProgramMapPID;
Sampath Shetty142598f2018-12-10 13:52:30 +1100125 uint32_t mPMTVersion;
126 uint32_t mPMT_CRC;
Andreas Hubercda17c62010-06-07 13:05:37 -0700127 KeyedVector<unsigned, sp<Stream> > mStreams;
Andreas Huberbff07d02010-10-12 11:34:37 -0700128 bool mFirstPTSValid;
129 uint64_t mFirstPTS;
Chong Zhang799c9682015-03-02 23:42:38 -0800130 int64_t mLastRecoveredPTS;
Hassan Shojania3a37f3e2017-04-19 14:29:42 -0700131 sp<AMessage> mSampleAesKeyItem;
Andreas Hubercda17c62010-06-07 13:05:37 -0700132
Andreas Huber06528d72011-08-31 16:29:05 -0700133 status_t parseProgramMap(ABitReader *br);
Chong Zhang799c9682015-03-02 23:42:38 -0800134 int64_t recoverPTS(uint64_t PTS_33bit);
Chong Zhang3b2847f2017-01-18 17:43:03 -0800135 bool findCADescriptor(
136 ABitReader *br, unsigned infoLength, CADescriptor *caDescriptor);
Chong Zhang9bcf3ae2015-03-08 15:59:01 -0700137 bool switchPIDs(const Vector<StreamInfo> &infos);
Andreas Hubercda17c62010-06-07 13:05:37 -0700138
139 DISALLOW_EVIL_CONSTRUCTORS(Program);
140};
141
142struct ATSParser::Stream : public RefBase {
Chong Zhang7e986a82018-11-07 13:01:08 -0800143 Stream(Program *program, unsigned PCR_PID, const StreamInfo &info);
Andreas Hubercda17c62010-06-07 13:05:37 -0700144
Andreas Huberbc7f5b22011-01-21 10:15:23 -0800145 unsigned type() const { return mStreamType; }
Previr Rangroo7e6ac732017-11-13 20:20:20 -0800146 unsigned typeExt() const { return mStreamTypeExt; }
Andreas Huberbc7f5b22011-01-21 10:15:23 -0800147 unsigned pid() const { return mElementaryPID; }
148 void setPID(unsigned pid) { mElementaryPID = pid; }
Sampath Shetty142598f2018-12-10 13:52:30 +1100149 void setAudioPresentations(AudioPresentationCollection audioPresentations) {
150 mAudioPresentations = audioPresentations;
151 }
Andreas Huberbc7f5b22011-01-21 10:15:23 -0800152
Chong Zhangbc7aae42017-03-31 14:53:19 -0700153 void setCasInfo(
154 int32_t systemId,
Chong Zhang3b2847f2017-01-18 17:43:03 -0800155 const sp<IDescrambler> &descrambler,
156 const std::vector<uint8_t> &sessionId);
157
Wonsik Kim54000662015-04-13 10:59:06 +0900158 // Parse the payload and set event when PES with a sync frame is detected.
Wei Jia9558f6d2016-03-08 17:31:16 -0800159 // This method knows when a PES starts; so record mPesStartOffsets in that
Wonsik Kim54000662015-04-13 10:59:06 +0900160 // case.
Andreas Huber54031292011-09-01 11:04:43 -0700161 status_t parse(
Andreas Huber87f2a552012-08-31 13:55:24 -0700162 unsigned continuity_counter,
Andreas Hubercda17c62010-06-07 13:05:37 -0700163 unsigned payload_unit_start_indicator,
Chong Zhang3b2847f2017-01-18 17:43:03 -0800164 unsigned transport_scrambling_control,
165 unsigned random_access_indicator,
Wonsik Kim54000662015-04-13 10:59:06 +0900166 ABitReader *br,
167 SyncEvent *event);
Andreas Hubercda17c62010-06-07 13:05:37 -0700168
Andreas Huber32f3cef2011-03-02 15:34:46 -0800169 void signalDiscontinuity(
170 DiscontinuityType type, const sp<AMessage> &extra);
171
Andreas Huberf9334412010-12-15 15:17:42 -0800172 void signalEOS(status_t finalResult);
Andreas Huber2a4d22d2010-09-08 14:32:20 -0700173
Robert Shih82e14702016-11-17 11:24:29 -0800174 SourceType getSourceType();
Marco Nelissen45d54c62018-01-26 10:04:22 -0800175 sp<AnotherPacketSource> getSource(SourceType type);
Andreas Hubercda17c62010-06-07 13:05:37 -0700176
Robert Shihbf207272014-10-30 17:22:11 -0700177 bool isAudio() const;
178 bool isVideo() const;
Robert Shih08528432015-04-08 09:06:54 -0700179 bool isMeta() const;
Robert Shihbf207272014-10-30 17:22:11 -0700180
Hassan Shojania3a37f3e2017-04-19 14:29:42 -0700181 void signalNewSampleAesKey(const sp<AMessage> &keyItem);
182
Andreas Hubercda17c62010-06-07 13:05:37 -0700183protected:
184 virtual ~Stream();
185
186private:
Chong Zhang3b2847f2017-01-18 17:43:03 -0800187 struct SubSampleInfo {
188 size_t subSampleSize;
189 unsigned transport_scrambling_mode;
190 unsigned random_access_indicator;
191 };
Andreas Huberbff07d02010-10-12 11:34:37 -0700192 Program *mProgram;
Andreas Hubercda17c62010-06-07 13:05:37 -0700193 unsigned mElementaryPID;
194 unsigned mStreamType;
Previr Rangroo7e6ac732017-11-13 20:20:20 -0800195 unsigned mStreamTypeExt;
Andreas Huber87f2a552012-08-31 13:55:24 -0700196 unsigned mPCR_PID;
197 int32_t mExpectedContinuityCounter;
Andreas Hubercda17c62010-06-07 13:05:37 -0700198
199 sp<ABuffer> mBuffer;
200 sp<AnotherPacketSource> mSource;
201 bool mPayloadStarted;
Marco Nelissenbe9634d2015-04-15 14:33:39 -0700202 bool mEOSReached;
Andreas Hubercda17c62010-06-07 13:05:37 -0700203
Andreas Huber90a92052012-10-30 15:53:03 -0700204 uint64_t mPrevPTS;
Wei Jia9558f6d2016-03-08 17:31:16 -0800205 List<off64_t> mPesStartOffsets;
Andreas Huber90a92052012-10-30 15:53:03 -0700206
Andreas Huber386d6092011-05-19 08:37:39 -0700207 ElementaryStreamQueue *mQueue;
Andreas Huber6a63a932010-10-01 10:51:41 -0700208
Chong Zhang3b2847f2017-01-18 17:43:03 -0800209 bool mScrambled;
Hassan Shojania3a37f3e2017-04-19 14:29:42 -0700210 bool mSampleEncrypted;
211 sp<AMessage> mSampleAesKeyItem;
Chong Zhang00c5c052018-12-17 14:15:58 -0800212 sp<TMemory> mHidlMemory;
213 sp<TAllocator> mHidlAllocator;
Chong Zhangd5a416a2017-05-16 11:16:34 -0700214 hardware::cas::native::V1_0::SharedBuffer mDescramblerSrcBuffer;
Chong Zhang3b2847f2017-01-18 17:43:03 -0800215 sp<ABuffer> mDescrambledBuffer;
216 List<SubSampleInfo> mSubSamples;
217 sp<IDescrambler> mDescrambler;
Sampath Shetty0ac73a52018-03-27 15:16:35 +1100218 AudioPresentationCollection mAudioPresentations;
Chong Zhang3b2847f2017-01-18 17:43:03 -0800219
Sampath Shettyc6148a62018-12-18 15:50:43 +1100220 // Send audio presentations along with access units.
221 void addAudioPresentations(const sp<ABuffer> &buffer);
222
Wonsik Kim54000662015-04-13 10:59:06 +0900223 // Flush accumulated payload if necessary --- i.e. at EOS or at the start of
224 // another payload. event is set if the flushed payload is PES with a sync
225 // frame.
226 status_t flush(SyncEvent *event);
Chong Zhang3b2847f2017-01-18 17:43:03 -0800227
228 // Flush accumulated payload for scrambled streams if necessary --- i.e. at
229 // EOS or at the start of another payload. event is set if the flushed
230 // payload is PES with a sync frame.
231 status_t flushScrambled(SyncEvent *event);
232
233 // Check if a PES packet is scrambled at PES level.
234 uint32_t getPesScramblingControl(ABitReader *br, int32_t *pesOffset);
235
Wonsik Kim54000662015-04-13 10:59:06 +0900236 // Strip and parse PES headers and pass remaining payload into onPayload
237 // with parsed metadata. event is set if the PES contains a sync frame.
238 status_t parsePES(ABitReader *br, SyncEvent *event);
Andreas Hubercda17c62010-06-07 13:05:37 -0700239
Wonsik Kim54000662015-04-13 10:59:06 +0900240 // Feed the payload into mQueue and if a packet is identified, queue it
241 // into mSource. If the packet is a sync frame. set event with start offset
242 // and timestamp of the packet.
Andreas Hubercda17c62010-06-07 13:05:37 -0700243 void onPayloadData(
244 unsigned PTS_DTS_flags, uint64_t PTS, uint64_t DTS,
Chong Zhang3b2847f2017-01-18 17:43:03 -0800245 unsigned PES_scrambling_control,
246 const uint8_t *data, size_t size,
247 int32_t payloadOffset, SyncEvent *event);
248
249 // Ensure internal buffers can hold specified size, and will re-allocate
250 // as needed.
Chong Zhangd5a416a2017-05-16 11:16:34 -0700251 bool ensureBufferCapacity(size_t size);
Andreas Huber82f73212010-09-01 12:22:36 -0700252
Andreas Hubercda17c62010-06-07 13:05:37 -0700253 DISALLOW_EVIL_CONSTRUCTORS(Stream);
254};
255
Andreas Huber8dfa2282012-05-15 12:37:29 -0700256struct ATSParser::PSISection : public RefBase {
257 PSISection();
258
259 status_t append(const void *data, size_t size);
Jinsuk Kim9ca7b9c2015-03-20 09:23:18 +0900260 void setSkipBytes(uint8_t skip);
Andreas Huber8dfa2282012-05-15 12:37:29 -0700261 void clear();
262
263 bool isComplete() const;
264 bool isEmpty() const;
Jinsuk Kim9ca7b9c2015-03-20 09:23:18 +0900265 bool isCRCOkay() const;
Andreas Huber8dfa2282012-05-15 12:37:29 -0700266
267 const uint8_t *data() const;
268 size_t size() const;
269
270protected:
271 virtual ~PSISection();
272
273private:
274 sp<ABuffer> mBuffer;
Jinsuk Kim9ca7b9c2015-03-20 09:23:18 +0900275 uint8_t mSkipBytes;
276 static uint32_t CRC_TABLE[];
Andreas Huber8dfa2282012-05-15 12:37:29 -0700277
278 DISALLOW_EVIL_CONSTRUCTORS(PSISection);
279};
280
Wonsik Kim54000662015-04-13 10:59:06 +0900281ATSParser::SyncEvent::SyncEvent(off64_t offset)
Wei Jia9558f6d2016-03-08 17:31:16 -0800282 : mHasReturnedData(false), mOffset(offset), mTimeUs(0) {}
Wonsik Kim54000662015-04-13 10:59:06 +0900283
Marco Nelissen45d54c62018-01-26 10:04:22 -0800284void ATSParser::SyncEvent::init(off64_t offset, const sp<AnotherPacketSource> &source,
Robert Shih82e14702016-11-17 11:24:29 -0800285 int64_t timeUs, SourceType type) {
Wei Jia9558f6d2016-03-08 17:31:16 -0800286 mHasReturnedData = true;
Wonsik Kim54000662015-04-13 10:59:06 +0900287 mOffset = offset;
288 mMediaSource = source;
289 mTimeUs = timeUs;
Robert Shih82e14702016-11-17 11:24:29 -0800290 mType = type;
Wonsik Kim54000662015-04-13 10:59:06 +0900291}
292
Wei Jia9558f6d2016-03-08 17:31:16 -0800293void ATSParser::SyncEvent::reset() {
294 mHasReturnedData = false;
295}
Andreas Hubercda17c62010-06-07 13:05:37 -0700296////////////////////////////////////////////////////////////////////////////////
297
Andreas Huber386d6092011-05-19 08:37:39 -0700298ATSParser::Program::Program(
Chong Zhangd47dfcb2015-03-27 15:53:45 -0700299 ATSParser *parser, unsigned programNumber, unsigned programMapPID,
300 int64_t lastRecoveredPTS)
Andreas Huberf9334412010-12-15 15:17:42 -0800301 : mParser(parser),
Andreas Huber386d6092011-05-19 08:37:39 -0700302 mProgramNumber(programNumber),
Andreas Huberf9334412010-12-15 15:17:42 -0800303 mProgramMapPID(programMapPID),
Sampath Shetty142598f2018-12-10 13:52:30 +1100304 mPMTVersion(0xffffffff),
305 mPMT_CRC(0xffffffff),
Andreas Huberbff07d02010-10-12 11:34:37 -0700306 mFirstPTSValid(false),
Chong Zhang799c9682015-03-02 23:42:38 -0800307 mFirstPTS(0),
Chong Zhangd47dfcb2015-03-27 15:53:45 -0700308 mLastRecoveredPTS(lastRecoveredPTS) {
Steve Block3856b092011-10-20 11:56:00 +0100309 ALOGV("new program number %u", programNumber);
Andreas Hubercda17c62010-06-07 13:05:37 -0700310}
311
Andreas Huber8dfa2282012-05-15 12:37:29 -0700312bool ATSParser::Program::parsePSISection(
313 unsigned pid, ABitReader *br, status_t *err) {
314 *err = OK;
315
316 if (pid != mProgramMapPID) {
317 return false;
318 }
319
320 *err = parseProgramMap(br);
321
322 return true;
323}
324
Andreas Hubercda17c62010-06-07 13:05:37 -0700325bool ATSParser::Program::parsePID(
Andreas Huber87f2a552012-08-31 13:55:24 -0700326 unsigned pid, unsigned continuity_counter,
327 unsigned payload_unit_start_indicator,
Chong Zhang3b2847f2017-01-18 17:43:03 -0800328 unsigned transport_scrambling_control,
329 unsigned random_access_indicator,
Wonsik Kim54000662015-04-13 10:59:06 +0900330 ABitReader *br, status_t *err, SyncEvent *event) {
Andreas Huber06528d72011-08-31 16:29:05 -0700331 *err = OK;
332
Andreas Hubercda17c62010-06-07 13:05:37 -0700333 ssize_t index = mStreams.indexOfKey(pid);
334 if (index < 0) {
335 return false;
336 }
337
Andreas Huber54031292011-09-01 11:04:43 -0700338 *err = mStreams.editValueAt(index)->parse(
Chong Zhang3b2847f2017-01-18 17:43:03 -0800339 continuity_counter,
340 payload_unit_start_indicator,
341 transport_scrambling_control,
342 random_access_indicator,
343 br, event);
Andreas Hubercda17c62010-06-07 13:05:37 -0700344
345 return true;
346}
347
Andreas Huber32f3cef2011-03-02 15:34:46 -0800348void ATSParser::Program::signalDiscontinuity(
349 DiscontinuityType type, const sp<AMessage> &extra) {
Andreas Huberb7c8e912012-11-27 15:02:53 -0800350 int64_t mediaTimeUs;
351 if ((type & DISCONTINUITY_TIME)
352 && extra != NULL
353 && extra->findInt64(
Dongwon Kang15d02f82017-12-14 16:32:18 -0800354 kATSParserKeyMediaTimeUs, &mediaTimeUs)) {
Andreas Huberb7c8e912012-11-27 15:02:53 -0800355 mFirstPTSValid = false;
356 }
357
Andreas Huber2a4d22d2010-09-08 14:32:20 -0700358 for (size_t i = 0; i < mStreams.size(); ++i) {
Andreas Huber32f3cef2011-03-02 15:34:46 -0800359 mStreams.editValueAt(i)->signalDiscontinuity(type, extra);
Andreas Huberf9334412010-12-15 15:17:42 -0800360 }
361}
362
363void ATSParser::Program::signalEOS(status_t finalResult) {
364 for (size_t i = 0; i < mStreams.size(); ++i) {
365 mStreams.editValueAt(i)->signalEOS(finalResult);
Andreas Huber2a4d22d2010-09-08 14:32:20 -0700366 }
367}
368
Chong Zhang9bcf3ae2015-03-08 15:59:01 -0700369bool ATSParser::Program::switchPIDs(const Vector<StreamInfo> &infos) {
370 bool success = false;
371
372 if (mStreams.size() == infos.size()) {
373 // build type->PIDs map for old and new mapping
374 size_t i;
375 KeyedVector<int32_t, Vector<int32_t> > oldType2PIDs, newType2PIDs;
376 for (i = 0; i < mStreams.size(); ++i) {
377 ssize_t index = oldType2PIDs.indexOfKey(mStreams[i]->type());
378 if (index < 0) {
379 oldType2PIDs.add(mStreams[i]->type(), Vector<int32_t>());
380 }
381 oldType2PIDs.editValueFor(mStreams[i]->type()).push_back(mStreams[i]->pid());
382 }
383 for (i = 0; i < infos.size(); ++i) {
384 ssize_t index = newType2PIDs.indexOfKey(infos[i].mType);
385 if (index < 0) {
386 newType2PIDs.add(infos[i].mType, Vector<int32_t>());
387 }
388 newType2PIDs.editValueFor(infos[i].mType).push_back(infos[i].mPID);
389 }
390
391 // we can recover if the number of streams for each type hasn't changed
392 if (oldType2PIDs.size() == newType2PIDs.size()) {
393 success = true;
394 for (i = 0; i < oldType2PIDs.size(); ++i) {
395 // KeyedVector is sorted, we just compare key and size of each index
396 if (oldType2PIDs.keyAt(i) != newType2PIDs.keyAt(i)
397 || oldType2PIDs[i].size() != newType2PIDs[i].size()) {
398 success = false;
399 break;
400 }
401 }
402 }
403
404 if (success) {
405 // save current streams to temp
406 KeyedVector<int32_t, sp<Stream> > temp;
407 for (i = 0; i < mStreams.size(); ++i) {
408 temp.add(mStreams.keyAt(i), mStreams.editValueAt(i));
409 }
410
411 mStreams.clear();
412 for (i = 0; i < temp.size(); ++i) {
413 // The two checks below shouldn't happen,
414 // we already checked above the stream count matches
415 ssize_t index = newType2PIDs.indexOfKey(temp[i]->type());
Jinsuk Kime314c672015-04-22 11:08:28 +0900416 if (index < 0) {
417 return false;
418 }
Chong Zhang9bcf3ae2015-03-08 15:59:01 -0700419 Vector<int32_t> &newPIDs = newType2PIDs.editValueAt(index);
Jinsuk Kime314c672015-04-22 11:08:28 +0900420 if (newPIDs.isEmpty()) {
421 return false;
422 }
Chong Zhang9bcf3ae2015-03-08 15:59:01 -0700423
424 // get the next PID for temp[i]->type() in the new PID map
425 Vector<int32_t>::iterator it = newPIDs.begin();
426
427 // change the PID of the stream, and add it back
428 temp.editValueAt(i)->setPID(*it);
429 mStreams.add(temp[i]->pid(), temp.editValueAt(i));
430
431 // removed the used PID
432 newPIDs.erase(it);
433 }
434 }
435 }
436 return success;
437}
Andreas Huberbc7f5b22011-01-21 10:15:23 -0800438
Chong Zhang3b2847f2017-01-18 17:43:03 -0800439bool ATSParser::Program::findCADescriptor(
440 ABitReader *br, unsigned infoLength,
441 ATSParser::CADescriptor *caDescriptor) {
442 bool found = false;
443 while (infoLength > 2) {
444 unsigned descriptor_tag = br->getBits(8);
445 ALOGV(" tag = 0x%02x", descriptor_tag);
446
447 unsigned descriptor_length = br->getBits(8);
448 ALOGV(" len = %u", descriptor_length);
449
450 infoLength -= 2;
451 if (descriptor_length > infoLength) {
452 break;
453 }
Previr Rangroo7e6ac732017-11-13 20:20:20 -0800454 if (descriptor_tag == DESCRIPTOR_CA && descriptor_length >= 4) {
Chong Zhang3b2847f2017-01-18 17:43:03 -0800455 found = true;
456 caDescriptor->mSystemID = br->getBits(16);
457 caDescriptor->mPID = br->getBits(16) & 0x1fff;
458 infoLength -= 4;
459 caDescriptor->mPrivateData.assign(
460 br->data(), br->data() + descriptor_length - 4);
461 break;
462 } else {
463 infoLength -= descriptor_length;
464 br->skipBits(descriptor_length * 8);
465 }
466 }
467 br->skipBits(infoLength * 8);
468 return found;
469}
470
Andreas Huber06528d72011-08-31 16:29:05 -0700471status_t ATSParser::Program::parseProgramMap(ABitReader *br) {
Andreas Hubercda17c62010-06-07 13:05:37 -0700472 unsigned table_id = br->getBits(8);
Steve Block3856b092011-10-20 11:56:00 +0100473 ALOGV(" table_id = %u", table_id);
David Yeh6456ae72014-09-03 11:14:48 +0800474 if (table_id != 0x02u) {
475 ALOGE("PMT data error!");
476 return ERROR_MALFORMED;
477 }
Andreas Huber6e4c5c42010-09-21 13:13:15 -0700478 unsigned section_syntax_indicator = br->getBits(1);
Steve Block3856b092011-10-20 11:56:00 +0100479 ALOGV(" section_syntax_indicator = %u", section_syntax_indicator);
David Yeh6456ae72014-09-03 11:14:48 +0800480 if (section_syntax_indicator != 1u) {
481 ALOGE("PMT data error!");
482 return ERROR_MALFORMED;
483 }
Andreas Hubercda17c62010-06-07 13:05:37 -0700484
Jinsuk Kime314c672015-04-22 11:08:28 +0900485 br->skipBits(1); // '0'
Andreas Huber6e4c5c42010-09-21 13:13:15 -0700486 MY_LOGV(" reserved = %u", br->getBits(2));
Andreas Hubercda17c62010-06-07 13:05:37 -0700487
488 unsigned section_length = br->getBits(12);
Steve Block3856b092011-10-20 11:56:00 +0100489 ALOGV(" section_length = %u", section_length);
Andreas Hubercda17c62010-06-07 13:05:37 -0700490
Andreas Huber6e4c5c42010-09-21 13:13:15 -0700491 MY_LOGV(" program_number = %u", br->getBits(16));
492 MY_LOGV(" reserved = %u", br->getBits(2));
Sampath Shetty142598f2018-12-10 13:52:30 +1100493 bool audioPresentationsChanged = false;
494 unsigned pmtVersion = br->getBits(5);
495 if (pmtVersion != mPMTVersion) {
496 audioPresentationsChanged = true;
497 mPMTVersion = pmtVersion;
498 }
499 MY_LOGV(" version_number = %u", pmtVersion);
Andreas Huber6e4c5c42010-09-21 13:13:15 -0700500 MY_LOGV(" current_next_indicator = %u", br->getBits(1));
501 MY_LOGV(" section_number = %u", br->getBits(8));
502 MY_LOGV(" last_section_number = %u", br->getBits(8));
503 MY_LOGV(" reserved = %u", br->getBits(3));
Andreas Huber87f2a552012-08-31 13:55:24 -0700504
505 unsigned PCR_PID = br->getBits(13);
506 ALOGV(" PCR_PID = 0x%04x", PCR_PID);
507
Andreas Huber6e4c5c42010-09-21 13:13:15 -0700508 MY_LOGV(" reserved = %u", br->getBits(4));
Andreas Hubercda17c62010-06-07 13:05:37 -0700509
510 unsigned program_info_length = br->getBits(12);
Steve Block3856b092011-10-20 11:56:00 +0100511 ALOGV(" program_info_length = %u", program_info_length);
Andreas Hubercda17c62010-06-07 13:05:37 -0700512
Chong Zhang3b2847f2017-01-18 17:43:03 -0800513 // descriptors
514 CADescriptor programCA;
515 bool hasProgramCA = findCADescriptor(br, program_info_length, &programCA);
516 if (hasProgramCA && !mParser->mCasManager->addProgram(
517 mProgramNumber, programCA)) {
518 return ERROR_MALFORMED;
519 }
Andreas Hubercda17c62010-06-07 13:05:37 -0700520
Andreas Huberbc7f5b22011-01-21 10:15:23 -0800521 Vector<StreamInfo> infos;
522
Andreas Hubercda17c62010-06-07 13:05:37 -0700523 // infoBytesRemaining is the number of bytes that make up the
524 // variable length section of ES_infos. It does not include the
525 // final CRC.
Previr Rangroo7e6ac732017-11-13 20:20:20 -0800526 int32_t infoBytesRemaining = section_length - 9 - program_info_length - 4;
Andreas Hubercda17c62010-06-07 13:05:37 -0700527
Jinsuk Kime314c672015-04-22 11:08:28 +0900528 while (infoBytesRemaining >= 5) {
Previr Rangroo7e6ac732017-11-13 20:20:20 -0800529 StreamInfo info;
530 info.mType = br->getBits(8);
531 ALOGV(" stream_type = 0x%02x", info.mType);
Andreas Huber6e4c5c42010-09-21 13:13:15 -0700532 MY_LOGV(" reserved = %u", br->getBits(3));
Andreas Hubercda17c62010-06-07 13:05:37 -0700533
Previr Rangroo7e6ac732017-11-13 20:20:20 -0800534 info.mPID = br->getBits(13);
535 ALOGV(" elementary_PID = 0x%04x", info.mPID);
Andreas Hubercda17c62010-06-07 13:05:37 -0700536
Andreas Huber6e4c5c42010-09-21 13:13:15 -0700537 MY_LOGV(" reserved = %u", br->getBits(4));
Andreas Hubercda17c62010-06-07 13:05:37 -0700538
539 unsigned ES_info_length = br->getBits(12);
Steve Block3856b092011-10-20 11:56:00 +0100540 ALOGV(" ES_info_length = %u", ES_info_length);
Previr Rangroo7e6ac732017-11-13 20:20:20 -0800541 infoBytesRemaining -= 5 + ES_info_length;
Andreas Hubercda17c62010-06-07 13:05:37 -0700542
Chong Zhang3b2847f2017-01-18 17:43:03 -0800543 CADescriptor streamCA;
Previr Rangroo7e6ac732017-11-13 20:20:20 -0800544 info.mTypeExt = EXT_DESCRIPTOR_DVB_RESERVED_MAX;
Sampath Shetty0ac73a52018-03-27 15:16:35 +1100545
546 info.mAudioPresentations.clear();
Previr Rangroo7e6ac732017-11-13 20:20:20 -0800547 bool hasStreamCA = false;
548 while (ES_info_length > 2 && infoBytesRemaining >= 0) {
549 unsigned descriptor_tag = br->getBits(8);
550 ALOGV(" tag = 0x%02x", descriptor_tag);
551
552 unsigned descriptor_length = br->getBits(8);
553 ALOGV(" len = %u", descriptor_length);
554
555 ES_info_length -= 2;
556 if (descriptor_length > ES_info_length) {
557 return ERROR_MALFORMED;
558 }
559 if (descriptor_tag == DESCRIPTOR_CA && descriptor_length >= 4) {
560 hasStreamCA = true;
561 streamCA.mSystemID = br->getBits(16);
562 streamCA.mPID = br->getBits(16) & 0x1fff;
Vasily Tarasov7e736a42018-11-01 10:51:08 -0700563 ES_info_length -= descriptor_length;
564 descriptor_length -= 4;
565 streamCA.mPrivateData.assign(br->data(), br->data() + descriptor_length);
566 br->skipBits(descriptor_length * 8);
Previr Rangroo7e6ac732017-11-13 20:20:20 -0800567 } else if (info.mType == STREAMTYPE_PES_PRIVATE_DATA &&
568 descriptor_tag == DESCRIPTOR_DVB_EXTENSION && descriptor_length >= 1) {
569 unsigned descTagExt = br->getBits(8);
570 ALOGV(" tag_ext = 0x%02x", descTagExt);
Previr Rangroo7e6ac732017-11-13 20:20:20 -0800571 ES_info_length -= descriptor_length;
572 descriptor_length--;
Sampath Shetty0ac73a52018-03-27 15:16:35 +1100573 // The AC4 descriptor is used in the PSI PMT to identify streams which carry AC4
574 // audio.
575 if (descTagExt == EXT_DESCRIPTOR_DVB_AC4) {
576 info.mTypeExt = EXT_DESCRIPTOR_DVB_AC4;
577 br->skipBits(descriptor_length * 8);
578 } else if (descTagExt == EXT_DESCRIPTOR_DVB_AUDIO_PRESELECTION &&
579 descriptor_length >= 1) {
580 // DVB BlueBook A038 Table 110
581 unsigned num_preselections = br->getBits(5);
582 br->skipBits(3); // reserved
583 for (unsigned i = 0; i < num_preselections; ++i) {
584 if (br->numBitsLeft() < 16) {
585 ALOGE("Not enough data left in bitreader!");
586 return ERROR_MALFORMED;
587 }
588 AudioPresentationV1 ap;
589 ap.mPresentationId = br->getBits(5); // preselection_id
590
591 // audio_rendering_indication
592 ap.mMasteringIndication = static_cast<MasteringIndication>(br->getBits(3));
593 ap.mAudioDescriptionAvailable = (br->getBits(1) == 1);
594 ap.mSpokenSubtitlesAvailable = (br->getBits(1) == 1);
595 ap.mDialogueEnhancementAvailable = (br->getBits(1) == 1);
596
597 bool interactivity_enabled = (br->getBits(1) == 1);
598 MY_LOGV(" interactivity_enabled = %d", interactivity_enabled);
599
600 bool language_code_present = (br->getBits(1) == 1);
601 bool text_label_present = (br->getBits(1) == 1);
602
603 bool multi_stream_info_present = (br->getBits(1) == 1);
604 bool future_extension = (br->getBits(1) == 1);
605 if (language_code_present) {
606 if (br->numBitsLeft() < 24) {
607 ALOGE("Not enough data left in bitreader!");
608 return ERROR_MALFORMED;
609 }
610 char language[4];
611 language[0] = br->getBits(8);
612 language[1] = br->getBits(8);
613 language[2] = br->getBits(8);
614 language[3] = 0;
615 ap.mLanguage = String8(language);
616 }
617
618 // This maps the presentation id to the message id in the
619 // EXT_DESCRIPTOR_DVB_MESSAGE so that we can get the presentation label.
620 if (text_label_present) {
621 if (br->numBitsLeft() < 8) {
622 ALOGE("Not enough data left in bitreader!");
623 return ERROR_MALFORMED;
624 }
625 unsigned message_id = br->getBits(8);
626 MY_LOGV(" message_id = %u", message_id);
627 }
628
629 if (multi_stream_info_present) {
630 if (br->numBitsLeft() < 8) {
631 ALOGE("Not enough data left in bitreader!");
632 return ERROR_MALFORMED;
633 }
634 unsigned num_aux_components = br->getBits(3);
635 br->skipBits(5); // reserved
636 if (br->numBitsLeft() < (num_aux_components * 8)) {
637 ALOGE("Not enough data left in bitreader!");
638 return ERROR_MALFORMED;
639 }
640 br->skipBits(num_aux_components * 8); // component_tag
641 }
642 if (future_extension) {
643 if (br->numBitsLeft() < 8) {
644 return ERROR_MALFORMED;
645 }
646 br->skipBits(3); // reserved
647 unsigned future_extension_length = br->getBits(5);
648 if (br->numBitsLeft() < (future_extension_length * 8)) {
649 ALOGE("Not enough data left in bitreader!");
650 return ERROR_MALFORMED;
651 }
652 br->skipBits(future_extension_length * 8); // future_extension_byte
653 }
654 info.mAudioPresentations.push_back(std::move(ap));
655 }
656 } else {
657 br->skipBits(descriptor_length * 8);
658 }
Previr Rangroo7e6ac732017-11-13 20:20:20 -0800659 } else {
660 ES_info_length -= descriptor_length;
661 br->skipBits(descriptor_length * 8);
662 }
663 }
Chong Zhang3b2847f2017-01-18 17:43:03 -0800664 if (hasStreamCA && !mParser->mCasManager->addStream(
Previr Rangroo7e6ac732017-11-13 20:20:20 -0800665 mProgramNumber, info.mPID, streamCA)) {
Chong Zhang3b2847f2017-01-18 17:43:03 -0800666 return ERROR_MALFORMED;
Andreas Hubercda17c62010-06-07 13:05:37 -0700667 }
Chong Zhang7e986a82018-11-07 13:01:08 -0800668 if (hasProgramCA) {
669 info.mCADescriptor = programCA;
670 } else if (hasStreamCA) {
671 info.mCADescriptor = streamCA;
672 }
673
Andreas Huberbc7f5b22011-01-21 10:15:23 -0800674 infos.push(info);
Andreas Hubercda17c62010-06-07 13:05:37 -0700675 }
676
Jinsuk Kime314c672015-04-22 11:08:28 +0900677 if (infoBytesRemaining != 0) {
678 ALOGW("Section data remains unconsumed");
679 }
Sampath Shetty142598f2018-12-10 13:52:30 +1100680 unsigned crc = br->getBits(32);
681 if (crc != mPMT_CRC) {
682 audioPresentationsChanged = true;
683 mPMT_CRC = crc;
684 }
685 MY_LOGV(" CRC = 0x%08x", crc);
Andreas Huberbc7f5b22011-01-21 10:15:23 -0800686
687 bool PIDsChanged = false;
688 for (size_t i = 0; i < infos.size(); ++i) {
689 StreamInfo &info = infos.editItemAt(i);
690
691 ssize_t index = mStreams.indexOfKey(info.mPID);
692
693 if (index >= 0 && mStreams.editValueAt(index)->type() != info.mType) {
Steve Blockdf64d152012-01-04 20:05:49 +0000694 ALOGI("uh oh. stream PIDs have changed.");
Andreas Huberbc7f5b22011-01-21 10:15:23 -0800695 PIDsChanged = true;
696 break;
697 }
698 }
699
700 if (PIDsChanged) {
Andreas Huber06528d72011-08-31 16:29:05 -0700701#if 0
Steve Blockdf64d152012-01-04 20:05:49 +0000702 ALOGI("before:");
Andreas Huber06528d72011-08-31 16:29:05 -0700703 for (size_t i = 0; i < mStreams.size(); ++i) {
704 sp<Stream> stream = mStreams.editValueAt(i);
705
Steve Blockdf64d152012-01-04 20:05:49 +0000706 ALOGI("PID 0x%08x => type 0x%02x", stream->pid(), stream->type());
Andreas Huber06528d72011-08-31 16:29:05 -0700707 }
708
Steve Blockdf64d152012-01-04 20:05:49 +0000709 ALOGI("after:");
Andreas Huber06528d72011-08-31 16:29:05 -0700710 for (size_t i = 0; i < infos.size(); ++i) {
711 StreamInfo &info = infos.editItemAt(i);
712
Steve Blockdf64d152012-01-04 20:05:49 +0000713 ALOGI("PID 0x%08x => type 0x%02x", info.mPID, info.mType);
Andreas Huber06528d72011-08-31 16:29:05 -0700714 }
715#endif
716
Chong Zhang9bcf3ae2015-03-08 15:59:01 -0700717 // we can recover if number of streams for each type remain the same
718 bool success = switchPIDs(infos);
Andreas Huber06528d72011-08-31 16:29:05 -0700719
720 if (!success) {
Steve Blockdf64d152012-01-04 20:05:49 +0000721 ALOGI("Stream PIDs changed and we cannot recover.");
Andreas Huber06528d72011-08-31 16:29:05 -0700722 return ERROR_MALFORMED;
723 }
Andreas Huberbc7f5b22011-01-21 10:15:23 -0800724 }
725
Chong Zhang3b2847f2017-01-18 17:43:03 -0800726 bool isAddingScrambledStream = false;
Andreas Huberbc7f5b22011-01-21 10:15:23 -0800727 for (size_t i = 0; i < infos.size(); ++i) {
728 StreamInfo &info = infos.editItemAt(i);
729
Chong Zhang3b2847f2017-01-18 17:43:03 -0800730 if (mParser->mCasManager->isCAPid(info.mPID)) {
731 // skip CA streams (EMM/ECM)
732 continue;
733 }
Andreas Huberbc7f5b22011-01-21 10:15:23 -0800734 ssize_t index = mStreams.indexOfKey(info.mPID);
735
736 if (index < 0) {
Chong Zhang7e986a82018-11-07 13:01:08 -0800737 sp<Stream> stream = new Stream(this, PCR_PID, info);
Andreas Huber87f2a552012-08-31 13:55:24 -0700738
Hassan Shojania3a37f3e2017-04-19 14:29:42 -0700739 if (mSampleAesKeyItem != NULL) {
740 stream->signalNewSampleAesKey(mSampleAesKeyItem);
741 }
742
Chong Zhang7e986a82018-11-07 13:01:08 -0800743 isAddingScrambledStream |= info.mCADescriptor.mSystemID >= 0;
Andreas Huberbc7f5b22011-01-21 10:15:23 -0800744 mStreams.add(info.mPID, stream);
Andreas Huberbc7f5b22011-01-21 10:15:23 -0800745 }
Sampath Shetty142598f2018-12-10 13:52:30 +1100746 else if (index >= 0 && mStreams.editValueAt(index)->isAudio()
747 && audioPresentationsChanged) {
748 mStreams.editValueAt(index)->setAudioPresentations(info.mAudioPresentations);
749 }
Andreas Huberbc7f5b22011-01-21 10:15:23 -0800750 }
Andreas Huber06528d72011-08-31 16:29:05 -0700751
Chong Zhang3b2847f2017-01-18 17:43:03 -0800752 if (isAddingScrambledStream) {
753 ALOGI("Receiving scrambled streams without descrambler!");
754 return ERROR_DRM_DECRYPT_UNIT_NOT_INITIALIZED;
755 }
Andreas Huber06528d72011-08-31 16:29:05 -0700756 return OK;
Andreas Hubercda17c62010-06-07 13:05:37 -0700757}
758
Chong Zhang799c9682015-03-02 23:42:38 -0800759int64_t ATSParser::Program::recoverPTS(uint64_t PTS_33bit) {
760 // We only have the lower 33-bit of the PTS. It could overflow within a
761 // reasonable amount of time. To handle the wrap-around, use fancy math
762 // to get an extended PTS that is within [-0xffffffff, 0xffffffff]
763 // of the latest recovered PTS.
Chih-Hung Hsieh3794b242018-12-11 13:55:06 -0800764 if (mLastRecoveredPTS < 0LL) {
Chong Zhang9bcf3ae2015-03-08 15:59:01 -0700765 // Use the original 33bit number for 1st frame, the reason is that
766 // if 1st frame wraps to negative that's far away from 0, we could
767 // never start. Only start wrapping around from 2nd frame.
768 mLastRecoveredPTS = static_cast<int64_t>(PTS_33bit);
769 } else {
770 mLastRecoveredPTS = static_cast<int64_t>(
Chih-Hung Hsieh3794b242018-12-11 13:55:06 -0800771 ((mLastRecoveredPTS - static_cast<int64_t>(PTS_33bit) + 0x100000000LL)
Chong Zhang9bcf3ae2015-03-08 15:59:01 -0700772 & 0xfffffffe00000000ull) | PTS_33bit);
773 // We start from 0, but recovered PTS could be slightly below 0.
774 // Clamp it to 0 as rest of the pipeline doesn't take negative pts.
775 // (eg. video is read first and starts at 0, but audio starts at 0xfffffff0)
Chih-Hung Hsieh3794b242018-12-11 13:55:06 -0800776 if (mLastRecoveredPTS < 0LL) {
Chih-Hung Hsieh5c9054b2015-03-12 13:24:12 -0700777 ALOGI("Clamping negative recovered PTS (%" PRId64 ") to 0", mLastRecoveredPTS);
Chih-Hung Hsieh3794b242018-12-11 13:55:06 -0800778 mLastRecoveredPTS = 0LL;
Chong Zhang9bcf3ae2015-03-08 15:59:01 -0700779 }
780 }
Chong Zhang799c9682015-03-02 23:42:38 -0800781
Chong Zhang9bcf3ae2015-03-08 15:59:01 -0700782 return mLastRecoveredPTS;
Chong Zhang799c9682015-03-02 23:42:38 -0800783}
784
Marco Nelissen45d54c62018-01-26 10:04:22 -0800785sp<AnotherPacketSource> ATSParser::Program::getSource(SourceType type) {
Andreas Hubercda17c62010-06-07 13:05:37 -0700786 for (size_t i = 0; i < mStreams.size(); ++i) {
Marco Nelissen45d54c62018-01-26 10:04:22 -0800787 sp<AnotherPacketSource> source = mStreams.editValueAt(i)->getSource(type);
Andreas Hubercda17c62010-06-07 13:05:37 -0700788 if (source != NULL) {
Robert Shih9ff1e722015-10-20 16:29:58 -0700789 return source;
Andreas Hubercda17c62010-06-07 13:05:37 -0700790 }
791 }
792
793 return NULL;
794}
795
Robert Shihbf207272014-10-30 17:22:11 -0700796bool ATSParser::Program::hasSource(SourceType type) const {
797 for (size_t i = 0; i < mStreams.size(); ++i) {
798 const sp<Stream> &stream = mStreams.valueAt(i);
799 if (type == AUDIO && stream->isAudio()) {
800 return true;
801 } else if (type == VIDEO && stream->isVideo()) {
802 return true;
Robert Shih9ff1e722015-10-20 16:29:58 -0700803 } else if (type == META && stream->isMeta()) {
804 return true;
Robert Shihbf207272014-10-30 17:22:11 -0700805 }
806 }
807
808 return false;
809}
810
Andreas Huberbff07d02010-10-12 11:34:37 -0700811int64_t ATSParser::Program::convertPTSToTimestamp(uint64_t PTS) {
Chong Zhang799c9682015-03-02 23:42:38 -0800812 PTS = recoverPTS(PTS);
813
Andreas Huberc4c17d42011-08-30 16:06:28 -0700814 if (!(mParser->mFlags & TS_TIMESTAMPS_ARE_ABSOLUTE)) {
815 if (!mFirstPTSValid) {
816 mFirstPTSValid = true;
817 mFirstPTS = PTS;
818 PTS = 0;
819 } else if (PTS < mFirstPTS) {
820 PTS = 0;
821 } else {
822 PTS -= mFirstPTS;
823 }
Andreas Huberbff07d02010-10-12 11:34:37 -0700824 }
825
Andreas Huber87f2a552012-08-31 13:55:24 -0700826 int64_t timeUs = (PTS * 100) / 9;
827
Chih-Hung Hsieh3794b242018-12-11 13:55:06 -0800828 if (mParser->mAbsoluteTimeAnchorUs >= 0LL) {
Andreas Huber87f2a552012-08-31 13:55:24 -0700829 timeUs += mParser->mAbsoluteTimeAnchorUs;
830 }
831
Andreas Huberd5e56232013-03-12 11:01:43 -0700832 if (mParser->mTimeOffsetValid) {
833 timeUs += mParser->mTimeOffsetUs;
834 }
835
Andreas Huber87f2a552012-08-31 13:55:24 -0700836 return timeUs;
Andreas Huberbff07d02010-10-12 11:34:37 -0700837}
838
Chong Zhang3b2847f2017-01-18 17:43:03 -0800839void ATSParser::Program::updateCasSessions() {
840 for (size_t i = 0; i < mStreams.size(); ++i) {
841 sp<Stream> &stream = mStreams.editValueAt(i);
842 sp<IDescrambler> descrambler;
843 std::vector<uint8_t> sessionId;
Chong Zhangbc7aae42017-03-31 14:53:19 -0700844 int32_t systemId;
845 if (mParser->mCasManager->getCasInfo(mProgramNumber, stream->pid(),
846 &systemId, &descrambler, &sessionId)) {
847 stream->setCasInfo(systemId, descrambler, sessionId);
Chong Zhang3b2847f2017-01-18 17:43:03 -0800848 }
849 }
850}
851
Andreas Hubercda17c62010-06-07 13:05:37 -0700852////////////////////////////////////////////////////////////////////////////////
Chong Zhang3b2847f2017-01-18 17:43:03 -0800853static const size_t kInitialStreamBufferSize = 192 * 1024;
Andreas Hubercda17c62010-06-07 13:05:37 -0700854
Andreas Huberbff07d02010-10-12 11:34:37 -0700855ATSParser::Stream::Stream(
Chong Zhang7e986a82018-11-07 13:01:08 -0800856 Program *program, unsigned PCR_PID, const StreamInfo &info)
Andreas Huberbff07d02010-10-12 11:34:37 -0700857 : mProgram(program),
Chong Zhang7e986a82018-11-07 13:01:08 -0800858 mElementaryPID(info.mPID),
859 mStreamType(info.mType),
860 mStreamTypeExt(info.mTypeExt),
Andreas Huber87f2a552012-08-31 13:55:24 -0700861 mPCR_PID(PCR_PID),
862 mExpectedContinuityCounter(-1),
Andreas Huber6a63a932010-10-01 10:51:41 -0700863 mPayloadStarted(false),
Marco Nelissenbe9634d2015-04-15 14:33:39 -0700864 mEOSReached(false),
Andreas Huber90a92052012-10-30 15:53:03 -0700865 mPrevPTS(0),
Chong Zhang3b2847f2017-01-18 17:43:03 -0800866 mQueue(NULL),
Sampath Shetty0ac73a52018-03-27 15:16:35 +1100867 mScrambled(info.mCADescriptor.mSystemID >= 0),
868 mAudioPresentations(info.mAudioPresentations) {
Hassan Shojania3a37f3e2017-04-19 14:29:42 -0700869 mSampleEncrypted =
870 mStreamType == STREAMTYPE_H264_ENCRYPTED ||
871 mStreamType == STREAMTYPE_AAC_ENCRYPTED ||
872 mStreamType == STREAMTYPE_AC3_ENCRYPTED;
873
874 ALOGV("new stream PID 0x%02x, type 0x%02x, scrambled %d, SampleEncrypted: %d",
Chong Zhang7e986a82018-11-07 13:01:08 -0800875 info.mPID, info.mType, mScrambled, mSampleEncrypted);
Hassan Shojania3a37f3e2017-04-19 14:29:42 -0700876
Chong Zhange32a4132018-07-23 14:17:38 -0700877 uint32_t flags = 0;
878 if (((isVideo() || isAudio()) && mScrambled)) {
879 flags = ElementaryStreamQueue::kFlag_ScrambledData;
880 } else if (mSampleEncrypted) {
881 flags = ElementaryStreamQueue::kFlag_SampleEncryptedData;
882 }
Chong Zhang3b2847f2017-01-18 17:43:03 -0800883
884 ElementaryStreamQueue::Mode mode = ElementaryStreamQueue::INVALID;
885
Andreas Huber386d6092011-05-19 08:37:39 -0700886 switch (mStreamType) {
887 case STREAMTYPE_H264:
Hassan Shojania3a37f3e2017-04-19 14:29:42 -0700888 case STREAMTYPE_H264_ENCRYPTED:
Chong Zhang3b2847f2017-01-18 17:43:03 -0800889 mode = ElementaryStreamQueue::H264;
890 flags |= (mProgram->parserFlags() & ALIGNED_VIDEO_DATA) ?
891 ElementaryStreamQueue::kFlag_AlignedData : 0;
Andreas Huber386d6092011-05-19 08:37:39 -0700892 break;
Chong Zhang3b2847f2017-01-18 17:43:03 -0800893
Andreas Huber6e3d3112011-11-28 12:36:11 -0800894 case STREAMTYPE_MPEG2_AUDIO_ADTS:
Hassan Shojania3a37f3e2017-04-19 14:29:42 -0700895 case STREAMTYPE_AAC_ENCRYPTED:
Chong Zhang3b2847f2017-01-18 17:43:03 -0800896 mode = ElementaryStreamQueue::AAC;
Andreas Huber386d6092011-05-19 08:37:39 -0700897 break;
Chong Zhang3b2847f2017-01-18 17:43:03 -0800898
Andreas Huber386d6092011-05-19 08:37:39 -0700899 case STREAMTYPE_MPEG1_AUDIO:
900 case STREAMTYPE_MPEG2_AUDIO:
Chong Zhang3b2847f2017-01-18 17:43:03 -0800901 mode = ElementaryStreamQueue::MPEG_AUDIO;
Andreas Huber386d6092011-05-19 08:37:39 -0700902 break;
903
904 case STREAMTYPE_MPEG1_VIDEO:
905 case STREAMTYPE_MPEG2_VIDEO:
Chong Zhang3b2847f2017-01-18 17:43:03 -0800906 mode = ElementaryStreamQueue::MPEG_VIDEO;
Andreas Huber386d6092011-05-19 08:37:39 -0700907 break;
908
909 case STREAMTYPE_MPEG4_VIDEO:
Chong Zhang3b2847f2017-01-18 17:43:03 -0800910 mode = ElementaryStreamQueue::MPEG4_VIDEO;
Andreas Huber386d6092011-05-19 08:37:39 -0700911 break;
912
Chong Zhang9bf32f02014-07-30 15:40:31 -0700913 case STREAMTYPE_LPCM_AC3:
Changwan Ryud3c079a2013-10-28 11:08:44 +0900914 case STREAMTYPE_AC3:
Hassan Shojania3a37f3e2017-04-19 14:29:42 -0700915 case STREAMTYPE_AC3_ENCRYPTED:
Chong Zhang3b2847f2017-01-18 17:43:03 -0800916 mode = ElementaryStreamQueue::AC3;
Changwan Ryud3c079a2013-10-28 11:08:44 +0900917 break;
918
Previr Rangroo68e6fe12017-11-30 20:02:13 -0800919 case STREAMTYPE_EAC3:
920 mode = ElementaryStreamQueue::EAC3;
921 break;
922
Previr Rangroo7e6ac732017-11-13 20:20:20 -0800923 case STREAMTYPE_PES_PRIVATE_DATA:
924 if (mStreamTypeExt == EXT_DESCRIPTOR_DVB_AC4) {
925 mode = ElementaryStreamQueue::AC4;
926 }
927 break;
928
Robert Shih08528432015-04-08 09:06:54 -0700929 case STREAMTYPE_METADATA:
Chong Zhang3b2847f2017-01-18 17:43:03 -0800930 mode = ElementaryStreamQueue::METADATA;
Robert Shih08528432015-04-08 09:06:54 -0700931 break;
932
Andreas Huber386d6092011-05-19 08:37:39 -0700933 default:
Chong Zhang3b2847f2017-01-18 17:43:03 -0800934 ALOGE("stream PID 0x%02x has invalid stream type 0x%02x",
Chong Zhang7e986a82018-11-07 13:01:08 -0800935 info.mPID, info.mType);
Chong Zhang3b2847f2017-01-18 17:43:03 -0800936 return;
Andreas Huber386d6092011-05-19 08:37:39 -0700937 }
938
Chong Zhang3b2847f2017-01-18 17:43:03 -0800939 mQueue = new ElementaryStreamQueue(mode, flags);
Andreas Huber18ac5402011-08-31 15:04:25 -0700940
941 if (mQueue != NULL) {
Hassan Shojania3a37f3e2017-04-19 14:29:42 -0700942 if (mSampleAesKeyItem != NULL) {
943 mQueue->signalNewSampleAesKey(mSampleAesKeyItem);
944 }
945
Chong Zhang3b2847f2017-01-18 17:43:03 -0800946 ensureBufferCapacity(kInitialStreamBufferSize);
947
948 if (mScrambled && (isAudio() || isVideo())) {
949 // Set initial format to scrambled
950 sp<MetaData> meta = new MetaData();
951 meta->setCString(kKeyMIMEType,
952 isAudio() ? MEDIA_MIMETYPE_AUDIO_SCRAMBLED
953 : MEDIA_MIMETYPE_VIDEO_SCRAMBLED);
Chong Zhangbc7aae42017-03-31 14:53:19 -0700954 // for MediaExtractor.CasInfo
Chong Zhang7e986a82018-11-07 13:01:08 -0800955 const CADescriptor &descriptor = info.mCADescriptor;
956 meta->setInt32(kKeyCASystemID, descriptor.mSystemID);
957
958 meta->setData(kKeyCAPrivateData, 0,
959 descriptor.mPrivateData.data(),
960 descriptor.mPrivateData.size());
961
Chong Zhang3b2847f2017-01-18 17:43:03 -0800962 mSource = new AnotherPacketSource(meta);
963 }
Andreas Huber18ac5402011-08-31 15:04:25 -0700964 }
Andreas Hubercda17c62010-06-07 13:05:37 -0700965}
966
967ATSParser::Stream::~Stream() {
Andreas Huber386d6092011-05-19 08:37:39 -0700968 delete mQueue;
969 mQueue = NULL;
Andreas Hubercda17c62010-06-07 13:05:37 -0700970}
971
Chong Zhangd5a416a2017-05-16 11:16:34 -0700972bool ATSParser::Stream::ensureBufferCapacity(size_t neededSize) {
Chong Zhang3b2847f2017-01-18 17:43:03 -0800973 if (mBuffer != NULL && mBuffer->capacity() >= neededSize) {
Chong Zhangd5a416a2017-05-16 11:16:34 -0700974 return true;
Chong Zhang3b2847f2017-01-18 17:43:03 -0800975 }
976
977 ALOGV("ensureBufferCapacity: current size %zu, new size %zu, scrambled %d",
978 mBuffer == NULL ? 0 : mBuffer->capacity(), neededSize, mScrambled);
979
980 sp<ABuffer> newBuffer, newScrambledBuffer;
Chong Zhang00c5c052018-12-17 14:15:58 -0800981 sp<TMemory> newMem;
Chong Zhang3b2847f2017-01-18 17:43:03 -0800982 if (mScrambled) {
Chong Zhang00c5c052018-12-17 14:15:58 -0800983 if (mHidlAllocator == nullptr) {
984 mHidlAllocator = TAllocator::getService("ashmem");
985 if (mHidlAllocator == nullptr) {
986 ALOGE("[stream %d] can't get hidl allocator", mElementaryPID);
987 return false;
988 }
989 }
990
991 hidl_memory hidlMemToken;
992 bool success;
993 auto transStatus = mHidlAllocator->allocate(
994 neededSize,
995 [&success, &hidlMemToken](
996 bool s,
997 hidl_memory const& m) {
998 success = s;
999 hidlMemToken = m;
1000 });
1001
1002 if (!transStatus.isOk()) {
1003 ALOGE("[stream %d] hidl allocator failed at the transport: %s",
1004 mElementaryPID, transStatus.description().c_str());
1005 return false;
1006 }
1007 if (!success) {
1008 ALOGE("[stream %d] hidl allocator failed", mElementaryPID);
1009 return false;
1010 }
1011 newMem = mapMemory(hidlMemToken);
1012 if (newMem == nullptr || newMem->getPointer() == nullptr) {
1013 ALOGE("[stream %d] hidl failed to map memory", mElementaryPID);
1014 return false;
1015 }
1016
1017 newScrambledBuffer = new ABuffer(newMem->getPointer(), newMem->getSize());
Chong Zhang3b2847f2017-01-18 17:43:03 -08001018
1019 if (mDescrambledBuffer != NULL) {
1020 memcpy(newScrambledBuffer->data(),
1021 mDescrambledBuffer->data(), mDescrambledBuffer->size());
1022 newScrambledBuffer->setRange(0, mDescrambledBuffer->size());
1023 } else {
1024 newScrambledBuffer->setRange(0, 0);
1025 }
Chong Zhang00c5c052018-12-17 14:15:58 -08001026 mHidlMemory = newMem;
Chong Zhang3b2847f2017-01-18 17:43:03 -08001027 mDescrambledBuffer = newScrambledBuffer;
Chong Zhangd5a416a2017-05-16 11:16:34 -07001028
Chong Zhang00c5c052018-12-17 14:15:58 -08001029 mDescramblerSrcBuffer.heapBase = hidlMemToken;
1030 mDescramblerSrcBuffer.offset = 0ULL;
1031 mDescramblerSrcBuffer.size = (uint64_t)neededSize;
Chong Zhang58ddee32018-02-13 17:52:39 -08001032
Chong Zhang00c5c052018-12-17 14:15:58 -08001033 ALOGD("[stream %d] created shared buffer for descrambling, size %zu",
1034 mElementaryPID, neededSize);
Chong Zhang3b2847f2017-01-18 17:43:03 -08001035 } else {
1036 // Align to multiples of 64K.
1037 neededSize = (neededSize + 65535) & ~65535;
1038 }
1039
1040 newBuffer = new ABuffer(neededSize);
1041 if (mBuffer != NULL) {
1042 memcpy(newBuffer->data(), mBuffer->data(), mBuffer->size());
1043 newBuffer->setRange(0, mBuffer->size());
1044 } else {
1045 newBuffer->setRange(0, 0);
1046 }
1047 mBuffer = newBuffer;
Chong Zhangd5a416a2017-05-16 11:16:34 -07001048 return true;
Chong Zhang3b2847f2017-01-18 17:43:03 -08001049}
1050
Andreas Huber54031292011-09-01 11:04:43 -07001051status_t ATSParser::Stream::parse(
Andreas Huber87f2a552012-08-31 13:55:24 -07001052 unsigned continuity_counter,
Chong Zhang3b2847f2017-01-18 17:43:03 -08001053 unsigned payload_unit_start_indicator,
1054 unsigned transport_scrambling_control,
1055 unsigned random_access_indicator,
1056 ABitReader *br, SyncEvent *event) {
Andreas Huber18ac5402011-08-31 15:04:25 -07001057 if (mQueue == NULL) {
Andreas Huber54031292011-09-01 11:04:43 -07001058 return OK;
Andreas Huber18ac5402011-08-31 15:04:25 -07001059 }
1060
Andreas Huber87f2a552012-08-31 13:55:24 -07001061 if (mExpectedContinuityCounter >= 0
1062 && (unsigned)mExpectedContinuityCounter != continuity_counter) {
1063 ALOGI("discontinuity on stream pid 0x%04x", mElementaryPID);
1064
1065 mPayloadStarted = false;
Wei Jia9558f6d2016-03-08 17:31:16 -08001066 mPesStartOffsets.clear();
Andreas Huber87f2a552012-08-31 13:55:24 -07001067 mBuffer->setRange(0, 0);
Chong Zhang3b2847f2017-01-18 17:43:03 -08001068 mSubSamples.clear();
Andreas Huber87f2a552012-08-31 13:55:24 -07001069 mExpectedContinuityCounter = -1;
1070
Andreas Huber94a483b2013-01-29 09:22:16 -08001071#if 0
1072 // Uncomment this if you'd rather see no corruption whatsoever on
1073 // screen and suspend updates until we come across another IDR frame.
1074
1075 if (mStreamType == STREAMTYPE_H264) {
1076 ALOGI("clearing video queue");
1077 mQueue->clear(true /* clearFormat */);
1078 }
1079#endif
1080
Chong Zhang66830852014-06-05 14:44:03 -07001081 if (!payload_unit_start_indicator) {
1082 return OK;
1083 }
Andreas Huber87f2a552012-08-31 13:55:24 -07001084 }
1085
1086 mExpectedContinuityCounter = (continuity_counter + 1) & 0x0f;
1087
Andreas Hubercda17c62010-06-07 13:05:37 -07001088 if (payload_unit_start_indicator) {
Wonsik Kim54000662015-04-13 10:59:06 +09001089 off64_t offset = (event != NULL) ? event->getOffset() : 0;
Andreas Hubercda17c62010-06-07 13:05:37 -07001090 if (mPayloadStarted) {
1091 // Otherwise we run the danger of receiving the trailing bytes
1092 // of a PES packet that we never saw the start of and assuming
1093 // we have a a complete PES packet.
1094
Wonsik Kim54000662015-04-13 10:59:06 +09001095 status_t err = flush(event);
Andreas Huber54031292011-09-01 11:04:43 -07001096
1097 if (err != OK) {
Wonsik Kim65959d32015-06-10 16:17:45 +09001098 ALOGW("Error (%08x) happened while flushing; we simply discard "
1099 "the PES packet and continue.", err);
Andreas Huber54031292011-09-01 11:04:43 -07001100 }
Andreas Hubercda17c62010-06-07 13:05:37 -07001101 }
1102
1103 mPayloadStarted = true;
Wei Jiab08d83e2016-09-30 17:39:30 -07001104 // There should be at most 2 elements in |mPesStartOffsets|.
1105 while (mPesStartOffsets.size() >= 2) {
1106 mPesStartOffsets.erase(mPesStartOffsets.begin());
1107 }
Wei Jia9558f6d2016-03-08 17:31:16 -08001108 mPesStartOffsets.push_back(offset);
Andreas Hubercda17c62010-06-07 13:05:37 -07001109 }
1110
1111 if (!mPayloadStarted) {
Andreas Huber54031292011-09-01 11:04:43 -07001112 return OK;
Andreas Hubercda17c62010-06-07 13:05:37 -07001113 }
1114
1115 size_t payloadSizeBits = br->numBitsLeft();
Jinsuk Kime314c672015-04-22 11:08:28 +09001116 if (payloadSizeBits % 8 != 0u) {
1117 ALOGE("Wrong value");
1118 return BAD_VALUE;
1119 }
Andreas Hubercda17c62010-06-07 13:05:37 -07001120
Andreas Huber3e573222011-03-02 16:18:33 -08001121 size_t neededSize = mBuffer->size() + payloadSizeBits / 8;
Chong Zhangd5a416a2017-05-16 11:16:34 -07001122 if (!ensureBufferCapacity(neededSize)) {
1123 return NO_MEMORY;
1124 }
Andreas Hubercda17c62010-06-07 13:05:37 -07001125
1126 memcpy(mBuffer->data() + mBuffer->size(), br->data(), payloadSizeBits / 8);
1127 mBuffer->setRange(0, mBuffer->size() + payloadSizeBits / 8);
Andreas Huber54031292011-09-01 11:04:43 -07001128
Chong Zhang3b2847f2017-01-18 17:43:03 -08001129 if (mScrambled) {
1130 mSubSamples.push_back({payloadSizeBits / 8,
1131 transport_scrambling_control, random_access_indicator});
1132 }
1133
Andreas Huber54031292011-09-01 11:04:43 -07001134 return OK;
Andreas Hubercda17c62010-06-07 13:05:37 -07001135}
1136
Andreas Huber6e3d3112011-11-28 12:36:11 -08001137bool ATSParser::Stream::isVideo() const {
1138 switch (mStreamType) {
1139 case STREAMTYPE_H264:
Hassan Shojania3a37f3e2017-04-19 14:29:42 -07001140 case STREAMTYPE_H264_ENCRYPTED:
Andreas Huber6e3d3112011-11-28 12:36:11 -08001141 case STREAMTYPE_MPEG1_VIDEO:
1142 case STREAMTYPE_MPEG2_VIDEO:
1143 case STREAMTYPE_MPEG4_VIDEO:
1144 return true;
1145
1146 default:
1147 return false;
1148 }
1149}
1150
1151bool ATSParser::Stream::isAudio() const {
1152 switch (mStreamType) {
1153 case STREAMTYPE_MPEG1_AUDIO:
1154 case STREAMTYPE_MPEG2_AUDIO:
1155 case STREAMTYPE_MPEG2_AUDIO_ADTS:
Chong Zhang9bf32f02014-07-30 15:40:31 -07001156 case STREAMTYPE_LPCM_AC3:
Changwan Ryud3c079a2013-10-28 11:08:44 +09001157 case STREAMTYPE_AC3:
Previr Rangroo68e6fe12017-11-30 20:02:13 -08001158 case STREAMTYPE_EAC3:
Hassan Shojania3a37f3e2017-04-19 14:29:42 -07001159 case STREAMTYPE_AAC_ENCRYPTED:
1160 case STREAMTYPE_AC3_ENCRYPTED:
Andreas Huber6e3d3112011-11-28 12:36:11 -08001161 return true;
Previr Rangroo7e6ac732017-11-13 20:20:20 -08001162 case STREAMTYPE_PES_PRIVATE_DATA:
1163 return mStreamTypeExt == EXT_DESCRIPTOR_DVB_AC4;
Andreas Huber6e3d3112011-11-28 12:36:11 -08001164
1165 default:
1166 return false;
1167 }
1168}
1169
Robert Shih08528432015-04-08 09:06:54 -07001170bool ATSParser::Stream::isMeta() const {
1171 if (mStreamType == STREAMTYPE_METADATA) {
1172 return true;
1173 }
1174 return false;
1175}
1176
Andreas Huber32f3cef2011-03-02 15:34:46 -08001177void ATSParser::Stream::signalDiscontinuity(
1178 DiscontinuityType type, const sp<AMessage> &extra) {
Marco Nelissen0389cc02012-10-02 10:47:39 -07001179 mExpectedContinuityCounter = -1;
1180
Andreas Huber18ac5402011-08-31 15:04:25 -07001181 if (mQueue == NULL) {
1182 return;
1183 }
1184
Andreas Huber2a4d22d2010-09-08 14:32:20 -07001185 mPayloadStarted = false;
Wei Jia9558f6d2016-03-08 17:31:16 -08001186 mPesStartOffsets.clear();
Robert Shihaabbdc72015-05-08 17:39:40 -07001187 mEOSReached = false;
Andreas Huber2a4d22d2010-09-08 14:32:20 -07001188 mBuffer->setRange(0, 0);
Chong Zhang3b2847f2017-01-18 17:43:03 -08001189 mSubSamples.clear();
Andreas Huber2a4d22d2010-09-08 14:32:20 -07001190
Andreas Huber6e3d3112011-11-28 12:36:11 -08001191 bool clearFormat = false;
1192 if (isAudio()) {
1193 if (type & DISCONTINUITY_AUDIO_FORMAT) {
1194 clearFormat = true;
Andreas Huberf9334412010-12-15 15:17:42 -08001195 }
Andreas Huber6e3d3112011-11-28 12:36:11 -08001196 } else {
1197 if (type & DISCONTINUITY_VIDEO_FORMAT) {
1198 clearFormat = true;
1199 }
1200 }
Andreas Huberf9334412010-12-15 15:17:42 -08001201
Andreas Huber6e3d3112011-11-28 12:36:11 -08001202 mQueue->clear(clearFormat);
1203
1204 if (type & DISCONTINUITY_TIME) {
1205 uint64_t resumeAtPTS;
1206 if (extra != NULL
1207 && extra->findInt64(
Dongwon Kang15d02f82017-12-14 16:32:18 -08001208 kATSParserKeyResumeAtPTS,
Andreas Huber6e3d3112011-11-28 12:36:11 -08001209 (int64_t *)&resumeAtPTS)) {
1210 int64_t resumeAtMediaTimeUs =
1211 mProgram->convertPTSToTimestamp(resumeAtPTS);
1212
Wei Jiac6cfd702014-11-11 16:33:20 -08001213 extra->setInt64("resume-at-mediaTimeUs", resumeAtMediaTimeUs);
Andreas Huber6e3d3112011-11-28 12:36:11 -08001214 }
1215 }
1216
1217 if (mSource != NULL) {
Chong Zhang3b2847f2017-01-18 17:43:03 -08001218 sp<MetaData> meta = mSource->getFormat();
1219 const char* mime;
1220 if (clearFormat && meta != NULL && meta->findCString(kKeyMIMEType, &mime)
1221 && (!strncasecmp(mime, MEDIA_MIMETYPE_AUDIO_SCRAMBLED, 15)
1222 || !strncasecmp(mime, MEDIA_MIMETYPE_VIDEO_SCRAMBLED, 15))){
1223 mSource->clear();
1224 } else {
1225 mSource->queueDiscontinuity(type, extra, true);
1226 }
Andreas Huberf9334412010-12-15 15:17:42 -08001227 }
1228}
1229
1230void ATSParser::Stream::signalEOS(status_t finalResult) {
1231 if (mSource != NULL) {
1232 mSource->signalEOS(finalResult);
Andreas Huber2a4d22d2010-09-08 14:32:20 -07001233 }
Marco Nelissenbe9634d2015-04-15 14:33:39 -07001234 mEOSReached = true;
Wonsik Kim54000662015-04-13 10:59:06 +09001235 flush(NULL);
Andreas Huber2a4d22d2010-09-08 14:32:20 -07001236}
1237
Wonsik Kim54000662015-04-13 10:59:06 +09001238status_t ATSParser::Stream::parsePES(ABitReader *br, SyncEvent *event) {
Chong Zhang3b2847f2017-01-18 17:43:03 -08001239 const uint8_t *basePtr = br->data();
1240
Andreas Hubercda17c62010-06-07 13:05:37 -07001241 unsigned packet_startcode_prefix = br->getBits(24);
1242
Steve Block3856b092011-10-20 11:56:00 +01001243 ALOGV("packet_startcode_prefix = 0x%08x", packet_startcode_prefix);
Andreas Hubercda17c62010-06-07 13:05:37 -07001244
Andreas Huber386d6092011-05-19 08:37:39 -07001245 if (packet_startcode_prefix != 1) {
Steve Block3856b092011-10-20 11:56:00 +01001246 ALOGV("Supposedly payload_unit_start=1 unit does not start "
Andreas Huber386d6092011-05-19 08:37:39 -07001247 "with startcode.");
Andreas Huber54031292011-09-01 11:04:43 -07001248
1249 return ERROR_MALFORMED;
Andreas Huber386d6092011-05-19 08:37:39 -07001250 }
1251
Andreas Hubercda17c62010-06-07 13:05:37 -07001252 unsigned stream_id = br->getBits(8);
Steve Block3856b092011-10-20 11:56:00 +01001253 ALOGV("stream_id = 0x%02x", stream_id);
Andreas Hubercda17c62010-06-07 13:05:37 -07001254
1255 unsigned PES_packet_length = br->getBits(16);
Steve Block3856b092011-10-20 11:56:00 +01001256 ALOGV("PES_packet_length = %u", PES_packet_length);
Andreas Hubercda17c62010-06-07 13:05:37 -07001257
1258 if (stream_id != 0xbc // program_stream_map
1259 && stream_id != 0xbe // padding_stream
1260 && stream_id != 0xbf // private_stream_2
1261 && stream_id != 0xf0 // ECM
1262 && stream_id != 0xf1 // EMM
1263 && stream_id != 0xff // program_stream_directory
1264 && stream_id != 0xf2 // DSMCC
1265 && stream_id != 0xf8) { // H.222.1 type E
Jinsuk Kime314c672015-04-22 11:08:28 +09001266 if (br->getBits(2) != 2u) {
1267 return ERROR_MALFORMED;
1268 }
Andreas Hubercda17c62010-06-07 13:05:37 -07001269
Chong Zhang3b2847f2017-01-18 17:43:03 -08001270 unsigned PES_scrambling_control = br->getBits(2);
1271 ALOGV("PES_scrambling_control = %u", PES_scrambling_control);
1272
Andreas Huber6e4c5c42010-09-21 13:13:15 -07001273 MY_LOGV("PES_priority = %u", br->getBits(1));
1274 MY_LOGV("data_alignment_indicator = %u", br->getBits(1));
1275 MY_LOGV("copyright = %u", br->getBits(1));
1276 MY_LOGV("original_or_copy = %u", br->getBits(1));
Andreas Hubercda17c62010-06-07 13:05:37 -07001277
1278 unsigned PTS_DTS_flags = br->getBits(2);
Steve Block3856b092011-10-20 11:56:00 +01001279 ALOGV("PTS_DTS_flags = %u", PTS_DTS_flags);
Andreas Hubercda17c62010-06-07 13:05:37 -07001280
1281 unsigned ESCR_flag = br->getBits(1);
Steve Block3856b092011-10-20 11:56:00 +01001282 ALOGV("ESCR_flag = %u", ESCR_flag);
Andreas Hubercda17c62010-06-07 13:05:37 -07001283
1284 unsigned ES_rate_flag = br->getBits(1);
Steve Block3856b092011-10-20 11:56:00 +01001285 ALOGV("ES_rate_flag = %u", ES_rate_flag);
Andreas Hubercda17c62010-06-07 13:05:37 -07001286
1287 unsigned DSM_trick_mode_flag = br->getBits(1);
Steve Block3856b092011-10-20 11:56:00 +01001288 ALOGV("DSM_trick_mode_flag = %u", DSM_trick_mode_flag);
Andreas Hubercda17c62010-06-07 13:05:37 -07001289
1290 unsigned additional_copy_info_flag = br->getBits(1);
Steve Block3856b092011-10-20 11:56:00 +01001291 ALOGV("additional_copy_info_flag = %u", additional_copy_info_flag);
Andreas Hubercda17c62010-06-07 13:05:37 -07001292
Andreas Huber6e4c5c42010-09-21 13:13:15 -07001293 MY_LOGV("PES_CRC_flag = %u", br->getBits(1));
1294 MY_LOGV("PES_extension_flag = %u", br->getBits(1));
Andreas Hubercda17c62010-06-07 13:05:37 -07001295
1296 unsigned PES_header_data_length = br->getBits(8);
Steve Block3856b092011-10-20 11:56:00 +01001297 ALOGV("PES_header_data_length = %u", PES_header_data_length);
Andreas Hubercda17c62010-06-07 13:05:37 -07001298
1299 unsigned optional_bytes_remaining = PES_header_data_length;
1300
1301 uint64_t PTS = 0, DTS = 0;
1302
1303 if (PTS_DTS_flags == 2 || PTS_DTS_flags == 3) {
Jinsuk Kime314c672015-04-22 11:08:28 +09001304 if (optional_bytes_remaining < 5u) {
1305 return ERROR_MALFORMED;
1306 }
Andreas Hubercda17c62010-06-07 13:05:37 -07001307
David Yeh6456ae72014-09-03 11:14:48 +08001308 if (br->getBits(4) != PTS_DTS_flags) {
David Yeh6456ae72014-09-03 11:14:48 +08001309 return ERROR_MALFORMED;
1310 }
Andreas Hubercda17c62010-06-07 13:05:37 -07001311 PTS = ((uint64_t)br->getBits(3)) << 30;
Jinsuk Kime314c672015-04-22 11:08:28 +09001312 if (br->getBits(1) != 1u) {
1313 return ERROR_MALFORMED;
1314 }
Andreas Hubercda17c62010-06-07 13:05:37 -07001315 PTS |= ((uint64_t)br->getBits(15)) << 15;
Jinsuk Kime314c672015-04-22 11:08:28 +09001316 if (br->getBits(1) != 1u) {
1317 return ERROR_MALFORMED;
1318 }
Andreas Hubercda17c62010-06-07 13:05:37 -07001319 PTS |= br->getBits(15);
Jinsuk Kime314c672015-04-22 11:08:28 +09001320 if (br->getBits(1) != 1u) {
1321 return ERROR_MALFORMED;
1322 }
Andreas Hubercda17c62010-06-07 13:05:37 -07001323
Colin Crossb4a7a2d2014-03-19 16:59:00 -07001324 ALOGV("PTS = 0x%016" PRIx64 " (%.2f)", PTS, PTS / 90000.0);
Andreas Hubercda17c62010-06-07 13:05:37 -07001325
1326 optional_bytes_remaining -= 5;
1327
1328 if (PTS_DTS_flags == 3) {
Jinsuk Kime314c672015-04-22 11:08:28 +09001329 if (optional_bytes_remaining < 5u) {
1330 return ERROR_MALFORMED;
1331 }
Andreas Hubercda17c62010-06-07 13:05:37 -07001332
Jinsuk Kime314c672015-04-22 11:08:28 +09001333 if (br->getBits(4) != 1u) {
1334 return ERROR_MALFORMED;
1335 }
Andreas Hubercda17c62010-06-07 13:05:37 -07001336
1337 DTS = ((uint64_t)br->getBits(3)) << 30;
Jinsuk Kime314c672015-04-22 11:08:28 +09001338 if (br->getBits(1) != 1u) {
1339 return ERROR_MALFORMED;
1340 }
Andreas Hubercda17c62010-06-07 13:05:37 -07001341 DTS |= ((uint64_t)br->getBits(15)) << 15;
Jinsuk Kime314c672015-04-22 11:08:28 +09001342 if (br->getBits(1) != 1u) {
1343 return ERROR_MALFORMED;
1344 }
Andreas Hubercda17c62010-06-07 13:05:37 -07001345 DTS |= br->getBits(15);
Jinsuk Kime314c672015-04-22 11:08:28 +09001346 if (br->getBits(1) != 1u) {
1347 return ERROR_MALFORMED;
1348 }
Andreas Hubercda17c62010-06-07 13:05:37 -07001349
Colin Crossb4a7a2d2014-03-19 16:59:00 -07001350 ALOGV("DTS = %" PRIu64, DTS);
Andreas Hubercda17c62010-06-07 13:05:37 -07001351
1352 optional_bytes_remaining -= 5;
1353 }
1354 }
1355
1356 if (ESCR_flag) {
Jinsuk Kime314c672015-04-22 11:08:28 +09001357 if (optional_bytes_remaining < 6u) {
1358 return ERROR_MALFORMED;
1359 }
Andreas Hubercda17c62010-06-07 13:05:37 -07001360
1361 br->getBits(2);
1362
1363 uint64_t ESCR = ((uint64_t)br->getBits(3)) << 30;
Jinsuk Kime314c672015-04-22 11:08:28 +09001364 if (br->getBits(1) != 1u) {
1365 return ERROR_MALFORMED;
1366 }
Andreas Hubercda17c62010-06-07 13:05:37 -07001367 ESCR |= ((uint64_t)br->getBits(15)) << 15;
Jinsuk Kime314c672015-04-22 11:08:28 +09001368 if (br->getBits(1) != 1u) {
1369 return ERROR_MALFORMED;
1370 }
Andreas Hubercda17c62010-06-07 13:05:37 -07001371 ESCR |= br->getBits(15);
Jinsuk Kime314c672015-04-22 11:08:28 +09001372 if (br->getBits(1) != 1u) {
1373 return ERROR_MALFORMED;
1374 }
Andreas Hubercda17c62010-06-07 13:05:37 -07001375
Colin Crossb4a7a2d2014-03-19 16:59:00 -07001376 ALOGV("ESCR = %" PRIu64, ESCR);
Andreas Huber6e4c5c42010-09-21 13:13:15 -07001377 MY_LOGV("ESCR_extension = %u", br->getBits(9));
Andreas Hubercda17c62010-06-07 13:05:37 -07001378
Jinsuk Kime314c672015-04-22 11:08:28 +09001379 if (br->getBits(1) != 1u) {
1380 return ERROR_MALFORMED;
1381 }
Andreas Hubercda17c62010-06-07 13:05:37 -07001382
1383 optional_bytes_remaining -= 6;
1384 }
1385
1386 if (ES_rate_flag) {
Jinsuk Kime314c672015-04-22 11:08:28 +09001387 if (optional_bytes_remaining < 3u) {
1388 return ERROR_MALFORMED;
1389 }
Andreas Hubercda17c62010-06-07 13:05:37 -07001390
Jinsuk Kime314c672015-04-22 11:08:28 +09001391 if (br->getBits(1) != 1u) {
1392 return ERROR_MALFORMED;
1393 }
Andreas Huber6e4c5c42010-09-21 13:13:15 -07001394 MY_LOGV("ES_rate = %u", br->getBits(22));
Jinsuk Kime314c672015-04-22 11:08:28 +09001395 if (br->getBits(1) != 1u) {
1396 return ERROR_MALFORMED;
1397 }
Andreas Hubercda17c62010-06-07 13:05:37 -07001398
1399 optional_bytes_remaining -= 3;
1400 }
1401
1402 br->skipBits(optional_bytes_remaining * 8);
1403
1404 // ES data follows.
Chong Zhang3b2847f2017-01-18 17:43:03 -08001405 int32_t pesOffset = br->data() - basePtr;
Andreas Hubercda17c62010-06-07 13:05:37 -07001406
Andreas Hubercda17c62010-06-07 13:05:37 -07001407 if (PES_packet_length != 0) {
Jinsuk Kime314c672015-04-22 11:08:28 +09001408 if (PES_packet_length < PES_header_data_length + 3) {
1409 return ERROR_MALFORMED;
1410 }
Andreas Hubercda17c62010-06-07 13:05:37 -07001411
1412 unsigned dataLength =
1413 PES_packet_length - 3 - PES_header_data_length;
1414
Andreas Huber54031292011-09-01 11:04:43 -07001415 if (br->numBitsLeft() < dataLength * 8) {
Steve Block29357bc2012-01-06 19:20:56 +00001416 ALOGE("PES packet does not carry enough data to contain "
Colin Crossb4a7a2d2014-03-19 16:59:00 -07001417 "payload. (numBitsLeft = %zu, required = %u)",
Andreas Huber54031292011-09-01 11:04:43 -07001418 br->numBitsLeft(), dataLength * 8);
1419
1420 return ERROR_MALFORMED;
1421 }
1422
Chong Zhang3b2847f2017-01-18 17:43:03 -08001423 ALOGV("There's %u bytes of payload, PES_packet_length=%u, offset=%d",
1424 dataLength, PES_packet_length, pesOffset);
1425
Andreas Huber0da4dab2010-09-27 12:04:43 -07001426 onPayloadData(
Chong Zhang3b2847f2017-01-18 17:43:03 -08001427 PTS_DTS_flags, PTS, DTS, PES_scrambling_control,
1428 br->data(), dataLength, pesOffset, event);
Andreas Hubercda17c62010-06-07 13:05:37 -07001429
1430 br->skipBits(dataLength * 8);
1431 } else {
Andreas Huber0da4dab2010-09-27 12:04:43 -07001432 onPayloadData(
Chong Zhang3b2847f2017-01-18 17:43:03 -08001433 PTS_DTS_flags, PTS, DTS, PES_scrambling_control,
1434 br->data(), br->numBitsLeft() / 8, pesOffset, event);
Andreas Huber0da4dab2010-09-27 12:04:43 -07001435
Andreas Hubercda17c62010-06-07 13:05:37 -07001436 size_t payloadSizeBits = br->numBitsLeft();
Jinsuk Kime314c672015-04-22 11:08:28 +09001437 if (payloadSizeBits % 8 != 0u) {
1438 return ERROR_MALFORMED;
1439 }
Andreas Hubercda17c62010-06-07 13:05:37 -07001440
Chong Zhang3b2847f2017-01-18 17:43:03 -08001441 ALOGV("There's %zu bytes of payload, offset=%d",
1442 payloadSizeBits / 8, pesOffset);
Andreas Hubercda17c62010-06-07 13:05:37 -07001443 }
1444 } else if (stream_id == 0xbe) { // padding_stream
Jinsuk Kime314c672015-04-22 11:08:28 +09001445 if (PES_packet_length == 0u) {
1446 return ERROR_MALFORMED;
1447 }
Andreas Hubercda17c62010-06-07 13:05:37 -07001448 br->skipBits(PES_packet_length * 8);
1449 } else {
Jinsuk Kime314c672015-04-22 11:08:28 +09001450 if (PES_packet_length == 0u) {
1451 return ERROR_MALFORMED;
1452 }
Andreas Hubercda17c62010-06-07 13:05:37 -07001453 br->skipBits(PES_packet_length * 8);
1454 }
Andreas Huber54031292011-09-01 11:04:43 -07001455
1456 return OK;
Andreas Hubercda17c62010-06-07 13:05:37 -07001457}
1458
Chong Zhang3b2847f2017-01-18 17:43:03 -08001459uint32_t ATSParser::Stream::getPesScramblingControl(
1460 ABitReader *br, int32_t *pesOffset) {
1461 unsigned packet_startcode_prefix = br->getBits(24);
1462
1463 ALOGV("packet_startcode_prefix = 0x%08x", packet_startcode_prefix);
1464
1465 if (packet_startcode_prefix != 1) {
1466 ALOGV("unit does not start with startcode.");
1467 return 0;
1468 }
1469
1470 if (br->numBitsLeft() < 48) {
1471 return 0;
1472 }
1473
1474 unsigned stream_id = br->getBits(8);
1475 ALOGV("stream_id = 0x%02x", stream_id);
1476
1477 br->skipBits(16); // PES_packet_length
1478
1479 if (stream_id != 0xbc // program_stream_map
1480 && stream_id != 0xbe // padding_stream
1481 && stream_id != 0xbf // private_stream_2
1482 && stream_id != 0xf0 // ECM
1483 && stream_id != 0xf1 // EMM
1484 && stream_id != 0xff // program_stream_directory
1485 && stream_id != 0xf2 // DSMCC
1486 && stream_id != 0xf8) { // H.222.1 type E
1487 if (br->getBits(2) != 2u) {
1488 return 0;
1489 }
1490
1491 unsigned PES_scrambling_control = br->getBits(2);
1492 ALOGV("PES_scrambling_control = %u", PES_scrambling_control);
1493
1494 if (PES_scrambling_control == 0) {
1495 return 0;
1496 }
1497
1498 br->skipBits(12); // don't care
1499
1500 unsigned PES_header_data_length = br->getBits(8);
1501 ALOGV("PES_header_data_length = %u", PES_header_data_length);
1502
1503 if (PES_header_data_length * 8 > br->numBitsLeft()) {
1504 return 0;
1505 }
1506
1507 *pesOffset = 9 + PES_header_data_length;
1508 ALOGD("found PES_scrambling_control=%d, PES offset=%d",
1509 PES_scrambling_control, *pesOffset);
1510 return PES_scrambling_control;
1511 }
1512
1513 return 0;
1514}
1515
1516status_t ATSParser::Stream::flushScrambled(SyncEvent *event) {
1517 if (mDescrambler == NULL) {
1518 ALOGE("received scrambled packets without descrambler!");
1519 return UNKNOWN_ERROR;
1520 }
1521
Chong Zhang00c5c052018-12-17 14:15:58 -08001522 if (mDescrambledBuffer == NULL || mHidlMemory == NULL) {
Chong Zhang3b2847f2017-01-18 17:43:03 -08001523 ALOGE("received scrambled packets without shared memory!");
1524
1525 return UNKNOWN_ERROR;
1526 }
1527
1528 int32_t pesOffset = 0;
1529 int32_t descrambleSubSamples = 0, descrambleBytes = 0;
1530 uint32_t tsScramblingControl = 0, pesScramblingControl = 0;
1531
1532 // First, go over subsamples to find TS-level scrambling key id, and
1533 // calculate how many subsample we need to descramble (assuming we don't
1534 // have PES-level scrambling).
1535 for (auto it = mSubSamples.begin(); it != mSubSamples.end(); it++) {
1536 if (it->transport_scrambling_mode != 0) {
1537 // TODO: handle keyId change, use the first non-zero keyId for now.
1538 if (tsScramblingControl == 0) {
1539 tsScramblingControl = it->transport_scrambling_mode;
1540 }
1541 }
1542 if (tsScramblingControl == 0 || descrambleSubSamples == 0
1543 || !mQueue->isScrambled()) {
1544 descrambleSubSamples++;
1545 descrambleBytes += it->subSampleSize;
1546 }
1547 }
1548 // If not scrambled at TS-level, check PES-level scrambling
1549 if (tsScramblingControl == 0) {
1550 ABitReader br(mBuffer->data(), mBuffer->size());
1551 pesScramblingControl = getPesScramblingControl(&br, &pesOffset);
1552 // If not scrambled at PES-level either, or scrambled at PES-level but
1553 // requires output to remain scrambled, we don't need to descramble
1554 // anything.
1555 if (pesScramblingControl == 0 || mQueue->isScrambled()) {
1556 descrambleSubSamples = 0;
1557 descrambleBytes = 0;
1558 }
1559 }
1560
1561 uint32_t sctrl = tsScramblingControl != 0 ?
1562 tsScramblingControl : pesScramblingControl;
Chong Zhangd1af6412018-02-20 10:59:37 -08001563 if (mQueue->isScrambled()) {
1564 sctrl |= DescramblerPlugin::kScrambling_Flag_PesHeader;
1565 }
Chong Zhang3b2847f2017-01-18 17:43:03 -08001566
1567 // Perform the 1st pass descrambling if needed
1568 if (descrambleBytes > 0) {
1569 memcpy(mDescrambledBuffer->data(), mBuffer->data(), descrambleBytes);
Chong Zhangb2451bb2018-07-12 12:19:12 -07001570 mDescrambledBuffer->setRange(0, mBuffer->size());
Chong Zhang3b2847f2017-01-18 17:43:03 -08001571
Chong Zhangd5a416a2017-05-16 11:16:34 -07001572 hidl_vec<SubSample> subSamples;
1573 subSamples.resize(descrambleSubSamples);
Chong Zhang3b2847f2017-01-18 17:43:03 -08001574
1575 int32_t i = 0;
1576 for (auto it = mSubSamples.begin();
1577 it != mSubSamples.end() && i < descrambleSubSamples; it++, i++) {
1578 if (it->transport_scrambling_mode != 0 || pesScramblingControl != 0) {
Chong Zhangd5a416a2017-05-16 11:16:34 -07001579 subSamples[i].numBytesOfClearData = 0;
1580 subSamples[i].numBytesOfEncryptedData = it->subSampleSize;
Chong Zhang3b2847f2017-01-18 17:43:03 -08001581 } else {
Chong Zhangd5a416a2017-05-16 11:16:34 -07001582 subSamples[i].numBytesOfClearData = it->subSampleSize;
1583 subSamples[i].numBytesOfEncryptedData = 0;
Chong Zhang3b2847f2017-01-18 17:43:03 -08001584 }
1585 }
Chong Zhangd5a416a2017-05-16 11:16:34 -07001586
Chong Zhangb2451bb2018-07-12 12:19:12 -07001587 // If scrambled at PES-level, PES header is in the clear
Chong Zhang3b2847f2017-01-18 17:43:03 -08001588 if (pesScramblingControl != 0) {
Chong Zhangb2451bb2018-07-12 12:19:12 -07001589 subSamples[0].numBytesOfClearData = pesOffset;
Chong Zhangd5a416a2017-05-16 11:16:34 -07001590 subSamples[0].numBytesOfEncryptedData -= pesOffset;
Chong Zhang3b2847f2017-01-18 17:43:03 -08001591 }
1592
Chong Zhangd5a416a2017-05-16 11:16:34 -07001593 Status status = Status::OK;
1594 uint32_t bytesWritten = 0;
1595 hidl_string detailedError;
Chong Zhang3b2847f2017-01-18 17:43:03 -08001596
Chong Zhangd5a416a2017-05-16 11:16:34 -07001597 DestinationBuffer dstBuffer;
1598 dstBuffer.type = BufferType::SHARED_MEMORY;
1599 dstBuffer.nonsecureMemory = mDescramblerSrcBuffer;
1600
1601 auto returnVoid = mDescrambler->descramble(
1602 (ScramblingControl) sctrl,
1603 subSamples,
1604 mDescramblerSrcBuffer,
Chong Zhangb2451bb2018-07-12 12:19:12 -07001605 0 /*srcOffset*/,
Chong Zhangd5a416a2017-05-16 11:16:34 -07001606 dstBuffer,
Chong Zhangb2451bb2018-07-12 12:19:12 -07001607 0 /*dstOffset*/,
Chong Zhangd5a416a2017-05-16 11:16:34 -07001608 [&status, &bytesWritten, &detailedError] (
1609 Status _status, uint32_t _bytesWritten,
1610 const hidl_string& _detailedError) {
1611 status = _status;
1612 bytesWritten = _bytesWritten;
1613 detailedError = _detailedError;
1614 });
1615
Chong Zhangf03d9352019-01-04 11:24:47 -08001616 if (!returnVoid.isOk() || status != Status::OK) {
1617 ALOGE("[stream %d] descramble failed, trans=%s, status=%d",
1618 mElementaryPID, returnVoid.description().c_str(), status);
Chong Zhang3b2847f2017-01-18 17:43:03 -08001619 return UNKNOWN_ERROR;
1620 }
1621
1622 ALOGV("[stream %d] descramble succeeded, %d bytes",
Chong Zhangd5a416a2017-05-16 11:16:34 -07001623 mElementaryPID, bytesWritten);
Chong Zhangb2451bb2018-07-12 12:19:12 -07001624
1625 // Set descrambleBytes to the returned result.
1626 // Note that this might be smaller than the total length of input data.
1627 // (eg. when we're descrambling the PES header portion of a secure stream,
1628 // the plugin might cut it off right after the PES header.)
1629 descrambleBytes = bytesWritten;
Chong Zhang3b2847f2017-01-18 17:43:03 -08001630 }
1631
Chong Zhange32a4132018-07-23 14:17:38 -07001632 // |buffer| points to the buffer from which we'd parse the PES header.
1633 // When the output stream is scrambled, it points to mDescrambledBuffer
1634 // (unless all packets in this PES are actually clear, in which case,
1635 // it points to mBuffer since we never copied into mDescrambledBuffer).
1636 // When the output stream is clear, it points to mBuffer, and we'll
1637 // copy all descrambled data back to mBuffer.
1638 sp<ABuffer> buffer = mBuffer;
Chong Zhang3b2847f2017-01-18 17:43:03 -08001639 if (mQueue->isScrambled()) {
1640 // Queue subSample info for scrambled queue
1641 sp<ABuffer> clearSizesBuffer = new ABuffer(mSubSamples.size() * 4);
1642 sp<ABuffer> encSizesBuffer = new ABuffer(mSubSamples.size() * 4);
1643 int32_t *clearSizePtr = (int32_t*)clearSizesBuffer->data();
1644 int32_t *encSizePtr = (int32_t*)encSizesBuffer->data();
1645 int32_t isSync = 0;
1646 int32_t i = 0;
1647 for (auto it = mSubSamples.begin();
1648 it != mSubSamples.end(); it++, i++) {
1649 if ((it->transport_scrambling_mode == 0
Chong Zhangb2451bb2018-07-12 12:19:12 -07001650 && pesScramblingControl == 0)) {
Chong Zhang3b2847f2017-01-18 17:43:03 -08001651 clearSizePtr[i] = it->subSampleSize;
1652 encSizePtr[i] = 0;
1653 } else {
1654 clearSizePtr[i] = 0;
1655 encSizePtr[i] = it->subSampleSize;
1656 }
1657 isSync |= it->random_access_indicator;
1658 }
Chong Zhangb2451bb2018-07-12 12:19:12 -07001659
1660 // If scrambled at PES-level, PES header is in the clear
1661 if (pesScramblingControl != 0) {
1662 clearSizePtr[0] = pesOffset;
1663 encSizePtr[0] -= pesOffset;
1664 }
Chong Zhang3b2847f2017-01-18 17:43:03 -08001665 // Pass the original TS subsample size now. The PES header adjust
1666 // will be applied when the scrambled AU is dequeued.
Chong Zhange32a4132018-07-23 14:17:38 -07001667 // Note that if descrambleBytes is 0, it means this PES contains only
1668 // all ts packets, leadingClearBytes is entire buffer size.
Chong Zhang3b2847f2017-01-18 17:43:03 -08001669 mQueue->appendScrambledData(
Chong Zhange32a4132018-07-23 14:17:38 -07001670 mBuffer->data(), mBuffer->size(),
1671 (descrambleBytes > 0) ? descrambleBytes : mBuffer->size(),
1672 sctrl, isSync, clearSizesBuffer, encSizesBuffer);
Chong Zhangb2451bb2018-07-12 12:19:12 -07001673
Chong Zhange32a4132018-07-23 14:17:38 -07001674 if (descrambleBytes > 0) {
1675 buffer = mDescrambledBuffer;
1676 }
Chong Zhangb2451bb2018-07-12 12:19:12 -07001677 } else {
1678 memcpy(mBuffer->data(), mDescrambledBuffer->data(), descrambleBytes);
Chong Zhang3b2847f2017-01-18 17:43:03 -08001679 }
1680
Chong Zhangb2451bb2018-07-12 12:19:12 -07001681 ABitReader br(buffer->data(), buffer->size());
Chong Zhang3b2847f2017-01-18 17:43:03 -08001682 status_t err = parsePES(&br, event);
1683
1684 if (err != OK) {
1685 ALOGE("[stream %d] failed to parse descrambled PES, err=%d",
1686 mElementaryPID, err);
1687 }
1688
1689 return err;
1690}
1691
1692
Wonsik Kim54000662015-04-13 10:59:06 +09001693status_t ATSParser::Stream::flush(SyncEvent *event) {
Jaesung Chungf2cecd52015-05-21 14:23:07 +09001694 if (mBuffer == NULL || mBuffer->size() == 0) {
Andreas Huber54031292011-09-01 11:04:43 -07001695 return OK;
Andreas Hubercda17c62010-06-07 13:05:37 -07001696 }
1697
Colin Crossb4a7a2d2014-03-19 16:59:00 -07001698 ALOGV("flushing stream 0x%04x size = %zu", mElementaryPID, mBuffer->size());
Andreas Hubercda17c62010-06-07 13:05:37 -07001699
Chong Zhang3b2847f2017-01-18 17:43:03 -08001700 status_t err = OK;
1701 if (mScrambled) {
1702 err = flushScrambled(event);
1703 mSubSamples.clear();
1704 } else {
1705 ABitReader br(mBuffer->data(), mBuffer->size());
1706 err = parsePES(&br, event);
1707 }
Andreas Hubercda17c62010-06-07 13:05:37 -07001708
1709 mBuffer->setRange(0, 0);
Andreas Huber54031292011-09-01 11:04:43 -07001710
1711 return err;
Andreas Hubercda17c62010-06-07 13:05:37 -07001712}
1713
Sampath Shettyc6148a62018-12-18 15:50:43 +11001714void ATSParser::Stream::addAudioPresentations(const sp<ABuffer> &buffer) {
1715 std::ostringstream outStream(std::ios::out);
1716 serializeAudioPresentations(mAudioPresentations, &outStream);
1717 sp<ABuffer> ap = ABuffer::CreateAsCopy(outStream.str().data(), outStream.str().size());
1718 buffer->meta()->setBuffer("audio-presentation-info", ap);
1719}
1720
Andreas Hubercda17c62010-06-07 13:05:37 -07001721void ATSParser::Stream::onPayloadData(
Andreas Huber84333e02014-02-07 15:36:10 -08001722 unsigned PTS_DTS_flags, uint64_t PTS, uint64_t /* DTS */,
Chong Zhang3b2847f2017-01-18 17:43:03 -08001723 unsigned PES_scrambling_control,
1724 const uint8_t *data, size_t size,
1725 int32_t payloadOffset, SyncEvent *event) {
Andreas Huber90a92052012-10-30 15:53:03 -07001726#if 0
1727 ALOGI("payload streamType 0x%02x, PTS = 0x%016llx, dPTS = %lld",
1728 mStreamType,
1729 PTS,
1730 (int64_t)PTS - mPrevPTS);
1731 mPrevPTS = PTS;
1732#endif
1733
Hassan Shojania3a37f3e2017-04-19 14:29:42 -07001734 ALOGV("onPayloadData mStreamType=0x%02x size: %zu", mStreamType, size);
Andreas Hubercda17c62010-06-07 13:05:37 -07001735
Chih-Hung Hsieh3794b242018-12-11 13:55:06 -08001736 int64_t timeUs = 0LL; // no presentation timestamp available.
Andreas Huber98a46cf2011-10-12 12:14:23 -07001737 if (PTS_DTS_flags == 2 || PTS_DTS_flags == 3) {
1738 timeUs = mProgram->convertPTSToTimestamp(PTS);
1739 }
Andreas Hubercda17c62010-06-07 13:05:37 -07001740
Chong Zhang3b2847f2017-01-18 17:43:03 -08001741 status_t err = mQueue->appendData(
1742 data, size, timeUs, payloadOffset, PES_scrambling_control);
Andreas Huberdecd9692010-12-02 13:27:47 -08001743
Marco Nelissenbe9634d2015-04-15 14:33:39 -07001744 if (mEOSReached) {
1745 mQueue->signalEOS();
1746 }
1747
Andreas Huberdecd9692010-12-02 13:27:47 -08001748 if (err != OK) {
1749 return;
1750 }
Andreas Hubercda17c62010-06-07 13:05:37 -07001751
Andreas Huber6a63a932010-10-01 10:51:41 -07001752 sp<ABuffer> accessUnit;
Wonsik Kim54000662015-04-13 10:59:06 +09001753 bool found = false;
Andreas Huber386d6092011-05-19 08:37:39 -07001754 while ((accessUnit = mQueue->dequeueAccessUnit()) != NULL) {
Andreas Huber6a63a932010-10-01 10:51:41 -07001755 if (mSource == NULL) {
Andreas Huber386d6092011-05-19 08:37:39 -07001756 sp<MetaData> meta = mQueue->getFormat();
Andreas Hubercda17c62010-06-07 13:05:37 -07001757
Andreas Huber6a63a932010-10-01 10:51:41 -07001758 if (meta != NULL) {
Steve Block3856b092011-10-20 11:56:00 +01001759 ALOGV("Stream PID 0x%08x of type 0x%02x now has data.",
Andreas Huber386d6092011-05-19 08:37:39 -07001760 mElementaryPID, mStreamType);
1761
Robert Shih309aa8b2014-07-29 18:34:36 -07001762 const char *mime;
1763 if (meta->findCString(kKeyMIMEType, &mime)
Chong Zhang3b2847f2017-01-18 17:43:03 -08001764 && !strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_AVC)) {
1765 int32_t sync = 0;
1766 if (!accessUnit->meta()->findInt32("isSync", &sync) || !sync) {
1767 continue;
1768 }
Robert Shih309aa8b2014-07-29 18:34:36 -07001769 }
Andreas Huber6a63a932010-10-01 10:51:41 -07001770 mSource = new AnotherPacketSource(meta);
Sampath Shettyc6148a62018-12-18 15:50:43 +11001771 if (mAudioPresentations.size() > 0) {
1772 addAudioPresentations(accessUnit);
1773 }
Andreas Huber6a63a932010-10-01 10:51:41 -07001774 mSource->queueAccessUnit(accessUnit);
Hassan Shojania3a37f3e2017-04-19 14:29:42 -07001775 ALOGV("onPayloadData: created AnotherPacketSource PID 0x%08x of type 0x%02x",
1776 mElementaryPID, mStreamType);
Andreas Huber82f73212010-09-01 12:22:36 -07001777 }
Andreas Huber386d6092011-05-19 08:37:39 -07001778 } else if (mQueue->getFormat() != NULL) {
Andreas Huber2a4d22d2010-09-08 14:32:20 -07001779 // After a discontinuity we invalidate the queue's format
1780 // and won't enqueue any access units to the source until
1781 // the queue has reestablished the new format.
Andreas Huber5bc087c2010-12-23 10:27:40 -08001782
1783 if (mSource->getFormat() == NULL) {
Andreas Huber386d6092011-05-19 08:37:39 -07001784 mSource->setFormat(mQueue->getFormat());
Andreas Huber5bc087c2010-12-23 10:27:40 -08001785 }
Sampath Shettyc6148a62018-12-18 15:50:43 +11001786 if (mAudioPresentations.size() > 0) {
1787 addAudioPresentations(accessUnit);
1788 }
Andreas Huber6a63a932010-10-01 10:51:41 -07001789 mSource->queueAccessUnit(accessUnit);
Andreas Huber82f73212010-09-01 12:22:36 -07001790 }
Wonsik Kim54000662015-04-13 10:59:06 +09001791
Wei Jiab08d83e2016-09-30 17:39:30 -07001792 // Every access unit has a pesStartOffset queued in |mPesStartOffsets|.
1793 off64_t pesStartOffset = -1;
1794 if (!mPesStartOffsets.empty()) {
1795 pesStartOffset = *mPesStartOffsets.begin();
1796 mPesStartOffsets.erase(mPesStartOffsets.begin());
1797 }
1798
1799 if (pesStartOffset >= 0 && (event != NULL) && !found && mQueue->getFormat() != NULL) {
Wonsik Kim54000662015-04-13 10:59:06 +09001800 int32_t sync = 0;
1801 if (accessUnit->meta()->findInt32("isSync", &sync) && sync) {
1802 int64_t timeUs;
1803 if (accessUnit->meta()->findInt64("timeUs", &timeUs)) {
1804 found = true;
Robert Shih82e14702016-11-17 11:24:29 -08001805 event->init(pesStartOffset, mSource, timeUs, getSourceType());
Wonsik Kim54000662015-04-13 10:59:06 +09001806 }
1807 }
1808 }
Andreas Huber82f73212010-09-01 12:22:36 -07001809 }
Andreas Huber82f73212010-09-01 12:22:36 -07001810}
1811
Robert Shih82e14702016-11-17 11:24:29 -08001812ATSParser::SourceType ATSParser::Stream::getSourceType() {
1813 if (isVideo()) {
1814 return VIDEO;
1815 } else if (isAudio()) {
1816 return AUDIO;
1817 } else if (isMeta()) {
1818 return META;
1819 }
1820 return NUM_SOURCE_TYPES;
1821}
1822
Marco Nelissen45d54c62018-01-26 10:04:22 -08001823sp<AnotherPacketSource> ATSParser::Stream::getSource(SourceType type) {
Andreas Huber386d6092011-05-19 08:37:39 -07001824 switch (type) {
1825 case VIDEO:
1826 {
Andreas Huber6e3d3112011-11-28 12:36:11 -08001827 if (isVideo()) {
Andreas Huber386d6092011-05-19 08:37:39 -07001828 return mSource;
1829 }
1830 break;
1831 }
1832
1833 case AUDIO:
1834 {
Andreas Huber6e3d3112011-11-28 12:36:11 -08001835 if (isAudio()) {
Andreas Huber386d6092011-05-19 08:37:39 -07001836 return mSource;
1837 }
1838 break;
1839 }
1840
Robert Shih08528432015-04-08 09:06:54 -07001841 case META:
1842 {
1843 if (isMeta()) {
1844 return mSource;
1845 }
1846 break;
1847 }
1848
Andreas Huber386d6092011-05-19 08:37:39 -07001849 default:
1850 break;
Andreas Hubercda17c62010-06-07 13:05:37 -07001851 }
1852
1853 return NULL;
1854}
1855
Chong Zhangbc7aae42017-03-31 14:53:19 -07001856void ATSParser::Stream::setCasInfo(
1857 int32_t systemId, const sp<IDescrambler> &descrambler,
Chong Zhang3b2847f2017-01-18 17:43:03 -08001858 const std::vector<uint8_t> &sessionId) {
1859 if (mSource != NULL && mDescrambler == NULL && descrambler != NULL) {
1860 signalDiscontinuity(DISCONTINUITY_FORMAT_ONLY, NULL);
1861 mDescrambler = descrambler;
1862 if (mQueue->isScrambled()) {
Chong Zhangbc7aae42017-03-31 14:53:19 -07001863 mQueue->setCasInfo(systemId, sessionId);
Chong Zhang3b2847f2017-01-18 17:43:03 -08001864 }
1865 }
1866}
1867
Andreas Hubercda17c62010-06-07 13:05:37 -07001868////////////////////////////////////////////////////////////////////////////////
1869
Andreas Huberc4c17d42011-08-30 16:06:28 -07001870ATSParser::ATSParser(uint32_t flags)
Andreas Huber87f2a552012-08-31 13:55:24 -07001871 : mFlags(flags),
Chih-Hung Hsieh3794b242018-12-11 13:55:06 -08001872 mAbsoluteTimeAnchorUs(-1LL),
Andreas Huberd5e56232013-03-12 11:01:43 -07001873 mTimeOffsetValid(false),
Chih-Hung Hsieh3794b242018-12-11 13:55:06 -08001874 mTimeOffsetUs(0LL),
1875 mLastRecoveredPTS(-1LL),
Andreas Huber87f2a552012-08-31 13:55:24 -07001876 mNumTSPacketsParsed(0),
1877 mNumPCRs(0) {
Andreas Huber8dfa2282012-05-15 12:37:29 -07001878 mPSISections.add(0 /* PID */, new PSISection);
Chong Zhang3b2847f2017-01-18 17:43:03 -08001879 mCasManager = new CasManager();
Andreas Hubercda17c62010-06-07 13:05:37 -07001880}
1881
1882ATSParser::~ATSParser() {
1883}
1884
Wonsik Kim54000662015-04-13 10:59:06 +09001885status_t ATSParser::feedTSPacket(const void *data, size_t size,
1886 SyncEvent *event) {
Jinsuk Kime314c672015-04-22 11:08:28 +09001887 if (size != kTSPacketSize) {
1888 ALOGE("Wrong TS packet size");
1889 return BAD_VALUE;
1890 }
Andreas Hubercda17c62010-06-07 13:05:37 -07001891
1892 ABitReader br((const uint8_t *)data, kTSPacketSize);
Wonsik Kim54000662015-04-13 10:59:06 +09001893 return parseTS(&br, event);
Andreas Hubercda17c62010-06-07 13:05:37 -07001894}
1895
Chong Zhang3b2847f2017-01-18 17:43:03 -08001896status_t ATSParser::setMediaCas(const sp<ICas> &cas) {
1897 status_t err = mCasManager->setMediaCas(cas);
1898 if (err != OK) {
1899 return err;
1900 }
1901 for (size_t i = 0; i < mPrograms.size(); ++i) {
1902 mPrograms.editItemAt(i)->updateCasSessions();
1903 }
1904 return OK;
1905}
1906
Andreas Huber32f3cef2011-03-02 15:34:46 -08001907void ATSParser::signalDiscontinuity(
1908 DiscontinuityType type, const sp<AMessage> &extra) {
Andreas Huberb7c8e912012-11-27 15:02:53 -08001909 int64_t mediaTimeUs;
Chong Zhangd47dfcb2015-03-27 15:53:45 -07001910 if ((type & DISCONTINUITY_TIME) && extra != NULL) {
Dongwon Kang15d02f82017-12-14 16:32:18 -08001911 if (extra->findInt64(kATSParserKeyMediaTimeUs, &mediaTimeUs)) {
Chong Zhangd47dfcb2015-03-27 15:53:45 -07001912 mAbsoluteTimeAnchorUs = mediaTimeUs;
1913 }
1914 if ((mFlags & TS_TIMESTAMPS_ARE_ABSOLUTE)
1915 && extra->findInt64(
Dongwon Kang15d02f82017-12-14 16:32:18 -08001916 kATSParserKeyRecentMediaTimeUs, &mediaTimeUs)) {
Chih-Hung Hsieh3794b242018-12-11 13:55:06 -08001917 if (mAbsoluteTimeAnchorUs >= 0LL) {
Chong Zhangd47dfcb2015-03-27 15:53:45 -07001918 mediaTimeUs -= mAbsoluteTimeAnchorUs;
1919 }
1920 if (mTimeOffsetValid) {
1921 mediaTimeUs -= mTimeOffsetUs;
1922 }
1923 mLastRecoveredPTS = (mediaTimeUs * 9) / 100;
1924 }
Andreas Huberb7c8e912012-11-27 15:02:53 -08001925 } else if (type == DISCONTINUITY_ABSOLUTE_TIME) {
Andreas Huber87f2a552012-08-31 13:55:24 -07001926 int64_t timeUs;
Jinsuk Kime314c672015-04-22 11:08:28 +09001927 if (!extra->findInt64("timeUs", &timeUs)) {
1928 ALOGE("timeUs not found");
1929 return;
1930 }
Andreas Huber87f2a552012-08-31 13:55:24 -07001931
Jinsuk Kime314c672015-04-22 11:08:28 +09001932 if (!mPrograms.empty()) {
1933 ALOGE("mPrograms is not empty");
1934 return;
1935 }
Andreas Huber87f2a552012-08-31 13:55:24 -07001936 mAbsoluteTimeAnchorUs = timeUs;
1937 return;
Andreas Huberd5e56232013-03-12 11:01:43 -07001938 } else if (type == DISCONTINUITY_TIME_OFFSET) {
1939 int64_t offset;
Jinsuk Kime314c672015-04-22 11:08:28 +09001940 if (!extra->findInt64("offset", &offset)) {
1941 ALOGE("offset not found");
1942 return;
1943 }
Andreas Huberd5e56232013-03-12 11:01:43 -07001944
1945 mTimeOffsetValid = true;
1946 mTimeOffsetUs = offset;
1947 return;
Andreas Huber87f2a552012-08-31 13:55:24 -07001948 }
1949
Andreas Huber2a4d22d2010-09-08 14:32:20 -07001950 for (size_t i = 0; i < mPrograms.size(); ++i) {
Andreas Huber32f3cef2011-03-02 15:34:46 -08001951 mPrograms.editItemAt(i)->signalDiscontinuity(type, extra);
Andreas Huberf9334412010-12-15 15:17:42 -08001952 }
1953}
1954
1955void ATSParser::signalEOS(status_t finalResult) {
Jinsuk Kime314c672015-04-22 11:08:28 +09001956 if (finalResult == (status_t) OK) {
1957 ALOGE("finalResult not OK");
1958 return;
1959 }
Andreas Huberf9334412010-12-15 15:17:42 -08001960
1961 for (size_t i = 0; i < mPrograms.size(); ++i) {
1962 mPrograms.editItemAt(i)->signalEOS(finalResult);
Andreas Huber2a4d22d2010-09-08 14:32:20 -07001963 }
1964}
1965
Andreas Hubercda17c62010-06-07 13:05:37 -07001966void ATSParser::parseProgramAssociationTable(ABitReader *br) {
1967 unsigned table_id = br->getBits(8);
Steve Block3856b092011-10-20 11:56:00 +01001968 ALOGV(" table_id = %u", table_id);
David Yeh6456ae72014-09-03 11:14:48 +08001969 if (table_id != 0x00u) {
1970 ALOGE("PAT data error!");
1971 return ;
1972 }
Andreas Hubercda17c62010-06-07 13:05:37 -07001973 unsigned section_syntax_indictor = br->getBits(1);
Steve Block3856b092011-10-20 11:56:00 +01001974 ALOGV(" section_syntax_indictor = %u", section_syntax_indictor);
Andreas Hubercda17c62010-06-07 13:05:37 -07001975
Jinsuk Kime314c672015-04-22 11:08:28 +09001976 br->skipBits(1); // '0'
Andreas Huber6e4c5c42010-09-21 13:13:15 -07001977 MY_LOGV(" reserved = %u", br->getBits(2));
Andreas Hubercda17c62010-06-07 13:05:37 -07001978
1979 unsigned section_length = br->getBits(12);
Steve Block3856b092011-10-20 11:56:00 +01001980 ALOGV(" section_length = %u", section_length);
Andreas Hubercda17c62010-06-07 13:05:37 -07001981
Andreas Huber6e4c5c42010-09-21 13:13:15 -07001982 MY_LOGV(" transport_stream_id = %u", br->getBits(16));
1983 MY_LOGV(" reserved = %u", br->getBits(2));
1984 MY_LOGV(" version_number = %u", br->getBits(5));
1985 MY_LOGV(" current_next_indicator = %u", br->getBits(1));
1986 MY_LOGV(" section_number = %u", br->getBits(8));
1987 MY_LOGV(" last_section_number = %u", br->getBits(8));
Andreas Hubercda17c62010-06-07 13:05:37 -07001988
1989 size_t numProgramBytes = (section_length - 5 /* header */ - 4 /* crc */);
Andreas Hubercda17c62010-06-07 13:05:37 -07001990
1991 for (size_t i = 0; i < numProgramBytes / 4; ++i) {
1992 unsigned program_number = br->getBits(16);
Steve Block3856b092011-10-20 11:56:00 +01001993 ALOGV(" program_number = %u", program_number);
Andreas Hubercda17c62010-06-07 13:05:37 -07001994
Andreas Huber6e4c5c42010-09-21 13:13:15 -07001995 MY_LOGV(" reserved = %u", br->getBits(3));
Andreas Hubercda17c62010-06-07 13:05:37 -07001996
1997 if (program_number == 0) {
Andreas Huber6e4c5c42010-09-21 13:13:15 -07001998 MY_LOGV(" network_PID = 0x%04x", br->getBits(13));
Andreas Hubercda17c62010-06-07 13:05:37 -07001999 } else {
2000 unsigned programMapPID = br->getBits(13);
2001
Steve Block3856b092011-10-20 11:56:00 +01002002 ALOGV(" program_map_PID = 0x%04x", programMapPID);
Andreas Hubercda17c62010-06-07 13:05:37 -07002003
Andreas Huber386d6092011-05-19 08:37:39 -07002004 bool found = false;
2005 for (size_t index = 0; index < mPrograms.size(); ++index) {
2006 const sp<Program> &program = mPrograms.itemAt(index);
2007
2008 if (program->number() == program_number) {
2009 program->updateProgramMapPID(programMapPID);
2010 found = true;
2011 break;
2012 }
2013 }
2014
2015 if (!found) {
2016 mPrograms.push(
Chong Zhangd47dfcb2015-03-27 15:53:45 -07002017 new Program(this, program_number, programMapPID, mLastRecoveredPTS));
Hassan Shojania3a37f3e2017-04-19 14:29:42 -07002018 if (mSampleAesKeyItem != NULL) {
2019 mPrograms.top()->signalNewSampleAesKey(mSampleAesKeyItem);
2020 }
Andreas Huber386d6092011-05-19 08:37:39 -07002021 }
Andreas Huber8dfa2282012-05-15 12:37:29 -07002022
2023 if (mPSISections.indexOfKey(programMapPID) < 0) {
2024 mPSISections.add(programMapPID, new PSISection);
2025 }
Andreas Hubercda17c62010-06-07 13:05:37 -07002026 }
2027 }
2028
Andreas Huber6e4c5c42010-09-21 13:13:15 -07002029 MY_LOGV(" CRC = 0x%08x", br->getBits(32));
Andreas Hubercda17c62010-06-07 13:05:37 -07002030}
2031
Andreas Huber06528d72011-08-31 16:29:05 -07002032status_t ATSParser::parsePID(
Andreas Hubercda17c62010-06-07 13:05:37 -07002033 ABitReader *br, unsigned PID,
Andreas Huber87f2a552012-08-31 13:55:24 -07002034 unsigned continuity_counter,
Wonsik Kim54000662015-04-13 10:59:06 +09002035 unsigned payload_unit_start_indicator,
Chong Zhang3b2847f2017-01-18 17:43:03 -08002036 unsigned transport_scrambling_control,
2037 unsigned random_access_indicator,
Wonsik Kim54000662015-04-13 10:59:06 +09002038 SyncEvent *event) {
Andreas Huber8dfa2282012-05-15 12:37:29 -07002039 ssize_t sectionIndex = mPSISections.indexOfKey(PID);
2040
2041 if (sectionIndex >= 0) {
Andreas Huber4b4bb112013-04-29 13:17:50 -07002042 sp<PSISection> section = mPSISections.valueAt(sectionIndex);
Andreas Huber8dfa2282012-05-15 12:37:29 -07002043
Andreas Hubercda17c62010-06-07 13:05:37 -07002044 if (payload_unit_start_indicator) {
David Yeh6456ae72014-09-03 11:14:48 +08002045 if (!section->isEmpty()) {
Chong Zhang9bcf3ae2015-03-08 15:59:01 -07002046 ALOGW("parsePID encounters payload_unit_start_indicator when section is not empty");
2047 section->clear();
David Yeh6456ae72014-09-03 11:14:48 +08002048 }
Andreas Huber8dfa2282012-05-15 12:37:29 -07002049
Andreas Hubercda17c62010-06-07 13:05:37 -07002050 unsigned skip = br->getBits(8);
Jinsuk Kim9ca7b9c2015-03-20 09:23:18 +09002051 section->setSkipBytes(skip + 1); // skip filler bytes + pointer field itself
Andreas Hubercda17c62010-06-07 13:05:37 -07002052 br->skipBits(skip * 8);
2053 }
Andreas Huber8dfa2282012-05-15 12:37:29 -07002054
Jinsuk Kime314c672015-04-22 11:08:28 +09002055 if (br->numBitsLeft() % 8 != 0) {
2056 return ERROR_MALFORMED;
2057 }
Andreas Huber8dfa2282012-05-15 12:37:29 -07002058 status_t err = section->append(br->data(), br->numBitsLeft() / 8);
2059
2060 if (err != OK) {
2061 return err;
2062 }
2063
2064 if (!section->isComplete()) {
2065 return OK;
2066 }
2067
Jinsuk Kim9ca7b9c2015-03-20 09:23:18 +09002068 if (!section->isCRCOkay()) {
2069 return BAD_VALUE;
2070 }
Andreas Huber8dfa2282012-05-15 12:37:29 -07002071 ABitReader sectionBits(section->data(), section->size());
2072
2073 if (PID == 0) {
2074 parseProgramAssociationTable(&sectionBits);
2075 } else {
2076 bool handled = false;
2077 for (size_t i = 0; i < mPrograms.size(); ++i) {
2078 status_t err;
2079 if (!mPrograms.editItemAt(i)->parsePSISection(
2080 PID, &sectionBits, &err)) {
2081 continue;
2082 }
2083
2084 if (err != OK) {
2085 return err;
2086 }
2087
2088 handled = true;
2089 break;
2090 }
2091
2092 if (!handled) {
2093 mPSISections.removeItem(PID);
Andreas Huber4b4bb112013-04-29 13:17:50 -07002094 section.clear();
Andreas Huber8dfa2282012-05-15 12:37:29 -07002095 }
2096 }
2097
Andreas Huber4b4bb112013-04-29 13:17:50 -07002098 if (section != NULL) {
2099 section->clear();
2100 }
Andreas Huber8dfa2282012-05-15 12:37:29 -07002101
Andreas Huber06528d72011-08-31 16:29:05 -07002102 return OK;
Andreas Hubercda17c62010-06-07 13:05:37 -07002103 }
2104
2105 bool handled = false;
2106 for (size_t i = 0; i < mPrograms.size(); ++i) {
Andreas Huber06528d72011-08-31 16:29:05 -07002107 status_t err;
Andreas Hubercda17c62010-06-07 13:05:37 -07002108 if (mPrograms.editItemAt(i)->parsePID(
Chong Zhang3b2847f2017-01-18 17:43:03 -08002109 PID, continuity_counter,
2110 payload_unit_start_indicator,
2111 transport_scrambling_control,
2112 random_access_indicator,
Wonsik Kim54000662015-04-13 10:59:06 +09002113 br, &err, event)) {
Andreas Huber06528d72011-08-31 16:29:05 -07002114 if (err != OK) {
2115 return err;
2116 }
2117
Andreas Hubercda17c62010-06-07 13:05:37 -07002118 handled = true;
2119 break;
2120 }
2121 }
2122
2123 if (!handled) {
Chong Zhang3b2847f2017-01-18 17:43:03 -08002124 handled = mCasManager->parsePID(br, PID);
2125 }
2126
2127 if (!handled) {
Steve Block3856b092011-10-20 11:56:00 +01002128 ALOGV("PID 0x%04x not handled.", PID);
Andreas Hubercda17c62010-06-07 13:05:37 -07002129 }
Andreas Huber06528d72011-08-31 16:29:05 -07002130
2131 return OK;
Andreas Hubercda17c62010-06-07 13:05:37 -07002132}
2133
Chong Zhang3b2847f2017-01-18 17:43:03 -08002134status_t ATSParser::parseAdaptationField(
2135 ABitReader *br, unsigned PID, unsigned *random_access_indicator) {
2136 *random_access_indicator = 0;
Andreas Hubercda17c62010-06-07 13:05:37 -07002137 unsigned adaptation_field_length = br->getBits(8);
Andreas Huber87f2a552012-08-31 13:55:24 -07002138
Andreas Hubercda17c62010-06-07 13:05:37 -07002139 if (adaptation_field_length > 0) {
Jaesung Chung8a1fa1e2015-05-15 14:19:14 +09002140 if (adaptation_field_length * 8 > br->numBitsLeft()) {
2141 ALOGV("Adaptation field should be included in a single TS packet.");
2142 return ERROR_MALFORMED;
2143 }
2144
Andreas Huber87f2a552012-08-31 13:55:24 -07002145 unsigned discontinuity_indicator = br->getBits(1);
2146
2147 if (discontinuity_indicator) {
2148 ALOGV("PID 0x%04x: discontinuity_indicator = 1 (!!!)", PID);
2149 }
2150
Chong Zhang3b2847f2017-01-18 17:43:03 -08002151 *random_access_indicator = br->getBits(1);
2152 if (*random_access_indicator) {
2153 ALOGV("PID 0x%04x: random_access_indicator = 1", PID);
2154 }
2155
2156 unsigned elementary_stream_priority_indicator = br->getBits(1);
2157 if (elementary_stream_priority_indicator) {
2158 ALOGV("PID 0x%04x: elementary_stream_priority_indicator = 1", PID);
2159 }
2160
Andreas Huber87f2a552012-08-31 13:55:24 -07002161 unsigned PCR_flag = br->getBits(1);
2162
2163 size_t numBitsRead = 4;
2164
2165 if (PCR_flag) {
Jinsuk Kime314c672015-04-22 11:08:28 +09002166 if (adaptation_field_length * 8 < 52) {
2167 return ERROR_MALFORMED;
2168 }
Andreas Huber87f2a552012-08-31 13:55:24 -07002169 br->skipBits(4);
2170 uint64_t PCR_base = br->getBits(32);
2171 PCR_base = (PCR_base << 1) | br->getBits(1);
2172
2173 br->skipBits(6);
2174 unsigned PCR_ext = br->getBits(9);
2175
2176 // The number of bytes from the start of the current
2177 // MPEG2 transport stream packet up and including
2178 // the final byte of this PCR_ext field.
2179 size_t byteOffsetFromStartOfTSPacket =
2180 (188 - br->numBitsLeft() / 8);
2181
2182 uint64_t PCR = PCR_base * 300 + PCR_ext;
2183
Colin Crossb4a7a2d2014-03-19 16:59:00 -07002184 ALOGV("PID 0x%04x: PCR = 0x%016" PRIx64 " (%.2f)",
Andreas Huber87f2a552012-08-31 13:55:24 -07002185 PID, PCR, PCR / 27E6);
2186
2187 // The number of bytes received by this parser up to and
2188 // including the final byte of this PCR_ext field.
Marco Nelissen19cec892016-04-20 15:56:53 -07002189 uint64_t byteOffsetFromStart =
2190 uint64_t(mNumTSPacketsParsed) * 188 + byteOffsetFromStartOfTSPacket;
Andreas Huber87f2a552012-08-31 13:55:24 -07002191
2192 for (size_t i = 0; i < mPrograms.size(); ++i) {
2193 updatePCR(PID, PCR, byteOffsetFromStart);
2194 }
2195
2196 numBitsRead += 52;
2197 }
2198
Andreas Huber87f2a552012-08-31 13:55:24 -07002199 br->skipBits(adaptation_field_length * 8 - numBitsRead);
Andreas Hubercda17c62010-06-07 13:05:37 -07002200 }
Jinsuk Kime314c672015-04-22 11:08:28 +09002201 return OK;
Andreas Hubercda17c62010-06-07 13:05:37 -07002202}
2203
Wonsik Kim54000662015-04-13 10:59:06 +09002204status_t ATSParser::parseTS(ABitReader *br, SyncEvent *event) {
Steve Block3856b092011-10-20 11:56:00 +01002205 ALOGV("---");
Andreas Hubercda17c62010-06-07 13:05:37 -07002206
2207 unsigned sync_byte = br->getBits(8);
David Yeh6456ae72014-09-03 11:14:48 +08002208 if (sync_byte != 0x47u) {
2209 ALOGE("[error] parseTS: return error as sync_byte=0x%x", sync_byte);
2210 return BAD_VALUE;
2211 }
Andreas Hubercda17c62010-06-07 13:05:37 -07002212
Andreas Huber52668ca2013-11-11 13:35:39 -08002213 if (br->getBits(1)) { // transport_error_indicator
2214 // silently ignore.
2215 return OK;
2216 }
Andreas Hubercda17c62010-06-07 13:05:37 -07002217
2218 unsigned payload_unit_start_indicator = br->getBits(1);
Steve Block3856b092011-10-20 11:56:00 +01002219 ALOGV("payload_unit_start_indicator = %u", payload_unit_start_indicator);
Andreas Hubercda17c62010-06-07 13:05:37 -07002220
Andreas Huber6e4c5c42010-09-21 13:13:15 -07002221 MY_LOGV("transport_priority = %u", br->getBits(1));
Andreas Hubercda17c62010-06-07 13:05:37 -07002222
2223 unsigned PID = br->getBits(13);
Steve Block3856b092011-10-20 11:56:00 +01002224 ALOGV("PID = 0x%04x", PID);
Andreas Hubercda17c62010-06-07 13:05:37 -07002225
Chong Zhang3b2847f2017-01-18 17:43:03 -08002226 unsigned transport_scrambling_control = br->getBits(2);
2227 ALOGV("transport_scrambling_control = %u", transport_scrambling_control);
Andreas Hubercda17c62010-06-07 13:05:37 -07002228
2229 unsigned adaptation_field_control = br->getBits(2);
Steve Block3856b092011-10-20 11:56:00 +01002230 ALOGV("adaptation_field_control = %u", adaptation_field_control);
Andreas Hubercda17c62010-06-07 13:05:37 -07002231
Andreas Huber0da4dab2010-09-27 12:04:43 -07002232 unsigned continuity_counter = br->getBits(4);
Andreas Huber87f2a552012-08-31 13:55:24 -07002233 ALOGV("PID = 0x%04x, continuity_counter = %u", PID, continuity_counter);
Andreas Huber0da4dab2010-09-27 12:04:43 -07002234
Steve Blockdf64d152012-01-04 20:05:49 +00002235 // ALOGI("PID = 0x%04x, continuity_counter = %u", PID, continuity_counter);
Andreas Hubercda17c62010-06-07 13:05:37 -07002236
Andreas Huber87f2a552012-08-31 13:55:24 -07002237 status_t err = OK;
2238
Chong Zhang3b2847f2017-01-18 17:43:03 -08002239 unsigned random_access_indicator = 0;
Jinsuk Kime314c672015-04-22 11:08:28 +09002240 if (adaptation_field_control == 2 || adaptation_field_control == 3) {
Chong Zhang3b2847f2017-01-18 17:43:03 -08002241 err = parseAdaptationField(br, PID, &random_access_indicator);
Jinsuk Kime314c672015-04-22 11:08:28 +09002242 }
2243 if (err == OK) {
2244 if (adaptation_field_control == 1 || adaptation_field_control == 3) {
Wonsik Kim54000662015-04-13 10:59:06 +09002245 err = parsePID(br, PID, continuity_counter,
Chong Zhang3b2847f2017-01-18 17:43:03 -08002246 payload_unit_start_indicator,
2247 transport_scrambling_control,
2248 random_access_indicator,
2249 event);
Jinsuk Kime314c672015-04-22 11:08:28 +09002250 }
Andreas Hubercda17c62010-06-07 13:05:37 -07002251 }
Andreas Huber06528d72011-08-31 16:29:05 -07002252
Andreas Huber87f2a552012-08-31 13:55:24 -07002253 ++mNumTSPacketsParsed;
2254
2255 return err;
Andreas Hubercda17c62010-06-07 13:05:37 -07002256}
2257
Marco Nelissen45d54c62018-01-26 10:04:22 -08002258sp<AnotherPacketSource> ATSParser::getSource(SourceType type) {
2259 sp<AnotherPacketSource> firstSourceFound;
Andreas Hubercda17c62010-06-07 13:05:37 -07002260 for (size_t i = 0; i < mPrograms.size(); ++i) {
Andreas Huber386d6092011-05-19 08:37:39 -07002261 const sp<Program> &program = mPrograms.editItemAt(i);
Marco Nelissen45d54c62018-01-26 10:04:22 -08002262 sp<AnotherPacketSource> source = program->getSource(type);
Robert Shih9ff1e722015-10-20 16:29:58 -07002263 if (source == NULL) {
Andreas Huber386d6092011-05-19 08:37:39 -07002264 continue;
2265 }
Robert Shih9ff1e722015-10-20 16:29:58 -07002266 if (firstSourceFound == NULL) {
2267 firstSourceFound = source;
2268 }
2269 // Prefer programs with both audio/video
2270 switch (type) {
2271 case VIDEO: {
2272 if (program->hasSource(AUDIO)) {
2273 return source;
2274 }
2275 break;
2276 }
Andreas Huber386d6092011-05-19 08:37:39 -07002277
Robert Shih9ff1e722015-10-20 16:29:58 -07002278 case AUDIO: {
2279 if (program->hasSource(VIDEO)) {
2280 return source;
2281 }
2282 break;
2283 }
Andreas Hubercda17c62010-06-07 13:05:37 -07002284
Robert Shih9ff1e722015-10-20 16:29:58 -07002285 default:
2286 return source;
Andreas Hubercda17c62010-06-07 13:05:37 -07002287 }
2288 }
2289
Robert Shih9ff1e722015-10-20 16:29:58 -07002290 return firstSourceFound;
Andreas Hubercda17c62010-06-07 13:05:37 -07002291}
2292
Robert Shihbf207272014-10-30 17:22:11 -07002293bool ATSParser::hasSource(SourceType type) const {
2294 for (size_t i = 0; i < mPrograms.size(); ++i) {
2295 const sp<Program> &program = mPrograms.itemAt(i);
2296 if (program->hasSource(type)) {
2297 return true;
2298 }
2299 }
2300
2301 return false;
2302}
2303
Andreas Huber43c3e6c2011-01-05 12:17:08 -08002304bool ATSParser::PTSTimeDeltaEstablished() {
2305 if (mPrograms.isEmpty()) {
2306 return false;
2307 }
2308
2309 return mPrograms.editItemAt(0)->PTSTimeDeltaEstablished();
2310}
2311
Robert Shih82e14702016-11-17 11:24:29 -08002312int64_t ATSParser::getFirstPTSTimeUs() {
2313 for (size_t i = 0; i < mPrograms.size(); ++i) {
2314 sp<ATSParser::Program> program = mPrograms.itemAt(i);
2315 if (program->PTSTimeDeltaEstablished()) {
2316 return (program->firstPTS() * 100) / 9;
2317 }
2318 }
2319 return -1;
2320}
2321
Chad Brubakerc9fa35c2015-08-18 16:52:40 -07002322__attribute__((no_sanitize("integer")))
Andreas Huber87f2a552012-08-31 13:55:24 -07002323void ATSParser::updatePCR(
Marco Nelissen19cec892016-04-20 15:56:53 -07002324 unsigned /* PID */, uint64_t PCR, uint64_t byteOffsetFromStart) {
2325 ALOGV("PCR 0x%016" PRIx64 " @ %" PRIx64, PCR, byteOffsetFromStart);
Andreas Huber87f2a552012-08-31 13:55:24 -07002326
2327 if (mNumPCRs == 2) {
2328 mPCR[0] = mPCR[1];
2329 mPCRBytes[0] = mPCRBytes[1];
2330 mSystemTimeUs[0] = mSystemTimeUs[1];
2331 mNumPCRs = 1;
2332 }
2333
2334 mPCR[mNumPCRs] = PCR;
2335 mPCRBytes[mNumPCRs] = byteOffsetFromStart;
2336 mSystemTimeUs[mNumPCRs] = ALooper::GetNowUs();
2337
2338 ++mNumPCRs;
2339
2340 if (mNumPCRs == 2) {
Chad Brubakerc9fa35c2015-08-18 16:52:40 -07002341 /* Unsigned overflow here */
Andreas Huber87f2a552012-08-31 13:55:24 -07002342 double transportRate =
2343 (mPCRBytes[1] - mPCRBytes[0]) * 27E6 / (mPCR[1] - mPCR[0]);
2344
2345 ALOGV("transportRate = %.2f bytes/sec", transportRate);
2346 }
2347}
2348
Andreas Huber8dfa2282012-05-15 12:37:29 -07002349////////////////////////////////////////////////////////////////////////////////
2350
Jinsuk Kim9ca7b9c2015-03-20 09:23:18 +09002351
2352// CRC32 used for PSI section. The table was generated by following command:
2353// $ python pycrc.py --model crc-32-mpeg --algorithm table-driven --generate c
2354// Visit http://www.tty1.net/pycrc/index_en.html for more details.
2355uint32_t ATSParser::PSISection::CRC_TABLE[] = {
2356 0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9,
2357 0x130476dc, 0x17c56b6b, 0x1a864db2, 0x1e475005,
2358 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61,
2359 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd,
2360 0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9,
2361 0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75,
2362 0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011,
2363 0x791d4014, 0x7ddc5da3, 0x709f7b7a, 0x745e66cd,
2364 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039,
2365 0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5,
2366 0xbe2b5b58, 0xbaea46ef, 0xb7a96036, 0xb3687d81,
2367 0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d,
2368 0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49,
2369 0xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95,
2370 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1,
2371 0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d,
2372 0x34867077, 0x30476dc0, 0x3d044b19, 0x39c556ae,
2373 0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072,
2374 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16,
2375 0x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca,
2376 0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde,
2377 0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02,
2378 0x5e9f46bf, 0x5a5e5b08, 0x571d7dd1, 0x53dc6066,
2379 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,
2380 0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e,
2381 0xbfa1b04b, 0xbb60adfc, 0xb6238b25, 0xb2e29692,
2382 0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6,
2383 0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a,
2384 0xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e,
2385 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2,
2386 0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686,
2387 0xd5b88683, 0xd1799b34, 0xdc3abded, 0xd8fba05a,
2388 0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637,
2389 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb,
2390 0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f,
2391 0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53,
2392 0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47,
2393 0x36194d42, 0x32d850f5, 0x3f9b762c, 0x3b5a6b9b,
2394 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff,
2395 0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623,
2396 0xf12f560e, 0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7,
2397 0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b,
2398 0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f,
2399 0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3,
2400 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7,
2401 0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b,
2402 0x9b3660c6, 0x9ff77d71, 0x92b45ba8, 0x9675461f,
2403 0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3,
2404 0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640,
2405 0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c,
2406 0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8,
2407 0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24,
2408 0x119b4be9, 0x155a565e, 0x18197087, 0x1cd86d30,
2409 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec,
2410 0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088,
2411 0x2497d08d, 0x2056cd3a, 0x2d15ebe3, 0x29d4f654,
2412 0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0,
2413 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c,
2414 0xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18,
2415 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4,
2416 0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0,
2417 0x9abc8bd5, 0x9e7d9662, 0x933eb0bb, 0x97ffad0c,
2418 0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668,
2419 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4
2420 };
2421
2422ATSParser::PSISection::PSISection() :
2423 mSkipBytes(0) {
Andreas Huber8dfa2282012-05-15 12:37:29 -07002424}
2425
2426ATSParser::PSISection::~PSISection() {
2427}
2428
2429status_t ATSParser::PSISection::append(const void *data, size_t size) {
2430 if (mBuffer == NULL || mBuffer->size() + size > mBuffer->capacity()) {
2431 size_t newCapacity =
2432 (mBuffer == NULL) ? size : mBuffer->capacity() + size;
2433
2434 newCapacity = (newCapacity + 1023) & ~1023;
2435
2436 sp<ABuffer> newBuffer = new ABuffer(newCapacity);
2437
2438 if (mBuffer != NULL) {
2439 memcpy(newBuffer->data(), mBuffer->data(), mBuffer->size());
2440 newBuffer->setRange(0, mBuffer->size());
2441 } else {
2442 newBuffer->setRange(0, 0);
2443 }
2444
2445 mBuffer = newBuffer;
2446 }
2447
2448 memcpy(mBuffer->data() + mBuffer->size(), data, size);
2449 mBuffer->setRange(0, mBuffer->size() + size);
2450
2451 return OK;
2452}
2453
Jinsuk Kim9ca7b9c2015-03-20 09:23:18 +09002454void ATSParser::PSISection::setSkipBytes(uint8_t skip) {
2455 mSkipBytes = skip;
2456}
2457
Andreas Huber8dfa2282012-05-15 12:37:29 -07002458void ATSParser::PSISection::clear() {
2459 if (mBuffer != NULL) {
2460 mBuffer->setRange(0, 0);
2461 }
Jinsuk Kim9ca7b9c2015-03-20 09:23:18 +09002462 mSkipBytes = 0;
Andreas Huber8dfa2282012-05-15 12:37:29 -07002463}
2464
2465bool ATSParser::PSISection::isComplete() const {
2466 if (mBuffer == NULL || mBuffer->size() < 3) {
2467 return false;
2468 }
2469
2470 unsigned sectionLength = U16_AT(mBuffer->data() + 1) & 0xfff;
2471 return mBuffer->size() >= sectionLength + 3;
2472}
2473
2474bool ATSParser::PSISection::isEmpty() const {
2475 return mBuffer == NULL || mBuffer->size() == 0;
2476}
2477
2478const uint8_t *ATSParser::PSISection::data() const {
2479 return mBuffer == NULL ? NULL : mBuffer->data();
2480}
2481
2482size_t ATSParser::PSISection::size() const {
2483 return mBuffer == NULL ? 0 : mBuffer->size();
2484}
2485
Jinsuk Kim9ca7b9c2015-03-20 09:23:18 +09002486bool ATSParser::PSISection::isCRCOkay() const {
2487 if (!isComplete()) {
2488 return false;
2489 }
2490 uint8_t* data = mBuffer->data();
2491
2492 // Return true if section_syntax_indicator says no section follows the field section_length.
2493 if ((data[1] & 0x80) == 0) {
2494 return true;
2495 }
2496
2497 unsigned sectionLength = U16_AT(data + 1) & 0xfff;
2498 ALOGV("sectionLength %u, skip %u", sectionLength, mSkipBytes);
2499
Marco Nelissenc0c9f502016-04-28 13:32:41 -07002500
2501 if(sectionLength < mSkipBytes) {
2502 ALOGE("b/28333006");
2503 android_errorWriteLog(0x534e4554, "28333006");
2504 return false;
2505 }
2506
Jinsuk Kim9ca7b9c2015-03-20 09:23:18 +09002507 // Skip the preceding field present when payload start indicator is on.
2508 sectionLength -= mSkipBytes;
2509
2510 uint32_t crc = 0xffffffff;
2511 for(unsigned i = 0; i < sectionLength + 4 /* crc */; i++) {
2512 uint8_t b = data[i];
2513 int index = ((crc >> 24) ^ (b & 0xff)) & 0xff;
2514 crc = CRC_TABLE[index] ^ (crc << 8);
2515 }
2516 ALOGV("crc: %08x\n", crc);
2517 return (crc == 0);
2518}
Hassan Shojania3a37f3e2017-04-19 14:29:42 -07002519
2520// SAMPLE_AES key handling
2521// TODO: Merge these to their respective class after Widevine-HLS
2522void ATSParser::signalNewSampleAesKey(const sp<AMessage> &keyItem) {
2523 ALOGD("signalNewSampleAesKey: %p", keyItem.get());
2524
2525 mSampleAesKeyItem = keyItem;
2526
2527 // a NULL key item will propagate to existing ElementaryStreamQueues
2528 for (size_t i = 0; i < mPrograms.size(); ++i) {
2529 mPrograms[i]->signalNewSampleAesKey(keyItem);
2530 }
2531}
2532
2533void ATSParser::Program::signalNewSampleAesKey(const sp<AMessage> &keyItem) {
2534 ALOGD("Program::signalNewSampleAesKey: %p", keyItem.get());
2535
2536 mSampleAesKeyItem = keyItem;
2537
2538 // a NULL key item will propagate to existing ElementaryStreamQueues
2539 for (size_t i = 0; i < mStreams.size(); ++i) {
2540 mStreams[i]->signalNewSampleAesKey(keyItem);
2541 }
2542}
2543
2544void ATSParser::Stream::signalNewSampleAesKey(const sp<AMessage> &keyItem) {
2545 ALOGD("Stream::signalNewSampleAesKey: 0x%04x size = %zu keyItem: %p",
2546 mElementaryPID, mBuffer->size(), keyItem.get());
2547
2548 // a NULL key item will propagate to existing ElementaryStreamQueues
2549 mSampleAesKeyItem = keyItem;
2550
2551 flush(NULL);
2552 mQueue->signalNewSampleAesKey(keyItem);
2553}
2554
Andreas Hubercda17c62010-06-07 13:05:37 -07002555} // namespace android