ATSParser.cpp revision d47dfcb5a2e5901c96fc92662cec7aa30f7f8843
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 { 51d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang Program(ATSParser *parser, unsigned programNumber, unsigned programMapPID, 52d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang int64_t lastRecoveredPTS); 53cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 548dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber bool parsePSISection( 558dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber unsigned pid, ABitReader *br, status_t *err); 568dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 57cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber bool parsePID( 5887f2a558dd12043631e12c361abef301bf603140Andreas Huber unsigned pid, unsigned continuity_counter, 5987f2a558dd12043631e12c361abef301bf603140Andreas Huber unsigned payload_unit_start_indicator, 6006528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber ABitReader *br, status_t *err); 61cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 6232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber void signalDiscontinuity( 6332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber DiscontinuityType type, const sp<AMessage> &extra); 6432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 65f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void signalEOS(status_t finalResult); 662a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber 67cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber sp<MediaSource> getSource(SourceType type); 68bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih bool hasSource(SourceType type) const; 69cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 70bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber int64_t convertPTSToTimestamp(uint64_t PTS); 71bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber 7243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber bool PTSTimeDeltaEstablished() const { 7343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber return mFirstPTSValid; 7443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 7543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 76386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber unsigned number() const { return mProgramNumber; } 77386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber 78386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber void updateProgramMapPID(unsigned programMapPID) { 79386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber mProgramMapPID = programMapPID; 80386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber } 81386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber 828dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber unsigned programMapPID() const { 838dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber return mProgramMapPID; 848dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber } 858dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 8687f2a558dd12043631e12c361abef301bf603140Andreas Huber uint32_t parserFlags() const { 8787f2a558dd12043631e12c361abef301bf603140Andreas Huber return mParser->mFlags; 8887f2a558dd12043631e12c361abef301bf603140Andreas Huber } 8987f2a558dd12043631e12c361abef301bf603140Andreas Huber 90cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberprivate: 919bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang struct StreamInfo { 929bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang unsigned mType; 939bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang unsigned mPID; 949bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang }; 959bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang 96f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ATSParser *mParser; 97386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber unsigned mProgramNumber; 98cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned mProgramMapPID; 99cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber KeyedVector<unsigned, sp<Stream> > mStreams; 100bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber bool mFirstPTSValid; 101bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber uint64_t mFirstPTS; 102799c9682b3776a55d234396aee4a302437150c26Chong Zhang int64_t mLastRecoveredPTS; 103cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 10406528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber status_t parseProgramMap(ABitReader *br); 105799c9682b3776a55d234396aee4a302437150c26Chong Zhang int64_t recoverPTS(uint64_t PTS_33bit); 1069bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang bool switchPIDs(const Vector<StreamInfo> &infos); 107cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 108cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(Program); 109cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}; 110cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 111cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberstruct ATSParser::Stream : public RefBase { 11287f2a558dd12043631e12c361abef301bf603140Andreas Huber Stream(Program *program, 11387f2a558dd12043631e12c361abef301bf603140Andreas Huber unsigned elementaryPID, 11487f2a558dd12043631e12c361abef301bf603140Andreas Huber unsigned streamType, 11587f2a558dd12043631e12c361abef301bf603140Andreas Huber unsigned PCR_PID); 116cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 117bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber unsigned type() const { return mStreamType; } 118bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber unsigned pid() const { return mElementaryPID; } 119bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber void setPID(unsigned pid) { mElementaryPID = pid; } 120bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber 1215403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber status_t parse( 12287f2a558dd12043631e12c361abef301bf603140Andreas Huber unsigned continuity_counter, 123cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned payload_unit_start_indicator, 124cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber ABitReader *br); 125cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 12632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber void signalDiscontinuity( 12732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber DiscontinuityType type, const sp<AMessage> &extra); 12832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 129f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void signalEOS(status_t finalResult); 1302a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber 131cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber sp<MediaSource> getSource(SourceType type); 132cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 133bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih bool isAudio() const; 134bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih bool isVideo() const; 135bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih 136cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberprotected: 137cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber virtual ~Stream(); 138cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 139cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberprivate: 140bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber Program *mProgram; 141cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned mElementaryPID; 142cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned mStreamType; 14387f2a558dd12043631e12c361abef301bf603140Andreas Huber unsigned mPCR_PID; 14487f2a558dd12043631e12c361abef301bf603140Andreas Huber int32_t mExpectedContinuityCounter; 145cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 146cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber sp<ABuffer> mBuffer; 147cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber sp<AnotherPacketSource> mSource; 148cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber bool mPayloadStarted; 149cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 15090a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber uint64_t mPrevPTS; 15190a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber 152386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber ElementaryStreamQueue *mQueue; 1536a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber 1545403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber status_t flush(); 1555403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber status_t parsePES(ABitReader *br); 156cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 157cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber void onPayloadData( 158cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned PTS_DTS_flags, uint64_t PTS, uint64_t DTS, 159cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber const uint8_t *data, size_t size); 160cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 16182f7321b03eec1e40af9d681370f754ee0279582Andreas Huber void extractAACFrames(const sp<ABuffer> &buffer); 16282f7321b03eec1e40af9d681370f754ee0279582Andreas Huber 163cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(Stream); 164cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}; 165cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1668dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberstruct ATSParser::PSISection : public RefBase { 1678dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber PSISection(); 1688dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 1698dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber status_t append(const void *data, size_t size); 1708dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber void clear(); 1718dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 1728dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber bool isComplete() const; 1738dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber bool isEmpty() const; 1748dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 1758dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber const uint8_t *data() const; 1768dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber size_t size() const; 1778dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 1788dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberprotected: 1798dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber virtual ~PSISection(); 1808dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 1818dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberprivate: 1828dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber sp<ABuffer> mBuffer; 1838dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 1848dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber DISALLOW_EVIL_CONSTRUCTORS(PSISection); 1858dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber}; 1868dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 187cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber//////////////////////////////////////////////////////////////////////////////// 188cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 189386d609dc513e838c7e7c4c46c604493ccd560beAndreas HuberATSParser::Program::Program( 190d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang ATSParser *parser, unsigned programNumber, unsigned programMapPID, 191d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang int64_t lastRecoveredPTS) 192f933441648ef6a71dee783d733aac17b9508b452Andreas Huber : mParser(parser), 193386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber mProgramNumber(programNumber), 194f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mProgramMapPID(programMapPID), 195bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber mFirstPTSValid(false), 196799c9682b3776a55d234396aee4a302437150c26Chong Zhang mFirstPTS(0), 197d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang mLastRecoveredPTS(lastRecoveredPTS) { 1983856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("new program number %u", programNumber); 199cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 200cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 2018dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberbool ATSParser::Program::parsePSISection( 2028dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber unsigned pid, ABitReader *br, status_t *err) { 20306528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber *err = OK; 20406528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber 2058dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber if (pid != mProgramMapPID) { 2068dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber return false; 2078dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber } 208cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 2098dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber *err = parseProgramMap(br); 21006528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber 2118dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber return true; 2128dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber} 2138dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 2148dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberbool ATSParser::Program::parsePID( 21587f2a558dd12043631e12c361abef301bf603140Andreas Huber unsigned pid, unsigned continuity_counter, 21687f2a558dd12043631e12c361abef301bf603140Andreas Huber unsigned payload_unit_start_indicator, 2178dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber ABitReader *br, status_t *err) { 2188dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber *err = OK; 219cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 220cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber ssize_t index = mStreams.indexOfKey(pid); 221cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (index < 0) { 222cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber return false; 223cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 224cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 2255403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber *err = mStreams.editValueAt(index)->parse( 22687f2a558dd12043631e12c361abef301bf603140Andreas Huber continuity_counter, payload_unit_start_indicator, br); 227cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 228cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber return true; 229cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 230cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 23132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Hubervoid ATSParser::Program::signalDiscontinuity( 23232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber DiscontinuityType type, const sp<AMessage> &extra) { 233b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber int64_t mediaTimeUs; 234b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber if ((type & DISCONTINUITY_TIME) 235b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber && extra != NULL 236b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber && extra->findInt64( 237b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber IStreamListener::kKeyMediaTimeUs, &mediaTimeUs)) { 238b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber mFirstPTSValid = false; 239b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber } 240b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber 2412a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber for (size_t i = 0; i < mStreams.size(); ++i) { 24232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber mStreams.editValueAt(i)->signalDiscontinuity(type, extra); 243f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 244f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 245f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 246f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ATSParser::Program::signalEOS(status_t finalResult) { 247f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (size_t i = 0; i < mStreams.size(); ++i) { 248f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mStreams.editValueAt(i)->signalEOS(finalResult); 2492a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber } 2502a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber} 2512a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber 2529bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhangbool ATSParser::Program::switchPIDs(const Vector<StreamInfo> &infos) { 2539bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang bool success = false; 2549bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang 2559bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang if (mStreams.size() == infos.size()) { 2569bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang // build type->PIDs map for old and new mapping 2579bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang size_t i; 2589bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang KeyedVector<int32_t, Vector<int32_t> > oldType2PIDs, newType2PIDs; 2599bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang for (i = 0; i < mStreams.size(); ++i) { 2609bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang ssize_t index = oldType2PIDs.indexOfKey(mStreams[i]->type()); 2619bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang if (index < 0) { 2629bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang oldType2PIDs.add(mStreams[i]->type(), Vector<int32_t>()); 2639bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang } 2649bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang oldType2PIDs.editValueFor(mStreams[i]->type()).push_back(mStreams[i]->pid()); 2659bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang } 2669bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang for (i = 0; i < infos.size(); ++i) { 2679bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang ssize_t index = newType2PIDs.indexOfKey(infos[i].mType); 2689bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang if (index < 0) { 2699bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang newType2PIDs.add(infos[i].mType, Vector<int32_t>()); 2709bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang } 2719bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang newType2PIDs.editValueFor(infos[i].mType).push_back(infos[i].mPID); 2729bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang } 2739bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang 2749bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang // we can recover if the number of streams for each type hasn't changed 2759bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang if (oldType2PIDs.size() == newType2PIDs.size()) { 2769bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang success = true; 2779bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang for (i = 0; i < oldType2PIDs.size(); ++i) { 2789bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang // KeyedVector is sorted, we just compare key and size of each index 2799bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang if (oldType2PIDs.keyAt(i) != newType2PIDs.keyAt(i) 2809bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang || oldType2PIDs[i].size() != newType2PIDs[i].size()) { 2819bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang success = false; 2829bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang break; 2839bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang } 2849bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang } 2859bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang } 2869bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang 2879bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang if (success) { 2889bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang // save current streams to temp 2899bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang KeyedVector<int32_t, sp<Stream> > temp; 2909bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang for (i = 0; i < mStreams.size(); ++i) { 2919bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang temp.add(mStreams.keyAt(i), mStreams.editValueAt(i)); 2929bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang } 2939bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang 2949bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang mStreams.clear(); 2959bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang for (i = 0; i < temp.size(); ++i) { 2969bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang // The two checks below shouldn't happen, 2979bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang // we already checked above the stream count matches 2989bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang ssize_t index = newType2PIDs.indexOfKey(temp[i]->type()); 2999bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang CHECK(index >= 0); 3009bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang Vector<int32_t> &newPIDs = newType2PIDs.editValueAt(index); 3019bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang CHECK(newPIDs.size() > 0); 3029bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang 3039bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang // get the next PID for temp[i]->type() in the new PID map 3049bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang Vector<int32_t>::iterator it = newPIDs.begin(); 3059bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang 3069bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang // change the PID of the stream, and add it back 3079bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang temp.editValueAt(i)->setPID(*it); 3089bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang mStreams.add(temp[i]->pid(), temp.editValueAt(i)); 3099bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang 3109bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang // removed the used PID 3119bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang newPIDs.erase(it); 3129bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang } 3139bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang } 3149bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang } 3159bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang return success; 3169bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang} 317bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber 31806528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huberstatus_t ATSParser::Program::parseProgramMap(ABitReader *br) { 319cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned table_id = br->getBits(8); 3203856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV(" table_id = %u", table_id); 3216456ae745e919085c5024f784aaa2703f9695f98David Yeh if (table_id != 0x02u) { 3226456ae745e919085c5024f784aaa2703f9695f98David Yeh ALOGE("PMT data error!"); 3236456ae745e919085c5024f784aaa2703f9695f98David Yeh return ERROR_MALFORMED; 3246456ae745e919085c5024f784aaa2703f9695f98David Yeh } 3256e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber unsigned section_syntax_indicator = br->getBits(1); 3263856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV(" section_syntax_indicator = %u", section_syntax_indicator); 3276456ae745e919085c5024f784aaa2703f9695f98David Yeh if (section_syntax_indicator != 1u) { 3286456ae745e919085c5024f784aaa2703f9695f98David Yeh ALOGE("PMT data error!"); 3296456ae745e919085c5024f784aaa2703f9695f98David Yeh return ERROR_MALFORMED; 3306456ae745e919085c5024f784aaa2703f9695f98David Yeh } 331cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 332cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber CHECK_EQ(br->getBits(1), 0u); 3336e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" reserved = %u", br->getBits(2)); 334cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 335cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned section_length = br->getBits(12); 3363856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV(" section_length = %u", section_length); 337f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(section_length & 0xc00, 0u); 338cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber CHECK_LE(section_length, 1021u); 339cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 3406e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" program_number = %u", br->getBits(16)); 3416e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" reserved = %u", br->getBits(2)); 3426e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" version_number = %u", br->getBits(5)); 3436e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" current_next_indicator = %u", br->getBits(1)); 3446e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" section_number = %u", br->getBits(8)); 3456e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" last_section_number = %u", br->getBits(8)); 3466e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" reserved = %u", br->getBits(3)); 34787f2a558dd12043631e12c361abef301bf603140Andreas Huber 34887f2a558dd12043631e12c361abef301bf603140Andreas Huber unsigned PCR_PID = br->getBits(13); 34987f2a558dd12043631e12c361abef301bf603140Andreas Huber ALOGV(" PCR_PID = 0x%04x", PCR_PID); 35087f2a558dd12043631e12c361abef301bf603140Andreas Huber 3516e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" reserved = %u", br->getBits(4)); 352cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 353cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned program_info_length = br->getBits(12); 3543856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV(" program_info_length = %u", program_info_length); 355f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(program_info_length & 0xc00, 0u); 356cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 357cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber br->skipBits(program_info_length * 8); // skip descriptors 358cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 359bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber Vector<StreamInfo> infos; 360bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber 361cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber // infoBytesRemaining is the number of bytes that make up the 362cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber // variable length section of ES_infos. It does not include the 363cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber // final CRC. 364cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber size_t infoBytesRemaining = section_length - 9 - program_info_length - 4; 365cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 366cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber while (infoBytesRemaining > 0) { 367cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber CHECK_GE(infoBytesRemaining, 5u); 368cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 369cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned streamType = br->getBits(8); 3703856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV(" stream_type = 0x%02x", streamType); 371cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 3726e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" reserved = %u", br->getBits(3)); 373cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 374cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned elementaryPID = br->getBits(13); 3753856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV(" elementary_PID = 0x%04x", elementaryPID); 376cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 3776e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" reserved = %u", br->getBits(4)); 378cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 379cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned ES_info_length = br->getBits(12); 3803856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV(" ES_info_length = %u", ES_info_length); 381f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(ES_info_length & 0xc00, 0u); 382cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 383cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber CHECK_GE(infoBytesRemaining - 5, ES_info_length); 384cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 385cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#if 0 386cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber br->skipBits(ES_info_length * 8); // skip descriptors 387cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#else 388cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned info_bytes_remaining = ES_info_length; 389cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber while (info_bytes_remaining >= 2) { 3906e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" tag = 0x%02x", br->getBits(8)); 391cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 392cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned descLength = br->getBits(8); 3933856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV(" len = %u", descLength); 394cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 395cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber CHECK_GE(info_bytes_remaining, 2 + descLength); 396cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 397cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber br->skipBits(descLength * 8); 398cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 399cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber info_bytes_remaining -= descLength + 2; 400cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 401cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber CHECK_EQ(info_bytes_remaining, 0u); 402cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#endif 403cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 404bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber StreamInfo info; 405bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber info.mType = streamType; 406bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber info.mPID = elementaryPID; 407bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber infos.push(info); 408cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 409cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber infoBytesRemaining -= 5 + ES_info_length; 410cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 411cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 412cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber CHECK_EQ(infoBytesRemaining, 0u); 4136e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" CRC = 0x%08x", br->getBits(32)); 414bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber 415bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber bool PIDsChanged = false; 416bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber for (size_t i = 0; i < infos.size(); ++i) { 417bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber StreamInfo &info = infos.editItemAt(i); 418bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber 419bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber ssize_t index = mStreams.indexOfKey(info.mPID); 420bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber 421bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber if (index >= 0 && mStreams.editValueAt(index)->type() != info.mType) { 422df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block ALOGI("uh oh. stream PIDs have changed."); 423bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber PIDsChanged = true; 424bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber break; 425bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber } 426bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber } 427bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber 428bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber if (PIDsChanged) { 42906528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber#if 0 430df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block ALOGI("before:"); 43106528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber for (size_t i = 0; i < mStreams.size(); ++i) { 43206528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber sp<Stream> stream = mStreams.editValueAt(i); 43306528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber 434df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block ALOGI("PID 0x%08x => type 0x%02x", stream->pid(), stream->type()); 43506528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber } 43606528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber 437df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block ALOGI("after:"); 43806528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber for (size_t i = 0; i < infos.size(); ++i) { 43906528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber StreamInfo &info = infos.editItemAt(i); 44006528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber 441df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block ALOGI("PID 0x%08x => type 0x%02x", info.mPID, info.mType); 44206528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber } 44306528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber#endif 44406528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber 4459bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang // we can recover if number of streams for each type remain the same 4469bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang bool success = switchPIDs(infos); 44706528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber 44806528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber if (!success) { 449df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block ALOGI("Stream PIDs changed and we cannot recover."); 45006528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber return ERROR_MALFORMED; 45106528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber } 452bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber } 453bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber 454bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber for (size_t i = 0; i < infos.size(); ++i) { 455bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber StreamInfo &info = infos.editItemAt(i); 456bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber 457bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber ssize_t index = mStreams.indexOfKey(info.mPID); 458bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber 459bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber if (index < 0) { 46087f2a558dd12043631e12c361abef301bf603140Andreas Huber sp<Stream> stream = new Stream( 46187f2a558dd12043631e12c361abef301bf603140Andreas Huber this, info.mPID, info.mType, PCR_PID); 46287f2a558dd12043631e12c361abef301bf603140Andreas Huber 463bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber mStreams.add(info.mPID, stream); 464bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber } 465bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber } 46606528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber 46706528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber return OK; 468cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 469cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 470799c9682b3776a55d234396aee4a302437150c26Chong Zhangint64_t ATSParser::Program::recoverPTS(uint64_t PTS_33bit) { 471799c9682b3776a55d234396aee4a302437150c26Chong Zhang // We only have the lower 33-bit of the PTS. It could overflow within a 472799c9682b3776a55d234396aee4a302437150c26Chong Zhang // reasonable amount of time. To handle the wrap-around, use fancy math 473799c9682b3776a55d234396aee4a302437150c26Chong Zhang // to get an extended PTS that is within [-0xffffffff, 0xffffffff] 474799c9682b3776a55d234396aee4a302437150c26Chong Zhang // of the latest recovered PTS. 4759bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang if (mLastRecoveredPTS < 0ll) { 4769bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang // Use the original 33bit number for 1st frame, the reason is that 4779bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang // if 1st frame wraps to negative that's far away from 0, we could 4789bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang // never start. Only start wrapping around from 2nd frame. 4799bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang mLastRecoveredPTS = static_cast<int64_t>(PTS_33bit); 4809bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang } else { 4819bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang mLastRecoveredPTS = static_cast<int64_t>( 4829bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang ((mLastRecoveredPTS - PTS_33bit + 0x100000000ll) 4839bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang & 0xfffffffe00000000ull) | PTS_33bit); 4849bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang // We start from 0, but recovered PTS could be slightly below 0. 4859bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang // Clamp it to 0 as rest of the pipeline doesn't take negative pts. 4869bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang // (eg. video is read first and starts at 0, but audio starts at 0xfffffff0) 4879bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang if (mLastRecoveredPTS < 0ll) { 4885c9054bc6efc080b265e028f2ebb1abd2a2e3953Chih-Hung Hsieh ALOGI("Clamping negative recovered PTS (%" PRId64 ") to 0", mLastRecoveredPTS); 4899bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang mLastRecoveredPTS = 0ll; 4909bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang } 4919bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang } 4929bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang 4939bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang return mLastRecoveredPTS; 494799c9682b3776a55d234396aee4a302437150c26Chong Zhang} 495799c9682b3776a55d234396aee4a302437150c26Chong Zhang 496cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubersp<MediaSource> ATSParser::Program::getSource(SourceType type) { 497386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber size_t index = (type == AUDIO) ? 0 : 0; 498decd96988e495133e4a1728f612d4c9fdb4d218eAndreas Huber 499cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber for (size_t i = 0; i < mStreams.size(); ++i) { 500cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber sp<MediaSource> source = mStreams.editValueAt(i)->getSource(type); 501cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (source != NULL) { 502decd96988e495133e4a1728f612d4c9fdb4d218eAndreas Huber if (index == 0) { 503decd96988e495133e4a1728f612d4c9fdb4d218eAndreas Huber return source; 504decd96988e495133e4a1728f612d4c9fdb4d218eAndreas Huber } 505decd96988e495133e4a1728f612d4c9fdb4d218eAndreas Huber --index; 506cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 507cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 508cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 509cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber return NULL; 510cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 511cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 512bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shihbool ATSParser::Program::hasSource(SourceType type) const { 513bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih for (size_t i = 0; i < mStreams.size(); ++i) { 514bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih const sp<Stream> &stream = mStreams.valueAt(i); 515bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih if (type == AUDIO && stream->isAudio()) { 516bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih return true; 517bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih } else if (type == VIDEO && stream->isVideo()) { 518bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih return true; 519bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih } 520bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih } 521bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih 522bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih return false; 523bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih} 524bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih 525bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huberint64_t ATSParser::Program::convertPTSToTimestamp(uint64_t PTS) { 526799c9682b3776a55d234396aee4a302437150c26Chong Zhang PTS = recoverPTS(PTS); 527799c9682b3776a55d234396aee4a302437150c26Chong Zhang 528c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber if (!(mParser->mFlags & TS_TIMESTAMPS_ARE_ABSOLUTE)) { 529c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber if (!mFirstPTSValid) { 530c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber mFirstPTSValid = true; 531c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber mFirstPTS = PTS; 532c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber PTS = 0; 533c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber } else if (PTS < mFirstPTS) { 534c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber PTS = 0; 535c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber } else { 536c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber PTS -= mFirstPTS; 537c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber } 538bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber } 539bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber 54087f2a558dd12043631e12c361abef301bf603140Andreas Huber int64_t timeUs = (PTS * 100) / 9; 54187f2a558dd12043631e12c361abef301bf603140Andreas Huber 54287f2a558dd12043631e12c361abef301bf603140Andreas Huber if (mParser->mAbsoluteTimeAnchorUs >= 0ll) { 54387f2a558dd12043631e12c361abef301bf603140Andreas Huber timeUs += mParser->mAbsoluteTimeAnchorUs; 54487f2a558dd12043631e12c361abef301bf603140Andreas Huber } 54587f2a558dd12043631e12c361abef301bf603140Andreas Huber 546d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber if (mParser->mTimeOffsetValid) { 547d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber timeUs += mParser->mTimeOffsetUs; 548d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber } 549d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber 55087f2a558dd12043631e12c361abef301bf603140Andreas Huber return timeUs; 551bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber} 552bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber 553cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber//////////////////////////////////////////////////////////////////////////////// 554cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 555bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas HuberATSParser::Stream::Stream( 55687f2a558dd12043631e12c361abef301bf603140Andreas Huber Program *program, 55787f2a558dd12043631e12c361abef301bf603140Andreas Huber unsigned elementaryPID, 55887f2a558dd12043631e12c361abef301bf603140Andreas Huber unsigned streamType, 55987f2a558dd12043631e12c361abef301bf603140Andreas Huber unsigned PCR_PID) 560bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber : mProgram(program), 561bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber mElementaryPID(elementaryPID), 562cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber mStreamType(streamType), 56387f2a558dd12043631e12c361abef301bf603140Andreas Huber mPCR_PID(PCR_PID), 56487f2a558dd12043631e12c361abef301bf603140Andreas Huber mExpectedContinuityCounter(-1), 5656a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber mPayloadStarted(false), 56690a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber mPrevPTS(0), 567386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber mQueue(NULL) { 568386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber switch (mStreamType) { 569386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber case STREAMTYPE_H264: 57087f2a558dd12043631e12c361abef301bf603140Andreas Huber mQueue = new ElementaryStreamQueue( 57187f2a558dd12043631e12c361abef301bf603140Andreas Huber ElementaryStreamQueue::H264, 57287f2a558dd12043631e12c361abef301bf603140Andreas Huber (mProgram->parserFlags() & ALIGNED_VIDEO_DATA) 57387f2a558dd12043631e12c361abef301bf603140Andreas Huber ? ElementaryStreamQueue::kFlag_AlignedData : 0); 574386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber break; 5756e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber case STREAMTYPE_MPEG2_AUDIO_ADTS: 576386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber mQueue = new ElementaryStreamQueue(ElementaryStreamQueue::AAC); 577386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber break; 578386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber case STREAMTYPE_MPEG1_AUDIO: 579386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber case STREAMTYPE_MPEG2_AUDIO: 580386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber mQueue = new ElementaryStreamQueue( 581386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber ElementaryStreamQueue::MPEG_AUDIO); 582386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber break; 583386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber 584386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber case STREAMTYPE_MPEG1_VIDEO: 585386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber case STREAMTYPE_MPEG2_VIDEO: 586386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber mQueue = new ElementaryStreamQueue( 587386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber ElementaryStreamQueue::MPEG_VIDEO); 588386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber break; 589386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber 590386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber case STREAMTYPE_MPEG4_VIDEO: 591386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber mQueue = new ElementaryStreamQueue( 592386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber ElementaryStreamQueue::MPEG4_VIDEO); 593386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber break; 594386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber 5959bf32f06e8971c1d3eb4fc5edd74b69557f97212Chong Zhang case STREAMTYPE_LPCM_AC3: 596d3c079ae9859011d118f94616d0069c2987013edChangwan Ryu case STREAMTYPE_AC3: 597d3c079ae9859011d118f94616d0069c2987013edChangwan Ryu mQueue = new ElementaryStreamQueue( 598d3c079ae9859011d118f94616d0069c2987013edChangwan Ryu ElementaryStreamQueue::AC3); 599d3c079ae9859011d118f94616d0069c2987013edChangwan Ryu break; 600d3c079ae9859011d118f94616d0069c2987013edChangwan Ryu 601386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber default: 602386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber break; 603386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber } 604386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber 6053856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("new stream PID 0x%02x, type 0x%02x", elementaryPID, streamType); 60618ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber 60718ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber if (mQueue != NULL) { 60818ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber mBuffer = new ABuffer(192 * 1024); 60918ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber mBuffer->setRange(0, 0); 61018ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber } 611cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 612cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 613cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas HuberATSParser::Stream::~Stream() { 614386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber delete mQueue; 615386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber mQueue = NULL; 616cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 617cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 6185403129e2a2f44620f2ac8109889e5a61be08732Andreas Huberstatus_t ATSParser::Stream::parse( 61987f2a558dd12043631e12c361abef301bf603140Andreas Huber unsigned continuity_counter, 620cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned payload_unit_start_indicator, ABitReader *br) { 62118ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber if (mQueue == NULL) { 6225403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber return OK; 62318ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber } 62418ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber 62587f2a558dd12043631e12c361abef301bf603140Andreas Huber if (mExpectedContinuityCounter >= 0 62687f2a558dd12043631e12c361abef301bf603140Andreas Huber && (unsigned)mExpectedContinuityCounter != continuity_counter) { 62787f2a558dd12043631e12c361abef301bf603140Andreas Huber ALOGI("discontinuity on stream pid 0x%04x", mElementaryPID); 62887f2a558dd12043631e12c361abef301bf603140Andreas Huber 62987f2a558dd12043631e12c361abef301bf603140Andreas Huber mPayloadStarted = false; 63087f2a558dd12043631e12c361abef301bf603140Andreas Huber mBuffer->setRange(0, 0); 63187f2a558dd12043631e12c361abef301bf603140Andreas Huber mExpectedContinuityCounter = -1; 63287f2a558dd12043631e12c361abef301bf603140Andreas Huber 63394a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber#if 0 63494a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber // Uncomment this if you'd rather see no corruption whatsoever on 63594a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber // screen and suspend updates until we come across another IDR frame. 63694a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber 63794a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber if (mStreamType == STREAMTYPE_H264) { 63894a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber ALOGI("clearing video queue"); 63994a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber mQueue->clear(true /* clearFormat */); 64094a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber } 64194a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber#endif 64294a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber 64366830855846db5c211c2da6c055ca9b4167e8974Chong Zhang if (!payload_unit_start_indicator) { 64466830855846db5c211c2da6c055ca9b4167e8974Chong Zhang return OK; 64566830855846db5c211c2da6c055ca9b4167e8974Chong Zhang } 64687f2a558dd12043631e12c361abef301bf603140Andreas Huber } 64787f2a558dd12043631e12c361abef301bf603140Andreas Huber 64887f2a558dd12043631e12c361abef301bf603140Andreas Huber mExpectedContinuityCounter = (continuity_counter + 1) & 0x0f; 64987f2a558dd12043631e12c361abef301bf603140Andreas Huber 650cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (payload_unit_start_indicator) { 651cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (mPayloadStarted) { 652cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber // Otherwise we run the danger of receiving the trailing bytes 653cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber // of a PES packet that we never saw the start of and assuming 654cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber // we have a a complete PES packet. 655cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 6565403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber status_t err = flush(); 6575403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber 6585403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber if (err != OK) { 6595403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber return err; 6605403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber } 661cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 662cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 663cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber mPayloadStarted = true; 664cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 665cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 666cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (!mPayloadStarted) { 6675403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber return OK; 668cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 669cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 670cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber size_t payloadSizeBits = br->numBitsLeft(); 671f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(payloadSizeBits % 8, 0u); 672cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 6733e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber size_t neededSize = mBuffer->size() + payloadSizeBits / 8; 6743e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber if (mBuffer->capacity() < neededSize) { 6753e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber // Increment in multiples of 64K. 6763e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber neededSize = (neededSize + 65535) & ~65535; 6773e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber 678b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross ALOGI("resizing buffer to %zu bytes", neededSize); 6793e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber 6803e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber sp<ABuffer> newBuffer = new ABuffer(neededSize); 6813e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber memcpy(newBuffer->data(), mBuffer->data(), mBuffer->size()); 6823e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber newBuffer->setRange(0, mBuffer->size()); 6833e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber mBuffer = newBuffer; 6843e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber } 685cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 686cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber memcpy(mBuffer->data() + mBuffer->size(), br->data(), payloadSizeBits / 8); 687cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber mBuffer->setRange(0, mBuffer->size() + payloadSizeBits / 8); 6885403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber 6895403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber return OK; 690cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 691cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 6926e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huberbool ATSParser::Stream::isVideo() const { 6936e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber switch (mStreamType) { 6946e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber case STREAMTYPE_H264: 6956e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber case STREAMTYPE_MPEG1_VIDEO: 6966e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber case STREAMTYPE_MPEG2_VIDEO: 6976e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber case STREAMTYPE_MPEG4_VIDEO: 6986e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber return true; 6996e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 7006e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber default: 7016e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber return false; 7026e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } 7036e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber} 7046e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 7056e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huberbool ATSParser::Stream::isAudio() const { 7066e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber switch (mStreamType) { 7076e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber case STREAMTYPE_MPEG1_AUDIO: 7086e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber case STREAMTYPE_MPEG2_AUDIO: 7096e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber case STREAMTYPE_MPEG2_AUDIO_ADTS: 7109bf32f06e8971c1d3eb4fc5edd74b69557f97212Chong Zhang case STREAMTYPE_LPCM_AC3: 711d3c079ae9859011d118f94616d0069c2987013edChangwan Ryu case STREAMTYPE_AC3: 7126e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber return true; 7136e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 7146e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber default: 7156e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber return false; 7166e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } 7176e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber} 7186e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 71932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Hubervoid ATSParser::Stream::signalDiscontinuity( 72032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber DiscontinuityType type, const sp<AMessage> &extra) { 7210389cc09f7b90f155a8942a0d2e1925cad1dbe2dMarco Nelissen mExpectedContinuityCounter = -1; 7220389cc09f7b90f155a8942a0d2e1925cad1dbe2dMarco Nelissen 72318ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber if (mQueue == NULL) { 72418ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber return; 72518ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber } 72618ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber 7272a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber mPayloadStarted = false; 7282a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber mBuffer->setRange(0, 0); 7292a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber 7306e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber bool clearFormat = false; 7316e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (isAudio()) { 7326e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (type & DISCONTINUITY_AUDIO_FORMAT) { 7336e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber clearFormat = true; 7346e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } 7356e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } else { 7366e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (type & DISCONTINUITY_VIDEO_FORMAT) { 7376e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber clearFormat = true; 7386e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } 7396e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } 740f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 7416e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber mQueue->clear(clearFormat); 74232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 7436e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (type & DISCONTINUITY_TIME) { 7446e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber uint64_t resumeAtPTS; 7456e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (extra != NULL 7466e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber && extra->findInt64( 7476e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber IStreamListener::kKeyResumeAtPTS, 7486e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber (int64_t *)&resumeAtPTS)) { 7496e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber int64_t resumeAtMediaTimeUs = 7506e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber mProgram->convertPTSToTimestamp(resumeAtPTS); 75132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 752c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia extra->setInt64("resume-at-mediaTimeUs", resumeAtMediaTimeUs); 753e332a9181cf6a3155ed1a0fd2afc212ccb1f2753Andreas Huber } 7546e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } 755f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 7566e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (mSource != NULL) { 757632740c58119a132ce19f6d498e39c5c3773971aChong Zhang mSource->queueDiscontinuity(type, extra, true); 758bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber } 759f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 760bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber 761f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ATSParser::Stream::signalEOS(status_t finalResult) { 762f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mSource != NULL) { 763f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mSource->signalEOS(finalResult); 7642a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber } 7652a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber} 7662a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber 7675403129e2a2f44620f2ac8109889e5a61be08732Andreas Huberstatus_t ATSParser::Stream::parsePES(ABitReader *br) { 768cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned packet_startcode_prefix = br->getBits(24); 769cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 7703856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("packet_startcode_prefix = 0x%08x", packet_startcode_prefix); 771cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 772386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber if (packet_startcode_prefix != 1) { 7733856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Supposedly payload_unit_start=1 unit does not start " 774386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber "with startcode."); 7755403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber 7765403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber return ERROR_MALFORMED; 777386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber } 778386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber 779cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber CHECK_EQ(packet_startcode_prefix, 0x000001u); 780cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 781cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned stream_id = br->getBits(8); 7823856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("stream_id = 0x%02x", stream_id); 783cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 784cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned PES_packet_length = br->getBits(16); 7853856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("PES_packet_length = %u", PES_packet_length); 786cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 787cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (stream_id != 0xbc // program_stream_map 788cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber && stream_id != 0xbe // padding_stream 789cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber && stream_id != 0xbf // private_stream_2 790cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber && stream_id != 0xf0 // ECM 791cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber && stream_id != 0xf1 // EMM 792cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber && stream_id != 0xff // program_stream_directory 793cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber && stream_id != 0xf2 // DSMCC 794cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber && stream_id != 0xf8) { // H.222.1 type E 795cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber CHECK_EQ(br->getBits(2), 2u); 796cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 7976e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV("PES_scrambling_control = %u", br->getBits(2)); 7986e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV("PES_priority = %u", br->getBits(1)); 7996e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV("data_alignment_indicator = %u", br->getBits(1)); 8006e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV("copyright = %u", br->getBits(1)); 8016e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV("original_or_copy = %u", br->getBits(1)); 802cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 803cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned PTS_DTS_flags = br->getBits(2); 8043856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("PTS_DTS_flags = %u", PTS_DTS_flags); 805cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 806cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned ESCR_flag = br->getBits(1); 8073856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("ESCR_flag = %u", ESCR_flag); 808cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 809cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned ES_rate_flag = br->getBits(1); 8103856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("ES_rate_flag = %u", ES_rate_flag); 811cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 812cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned DSM_trick_mode_flag = br->getBits(1); 8133856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("DSM_trick_mode_flag = %u", DSM_trick_mode_flag); 814cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 815cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned additional_copy_info_flag = br->getBits(1); 8163856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("additional_copy_info_flag = %u", additional_copy_info_flag); 817cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 8186e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV("PES_CRC_flag = %u", br->getBits(1)); 8196e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV("PES_extension_flag = %u", br->getBits(1)); 820cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 821cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned PES_header_data_length = br->getBits(8); 8223856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("PES_header_data_length = %u", PES_header_data_length); 823cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 824cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned optional_bytes_remaining = PES_header_data_length; 825cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 826cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber uint64_t PTS = 0, DTS = 0; 827cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 828cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (PTS_DTS_flags == 2 || PTS_DTS_flags == 3) { 829cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber CHECK_GE(optional_bytes_remaining, 5u); 830cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 8316456ae745e919085c5024f784aaa2703f9695f98David Yeh if (br->getBits(4) != PTS_DTS_flags) { 8326456ae745e919085c5024f784aaa2703f9695f98David Yeh ALOGE("PES data Error!"); 8336456ae745e919085c5024f784aaa2703f9695f98David Yeh return ERROR_MALFORMED; 8346456ae745e919085c5024f784aaa2703f9695f98David Yeh } 835cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber PTS = ((uint64_t)br->getBits(3)) << 30; 836cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber CHECK_EQ(br->getBits(1), 1u); 837cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber PTS |= ((uint64_t)br->getBits(15)) << 15; 838cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber CHECK_EQ(br->getBits(1), 1u); 839cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber PTS |= br->getBits(15); 840cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber CHECK_EQ(br->getBits(1), 1u); 841cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 842b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross ALOGV("PTS = 0x%016" PRIx64 " (%.2f)", PTS, PTS / 90000.0); 843cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 844cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber optional_bytes_remaining -= 5; 845cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 846cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (PTS_DTS_flags == 3) { 847cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber CHECK_GE(optional_bytes_remaining, 5u); 848cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 849cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber CHECK_EQ(br->getBits(4), 1u); 850cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 851cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber DTS = ((uint64_t)br->getBits(3)) << 30; 852cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber CHECK_EQ(br->getBits(1), 1u); 853cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber DTS |= ((uint64_t)br->getBits(15)) << 15; 854cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber CHECK_EQ(br->getBits(1), 1u); 855cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber DTS |= br->getBits(15); 856cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber CHECK_EQ(br->getBits(1), 1u); 857cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 858b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross ALOGV("DTS = %" PRIu64, DTS); 859cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 860cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber optional_bytes_remaining -= 5; 861cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 862cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 863cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 864cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (ESCR_flag) { 865cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber CHECK_GE(optional_bytes_remaining, 6u); 866cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 867cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber br->getBits(2); 868cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 869cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber uint64_t ESCR = ((uint64_t)br->getBits(3)) << 30; 870cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber CHECK_EQ(br->getBits(1), 1u); 871cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber ESCR |= ((uint64_t)br->getBits(15)) << 15; 872cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber CHECK_EQ(br->getBits(1), 1u); 873cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber ESCR |= br->getBits(15); 874cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber CHECK_EQ(br->getBits(1), 1u); 875cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 876b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross ALOGV("ESCR = %" PRIu64, ESCR); 8776e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV("ESCR_extension = %u", br->getBits(9)); 878cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 879cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber CHECK_EQ(br->getBits(1), 1u); 880cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 881cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber optional_bytes_remaining -= 6; 882cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 883cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 884cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (ES_rate_flag) { 885cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber CHECK_GE(optional_bytes_remaining, 3u); 886cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 887cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber CHECK_EQ(br->getBits(1), 1u); 8886e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV("ES_rate = %u", br->getBits(22)); 889cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber CHECK_EQ(br->getBits(1), 1u); 890cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 891cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber optional_bytes_remaining -= 3; 892cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 893cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 894cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber br->skipBits(optional_bytes_remaining * 8); 895cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 896cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber // ES data follows. 897cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 898cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (PES_packet_length != 0) { 899cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber CHECK_GE(PES_packet_length, PES_header_data_length + 3); 900cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 901cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned dataLength = 902cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber PES_packet_length - 3 - PES_header_data_length; 903cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 9045403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber if (br->numBitsLeft() < dataLength * 8) { 90529357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("PES packet does not carry enough data to contain " 906b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross "payload. (numBitsLeft = %zu, required = %u)", 9075403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber br->numBitsLeft(), dataLength * 8); 9085403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber 9095403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber return ERROR_MALFORMED; 9105403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber } 9115403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber 9120da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber CHECK_GE(br->numBitsLeft(), dataLength * 8); 9130da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber 9140da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber onPayloadData( 9150da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber PTS_DTS_flags, PTS, DTS, br->data(), dataLength); 916cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 917cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber br->skipBits(dataLength * 8); 918cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } else { 9190da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber onPayloadData( 9200da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber PTS_DTS_flags, PTS, DTS, 9210da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber br->data(), br->numBitsLeft() / 8); 9220da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber 923cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber size_t payloadSizeBits = br->numBitsLeft(); 924f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(payloadSizeBits % 8, 0u); 925cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 926b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross ALOGV("There's %zu bytes of payload.", payloadSizeBits / 8); 927cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 928cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } else if (stream_id == 0xbe) { // padding_stream 929cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber CHECK_NE(PES_packet_length, 0u); 930cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber br->skipBits(PES_packet_length * 8); 931cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } else { 932cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber CHECK_NE(PES_packet_length, 0u); 933cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber br->skipBits(PES_packet_length * 8); 934cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 9355403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber 9365403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber return OK; 937cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 938cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 9395403129e2a2f44620f2ac8109889e5a61be08732Andreas Huberstatus_t ATSParser::Stream::flush() { 940cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (mBuffer->size() == 0) { 9415403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber return OK; 942cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 943cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 944b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross ALOGV("flushing stream 0x%04x size = %zu", mElementaryPID, mBuffer->size()); 945cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 946cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber ABitReader br(mBuffer->data(), mBuffer->size()); 9475403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber 9485403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber status_t err = parsePES(&br); 949cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 950cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber mBuffer->setRange(0, 0); 9515403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber 9525403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber return err; 953cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 954cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 955cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubervoid ATSParser::Stream::onPayloadData( 95684333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber unsigned PTS_DTS_flags, uint64_t PTS, uint64_t /* DTS */, 957cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber const uint8_t *data, size_t size) { 95890a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber#if 0 95990a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber ALOGI("payload streamType 0x%02x, PTS = 0x%016llx, dPTS = %lld", 96090a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber mStreamType, 96190a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber PTS, 96290a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber (int64_t)PTS - mPrevPTS); 96390a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber mPrevPTS = PTS; 96490a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber#endif 96590a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber 9663856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("onPayloadData mStreamType=0x%02x", mStreamType); 967cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 96898a46cf165d8de3779874eba01803bbc485f45b9Andreas Huber int64_t timeUs = 0ll; // no presentation timestamp available. 96998a46cf165d8de3779874eba01803bbc485f45b9Andreas Huber if (PTS_DTS_flags == 2 || PTS_DTS_flags == 3) { 97098a46cf165d8de3779874eba01803bbc485f45b9Andreas Huber timeUs = mProgram->convertPTSToTimestamp(PTS); 97198a46cf165d8de3779874eba01803bbc485f45b9Andreas Huber } 97282f7321b03eec1e40af9d681370f754ee0279582Andreas Huber 973386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber status_t err = mQueue->appendData(data, size, timeUs); 974decd96988e495133e4a1728f612d4c9fdb4d218eAndreas Huber 975decd96988e495133e4a1728f612d4c9fdb4d218eAndreas Huber if (err != OK) { 976decd96988e495133e4a1728f612d4c9fdb4d218eAndreas Huber return; 977decd96988e495133e4a1728f612d4c9fdb4d218eAndreas Huber } 97882f7321b03eec1e40af9d681370f754ee0279582Andreas Huber 9796a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber sp<ABuffer> accessUnit; 980386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber while ((accessUnit = mQueue->dequeueAccessUnit()) != NULL) { 9816a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber if (mSource == NULL) { 982386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber sp<MetaData> meta = mQueue->getFormat(); 98382f7321b03eec1e40af9d681370f754ee0279582Andreas Huber 9846a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber if (meta != NULL) { 9853856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Stream PID 0x%08x of type 0x%02x now has data.", 986386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber mElementaryPID, mStreamType); 987386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber 988309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih const char *mime; 989309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih if (meta->findCString(kKeyMIMEType, &mime) 990309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih && !strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_AVC) 991309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih && !IsIDR(accessUnit)) { 992309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih continue; 993309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih } 9946a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber mSource = new AnotherPacketSource(meta); 9956a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber mSource->queueAccessUnit(accessUnit); 99682f7321b03eec1e40af9d681370f754ee0279582Andreas Huber } 997386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber } else if (mQueue->getFormat() != NULL) { 9982a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber // After a discontinuity we invalidate the queue's format 9992a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber // and won't enqueue any access units to the source until 10002a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber // the queue has reestablished the new format. 10015bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 10025bc087c573c70c84c6a39946457590b42d392a33Andreas Huber if (mSource->getFormat() == NULL) { 1003386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber mSource->setFormat(mQueue->getFormat()); 10045bc087c573c70c84c6a39946457590b42d392a33Andreas Huber } 10056a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber mSource->queueAccessUnit(accessUnit); 100682f7321b03eec1e40af9d681370f754ee0279582Andreas Huber } 100782f7321b03eec1e40af9d681370f754ee0279582Andreas Huber } 100882f7321b03eec1e40af9d681370f754ee0279582Andreas Huber} 100982f7321b03eec1e40af9d681370f754ee0279582Andreas Huber 1010cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubersp<MediaSource> ATSParser::Stream::getSource(SourceType type) { 1011386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber switch (type) { 1012386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber case VIDEO: 1013386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber { 10146e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (isVideo()) { 1015386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber return mSource; 1016386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber } 1017386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber break; 1018386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber } 1019386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber 1020386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber case AUDIO: 1021386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber { 10226e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (isAudio()) { 1023386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber return mSource; 1024386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber } 1025386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber break; 1026386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber } 1027386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber 1028386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber default: 1029386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber break; 1030cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 1031cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1032cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber return NULL; 1033cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 1034cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1035cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber//////////////////////////////////////////////////////////////////////////////// 1036cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1037c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas HuberATSParser::ATSParser(uint32_t flags) 103887f2a558dd12043631e12c361abef301bf603140Andreas Huber : mFlags(flags), 103987f2a558dd12043631e12c361abef301bf603140Andreas Huber mAbsoluteTimeAnchorUs(-1ll), 1040d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber mTimeOffsetValid(false), 1041d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber mTimeOffsetUs(0ll), 1042d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang mLastRecoveredPTS(-1ll), 104387f2a558dd12043631e12c361abef301bf603140Andreas Huber mNumTSPacketsParsed(0), 104487f2a558dd12043631e12c361abef301bf603140Andreas Huber mNumPCRs(0) { 10458dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber mPSISections.add(0 /* PID */, new PSISection); 1046cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 1047cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1048cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas HuberATSParser::~ATSParser() { 1049cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 1050cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 105106528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huberstatus_t ATSParser::feedTSPacket(const void *data, size_t size) { 1052cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber CHECK_EQ(size, kTSPacketSize); 1053cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1054cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber ABitReader br((const uint8_t *)data, kTSPacketSize); 105506528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber return parseTS(&br); 1056cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 1057cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 105832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Hubervoid ATSParser::signalDiscontinuity( 105932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber DiscontinuityType type, const sp<AMessage> &extra) { 1060b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber int64_t mediaTimeUs; 1061d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang if ((type & DISCONTINUITY_TIME) && extra != NULL) { 1062d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang if (extra->findInt64(IStreamListener::kKeyMediaTimeUs, &mediaTimeUs)) { 1063d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang mAbsoluteTimeAnchorUs = mediaTimeUs; 1064d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang } 1065d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang if ((mFlags & TS_TIMESTAMPS_ARE_ABSOLUTE) 1066d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang && extra->findInt64( 1067d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang IStreamListener::kKeyRecentMediaTimeUs, &mediaTimeUs)) { 1068d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang if (mAbsoluteTimeAnchorUs >= 0ll) { 1069d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang mediaTimeUs -= mAbsoluteTimeAnchorUs; 1070d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang } 1071d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang if (mTimeOffsetValid) { 1072d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang mediaTimeUs -= mTimeOffsetUs; 1073d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang } 1074d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang mLastRecoveredPTS = (mediaTimeUs * 9) / 100; 1075d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang } 1076b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber } else if (type == DISCONTINUITY_ABSOLUTE_TIME) { 107787f2a558dd12043631e12c361abef301bf603140Andreas Huber int64_t timeUs; 107887f2a558dd12043631e12c361abef301bf603140Andreas Huber CHECK(extra->findInt64("timeUs", &timeUs)); 107987f2a558dd12043631e12c361abef301bf603140Andreas Huber 108087f2a558dd12043631e12c361abef301bf603140Andreas Huber CHECK(mPrograms.empty()); 108187f2a558dd12043631e12c361abef301bf603140Andreas Huber mAbsoluteTimeAnchorUs = timeUs; 108287f2a558dd12043631e12c361abef301bf603140Andreas Huber return; 1083d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber } else if (type == DISCONTINUITY_TIME_OFFSET) { 1084d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber int64_t offset; 1085d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber CHECK(extra->findInt64("offset", &offset)); 1086d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber 1087d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber mTimeOffsetValid = true; 1088d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber mTimeOffsetUs = offset; 1089d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber return; 109087f2a558dd12043631e12c361abef301bf603140Andreas Huber } 109187f2a558dd12043631e12c361abef301bf603140Andreas Huber 1092f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (size_t i = 0; i < mPrograms.size(); ++i) { 109332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber mPrograms.editItemAt(i)->signalDiscontinuity(type, extra); 1094f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1095f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1096f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1097f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ATSParser::signalEOS(status_t finalResult) { 1098f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_NE(finalResult, (status_t)OK); 1099f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 11002a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber for (size_t i = 0; i < mPrograms.size(); ++i) { 1101f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mPrograms.editItemAt(i)->signalEOS(finalResult); 11022a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber } 11032a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber} 11042a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber 1105cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubervoid ATSParser::parseProgramAssociationTable(ABitReader *br) { 1106cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned table_id = br->getBits(8); 11073856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV(" table_id = %u", table_id); 11086456ae745e919085c5024f784aaa2703f9695f98David Yeh if (table_id != 0x00u) { 11096456ae745e919085c5024f784aaa2703f9695f98David Yeh ALOGE("PAT data error!"); 11106456ae745e919085c5024f784aaa2703f9695f98David Yeh return ; 11116456ae745e919085c5024f784aaa2703f9695f98David Yeh } 1112cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned section_syntax_indictor = br->getBits(1); 11133856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV(" section_syntax_indictor = %u", section_syntax_indictor); 1114cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber CHECK_EQ(section_syntax_indictor, 1u); 1115cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1116cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber CHECK_EQ(br->getBits(1), 0u); 11176e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" reserved = %u", br->getBits(2)); 1118cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1119cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned section_length = br->getBits(12); 11203856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV(" section_length = %u", section_length); 1121f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(section_length & 0xc00, 0u); 1122cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 11236e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" transport_stream_id = %u", br->getBits(16)); 11246e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" reserved = %u", br->getBits(2)); 11256e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" version_number = %u", br->getBits(5)); 11266e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" current_next_indicator = %u", br->getBits(1)); 11276e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" section_number = %u", br->getBits(8)); 11286e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" last_section_number = %u", br->getBits(8)); 1129cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1130cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber size_t numProgramBytes = (section_length - 5 /* header */ - 4 /* crc */); 1131cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber CHECK_EQ((numProgramBytes % 4), 0u); 1132cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1133cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber for (size_t i = 0; i < numProgramBytes / 4; ++i) { 1134cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned program_number = br->getBits(16); 11353856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV(" program_number = %u", program_number); 1136cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 11376e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" reserved = %u", br->getBits(3)); 1138cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1139cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (program_number == 0) { 11406e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" network_PID = 0x%04x", br->getBits(13)); 1141cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } else { 1142cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned programMapPID = br->getBits(13); 1143cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 11443856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV(" program_map_PID = 0x%04x", programMapPID); 1145cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1146386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber bool found = false; 1147386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber for (size_t index = 0; index < mPrograms.size(); ++index) { 1148386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber const sp<Program> &program = mPrograms.itemAt(index); 1149386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber 1150386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber if (program->number() == program_number) { 1151386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber program->updateProgramMapPID(programMapPID); 1152386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber found = true; 1153386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber break; 1154386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber } 1155386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber } 1156386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber 1157386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber if (!found) { 1158386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber mPrograms.push( 1159d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang new Program(this, program_number, programMapPID, mLastRecoveredPTS)); 1160386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber } 11618dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 11628dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber if (mPSISections.indexOfKey(programMapPID) < 0) { 11638dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber mPSISections.add(programMapPID, new PSISection); 11648dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber } 1165cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 1166cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 1167cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 11686e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" CRC = 0x%08x", br->getBits(32)); 1169cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 1170cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 117106528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huberstatus_t ATSParser::parsePID( 1172cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber ABitReader *br, unsigned PID, 117387f2a558dd12043631e12c361abef301bf603140Andreas Huber unsigned continuity_counter, 1174cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned payload_unit_start_indicator) { 11758dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber ssize_t sectionIndex = mPSISections.indexOfKey(PID); 11768dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 11778dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber if (sectionIndex >= 0) { 11784b4bb11b8747adeb2efe56c7df4ab6803dd7db41Andreas Huber sp<PSISection> section = mPSISections.valueAt(sectionIndex); 11798dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 1180cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (payload_unit_start_indicator) { 11816456ae745e919085c5024f784aaa2703f9695f98David Yeh if (!section->isEmpty()) { 11829bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang ALOGW("parsePID encounters payload_unit_start_indicator when section is not empty"); 11839bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang section->clear(); 11846456ae745e919085c5024f784aaa2703f9695f98David Yeh } 11858dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 1186cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned skip = br->getBits(8); 1187cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber br->skipBits(skip * 8); 1188cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 11898dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 11908dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber CHECK((br->numBitsLeft() % 8) == 0); 11918dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber status_t err = section->append(br->data(), br->numBitsLeft() / 8); 11928dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 11938dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber if (err != OK) { 11948dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber return err; 11958dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber } 11968dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 11978dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber if (!section->isComplete()) { 11988dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber return OK; 11998dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber } 12008dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 12018dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber ABitReader sectionBits(section->data(), section->size()); 12028dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 12038dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber if (PID == 0) { 12048dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber parseProgramAssociationTable(§ionBits); 12058dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber } else { 12068dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber bool handled = false; 12078dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber for (size_t i = 0; i < mPrograms.size(); ++i) { 12088dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber status_t err; 12098dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber if (!mPrograms.editItemAt(i)->parsePSISection( 12108dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber PID, §ionBits, &err)) { 12118dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber continue; 12128dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber } 12138dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 12148dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber if (err != OK) { 12158dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber return err; 12168dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber } 12178dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 12188dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber handled = true; 12198dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber break; 12208dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber } 12218dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 12228dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber if (!handled) { 12238dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber mPSISections.removeItem(PID); 12244b4bb11b8747adeb2efe56c7df4ab6803dd7db41Andreas Huber section.clear(); 12258dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber } 12268dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber } 12278dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 12284b4bb11b8747adeb2efe56c7df4ab6803dd7db41Andreas Huber if (section != NULL) { 12294b4bb11b8747adeb2efe56c7df4ab6803dd7db41Andreas Huber section->clear(); 12304b4bb11b8747adeb2efe56c7df4ab6803dd7db41Andreas Huber } 12318dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 123206528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber return OK; 1233cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 1234cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1235cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber bool handled = false; 1236cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber for (size_t i = 0; i < mPrograms.size(); ++i) { 123706528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber status_t err; 1238cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (mPrograms.editItemAt(i)->parsePID( 123987f2a558dd12043631e12c361abef301bf603140Andreas Huber PID, continuity_counter, payload_unit_start_indicator, 124087f2a558dd12043631e12c361abef301bf603140Andreas Huber br, &err)) { 124106528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber if (err != OK) { 124206528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber return err; 124306528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber } 124406528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber 1245cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber handled = true; 1246cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber break; 1247cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 1248cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 1249cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1250cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (!handled) { 12513856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("PID 0x%04x not handled.", PID); 1252cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 125306528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber 125406528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber return OK; 1255cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 1256cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 125787f2a558dd12043631e12c361abef301bf603140Andreas Hubervoid ATSParser::parseAdaptationField(ABitReader *br, unsigned PID) { 1258cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned adaptation_field_length = br->getBits(8); 125987f2a558dd12043631e12c361abef301bf603140Andreas Huber 1260cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (adaptation_field_length > 0) { 126187f2a558dd12043631e12c361abef301bf603140Andreas Huber unsigned discontinuity_indicator = br->getBits(1); 126287f2a558dd12043631e12c361abef301bf603140Andreas Huber 126387f2a558dd12043631e12c361abef301bf603140Andreas Huber if (discontinuity_indicator) { 126487f2a558dd12043631e12c361abef301bf603140Andreas Huber ALOGV("PID 0x%04x: discontinuity_indicator = 1 (!!!)", PID); 126587f2a558dd12043631e12c361abef301bf603140Andreas Huber } 126687f2a558dd12043631e12c361abef301bf603140Andreas Huber 126787f2a558dd12043631e12c361abef301bf603140Andreas Huber br->skipBits(2); 126887f2a558dd12043631e12c361abef301bf603140Andreas Huber unsigned PCR_flag = br->getBits(1); 126987f2a558dd12043631e12c361abef301bf603140Andreas Huber 127087f2a558dd12043631e12c361abef301bf603140Andreas Huber size_t numBitsRead = 4; 127187f2a558dd12043631e12c361abef301bf603140Andreas Huber 127287f2a558dd12043631e12c361abef301bf603140Andreas Huber if (PCR_flag) { 127387f2a558dd12043631e12c361abef301bf603140Andreas Huber br->skipBits(4); 127487f2a558dd12043631e12c361abef301bf603140Andreas Huber uint64_t PCR_base = br->getBits(32); 127587f2a558dd12043631e12c361abef301bf603140Andreas Huber PCR_base = (PCR_base << 1) | br->getBits(1); 127687f2a558dd12043631e12c361abef301bf603140Andreas Huber 127787f2a558dd12043631e12c361abef301bf603140Andreas Huber br->skipBits(6); 127887f2a558dd12043631e12c361abef301bf603140Andreas Huber unsigned PCR_ext = br->getBits(9); 127987f2a558dd12043631e12c361abef301bf603140Andreas Huber 128087f2a558dd12043631e12c361abef301bf603140Andreas Huber // The number of bytes from the start of the current 128187f2a558dd12043631e12c361abef301bf603140Andreas Huber // MPEG2 transport stream packet up and including 128287f2a558dd12043631e12c361abef301bf603140Andreas Huber // the final byte of this PCR_ext field. 128387f2a558dd12043631e12c361abef301bf603140Andreas Huber size_t byteOffsetFromStartOfTSPacket = 128487f2a558dd12043631e12c361abef301bf603140Andreas Huber (188 - br->numBitsLeft() / 8); 128587f2a558dd12043631e12c361abef301bf603140Andreas Huber 128687f2a558dd12043631e12c361abef301bf603140Andreas Huber uint64_t PCR = PCR_base * 300 + PCR_ext; 128787f2a558dd12043631e12c361abef301bf603140Andreas Huber 1288b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross ALOGV("PID 0x%04x: PCR = 0x%016" PRIx64 " (%.2f)", 128987f2a558dd12043631e12c361abef301bf603140Andreas Huber PID, PCR, PCR / 27E6); 129087f2a558dd12043631e12c361abef301bf603140Andreas Huber 129187f2a558dd12043631e12c361abef301bf603140Andreas Huber // The number of bytes received by this parser up to and 129287f2a558dd12043631e12c361abef301bf603140Andreas Huber // including the final byte of this PCR_ext field. 129387f2a558dd12043631e12c361abef301bf603140Andreas Huber size_t byteOffsetFromStart = 129487f2a558dd12043631e12c361abef301bf603140Andreas Huber mNumTSPacketsParsed * 188 + byteOffsetFromStartOfTSPacket; 129587f2a558dd12043631e12c361abef301bf603140Andreas Huber 129687f2a558dd12043631e12c361abef301bf603140Andreas Huber for (size_t i = 0; i < mPrograms.size(); ++i) { 129787f2a558dd12043631e12c361abef301bf603140Andreas Huber updatePCR(PID, PCR, byteOffsetFromStart); 129887f2a558dd12043631e12c361abef301bf603140Andreas Huber } 129987f2a558dd12043631e12c361abef301bf603140Andreas Huber 130087f2a558dd12043631e12c361abef301bf603140Andreas Huber numBitsRead += 52; 130187f2a558dd12043631e12c361abef301bf603140Andreas Huber } 130287f2a558dd12043631e12c361abef301bf603140Andreas Huber 130387f2a558dd12043631e12c361abef301bf603140Andreas Huber CHECK_GE(adaptation_field_length * 8, numBitsRead); 130487f2a558dd12043631e12c361abef301bf603140Andreas Huber 130587f2a558dd12043631e12c361abef301bf603140Andreas Huber br->skipBits(adaptation_field_length * 8 - numBitsRead); 1306cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 1307cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 1308cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 130906528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huberstatus_t ATSParser::parseTS(ABitReader *br) { 13103856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("---"); 1311cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1312cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned sync_byte = br->getBits(8); 13136456ae745e919085c5024f784aaa2703f9695f98David Yeh if (sync_byte != 0x47u) { 13146456ae745e919085c5024f784aaa2703f9695f98David Yeh ALOGE("[error] parseTS: return error as sync_byte=0x%x", sync_byte); 13156456ae745e919085c5024f784aaa2703f9695f98David Yeh return BAD_VALUE; 13166456ae745e919085c5024f784aaa2703f9695f98David Yeh } 1317cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 131852668ca838e1869676ff95e7388f93ec1858b1e9Andreas Huber if (br->getBits(1)) { // transport_error_indicator 131952668ca838e1869676ff95e7388f93ec1858b1e9Andreas Huber // silently ignore. 132052668ca838e1869676ff95e7388f93ec1858b1e9Andreas Huber return OK; 132152668ca838e1869676ff95e7388f93ec1858b1e9Andreas Huber } 1322cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1323cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned payload_unit_start_indicator = br->getBits(1); 13243856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("payload_unit_start_indicator = %u", payload_unit_start_indicator); 1325cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 13266e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV("transport_priority = %u", br->getBits(1)); 1327cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1328cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned PID = br->getBits(13); 13293856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("PID = 0x%04x", PID); 1330cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 13316e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV("transport_scrambling_control = %u", br->getBits(2)); 1332cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1333cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned adaptation_field_control = br->getBits(2); 13343856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("adaptation_field_control = %u", adaptation_field_control); 1335cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 13360da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber unsigned continuity_counter = br->getBits(4); 133787f2a558dd12043631e12c361abef301bf603140Andreas Huber ALOGV("PID = 0x%04x, continuity_counter = %u", PID, continuity_counter); 13380da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber 1339df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block // ALOGI("PID = 0x%04x, continuity_counter = %u", PID, continuity_counter); 1340cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1341cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (adaptation_field_control == 2 || adaptation_field_control == 3) { 134287f2a558dd12043631e12c361abef301bf603140Andreas Huber parseAdaptationField(br, PID); 1343cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 1344cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 134587f2a558dd12043631e12c361abef301bf603140Andreas Huber status_t err = OK; 134687f2a558dd12043631e12c361abef301bf603140Andreas Huber 1347cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (adaptation_field_control == 1 || adaptation_field_control == 3) { 134887f2a558dd12043631e12c361abef301bf603140Andreas Huber err = parsePID( 134987f2a558dd12043631e12c361abef301bf603140Andreas Huber br, PID, continuity_counter, payload_unit_start_indicator); 1350cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 135106528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber 135287f2a558dd12043631e12c361abef301bf603140Andreas Huber ++mNumTSPacketsParsed; 135387f2a558dd12043631e12c361abef301bf603140Andreas Huber 135487f2a558dd12043631e12c361abef301bf603140Andreas Huber return err; 1355cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 1356cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1357cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubersp<MediaSource> ATSParser::getSource(SourceType type) { 1358386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber int which = -1; // any 1359386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber 1360cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber for (size_t i = 0; i < mPrograms.size(); ++i) { 1361386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber const sp<Program> &program = mPrograms.editItemAt(i); 1362386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber 1363386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber if (which >= 0 && (int)program->number() != which) { 1364386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber continue; 1365386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber } 1366386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber 1367386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber sp<MediaSource> source = program->getSource(type); 1368cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1369cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (source != NULL) { 1370cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber return source; 1371cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 1372cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 1373cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1374cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber return NULL; 1375cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 1376cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1377bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shihbool ATSParser::hasSource(SourceType type) const { 1378bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih for (size_t i = 0; i < mPrograms.size(); ++i) { 1379bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih const sp<Program> &program = mPrograms.itemAt(i); 1380bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih if (program->hasSource(type)) { 1381bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih return true; 1382bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih } 1383bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih } 1384bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih 1385bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih return false; 1386bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih} 1387bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih 138843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huberbool ATSParser::PTSTimeDeltaEstablished() { 138943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mPrograms.isEmpty()) { 139043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber return false; 139143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 139243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 139343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber return mPrograms.editItemAt(0)->PTSTimeDeltaEstablished(); 139443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber} 139543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 139687f2a558dd12043631e12c361abef301bf603140Andreas Hubervoid ATSParser::updatePCR( 139784333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber unsigned /* PID */, uint64_t PCR, size_t byteOffsetFromStart) { 1398b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross ALOGV("PCR 0x%016" PRIx64 " @ %zu", PCR, byteOffsetFromStart); 139987f2a558dd12043631e12c361abef301bf603140Andreas Huber 140087f2a558dd12043631e12c361abef301bf603140Andreas Huber if (mNumPCRs == 2) { 140187f2a558dd12043631e12c361abef301bf603140Andreas Huber mPCR[0] = mPCR[1]; 140287f2a558dd12043631e12c361abef301bf603140Andreas Huber mPCRBytes[0] = mPCRBytes[1]; 140387f2a558dd12043631e12c361abef301bf603140Andreas Huber mSystemTimeUs[0] = mSystemTimeUs[1]; 140487f2a558dd12043631e12c361abef301bf603140Andreas Huber mNumPCRs = 1; 140587f2a558dd12043631e12c361abef301bf603140Andreas Huber } 140687f2a558dd12043631e12c361abef301bf603140Andreas Huber 140787f2a558dd12043631e12c361abef301bf603140Andreas Huber mPCR[mNumPCRs] = PCR; 140887f2a558dd12043631e12c361abef301bf603140Andreas Huber mPCRBytes[mNumPCRs] = byteOffsetFromStart; 140987f2a558dd12043631e12c361abef301bf603140Andreas Huber mSystemTimeUs[mNumPCRs] = ALooper::GetNowUs(); 141087f2a558dd12043631e12c361abef301bf603140Andreas Huber 141187f2a558dd12043631e12c361abef301bf603140Andreas Huber ++mNumPCRs; 141287f2a558dd12043631e12c361abef301bf603140Andreas Huber 141387f2a558dd12043631e12c361abef301bf603140Andreas Huber if (mNumPCRs == 2) { 141487f2a558dd12043631e12c361abef301bf603140Andreas Huber double transportRate = 141587f2a558dd12043631e12c361abef301bf603140Andreas Huber (mPCRBytes[1] - mPCRBytes[0]) * 27E6 / (mPCR[1] - mPCR[0]); 141687f2a558dd12043631e12c361abef301bf603140Andreas Huber 141787f2a558dd12043631e12c361abef301bf603140Andreas Huber ALOGV("transportRate = %.2f bytes/sec", transportRate); 141887f2a558dd12043631e12c361abef301bf603140Andreas Huber } 141987f2a558dd12043631e12c361abef301bf603140Andreas Huber} 142087f2a558dd12043631e12c361abef301bf603140Andreas Huber 14218dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber//////////////////////////////////////////////////////////////////////////////// 14228dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 14238dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas HuberATSParser::PSISection::PSISection() { 14248dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber} 14258dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 14268dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas HuberATSParser::PSISection::~PSISection() { 14278dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber} 14288dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 14298dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberstatus_t ATSParser::PSISection::append(const void *data, size_t size) { 14308dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber if (mBuffer == NULL || mBuffer->size() + size > mBuffer->capacity()) { 14318dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber size_t newCapacity = 14328dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber (mBuffer == NULL) ? size : mBuffer->capacity() + size; 14338dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 14348dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber newCapacity = (newCapacity + 1023) & ~1023; 14358dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 14368dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber sp<ABuffer> newBuffer = new ABuffer(newCapacity); 14378dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 14388dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber if (mBuffer != NULL) { 14398dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber memcpy(newBuffer->data(), mBuffer->data(), mBuffer->size()); 14408dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber newBuffer->setRange(0, mBuffer->size()); 14418dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber } else { 14428dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber newBuffer->setRange(0, 0); 14438dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber } 14448dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 14458dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber mBuffer = newBuffer; 14468dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber } 14478dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 14488dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber memcpy(mBuffer->data() + mBuffer->size(), data, size); 14498dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber mBuffer->setRange(0, mBuffer->size() + size); 14508dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 14518dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber return OK; 14528dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber} 14538dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 14548dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Hubervoid ATSParser::PSISection::clear() { 14558dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber if (mBuffer != NULL) { 14568dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber mBuffer->setRange(0, 0); 14578dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber } 14588dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber} 14598dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 14608dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberbool ATSParser::PSISection::isComplete() const { 14618dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber if (mBuffer == NULL || mBuffer->size() < 3) { 14628dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber return false; 14638dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber } 14648dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 14658dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber unsigned sectionLength = U16_AT(mBuffer->data() + 1) & 0xfff; 14668dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber return mBuffer->size() >= sectionLength + 3; 14678dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber} 14688dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 14698dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberbool ATSParser::PSISection::isEmpty() const { 14708dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber return mBuffer == NULL || mBuffer->size() == 0; 14718dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber} 14728dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 14738dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberconst uint8_t *ATSParser::PSISection::data() const { 14748dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber return mBuffer == NULL ? NULL : mBuffer->data(); 14758dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber} 14768dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 14778dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Hubersize_t ATSParser::PSISection::size() const { 14788dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber return mBuffer == NULL ? 0 : mBuffer->size(); 14798dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber} 14808dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 1481cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} // namespace android 1482