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/outputstream.hh | 198 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 198 insertions(+) create mode 100644 ext/mplex/outputstream.hh (limited to 'ext/mplex/outputstream.hh') diff --git a/ext/mplex/outputstream.hh b/ext/mplex/outputstream.hh new file mode 100644 index 00000000..3b625613 --- /dev/null +++ b/ext/mplex/outputstream.hh @@ -0,0 +1,198 @@ + +#ifndef __OUTPUTSTREAM_H__ +#define __OUTPUTSTREAM_H__ + +#include +#include +#include "mjpeg_types.h" + +#include "inputstrm.hh" +#include "padstrm.hh" +#include "systems.hh" + +typedef enum +{ start_segment, mid_segment, + runout_segment +} +segment_state; + +class OutputStream +{ +public: + OutputStream () + { + underrun_ignore = 0; + underruns = 0; + + opt_verbosity = 1; + opt_buffer_size = 46; + opt_data_rate = 0; /* 3486 = 174300B/sec would be right for VCD */ + opt_video_offset = 0; + opt_audio_offset = 0; + opt_sector_size = 2324; + opt_VBR = 0; + opt_mpeg = 1; + opt_mux_format = 0; /* Generic MPEG-1 stream as default */ + opt_multifile_segment = 0; + opt_always_system_headers = 0; + opt_packets_per_pack = 20; + opt_ignore_underrun = false; + opt_max_segment_size = 0; + } + bool OutputMultiplex (); + void Init (vector < ElementaryStream * >*strms, PS_Stream *stream); + void Close (); + + void InitSyntaxParameters (); + void ByteposTimecode (bitcount_t bytepos, clockticks & ts); + + inline Sys_header_struc *SystemHeader () + { + return &sys_header; + } + + unsigned int PacketPayload (MuxStream & strm, bool buffers, bool PTSstamp, bool DTSstamp); + unsigned int WritePacket (unsigned int max_packet_data_size, + MuxStream & strm, + bool buffers, clockticks PTS, clockticks DTS, uint8_t timestamps); + + /* Special "unusual" sector types needed for particular formats + */ + + void OutputDVDPriv2 (); + + /* Syntax control parameters, public becaus they're partly referenced + by the input stream objects. + */ + + bool always_sys_header_in_pack; + bool dtspts_for_all_vau; + bool sys_header_in_pack1; + bool buffers_in_video; + bool always_buffers_in_video; + bool buffers_in_audio; + bool always_buffers_in_audio; + bool sector_align_iframeAUs; + bool split_at_seq_end; + bool seg_starts_with_video; + bool timestamp_iframe_only; + bool video_buffers_iframe_only; + unsigned int audio_buffer_size; + unsigned int video_buffer_size; + + /* more profile options */ + int opt_verbosity; + int opt_quiet_mode; + int opt_buffer_size; + int opt_data_rate; + int opt_video_offset; + int opt_audio_offset; + int opt_sector_size; + int opt_VBR; + int opt_mpeg; + int opt_mux_format; + int opt_multifile_segment; + int opt_always_system_headers; + int opt_packets_per_pack; + bool opt_stills; + bool opt_ignore_underrun; + int verbose; + off_t opt_max_segment_size; + + /* Sequence run-out control */ + bool running_out; + clockticks runout_PTS; + + +/* In some situations the system/PES packets are embedded with + external transport data which has to be taken into account for SCR + calculations to be correct. E.g. VCD streams. Where each 2324 byte + system packet is embedded in a 2352 byte CD sector and the actual + MPEG data is preceded by 30 empty sectors. +*/ + + unsigned int sector_transport_size; + unsigned int transport_prefix_sectors; + unsigned int sector_size; + unsigned int vcd_zero_stuffing; /* VCD audio sectors have 20 0 bytes :-( */ + + int dmux_rate; /* Actual data mux-rate for calculations always a multiple of 50 */ + int mux_rate; /* MPEG mux rate (50 byte/sec units */ + unsigned int packets_per_pack; + +private: + + /* Stream packet component buffers */ + + Sys_header_struc sys_header; + Pack_struc pack_header; + Pack_struc *pack_header_ptr; + Sys_header_struc *sys_header_ptr; + bool start_of_new_pack; + bool include_sys_header; + + /* Under-run error messages */ + unsigned int underruns; + unsigned int underrun_ignore; + + /* Output data stream... */ + PS_Stream *psstrm; + bitcount_t bytes_output; + clockticks ticks_per_sector; + +public: + clockticks current_SCR; +private: + clockticks audio_delay; + clockticks video_delay; + bool vbr; + + /* Source data streams */ + /* Note: 1st video stream is regarded as the "master" stream for + the purpose of splitting sequences etc... + */ + vector < ElementaryStream * >*estreams; // Complete set + vector < ElementaryStream * >vstreams; // Video streams in estreams + vector < ElementaryStream * >astreams; // Audio streams in estreams + + PaddingStream pstrm; + VCDAPadStream vcdapstrm; + DVDPriv2Stream dvdpriv2strm; + +private: + unsigned int RunInSectors (); + + void NextPosAndSCR (); + void SetPosAndSCR (bitcount_t bytepos); + + void OutputPrefix (); + + void OutputSuffix (); + void OutputPadding (bool vcd_audio_pad); + void MuxStatus (log_level_t level); + + void WriteRawSector (uint8_t * rawpackets, unsigned int length); + void AppendMuxStreamsOf (vector < ElementaryStream * >&elem, vector < MuxStream * >&mux); + + /* state var for muxing */ + segment_state seg_state; + + vector < bool > completed; + vector < bool >::iterator pcomp; + vector < ElementaryStream * >::iterator str; + + unsigned int packets_left_in_pack; /* Suppress warning */ + bool padding_packet; + bool video_first; + +/* + * Local variables: + * c-file-style: "gnu" + * tab-width: 8 + * indent-tabs-mode: nil + * End: + */ +}; + + +#endif //__OUTPUTSTREAM_H__ -- cgit v1.2.1