ATSParser.h revision f2f072e87718ecf6df40ba51b95e2a93bc68f720
171daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org/* 243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Copyright (C) 2010 The Android Open Source Project 343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * 443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Licensed under the Apache License, Version 2.0 (the "License"); 543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * you may not use this file except in compliance with the License. 643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * You may obtain a copy of the License at 743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * 843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * http://www.apache.org/licenses/LICENSE-2.0 943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * 1043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Unless required by applicable law or agreed to in writing, software 1143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * distributed under the License is distributed on an "AS IS" BASIS, 1243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * See the License for the specific language governing permissions and 1443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * limitations under the License. 1543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */ 1643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#ifndef A_TS_PARSER_H_ 1843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#define A_TS_PARSER_H_ 2043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include <sys/types.h> 2243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include <media/stagefright/foundation/ABase.h> 2443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include <media/stagefright/foundation/AMessage.h> 2543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include <utils/KeyedVector.h> 2643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include <utils/Vector.h> 2743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include <utils/RefBase.h> 2843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansennamespace android { 3043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenstruct ABitReader; 32f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.orgstruct ABuffer; 33d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.orgstruct MediaSource; 3401beca7f8d9f549e04ec575a0bca96d859ab55a5ager@chromium.org 3543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenstruct ATSParser : public RefBase { 36f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org enum DiscontinuityType { 37f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org DISCONTINUITY_NONE = 0, 387c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org DISCONTINUITY_TIME = 1, 3943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DISCONTINUITY_AUDIO_FORMAT = 2, 4071affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org DISCONTINUITY_VIDEO_FORMAT = 4, 4171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org DISCONTINUITY_ABSOLUTE_TIME = 8, 4243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DISCONTINUITY_TIME_OFFSET = 16, 4343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 4443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // For legacy reasons this also implies a time discontinuity. 4543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DISCONTINUITY_FORMATCHANGE = 4643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DISCONTINUITY_AUDIO_FORMAT 4743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen | DISCONTINUITY_VIDEO_FORMAT 4843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen | DISCONTINUITY_TIME, 4943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen }; 5043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 5143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen enum Flags { 5243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // The 90kHz clock (PTS/DTS) is absolute, i.e. PTS=0 corresponds to 5343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // a media time of 0. 5443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // If this flag is _not_ specified, the first PTS encountered in a 5543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // program of this stream will be assumed to correspond to media time 0 5643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // instead. 5743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen TS_TIMESTAMPS_ARE_ABSOLUTE = 1, 5843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Video PES packets contain exactly one (aligned) access unit. 5943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ALIGNED_VIDEO_DATA = 2, 6043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen }; 6143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 6243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ATSParser(uint32_t flags = 0); 6343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 6443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen status_t feedTSPacket(const void *data, size_t size); 6543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 6643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void signalDiscontinuity( 6743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DiscontinuityType type, const sp<AMessage> &extra); 6843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 6943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void signalEOS(status_t finalResult); 7043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 7143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen enum SourceType { 7243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen VIDEO = 0, 7343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen AUDIO = 1, 7443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen NUM_SOURCE_TYPES = 2 7543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen }; 7643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen sp<MediaSource> getSource(SourceType type); 7743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 7843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen bool PTSTimeDeltaEstablished(); 7943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 8043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen enum { 8143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // From ISO/IEC 13818-1: 2000 (E), Table 2-29 8243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen STREAMTYPE_RESERVED = 0x00, 8343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen STREAMTYPE_MPEG1_VIDEO = 0x01, 8443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen STREAMTYPE_MPEG2_VIDEO = 0x02, 8543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen STREAMTYPE_MPEG1_AUDIO = 0x03, 8643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen STREAMTYPE_MPEG2_AUDIO = 0x04, 8743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen STREAMTYPE_MPEG2_AUDIO_ADTS = 0x0f, 88245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org STREAMTYPE_MPEG4_VIDEO = 0x10, 89245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org STREAMTYPE_H264 = 0x1b, 90245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org 9143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // From ATSC A/53 Part 3:2009, 6.7.1 9243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen STREAMTYPE_AC3 = 0x81, 9343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 9443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Stream type 0x83 is non-standard, 9543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // it could be LPCM or TrueHD AC3 9643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen STREAMTYPE_LPCM_AC3 = 0x83, 9743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen }; 9843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 9943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenprotected: 10043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen virtual ~ATSParser(); 10143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 10243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenprivate: 10343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen struct Program; 10443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen struct Stream; 10543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen struct PSISection; 10643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 10743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen uint32_t mFlags; 10843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Vector<sp<Program> > mPrograms; 10943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 11043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Keyed by PID 11143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen KeyedVector<unsigned, sp<PSISection> > mPSISections; 112245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org 113245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org int64_t mAbsoluteTimeAnchorUs; 114245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org 115245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org bool mTimeOffsetValid; 116245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org int64_t mTimeOffsetUs; 11743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 11843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen size_t mNumTSPacketsParsed; 11943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 12043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void parseProgramAssociationTable(ABitReader *br); 12143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void parseProgramMap(ABitReader *br); 12243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void parsePES(ABitReader *br); 12343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 12443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen status_t parsePID( 12543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ABitReader *br, unsigned PID, 12643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen unsigned continuity_counter, 12743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen unsigned payload_unit_start_indicator); 12843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 12943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void parseAdaptationField(ABitReader *br, unsigned PID); 1303811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org status_t parseTS(ABitReader *br); 1313811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 1323811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org void updatePCR(unsigned PID, uint64_t PCR, size_t byteOffsetFromStart); 13343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 13443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen uint64_t mPCR[2]; 135245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org size_t mPCRBytes[2]; 136245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org int64_t mSystemTimeUs[2]; 137245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org size_t mNumPCRs; 13843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 13943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DISALLOW_EVIL_CONSTRUCTORS(ATSParser); 140245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org}; 141245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org 14243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} // namespace android 14343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 144061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org#endif // A_TS_PARSER_H_ 145061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org