/* SMPEG - SDL MPEG Player Library Copyright (C) 1999 Loki Entertainment Software This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* The generic MPEG stream class */ #ifndef _MPEGSTREAM_H_ #define _MPEGSTREAM_H_ #include "SDL_types.h" #include "MPEGerror.h" #include "MPEGvideo.h" #include "MPEGaudio.h" #include "MPEGlist.h" #define AUDIO_STREAMID 0xc0 #define VIDEO_STREAMID 0xe0 #define SYSTEM_STREAMID 0xbb struct MPEGstream_marker { /* Data to mark part of the stream */ MPEGlist * marked_buffer; Uint8 *marked_data; Uint8 *marked_stop; }; class MPEGstream { public: MPEGstream(class MPEGsystem * System, Uint8 Streamid); ~MPEGstream(); /* Cleanup the buffers and reset the stream */ void reset_stream(void); /* Rewind the stream */ void rewind_stream(void); /* Go to the next packet in the stream */ bool next_packet(bool recurse = true, bool update_timestamp = true); /* Mark a position in the data stream */ MPEGstream_marker *new_marker(int offset); /* Jump to the marked position */ bool seek_marker(MPEGstream_marker const * marker); /* Jump to last successfully marked position */ void delete_marker(MPEGstream_marker * marker); /* Copy data from the stream to a local buffer */ Uint32 copy_data(Uint8 *area, Sint32 size, bool short_read = false); /* Copy a byte from the stream */ int copy_byte(void); /* Check for end of file or an error in the stream */ bool eof(void) const; /* Insert a new packet at the end of the stream */ void insert_packet(Uint8 * data, Uint32 size, double timestamp=-1); /* Check for unused buffers and free them */ void garbage_collect(void); /* Enable or disable the stream */ void enable(bool toggle); /* Get stream time */ double time(); Uint32 pos; Uint8 streamid; protected: Uint8 *data; Uint8 *stop; Uint32 preread_size; class MPEGsystem * system; MPEGlist * br; bool cleareof; bool enabled; SDL_mutex * mutex; /* Get a buffer from the stream */ bool next_system_buffer(void); public: /* "pos" where "timestamp" belongs */ Uint32 timestamp_pos; double timestamp; }; #endif /* _MPEGSTREAM_H_ */