133 lines
3.9 KiB
C++
133 lines
3.9 KiB
C++
/**********
|
|
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
|