You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
485 lines
12 KiB
485 lines
12 KiB
/*
|
|
stores info about system stream and sends data to audio/video
|
|
Copyright (C) 2000 Martin Vogt
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU Library General Public License as published by
|
|
the Free Software Foundation.
|
|
|
|
For more information look at the file COPYRIGHT in this package
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
#ifndef __MPEGSYSTEMHEADER_H
|
|
#define __MPEGSYSTEMHEADER_H
|
|
|
|
|
|
|
|
#define _PACKET_SYSLAYER 1
|
|
#define _PACKET_NO_SYSLAYER 0
|
|
#define _PACKET_UNKNOWN_LAYER -1
|
|
#define _PACKET_HEADER_SIZE 8
|
|
|
|
|
|
// note: packetid 1 & 2 are normalized to _PAKET_ID_AUDIO
|
|
// see packet.cpp
|
|
|
|
#define _PAKET_ID_AUDIO_1 ((unsigned char) 0xc0)
|
|
#define _PAKET_ID_AUDIO_2 ((unsigned char) 0xd0)
|
|
#define _PAKET_ID_VIDEO ((unsigned char) 0xe0)
|
|
#define _PAKET_ID_NUKE ((unsigned char) 0x0)
|
|
|
|
#define _STD_SYSTEM_CLOCK_FREQ (unsigned long)90000
|
|
#define _MUX_RATE_SCALE_FACTOR 50
|
|
#define _MAX_STREAMS 8
|
|
#define _NOT_PACKET_ID ((unsigned char) 0xff)
|
|
#define _KILL_BUFFER ((unsigned char) 0xfe)
|
|
|
|
|
|
|
|
#define _STD_AUDIO_STREAM_ID ((unsigned char) 0xb8)
|
|
#define _STD_VIDEO_STREAM_ID ((unsigned char) 0xb9)
|
|
#define _MIN_STREAM_ID_ID ((unsigned char) 0xbc)
|
|
#define _RESERVED_STREAM_ID ((unsigned char) 0xbc)
|
|
#define _PRIVATE_STREAM_1_ID ((unsigned char) 0xbd)
|
|
#define _PADDING_STREAM_ID ((unsigned char) 0xbe)
|
|
#define _PRIVATE_STREAM_2_ID ((unsigned char) 0xbf)
|
|
#define _ECM_STREAM_ID ((unsigned char) 0xf0)
|
|
#define _EMM_STREAM_ID ((unsigned char) 0xf1)
|
|
#define _PROGRAM_STREAM_DIRECTORY_ID ((unsigned char) 0xff)
|
|
#define _DSMCC_STREAM_ID ((unsigned char) 0xf2)
|
|
#define _ITUTRECH222TYPEE_STREAM_ID ((unsigned char) 0xf8)
|
|
#define _SUBSTREAM_AC3_ID ((unsigned char) 0x80)
|
|
#define _SUBSTREAM_LPCM_ID ((unsigned char) 0xA0)
|
|
#define _SUBSTREAM_SUBPIC_ID ((unsigned char) 0x20)
|
|
|
|
|
|
/* Silly Constants.... */
|
|
#define _PACK_START_CODE ((unsigned int)0x000001ba)
|
|
#define _SYSTEM_HEADER_START_CODE ((unsigned int)0x000001bb)
|
|
#define _PACKET_START_CODE_MASK ((unsigned int)0xffffff00)
|
|
#define _PACKET_START_CODE_PREFIX ((unsigned int)0x00000100)
|
|
#define _ISO_11172_END_CODE ((unsigned int)0x000001b9)
|
|
|
|
#define _SEQ_START_CODE 0x000001b3
|
|
|
|
|
|
// More constants for TS streams
|
|
#define NULL_PID 8191
|
|
#define INVALID_PID ((unsigned int)(-1))
|
|
#define INVALID_PROGRAM ((unsigned int)(-1))
|
|
#define INVALID_CC ((unsigned int)(-1))
|
|
|
|
#define ISO_11172_VIDEO 1
|
|
#define ISO_13818_VIDEO 2
|
|
#define ISO_11172_AUDIO 3
|
|
#define ISO_13818_AUDIO 4
|
|
#define ISO_13818_PRIVATE 5
|
|
#define ISO_13818_PES_PRIVATE 6
|
|
#define ISO_13522_MHEG 7
|
|
#define ISO_13818_DSMCC 8
|
|
#define ISO_13818_TYPE_A 9
|
|
#define ISO_13818_TYPE_B 10
|
|
#define ISO_13818_TYPE_C 11
|
|
#define ISO_13818_TYPE_D 12
|
|
#define ISO_13818_TYPE_E 13
|
|
#define ISO_13818_AUX 14
|
|
|
|
|
|
struct MapPidStream_s {
|
|
// if this structure "is Valid" (association pid->tsType is ok)
|
|
int isValid;
|
|
// a not nearer defined int
|
|
unsigned int pid;
|
|
// the type for the pid defined in Transportstream
|
|
unsigned int tsType;
|
|
// runtime associated "fake" type for PS stream
|
|
unsigned int psType;
|
|
// outstanding bytes for PES packet
|
|
unsigned int pesPacketSize;
|
|
};
|
|
|
|
typedef MapPidStream_s MapPidStream;
|
|
|
|
|
|
|
|
|
|
|
|
// More useful things
|
|
|
|
#define FLOAT_0x10000 (double)((unsigned long)1 << 16)
|
|
|
|
|
|
// MPEG2 PACK HEADER
|
|
// SCRbase and SCRext
|
|
// 32 .......................................0 9.........0
|
|
// [PACK_START_CODE][01---1--][--------][-----1--][--------][-----1--][-------1
|
|
|
|
#define ui64 unsigned long
|
|
#define ui32 unsigned int
|
|
#define i64 long
|
|
#define i32 int
|
|
|
|
#define MPEG1_CLK_REF (i64)90000
|
|
#define MPEG2_CLK_REF (i64)27000000
|
|
|
|
#define ZERO (i64)0
|
|
#define GET_SCRBASE(buf) ( ((ui64)buf[4]&0xF8)>>3 | \
|
|
(ui64)buf[3]<<5 | \
|
|
((ui64)buf[2]&0x03)<<13 | \
|
|
((ui64)buf[2]&0xF8)<<12 | \
|
|
(ui64)buf[1]<<20 | \
|
|
((ui64)buf[0]&0x03)<<28 | \
|
|
(ui64)buf[0]&0x38 <<27 )
|
|
|
|
#define GET_SCREXT(buf) ( ((ui64)buf[5]&0xFE)>>1 | \
|
|
((ui64)buf[4]&0x03)<<7 )
|
|
|
|
// muxrate
|
|
// 22 ......................0 stl
|
|
// ... [--------][--------][------11][rrrrr---]
|
|
#define GET_MPEG2MUXRATE(buf) ( (ui32)buf[6]<<14 | \
|
|
((ui32)buf[7])<<6 | \
|
|
((ui32)buf[8]&0x03)>>2) \
|
|
|
|
#define GET_MPEG2STUFFING(buf) ((buf[9]&0x07))
|
|
|
|
// MPEG1 PACK HEADER
|
|
// SCR muxrate
|
|
// 32........................................0 22......
|
|
//[PACK_START_CODE][0010---1][--------][-------1][--------][-------1][1-------]
|
|
#define GET_SCR(buf) ( ((ui64)buf[4]&0xFE) >>1 | \
|
|
((ui64)buf[3]) <<7 | \
|
|
((ui64)buf[2]&0xFE) <<14 | \
|
|
((ui64)buf[1]) <<22 | \
|
|
((ui64)buf[0]&0x0E) <<29 )
|
|
|
|
#define GET_MPEG1_PTS(x) (GET_SCR(x)) //they follow the same pattern
|
|
|
|
#define GET_MPEG1_MUXRATE(x) ( ((ui32)x[7]&0xFE) >>1 | \
|
|
((ui32)x[6]) <<7 | \
|
|
((ui32)x[5]&0x7F) <<15 )
|
|
|
|
#define GET_MPEG2_PTS_FLAGS(buf) ( ((ui8)buf[3]&0xC0)>>6 )
|
|
// MPEG2 PES packet (optional parameters)
|
|
// PTS
|
|
// 32........................................0
|
|
// [PACKET_START_CODE][001x---1][--------][-------1][--------][-------1]
|
|
#define GET_MPEG2_PTS(buf) GET_MPEG1_PTS(buf)
|
|
|
|
|
|
|
|
#include <stdio.h>
|
|
|
|
|
|
class MpegSystemHeader {
|
|
|
|
int lPTSFlag;
|
|
double scrTimeStamp;
|
|
double ptsTimeStamp;
|
|
double dtsTimeStamp;
|
|
|
|
int layer;
|
|
unsigned int header;
|
|
int lHasPSHeader;
|
|
|
|
int lmpeg2;
|
|
|
|
int packetID;
|
|
int packetLen;
|
|
|
|
int pesPacketLen;
|
|
int tsPacketLen;
|
|
|
|
unsigned long rate;
|
|
int stdBufferScale;
|
|
unsigned long stdBufferSize;
|
|
|
|
/* This are bitmaps, if bit x is a 1 the stream number x is
|
|
available */
|
|
unsigned long availableAudioLayers;
|
|
unsigned long availableVideoLayers;
|
|
|
|
int audioLayerSelect;
|
|
int videoLayerSelect;
|
|
|
|
//
|
|
// MPEG2 Header Info [START]
|
|
//
|
|
int lOriginal;
|
|
int lCopyRight;
|
|
int lDataAlignmentIndicator;
|
|
int lPesPriority;
|
|
int lEncrypted;
|
|
int startCodePrefix;
|
|
|
|
|
|
|
|
int lPTSDTSFlag;
|
|
int lESCR;
|
|
int lESRateFlag;
|
|
int lDMSTRICKFLAG;
|
|
int lADDITIONAL_COPY_FLAG;
|
|
int lPES_CRC_FLAG;
|
|
int lPES_EXT_FLAG;
|
|
int nPES_HEADER_DATA_LENGTH;
|
|
|
|
// EXT FILED [START]
|
|
|
|
int lPrivateDataFlag;
|
|
int lPackHeaderFieldFlag;
|
|
int lSequenceCounterFlag;
|
|
int lSTDBufferFlag;
|
|
int lPES_EXT_FLAG_2;
|
|
int nPES_EXT_FIELD_LENGTH;
|
|
// EXT FILED [END]
|
|
|
|
int subStreamID;
|
|
//
|
|
// MPEG2 Header Info [END]
|
|
//
|
|
|
|
//
|
|
// Transport Stream Header [START]
|
|
//
|
|
|
|
int lHasTSHeader;
|
|
|
|
unsigned int sync_byte;
|
|
unsigned int transport_error_indicator;
|
|
unsigned int payload_unit_start_indicator;
|
|
unsigned int transport_priority;
|
|
unsigned int pid;
|
|
unsigned int transport_scrambling_control;
|
|
unsigned int adaption_field_control;
|
|
unsigned int continuity_counter;
|
|
|
|
unsigned int programs;
|
|
unsigned int programNumber;
|
|
unsigned int pmtPID;
|
|
|
|
MapPidStream** mapPidStreamArray;
|
|
int currentPos;
|
|
|
|
//
|
|
// Transport Stream Header [END]
|
|
//
|
|
|
|
public:
|
|
MpegSystemHeader();
|
|
~MpegSystemHeader();
|
|
|
|
void setHeader(unsigned int header);
|
|
unsigned int getHeader();
|
|
int hasRAWHeader();
|
|
|
|
|
|
int getPTSFlag();
|
|
void setPTSFlag(int lPTSFlag);
|
|
|
|
double getSCRTimeStamp();
|
|
double getPTSTimeStamp();
|
|
double getDTSTimeStamp();
|
|
|
|
|
|
void setSCRTimeStamp(double timeStamp);
|
|
void setPTSTimeStamp(double ptsTimeStamp);
|
|
void setDTSTimeStamp(double dtsTimeStamp);
|
|
|
|
// returns 1 if it is a syslayer 0 if non syslayer -1 if unknown
|
|
int getLayer();
|
|
void setLayer(int layer);
|
|
int hasPSHeader();
|
|
|
|
//
|
|
// MPEG2 Stuff [START]
|
|
//
|
|
|
|
int getMPEG2();
|
|
void setMPEG2(int lmpeg2);
|
|
|
|
// 1 Byte [Start]
|
|
int getOriginalOrCopy();
|
|
void setOriginalOrCopy(int lOriginal);
|
|
|
|
int getCopyRight();
|
|
void setCopyRight(int lCopyRight);
|
|
|
|
int getDataAlignmentIndicator();
|
|
void setDataAlignmentIndicator(int lDataAlignmentIndicator);
|
|
|
|
int getPesPriority();
|
|
void setPesPriority(int lPesPriority);
|
|
|
|
int getEncrypted();
|
|
void setEncrypted(int lEncrypted);
|
|
|
|
int getStartCodePrefix();
|
|
void setStartCodePrefix(int startCodePrefix);
|
|
|
|
// 1. Byte [End]
|
|
|
|
int getPTSDTSFlag();
|
|
void setPTSDTSFlag(int lPTSDTSFlag);
|
|
|
|
int getESCRFlag();
|
|
void setESCRFlag(int lESCR);
|
|
|
|
int getES_RATE_Flag();
|
|
void setES_RATE_Flag(int lESRateFlag);
|
|
|
|
|
|
int getDMSTRICKFLAG();
|
|
void setDMSTRICKFLAG(int lDMSTRICKFLAG);
|
|
|
|
int getADDITIONAL_COPY_FLAG();
|
|
void setADDITIONAL_COPY_FLAG(int lADDITIONAL_COPY_FLAG);
|
|
|
|
int getPES_CRC_FLAG();
|
|
void setPES_CRC_FLAG(int lPES_CRC_FLAG);
|
|
|
|
int getPES_EXT_FLAG();
|
|
void setPES_EXT_FLAG(int lPES_EXT_FLAG);
|
|
|
|
//
|
|
// PES EXTENSION [START]
|
|
//
|
|
|
|
int getPrivateDataFlag();
|
|
void setPrivateDataFlag(int lPrivateDataFlag);
|
|
|
|
int getPackHeaderFieldFlag();
|
|
void setPackHeaderFieldFlag(int lPackHeaderFieldFlag);
|
|
|
|
int getSequenceCounterFlag();
|
|
void setSequenceCounterFlag(int lSequenceCounterFlag);
|
|
|
|
int getSTDBufferFlag();
|
|
void setSTDBufferFlag(int lSTDBufferFlag);
|
|
|
|
int getPES_EXT_FLAG_2();
|
|
void setPES_EXT_FLAG_2(int lPES_EXT_FLAG_2);
|
|
|
|
int getPES_EXT_FIELD_LENGTH();
|
|
void setPES_EXT_FIELD_LENGTH(int nPES_EXT_FIELD_LENGTH);
|
|
|
|
|
|
|
|
//
|
|
// PES EXTENSION [END]
|
|
//
|
|
|
|
int getPES_HEADER_DATA_LENGTH();
|
|
void setPES_HEADER_DATA_LENGTH(int nPES_HEADER_DATA_LENGTH);
|
|
|
|
|
|
int getSubStreamID();
|
|
void setSubStreamID(int subStreamID);
|
|
|
|
|
|
//
|
|
// MPEG2 Stuff [END]
|
|
//
|
|
|
|
|
|
//
|
|
// Transport Stream Header [START]
|
|
//
|
|
|
|
// returns true if it is ts header & sets the TS
|
|
// values in this class.
|
|
int hasTSHeader();
|
|
|
|
|
|
unsigned int getSync_byte();
|
|
unsigned int getTransport_error_indicator();
|
|
unsigned int getPayload_unit_start_indicator();
|
|
unsigned int getTransport_priority();
|
|
unsigned int getPid();
|
|
unsigned int getTransport_scrambling_control();
|
|
unsigned int getAdaption_field_control();
|
|
unsigned int getContinuity_counter();
|
|
|
|
unsigned int getPrograms();
|
|
void setPrograms(unsigned int programs);
|
|
|
|
unsigned int getProgramNumber();
|
|
void setProgramNumber(unsigned int programNumber);
|
|
|
|
unsigned int getPMTPID();
|
|
void setPMTPID(unsigned int pmtPID);
|
|
|
|
//
|
|
// manage different pids and their tsTypes and the fake psTypes
|
|
//
|
|
|
|
MapPidStream* lookup(unsigned int pid);
|
|
void insert(unsigned int pid,unsigned int tsType,
|
|
MpegSystemHeader* mpegHeader);
|
|
|
|
|
|
void printTSHeader();
|
|
void printProgramInfo();
|
|
void printMap(MapPidStream* mapPidStream);
|
|
|
|
//
|
|
// Transport Stream Header [END]
|
|
//
|
|
|
|
|
|
|
|
void addAvailableLayer(int streamID);
|
|
void resetAvailableLayers();
|
|
|
|
int getAudioLayerSelect();
|
|
void setAudioLayerSelect(int layer);
|
|
|
|
int getVideoLayerSelect();
|
|
void setVideoLayerSelect(int layer);
|
|
|
|
|
|
int getPacketID();
|
|
void setPacketID(int packetID);
|
|
|
|
// data which can be safley read and belongs to packetID
|
|
int getPacketLen();
|
|
void setPacketLen(int packetLen);
|
|
|
|
// length of PES packet (normally == getPacketLent)
|
|
int getPESPacketLen();
|
|
void setPESPacketLen(int packetLen);
|
|
|
|
// rest length of TS packet.
|
|
int getTSPacketLen();
|
|
void setTSPacketLen(int packetLen);
|
|
|
|
|
|
|
|
int getRate();
|
|
void setRate(int rate);
|
|
|
|
int getStdBufferScale();
|
|
void setStdBufferScale(int stdBufferScale);
|
|
|
|
unsigned long getStdBufferSize();
|
|
void setStdBufferSize(unsigned long stdBufferSize);
|
|
|
|
void print();
|
|
|
|
// return true is system header in some kind (TS or 1ba/1bb)
|
|
static int isSystemHeader(unsigned int header);
|
|
|
|
private:
|
|
void setTSHeader(unsigned int header);
|
|
void setPSHeader(unsigned int header);
|
|
|
|
};
|
|
|
|
#endif
|
|
|
|
|
|
|