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.
tdemultimedia/mpeglib/lib/mpegplay/mpegSystemHeader.h

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