blob: 307f3480874d96027de086526db334078df484c5 [file] [log] [blame]
/**********
This library is free software; you can redistribute it and/or modify it under
the terms of the GNU Lesser General Public License as published by the
Free Software Foundation; either version 3 of the License, or (at your
option) any later version. (See <http://www.gnu.org/copyleft/lesser.html>.)
This library is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
more details.
You should have received a copy of the GNU Lesser General Public License
along with this library; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
**********/
// "liveMedia"
// Copyright (c) 1996-2020 Live Networks, Inc. All rights reserved.
// A parser for a MPEG Transport Stream
// C++ header
#ifndef _MPEG2_TRANSPORT_STREAM_PARSER_HH
#ifndef _STREAM_PARSER_HH
#include "StreamParser.hh"
#endif
#ifndef _MPEG2_TRANSPORT_STREAM_DEMUXED_TRACK_HH
#include "MPEG2TransportStreamDemuxedTrack.hh"
#endif
#ifndef _MEDIA_SINK_HH
#include "MediaSink.hh"
#endif
// A descriptor that describes the state of each known PID:
enum PIDType { PAT, PMT, STREAM };
class PIDState {
protected: // we're a virtual base class
PIDState(MPEG2TransportStreamParser& parser, u_int16_t pid, PIDType pidType);
public:
virtual ~PIDState();
public:
MPEG2TransportStreamParser& ourParser;
u_int16_t PID;
PIDType type;
};
class PIDState_PAT : public PIDState {
public:
PIDState_PAT(MPEG2TransportStreamParser& parser, u_int16_t pid);
protected:
virtual ~PIDState_PAT();
};
class PIDState_PMT : public PIDState {
public:
PIDState_PMT(MPEG2TransportStreamParser& parser, u_int16_t pid, u_int16_t programNumber);
protected:
virtual ~PIDState_PMT();
public:
u_int16_t program_number;
};
class PIDState_STREAM : public PIDState {
public:
PIDState_STREAM(MPEG2TransportStreamParser& parser, u_int16_t pid, u_int16_t programNumber, u_int8_t streamType);
protected:
virtual ~PIDState_STREAM();
public:
u_int16_t program_number;
u_int8_t stream_type;
double lastSeenPTS;
MPEG2TransportStreamDemuxedTrack* streamSource;
MediaSink* streamSink;
};
// Descriptions of known "stream_type"s:
class StreamType {
public:
char const* description;
enum dataType { AUDIO, VIDEO, DATA, TEXT, UNKNOWN } dataType;
char const* filenameSuffix;
public:
StreamType(char const* description = "unknown", enum dataType dataType = UNKNOWN,
char const* filenameSuffix = "");
};
class MPEG2TransportStreamParser: public StreamParser {
public:
MPEG2TransportStreamParser(FramedSource* inputSource,
FramedSource::onCloseFunc* onEndFunc, void* onEndClientData);
virtual ~MPEG2TransportStreamParser();
UsageEnvironment& envir();
// StreamParser 'client continue' function:
static void continueParsing(void* clientData, unsigned char* ptr, unsigned size, struct timeval presentationTime);
void continueParsing();
private:
// Parsing functions:
friend class MPEG2TransportStreamDemuxedTrack;
Boolean parse(); // returns True iff we have finished parsing all BOS pages (on initialization)
u_int8_t parseAdaptationField();
Boolean processDataBytes(u_int16_t PID, Boolean pusi, unsigned numDataBytes);
void parsePAT(Boolean pusi, unsigned numDataBytes);
void parsePMT(PIDState_PMT* pidState, Boolean pusi, unsigned numDataBytes);
void parseStreamDescriptors(unsigned numDescriptorBytes);
Boolean processStreamPacket(PIDState_STREAM* pidState, Boolean pusi, unsigned numDataBytes);
unsigned parsePESHeader(PIDState_STREAM* pidState, unsigned numDataBytes);
private: // redefined virtual functions
virtual void restoreSavedParserState();
private:
// General state for parsing:
FramedSource* fInputSource;
Boolean fAmCurrentlyParsing;
FramedSource::onCloseFunc* fOnEndFunc;
void* fOnEndClientData;
PIDState** fPIDState;
double fLastSeenPCR;
};
#endif