/* A class based on the MPEG stream class, used to parse the system stream */ /* - Modified by Michel Darricau from eProcess for popcorn - */ #ifndef _MPEGSYSTEM_H_ #define _MPEGSYSTEM_H_ #define USE_SYSTEM_TIMESTAMP #include "SDL.h" #include "SDL_thread.h" #include "MPEGerror.h" class MPEGstream; /* MPEG System library by Vivien Chappelier */ /* The system class is necessary for splitting the MPEG stream into */ /* peaces of data that will be sent to the audio or video decoder. */ class MPEGsystem : public MPEGerror { public: /* Michel Darricau from eProcess need for override in popcorn */ MPEGsystem() {} MPEGsystem(SDL_RWops *mpeg_source); virtual ~MPEGsystem(); /* Buffered I/O functions */ void RequestBuffer(); bool Wait(); Uint32 Tell(); void Rewind(); /* Michel Darricau from eProcess need for override in popcorn */ virtual void Start(); void Stop(); bool Eof() const; /* Michel Darricau from eProcess need for override in popcorn */ virtual bool Seek(int length); virtual Uint32 TotalSize(); virtual double TotalTime(); virtual double TimeElapsedAudio(int atByte); /* Skip "seconds" seconds */ void Skip(double seconds); /* Create all the streams present in the MPEG */ MPEGstream ** GetStreamList(); /* Insert a stream in the list */ void add_stream(MPEGstream * stream); /* Search for a stream in the list */ MPEGstream * get_stream(Uint8 stream_id); /* Test if a stream is in the list */ Uint8 exist_stream(Uint8 stream_id, Uint8 mask); /* Reset all the system streams */ void reset_all_streams(); /* Set eof for all streams */ void end_all_streams(); /* Michel Darricau from eProcess need for override in popcorn */ /* Seek the first header */ virtual bool seek_first_header(); /* Michel Darricau from eProcess need for override in popcorn */ /* Seek the next header */ virtual bool seek_next_header(); protected: /* Run the loop to fill the stream buffers */ static bool SystemLoop(MPEGsystem *system); /* Michel Darricau from eProcess need for override in popcorn */ /* Fill a buffer */ virtual Uint8 FillBuffer(); /* Read a new packet */ virtual void Read(); /* The system thread which fills the FIFO */ static int SystemThread(void * udata); SDL_RWops *source; SDL_Thread * system_thread; bool system_thread_running; MPEGstream ** stream_list; Uint8 * read_buffer; Uint8 * pointer; int read_size; Uint32 read_total; Uint32 packet_total; int request; SDL_semaphore * request_wait; SDL_mutex * system_mutex; bool endofstream; bool errorstream; double frametime; double stream_timestamp; #ifdef USE_SYSTEM_TIMESTAMP /* Current timestamp for this stream */ double timestamp; double timedrift; double skip_timestamp; #endif }; #endif