ATSParser.cpp revision 9ca7b9c74e882526ee5810ff62f203bf75cd3f1a
1cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber/* 2cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * Copyright (C) 2010 The Android Open Source Project 3cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * 4cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 5cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * you may not use this file except in compliance with the License. 6cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * You may obtain a copy of the License at 7cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * 8cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 9cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * 10cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * Unless required by applicable law or agreed to in writing, software 11cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 12cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * See the License for the specific language governing permissions and 14cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber * limitations under the License. 15cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber */ 16cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 176e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber//#define LOG_NDEBUG 0 186e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber#define LOG_TAG "ATSParser" 196e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber#include <utils/Log.h> 206e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber 21cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include "ATSParser.h" 22cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 23cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include "AnotherPacketSource.h" 246a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber#include "ESQueue.h" 2585f12e9b9062402d6110df3f7099707912040edbAndreas Huber#include "include/avc_utils.h" 26cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 2785f12e9b9062402d6110df3f7099707912040edbAndreas Huber#include <media/stagefright/foundation/ABitReader.h> 28cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/foundation/ABuffer.h> 29cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/foundation/ADebug.h> 30cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/foundation/AMessage.h> 31cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/foundation/hexdump.h> 32cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/MediaDefs.h> 33cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/MediaErrors.h> 34cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/MetaData.h> 358dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber#include <media/stagefright/Utils.h> 3632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber#include <media/IStreamSource.h> 37cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <utils/KeyedVector.h> 389bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang#include <utils/Vector.h> 39cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 40b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross#include <inttypes.h> 41b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross 42cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubernamespace android { 43cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 446e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber// I want the expression "y" evaluated even if verbose logging is off. 456e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber#define MY_LOGV(x, y) \ 463856b090cd04ba5dd4a59a12430ed724d5995909Steve Block do { unsigned tmp = y; ALOGV(x, tmp); } while (0) 476e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber 48cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberstatic const size_t kTSPacketSize = 188; 49cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 50cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberstruct ATSParser::Program : public RefBase { 51386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber Program(ATSParser *parser, unsigned programNumber, unsigned programMapPID); 52cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 538dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber bool parsePSISection( 548dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber unsigned pid, ABitReader *br, status_t *err); 558dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 56cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber bool parsePID( 5787f2a558dd12043631e12c361abef301bf603140Andreas Huber unsigned pid, unsigned continuity_counter, 5887f2a558dd12043631e12c361abef301bf603140Andreas Huber unsigned payload_unit_start_indicator, 5906528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber ABitReader *br, status_t *err); 60cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 6132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber void signalDiscontinuity( 6232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber DiscontinuityType type, const sp<AMessage> &extra); 6332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 64f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void signalEOS(status_t finalResult); 652a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber 66cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber sp<MediaSource> getSource(SourceType type); 67bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih bool hasSource(SourceType type) const; 68cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 69bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber int64_t convertPTSToTimestamp(uint64_t PTS); 70bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber 7143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber bool PTSTimeDeltaEstablished() const { 7243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber return mFirstPTSValid; 7343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 7443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 75386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber unsigned number() const { return mProgramNumber; } 76386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber 77386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber void updateProgramMapPID(unsigned programMapPID) { 78386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber mProgramMapPID = programMapPID; 79386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber } 80386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber 818dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber unsigned programMapPID() const { 828dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber return mProgramMapPID; 838dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber } 848dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 8587f2a558dd12043631e12c361abef301bf603140Andreas Huber uint32_t parserFlags() const { 8687f2a558dd12043631e12c361abef301bf603140Andreas Huber return mParser->mFlags; 8787f2a558dd12043631e12c361abef301bf603140Andreas Huber } 8887f2a558dd12043631e12c361abef301bf603140Andreas Huber 89cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberprivate: 909bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang struct StreamInfo { 919bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang unsigned mType; 929bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang unsigned mPID; 939bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang }; 949bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang 95f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ATSParser *mParser; 96386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber unsigned mProgramNumber; 97cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned mProgramMapPID; 98cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber KeyedVector<unsigned, sp<Stream> > mStreams; 99bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber bool mFirstPTSValid; 100bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber uint64_t mFirstPTS; 101799c9682b3776a55d234396aee4a302437150c26Chong Zhang int64_t mLastRecoveredPTS; 102cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 10306528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber status_t parseProgramMap(ABitReader *br); 104799c9682b3776a55d234396aee4a302437150c26Chong Zhang int64_t recoverPTS(uint64_t PTS_33bit); 1059bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang bool switchPIDs(const Vector<StreamInfo> &infos); 106cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 107cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(Program); 108cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}; 109cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 110cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberstruct ATSParser::Stream : public RefBase { 11187f2a558dd12043631e12c361abef301bf603140Andreas Huber Stream(Program *program, 11287f2a558dd12043631e12c361abef301bf603140Andreas Huber unsigned elementaryPID, 11387f2a558dd12043631e12c361abef301bf603140Andreas Huber unsigned streamType, 11487f2a558dd12043631e12c361abef301bf603140Andreas Huber unsigned PCR_PID); 115cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 116bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber unsigned type() const { return mStreamType; } 117bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber unsigned pid() const { return mElementaryPID; } 118bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber void setPID(unsigned pid) { mElementaryPID = pid; } 119bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber 1205403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber status_t parse( 12187f2a558dd12043631e12c361abef301bf603140Andreas Huber unsigned continuity_counter, 122cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned payload_unit_start_indicator, 123cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber ABitReader *br); 124cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 12532f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber void signalDiscontinuity( 12632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber DiscontinuityType type, const sp<AMessage> &extra); 12732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 128f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void signalEOS(status_t finalResult); 1292a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber 130cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber sp<MediaSource> getSource(SourceType type); 131cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 132bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih bool isAudio() const; 133bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih bool isVideo() const; 134bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih 135cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberprotected: 136cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber virtual ~Stream(); 137cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 138cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberprivate: 139bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber Program *mProgram; 140cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned mElementaryPID; 141cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned mStreamType; 14287f2a558dd12043631e12c361abef301bf603140Andreas Huber unsigned mPCR_PID; 14387f2a558dd12043631e12c361abef301bf603140Andreas Huber int32_t mExpectedContinuityCounter; 144cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 145cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber sp<ABuffer> mBuffer; 146cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber sp<AnotherPacketSource> mSource; 147cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber bool mPayloadStarted; 148cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 14990a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber uint64_t mPrevPTS; 15090a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber 151386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber ElementaryStreamQueue *mQueue; 1526a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber 1535403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber status_t flush(); 1545403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber status_t parsePES(ABitReader *br); 155cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 156cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber void onPayloadData( 157cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned PTS_DTS_flags, uint64_t PTS, uint64_t DTS, 158cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber const uint8_t *data, size_t size); 159cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 16082f7321b03eec1e40af9d681370f754ee0279582Andreas Huber void extractAACFrames(const sp<ABuffer> &buffer); 16182f7321b03eec1e40af9d681370f754ee0279582Andreas Huber 162cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(Stream); 163cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}; 164cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1658dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberstruct ATSParser::PSISection : public RefBase { 1668dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber PSISection(); 1678dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 1688dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber status_t append(const void *data, size_t size); 1699ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim void setSkipBytes(uint8_t skip); 1708dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber void clear(); 1718dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 1728dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber bool isComplete() const; 1738dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber bool isEmpty() const; 1749ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim bool isCRCOkay() const; 1758dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 1768dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber const uint8_t *data() const; 1778dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber size_t size() const; 1788dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 1798dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberprotected: 1808dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber virtual ~PSISection(); 1818dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 1828dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberprivate: 1838dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber sp<ABuffer> mBuffer; 1849ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim uint8_t mSkipBytes; 1859ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim static uint32_t CRC_TABLE[]; 1868dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 1878dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber DISALLOW_EVIL_CONSTRUCTORS(PSISection); 1888dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber}; 1898dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 190cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber//////////////////////////////////////////////////////////////////////////////// 191cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 192386d609dc513e838c7e7c4c46c604493ccd560beAndreas HuberATSParser::Program::Program( 193386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber ATSParser *parser, unsigned programNumber, unsigned programMapPID) 194f933441648ef6a71dee783d733aac17b9508b452Andreas Huber : mParser(parser), 195386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber mProgramNumber(programNumber), 196f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mProgramMapPID(programMapPID), 197bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber mFirstPTSValid(false), 198799c9682b3776a55d234396aee4a302437150c26Chong Zhang mFirstPTS(0), 1999bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang mLastRecoveredPTS(-1ll) { 2003856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("new program number %u", programNumber); 201cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 202cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 2038dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberbool ATSParser::Program::parsePSISection( 2048dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber unsigned pid, ABitReader *br, status_t *err) { 20506528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber *err = OK; 20606528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber 2078dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber if (pid != mProgramMapPID) { 2088dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber return false; 2098dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber } 210cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 2118dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber *err = parseProgramMap(br); 21206528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber 2138dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber return true; 2148dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber} 2158dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 2168dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberbool ATSParser::Program::parsePID( 21787f2a558dd12043631e12c361abef301bf603140Andreas Huber unsigned pid, unsigned continuity_counter, 21887f2a558dd12043631e12c361abef301bf603140Andreas Huber unsigned payload_unit_start_indicator, 2198dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber ABitReader *br, status_t *err) { 2208dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber *err = OK; 221cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 222cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber ssize_t index = mStreams.indexOfKey(pid); 223cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (index < 0) { 224cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber return false; 225cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 226cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 2275403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber *err = mStreams.editValueAt(index)->parse( 22887f2a558dd12043631e12c361abef301bf603140Andreas Huber continuity_counter, payload_unit_start_indicator, br); 229cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 230cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber return true; 231cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 232cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 23332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Hubervoid ATSParser::Program::signalDiscontinuity( 23432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber DiscontinuityType type, const sp<AMessage> &extra) { 235b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber int64_t mediaTimeUs; 236b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber if ((type & DISCONTINUITY_TIME) 237b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber && extra != NULL 238b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber && extra->findInt64( 239b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber IStreamListener::kKeyMediaTimeUs, &mediaTimeUs)) { 240b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber mFirstPTSValid = false; 241b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber } 242b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber 2432a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber for (size_t i = 0; i < mStreams.size(); ++i) { 24432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber mStreams.editValueAt(i)->signalDiscontinuity(type, extra); 245f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 246f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 247f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 248f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ATSParser::Program::signalEOS(status_t finalResult) { 249f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (size_t i = 0; i < mStreams.size(); ++i) { 250f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mStreams.editValueAt(i)->signalEOS(finalResult); 2512a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber } 2522a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber} 2532a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber 2549bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhangbool ATSParser::Program::switchPIDs(const Vector<StreamInfo> &infos) { 2559bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang bool success = false; 2569bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang 2579bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang if (mStreams.size() == infos.size()) { 2589bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang // build type->PIDs map for old and new mapping 2599bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang size_t i; 2609bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang KeyedVector<int32_t, Vector<int32_t> > oldType2PIDs, newType2PIDs; 2619bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang for (i = 0; i < mStreams.size(); ++i) { 2629bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang ssize_t index = oldType2PIDs.indexOfKey(mStreams[i]->type()); 2639bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang if (index < 0) { 2649bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang oldType2PIDs.add(mStreams[i]->type(), Vector<int32_t>()); 2659bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang } 2669bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang oldType2PIDs.editValueFor(mStreams[i]->type()).push_back(mStreams[i]->pid()); 2679bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang } 2689bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang for (i = 0; i < infos.size(); ++i) { 2699bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang ssize_t index = newType2PIDs.indexOfKey(infos[i].mType); 2709bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang if (index < 0) { 2719bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang newType2PIDs.add(infos[i].mType, Vector<int32_t>()); 2729bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang } 2739bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang newType2PIDs.editValueFor(infos[i].mType).push_back(infos[i].mPID); 2749bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang } 2759bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang 2769bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang // we can recover if the number of streams for each type hasn't changed 2779bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang if (oldType2PIDs.size() == newType2PIDs.size()) { 2789bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang success = true; 2799bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang for (i = 0; i < oldType2PIDs.size(); ++i) { 2809bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang // KeyedVector is sorted, we just compare key and size of each index 2819bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang if (oldType2PIDs.keyAt(i) != newType2PIDs.keyAt(i) 2829bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang || oldType2PIDs[i].size() != newType2PIDs[i].size()) { 2839bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang success = false; 2849bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang break; 2859bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang } 2869bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang } 2879bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang } 2889bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang 2899bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang if (success) { 2909bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang // save current streams to temp 2919bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang KeyedVector<int32_t, sp<Stream> > temp; 2929bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang for (i = 0; i < mStreams.size(); ++i) { 2939bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang temp.add(mStreams.keyAt(i), mStreams.editValueAt(i)); 2949bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang } 2959bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang 2969bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang mStreams.clear(); 2979bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang for (i = 0; i < temp.size(); ++i) { 2989bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang // The two checks below shouldn't happen, 2999bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang // we already checked above the stream count matches 3009bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang ssize_t index = newType2PIDs.indexOfKey(temp[i]->type()); 3019bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang CHECK(index >= 0); 3029bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang Vector<int32_t> &newPIDs = newType2PIDs.editValueAt(index); 3039bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang CHECK(newPIDs.size() > 0); 3049bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang 3059bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang // get the next PID for temp[i]->type() in the new PID map 3069bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang Vector<int32_t>::iterator it = newPIDs.begin(); 3079bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang 3089bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang // change the PID of the stream, and add it back 3099bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang temp.editValueAt(i)->setPID(*it); 3109bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang mStreams.add(temp[i]->pid(), temp.editValueAt(i)); 3119bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang 3129bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang // removed the used PID 3139bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang newPIDs.erase(it); 3149bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang } 3159bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang } 3169bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang } 3179bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang return success; 3189bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang} 319bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber 32006528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huberstatus_t ATSParser::Program::parseProgramMap(ABitReader *br) { 321cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned table_id = br->getBits(8); 3223856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV(" table_id = %u", table_id); 3236456ae745e919085c5024f784aaa2703f9695f98David Yeh if (table_id != 0x02u) { 3246456ae745e919085c5024f784aaa2703f9695f98David Yeh ALOGE("PMT data error!"); 3256456ae745e919085c5024f784aaa2703f9695f98David Yeh return ERROR_MALFORMED; 3266456ae745e919085c5024f784aaa2703f9695f98David Yeh } 3276e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber unsigned section_syntax_indicator = br->getBits(1); 3283856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV(" section_syntax_indicator = %u", section_syntax_indicator); 3296456ae745e919085c5024f784aaa2703f9695f98David Yeh if (section_syntax_indicator != 1u) { 3306456ae745e919085c5024f784aaa2703f9695f98David Yeh ALOGE("PMT data error!"); 3316456ae745e919085c5024f784aaa2703f9695f98David Yeh return ERROR_MALFORMED; 3326456ae745e919085c5024f784aaa2703f9695f98David Yeh } 333cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 334cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber CHECK_EQ(br->getBits(1), 0u); 3356e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" reserved = %u", br->getBits(2)); 336cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 337cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned section_length = br->getBits(12); 3383856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV(" section_length = %u", section_length); 339f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(section_length & 0xc00, 0u); 340cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber CHECK_LE(section_length, 1021u); 341cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 3426e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" program_number = %u", br->getBits(16)); 3436e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" reserved = %u", br->getBits(2)); 3446e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" version_number = %u", br->getBits(5)); 3456e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" current_next_indicator = %u", br->getBits(1)); 3466e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" section_number = %u", br->getBits(8)); 3476e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" last_section_number = %u", br->getBits(8)); 3486e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" reserved = %u", br->getBits(3)); 34987f2a558dd12043631e12c361abef301bf603140Andreas Huber 35087f2a558dd12043631e12c361abef301bf603140Andreas Huber unsigned PCR_PID = br->getBits(13); 35187f2a558dd12043631e12c361abef301bf603140Andreas Huber ALOGV(" PCR_PID = 0x%04x", PCR_PID); 35287f2a558dd12043631e12c361abef301bf603140Andreas Huber 3536e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" reserved = %u", br->getBits(4)); 354cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 355cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned program_info_length = br->getBits(12); 3563856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV(" program_info_length = %u", program_info_length); 357f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(program_info_length & 0xc00, 0u); 358cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 359cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber br->skipBits(program_info_length * 8); // skip descriptors 360cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 361bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber Vector<StreamInfo> infos; 362bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber 363cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber // infoBytesRemaining is the number of bytes that make up the 364cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber // variable length section of ES_infos. It does not include the 365cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber // final CRC. 366cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber size_t infoBytesRemaining = section_length - 9 - program_info_length - 4; 367cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 368cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber while (infoBytesRemaining > 0) { 369cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber CHECK_GE(infoBytesRemaining, 5u); 370cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 371cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned streamType = br->getBits(8); 3723856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV(" stream_type = 0x%02x", streamType); 373cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 3746e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" reserved = %u", br->getBits(3)); 375cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 376cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned elementaryPID = br->getBits(13); 3773856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV(" elementary_PID = 0x%04x", elementaryPID); 378cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 3796e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" reserved = %u", br->getBits(4)); 380cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 381cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned ES_info_length = br->getBits(12); 3823856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV(" ES_info_length = %u", ES_info_length); 383f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(ES_info_length & 0xc00, 0u); 384cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 385cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber CHECK_GE(infoBytesRemaining - 5, ES_info_length); 386cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 387cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#if 0 388cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber br->skipBits(ES_info_length * 8); // skip descriptors 389cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#else 390cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned info_bytes_remaining = ES_info_length; 391cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber while (info_bytes_remaining >= 2) { 3926e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" tag = 0x%02x", br->getBits(8)); 393cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 394cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned descLength = br->getBits(8); 3953856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV(" len = %u", descLength); 396cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 397cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber CHECK_GE(info_bytes_remaining, 2 + descLength); 398cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 399cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber br->skipBits(descLength * 8); 400cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 401cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber info_bytes_remaining -= descLength + 2; 402cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 403cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber CHECK_EQ(info_bytes_remaining, 0u); 404cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#endif 405cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 406bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber StreamInfo info; 407bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber info.mType = streamType; 408bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber info.mPID = elementaryPID; 409bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber infos.push(info); 410cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 411cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber infoBytesRemaining -= 5 + ES_info_length; 412cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 413cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 414cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber CHECK_EQ(infoBytesRemaining, 0u); 4156e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" CRC = 0x%08x", br->getBits(32)); 416bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber 417bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber bool PIDsChanged = false; 418bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber for (size_t i = 0; i < infos.size(); ++i) { 419bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber StreamInfo &info = infos.editItemAt(i); 420bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber 421bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber ssize_t index = mStreams.indexOfKey(info.mPID); 422bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber 423bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber if (index >= 0 && mStreams.editValueAt(index)->type() != info.mType) { 424df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block ALOGI("uh oh. stream PIDs have changed."); 425bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber PIDsChanged = true; 426bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber break; 427bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber } 428bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber } 429bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber 430bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber if (PIDsChanged) { 43106528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber#if 0 432df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block ALOGI("before:"); 43306528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber for (size_t i = 0; i < mStreams.size(); ++i) { 43406528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber sp<Stream> stream = mStreams.editValueAt(i); 43506528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber 436df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block ALOGI("PID 0x%08x => type 0x%02x", stream->pid(), stream->type()); 43706528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber } 43806528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber 439df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block ALOGI("after:"); 44006528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber for (size_t i = 0; i < infos.size(); ++i) { 44106528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber StreamInfo &info = infos.editItemAt(i); 44206528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber 443df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block ALOGI("PID 0x%08x => type 0x%02x", info.mPID, info.mType); 44406528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber } 44506528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber#endif 44606528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber 4479bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang // we can recover if number of streams for each type remain the same 4489bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang bool success = switchPIDs(infos); 44906528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber 45006528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber if (!success) { 451df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block ALOGI("Stream PIDs changed and we cannot recover."); 45206528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber return ERROR_MALFORMED; 45306528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber } 454bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber } 455bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber 456bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber for (size_t i = 0; i < infos.size(); ++i) { 457bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber StreamInfo &info = infos.editItemAt(i); 458bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber 459bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber ssize_t index = mStreams.indexOfKey(info.mPID); 460bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber 461bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber if (index < 0) { 46287f2a558dd12043631e12c361abef301bf603140Andreas Huber sp<Stream> stream = new Stream( 46387f2a558dd12043631e12c361abef301bf603140Andreas Huber this, info.mPID, info.mType, PCR_PID); 46487f2a558dd12043631e12c361abef301bf603140Andreas Huber 465bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber mStreams.add(info.mPID, stream); 466bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber } 467bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber } 46806528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber 46906528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber return OK; 470cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 471cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 472799c9682b3776a55d234396aee4a302437150c26Chong Zhangint64_t ATSParser::Program::recoverPTS(uint64_t PTS_33bit) { 473799c9682b3776a55d234396aee4a302437150c26Chong Zhang // We only have the lower 33-bit of the PTS. It could overflow within a 474799c9682b3776a55d234396aee4a302437150c26Chong Zhang // reasonable amount of time. To handle the wrap-around, use fancy math 475799c9682b3776a55d234396aee4a302437150c26Chong Zhang // to get an extended PTS that is within [-0xffffffff, 0xffffffff] 476799c9682b3776a55d234396aee4a302437150c26Chong Zhang // of the latest recovered PTS. 4779bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang if (mLastRecoveredPTS < 0ll) { 4789bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang // Use the original 33bit number for 1st frame, the reason is that 4799bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang // if 1st frame wraps to negative that's far away from 0, we could 4809bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang // never start. Only start wrapping around from 2nd frame. 4819bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang mLastRecoveredPTS = static_cast<int64_t>(PTS_33bit); 4829bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang } else { 4839bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang mLastRecoveredPTS = static_cast<int64_t>( 4849bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang ((mLastRecoveredPTS - PTS_33bit + 0x100000000ll) 4859bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang & 0xfffffffe00000000ull) | PTS_33bit); 4869bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang // We start from 0, but recovered PTS could be slightly below 0. 4879bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang // Clamp it to 0 as rest of the pipeline doesn't take negative pts. 4889bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang // (eg. video is read first and starts at 0, but audio starts at 0xfffffff0) 4899bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang if (mLastRecoveredPTS < 0ll) { 4905c9054bc6efc080b265e028f2ebb1abd2a2e3953Chih-Hung Hsieh ALOGI("Clamping negative recovered PTS (%" PRId64 ") to 0", mLastRecoveredPTS); 4919bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang mLastRecoveredPTS = 0ll; 4929bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang } 4939bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang } 4949bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang 4959bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang return mLastRecoveredPTS; 496799c9682b3776a55d234396aee4a302437150c26Chong Zhang} 497799c9682b3776a55d234396aee4a302437150c26Chong Zhang 498cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubersp<MediaSource> ATSParser::Program::getSource(SourceType type) { 499386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber size_t index = (type == AUDIO) ? 0 : 0; 500decd96988e495133e4a1728f612d4c9fdb4d218eAndreas Huber 501cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber for (size_t i = 0; i < mStreams.size(); ++i) { 502cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber sp<MediaSource> source = mStreams.editValueAt(i)->getSource(type); 503cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (source != NULL) { 504decd96988e495133e4a1728f612d4c9fdb4d218eAndreas Huber if (index == 0) { 505decd96988e495133e4a1728f612d4c9fdb4d218eAndreas Huber return source; 506decd96988e495133e4a1728f612d4c9fdb4d218eAndreas Huber } 507decd96988e495133e4a1728f612d4c9fdb4d218eAndreas Huber --index; 508cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 509cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 510cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 511cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber return NULL; 512cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 513cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 514bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shihbool ATSParser::Program::hasSource(SourceType type) const { 515bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih for (size_t i = 0; i < mStreams.size(); ++i) { 516bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih const sp<Stream> &stream = mStreams.valueAt(i); 517bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih if (type == AUDIO && stream->isAudio()) { 518bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih return true; 519bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih } else if (type == VIDEO && stream->isVideo()) { 520bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih return true; 521bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih } 522bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih } 523bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih 524bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih return false; 525bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih} 526bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih 527bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huberint64_t ATSParser::Program::convertPTSToTimestamp(uint64_t PTS) { 528799c9682b3776a55d234396aee4a302437150c26Chong Zhang PTS = recoverPTS(PTS); 529799c9682b3776a55d234396aee4a302437150c26Chong Zhang 530c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber if (!(mParser->mFlags & TS_TIMESTAMPS_ARE_ABSOLUTE)) { 531c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber if (!mFirstPTSValid) { 532c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber mFirstPTSValid = true; 533c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber mFirstPTS = PTS; 534c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber PTS = 0; 535c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber } else if (PTS < mFirstPTS) { 536c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber PTS = 0; 537c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber } else { 538c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber PTS -= mFirstPTS; 539c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber } 540bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber } 541bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber 54287f2a558dd12043631e12c361abef301bf603140Andreas Huber int64_t timeUs = (PTS * 100) / 9; 54387f2a558dd12043631e12c361abef301bf603140Andreas Huber 54487f2a558dd12043631e12c361abef301bf603140Andreas Huber if (mParser->mAbsoluteTimeAnchorUs >= 0ll) { 54587f2a558dd12043631e12c361abef301bf603140Andreas Huber timeUs += mParser->mAbsoluteTimeAnchorUs; 54687f2a558dd12043631e12c361abef301bf603140Andreas Huber } 54787f2a558dd12043631e12c361abef301bf603140Andreas Huber 548d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber if (mParser->mTimeOffsetValid) { 549d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber timeUs += mParser->mTimeOffsetUs; 550d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber } 551d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber 55287f2a558dd12043631e12c361abef301bf603140Andreas Huber return timeUs; 553bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber} 554bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber 555cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber//////////////////////////////////////////////////////////////////////////////// 556cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 557bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas HuberATSParser::Stream::Stream( 55887f2a558dd12043631e12c361abef301bf603140Andreas Huber Program *program, 55987f2a558dd12043631e12c361abef301bf603140Andreas Huber unsigned elementaryPID, 56087f2a558dd12043631e12c361abef301bf603140Andreas Huber unsigned streamType, 56187f2a558dd12043631e12c361abef301bf603140Andreas Huber unsigned PCR_PID) 562bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber : mProgram(program), 563bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber mElementaryPID(elementaryPID), 564cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber mStreamType(streamType), 56587f2a558dd12043631e12c361abef301bf603140Andreas Huber mPCR_PID(PCR_PID), 56687f2a558dd12043631e12c361abef301bf603140Andreas Huber mExpectedContinuityCounter(-1), 5676a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber mPayloadStarted(false), 56890a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber mPrevPTS(0), 569386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber mQueue(NULL) { 570386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber switch (mStreamType) { 571386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber case STREAMTYPE_H264: 57287f2a558dd12043631e12c361abef301bf603140Andreas Huber mQueue = new ElementaryStreamQueue( 57387f2a558dd12043631e12c361abef301bf603140Andreas Huber ElementaryStreamQueue::H264, 57487f2a558dd12043631e12c361abef301bf603140Andreas Huber (mProgram->parserFlags() & ALIGNED_VIDEO_DATA) 57587f2a558dd12043631e12c361abef301bf603140Andreas Huber ? ElementaryStreamQueue::kFlag_AlignedData : 0); 576386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber break; 5776e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber case STREAMTYPE_MPEG2_AUDIO_ADTS: 578386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber mQueue = new ElementaryStreamQueue(ElementaryStreamQueue::AAC); 579386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber break; 580386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber case STREAMTYPE_MPEG1_AUDIO: 581386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber case STREAMTYPE_MPEG2_AUDIO: 582386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber mQueue = new ElementaryStreamQueue( 583386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber ElementaryStreamQueue::MPEG_AUDIO); 584386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber break; 585386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber 586386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber case STREAMTYPE_MPEG1_VIDEO: 587386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber case STREAMTYPE_MPEG2_VIDEO: 588386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber mQueue = new ElementaryStreamQueue( 589386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber ElementaryStreamQueue::MPEG_VIDEO); 590386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber break; 591386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber 592386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber case STREAMTYPE_MPEG4_VIDEO: 593386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber mQueue = new ElementaryStreamQueue( 594386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber ElementaryStreamQueue::MPEG4_VIDEO); 595386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber break; 596386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber 5979bf32f06e8971c1d3eb4fc5edd74b69557f97212Chong Zhang case STREAMTYPE_LPCM_AC3: 598d3c079ae9859011d118f94616d0069c2987013edChangwan Ryu case STREAMTYPE_AC3: 599d3c079ae9859011d118f94616d0069c2987013edChangwan Ryu mQueue = new ElementaryStreamQueue( 600d3c079ae9859011d118f94616d0069c2987013edChangwan Ryu ElementaryStreamQueue::AC3); 601d3c079ae9859011d118f94616d0069c2987013edChangwan Ryu break; 602d3c079ae9859011d118f94616d0069c2987013edChangwan Ryu 603386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber default: 604386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber break; 605386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber } 606386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber 6073856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("new stream PID 0x%02x, type 0x%02x", elementaryPID, streamType); 60818ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber 60918ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber if (mQueue != NULL) { 61018ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber mBuffer = new ABuffer(192 * 1024); 61118ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber mBuffer->setRange(0, 0); 61218ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber } 613cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 614cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 615cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas HuberATSParser::Stream::~Stream() { 616386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber delete mQueue; 617386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber mQueue = NULL; 618cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 619cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 6205403129e2a2f44620f2ac8109889e5a61be08732Andreas Huberstatus_t ATSParser::Stream::parse( 62187f2a558dd12043631e12c361abef301bf603140Andreas Huber unsigned continuity_counter, 622cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned payload_unit_start_indicator, ABitReader *br) { 62318ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber if (mQueue == NULL) { 6245403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber return OK; 62518ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber } 62618ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber 62787f2a558dd12043631e12c361abef301bf603140Andreas Huber if (mExpectedContinuityCounter >= 0 62887f2a558dd12043631e12c361abef301bf603140Andreas Huber && (unsigned)mExpectedContinuityCounter != continuity_counter) { 62987f2a558dd12043631e12c361abef301bf603140Andreas Huber ALOGI("discontinuity on stream pid 0x%04x", mElementaryPID); 63087f2a558dd12043631e12c361abef301bf603140Andreas Huber 63187f2a558dd12043631e12c361abef301bf603140Andreas Huber mPayloadStarted = false; 63287f2a558dd12043631e12c361abef301bf603140Andreas Huber mBuffer->setRange(0, 0); 63387f2a558dd12043631e12c361abef301bf603140Andreas Huber mExpectedContinuityCounter = -1; 63487f2a558dd12043631e12c361abef301bf603140Andreas Huber 63594a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber#if 0 63694a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber // Uncomment this if you'd rather see no corruption whatsoever on 63794a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber // screen and suspend updates until we come across another IDR frame. 63894a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber 63994a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber if (mStreamType == STREAMTYPE_H264) { 64094a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber ALOGI("clearing video queue"); 64194a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber mQueue->clear(true /* clearFormat */); 64294a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber } 64394a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber#endif 64494a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber 64566830855846db5c211c2da6c055ca9b4167e8974Chong Zhang if (!payload_unit_start_indicator) { 64666830855846db5c211c2da6c055ca9b4167e8974Chong Zhang return OK; 64766830855846db5c211c2da6c055ca9b4167e8974Chong Zhang } 64887f2a558dd12043631e12c361abef301bf603140Andreas Huber } 64987f2a558dd12043631e12c361abef301bf603140Andreas Huber 65087f2a558dd12043631e12c361abef301bf603140Andreas Huber mExpectedContinuityCounter = (continuity_counter + 1) & 0x0f; 65187f2a558dd12043631e12c361abef301bf603140Andreas Huber 652cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (payload_unit_start_indicator) { 653cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (mPayloadStarted) { 654cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber // Otherwise we run the danger of receiving the trailing bytes 655cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber // of a PES packet that we never saw the start of and assuming 656cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber // we have a a complete PES packet. 657cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 6585403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber status_t err = flush(); 6595403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber 6605403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber if (err != OK) { 6615403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber return err; 6625403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber } 663cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 664cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 665cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber mPayloadStarted = true; 666cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 667cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 668cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (!mPayloadStarted) { 6695403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber return OK; 670cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 671cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 672cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber size_t payloadSizeBits = br->numBitsLeft(); 673f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(payloadSizeBits % 8, 0u); 674cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 6753e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber size_t neededSize = mBuffer->size() + payloadSizeBits / 8; 6763e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber if (mBuffer->capacity() < neededSize) { 6773e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber // Increment in multiples of 64K. 6783e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber neededSize = (neededSize + 65535) & ~65535; 6793e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber 680b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross ALOGI("resizing buffer to %zu bytes", neededSize); 6813e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber 6823e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber sp<ABuffer> newBuffer = new ABuffer(neededSize); 6833e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber memcpy(newBuffer->data(), mBuffer->data(), mBuffer->size()); 6843e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber newBuffer->setRange(0, mBuffer->size()); 6853e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber mBuffer = newBuffer; 6863e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber } 687cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 688cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber memcpy(mBuffer->data() + mBuffer->size(), br->data(), payloadSizeBits / 8); 689cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber mBuffer->setRange(0, mBuffer->size() + payloadSizeBits / 8); 6905403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber 6915403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber return OK; 692cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 693cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 6946e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huberbool ATSParser::Stream::isVideo() const { 6956e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber switch (mStreamType) { 6966e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber case STREAMTYPE_H264: 6976e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber case STREAMTYPE_MPEG1_VIDEO: 6986e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber case STREAMTYPE_MPEG2_VIDEO: 6996e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber case STREAMTYPE_MPEG4_VIDEO: 7006e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber return true; 7016e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 7026e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber default: 7036e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber return false; 7046e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } 7056e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber} 7066e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 7076e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huberbool ATSParser::Stream::isAudio() const { 7086e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber switch (mStreamType) { 7096e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber case STREAMTYPE_MPEG1_AUDIO: 7106e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber case STREAMTYPE_MPEG2_AUDIO: 7116e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber case STREAMTYPE_MPEG2_AUDIO_ADTS: 7129bf32f06e8971c1d3eb4fc5edd74b69557f97212Chong Zhang case STREAMTYPE_LPCM_AC3: 713d3c079ae9859011d118f94616d0069c2987013edChangwan Ryu case STREAMTYPE_AC3: 7146e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber return true; 7156e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 7166e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber default: 7176e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber return false; 7186e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } 7196e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber} 7206e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 72132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Hubervoid ATSParser::Stream::signalDiscontinuity( 72232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber DiscontinuityType type, const sp<AMessage> &extra) { 7230389cc09f7b90f155a8942a0d2e1925cad1dbe2dMarco Nelissen mExpectedContinuityCounter = -1; 7240389cc09f7b90f155a8942a0d2e1925cad1dbe2dMarco Nelissen 72518ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber if (mQueue == NULL) { 72618ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber return; 72718ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber } 72818ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber 7292a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber mPayloadStarted = false; 7302a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber mBuffer->setRange(0, 0); 7312a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber 7326e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber bool clearFormat = false; 7336e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (isAudio()) { 7346e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (type & DISCONTINUITY_AUDIO_FORMAT) { 7356e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber clearFormat = true; 7366e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } 7376e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } else { 7386e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (type & DISCONTINUITY_VIDEO_FORMAT) { 7396e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber clearFormat = true; 7406e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } 7416e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } 742f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 7436e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber mQueue->clear(clearFormat); 74432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 7456e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (type & DISCONTINUITY_TIME) { 7466e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber uint64_t resumeAtPTS; 7476e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (extra != NULL 7486e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber && extra->findInt64( 7496e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber IStreamListener::kKeyResumeAtPTS, 7506e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber (int64_t *)&resumeAtPTS)) { 7516e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber int64_t resumeAtMediaTimeUs = 7526e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber mProgram->convertPTSToTimestamp(resumeAtPTS); 75332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 754c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia extra->setInt64("resume-at-mediaTimeUs", resumeAtMediaTimeUs); 755e332a9181cf6a3155ed1a0fd2afc212ccb1f2753Andreas Huber } 7566e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } 757f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 7586e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (mSource != NULL) { 759632740c58119a132ce19f6d498e39c5c3773971aChong Zhang mSource->queueDiscontinuity(type, extra, true); 760bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber } 761f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 762bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber 763f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ATSParser::Stream::signalEOS(status_t finalResult) { 764f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mSource != NULL) { 765f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mSource->signalEOS(finalResult); 7662a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber } 7672a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber} 7682a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber 7695403129e2a2f44620f2ac8109889e5a61be08732Andreas Huberstatus_t ATSParser::Stream::parsePES(ABitReader *br) { 770cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned packet_startcode_prefix = br->getBits(24); 771cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 7723856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("packet_startcode_prefix = 0x%08x", packet_startcode_prefix); 773cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 774386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber if (packet_startcode_prefix != 1) { 7753856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Supposedly payload_unit_start=1 unit does not start " 776386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber "with startcode."); 7775403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber 7785403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber return ERROR_MALFORMED; 779386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber } 780386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber 781cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber CHECK_EQ(packet_startcode_prefix, 0x000001u); 782cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 783cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned stream_id = br->getBits(8); 7843856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("stream_id = 0x%02x", stream_id); 785cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 786cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned PES_packet_length = br->getBits(16); 7873856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("PES_packet_length = %u", PES_packet_length); 788cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 789cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (stream_id != 0xbc // program_stream_map 790cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber && stream_id != 0xbe // padding_stream 791cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber && stream_id != 0xbf // private_stream_2 792cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber && stream_id != 0xf0 // ECM 793cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber && stream_id != 0xf1 // EMM 794cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber && stream_id != 0xff // program_stream_directory 795cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber && stream_id != 0xf2 // DSMCC 796cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber && stream_id != 0xf8) { // H.222.1 type E 797cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber CHECK_EQ(br->getBits(2), 2u); 798cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 7996e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV("PES_scrambling_control = %u", br->getBits(2)); 8006e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV("PES_priority = %u", br->getBits(1)); 8016e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV("data_alignment_indicator = %u", br->getBits(1)); 8026e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV("copyright = %u", br->getBits(1)); 8036e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV("original_or_copy = %u", br->getBits(1)); 804cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 805cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned PTS_DTS_flags = br->getBits(2); 8063856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("PTS_DTS_flags = %u", PTS_DTS_flags); 807cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 808cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned ESCR_flag = br->getBits(1); 8093856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("ESCR_flag = %u", ESCR_flag); 810cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 811cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned ES_rate_flag = br->getBits(1); 8123856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("ES_rate_flag = %u", ES_rate_flag); 813cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 814cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned DSM_trick_mode_flag = br->getBits(1); 8153856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("DSM_trick_mode_flag = %u", DSM_trick_mode_flag); 816cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 817cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned additional_copy_info_flag = br->getBits(1); 8183856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("additional_copy_info_flag = %u", additional_copy_info_flag); 819cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 8206e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV("PES_CRC_flag = %u", br->getBits(1)); 8216e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV("PES_extension_flag = %u", br->getBits(1)); 822cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 823cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned PES_header_data_length = br->getBits(8); 8243856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("PES_header_data_length = %u", PES_header_data_length); 825cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 826cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned optional_bytes_remaining = PES_header_data_length; 827cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 828cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber uint64_t PTS = 0, DTS = 0; 829cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 830cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (PTS_DTS_flags == 2 || PTS_DTS_flags == 3) { 831cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber CHECK_GE(optional_bytes_remaining, 5u); 832cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 8336456ae745e919085c5024f784aaa2703f9695f98David Yeh if (br->getBits(4) != PTS_DTS_flags) { 8346456ae745e919085c5024f784aaa2703f9695f98David Yeh ALOGE("PES data Error!"); 8356456ae745e919085c5024f784aaa2703f9695f98David Yeh return ERROR_MALFORMED; 8366456ae745e919085c5024f784aaa2703f9695f98David Yeh } 837cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber PTS = ((uint64_t)br->getBits(3)) << 30; 838cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber CHECK_EQ(br->getBits(1), 1u); 839cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber PTS |= ((uint64_t)br->getBits(15)) << 15; 840cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber CHECK_EQ(br->getBits(1), 1u); 841cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber PTS |= br->getBits(15); 842cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber CHECK_EQ(br->getBits(1), 1u); 843cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 844b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross ALOGV("PTS = 0x%016" PRIx64 " (%.2f)", PTS, PTS / 90000.0); 845cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 846cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber optional_bytes_remaining -= 5; 847cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 848cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (PTS_DTS_flags == 3) { 849cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber CHECK_GE(optional_bytes_remaining, 5u); 850cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 851cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber CHECK_EQ(br->getBits(4), 1u); 852cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 853cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber DTS = ((uint64_t)br->getBits(3)) << 30; 854cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber CHECK_EQ(br->getBits(1), 1u); 855cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber DTS |= ((uint64_t)br->getBits(15)) << 15; 856cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber CHECK_EQ(br->getBits(1), 1u); 857cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber DTS |= br->getBits(15); 858cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber CHECK_EQ(br->getBits(1), 1u); 859cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 860b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross ALOGV("DTS = %" PRIu64, DTS); 861cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 862cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber optional_bytes_remaining -= 5; 863cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 864cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 865cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 866cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (ESCR_flag) { 867cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber CHECK_GE(optional_bytes_remaining, 6u); 868cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 869cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber br->getBits(2); 870cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 871cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber uint64_t ESCR = ((uint64_t)br->getBits(3)) << 30; 872cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber CHECK_EQ(br->getBits(1), 1u); 873cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber ESCR |= ((uint64_t)br->getBits(15)) << 15; 874cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber CHECK_EQ(br->getBits(1), 1u); 875cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber ESCR |= br->getBits(15); 876cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber CHECK_EQ(br->getBits(1), 1u); 877cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 878b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross ALOGV("ESCR = %" PRIu64, ESCR); 8796e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV("ESCR_extension = %u", br->getBits(9)); 880cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 881cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber CHECK_EQ(br->getBits(1), 1u); 882cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 883cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber optional_bytes_remaining -= 6; 884cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 885cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 886cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (ES_rate_flag) { 887cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber CHECK_GE(optional_bytes_remaining, 3u); 888cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 889cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber CHECK_EQ(br->getBits(1), 1u); 8906e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV("ES_rate = %u", br->getBits(22)); 891cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber CHECK_EQ(br->getBits(1), 1u); 892cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 893cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber optional_bytes_remaining -= 3; 894cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 895cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 896cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber br->skipBits(optional_bytes_remaining * 8); 897cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 898cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber // ES data follows. 899cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 900cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (PES_packet_length != 0) { 901cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber CHECK_GE(PES_packet_length, PES_header_data_length + 3); 902cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 903cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned dataLength = 904cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber PES_packet_length - 3 - PES_header_data_length; 905cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 9065403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber if (br->numBitsLeft() < dataLength * 8) { 90729357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("PES packet does not carry enough data to contain " 908b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross "payload. (numBitsLeft = %zu, required = %u)", 9095403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber br->numBitsLeft(), dataLength * 8); 9105403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber 9115403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber return ERROR_MALFORMED; 9125403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber } 9135403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber 9140da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber CHECK_GE(br->numBitsLeft(), dataLength * 8); 9150da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber 9160da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber onPayloadData( 9170da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber PTS_DTS_flags, PTS, DTS, br->data(), dataLength); 918cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 919cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber br->skipBits(dataLength * 8); 920cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } else { 9210da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber onPayloadData( 9220da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber PTS_DTS_flags, PTS, DTS, 9230da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber br->data(), br->numBitsLeft() / 8); 9240da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber 925cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber size_t payloadSizeBits = br->numBitsLeft(); 926f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(payloadSizeBits % 8, 0u); 927cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 928b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross ALOGV("There's %zu bytes of payload.", payloadSizeBits / 8); 929cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 930cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } else if (stream_id == 0xbe) { // padding_stream 931cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber CHECK_NE(PES_packet_length, 0u); 932cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber br->skipBits(PES_packet_length * 8); 933cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } else { 934cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber CHECK_NE(PES_packet_length, 0u); 935cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber br->skipBits(PES_packet_length * 8); 936cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 9375403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber 9385403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber return OK; 939cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 940cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 9415403129e2a2f44620f2ac8109889e5a61be08732Andreas Huberstatus_t ATSParser::Stream::flush() { 942cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (mBuffer->size() == 0) { 9435403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber return OK; 944cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 945cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 946b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross ALOGV("flushing stream 0x%04x size = %zu", mElementaryPID, mBuffer->size()); 947cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 948cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber ABitReader br(mBuffer->data(), mBuffer->size()); 9495403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber 9505403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber status_t err = parsePES(&br); 951cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 952cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber mBuffer->setRange(0, 0); 9535403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber 9545403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber return err; 955cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 956cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 957cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubervoid ATSParser::Stream::onPayloadData( 95884333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber unsigned PTS_DTS_flags, uint64_t PTS, uint64_t /* DTS */, 959cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber const uint8_t *data, size_t size) { 96090a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber#if 0 96190a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber ALOGI("payload streamType 0x%02x, PTS = 0x%016llx, dPTS = %lld", 96290a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber mStreamType, 96390a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber PTS, 96490a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber (int64_t)PTS - mPrevPTS); 96590a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber mPrevPTS = PTS; 96690a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber#endif 96790a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber 9683856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("onPayloadData mStreamType=0x%02x", mStreamType); 969cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 97098a46cf165d8de3779874eba01803bbc485f45b9Andreas Huber int64_t timeUs = 0ll; // no presentation timestamp available. 97198a46cf165d8de3779874eba01803bbc485f45b9Andreas Huber if (PTS_DTS_flags == 2 || PTS_DTS_flags == 3) { 97298a46cf165d8de3779874eba01803bbc485f45b9Andreas Huber timeUs = mProgram->convertPTSToTimestamp(PTS); 97398a46cf165d8de3779874eba01803bbc485f45b9Andreas Huber } 97482f7321b03eec1e40af9d681370f754ee0279582Andreas Huber 975386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber status_t err = mQueue->appendData(data, size, timeUs); 976decd96988e495133e4a1728f612d4c9fdb4d218eAndreas Huber 977decd96988e495133e4a1728f612d4c9fdb4d218eAndreas Huber if (err != OK) { 978decd96988e495133e4a1728f612d4c9fdb4d218eAndreas Huber return; 979decd96988e495133e4a1728f612d4c9fdb4d218eAndreas Huber } 98082f7321b03eec1e40af9d681370f754ee0279582Andreas Huber 9816a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber sp<ABuffer> accessUnit; 982386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber while ((accessUnit = mQueue->dequeueAccessUnit()) != NULL) { 9836a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber if (mSource == NULL) { 984386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber sp<MetaData> meta = mQueue->getFormat(); 98582f7321b03eec1e40af9d681370f754ee0279582Andreas Huber 9866a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber if (meta != NULL) { 9873856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Stream PID 0x%08x of type 0x%02x now has data.", 988386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber mElementaryPID, mStreamType); 989386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber 990309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih const char *mime; 991309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih if (meta->findCString(kKeyMIMEType, &mime) 992309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih && !strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_AVC) 993309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih && !IsIDR(accessUnit)) { 994309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih continue; 995309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih } 9966a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber mSource = new AnotherPacketSource(meta); 9976a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber mSource->queueAccessUnit(accessUnit); 99882f7321b03eec1e40af9d681370f754ee0279582Andreas Huber } 999386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber } else if (mQueue->getFormat() != NULL) { 10002a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber // After a discontinuity we invalidate the queue's format 10012a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber // and won't enqueue any access units to the source until 10022a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber // the queue has reestablished the new format. 10035bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 10045bc087c573c70c84c6a39946457590b42d392a33Andreas Huber if (mSource->getFormat() == NULL) { 1005386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber mSource->setFormat(mQueue->getFormat()); 10065bc087c573c70c84c6a39946457590b42d392a33Andreas Huber } 10076a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber mSource->queueAccessUnit(accessUnit); 100882f7321b03eec1e40af9d681370f754ee0279582Andreas Huber } 100982f7321b03eec1e40af9d681370f754ee0279582Andreas Huber } 101082f7321b03eec1e40af9d681370f754ee0279582Andreas Huber} 101182f7321b03eec1e40af9d681370f754ee0279582Andreas Huber 1012cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubersp<MediaSource> ATSParser::Stream::getSource(SourceType type) { 1013386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber switch (type) { 1014386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber case VIDEO: 1015386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber { 10166e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (isVideo()) { 1017386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber return mSource; 1018386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber } 1019386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber break; 1020386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber } 1021386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber 1022386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber case AUDIO: 1023386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber { 10246e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (isAudio()) { 1025386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber return mSource; 1026386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber } 1027386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber break; 1028386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber } 1029386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber 1030386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber default: 1031386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber break; 1032cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 1033cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1034cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber return NULL; 1035cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 1036cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1037cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber//////////////////////////////////////////////////////////////////////////////// 1038cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1039c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas HuberATSParser::ATSParser(uint32_t flags) 104087f2a558dd12043631e12c361abef301bf603140Andreas Huber : mFlags(flags), 104187f2a558dd12043631e12c361abef301bf603140Andreas Huber mAbsoluteTimeAnchorUs(-1ll), 1042d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber mTimeOffsetValid(false), 1043d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber mTimeOffsetUs(0ll), 104487f2a558dd12043631e12c361abef301bf603140Andreas Huber mNumTSPacketsParsed(0), 104587f2a558dd12043631e12c361abef301bf603140Andreas Huber mNumPCRs(0) { 10468dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber mPSISections.add(0 /* PID */, new PSISection); 1047cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 1048cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1049cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas HuberATSParser::~ATSParser() { 1050cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 1051cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 105206528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huberstatus_t ATSParser::feedTSPacket(const void *data, size_t size) { 1053cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber CHECK_EQ(size, kTSPacketSize); 1054cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1055cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber ABitReader br((const uint8_t *)data, kTSPacketSize); 105606528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber return parseTS(&br); 1057cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 1058cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 105932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Hubervoid ATSParser::signalDiscontinuity( 106032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber DiscontinuityType type, const sp<AMessage> &extra) { 1061b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber int64_t mediaTimeUs; 1062b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber if ((type & DISCONTINUITY_TIME) 1063b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber && extra != NULL 1064b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber && extra->findInt64( 1065b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber IStreamListener::kKeyMediaTimeUs, &mediaTimeUs)) { 1066b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber mAbsoluteTimeAnchorUs = mediaTimeUs; 1067b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber } else if (type == DISCONTINUITY_ABSOLUTE_TIME) { 106887f2a558dd12043631e12c361abef301bf603140Andreas Huber int64_t timeUs; 106987f2a558dd12043631e12c361abef301bf603140Andreas Huber CHECK(extra->findInt64("timeUs", &timeUs)); 107087f2a558dd12043631e12c361abef301bf603140Andreas Huber 107187f2a558dd12043631e12c361abef301bf603140Andreas Huber CHECK(mPrograms.empty()); 107287f2a558dd12043631e12c361abef301bf603140Andreas Huber mAbsoluteTimeAnchorUs = timeUs; 107387f2a558dd12043631e12c361abef301bf603140Andreas Huber return; 1074d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber } else if (type == DISCONTINUITY_TIME_OFFSET) { 1075d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber int64_t offset; 1076d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber CHECK(extra->findInt64("offset", &offset)); 1077d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber 1078d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber mTimeOffsetValid = true; 1079d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber mTimeOffsetUs = offset; 1080d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber return; 108187f2a558dd12043631e12c361abef301bf603140Andreas Huber } 108287f2a558dd12043631e12c361abef301bf603140Andreas Huber 1083f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (size_t i = 0; i < mPrograms.size(); ++i) { 108432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber mPrograms.editItemAt(i)->signalDiscontinuity(type, extra); 1085f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1086f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1087f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1088f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ATSParser::signalEOS(status_t finalResult) { 1089f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_NE(finalResult, (status_t)OK); 1090f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 10912a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber for (size_t i = 0; i < mPrograms.size(); ++i) { 1092f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mPrograms.editItemAt(i)->signalEOS(finalResult); 10932a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber } 10942a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber} 10952a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber 1096cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubervoid ATSParser::parseProgramAssociationTable(ABitReader *br) { 1097cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned table_id = br->getBits(8); 10983856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV(" table_id = %u", table_id); 10996456ae745e919085c5024f784aaa2703f9695f98David Yeh if (table_id != 0x00u) { 11006456ae745e919085c5024f784aaa2703f9695f98David Yeh ALOGE("PAT data error!"); 11016456ae745e919085c5024f784aaa2703f9695f98David Yeh return ; 11026456ae745e919085c5024f784aaa2703f9695f98David Yeh } 1103cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned section_syntax_indictor = br->getBits(1); 11043856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV(" section_syntax_indictor = %u", section_syntax_indictor); 1105cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber CHECK_EQ(section_syntax_indictor, 1u); 1106cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1107cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber CHECK_EQ(br->getBits(1), 0u); 11086e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" reserved = %u", br->getBits(2)); 1109cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1110cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned section_length = br->getBits(12); 11113856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV(" section_length = %u", section_length); 1112f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(section_length & 0xc00, 0u); 1113cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 11146e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" transport_stream_id = %u", br->getBits(16)); 11156e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" reserved = %u", br->getBits(2)); 11166e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" version_number = %u", br->getBits(5)); 11176e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" current_next_indicator = %u", br->getBits(1)); 11186e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" section_number = %u", br->getBits(8)); 11196e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" last_section_number = %u", br->getBits(8)); 1120cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1121cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber size_t numProgramBytes = (section_length - 5 /* header */ - 4 /* crc */); 1122cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber CHECK_EQ((numProgramBytes % 4), 0u); 1123cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1124cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber for (size_t i = 0; i < numProgramBytes / 4; ++i) { 1125cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned program_number = br->getBits(16); 11263856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV(" program_number = %u", program_number); 1127cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 11286e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" reserved = %u", br->getBits(3)); 1129cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1130cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (program_number == 0) { 11316e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" network_PID = 0x%04x", br->getBits(13)); 1132cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } else { 1133cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned programMapPID = br->getBits(13); 1134cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 11353856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV(" program_map_PID = 0x%04x", programMapPID); 1136cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1137386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber bool found = false; 1138386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber for (size_t index = 0; index < mPrograms.size(); ++index) { 1139386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber const sp<Program> &program = mPrograms.itemAt(index); 1140386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber 1141386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber if (program->number() == program_number) { 1142386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber program->updateProgramMapPID(programMapPID); 1143386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber found = true; 1144386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber break; 1145386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber } 1146386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber } 1147386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber 1148386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber if (!found) { 1149386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber mPrograms.push( 1150386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber new Program(this, program_number, programMapPID)); 1151386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber } 11528dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 11538dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber if (mPSISections.indexOfKey(programMapPID) < 0) { 11548dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber mPSISections.add(programMapPID, new PSISection); 11558dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber } 1156cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 1157cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 1158cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 11596e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" CRC = 0x%08x", br->getBits(32)); 1160cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 1161cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 116206528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huberstatus_t ATSParser::parsePID( 1163cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber ABitReader *br, unsigned PID, 116487f2a558dd12043631e12c361abef301bf603140Andreas Huber unsigned continuity_counter, 1165cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned payload_unit_start_indicator) { 11668dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber ssize_t sectionIndex = mPSISections.indexOfKey(PID); 11678dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 11688dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber if (sectionIndex >= 0) { 11694b4bb11b8747adeb2efe56c7df4ab6803dd7db41Andreas Huber sp<PSISection> section = mPSISections.valueAt(sectionIndex); 11708dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 1171cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (payload_unit_start_indicator) { 11726456ae745e919085c5024f784aaa2703f9695f98David Yeh if (!section->isEmpty()) { 11739bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang ALOGW("parsePID encounters payload_unit_start_indicator when section is not empty"); 11749bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang section->clear(); 11756456ae745e919085c5024f784aaa2703f9695f98David Yeh } 11768dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 1177cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned skip = br->getBits(8); 11789ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim section->setSkipBytes(skip + 1); // skip filler bytes + pointer field itself 1179cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber br->skipBits(skip * 8); 1180cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 11818dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 11828dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber CHECK((br->numBitsLeft() % 8) == 0); 11838dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber status_t err = section->append(br->data(), br->numBitsLeft() / 8); 11848dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 11858dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber if (err != OK) { 11868dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber return err; 11878dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber } 11888dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 11898dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber if (!section->isComplete()) { 11908dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber return OK; 11918dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber } 11928dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 11939ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim if (!section->isCRCOkay()) { 11949ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim return BAD_VALUE; 11959ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim } 11968dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber ABitReader sectionBits(section->data(), section->size()); 11978dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 11988dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber if (PID == 0) { 11998dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber parseProgramAssociationTable(§ionBits); 12008dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber } else { 12018dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber bool handled = false; 12028dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber for (size_t i = 0; i < mPrograms.size(); ++i) { 12038dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber status_t err; 12048dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber if (!mPrograms.editItemAt(i)->parsePSISection( 12058dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber PID, §ionBits, &err)) { 12068dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber continue; 12078dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber } 12088dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 12098dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber if (err != OK) { 12108dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber return err; 12118dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber } 12128dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 12138dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber handled = true; 12148dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber break; 12158dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber } 12168dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 12178dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber if (!handled) { 12188dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber mPSISections.removeItem(PID); 12194b4bb11b8747adeb2efe56c7df4ab6803dd7db41Andreas Huber section.clear(); 12208dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber } 12218dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber } 12228dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 12234b4bb11b8747adeb2efe56c7df4ab6803dd7db41Andreas Huber if (section != NULL) { 12244b4bb11b8747adeb2efe56c7df4ab6803dd7db41Andreas Huber section->clear(); 12254b4bb11b8747adeb2efe56c7df4ab6803dd7db41Andreas Huber } 12268dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 122706528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber return OK; 1228cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 1229cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1230cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber bool handled = false; 1231cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber for (size_t i = 0; i < mPrograms.size(); ++i) { 123206528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber status_t err; 1233cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (mPrograms.editItemAt(i)->parsePID( 123487f2a558dd12043631e12c361abef301bf603140Andreas Huber PID, continuity_counter, payload_unit_start_indicator, 123587f2a558dd12043631e12c361abef301bf603140Andreas Huber br, &err)) { 123606528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber if (err != OK) { 123706528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber return err; 123806528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber } 123906528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber 1240cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber handled = true; 1241cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber break; 1242cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 1243cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 1244cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1245cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (!handled) { 12463856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("PID 0x%04x not handled.", PID); 1247cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 124806528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber 124906528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber return OK; 1250cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 1251cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 125287f2a558dd12043631e12c361abef301bf603140Andreas Hubervoid ATSParser::parseAdaptationField(ABitReader *br, unsigned PID) { 1253cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned adaptation_field_length = br->getBits(8); 125487f2a558dd12043631e12c361abef301bf603140Andreas Huber 1255cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (adaptation_field_length > 0) { 125687f2a558dd12043631e12c361abef301bf603140Andreas Huber unsigned discontinuity_indicator = br->getBits(1); 125787f2a558dd12043631e12c361abef301bf603140Andreas Huber 125887f2a558dd12043631e12c361abef301bf603140Andreas Huber if (discontinuity_indicator) { 125987f2a558dd12043631e12c361abef301bf603140Andreas Huber ALOGV("PID 0x%04x: discontinuity_indicator = 1 (!!!)", PID); 126087f2a558dd12043631e12c361abef301bf603140Andreas Huber } 126187f2a558dd12043631e12c361abef301bf603140Andreas Huber 126287f2a558dd12043631e12c361abef301bf603140Andreas Huber br->skipBits(2); 126387f2a558dd12043631e12c361abef301bf603140Andreas Huber unsigned PCR_flag = br->getBits(1); 126487f2a558dd12043631e12c361abef301bf603140Andreas Huber 126587f2a558dd12043631e12c361abef301bf603140Andreas Huber size_t numBitsRead = 4; 126687f2a558dd12043631e12c361abef301bf603140Andreas Huber 126787f2a558dd12043631e12c361abef301bf603140Andreas Huber if (PCR_flag) { 126887f2a558dd12043631e12c361abef301bf603140Andreas Huber br->skipBits(4); 126987f2a558dd12043631e12c361abef301bf603140Andreas Huber uint64_t PCR_base = br->getBits(32); 127087f2a558dd12043631e12c361abef301bf603140Andreas Huber PCR_base = (PCR_base << 1) | br->getBits(1); 127187f2a558dd12043631e12c361abef301bf603140Andreas Huber 127287f2a558dd12043631e12c361abef301bf603140Andreas Huber br->skipBits(6); 127387f2a558dd12043631e12c361abef301bf603140Andreas Huber unsigned PCR_ext = br->getBits(9); 127487f2a558dd12043631e12c361abef301bf603140Andreas Huber 127587f2a558dd12043631e12c361abef301bf603140Andreas Huber // The number of bytes from the start of the current 127687f2a558dd12043631e12c361abef301bf603140Andreas Huber // MPEG2 transport stream packet up and including 127787f2a558dd12043631e12c361abef301bf603140Andreas Huber // the final byte of this PCR_ext field. 127887f2a558dd12043631e12c361abef301bf603140Andreas Huber size_t byteOffsetFromStartOfTSPacket = 127987f2a558dd12043631e12c361abef301bf603140Andreas Huber (188 - br->numBitsLeft() / 8); 128087f2a558dd12043631e12c361abef301bf603140Andreas Huber 128187f2a558dd12043631e12c361abef301bf603140Andreas Huber uint64_t PCR = PCR_base * 300 + PCR_ext; 128287f2a558dd12043631e12c361abef301bf603140Andreas Huber 1283b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross ALOGV("PID 0x%04x: PCR = 0x%016" PRIx64 " (%.2f)", 128487f2a558dd12043631e12c361abef301bf603140Andreas Huber PID, PCR, PCR / 27E6); 128587f2a558dd12043631e12c361abef301bf603140Andreas Huber 128687f2a558dd12043631e12c361abef301bf603140Andreas Huber // The number of bytes received by this parser up to and 128787f2a558dd12043631e12c361abef301bf603140Andreas Huber // including the final byte of this PCR_ext field. 128887f2a558dd12043631e12c361abef301bf603140Andreas Huber size_t byteOffsetFromStart = 128987f2a558dd12043631e12c361abef301bf603140Andreas Huber mNumTSPacketsParsed * 188 + byteOffsetFromStartOfTSPacket; 129087f2a558dd12043631e12c361abef301bf603140Andreas Huber 129187f2a558dd12043631e12c361abef301bf603140Andreas Huber for (size_t i = 0; i < mPrograms.size(); ++i) { 129287f2a558dd12043631e12c361abef301bf603140Andreas Huber updatePCR(PID, PCR, byteOffsetFromStart); 129387f2a558dd12043631e12c361abef301bf603140Andreas Huber } 129487f2a558dd12043631e12c361abef301bf603140Andreas Huber 129587f2a558dd12043631e12c361abef301bf603140Andreas Huber numBitsRead += 52; 129687f2a558dd12043631e12c361abef301bf603140Andreas Huber } 129787f2a558dd12043631e12c361abef301bf603140Andreas Huber 129887f2a558dd12043631e12c361abef301bf603140Andreas Huber CHECK_GE(adaptation_field_length * 8, numBitsRead); 129987f2a558dd12043631e12c361abef301bf603140Andreas Huber 130087f2a558dd12043631e12c361abef301bf603140Andreas Huber br->skipBits(adaptation_field_length * 8 - numBitsRead); 1301cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 1302cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 1303cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 130406528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huberstatus_t ATSParser::parseTS(ABitReader *br) { 13053856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("---"); 1306cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1307cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned sync_byte = br->getBits(8); 13086456ae745e919085c5024f784aaa2703f9695f98David Yeh if (sync_byte != 0x47u) { 13096456ae745e919085c5024f784aaa2703f9695f98David Yeh ALOGE("[error] parseTS: return error as sync_byte=0x%x", sync_byte); 13106456ae745e919085c5024f784aaa2703f9695f98David Yeh return BAD_VALUE; 13116456ae745e919085c5024f784aaa2703f9695f98David Yeh } 1312cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 131352668ca838e1869676ff95e7388f93ec1858b1e9Andreas Huber if (br->getBits(1)) { // transport_error_indicator 131452668ca838e1869676ff95e7388f93ec1858b1e9Andreas Huber // silently ignore. 131552668ca838e1869676ff95e7388f93ec1858b1e9Andreas Huber return OK; 131652668ca838e1869676ff95e7388f93ec1858b1e9Andreas Huber } 1317cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1318cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned payload_unit_start_indicator = br->getBits(1); 13193856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("payload_unit_start_indicator = %u", payload_unit_start_indicator); 1320cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 13216e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV("transport_priority = %u", br->getBits(1)); 1322cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1323cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned PID = br->getBits(13); 13243856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("PID = 0x%04x", PID); 1325cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 13266e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV("transport_scrambling_control = %u", br->getBits(2)); 1327cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1328cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned adaptation_field_control = br->getBits(2); 13293856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("adaptation_field_control = %u", adaptation_field_control); 1330cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 13310da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber unsigned continuity_counter = br->getBits(4); 133287f2a558dd12043631e12c361abef301bf603140Andreas Huber ALOGV("PID = 0x%04x, continuity_counter = %u", PID, continuity_counter); 13330da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber 1334df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block // ALOGI("PID = 0x%04x, continuity_counter = %u", PID, continuity_counter); 1335cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1336cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (adaptation_field_control == 2 || adaptation_field_control == 3) { 133787f2a558dd12043631e12c361abef301bf603140Andreas Huber parseAdaptationField(br, PID); 1338cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 1339cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 134087f2a558dd12043631e12c361abef301bf603140Andreas Huber status_t err = OK; 134187f2a558dd12043631e12c361abef301bf603140Andreas Huber 1342cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (adaptation_field_control == 1 || adaptation_field_control == 3) { 134387f2a558dd12043631e12c361abef301bf603140Andreas Huber err = parsePID( 134487f2a558dd12043631e12c361abef301bf603140Andreas Huber br, PID, continuity_counter, payload_unit_start_indicator); 1345cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 134606528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber 134787f2a558dd12043631e12c361abef301bf603140Andreas Huber ++mNumTSPacketsParsed; 134887f2a558dd12043631e12c361abef301bf603140Andreas Huber 134987f2a558dd12043631e12c361abef301bf603140Andreas Huber return err; 1350cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 1351cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1352cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubersp<MediaSource> ATSParser::getSource(SourceType type) { 1353386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber int which = -1; // any 1354386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber 1355cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber for (size_t i = 0; i < mPrograms.size(); ++i) { 1356386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber const sp<Program> &program = mPrograms.editItemAt(i); 1357386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber 1358386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber if (which >= 0 && (int)program->number() != which) { 1359386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber continue; 1360386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber } 1361386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber 1362386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber sp<MediaSource> source = program->getSource(type); 1363cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1364cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (source != NULL) { 1365cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber return source; 1366cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 1367cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 1368cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1369cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber return NULL; 1370cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 1371cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1372bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shihbool ATSParser::hasSource(SourceType type) const { 1373bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih for (size_t i = 0; i < mPrograms.size(); ++i) { 1374bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih const sp<Program> &program = mPrograms.itemAt(i); 1375bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih if (program->hasSource(type)) { 1376bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih return true; 1377bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih } 1378bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih } 1379bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih 1380bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih return false; 1381bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih} 1382bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih 138343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huberbool ATSParser::PTSTimeDeltaEstablished() { 138443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mPrograms.isEmpty()) { 138543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber return false; 138643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 138743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 138843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber return mPrograms.editItemAt(0)->PTSTimeDeltaEstablished(); 138943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber} 139043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 139187f2a558dd12043631e12c361abef301bf603140Andreas Hubervoid ATSParser::updatePCR( 139284333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber unsigned /* PID */, uint64_t PCR, size_t byteOffsetFromStart) { 1393b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross ALOGV("PCR 0x%016" PRIx64 " @ %zu", PCR, byteOffsetFromStart); 139487f2a558dd12043631e12c361abef301bf603140Andreas Huber 139587f2a558dd12043631e12c361abef301bf603140Andreas Huber if (mNumPCRs == 2) { 139687f2a558dd12043631e12c361abef301bf603140Andreas Huber mPCR[0] = mPCR[1]; 139787f2a558dd12043631e12c361abef301bf603140Andreas Huber mPCRBytes[0] = mPCRBytes[1]; 139887f2a558dd12043631e12c361abef301bf603140Andreas Huber mSystemTimeUs[0] = mSystemTimeUs[1]; 139987f2a558dd12043631e12c361abef301bf603140Andreas Huber mNumPCRs = 1; 140087f2a558dd12043631e12c361abef301bf603140Andreas Huber } 140187f2a558dd12043631e12c361abef301bf603140Andreas Huber 140287f2a558dd12043631e12c361abef301bf603140Andreas Huber mPCR[mNumPCRs] = PCR; 140387f2a558dd12043631e12c361abef301bf603140Andreas Huber mPCRBytes[mNumPCRs] = byteOffsetFromStart; 140487f2a558dd12043631e12c361abef301bf603140Andreas Huber mSystemTimeUs[mNumPCRs] = ALooper::GetNowUs(); 140587f2a558dd12043631e12c361abef301bf603140Andreas Huber 140687f2a558dd12043631e12c361abef301bf603140Andreas Huber ++mNumPCRs; 140787f2a558dd12043631e12c361abef301bf603140Andreas Huber 140887f2a558dd12043631e12c361abef301bf603140Andreas Huber if (mNumPCRs == 2) { 140987f2a558dd12043631e12c361abef301bf603140Andreas Huber double transportRate = 141087f2a558dd12043631e12c361abef301bf603140Andreas Huber (mPCRBytes[1] - mPCRBytes[0]) * 27E6 / (mPCR[1] - mPCR[0]); 141187f2a558dd12043631e12c361abef301bf603140Andreas Huber 141287f2a558dd12043631e12c361abef301bf603140Andreas Huber ALOGV("transportRate = %.2f bytes/sec", transportRate); 141387f2a558dd12043631e12c361abef301bf603140Andreas Huber } 141487f2a558dd12043631e12c361abef301bf603140Andreas Huber} 141587f2a558dd12043631e12c361abef301bf603140Andreas Huber 14168dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber//////////////////////////////////////////////////////////////////////////////// 14178dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 14189ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 14199ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim// CRC32 used for PSI section. The table was generated by following command: 14209ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim// $ python pycrc.py --model crc-32-mpeg --algorithm table-driven --generate c 14219ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim// Visit http://www.tty1.net/pycrc/index_en.html for more details. 14229ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kimuint32_t ATSParser::PSISection::CRC_TABLE[] = { 14239ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9, 14249ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x130476dc, 0x17c56b6b, 0x1a864db2, 0x1e475005, 14259ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61, 14269ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd, 14279ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9, 14289ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75, 14299ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011, 14309ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x791d4014, 0x7ddc5da3, 0x709f7b7a, 0x745e66cd, 14319ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039, 14329ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, 14339ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0xbe2b5b58, 0xbaea46ef, 0xb7a96036, 0xb3687d81, 14349ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d, 14359ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49, 14369ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95, 14379ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1, 14389ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, 14399ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x34867077, 0x30476dc0, 0x3d044b19, 0x39c556ae, 14409ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072, 14419ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16, 14429ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca, 14439ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde, 14449ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02, 14459ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x5e9f46bf, 0x5a5e5b08, 0x571d7dd1, 0x53dc6066, 14469ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba, 14479ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, 14489ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0xbfa1b04b, 0xbb60adfc, 0xb6238b25, 0xb2e29692, 14499ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6, 14509ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a, 14519ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e, 14529ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2, 14539ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686, 14549ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0xd5b88683, 0xd1799b34, 0xdc3abded, 0xd8fba05a, 14559ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637, 14569ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb, 14579ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f, 14589ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53, 14599ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47, 14609ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x36194d42, 0x32d850f5, 0x3f9b762c, 0x3b5a6b9b, 14619ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff, 14629ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623, 14639ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0xf12f560e, 0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7, 14649ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b, 14659ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f, 14669ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3, 14679ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7, 14689ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b, 14699ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x9b3660c6, 0x9ff77d71, 0x92b45ba8, 0x9675461f, 14709ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3, 14719ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640, 14729ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c, 14739ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8, 14749ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24, 14759ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x119b4be9, 0x155a565e, 0x18197087, 0x1cd86d30, 14769ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec, 14779ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, 14789ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x2497d08d, 0x2056cd3a, 0x2d15ebe3, 0x29d4f654, 14799ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0, 14809ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c, 14819ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18, 14829ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4, 14839ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0, 14849ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x9abc8bd5, 0x9e7d9662, 0x933eb0bb, 0x97ffad0c, 14859ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668, 14869ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4 14879ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim }; 14889ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 14899ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk KimATSParser::PSISection::PSISection() : 14909ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim mSkipBytes(0) { 14918dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber} 14928dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 14938dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas HuberATSParser::PSISection::~PSISection() { 14948dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber} 14958dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 14968dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberstatus_t ATSParser::PSISection::append(const void *data, size_t size) { 14978dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber if (mBuffer == NULL || mBuffer->size() + size > mBuffer->capacity()) { 14988dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber size_t newCapacity = 14998dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber (mBuffer == NULL) ? size : mBuffer->capacity() + size; 15008dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 15018dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber newCapacity = (newCapacity + 1023) & ~1023; 15028dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 15038dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber sp<ABuffer> newBuffer = new ABuffer(newCapacity); 15048dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 15058dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber if (mBuffer != NULL) { 15068dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber memcpy(newBuffer->data(), mBuffer->data(), mBuffer->size()); 15078dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber newBuffer->setRange(0, mBuffer->size()); 15088dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber } else { 15098dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber newBuffer->setRange(0, 0); 15108dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber } 15118dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 15128dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber mBuffer = newBuffer; 15138dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber } 15148dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 15158dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber memcpy(mBuffer->data() + mBuffer->size(), data, size); 15168dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber mBuffer->setRange(0, mBuffer->size() + size); 15178dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 15188dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber return OK; 15198dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber} 15208dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 15219ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kimvoid ATSParser::PSISection::setSkipBytes(uint8_t skip) { 15229ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim mSkipBytes = skip; 15239ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim} 15249ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 15258dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Hubervoid ATSParser::PSISection::clear() { 15268dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber if (mBuffer != NULL) { 15278dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber mBuffer->setRange(0, 0); 15288dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber } 15299ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim mSkipBytes = 0; 15308dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber} 15318dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 15328dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberbool ATSParser::PSISection::isComplete() const { 15338dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber if (mBuffer == NULL || mBuffer->size() < 3) { 15348dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber return false; 15358dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber } 15368dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 15378dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber unsigned sectionLength = U16_AT(mBuffer->data() + 1) & 0xfff; 15388dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber return mBuffer->size() >= sectionLength + 3; 15398dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber} 15408dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 15418dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberbool ATSParser::PSISection::isEmpty() const { 15428dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber return mBuffer == NULL || mBuffer->size() == 0; 15438dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber} 15448dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 15458dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberconst uint8_t *ATSParser::PSISection::data() const { 15468dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber return mBuffer == NULL ? NULL : mBuffer->data(); 15478dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber} 15488dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 15498dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Hubersize_t ATSParser::PSISection::size() const { 15508dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber return mBuffer == NULL ? 0 : mBuffer->size(); 15518dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber} 15528dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 15539ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kimbool ATSParser::PSISection::isCRCOkay() const { 15549ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim if (!isComplete()) { 15559ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim return false; 15569ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim } 15579ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim uint8_t* data = mBuffer->data(); 15589ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 15599ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim // Return true if section_syntax_indicator says no section follows the field section_length. 15609ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim if ((data[1] & 0x80) == 0) { 15619ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim return true; 15629ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim } 15639ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 15649ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim unsigned sectionLength = U16_AT(data + 1) & 0xfff; 15659ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim ALOGV("sectionLength %u, skip %u", sectionLength, mSkipBytes); 15669ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 15679ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim // Skip the preceding field present when payload start indicator is on. 15689ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim sectionLength -= mSkipBytes; 15699ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 15709ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim uint32_t crc = 0xffffffff; 15719ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim for(unsigned i = 0; i < sectionLength + 4 /* crc */; i++) { 15729ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim uint8_t b = data[i]; 15739ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim int index = ((crc >> 24) ^ (b & 0xff)) & 0xff; 15749ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim crc = CRC_TABLE[index] ^ (crc << 8); 15759ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim } 15769ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim ALOGV("crc: %08x\n", crc); 15779ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim return (crc == 0); 15789ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim} 1579cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} // namespace android 1580