ATSParser.cpp revision e314c678ea0b53dd9296ba6b5c3272c702433b47
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; 1350852843d304006e3ab333081fddda13b07193de8Robert Shih bool isMeta() const; 136bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih 137cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberprotected: 138cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber virtual ~Stream(); 139cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 140cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberprivate: 141bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber Program *mProgram; 142cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned mElementaryPID; 143cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned mStreamType; 14487f2a558dd12043631e12c361abef301bf603140Andreas Huber unsigned mPCR_PID; 14587f2a558dd12043631e12c361abef301bf603140Andreas Huber int32_t mExpectedContinuityCounter; 146cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 147cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber sp<ABuffer> mBuffer; 148cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber sp<AnotherPacketSource> mSource; 149cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber bool mPayloadStarted; 150be9634d071e79b72a42a4504f64eda9e2a0bceb8Marco Nelissen bool mEOSReached; 151cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 15290a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber uint64_t mPrevPTS; 15390a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber 154386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber ElementaryStreamQueue *mQueue; 1556a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber 1565403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber status_t flush(); 1575403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber status_t parsePES(ABitReader *br); 158cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 159cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber void onPayloadData( 160cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned PTS_DTS_flags, uint64_t PTS, uint64_t DTS, 161cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber const uint8_t *data, size_t size); 162cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 16382f7321b03eec1e40af9d681370f754ee0279582Andreas Huber void extractAACFrames(const sp<ABuffer> &buffer); 16482f7321b03eec1e40af9d681370f754ee0279582Andreas Huber 165cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(Stream); 166cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}; 167cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1688dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberstruct ATSParser::PSISection : public RefBase { 1698dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber PSISection(); 1708dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 1718dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber status_t append(const void *data, size_t size); 1729ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim void setSkipBytes(uint8_t skip); 1738dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber void clear(); 1748dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 1758dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber bool isComplete() const; 1768dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber bool isEmpty() const; 1779ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim bool isCRCOkay() const; 1788dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 1798dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber const uint8_t *data() const; 1808dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber size_t size() const; 1818dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 1828dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberprotected: 1838dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber virtual ~PSISection(); 1848dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 1858dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberprivate: 1868dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber sp<ABuffer> mBuffer; 1879ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim uint8_t mSkipBytes; 1889ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim static uint32_t CRC_TABLE[]; 1898dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 1908dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber DISALLOW_EVIL_CONSTRUCTORS(PSISection); 1918dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber}; 1928dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 193cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber//////////////////////////////////////////////////////////////////////////////// 194cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 195386d609dc513e838c7e7c4c46c604493ccd560beAndreas HuberATSParser::Program::Program( 196d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang ATSParser *parser, unsigned programNumber, unsigned programMapPID, 197d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang int64_t lastRecoveredPTS) 198f933441648ef6a71dee783d733aac17b9508b452Andreas Huber : mParser(parser), 199386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber mProgramNumber(programNumber), 200f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mProgramMapPID(programMapPID), 201bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber mFirstPTSValid(false), 202799c9682b3776a55d234396aee4a302437150c26Chong Zhang mFirstPTS(0), 203d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang mLastRecoveredPTS(lastRecoveredPTS) { 2043856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("new program number %u", programNumber); 205cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 206cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 2078dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberbool ATSParser::Program::parsePSISection( 2088dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber unsigned pid, ABitReader *br, status_t *err) { 20906528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber *err = OK; 21006528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber 2118dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber if (pid != mProgramMapPID) { 2128dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber return false; 2138dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber } 214cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 2158dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber *err = parseProgramMap(br); 21606528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber 2178dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber return true; 2188dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber} 2198dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 2208dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberbool ATSParser::Program::parsePID( 22187f2a558dd12043631e12c361abef301bf603140Andreas Huber unsigned pid, unsigned continuity_counter, 22287f2a558dd12043631e12c361abef301bf603140Andreas Huber unsigned payload_unit_start_indicator, 2238dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber ABitReader *br, status_t *err) { 2248dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber *err = OK; 225cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 226cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber ssize_t index = mStreams.indexOfKey(pid); 227cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (index < 0) { 228cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber return false; 229cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 230cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 2315403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber *err = mStreams.editValueAt(index)->parse( 23287f2a558dd12043631e12c361abef301bf603140Andreas Huber continuity_counter, payload_unit_start_indicator, br); 233cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 234cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber return true; 235cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 236cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 23732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Hubervoid ATSParser::Program::signalDiscontinuity( 23832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber DiscontinuityType type, const sp<AMessage> &extra) { 239b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber int64_t mediaTimeUs; 240b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber if ((type & DISCONTINUITY_TIME) 241b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber && extra != NULL 242b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber && extra->findInt64( 243b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber IStreamListener::kKeyMediaTimeUs, &mediaTimeUs)) { 244b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber mFirstPTSValid = false; 245b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber } 246b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber 2472a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber for (size_t i = 0; i < mStreams.size(); ++i) { 24832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber mStreams.editValueAt(i)->signalDiscontinuity(type, extra); 249f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 250f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 251f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 252f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ATSParser::Program::signalEOS(status_t finalResult) { 253f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (size_t i = 0; i < mStreams.size(); ++i) { 254f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mStreams.editValueAt(i)->signalEOS(finalResult); 2552a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber } 2562a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber} 2572a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber 2589bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhangbool ATSParser::Program::switchPIDs(const Vector<StreamInfo> &infos) { 2599bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang bool success = false; 2609bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang 2619bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang if (mStreams.size() == infos.size()) { 2629bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang // build type->PIDs map for old and new mapping 2639bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang size_t i; 2649bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang KeyedVector<int32_t, Vector<int32_t> > oldType2PIDs, newType2PIDs; 2659bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang for (i = 0; i < mStreams.size(); ++i) { 2669bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang ssize_t index = oldType2PIDs.indexOfKey(mStreams[i]->type()); 2679bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang if (index < 0) { 2689bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang oldType2PIDs.add(mStreams[i]->type(), Vector<int32_t>()); 2699bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang } 2709bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang oldType2PIDs.editValueFor(mStreams[i]->type()).push_back(mStreams[i]->pid()); 2719bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang } 2729bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang for (i = 0; i < infos.size(); ++i) { 2739bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang ssize_t index = newType2PIDs.indexOfKey(infos[i].mType); 2749bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang if (index < 0) { 2759bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang newType2PIDs.add(infos[i].mType, Vector<int32_t>()); 2769bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang } 2779bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang newType2PIDs.editValueFor(infos[i].mType).push_back(infos[i].mPID); 2789bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang } 2799bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang 2809bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang // we can recover if the number of streams for each type hasn't changed 2819bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang if (oldType2PIDs.size() == newType2PIDs.size()) { 2829bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang success = true; 2839bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang for (i = 0; i < oldType2PIDs.size(); ++i) { 2849bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang // KeyedVector is sorted, we just compare key and size of each index 2859bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang if (oldType2PIDs.keyAt(i) != newType2PIDs.keyAt(i) 2869bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang || oldType2PIDs[i].size() != newType2PIDs[i].size()) { 2879bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang success = false; 2889bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang break; 2899bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang } 2909bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang } 2919bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang } 2929bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang 2939bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang if (success) { 2949bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang // save current streams to temp 2959bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang KeyedVector<int32_t, sp<Stream> > temp; 2969bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang for (i = 0; i < mStreams.size(); ++i) { 2979bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang temp.add(mStreams.keyAt(i), mStreams.editValueAt(i)); 2989bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang } 2999bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang 3009bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang mStreams.clear(); 3019bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang for (i = 0; i < temp.size(); ++i) { 3029bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang // The two checks below shouldn't happen, 3039bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang // we already checked above the stream count matches 3049bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang ssize_t index = newType2PIDs.indexOfKey(temp[i]->type()); 305e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (index < 0) { 306e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return false; 307e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 3089bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang Vector<int32_t> &newPIDs = newType2PIDs.editValueAt(index); 309e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (newPIDs.isEmpty()) { 310e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return false; 311e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 3129bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang 3139bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang // get the next PID for temp[i]->type() in the new PID map 3149bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang Vector<int32_t>::iterator it = newPIDs.begin(); 3159bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang 3169bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang // change the PID of the stream, and add it back 3179bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang temp.editValueAt(i)->setPID(*it); 3189bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang mStreams.add(temp[i]->pid(), temp.editValueAt(i)); 3199bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang 3209bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang // removed the used PID 3219bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang newPIDs.erase(it); 3229bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang } 3239bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang } 3249bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang } 3259bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang return success; 3269bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang} 327bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber 32806528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huberstatus_t ATSParser::Program::parseProgramMap(ABitReader *br) { 329cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned table_id = br->getBits(8); 3303856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV(" table_id = %u", table_id); 3316456ae745e919085c5024f784aaa2703f9695f98David Yeh if (table_id != 0x02u) { 3326456ae745e919085c5024f784aaa2703f9695f98David Yeh ALOGE("PMT data error!"); 3336456ae745e919085c5024f784aaa2703f9695f98David Yeh return ERROR_MALFORMED; 3346456ae745e919085c5024f784aaa2703f9695f98David Yeh } 3356e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber unsigned section_syntax_indicator = br->getBits(1); 3363856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV(" section_syntax_indicator = %u", section_syntax_indicator); 3376456ae745e919085c5024f784aaa2703f9695f98David Yeh if (section_syntax_indicator != 1u) { 3386456ae745e919085c5024f784aaa2703f9695f98David Yeh ALOGE("PMT data error!"); 3396456ae745e919085c5024f784aaa2703f9695f98David Yeh return ERROR_MALFORMED; 3406456ae745e919085c5024f784aaa2703f9695f98David Yeh } 341cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 342e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim br->skipBits(1); // '0' 3436e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" reserved = %u", br->getBits(2)); 344cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 345cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned section_length = br->getBits(12); 3463856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV(" section_length = %u", section_length); 347cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 3486e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" program_number = %u", br->getBits(16)); 3496e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" reserved = %u", br->getBits(2)); 3506e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" version_number = %u", br->getBits(5)); 3516e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" current_next_indicator = %u", br->getBits(1)); 3526e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" section_number = %u", br->getBits(8)); 3536e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" last_section_number = %u", br->getBits(8)); 3546e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" reserved = %u", br->getBits(3)); 35587f2a558dd12043631e12c361abef301bf603140Andreas Huber 35687f2a558dd12043631e12c361abef301bf603140Andreas Huber unsigned PCR_PID = br->getBits(13); 35787f2a558dd12043631e12c361abef301bf603140Andreas Huber ALOGV(" PCR_PID = 0x%04x", PCR_PID); 35887f2a558dd12043631e12c361abef301bf603140Andreas Huber 3596e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" reserved = %u", br->getBits(4)); 360cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 361cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned program_info_length = br->getBits(12); 3623856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV(" program_info_length = %u", program_info_length); 363cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 364cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber br->skipBits(program_info_length * 8); // skip descriptors 365cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 366bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber Vector<StreamInfo> infos; 367bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber 368cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber // infoBytesRemaining is the number of bytes that make up the 369cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber // variable length section of ES_infos. It does not include the 370cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber // final CRC. 371cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber size_t infoBytesRemaining = section_length - 9 - program_info_length - 4; 372cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 373e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim while (infoBytesRemaining >= 5) { 374cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 375cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned streamType = br->getBits(8); 3763856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV(" stream_type = 0x%02x", streamType); 377cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 3786e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" reserved = %u", br->getBits(3)); 379cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 380cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned elementaryPID = br->getBits(13); 3813856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV(" elementary_PID = 0x%04x", elementaryPID); 382cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 3836e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" reserved = %u", br->getBits(4)); 384cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 385cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned ES_info_length = br->getBits(12); 3863856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV(" ES_info_length = %u", ES_info_length); 387cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 388cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#if 0 389cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber br->skipBits(ES_info_length * 8); // skip descriptors 390cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#else 391cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned info_bytes_remaining = ES_info_length; 392cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber while (info_bytes_remaining >= 2) { 3936e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" tag = 0x%02x", br->getBits(8)); 394cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 395cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned descLength = br->getBits(8); 3963856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV(" len = %u", descLength); 397cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 398e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (info_bytes_remaining < descLength) { 399e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 400e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 401cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber br->skipBits(descLength * 8); 402cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 403cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber info_bytes_remaining -= descLength + 2; 404cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 405cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#endif 406cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 407bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber StreamInfo info; 408bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber info.mType = streamType; 409bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber info.mPID = elementaryPID; 410bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber infos.push(info); 411cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 412cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber infoBytesRemaining -= 5 + ES_info_length; 413cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 414cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 415e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (infoBytesRemaining != 0) { 416e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim ALOGW("Section data remains unconsumed"); 417e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 4186e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" CRC = 0x%08x", br->getBits(32)); 419bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber 420bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber bool PIDsChanged = false; 421bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber for (size_t i = 0; i < infos.size(); ++i) { 422bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber StreamInfo &info = infos.editItemAt(i); 423bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber 424bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber ssize_t index = mStreams.indexOfKey(info.mPID); 425bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber 426bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber if (index >= 0 && mStreams.editValueAt(index)->type() != info.mType) { 427df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block ALOGI("uh oh. stream PIDs have changed."); 428bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber PIDsChanged = true; 429bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber break; 430bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber } 431bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber } 432bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber 433bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber if (PIDsChanged) { 43406528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber#if 0 435df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block ALOGI("before:"); 43606528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber for (size_t i = 0; i < mStreams.size(); ++i) { 43706528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber sp<Stream> stream = mStreams.editValueAt(i); 43806528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber 439df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block ALOGI("PID 0x%08x => type 0x%02x", stream->pid(), stream->type()); 44006528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber } 44106528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber 442df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block ALOGI("after:"); 44306528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber for (size_t i = 0; i < infos.size(); ++i) { 44406528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber StreamInfo &info = infos.editItemAt(i); 44506528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber 446df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block ALOGI("PID 0x%08x => type 0x%02x", info.mPID, info.mType); 44706528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber } 44806528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber#endif 44906528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber 4509bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang // we can recover if number of streams for each type remain the same 4519bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang bool success = switchPIDs(infos); 45206528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber 45306528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber if (!success) { 454df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block ALOGI("Stream PIDs changed and we cannot recover."); 45506528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber return ERROR_MALFORMED; 45606528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber } 457bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber } 458bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber 459bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber for (size_t i = 0; i < infos.size(); ++i) { 460bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber StreamInfo &info = infos.editItemAt(i); 461bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber 462bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber ssize_t index = mStreams.indexOfKey(info.mPID); 463bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber 464bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber if (index < 0) { 46587f2a558dd12043631e12c361abef301bf603140Andreas Huber sp<Stream> stream = new Stream( 46687f2a558dd12043631e12c361abef301bf603140Andreas Huber this, info.mPID, info.mType, PCR_PID); 46787f2a558dd12043631e12c361abef301bf603140Andreas Huber 468bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber mStreams.add(info.mPID, stream); 469bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber } 470bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber } 47106528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber 47206528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber return OK; 473cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 474cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 475799c9682b3776a55d234396aee4a302437150c26Chong Zhangint64_t ATSParser::Program::recoverPTS(uint64_t PTS_33bit) { 476799c9682b3776a55d234396aee4a302437150c26Chong Zhang // We only have the lower 33-bit of the PTS. It could overflow within a 477799c9682b3776a55d234396aee4a302437150c26Chong Zhang // reasonable amount of time. To handle the wrap-around, use fancy math 478799c9682b3776a55d234396aee4a302437150c26Chong Zhang // to get an extended PTS that is within [-0xffffffff, 0xffffffff] 479799c9682b3776a55d234396aee4a302437150c26Chong Zhang // of the latest recovered PTS. 4809bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang if (mLastRecoveredPTS < 0ll) { 4819bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang // Use the original 33bit number for 1st frame, the reason is that 4829bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang // if 1st frame wraps to negative that's far away from 0, we could 4839bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang // never start. Only start wrapping around from 2nd frame. 4849bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang mLastRecoveredPTS = static_cast<int64_t>(PTS_33bit); 4859bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang } else { 4869bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang mLastRecoveredPTS = static_cast<int64_t>( 4879bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang ((mLastRecoveredPTS - PTS_33bit + 0x100000000ll) 4889bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang & 0xfffffffe00000000ull) | PTS_33bit); 4899bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang // We start from 0, but recovered PTS could be slightly below 0. 4909bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang // Clamp it to 0 as rest of the pipeline doesn't take negative pts. 4919bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang // (eg. video is read first and starts at 0, but audio starts at 0xfffffff0) 4929bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang if (mLastRecoveredPTS < 0ll) { 4935c9054bc6efc080b265e028f2ebb1abd2a2e3953Chih-Hung Hsieh ALOGI("Clamping negative recovered PTS (%" PRId64 ") to 0", mLastRecoveredPTS); 4949bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang mLastRecoveredPTS = 0ll; 4959bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang } 4969bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang } 4979bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang 4989bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang return mLastRecoveredPTS; 499799c9682b3776a55d234396aee4a302437150c26Chong Zhang} 500799c9682b3776a55d234396aee4a302437150c26Chong Zhang 501cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubersp<MediaSource> ATSParser::Program::getSource(SourceType type) { 502386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber size_t index = (type == AUDIO) ? 0 : 0; 503decd96988e495133e4a1728f612d4c9fdb4d218eAndreas Huber 504cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber for (size_t i = 0; i < mStreams.size(); ++i) { 505cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber sp<MediaSource> source = mStreams.editValueAt(i)->getSource(type); 506cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (source != NULL) { 507decd96988e495133e4a1728f612d4c9fdb4d218eAndreas Huber if (index == 0) { 508decd96988e495133e4a1728f612d4c9fdb4d218eAndreas Huber return source; 509decd96988e495133e4a1728f612d4c9fdb4d218eAndreas Huber } 510decd96988e495133e4a1728f612d4c9fdb4d218eAndreas Huber --index; 511cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 512cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 513cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 514cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber return NULL; 515cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 516cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 517bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shihbool ATSParser::Program::hasSource(SourceType type) const { 518bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih for (size_t i = 0; i < mStreams.size(); ++i) { 519bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih const sp<Stream> &stream = mStreams.valueAt(i); 520bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih if (type == AUDIO && stream->isAudio()) { 521bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih return true; 522bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih } else if (type == VIDEO && stream->isVideo()) { 523bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih return true; 524bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih } 525bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih } 526bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih 527bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih return false; 528bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih} 529bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih 530bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huberint64_t ATSParser::Program::convertPTSToTimestamp(uint64_t PTS) { 531799c9682b3776a55d234396aee4a302437150c26Chong Zhang PTS = recoverPTS(PTS); 532799c9682b3776a55d234396aee4a302437150c26Chong Zhang 533c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber if (!(mParser->mFlags & TS_TIMESTAMPS_ARE_ABSOLUTE)) { 534c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber if (!mFirstPTSValid) { 535c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber mFirstPTSValid = true; 536c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber mFirstPTS = PTS; 537c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber PTS = 0; 538c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber } else if (PTS < mFirstPTS) { 539c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber PTS = 0; 540c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber } else { 541c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber PTS -= mFirstPTS; 542c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber } 543bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber } 544bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber 54587f2a558dd12043631e12c361abef301bf603140Andreas Huber int64_t timeUs = (PTS * 100) / 9; 54687f2a558dd12043631e12c361abef301bf603140Andreas Huber 54787f2a558dd12043631e12c361abef301bf603140Andreas Huber if (mParser->mAbsoluteTimeAnchorUs >= 0ll) { 54887f2a558dd12043631e12c361abef301bf603140Andreas Huber timeUs += mParser->mAbsoluteTimeAnchorUs; 54987f2a558dd12043631e12c361abef301bf603140Andreas Huber } 55087f2a558dd12043631e12c361abef301bf603140Andreas Huber 551d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber if (mParser->mTimeOffsetValid) { 552d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber timeUs += mParser->mTimeOffsetUs; 553d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber } 554d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber 55587f2a558dd12043631e12c361abef301bf603140Andreas Huber return timeUs; 556bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber} 557bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber 558cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber//////////////////////////////////////////////////////////////////////////////// 559cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 560bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas HuberATSParser::Stream::Stream( 56187f2a558dd12043631e12c361abef301bf603140Andreas Huber Program *program, 56287f2a558dd12043631e12c361abef301bf603140Andreas Huber unsigned elementaryPID, 56387f2a558dd12043631e12c361abef301bf603140Andreas Huber unsigned streamType, 56487f2a558dd12043631e12c361abef301bf603140Andreas Huber unsigned PCR_PID) 565bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber : mProgram(program), 566bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber mElementaryPID(elementaryPID), 567cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber mStreamType(streamType), 56887f2a558dd12043631e12c361abef301bf603140Andreas Huber mPCR_PID(PCR_PID), 56987f2a558dd12043631e12c361abef301bf603140Andreas Huber mExpectedContinuityCounter(-1), 5706a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber mPayloadStarted(false), 571be9634d071e79b72a42a4504f64eda9e2a0bceb8Marco Nelissen mEOSReached(false), 57290a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber mPrevPTS(0), 573386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber mQueue(NULL) { 574386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber switch (mStreamType) { 575386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber case STREAMTYPE_H264: 57687f2a558dd12043631e12c361abef301bf603140Andreas Huber mQueue = new ElementaryStreamQueue( 57787f2a558dd12043631e12c361abef301bf603140Andreas Huber ElementaryStreamQueue::H264, 57887f2a558dd12043631e12c361abef301bf603140Andreas Huber (mProgram->parserFlags() & ALIGNED_VIDEO_DATA) 57987f2a558dd12043631e12c361abef301bf603140Andreas Huber ? ElementaryStreamQueue::kFlag_AlignedData : 0); 580386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber break; 5816e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber case STREAMTYPE_MPEG2_AUDIO_ADTS: 582386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber mQueue = new ElementaryStreamQueue(ElementaryStreamQueue::AAC); 583386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber break; 584386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber case STREAMTYPE_MPEG1_AUDIO: 585386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber case STREAMTYPE_MPEG2_AUDIO: 586386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber mQueue = new ElementaryStreamQueue( 587386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber ElementaryStreamQueue::MPEG_AUDIO); 588386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber break; 589386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber 590386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber case STREAMTYPE_MPEG1_VIDEO: 591386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber case STREAMTYPE_MPEG2_VIDEO: 592386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber mQueue = new ElementaryStreamQueue( 593386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber ElementaryStreamQueue::MPEG_VIDEO); 594386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber break; 595386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber 596386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber case STREAMTYPE_MPEG4_VIDEO: 597386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber mQueue = new ElementaryStreamQueue( 598386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber ElementaryStreamQueue::MPEG4_VIDEO); 599386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber break; 600386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber 6019bf32f06e8971c1d3eb4fc5edd74b69557f97212Chong Zhang case STREAMTYPE_LPCM_AC3: 602d3c079ae9859011d118f94616d0069c2987013edChangwan Ryu case STREAMTYPE_AC3: 603d3c079ae9859011d118f94616d0069c2987013edChangwan Ryu mQueue = new ElementaryStreamQueue( 604d3c079ae9859011d118f94616d0069c2987013edChangwan Ryu ElementaryStreamQueue::AC3); 605d3c079ae9859011d118f94616d0069c2987013edChangwan Ryu break; 606d3c079ae9859011d118f94616d0069c2987013edChangwan Ryu 6070852843d304006e3ab333081fddda13b07193de8Robert Shih case STREAMTYPE_METADATA: 6080852843d304006e3ab333081fddda13b07193de8Robert Shih mQueue = new ElementaryStreamQueue( 6090852843d304006e3ab333081fddda13b07193de8Robert Shih ElementaryStreamQueue::METADATA); 6100852843d304006e3ab333081fddda13b07193de8Robert Shih break; 6110852843d304006e3ab333081fddda13b07193de8Robert Shih 612386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber default: 613386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber break; 614386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber } 615386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber 6163856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("new stream PID 0x%02x, type 0x%02x", elementaryPID, streamType); 61718ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber 61818ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber if (mQueue != NULL) { 61918ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber mBuffer = new ABuffer(192 * 1024); 62018ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber mBuffer->setRange(0, 0); 62118ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber } 622cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 623cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 624cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas HuberATSParser::Stream::~Stream() { 625386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber delete mQueue; 626386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber mQueue = NULL; 627cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 628cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 6295403129e2a2f44620f2ac8109889e5a61be08732Andreas Huberstatus_t ATSParser::Stream::parse( 63087f2a558dd12043631e12c361abef301bf603140Andreas Huber unsigned continuity_counter, 631cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned payload_unit_start_indicator, ABitReader *br) { 63218ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber if (mQueue == NULL) { 6335403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber return OK; 63418ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber } 63518ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber 63687f2a558dd12043631e12c361abef301bf603140Andreas Huber if (mExpectedContinuityCounter >= 0 63787f2a558dd12043631e12c361abef301bf603140Andreas Huber && (unsigned)mExpectedContinuityCounter != continuity_counter) { 63887f2a558dd12043631e12c361abef301bf603140Andreas Huber ALOGI("discontinuity on stream pid 0x%04x", mElementaryPID); 63987f2a558dd12043631e12c361abef301bf603140Andreas Huber 64087f2a558dd12043631e12c361abef301bf603140Andreas Huber mPayloadStarted = false; 64187f2a558dd12043631e12c361abef301bf603140Andreas Huber mBuffer->setRange(0, 0); 64287f2a558dd12043631e12c361abef301bf603140Andreas Huber mExpectedContinuityCounter = -1; 64387f2a558dd12043631e12c361abef301bf603140Andreas Huber 64494a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber#if 0 64594a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber // Uncomment this if you'd rather see no corruption whatsoever on 64694a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber // screen and suspend updates until we come across another IDR frame. 64794a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber 64894a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber if (mStreamType == STREAMTYPE_H264) { 64994a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber ALOGI("clearing video queue"); 65094a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber mQueue->clear(true /* clearFormat */); 65194a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber } 65294a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber#endif 65394a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber 65466830855846db5c211c2da6c055ca9b4167e8974Chong Zhang if (!payload_unit_start_indicator) { 65566830855846db5c211c2da6c055ca9b4167e8974Chong Zhang return OK; 65666830855846db5c211c2da6c055ca9b4167e8974Chong Zhang } 65787f2a558dd12043631e12c361abef301bf603140Andreas Huber } 65887f2a558dd12043631e12c361abef301bf603140Andreas Huber 65987f2a558dd12043631e12c361abef301bf603140Andreas Huber mExpectedContinuityCounter = (continuity_counter + 1) & 0x0f; 66087f2a558dd12043631e12c361abef301bf603140Andreas Huber 661cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (payload_unit_start_indicator) { 662cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (mPayloadStarted) { 663cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber // Otherwise we run the danger of receiving the trailing bytes 664cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber // of a PES packet that we never saw the start of and assuming 665cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber // we have a a complete PES packet. 666cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 6675403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber status_t err = flush(); 6685403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber 6695403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber if (err != OK) { 6705403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber return err; 6715403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber } 672cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 673cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 674cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber mPayloadStarted = true; 675cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 676cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 677cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (!mPayloadStarted) { 6785403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber return OK; 679cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 680cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 681cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber size_t payloadSizeBits = br->numBitsLeft(); 682e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (payloadSizeBits % 8 != 0u) { 683e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim ALOGE("Wrong value"); 684e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return BAD_VALUE; 685e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 686cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 6873e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber size_t neededSize = mBuffer->size() + payloadSizeBits / 8; 6883e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber if (mBuffer->capacity() < neededSize) { 6893e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber // Increment in multiples of 64K. 6903e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber neededSize = (neededSize + 65535) & ~65535; 6913e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber 692b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross ALOGI("resizing buffer to %zu bytes", neededSize); 6933e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber 6943e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber sp<ABuffer> newBuffer = new ABuffer(neededSize); 6953e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber memcpy(newBuffer->data(), mBuffer->data(), mBuffer->size()); 6963e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber newBuffer->setRange(0, mBuffer->size()); 6973e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber mBuffer = newBuffer; 6983e57322b332214e3cb1874e67a5704c9b2b5f6ecAndreas Huber } 699cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 700cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber memcpy(mBuffer->data() + mBuffer->size(), br->data(), payloadSizeBits / 8); 701cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber mBuffer->setRange(0, mBuffer->size() + payloadSizeBits / 8); 7025403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber 7035403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber return OK; 704cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 705cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 7066e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huberbool ATSParser::Stream::isVideo() const { 7076e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber switch (mStreamType) { 7086e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber case STREAMTYPE_H264: 7096e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber case STREAMTYPE_MPEG1_VIDEO: 7106e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber case STREAMTYPE_MPEG2_VIDEO: 7116e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber case STREAMTYPE_MPEG4_VIDEO: 7126e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber return true; 7136e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 7146e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber default: 7156e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber return false; 7166e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } 7176e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber} 7186e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 7196e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huberbool ATSParser::Stream::isAudio() const { 7206e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber switch (mStreamType) { 7216e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber case STREAMTYPE_MPEG1_AUDIO: 7226e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber case STREAMTYPE_MPEG2_AUDIO: 7236e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber case STREAMTYPE_MPEG2_AUDIO_ADTS: 7249bf32f06e8971c1d3eb4fc5edd74b69557f97212Chong Zhang case STREAMTYPE_LPCM_AC3: 725d3c079ae9859011d118f94616d0069c2987013edChangwan Ryu case STREAMTYPE_AC3: 7266e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber return true; 7276e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 7286e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber default: 7296e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber return false; 7306e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } 7316e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber} 7326e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 7330852843d304006e3ab333081fddda13b07193de8Robert Shihbool ATSParser::Stream::isMeta() const { 7340852843d304006e3ab333081fddda13b07193de8Robert Shih if (mStreamType == STREAMTYPE_METADATA) { 7350852843d304006e3ab333081fddda13b07193de8Robert Shih return true; 7360852843d304006e3ab333081fddda13b07193de8Robert Shih } 7370852843d304006e3ab333081fddda13b07193de8Robert Shih return false; 7380852843d304006e3ab333081fddda13b07193de8Robert Shih} 7390852843d304006e3ab333081fddda13b07193de8Robert Shih 74032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Hubervoid ATSParser::Stream::signalDiscontinuity( 74132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber DiscontinuityType type, const sp<AMessage> &extra) { 7420389cc09f7b90f155a8942a0d2e1925cad1dbe2dMarco Nelissen mExpectedContinuityCounter = -1; 7430389cc09f7b90f155a8942a0d2e1925cad1dbe2dMarco Nelissen 74418ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber if (mQueue == NULL) { 74518ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber return; 74618ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber } 74718ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber 7482a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber mPayloadStarted = false; 7492a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber mBuffer->setRange(0, 0); 7502a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber 7516e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber bool clearFormat = false; 7526e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (isAudio()) { 7536e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (type & DISCONTINUITY_AUDIO_FORMAT) { 7546e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber clearFormat = true; 7556e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } 7566e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } else { 7576e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (type & DISCONTINUITY_VIDEO_FORMAT) { 7586e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber clearFormat = true; 7596e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } 7606e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } 761f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 7626e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber mQueue->clear(clearFormat); 76332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 7646e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (type & DISCONTINUITY_TIME) { 7656e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber uint64_t resumeAtPTS; 7666e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (extra != NULL 7676e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber && extra->findInt64( 7686e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber IStreamListener::kKeyResumeAtPTS, 7696e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber (int64_t *)&resumeAtPTS)) { 7706e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber int64_t resumeAtMediaTimeUs = 7716e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber mProgram->convertPTSToTimestamp(resumeAtPTS); 77232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 773c6cfd70f24a11b946859485ce398a189c301a4e2Wei Jia extra->setInt64("resume-at-mediaTimeUs", resumeAtMediaTimeUs); 774e332a9181cf6a3155ed1a0fd2afc212ccb1f2753Andreas Huber } 7756e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } 776f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 7776e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (mSource != NULL) { 778632740c58119a132ce19f6d498e39c5c3773971aChong Zhang mSource->queueDiscontinuity(type, extra, true); 779bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber } 780f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 781bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber 782f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ATSParser::Stream::signalEOS(status_t finalResult) { 783f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mSource != NULL) { 784f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mSource->signalEOS(finalResult); 7852a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber } 786be9634d071e79b72a42a4504f64eda9e2a0bceb8Marco Nelissen mEOSReached = true; 787be9634d071e79b72a42a4504f64eda9e2a0bceb8Marco Nelissen flush(); 7882a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber} 7892a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber 7905403129e2a2f44620f2ac8109889e5a61be08732Andreas Huberstatus_t ATSParser::Stream::parsePES(ABitReader *br) { 791cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned packet_startcode_prefix = br->getBits(24); 792cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 7933856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("packet_startcode_prefix = 0x%08x", packet_startcode_prefix); 794cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 795386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber if (packet_startcode_prefix != 1) { 7963856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Supposedly payload_unit_start=1 unit does not start " 797386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber "with startcode."); 7985403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber 7995403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber return ERROR_MALFORMED; 800386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber } 801386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber 802cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned stream_id = br->getBits(8); 8033856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("stream_id = 0x%02x", stream_id); 804cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 805cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned PES_packet_length = br->getBits(16); 8063856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("PES_packet_length = %u", PES_packet_length); 807cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 808cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (stream_id != 0xbc // program_stream_map 809cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber && stream_id != 0xbe // padding_stream 810cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber && stream_id != 0xbf // private_stream_2 811cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber && stream_id != 0xf0 // ECM 812cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber && stream_id != 0xf1 // EMM 813cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber && stream_id != 0xff // program_stream_directory 814cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber && stream_id != 0xf2 // DSMCC 815cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber && stream_id != 0xf8) { // H.222.1 type E 816e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (br->getBits(2) != 2u) { 817e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 818e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 819cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 8206e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV("PES_scrambling_control = %u", br->getBits(2)); 8216e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV("PES_priority = %u", br->getBits(1)); 8226e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV("data_alignment_indicator = %u", br->getBits(1)); 8236e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV("copyright = %u", br->getBits(1)); 8246e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV("original_or_copy = %u", br->getBits(1)); 825cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 826cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned PTS_DTS_flags = br->getBits(2); 8273856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("PTS_DTS_flags = %u", PTS_DTS_flags); 828cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 829cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned ESCR_flag = br->getBits(1); 8303856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("ESCR_flag = %u", ESCR_flag); 831cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 832cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned ES_rate_flag = br->getBits(1); 8333856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("ES_rate_flag = %u", ES_rate_flag); 834cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 835cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned DSM_trick_mode_flag = br->getBits(1); 8363856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("DSM_trick_mode_flag = %u", DSM_trick_mode_flag); 837cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 838cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned additional_copy_info_flag = br->getBits(1); 8393856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("additional_copy_info_flag = %u", additional_copy_info_flag); 840cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 8416e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV("PES_CRC_flag = %u", br->getBits(1)); 8426e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV("PES_extension_flag = %u", br->getBits(1)); 843cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 844cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned PES_header_data_length = br->getBits(8); 8453856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("PES_header_data_length = %u", PES_header_data_length); 846cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 847cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned optional_bytes_remaining = PES_header_data_length; 848cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 849cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber uint64_t PTS = 0, DTS = 0; 850cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 851cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (PTS_DTS_flags == 2 || PTS_DTS_flags == 3) { 852e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (optional_bytes_remaining < 5u) { 853e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 854e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 855cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 8566456ae745e919085c5024f784aaa2703f9695f98David Yeh if (br->getBits(4) != PTS_DTS_flags) { 8576456ae745e919085c5024f784aaa2703f9695f98David Yeh return ERROR_MALFORMED; 8586456ae745e919085c5024f784aaa2703f9695f98David Yeh } 859cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber PTS = ((uint64_t)br->getBits(3)) << 30; 860e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (br->getBits(1) != 1u) { 861e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 862e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 863cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber PTS |= ((uint64_t)br->getBits(15)) << 15; 864e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (br->getBits(1) != 1u) { 865e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 866e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 867cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber PTS |= br->getBits(15); 868e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (br->getBits(1) != 1u) { 869e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 870e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 871cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 872b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross ALOGV("PTS = 0x%016" PRIx64 " (%.2f)", PTS, PTS / 90000.0); 873cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 874cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber optional_bytes_remaining -= 5; 875cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 876cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (PTS_DTS_flags == 3) { 877e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (optional_bytes_remaining < 5u) { 878e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 879e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 880cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 881e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (br->getBits(4) != 1u) { 882e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 883e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 884cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 885cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber DTS = ((uint64_t)br->getBits(3)) << 30; 886e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (br->getBits(1) != 1u) { 887e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 888e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 889cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber DTS |= ((uint64_t)br->getBits(15)) << 15; 890e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (br->getBits(1) != 1u) { 891e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 892e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 893cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber DTS |= br->getBits(15); 894e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (br->getBits(1) != 1u) { 895e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 896e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 897cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 898b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross ALOGV("DTS = %" PRIu64, DTS); 899cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 900cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber optional_bytes_remaining -= 5; 901cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 902cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 903cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 904cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (ESCR_flag) { 905e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (optional_bytes_remaining < 6u) { 906e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 907e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 908cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 909cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber br->getBits(2); 910cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 911cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber uint64_t ESCR = ((uint64_t)br->getBits(3)) << 30; 912e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (br->getBits(1) != 1u) { 913e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 914e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 915cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber ESCR |= ((uint64_t)br->getBits(15)) << 15; 916e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (br->getBits(1) != 1u) { 917e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 918e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 919cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber ESCR |= br->getBits(15); 920e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (br->getBits(1) != 1u) { 921e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 922e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 923cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 924b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross ALOGV("ESCR = %" PRIu64, ESCR); 9256e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV("ESCR_extension = %u", br->getBits(9)); 926cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 927e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (br->getBits(1) != 1u) { 928e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 929e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 930cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 931cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber optional_bytes_remaining -= 6; 932cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 933cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 934cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (ES_rate_flag) { 935e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (optional_bytes_remaining < 3u) { 936e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 937e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 938cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 939e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (br->getBits(1) != 1u) { 940e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 941e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 9426e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV("ES_rate = %u", br->getBits(22)); 943e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (br->getBits(1) != 1u) { 944e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 945e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 946cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 947cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber optional_bytes_remaining -= 3; 948cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 949cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 950cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber br->skipBits(optional_bytes_remaining * 8); 951cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 952cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber // ES data follows. 953cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 954cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (PES_packet_length != 0) { 955e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (PES_packet_length < PES_header_data_length + 3) { 956e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 957e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 958cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 959cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned dataLength = 960cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber PES_packet_length - 3 - PES_header_data_length; 961cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 9625403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber if (br->numBitsLeft() < dataLength * 8) { 96329357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("PES packet does not carry enough data to contain " 964b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross "payload. (numBitsLeft = %zu, required = %u)", 9655403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber br->numBitsLeft(), dataLength * 8); 9665403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber 9675403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber return ERROR_MALFORMED; 9685403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber } 9695403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber 970e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (br->numBitsLeft() < dataLength * 8) { 971e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 972e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 9730da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber 9740da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber onPayloadData( 9750da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber PTS_DTS_flags, PTS, DTS, br->data(), dataLength); 976cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 977cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber br->skipBits(dataLength * 8); 978cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } else { 9790da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber onPayloadData( 9800da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber PTS_DTS_flags, PTS, DTS, 9810da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber br->data(), br->numBitsLeft() / 8); 9820da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber 983cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber size_t payloadSizeBits = br->numBitsLeft(); 984e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (payloadSizeBits % 8 != 0u) { 985e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 986e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 987cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 988b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross ALOGV("There's %zu bytes of payload.", payloadSizeBits / 8); 989cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 990cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } else if (stream_id == 0xbe) { // padding_stream 991e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (PES_packet_length == 0u) { 992e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 993e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 994cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber br->skipBits(PES_packet_length * 8); 995cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } else { 996e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (PES_packet_length == 0u) { 997e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 998e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 999cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber br->skipBits(PES_packet_length * 8); 1000cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 10015403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber 10025403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber return OK; 1003cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 1004cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 10055403129e2a2f44620f2ac8109889e5a61be08732Andreas Huberstatus_t ATSParser::Stream::flush() { 1006cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (mBuffer->size() == 0) { 10075403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber return OK; 1008cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 1009cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1010b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross ALOGV("flushing stream 0x%04x size = %zu", mElementaryPID, mBuffer->size()); 1011cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1012cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber ABitReader br(mBuffer->data(), mBuffer->size()); 10135403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber 10145403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber status_t err = parsePES(&br); 1015cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1016cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber mBuffer->setRange(0, 0); 10175403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber 10185403129e2a2f44620f2ac8109889e5a61be08732Andreas Huber return err; 1019cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 1020cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1021cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubervoid ATSParser::Stream::onPayloadData( 102284333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber unsigned PTS_DTS_flags, uint64_t PTS, uint64_t /* DTS */, 1023cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber const uint8_t *data, size_t size) { 102490a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber#if 0 102590a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber ALOGI("payload streamType 0x%02x, PTS = 0x%016llx, dPTS = %lld", 102690a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber mStreamType, 102790a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber PTS, 102890a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber (int64_t)PTS - mPrevPTS); 102990a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber mPrevPTS = PTS; 103090a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber#endif 103190a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber 10323856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("onPayloadData mStreamType=0x%02x", mStreamType); 1033cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 103498a46cf165d8de3779874eba01803bbc485f45b9Andreas Huber int64_t timeUs = 0ll; // no presentation timestamp available. 103598a46cf165d8de3779874eba01803bbc485f45b9Andreas Huber if (PTS_DTS_flags == 2 || PTS_DTS_flags == 3) { 103698a46cf165d8de3779874eba01803bbc485f45b9Andreas Huber timeUs = mProgram->convertPTSToTimestamp(PTS); 103798a46cf165d8de3779874eba01803bbc485f45b9Andreas Huber } 103882f7321b03eec1e40af9d681370f754ee0279582Andreas Huber 1039386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber status_t err = mQueue->appendData(data, size, timeUs); 1040decd96988e495133e4a1728f612d4c9fdb4d218eAndreas Huber 1041be9634d071e79b72a42a4504f64eda9e2a0bceb8Marco Nelissen if (mEOSReached) { 1042be9634d071e79b72a42a4504f64eda9e2a0bceb8Marco Nelissen mQueue->signalEOS(); 1043be9634d071e79b72a42a4504f64eda9e2a0bceb8Marco Nelissen } 1044be9634d071e79b72a42a4504f64eda9e2a0bceb8Marco Nelissen 1045decd96988e495133e4a1728f612d4c9fdb4d218eAndreas Huber if (err != OK) { 1046decd96988e495133e4a1728f612d4c9fdb4d218eAndreas Huber return; 1047decd96988e495133e4a1728f612d4c9fdb4d218eAndreas Huber } 104882f7321b03eec1e40af9d681370f754ee0279582Andreas Huber 10496a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber sp<ABuffer> accessUnit; 1050386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber while ((accessUnit = mQueue->dequeueAccessUnit()) != NULL) { 10516a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber if (mSource == NULL) { 1052386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber sp<MetaData> meta = mQueue->getFormat(); 105382f7321b03eec1e40af9d681370f754ee0279582Andreas Huber 10546a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber if (meta != NULL) { 10553856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Stream PID 0x%08x of type 0x%02x now has data.", 1056386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber mElementaryPID, mStreamType); 1057386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber 1058309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih const char *mime; 1059309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih if (meta->findCString(kKeyMIMEType, &mime) 1060309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih && !strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_AVC) 1061309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih && !IsIDR(accessUnit)) { 1062309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih continue; 1063309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih } 10646a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber mSource = new AnotherPacketSource(meta); 10656a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber mSource->queueAccessUnit(accessUnit); 106682f7321b03eec1e40af9d681370f754ee0279582Andreas Huber } 1067386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber } else if (mQueue->getFormat() != NULL) { 10682a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber // After a discontinuity we invalidate the queue's format 10692a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber // and won't enqueue any access units to the source until 10702a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber // the queue has reestablished the new format. 10715bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 10725bc087c573c70c84c6a39946457590b42d392a33Andreas Huber if (mSource->getFormat() == NULL) { 1073386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber mSource->setFormat(mQueue->getFormat()); 10745bc087c573c70c84c6a39946457590b42d392a33Andreas Huber } 10756a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber mSource->queueAccessUnit(accessUnit); 107682f7321b03eec1e40af9d681370f754ee0279582Andreas Huber } 107782f7321b03eec1e40af9d681370f754ee0279582Andreas Huber } 107882f7321b03eec1e40af9d681370f754ee0279582Andreas Huber} 107982f7321b03eec1e40af9d681370f754ee0279582Andreas Huber 1080cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubersp<MediaSource> ATSParser::Stream::getSource(SourceType type) { 1081386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber switch (type) { 1082386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber case VIDEO: 1083386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber { 10846e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (isVideo()) { 1085386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber return mSource; 1086386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber } 1087386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber break; 1088386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber } 1089386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber 1090386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber case AUDIO: 1091386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber { 10926e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (isAudio()) { 1093386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber return mSource; 1094386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber } 1095386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber break; 1096386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber } 1097386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber 10980852843d304006e3ab333081fddda13b07193de8Robert Shih case META: 10990852843d304006e3ab333081fddda13b07193de8Robert Shih { 11000852843d304006e3ab333081fddda13b07193de8Robert Shih if (isMeta()) { 11010852843d304006e3ab333081fddda13b07193de8Robert Shih return mSource; 11020852843d304006e3ab333081fddda13b07193de8Robert Shih } 11030852843d304006e3ab333081fddda13b07193de8Robert Shih break; 11040852843d304006e3ab333081fddda13b07193de8Robert Shih } 11050852843d304006e3ab333081fddda13b07193de8Robert Shih 1106386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber default: 1107386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber break; 1108cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 1109cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1110cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber return NULL; 1111cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 1112cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1113cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber//////////////////////////////////////////////////////////////////////////////// 1114cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1115c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas HuberATSParser::ATSParser(uint32_t flags) 111687f2a558dd12043631e12c361abef301bf603140Andreas Huber : mFlags(flags), 111787f2a558dd12043631e12c361abef301bf603140Andreas Huber mAbsoluteTimeAnchorUs(-1ll), 1118d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber mTimeOffsetValid(false), 1119d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber mTimeOffsetUs(0ll), 1120d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang mLastRecoveredPTS(-1ll), 112187f2a558dd12043631e12c361abef301bf603140Andreas Huber mNumTSPacketsParsed(0), 112287f2a558dd12043631e12c361abef301bf603140Andreas Huber mNumPCRs(0) { 11238dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber mPSISections.add(0 /* PID */, new PSISection); 1124cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 1125cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1126cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas HuberATSParser::~ATSParser() { 1127cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 1128cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 112906528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huberstatus_t ATSParser::feedTSPacket(const void *data, size_t size) { 1130e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (size != kTSPacketSize) { 1131e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim ALOGE("Wrong TS packet size"); 1132e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return BAD_VALUE; 1133e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 1134cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1135cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber ABitReader br((const uint8_t *)data, kTSPacketSize); 113606528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber return parseTS(&br); 1137cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 1138cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 113932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Hubervoid ATSParser::signalDiscontinuity( 114032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber DiscontinuityType type, const sp<AMessage> &extra) { 1141b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber int64_t mediaTimeUs; 1142d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang if ((type & DISCONTINUITY_TIME) && extra != NULL) { 1143d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang if (extra->findInt64(IStreamListener::kKeyMediaTimeUs, &mediaTimeUs)) { 1144d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang mAbsoluteTimeAnchorUs = mediaTimeUs; 1145d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang } 1146d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang if ((mFlags & TS_TIMESTAMPS_ARE_ABSOLUTE) 1147d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang && extra->findInt64( 1148d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang IStreamListener::kKeyRecentMediaTimeUs, &mediaTimeUs)) { 1149d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang if (mAbsoluteTimeAnchorUs >= 0ll) { 1150d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang mediaTimeUs -= mAbsoluteTimeAnchorUs; 1151d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang } 1152d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang if (mTimeOffsetValid) { 1153d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang mediaTimeUs -= mTimeOffsetUs; 1154d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang } 1155d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang mLastRecoveredPTS = (mediaTimeUs * 9) / 100; 1156d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang } 1157b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber } else if (type == DISCONTINUITY_ABSOLUTE_TIME) { 115887f2a558dd12043631e12c361abef301bf603140Andreas Huber int64_t timeUs; 1159e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (!extra->findInt64("timeUs", &timeUs)) { 1160e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim ALOGE("timeUs not found"); 1161e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return; 1162e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 116387f2a558dd12043631e12c361abef301bf603140Andreas Huber 1164e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (!mPrograms.empty()) { 1165e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim ALOGE("mPrograms is not empty"); 1166e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return; 1167e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 116887f2a558dd12043631e12c361abef301bf603140Andreas Huber mAbsoluteTimeAnchorUs = timeUs; 116987f2a558dd12043631e12c361abef301bf603140Andreas Huber return; 1170d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber } else if (type == DISCONTINUITY_TIME_OFFSET) { 1171d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber int64_t offset; 1172e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (!extra->findInt64("offset", &offset)) { 1173e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim ALOGE("offset not found"); 1174e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return; 1175e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 1176d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber 1177d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber mTimeOffsetValid = true; 1178d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber mTimeOffsetUs = offset; 1179d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber return; 118087f2a558dd12043631e12c361abef301bf603140Andreas Huber } 118187f2a558dd12043631e12c361abef301bf603140Andreas Huber 1182f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (size_t i = 0; i < mPrograms.size(); ++i) { 118332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber mPrograms.editItemAt(i)->signalDiscontinuity(type, extra); 1184f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1185f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1186f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1187f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ATSParser::signalEOS(status_t finalResult) { 1188e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (finalResult == (status_t) OK) { 1189e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim ALOGE("finalResult not OK"); 1190e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return; 1191e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 1192f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 11932a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber for (size_t i = 0; i < mPrograms.size(); ++i) { 1194f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mPrograms.editItemAt(i)->signalEOS(finalResult); 11952a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber } 11962a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber} 11972a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber 1198cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubervoid ATSParser::parseProgramAssociationTable(ABitReader *br) { 1199cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned table_id = br->getBits(8); 12003856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV(" table_id = %u", table_id); 12016456ae745e919085c5024f784aaa2703f9695f98David Yeh if (table_id != 0x00u) { 12026456ae745e919085c5024f784aaa2703f9695f98David Yeh ALOGE("PAT data error!"); 12036456ae745e919085c5024f784aaa2703f9695f98David Yeh return ; 12046456ae745e919085c5024f784aaa2703f9695f98David Yeh } 1205cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned section_syntax_indictor = br->getBits(1); 12063856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV(" section_syntax_indictor = %u", section_syntax_indictor); 1207cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1208e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim br->skipBits(1); // '0' 12096e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" reserved = %u", br->getBits(2)); 1210cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1211cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned section_length = br->getBits(12); 12123856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV(" section_length = %u", section_length); 1213cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 12146e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" transport_stream_id = %u", br->getBits(16)); 12156e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" reserved = %u", br->getBits(2)); 12166e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" version_number = %u", br->getBits(5)); 12176e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" current_next_indicator = %u", br->getBits(1)); 12186e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" section_number = %u", br->getBits(8)); 12196e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" last_section_number = %u", br->getBits(8)); 1220cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1221cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber size_t numProgramBytes = (section_length - 5 /* header */ - 4 /* crc */); 1222cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1223cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber for (size_t i = 0; i < numProgramBytes / 4; ++i) { 1224cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned program_number = br->getBits(16); 12253856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV(" program_number = %u", program_number); 1226cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 12276e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" reserved = %u", br->getBits(3)); 1228cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1229cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (program_number == 0) { 12306e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" network_PID = 0x%04x", br->getBits(13)); 1231cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } else { 1232cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned programMapPID = br->getBits(13); 1233cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 12343856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV(" program_map_PID = 0x%04x", programMapPID); 1235cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1236386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber bool found = false; 1237386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber for (size_t index = 0; index < mPrograms.size(); ++index) { 1238386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber const sp<Program> &program = mPrograms.itemAt(index); 1239386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber 1240386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber if (program->number() == program_number) { 1241386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber program->updateProgramMapPID(programMapPID); 1242386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber found = true; 1243386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber break; 1244386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber } 1245386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber } 1246386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber 1247386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber if (!found) { 1248386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber mPrograms.push( 1249d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang new Program(this, program_number, programMapPID, mLastRecoveredPTS)); 1250386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber } 12518dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 12528dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber if (mPSISections.indexOfKey(programMapPID) < 0) { 12538dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber mPSISections.add(programMapPID, new PSISection); 12548dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber } 1255cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 1256cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 1257cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 12586e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV(" CRC = 0x%08x", br->getBits(32)); 1259cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 1260cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 126106528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huberstatus_t ATSParser::parsePID( 1262cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber ABitReader *br, unsigned PID, 126387f2a558dd12043631e12c361abef301bf603140Andreas Huber unsigned continuity_counter, 1264cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned payload_unit_start_indicator) { 12658dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber ssize_t sectionIndex = mPSISections.indexOfKey(PID); 12668dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 12678dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber if (sectionIndex >= 0) { 12684b4bb11b8747adeb2efe56c7df4ab6803dd7db41Andreas Huber sp<PSISection> section = mPSISections.valueAt(sectionIndex); 12698dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 1270cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (payload_unit_start_indicator) { 12716456ae745e919085c5024f784aaa2703f9695f98David Yeh if (!section->isEmpty()) { 12729bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang ALOGW("parsePID encounters payload_unit_start_indicator when section is not empty"); 12739bcf3ae6c9a413afc7accb5b48db3e5c3c829785Chong Zhang section->clear(); 12746456ae745e919085c5024f784aaa2703f9695f98David Yeh } 12758dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 1276cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned skip = br->getBits(8); 12779ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim section->setSkipBytes(skip + 1); // skip filler bytes + pointer field itself 1278cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber br->skipBits(skip * 8); 1279cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 12808dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 1281e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (br->numBitsLeft() % 8 != 0) { 1282e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 1283e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 12848dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber status_t err = section->append(br->data(), br->numBitsLeft() / 8); 12858dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 12868dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber if (err != OK) { 12878dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber return err; 12888dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber } 12898dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 12908dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber if (!section->isComplete()) { 12918dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber return OK; 12928dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber } 12938dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 12949ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim if (!section->isCRCOkay()) { 12959ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim return BAD_VALUE; 12969ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim } 12978dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber ABitReader sectionBits(section->data(), section->size()); 12988dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 12998dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber if (PID == 0) { 13008dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber parseProgramAssociationTable(§ionBits); 13018dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber } else { 13028dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber bool handled = false; 13038dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber for (size_t i = 0; i < mPrograms.size(); ++i) { 13048dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber status_t err; 13058dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber if (!mPrograms.editItemAt(i)->parsePSISection( 13068dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber PID, §ionBits, &err)) { 13078dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber continue; 13088dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber } 13098dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 13108dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber if (err != OK) { 13118dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber return err; 13128dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber } 13138dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 13148dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber handled = true; 13158dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber break; 13168dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber } 13178dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 13188dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber if (!handled) { 13198dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber mPSISections.removeItem(PID); 13204b4bb11b8747adeb2efe56c7df4ab6803dd7db41Andreas Huber section.clear(); 13218dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber } 13228dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber } 13238dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 13244b4bb11b8747adeb2efe56c7df4ab6803dd7db41Andreas Huber if (section != NULL) { 13254b4bb11b8747adeb2efe56c7df4ab6803dd7db41Andreas Huber section->clear(); 13264b4bb11b8747adeb2efe56c7df4ab6803dd7db41Andreas Huber } 13278dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 132806528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber return OK; 1329cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 1330cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1331cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber bool handled = false; 1332cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber for (size_t i = 0; i < mPrograms.size(); ++i) { 133306528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber status_t err; 1334cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (mPrograms.editItemAt(i)->parsePID( 133587f2a558dd12043631e12c361abef301bf603140Andreas Huber PID, continuity_counter, payload_unit_start_indicator, 133687f2a558dd12043631e12c361abef301bf603140Andreas Huber br, &err)) { 133706528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber if (err != OK) { 133806528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber return err; 133906528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber } 134006528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber 1341cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber handled = true; 1342cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber break; 1343cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 1344cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 1345cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1346cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (!handled) { 13473856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("PID 0x%04x not handled.", PID); 1348cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 134906528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber 135006528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber return OK; 1351cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 1352cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1353e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kimstatus_t ATSParser::parseAdaptationField(ABitReader *br, unsigned PID) { 1354cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned adaptation_field_length = br->getBits(8); 135587f2a558dd12043631e12c361abef301bf603140Andreas Huber 1356cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (adaptation_field_length > 0) { 135787f2a558dd12043631e12c361abef301bf603140Andreas Huber unsigned discontinuity_indicator = br->getBits(1); 135887f2a558dd12043631e12c361abef301bf603140Andreas Huber 135987f2a558dd12043631e12c361abef301bf603140Andreas Huber if (discontinuity_indicator) { 136087f2a558dd12043631e12c361abef301bf603140Andreas Huber ALOGV("PID 0x%04x: discontinuity_indicator = 1 (!!!)", PID); 136187f2a558dd12043631e12c361abef301bf603140Andreas Huber } 136287f2a558dd12043631e12c361abef301bf603140Andreas Huber 136387f2a558dd12043631e12c361abef301bf603140Andreas Huber br->skipBits(2); 136487f2a558dd12043631e12c361abef301bf603140Andreas Huber unsigned PCR_flag = br->getBits(1); 136587f2a558dd12043631e12c361abef301bf603140Andreas Huber 136687f2a558dd12043631e12c361abef301bf603140Andreas Huber size_t numBitsRead = 4; 136787f2a558dd12043631e12c361abef301bf603140Andreas Huber 136887f2a558dd12043631e12c361abef301bf603140Andreas Huber if (PCR_flag) { 1369e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (adaptation_field_length * 8 < 52) { 1370e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return ERROR_MALFORMED; 1371e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 137287f2a558dd12043631e12c361abef301bf603140Andreas Huber br->skipBits(4); 137387f2a558dd12043631e12c361abef301bf603140Andreas Huber uint64_t PCR_base = br->getBits(32); 137487f2a558dd12043631e12c361abef301bf603140Andreas Huber PCR_base = (PCR_base << 1) | br->getBits(1); 137587f2a558dd12043631e12c361abef301bf603140Andreas Huber 137687f2a558dd12043631e12c361abef301bf603140Andreas Huber br->skipBits(6); 137787f2a558dd12043631e12c361abef301bf603140Andreas Huber unsigned PCR_ext = br->getBits(9); 137887f2a558dd12043631e12c361abef301bf603140Andreas Huber 137987f2a558dd12043631e12c361abef301bf603140Andreas Huber // The number of bytes from the start of the current 138087f2a558dd12043631e12c361abef301bf603140Andreas Huber // MPEG2 transport stream packet up and including 138187f2a558dd12043631e12c361abef301bf603140Andreas Huber // the final byte of this PCR_ext field. 138287f2a558dd12043631e12c361abef301bf603140Andreas Huber size_t byteOffsetFromStartOfTSPacket = 138387f2a558dd12043631e12c361abef301bf603140Andreas Huber (188 - br->numBitsLeft() / 8); 138487f2a558dd12043631e12c361abef301bf603140Andreas Huber 138587f2a558dd12043631e12c361abef301bf603140Andreas Huber uint64_t PCR = PCR_base * 300 + PCR_ext; 138687f2a558dd12043631e12c361abef301bf603140Andreas Huber 1387b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross ALOGV("PID 0x%04x: PCR = 0x%016" PRIx64 " (%.2f)", 138887f2a558dd12043631e12c361abef301bf603140Andreas Huber PID, PCR, PCR / 27E6); 138987f2a558dd12043631e12c361abef301bf603140Andreas Huber 139087f2a558dd12043631e12c361abef301bf603140Andreas Huber // The number of bytes received by this parser up to and 139187f2a558dd12043631e12c361abef301bf603140Andreas Huber // including the final byte of this PCR_ext field. 139287f2a558dd12043631e12c361abef301bf603140Andreas Huber size_t byteOffsetFromStart = 139387f2a558dd12043631e12c361abef301bf603140Andreas Huber mNumTSPacketsParsed * 188 + byteOffsetFromStartOfTSPacket; 139487f2a558dd12043631e12c361abef301bf603140Andreas Huber 139587f2a558dd12043631e12c361abef301bf603140Andreas Huber for (size_t i = 0; i < mPrograms.size(); ++i) { 139687f2a558dd12043631e12c361abef301bf603140Andreas Huber updatePCR(PID, PCR, byteOffsetFromStart); 139787f2a558dd12043631e12c361abef301bf603140Andreas Huber } 139887f2a558dd12043631e12c361abef301bf603140Andreas Huber 139987f2a558dd12043631e12c361abef301bf603140Andreas Huber numBitsRead += 52; 140087f2a558dd12043631e12c361abef301bf603140Andreas Huber } 140187f2a558dd12043631e12c361abef301bf603140Andreas Huber 140287f2a558dd12043631e12c361abef301bf603140Andreas Huber br->skipBits(adaptation_field_length * 8 - numBitsRead); 1403cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 1404e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim return OK; 1405cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 1406cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 140706528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huberstatus_t ATSParser::parseTS(ABitReader *br) { 14083856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("---"); 1409cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1410cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned sync_byte = br->getBits(8); 14116456ae745e919085c5024f784aaa2703f9695f98David Yeh if (sync_byte != 0x47u) { 14126456ae745e919085c5024f784aaa2703f9695f98David Yeh ALOGE("[error] parseTS: return error as sync_byte=0x%x", sync_byte); 14136456ae745e919085c5024f784aaa2703f9695f98David Yeh return BAD_VALUE; 14146456ae745e919085c5024f784aaa2703f9695f98David Yeh } 1415cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 141652668ca838e1869676ff95e7388f93ec1858b1e9Andreas Huber if (br->getBits(1)) { // transport_error_indicator 141752668ca838e1869676ff95e7388f93ec1858b1e9Andreas Huber // silently ignore. 141852668ca838e1869676ff95e7388f93ec1858b1e9Andreas Huber return OK; 141952668ca838e1869676ff95e7388f93ec1858b1e9Andreas Huber } 1420cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1421cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned payload_unit_start_indicator = br->getBits(1); 14223856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("payload_unit_start_indicator = %u", payload_unit_start_indicator); 1423cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 14246e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV("transport_priority = %u", br->getBits(1)); 1425cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1426cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned PID = br->getBits(13); 14273856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("PID = 0x%04x", PID); 1428cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 14296e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber MY_LOGV("transport_scrambling_control = %u", br->getBits(2)); 1430cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1431cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned adaptation_field_control = br->getBits(2); 14323856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("adaptation_field_control = %u", adaptation_field_control); 1433cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 14340da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber unsigned continuity_counter = br->getBits(4); 143587f2a558dd12043631e12c361abef301bf603140Andreas Huber ALOGV("PID = 0x%04x, continuity_counter = %u", PID, continuity_counter); 14360da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber 1437df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block // ALOGI("PID = 0x%04x, continuity_counter = %u", PID, continuity_counter); 1438cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 143987f2a558dd12043631e12c361abef301bf603140Andreas Huber status_t err = OK; 144087f2a558dd12043631e12c361abef301bf603140Andreas Huber 1441e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (adaptation_field_control == 2 || adaptation_field_control == 3) { 1442e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim err = parseAdaptationField(br, PID); 1443e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 1444e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (err == OK) { 1445e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim if (adaptation_field_control == 1 || adaptation_field_control == 3) { 1446e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim err = parsePID( 1447e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim br, PID, continuity_counter, payload_unit_start_indicator); 1448e314c678ea0b53dd9296ba6b5c3272c702433b47Jinsuk Kim } 1449cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 145006528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber 145187f2a558dd12043631e12c361abef301bf603140Andreas Huber ++mNumTSPacketsParsed; 145287f2a558dd12043631e12c361abef301bf603140Andreas Huber 145387f2a558dd12043631e12c361abef301bf603140Andreas Huber return err; 1454cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 1455cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1456cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubersp<MediaSource> ATSParser::getSource(SourceType type) { 1457386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber int which = -1; // any 1458386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber 1459cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber for (size_t i = 0; i < mPrograms.size(); ++i) { 1460386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber const sp<Program> &program = mPrograms.editItemAt(i); 1461386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber 1462386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber if (which >= 0 && (int)program->number() != which) { 1463386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber continue; 1464386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber } 1465386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber 1466386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber sp<MediaSource> source = program->getSource(type); 1467cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1468cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber if (source != NULL) { 1469cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber return source; 1470cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 1471cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } 1472cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1473cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber return NULL; 1474cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} 1475cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1476bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shihbool ATSParser::hasSource(SourceType type) const { 1477bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih for (size_t i = 0; i < mPrograms.size(); ++i) { 1478bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih const sp<Program> &program = mPrograms.itemAt(i); 1479bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih if (program->hasSource(type)) { 1480bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih return true; 1481bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih } 1482bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih } 1483bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih 1484bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih return false; 1485bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih} 1486bf20727f0aaf609bc3b495b07b45822b137d21baRobert Shih 148743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huberbool ATSParser::PTSTimeDeltaEstablished() { 148843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mPrograms.isEmpty()) { 148943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber return false; 149043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 149143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 149243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber return mPrograms.editItemAt(0)->PTSTimeDeltaEstablished(); 149343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber} 149443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 149587f2a558dd12043631e12c361abef301bf603140Andreas Hubervoid ATSParser::updatePCR( 149684333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber unsigned /* PID */, uint64_t PCR, size_t byteOffsetFromStart) { 1497b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross ALOGV("PCR 0x%016" PRIx64 " @ %zu", PCR, byteOffsetFromStart); 149887f2a558dd12043631e12c361abef301bf603140Andreas Huber 149987f2a558dd12043631e12c361abef301bf603140Andreas Huber if (mNumPCRs == 2) { 150087f2a558dd12043631e12c361abef301bf603140Andreas Huber mPCR[0] = mPCR[1]; 150187f2a558dd12043631e12c361abef301bf603140Andreas Huber mPCRBytes[0] = mPCRBytes[1]; 150287f2a558dd12043631e12c361abef301bf603140Andreas Huber mSystemTimeUs[0] = mSystemTimeUs[1]; 150387f2a558dd12043631e12c361abef301bf603140Andreas Huber mNumPCRs = 1; 150487f2a558dd12043631e12c361abef301bf603140Andreas Huber } 150587f2a558dd12043631e12c361abef301bf603140Andreas Huber 150687f2a558dd12043631e12c361abef301bf603140Andreas Huber mPCR[mNumPCRs] = PCR; 150787f2a558dd12043631e12c361abef301bf603140Andreas Huber mPCRBytes[mNumPCRs] = byteOffsetFromStart; 150887f2a558dd12043631e12c361abef301bf603140Andreas Huber mSystemTimeUs[mNumPCRs] = ALooper::GetNowUs(); 150987f2a558dd12043631e12c361abef301bf603140Andreas Huber 151087f2a558dd12043631e12c361abef301bf603140Andreas Huber ++mNumPCRs; 151187f2a558dd12043631e12c361abef301bf603140Andreas Huber 151287f2a558dd12043631e12c361abef301bf603140Andreas Huber if (mNumPCRs == 2) { 151387f2a558dd12043631e12c361abef301bf603140Andreas Huber double transportRate = 151487f2a558dd12043631e12c361abef301bf603140Andreas Huber (mPCRBytes[1] - mPCRBytes[0]) * 27E6 / (mPCR[1] - mPCR[0]); 151587f2a558dd12043631e12c361abef301bf603140Andreas Huber 151687f2a558dd12043631e12c361abef301bf603140Andreas Huber ALOGV("transportRate = %.2f bytes/sec", transportRate); 151787f2a558dd12043631e12c361abef301bf603140Andreas Huber } 151887f2a558dd12043631e12c361abef301bf603140Andreas Huber} 151987f2a558dd12043631e12c361abef301bf603140Andreas Huber 15208dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber//////////////////////////////////////////////////////////////////////////////// 15218dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 15229ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 15239ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim// CRC32 used for PSI section. The table was generated by following command: 15249ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim// $ python pycrc.py --model crc-32-mpeg --algorithm table-driven --generate c 15259ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim// Visit http://www.tty1.net/pycrc/index_en.html for more details. 15269ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kimuint32_t ATSParser::PSISection::CRC_TABLE[] = { 15279ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9, 15289ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x130476dc, 0x17c56b6b, 0x1a864db2, 0x1e475005, 15299ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61, 15309ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd, 15319ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9, 15329ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75, 15339ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011, 15349ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x791d4014, 0x7ddc5da3, 0x709f7b7a, 0x745e66cd, 15359ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039, 15369ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, 15379ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0xbe2b5b58, 0xbaea46ef, 0xb7a96036, 0xb3687d81, 15389ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d, 15399ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49, 15409ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95, 15419ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1, 15429ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, 15439ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x34867077, 0x30476dc0, 0x3d044b19, 0x39c556ae, 15449ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072, 15459ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16, 15469ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca, 15479ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde, 15489ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02, 15499ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x5e9f46bf, 0x5a5e5b08, 0x571d7dd1, 0x53dc6066, 15509ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba, 15519ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, 15529ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0xbfa1b04b, 0xbb60adfc, 0xb6238b25, 0xb2e29692, 15539ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6, 15549ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a, 15559ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e, 15569ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2, 15579ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686, 15589ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0xd5b88683, 0xd1799b34, 0xdc3abded, 0xd8fba05a, 15599ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637, 15609ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb, 15619ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f, 15629ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53, 15639ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47, 15649ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x36194d42, 0x32d850f5, 0x3f9b762c, 0x3b5a6b9b, 15659ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff, 15669ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623, 15679ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0xf12f560e, 0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7, 15689ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b, 15699ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f, 15709ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3, 15719ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7, 15729ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b, 15739ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x9b3660c6, 0x9ff77d71, 0x92b45ba8, 0x9675461f, 15749ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3, 15759ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640, 15769ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c, 15779ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8, 15789ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24, 15799ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x119b4be9, 0x155a565e, 0x18197087, 0x1cd86d30, 15809ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec, 15819ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, 15829ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x2497d08d, 0x2056cd3a, 0x2d15ebe3, 0x29d4f654, 15839ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0, 15849ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c, 15859ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18, 15869ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4, 15879ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0, 15889ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0x9abc8bd5, 0x9e7d9662, 0x933eb0bb, 0x97ffad0c, 15899ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668, 15909ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4 15919ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim }; 15929ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 15939ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk KimATSParser::PSISection::PSISection() : 15949ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim mSkipBytes(0) { 15958dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber} 15968dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 15978dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas HuberATSParser::PSISection::~PSISection() { 15988dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber} 15998dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 16008dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberstatus_t ATSParser::PSISection::append(const void *data, size_t size) { 16018dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber if (mBuffer == NULL || mBuffer->size() + size > mBuffer->capacity()) { 16028dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber size_t newCapacity = 16038dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber (mBuffer == NULL) ? size : mBuffer->capacity() + size; 16048dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 16058dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber newCapacity = (newCapacity + 1023) & ~1023; 16068dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 16078dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber sp<ABuffer> newBuffer = new ABuffer(newCapacity); 16088dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 16098dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber if (mBuffer != NULL) { 16108dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber memcpy(newBuffer->data(), mBuffer->data(), mBuffer->size()); 16118dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber newBuffer->setRange(0, mBuffer->size()); 16128dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber } else { 16138dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber newBuffer->setRange(0, 0); 16148dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber } 16158dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 16168dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber mBuffer = newBuffer; 16178dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber } 16188dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 16198dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber memcpy(mBuffer->data() + mBuffer->size(), data, size); 16208dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber mBuffer->setRange(0, mBuffer->size() + size); 16218dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 16228dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber return OK; 16238dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber} 16248dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 16259ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kimvoid ATSParser::PSISection::setSkipBytes(uint8_t skip) { 16269ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim mSkipBytes = skip; 16279ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim} 16289ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 16298dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Hubervoid ATSParser::PSISection::clear() { 16308dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber if (mBuffer != NULL) { 16318dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber mBuffer->setRange(0, 0); 16328dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber } 16339ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim mSkipBytes = 0; 16348dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber} 16358dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 16368dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberbool ATSParser::PSISection::isComplete() const { 16378dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber if (mBuffer == NULL || mBuffer->size() < 3) { 16388dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber return false; 16398dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber } 16408dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 16418dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber unsigned sectionLength = U16_AT(mBuffer->data() + 1) & 0xfff; 16428dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber return mBuffer->size() >= sectionLength + 3; 16438dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber} 16448dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 16458dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberbool ATSParser::PSISection::isEmpty() const { 16468dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber return mBuffer == NULL || mBuffer->size() == 0; 16478dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber} 16488dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 16498dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huberconst uint8_t *ATSParser::PSISection::data() const { 16508dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber return mBuffer == NULL ? NULL : mBuffer->data(); 16518dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber} 16528dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 16538dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Hubersize_t ATSParser::PSISection::size() const { 16548dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber return mBuffer == NULL ? 0 : mBuffer->size(); 16558dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber} 16568dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 16579ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kimbool ATSParser::PSISection::isCRCOkay() const { 16589ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim if (!isComplete()) { 16599ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim return false; 16609ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim } 16619ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim uint8_t* data = mBuffer->data(); 16629ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 16639ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim // Return true if section_syntax_indicator says no section follows the field section_length. 16649ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim if ((data[1] & 0x80) == 0) { 16659ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim return true; 16669ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim } 16679ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 16689ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim unsigned sectionLength = U16_AT(data + 1) & 0xfff; 16699ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim ALOGV("sectionLength %u, skip %u", sectionLength, mSkipBytes); 16709ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 16719ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim // Skip the preceding field present when payload start indicator is on. 16729ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim sectionLength -= mSkipBytes; 16739ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim 16749ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim uint32_t crc = 0xffffffff; 16759ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim for(unsigned i = 0; i < sectionLength + 4 /* crc */; i++) { 16769ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim uint8_t b = data[i]; 16779ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim int index = ((crc >> 24) ^ (b & 0xff)) & 0xff; 16789ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim crc = CRC_TABLE[index] ^ (crc << 8); 16799ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim } 16809ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim ALOGV("crc: %08x\n", crc); 16819ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim return (crc == 0); 16829ca7b9c74e882526ee5810ff62f203bf75cd3f1aJinsuk Kim} 1683cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} // namespace android 1684