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 17cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#ifndef A_TS_PARSER_H_ 18cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 19cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#define A_TS_PARSER_H_ 20cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 21cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <sys/types.h> 22cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 23cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <media/stagefright/foundation/ABase.h> 24f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/AMessage.h> 258dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber#include <utils/KeyedVector.h> 26cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <utils/Vector.h> 27cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include <utils/RefBase.h> 28cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 29cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Hubernamespace android { 30cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 31cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberstruct ABitReader; 32f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ABuffer; 33cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberstruct MediaSource; 34cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 35cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huberstruct ATSParser : public RefBase { 36f933441648ef6a71dee783d733aac17b9508b452Andreas Huber enum DiscontinuityType { 376e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber DISCONTINUITY_NONE = 0, 386e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber DISCONTINUITY_TIME = 1, 396e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber DISCONTINUITY_AUDIO_FORMAT = 2, 406e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber DISCONTINUITY_VIDEO_FORMAT = 4, 4187f2a558dd12043631e12c361abef301bf603140Andreas Huber DISCONTINUITY_ABSOLUTE_TIME = 8, 42d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber DISCONTINUITY_TIME_OFFSET = 16, 436e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 446e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber DISCONTINUITY_SEEK = DISCONTINUITY_TIME, 456e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 466e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber // For legacy reasons this also implies a time discontinuity. 476e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber DISCONTINUITY_FORMATCHANGE = 486e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber DISCONTINUITY_AUDIO_FORMAT 496e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber | DISCONTINUITY_VIDEO_FORMAT 506e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber | DISCONTINUITY_TIME, 51f933441648ef6a71dee783d733aac17b9508b452Andreas Huber }; 52f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 53c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber enum Flags { 54c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber // The 90kHz clock (PTS/DTS) is absolute, i.e. PTS=0 corresponds to 55c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber // a media time of 0. 56c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber // If this flag is _not_ specified, the first PTS encountered in a 57c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber // program of this stream will be assumed to correspond to media time 0 58c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber // instead. 5987f2a558dd12043631e12c361abef301bf603140Andreas Huber TS_TIMESTAMPS_ARE_ABSOLUTE = 1, 6087f2a558dd12043631e12c361abef301bf603140Andreas Huber // Video PES packets contain exactly one (aligned) access unit. 6187f2a558dd12043631e12c361abef301bf603140Andreas Huber ALIGNED_VIDEO_DATA = 2, 62c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber }; 63c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber 64c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber ATSParser(uint32_t flags = 0); 65cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 6606528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber status_t feedTSPacket(const void *data, size_t size); 6732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 6832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber void signalDiscontinuity( 6932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber DiscontinuityType type, const sp<AMessage> &extra); 7032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 71f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void signalEOS(status_t finalResult); 72cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 73cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber enum SourceType { 7443ca783effd99bba0e6e2dd6fe177a8888578ef8Robert Shih VIDEO = 0, 7543ca783effd99bba0e6e2dd6fe177a8888578ef8Robert Shih AUDIO = 1, 7643ca783effd99bba0e6e2dd6fe177a8888578ef8Robert Shih NUM_SOURCE_TYPES = 2 77cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber }; 78cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber sp<MediaSource> getSource(SourceType type); 79cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 8043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber bool PTSTimeDeltaEstablished(); 8143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 82386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber enum { 83386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber // From ISO/IEC 13818-1: 2000 (E), Table 2-29 842944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber STREAMTYPE_RESERVED = 0x00, 85386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber STREAMTYPE_MPEG1_VIDEO = 0x01, 86386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber STREAMTYPE_MPEG2_VIDEO = 0x02, 87386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber STREAMTYPE_MPEG1_AUDIO = 0x03, 88386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber STREAMTYPE_MPEG2_AUDIO = 0x04, 896e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber STREAMTYPE_MPEG2_AUDIO_ADTS = 0x0f, 90386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber STREAMTYPE_MPEG4_VIDEO = 0x10, 91386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber STREAMTYPE_H264 = 0x1b, 92dd432ce03eccf280d83672f95076b6fbd561047fChangwan Ryu 93dd432ce03eccf280d83672f95076b6fbd561047fChangwan Ryu // From ATSC A/53 Part 3:2009, 6.7.1 94dd432ce03eccf280d83672f95076b6fbd561047fChangwan Ryu STREAMTYPE_AC3 = 0x81, 95dd432ce03eccf280d83672f95076b6fbd561047fChangwan Ryu 969bf32f06e8971c1d3eb4fc5edd74b69557f97212Chong Zhang // Stream type 0x83 is non-standard, 979bf32f06e8971c1d3eb4fc5edd74b69557f97212Chong Zhang // it could be LPCM or TrueHD AC3 989bf32f06e8971c1d3eb4fc5edd74b69557f97212Chong Zhang STREAMTYPE_LPCM_AC3 = 0x83, 99386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber }; 100386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber 1012944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huberprotected: 1022944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber virtual ~ATSParser(); 1032944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber 1042944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huberprivate: 105cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber struct Program; 106cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber struct Stream; 1078dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber struct PSISection; 108cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 109c4c17d47b674b425fb6c399822c0ab3258543c0aAndreas Huber uint32_t mFlags; 110cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber Vector<sp<Program> > mPrograms; 111cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 1128dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber // Keyed by PID 1138dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber KeyedVector<unsigned, sp<PSISection> > mPSISections; 1148dfa228201131da0bf3ba1d74c819c27c0500f6bAndreas Huber 11587f2a558dd12043631e12c361abef301bf603140Andreas Huber int64_t mAbsoluteTimeAnchorUs; 11687f2a558dd12043631e12c361abef301bf603140Andreas Huber 117d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber bool mTimeOffsetValid; 118d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber int64_t mTimeOffsetUs; 119d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber 12087f2a558dd12043631e12c361abef301bf603140Andreas Huber size_t mNumTSPacketsParsed; 12187f2a558dd12043631e12c361abef301bf603140Andreas Huber 122cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber void parseProgramAssociationTable(ABitReader *br); 123cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber void parseProgramMap(ABitReader *br); 124cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber void parsePES(ABitReader *br); 125cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 12606528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber status_t parsePID( 127cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber ABitReader *br, unsigned PID, 12887f2a558dd12043631e12c361abef301bf603140Andreas Huber unsigned continuity_counter, 129cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber unsigned payload_unit_start_indicator); 130cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 13187f2a558dd12043631e12c361abef301bf603140Andreas Huber void parseAdaptationField(ABitReader *br, unsigned PID); 13206528d7f18ad01377357d337eaa3e875a242bd2dAndreas Huber status_t parseTS(ABitReader *br); 133cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 13487f2a558dd12043631e12c361abef301bf603140Andreas Huber void updatePCR(unsigned PID, uint64_t PCR, size_t byteOffsetFromStart); 13587f2a558dd12043631e12c361abef301bf603140Andreas Huber 13687f2a558dd12043631e12c361abef301bf603140Andreas Huber uint64_t mPCR[2]; 13787f2a558dd12043631e12c361abef301bf603140Andreas Huber size_t mPCRBytes[2]; 13887f2a558dd12043631e12c361abef301bf603140Andreas Huber int64_t mSystemTimeUs[2]; 13987f2a558dd12043631e12c361abef301bf603140Andreas Huber size_t mNumPCRs; 14087f2a558dd12043631e12c361abef301bf603140Andreas Huber 141cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(ATSParser); 142cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber}; 143cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 144cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber} // namespace android 145cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber 146cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#endif // A_TS_PARSER_H_ 147