summaryrefslogtreecommitdiffstats
path: root/ext/mplex/systems.hh
diff options
context:
space:
mode:
authorWim Taymans <wim.taymans@gmail.com>2002-10-24 22:37:51 +0000
committerWim Taymans <wim.taymans@gmail.com>2002-10-24 22:37:51 +0000
commit1496394c0f4be1a718fb189846c6350cbd9e43da (patch)
tree7f839063fd206ad3db102a7a20c336d0c8423295 /ext/mplex/systems.hh
parent440801dd9e53284925575c2170b53bf947522414 (diff)
downloadgst-plugins-bad-1496394c0f4be1a718fb189846c6350cbd9e43da.tar.gz
gst-plugins-bad-1496394c0f4be1a718fb189846c6350cbd9e43da.tar.bz2
gst-plugins-bad-1496394c0f4be1a718fb189846c6350cbd9e43da.zip
First stab at porting mplex
Original commit message from CVS: First stab at porting mplex
Diffstat (limited to 'ext/mplex/systems.hh')
-rw-r--r--ext/mplex/systems.hh131
1 files changed, 131 insertions, 0 deletions
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 <vector>
+
+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:
+ */