inputstrm.hpp

来自「Motion JPEG编解码器源代码」· HPP 代码 · 共 286 行

HPP
286
字号
/* *  inptstrm.hpp:  Input stream classes for MPEG multiplexing * *  Copyright (C) 2001 Andrew Stevens <andrew.stevens@philips.com> * * *  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 <stdio.h>#include <vector>#include <sys/stat.h>#include "mjpeg_types.h"#include "mpegconsts.h"#include "format_codes.h"#include "mjpeg_logging.h"#include "mplexconsts.hpp"#include "bits.hpp"#include "aunitbuffer.hpp"#include "decodebufmodel.hpp"using std::vector;class InputStream{public:	InputStream( IBitStream &istream ) :		stream_length(0),        bs( istream ),		eoscan(false),		last_buffered_AU(0),		decoding_order(0),		old_frames(0)		{}	void SetBufSize( unsigned int buf_size )		{			bs.SetBufSize( buf_size );		}    bitcount_t stream_length;protected:	off_t      file_length;    IBitStream &bs;	bool eoscan;		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;};class Multiplexor;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;	DecodeBufModel  bufmodel;	unsigned int 	max_packet_data;	unsigned int	min_packet_data;	unsigned int    zero_stuffing;	unsigned int    nsec;    unsigned int    min_pes_header_len;	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,                      Multiplexor &into, 					  stream_kind kind					  );    virtual ~ElementaryStream () { }	virtual void Close() = 0;	bool NextAU();	AUnit *Lookahead( unsigned int n = 0);	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 unsigned int BufferMin() { return buffer_min; }    inline unsigned int BufferMax() { return buffer_max; }    inline clockticks BaseDTS() { return au->DTS; };    inline clockticks BasePTS() { return au->PTS; };    inline int        DecodeOrder() { return au->dorder; }    inline clockticks RequiredDTS( const AUnit *unit )          { return unit->DTS + timestamp_delay; };    inline clockticks RequiredPTS( const AUnit *unit )         { return unit->PTS + timestamp_delay; };    inline clockticks RequiredDTS()          { return RequiredDTS(au); };    inline clockticks RequiredPTS()         { return  RequiredPTS(au); };    inline clockticks NextRequiredDTS()        {             AUnit *next = Lookahead();            if( next != 0 )                return RequiredDTS(next);             else                return 0;        };    inline clockticks NextRequiredPTS()        {             AUnit *next = Lookahead();            if( next != 0 )                return RequiredPTS(next);             else                return 0;        };    void UpdateBufferMinMax();	void SetSyncOffset( clockticks timestamp_delay );	void BufferAndOutputSector(); 	inline bool BuffersInHeader() { return buffers_in_header; }	virtual unsigned int NominalBitRate() = 0;	virtual bool RunOutComplete() = 0;    /******************************************************************     *  Reads the stream data from actual input stream, updates decode     *  buffer model and current access unit information from the     *  look-ahead scanning buffer to account for bytes_muxed bytes being     *  muxed out.       * TODO: No longer needs to be virtual     *     ******************************************************************/	virtual unsigned int ReadPacketPayload(uint8_t *dst, unsigned int to_read);    /********************************************************************     * Update stream-specific mux state information to reflect muxing of     * current AU.  first_in_sector is set true if AU is first muxed into     * the current sector.     *     *******************************************************************/    virtual void AUMuxed( bool first_in_sector ) {}    /**************************************************************     * The size of the stream-specific  sub-header (if any)     *************************************************************/    virtual unsigned int StreamHeaderSize() { return 0; }        /*****************************************************************     * Reads/generates the stream-specific sub-header for AUs muxed     * since last call AUMuxed( true );     ****************************************************************/    virtual void ReadStreamHeader( uint8_t *dst, unsigned int len ) {}    bitcount_t bytes_read;private:    void AUBufferLookaheadFill( unsigned int look_ahead);//protected:public:	virtual void FillAUbuffer(unsigned int frames_to_buffer) = 0;    virtual void OutputSector() = 0;	AUStream aunits;	void Muxed( unsigned int bytes_muxed );	AUnit *au;	clockticks timestamp_delay;	unsigned int au_unsent;	AUnit *OLDnext();	Multiplexor &muxinto;	stream_kind kind;    unsigned int buffer_min;    unsigned int buffer_max;    int FRAME_CHUNK;									};#endif // __INPUTSTRM_H__/*  * Local variables: *  c-file-style: "stroustrup" *  tab-width: 4 *  indent-tabs-mode: nil * End: */

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?