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/inputstrm.hh | 278 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 278 insertions(+) create mode 100644 ext/mplex/inputstrm.hh (limited to 'ext/mplex/inputstrm.hh') diff --git a/ext/mplex/inputstrm.hh b/ext/mplex/inputstrm.hh new file mode 100644 index 00000000..a4247495 --- /dev/null +++ b/ext/mplex/inputstrm.hh @@ -0,0 +1,278 @@ + +/* + * inptstrm.hh: Input stream classes for MPEG multiplexing + * TODO: Split into the base classes and the different types of + * actual input stream. + * + * Copyright (C) 2001 Andrew Stevens + * + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of version 2 of the GNU General Public License + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef __INPUTSTRM_H__ +#define __INPUTSTRM_H__ + +#include +#include +#include +#include + +#include "mjpeg_types.h" +#include "mpegconsts.h" +#include "format_codes.h" +#include "mjpeg_logging.h" + +#include "mplexconsts.hh" +#include "bits.hh" +#include "aunit.hh" +#include "vector.hh" +#include "buffer.hh" + + +class InputStream +{ +public: + InputStream (IBitStream & istream):bs (istream), + eoscan (false), stream_length (0), last_buffered_AU (0), decoding_order (0), old_frames (0) + { + } + + void SetBufSize (unsigned int buf_size) + { + bs.SetBufSize (buf_size); + } + +protected: + IBitStream & bs; + bool eoscan; + bitcount_t stream_length; + off_t file_length; + + unsigned int last_buffered_AU; // decode seq num of last buffered frame + 1 + bitcount_t AU_start; + uint32_t syncword; + bitcount_t prev_offset; + unsigned int decoding_order; + unsigned int old_frames; + +}; + +// +// Abstract forward reference... +// + +class OutputStream; + + +class MuxStream +{ +public: + MuxStream (); + + void Init (const int strm_id, + const unsigned int _buf_scale, + const unsigned int buf_size, + const unsigned int _zero_stuffing, const bool bufs_in_first, const bool always_bufs); + + unsigned int BufferSizeCode (); + inline unsigned int BufferSize () + { + return buffer_size; + } + inline unsigned int BufferScale () + { + return buffer_scale; + } + + + inline void SetMaxPacketData (unsigned int max) + { + max_packet_data = max; + } + inline void SetMinPacketData (unsigned int min) + { + min_packet_data = min; + } + inline unsigned int MaxPacketData () + { + return max_packet_data; + } + inline unsigned int MinPacketData () + { + return min_packet_data; + } + inline bool NewAUNextSector () + { + return new_au_next_sec; + } + + // + // Read the next packet payload (sub-stream headers plus + // parsed and spliced stream data) for a packet with the + // specified payload capacity. Update the AU info. + // + + virtual unsigned int ReadPacketPayload (uint8_t * dst, unsigned int to_read) = 0; + + // + // Return the size of the substream headers... + // + virtual unsigned int StreamHeaderSize () + { + return 0; + } + +public: // TODO should go protected once encapsulation complete + int stream_id; + unsigned int buffer_scale; + unsigned int buffer_size; + BufferModel bufmodel; + unsigned int max_packet_data; + unsigned int min_packet_data; + unsigned int zero_stuffing; + unsigned int nsec; + bool buffers_in_header; + bool always_buffers_in_header; + bool new_au_next_sec; + bool init; +}; + +class DummyMuxStream:public MuxStream +{ +public: + DummyMuxStream (const int strm_id, const unsigned int buf_scale, unsigned int buf_size) + { + stream_id = strm_id; + buffer_scale = buf_scale; + buffer_size = buf_size; + } + + unsigned int ReadPacketPayload (uint8_t * dst, unsigned int to_read) + { + abort (); + return 0; + } +}; + + +class ElementaryStream:public InputStream, public MuxStream +{ +public: + enum stream_kind + { audio, video, dummy }; + ElementaryStream (IBitStream & ibs, OutputStream & into, stream_kind kind); + virtual void Close () = 0; + + bool NextAU (); + Aunit *Lookahead (); + unsigned int BytesToMuxAUEnd (unsigned int sector_transport_size); + bool MuxCompleted (); + virtual bool MuxPossible (clockticks currentSCR); + void DemuxedTo (clockticks SCR); + void SetTSOffset (clockticks baseTS); + void AllDemuxed (); + inline stream_kind Kind () + { + return kind; + } + inline int BufferMin () + { + return buffer_min; + } + inline int BufferMax () + { + return buffer_max; + } + inline clockticks RequiredDTS () + { + return au->DTS + timestamp_delay; + }; + inline clockticks RequiredPTS () + { + return au->PTS + timestamp_delay; + }; + inline clockticks NextRequiredDTS () + { + Aunit *next = Lookahead (); + + if (next != 0) + return next->DTS + timestamp_delay; + else + return 0; + }; + inline clockticks NextRequiredPTS () + { + Aunit *next = Lookahead (); + + if (next != 0) + return next->PTS + timestamp_delay; + else + return 0; + }; + + void UpdateBufferMinMax (); + + void SetSyncOffset (clockticks timestamp_delay); + + + inline bool BuffersInHeader () + { + return buffers_in_header; + } + virtual unsigned int NominalBitRate () = 0; + virtual bool RunOutComplete () = 0; + virtual void OutputSector () = 0; + + virtual unsigned int ReadPacketPayload (uint8_t * dst, unsigned int to_read); + + +protected: + virtual void FillAUbuffer (unsigned int frames_to_buffer) = 0; + virtual void InitAUbuffer () = 0; + virtual bool AUBufferNeedsRefill () = 0; + AUStream aunits; + void Muxed (unsigned int bytes_muxed); + +public: // TODO should go protected once encapsulation complete + // N.b. currently length=0 is used to indicate an ended + // stream. + // au itself should simply disappear + Aunit * au; + clockticks timestamp_delay; + +protected: + unsigned int au_unsent; + Aunit *next (); + + OutputStream & muxinto; + stream_kind kind; + int buffer_min; + int buffer_max; + int FRAME_CHUNK; + +}; + + + +#endif // __INPUTSTRM_H__ + + +/* + * Local variables: + * c-file-style: "stroustrup" + * tab-width: 4 + * indent-tabs-mode: nil + * End: + */ -- cgit v1.2.1