From 1496394c0f4be1a718fb189846c6350cbd9e43da Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Thu, 24 Oct 2002 22:37:51 +0000 Subject: First stab at porting mplex Original commit message from CVS: First stab at porting mplex --- ext/mplex/systems.hh | 131 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 131 insertions(+) create mode 100644 ext/mplex/systems.hh (limited to 'ext/mplex/systems.hh') diff --git a/ext/mplex/systems.hh b/ext/mplex/systems.hh new file mode 100644 index 00000000..bbad92f5 --- /dev/null +++ b/ext/mplex/systems.hh @@ -0,0 +1,131 @@ +#ifndef __SYSTEMS_HH__ +#define __SYSTEMS_HH__ + +#include "inputstrm.hh" + +#include + +using std::vector; + +/* Buffer size parameters */ + +#define MAX_SECTOR_SIZE 16384 +#define MAX_PACK_HEADER_SIZE 255 +#define MAX_SYS_HEADER_SIZE 255 + + +typedef class PS_Stream _PS_Stream; + +typedef size_t (*WriteCallback) (_PS_Stream *str, uint8_t *data, size_t size, void *user_data); + + +typedef struct sector_struc /* Ein Sektor, kann Pack, Sys Header */ +/* und Packet enthalten. */ +{ + unsigned char buf[MAX_SECTOR_SIZE]; + unsigned int length_of_packet_data; + //clockticks TS ; +} +Sector_struc; + +typedef struct pack_struc /* Pack Info */ +{ + unsigned char buf[MAX_PACK_HEADER_SIZE]; + int length; + clockticks SCR; +} +Pack_struc; + +typedef struct sys_header_struc /* System Header Info */ +{ + unsigned char buf[MAX_SYS_HEADER_SIZE]; + int length; +} +Sys_header_struc; + + +class PS_Stream { +public: + PS_Stream (WriteCallback _callback, void *_user_data): + callback (_callback), + user_data (_user_data) + { + } + + void Init (unsigned _mpeg, unsigned int _sector_sizen, off_t max_segment_size); // 0 = No Limit + + bool FileLimReached (); + void NextFile (); + unsigned int PacketPayload (MuxStream & strm, + Sys_header_struc * sys_header, + Pack_struc * pack_header, int buffers, int PTSstamp, int DTSstamp); + + unsigned int CreateSector (Pack_struc * pack, + Sys_header_struc * sys_header, + unsigned int max_packet_data_size, + MuxStream & strm, + bool buffers, bool end_marker, clockticks PTS, clockticks DTS, uint8_t timestamps); + void RawWrite (uint8_t * data, unsigned int len); + static void BufferSectorHeader (uint8_t * buf, + Pack_struc * pack, Sys_header_struc * sys_header, uint8_t * &header_end); + static void BufferPacketHeader (uint8_t * buf, + uint8_t type, + unsigned int mpeg_version, + bool buffers, + unsigned int buffer_size, + uint8_t buffer_scale, + clockticks PTS, + clockticks DTS, + uint8_t timestamps, uint8_t * &size_field, uint8_t * &header_end); + + static inline void BufferPacketSize (uint8_t * size_field, uint8_t * packet_end) + { + unsigned int + packet_size = + packet_end - + size_field - + 2; + + size_field[0] = static_cast < uint8_t > (packet_size >> 8); + size_field[1] = static_cast < uint8_t > (packet_size & 0xff); + + } + + void CreatePack (Pack_struc * pack, clockticks SCR, unsigned int mux_rate); + void CreateSysHeader (Sys_header_struc * sys_header, + unsigned int rate_bound, + bool fixed, + int CSPS, bool audio_lock, bool video_lock, vector < MuxStream * >&streams); + + void Close () + { + } + +private: + + /* TODO: Replace **'s with *&'s */ + static void BufferDtsPtsMpeg1ScrTimecode (clockticks timecode, uint8_t marker, uint8_t ** buffer); + static void BufferMpeg2ScrTimecode (clockticks timecode, uint8_t ** buffer); + void BufferPaddingPacket (int padding, uint8_t * &buffer); + +private: + unsigned int mpeg_version; + unsigned int sector_size; + int segment_num; + + off_t max_segment_size; + uint8_t * sector_buf; + WriteCallback callback; + void *user_data; + off_t written; +}; +#endif // __SYSTEMS_HH__ + + +/* + * Local variables: + * c-file-style: "stroustrup" + * tab-width: 4 + * indent-tabs-mode: nil + * End: + */ -- cgit v1.2.1